superb-warfare/src/main/java/com/atsuishio/superbwarfare/item/BeamTest.java
2025-03-26 05:25:25 +08:00

156 lines
6.4 KiB
Java

package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.capability.ModCapabilities;
import com.atsuishio.superbwarfare.capability.laser.LaserHandler;
import com.atsuishio.superbwarfare.entity.projectile.LaserEntity;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.network.message.LaserShootMessage;
import com.atsuishio.superbwarfare.network.message.ShakeClientMessage;
import com.atsuishio.superbwarfare.tools.TraceTool;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundStopSoundPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.network.PacketDistributor;
import org.jetbrains.annotations.NotNull;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
public class BeamTest extends Item {
public BeamTest() {
super(new Properties());
}
@Override
public @NotNull InteractionResultHolder<ItemStack> use(@NotNull Level level, Player player, @NotNull InteractionHand hand) {
if (player.level().isClientSide) {
player.playSound(ModSounds.CHARGE_RIFLE_FIRE_1P.get(), 1, 1);
} else {
player.playSound(ModSounds.CHARGE_RIFLE_FIRE_3P.get(), 2, 1);
}
var capability = player.getCapability(ModCapabilities.LASER_CAPABILITY);
if (capability != null) {
player.startUsingItem(hand);
if (!level.isClientSide) {
double px = player.getX();
double py = player.getY() + player.getBbHeight() * 0.6F;
double pz = player.getZ();
float yHeadRotAngle = (float) Math.toRadians(player.yHeadRot + 90);
float xHeadRotAngle = (float) (float) -Math.toRadians(player.getXRot());
LaserEntity laserEntity = new LaserEntity(player.level(), player, px, py, pz, yHeadRotAngle, xHeadRotAngle, 6000);
capability.init(new LaserHandler(player, laserEntity));
capability.start();
}
}
return InteractionResultHolder.consume(player.getItemInHand(hand));
}
@Override
@ParametersAreNonnullByDefault
public void releaseUsing(ItemStack stack, Level level, LivingEntity livingEntity, int timeCharged) {
if (livingEntity instanceof Player player) {
var cap = player.getCapability(ModCapabilities.LASER_CAPABILITY);
if (cap != null) {
cap.stop();
}
}
if (livingEntity instanceof ServerPlayer serverPlayer && stack.getItem() instanceof BeamTest beamTest) {
stopGunChargeSound(serverPlayer, beamTest);
}
super.releaseUsing(stack, level, livingEntity, timeCharged);
}
private static void stopGunChargeSound(ServerPlayer player, BeamTest beamTest) {
beamTest.getChargeSound().forEach(sound -> {
var clientboundstopsoundpacket = new ClientboundStopSoundPacket(sound.getLocation(), SoundSource.PLAYERS);
final Vec3 center = new Vec3(player.getX(), player.getY(), player.getZ());
for (ServerPlayer player1 : player.level().getEntitiesOfClass(ServerPlayer.class, new AABB(center, center).inflate(48), e -> true).stream().sorted(Comparator.comparingDouble(e -> e.distanceToSqr(center))).toList()) {
player1.connection.send(clientboundstopsoundpacket);
}
});
}
public Set<SoundEvent> getChargeSound() {
return Set.of(ModSounds.CHARGE_RIFLE_FIRE_1P.get(), ModSounds.CHARGE_RIFLE_FIRE_3P.get());
}
@Override
@ParametersAreNonnullByDefault
public @NotNull ItemStack finishUsingItem(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity) {
if (pLivingEntity instanceof Player player) {
var cap = player.getCapability(ModCapabilities.LASER_CAPABILITY);
if (cap != null) {
cap.stop();
}
player.getCooldowns().addCooldown(pStack.getItem(), 20);
if (player.level().isClientSide()) {
beamShoot(player);
player.playSound(ModSounds.CHARGE_RIFLE_FIRE_BOOM_1P.get(), 1, 1);
}
if (!player.level().isClientSide) {
player.playSound(ModSounds.CHARGE_RIFLE_FIRE_BOOM_3P.get(), 4, 1);
}
if (player instanceof ServerPlayer serverPlayer) {
PacketDistributor.sendToPlayer(serverPlayer, new ShakeClientMessage(10, 10, 30, serverPlayer.getX(), serverPlayer.getEyeY(), serverPlayer.getZ()));
}
}
return super.finishUsingItem(pStack, pLevel, pLivingEntity);
}
public static void beamShoot(Player player) {
Entity lookingEntity = TraceTool.laserfindLookingEntity(player, 512);
if (lookingEntity == null) {
return;
}
boolean canAttack = lookingEntity != player && !(lookingEntity instanceof Player player_ && (player_.isCreative() || player_.isSpectator()))
&& (!player.isAlliedTo(lookingEntity) || lookingEntity.getTeam() == null || lookingEntity.getTeam().getName().equals("TDM"));
if (canAttack) {
PacketDistributor.sendToServer(new LaserShootMessage(45, lookingEntity.getUUID(), TraceTool.laserHeadshot));
}
}
@Override
@ParametersAreNonnullByDefault
public int getUseDuration(ItemStack stack, LivingEntity entity) {
return 11;
}
@Override
@ParametersAreNonnullByDefault
public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) {
return slotChanged;
}
@Override
@ParametersAreNonnullByDefault
public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
// TODO developing
// TooltipTool.addDevelopingText(pTooltipComponents);
}
}