package io.github.skippyall.minions.minion; import eu.pb4.polymer.core.api.item.PolymerItem; import eu.pb4.polymer.core.api.item.PolymerItemUtils; import io.github.skippyall.minions.fakeplayer.MinionFakePlayer; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.NbtComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; import net.minecraft.item.Items; import net.minecraft.item.tooltip.TooltipType; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.registry.RegistryWrapper; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.ActionResult; import net.minecraft.util.math.Vec2f; import org.jetbrains.annotations.Nullable; import xyz.nucleoid.packettweaker.PacketContext; public class MinionItem extends Item implements PolymerItem { private final boolean canProgram; public MinionItem(boolean canProgram) { super(new Item.Settings()); this.canProgram = canProgram; } @Override public Item getPolymerItem(ItemStack itemStack, PacketContext player) { return Items.ARMOR_STAND; } @Override public ItemStack getPolymerItemStack(ItemStack stack, TooltipType tooltipType, PacketContext player) { ItemStack out = PolymerItemUtils.createItemStack(stack, tooltipType, player); out.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true); return out; } @Override public ActionResult useOnBlock(ItemUsageContext context) { String contents = context.getStack().getName().getLiteralString(); String name; if(contents != null && contents.length() <= 16) { name = contents; } else { name = "Minion"; } if(!context.getWorld().isClient) { MinionData data = getData(context.getStack()); if(data == null) { data = new MinionData(null, name, null); } if (data.uuid == null) { MinionFakePlayer.createMinion(data, (ServerWorld) context.getWorld(), (ServerPlayerEntity) context.getPlayer(), canProgram, context.getBlockPos().toCenterPos().add(0,0.5,0), 0, 0); }else { data.name = name; MinionFakePlayer.spawnMinionAt(data, (ServerWorld) context.getWorld(), context.getBlockPos().toCenterPos().add(0,0.5,0), new Vec2f(0, 0)); MinionPersistentState.INSTANCE.addMinion(data); } } context.getStack().decrement(1); return ActionResult.SUCCESS; } public static void setData(MinionData data, ItemStack item) { NbtCompound nbt = item.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).copyNbt(); nbt.put("data", data.writeNbt()); item.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); } @Nullable public static MinionData getData(ItemStack item) { NbtCompound nbt = item.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).copyNbt(); if (nbt.getType("data") == NbtElement.COMPOUND_TYPE) { return MinionData.readNbt(nbt.getCompound("data")); } return null; } public static boolean containsData(ItemStack item) { NbtComponent nbt = item.get(DataComponentTypes.CUSTOM_DATA); if (nbt == null) { return false; } return nbt.copyNbt().contains("data"); } }