superb-warfare/src/main/java/com/atsuishio/superbwarfare/item/FiringParameters.java
2025-04-02 16:32:59 +08:00

87 lines
3.5 KiB
Java

package com.atsuishio.superbwarfare.item;
import com.atsuishio.superbwarfare.component.ModDataComponents;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder;
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.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.List;
public class FiringParameters extends Item {
public record Parameters(BlockPos pos, boolean isDepressed) {
}
public FiringParameters() {
super(new Properties().stacksTo(1));
}
@Override
public @NotNull InteractionResult useOn(UseOnContext pContext) {
Player player = pContext.getPlayer();
if (player == null) return InteractionResult.PASS;
ItemStack stack = pContext.getItemInHand();
BlockPos pos = pContext.getClickedPos();
pos = pos.relative(pContext.getClickedFace());
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
var isDepressed = parameters != null && parameters.isDepressed();
stack.set(ModDataComponents.FIRING_PARAMETERS, new Parameters(pos, isDepressed));
return InteractionResult.SUCCESS;
}
@Override
@ParametersAreNonnullByDefault
public @NotNull InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand usedHand) {
if (!player.isCrouching()) return InteractionResultHolder.pass(player.getItemInHand(usedHand));
var stack = player.getItemInHand(usedHand);
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
if (parameters == null) return InteractionResultHolder.fail(stack);
var isDepressed = !parameters.isDepressed();
stack.set(ModDataComponents.FIRING_PARAMETERS, new Parameters(parameters.pos(), isDepressed));
player.displayClientMessage(Component.translatable(
isDepressed
? "tips.superbwarfare.mortar.target_pos.depressed_trajectory"
: "tips.superbwarfare.mortar.target_pos.lofted_trajectory"
).withStyle(ChatFormatting.GREEN), true);
return InteractionResultHolder.success(stack);
}
@Override
public void appendHoverText(ItemStack stack, @NotNull TooltipContext context, @NotNull List<Component> tooltipComponents, @NotNull TooltipFlag tooltipFlag) {
var parameters = stack.get(ModDataComponents.FIRING_PARAMETERS);
if (parameters == null) return;
var pos = parameters.pos();
tooltipComponents.add(Component.translatable("tips.superbwarfare.mortar.target_pos")
.withStyle(ChatFormatting.GRAY)
.append(Component.literal("["
+ pos.getX() + ","
+ pos.getY() + ","
+ pos.getZ() + "]")
)
);
tooltipComponents.add(Component.translatable(
parameters.isDepressed
? "tips.superbwarfare.mortar.target_pos.depressed_trajectory"
: "tips.superbwarfare.mortar.target_pos.lofted_trajectory"
).withStyle(ChatFormatting.GRAY));
}
}