superb-warfare/src/main/java/com/atsuishio/superbwarfare/item/ElectricBaton.java
2025-05-25 01:55:31 +08:00

131 lines
4.9 KiB
Java

package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.client.tooltip.component.CellImageComponent;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.init.ModMobEffects;
import com.atsuishio.superbwarfare.init.ModSounds;
import com.atsuishio.superbwarfare.tiers.ModItemTier;
import com.atsuishio.superbwarfare.tools.NBTTool;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.tooltip.TooltipComponent;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SwordItem;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.neoforged.neoforge.capabilities.Capabilities;
import org.jetbrains.annotations.NotNull;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
import java.util.Optional;
public class ElectricBaton extends SwordItem implements EnergyStorageItem {
public static final int MAX_ENERGY = 30000;
public static final int ENERGY_COST = 2000;
public static final String TAG_OPEN = "Open";
public ElectricBaton() {
super(ModItemTier.STEEL, new Properties()
.durability(1114)
.attributes(SwordItem.createAttributes(ModItemTier.STEEL, 2, -2.5f))
);
}
@Override
@ParametersAreNonnullByDefault
public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
tooltipComponents.add(Component.translatable("des.superbwarfare.electric_baton").withStyle(ChatFormatting.AQUA));
if (NBTTool.getTag(stack).getBoolean(TAG_OPEN)) {
tooltipComponents.add(Component.translatable("des.superbwarfare.electric_baton.open").withStyle(ChatFormatting.GRAY));
}
}
@Override
public int getMaxEnergy() {
return MAX_ENERGY;
}
@Override
@ParametersAreNonnullByDefault
public @NotNull InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand usedHand) {
ItemStack stack = player.getItemInHand(usedHand);
if (player.isShiftKeyDown()) {
var tag = NBTTool.getTag(stack);
tag.putBoolean(TAG_OPEN, !tag.getBoolean(TAG_OPEN));
NBTTool.saveTag(stack, tag);
player.displayClientMessage(Component.translatable("des.superbwarfare.electric_baton." + (tag.getBoolean(TAG_OPEN) ? "open" : "close")), true);
}
return InteractionResultHolder.fail(stack);
}
@Override
public boolean isBarVisible(@NotNull ItemStack stack) {
return NBTTool.getTag(stack).getBoolean(TAG_OPEN) || super.isBarVisible(stack);
}
@Override
public int getBarWidth(@NotNull ItemStack stack) {
if (NBTTool.getTag(stack).getBoolean(TAG_OPEN)) {
var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (cap == null) return 0;
return Math.round((float) cap.getEnergyStored() * 13F / MAX_ENERGY);
} else {
return super.getBarWidth(stack);
}
}
@Override
public int getBarColor(@NotNull ItemStack stack) {
return NBTTool.getTag(stack).getBoolean(TAG_OPEN) ? 0xFFFF00 : super.getBarColor(stack);
}
@Override
@ParametersAreNonnullByDefault
public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) {
attacker.level().playSound(null, target.getOnPos(), ModSounds.MELEE_HIT.get(), SoundSource.PLAYERS, 1, (float) ((2 * org.joml.Math.random() - 1) * 0.1f + 1));
if (NBTTool.getTag(stack).getBoolean(TAG_OPEN)) {
var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (cap != null && cap.getEnergyStored() >= ENERGY_COST) {
cap.extractEnergy(ENERGY_COST, false);
if (!target.level().isClientSide) {
target.addEffect(new MobEffectInstance(ModMobEffects.SHOCK, 30, 2), attacker);
}
}
}
return super.hurtEnemy(stack, target, attacker);
}
@Override
public @NotNull Optional<TooltipComponent> getTooltipImage(@NotNull ItemStack pStack) {
return Optional.of(new CellImageComponent(pStack));
}
public static ItemStack makeFullEnergyStack() {
ItemStack stack = new ItemStack(ModItems.ELECTRIC_BATON.get());
var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM);
if (cap != null) {
cap.receiveEnergy(MAX_ENERGY, false);
}
var tag = NBTTool.getTag(stack);
tag.putBoolean(TAG_OPEN, true);
NBTTool.saveTag(stack, tag);
return stack;
}
}