package com.thebrokenrail.twine.item; import com.thebrokenrail.twine.Twine; import com.thebrokenrail.twine.component.StageDataComponent; import net.fabricmc.fabric.api.container.ContainerProviderRegistry; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.Inventory; import net.minecraft.item.DyeableItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; public class BackpackItem extends Item implements DyeableItem { public static class ItemInventory implements Inventory { private final int size; private final ItemStack stack; private final Hand hand; private final DefaultedList inv; public ItemInventory(int size, ItemStack stack, Hand hand) { this.size = size; this.stack = stack; this.hand = hand; inv = getInv(); } public ItemStack getHolder() { return stack; } private DefaultedList getInv() { DefaultedList list = DefaultedList.ofSize(size, ItemStack.EMPTY); Inventories.fromTag(stack.getOrCreateTag(), list); return list; } private void setInv(DefaultedList list) { Inventories.toTag(stack.getOrCreateTag(), list); } @Override public int size() { return size; } @Override public boolean isEmpty() { for (ItemStack item : inv) { if (item != ItemStack.EMPTY) { return false; } } return true; } @Override public ItemStack getStack(int slot) { return inv.get(slot); } @Override public ItemStack removeStack(int slot, int amount) { return inv.get(slot).split(amount); } @Override public ItemStack removeStack(int slot) { ItemStack item = inv.get(slot); return item.split(item.getCount()); } @Override public void setStack(int slot, ItemStack stack) { inv.set(slot, stack); } @Override public void markDirty() { setInv(inv); } @Override public boolean canPlayerUse(PlayerEntity player) { return player.getStackInHand(hand) == stack; } @Override public void clear() { for (int i = 0; i < size; i++) { inv.set(i, ItemStack.EMPTY); } } } private final boolean large; public BackpackItem(boolean large) { super(new Settings().maxCount(1).group(Twine.ITEM_GROUP)); this.large = large; } @Override public TypedActionResult use(World world, PlayerEntity user, Hand hand) { ItemStack stack = user.getStackInHand(hand); if (!world.isClient()) { ContainerProviderRegistry.INSTANCE.openContainer(Twine.BACKPACK_SCREEN, user, buf -> { buf.writeBoolean(large); buf.writeEnumConstant(hand); }); StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) world); ChunkPos chunkPos = new ChunkPos(user.getBlockPos()); int stage = component.findStageOfChunk(chunkPos); user.sendMessage(new LiteralText("Global Stage: " + stage), false); StageDataComponent.StageData[] personalData = component.getData(user.getUuid()); int personalStage = StageDataComponent.findStageOfChunk(chunkPos, personalData); user.sendMessage(new LiteralText("Personal Stage: " + personalStage), false); user.sendMessage(new LiteralText("Personal Center Chunk X: " + personalData[personalStage].x + " Personal Center Chunk Z: " + personalData[personalStage].z), false); user.sendMessage(new LiteralText("Time To Personal Stage Increase: " + (Twine.STAGE_TIME - personalData[personalStage].time) + " Ticks"), false); } return new TypedActionResult<>(ActionResult.CONSUME, stack); } }