superb-warfare/src/main/java/com/atsuishio/superbwarfare/item/C4Bomb.java

95 lines
3.6 KiB
Java

package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.entity.projectile.C4Entity;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.tools.NBTTool;
import net.minecraft.ChatFormatting;
import net.minecraft.core.Direction;
import net.minecraft.core.Position;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ProjectileItem;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
public class C4Bomb extends Item implements ProjectileItem {
public static final String TAG_CONTROL = "Control";
public C4Bomb() {
super(new Properties());
}
@Override
public @NotNull InteractionResultHolder<ItemStack> use(Level level, Player player, @NotNull InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (!level.isClientSide) {
boolean flag = NBTTool.getTag(stack).getBoolean(TAG_CONTROL);
C4Entity entity = new C4Entity(player, level, flag);
entity.setPos(player.getX() + 0.25 * player.getLookAngle().x, player.getEyeY() - 0.2f + 0.25 * player.getLookAngle().y, player.getZ() + 0.25 * player.getLookAngle().z);
entity.setDeltaMovement(0.5 * player.getLookAngle().x, 0.5 * player.getLookAngle().y, 0.5 * player.getLookAngle().z);
entity.setOwnerUUID(player.getUUID());
level.addFreshEntity(entity);
}
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.C4_THROW.get(), SoundSource.PLAYERS, 1, 1);
}
player.getCooldowns().addCooldown(this, 20);
if (!player.getAbilities().instabuild) {
stack.shrink(1);
}
return InteractionResultHolder.consume(stack);
}
@Override
@ParametersAreNonnullByDefault
public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
if (NBTTool.getTag(stack).getBoolean(TAG_CONTROL)) {
tooltipComponents.add(Component.translatable("des.superbwarfare.c4_bomb.control").withStyle(ChatFormatting.GRAY));
} else {
tooltipComponents.add(Component.translatable("des.superbwarfare.c4_bomb.time").withStyle(ChatFormatting.GRAY));
}
}
public static ItemStack makeInstance() {
ItemStack stack = new ItemStack(ModItems.C4_BOMB.get());
final var tag = NBTTool.getTag(stack);
tag.putBoolean(TAG_CONTROL, true);
NBTTool.saveTag(stack, tag);
return stack;
}
// TODO play sound
@Override
@ParametersAreNonnullByDefault
public @NotNull Projectile asProjectile(Level level, Position pos, ItemStack stack, Direction direction) {
// TODO 重写发射器行为
// var c4 = new C4Entity((LivingEntity) null, level);
// c4.setPos(pos.x(), pos.y(), pos.z());
return null;
}
@Override
public @NotNull DispenseConfig createDispenseConfig() {
return DispenseConfig.builder().power(0.15F).build();
}
}