Files
Minions/src/main/java/io/github/skippyall/minions/minion/MinionItem.java
T
2026-04-29 17:20:13 +02:00

107 lines
4.1 KiB
Java

package io.github.skippyall.minions.minion;
import eu.pb4.polymer.core.api.item.PolymerItem;
import io.github.skippyall.minions.gui.MinionLookGui;
import io.github.skippyall.minions.minion.fakeplayer.MinionFakePlayer;
import io.github.skippyall.minions.registration.MinionComponentTypes;
import net.fabricmc.fabric.api.networking.v1.context.PacketContext;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.component.TooltipDisplay;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec2;
import org.jetbrains.annotations.Nullable;
import java.util.function.Consumer;
public class MinionItem extends Item implements PolymerItem {
public MinionItem(Properties settings) {
super(settings);
}
@Override
public @Nullable Identifier getPolymerItemModel(ItemStack stack, PacketContext context, HolderLookup.Provider lookup) {
return null;
}
@Override
public Item getPolymerItem(ItemStack itemStack, PacketContext player) {
return Items.ARMOR_STAND;
}
@Override
public ItemStack getPolymerItemStack(ItemStack stack, TooltipFlag tooltipType, PacketContext player, HolderLookup.Provider lookup) {
ItemStack out = PolymerItem.super.getPolymerItemStack(stack, tooltipType, player, lookup);
out.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, true);
return out;
}
@Override
public void appendHoverText(ItemStack stack, TooltipContext context, TooltipDisplay component, Consumer<Component> tooltip, TooltipFlag type) {
MinionData data = null /*getData(stack)*/;
if(data != null) {
tooltip.accept(Component.translatable("minions.minion_item.tooltip", data.name()));
}
}
@Override
public InteractionResult use(Level world, Player user, InteractionHand hand) {
if(user instanceof ServerPlayer serverPlayer) {
ItemStack stack = user.getItemInHand(hand);
MinionLookGui.open(serverPlayer, stack);
return InteractionResult.SUCCESS;
}
return InteractionResult.SUCCESS_SERVER;
}
@Override
public InteractionResult useOn(UseOnContext context) {
if(!context.getLevel().isClientSide()) {
MinionData data = getDataOrDefault(context.getLevel().getServer(), context.getItemInHand());
MinionFakePlayer.spawnMinion(data, (ServerLevel) context.getLevel(), context.getClickedPos().getCenter().add(0,0.5,0), new Vec2(0, 0));
}
context.getItemInHand().shrink(1);
return InteractionResult.SUCCESS;
}
public static void setData(MinecraftServer server, MinionData data, ItemStack item) {
item.set(MinionComponentTypes.MINION_DATA, data.uuid());
MinionPersistentState.get(server).updateMinionData(data);
}
@Nullable
public static MinionData getData(MinecraftServer server, ItemStack item) {
if(item.has(MinionComponentTypes.MINION_DATA)) {
return MinionPersistentState.get(server).getMinionData(item.get(MinionComponentTypes.MINION_DATA));
}
return null;
}
public static MinionData getDataOrDefault(MinecraftServer server, ItemStack item) {
MinionData data = getData(server, item);
if(data == null) {
data = MinionData.createDefault(server);
setData(server, data, item);
}
return data;
}
public static boolean containsData(ItemStack item) {
return item.has(MinionComponentTypes.MINION_DATA);
}
}