sFXprt Posted May 3, 2023 Posted May 3, 2023 (edited) [SOLVED] - Yep I feel stupid, after looking over this post I saw I called the shop_menu on both classes like an idiot and I also called playerInv.player instead of just this.p on Knight class... I have two containers, one that is a Vault container for a player and one that is for my Knight entity. They both are designed to store player items in it and have the same code(with one alteration). Except if I put items in my Vault and try to open up my Knight entities container it completely removes my CompoundTag that holds all the itemstacks in the Vault container. The really weird thing is I am not accessing the Players persistent data at all in the Knight's container. And the item in the Knight's container will still stay even if I open up other Knight's container and my Vault container will not store of the knights containers items. Knight Container public class KnightInventoryMenu extends AbstractContainerMenu { private final Knight p; public KnightInventoryMenu(int pContainerId, Inventory playerInv){ this(pContainerId, playerInv, null, new ItemStackHandler(27)); } public KnightInventoryMenu(int pContainerId, Inventory playerInv,Knight k, ItemStackHandler itemStackHandler) { super(ContainerInit.SHOP_MENU.get(), pContainerId); this.p = k; final int slotSizePlus2 = 18, startX = 8, startY = 86, hotbarY = 144, inventoryY = 18; for (int row = 0; row < 3; row++) { for (int column = 0; column < 9; column++) { addSlot(new SlotItemHandler(itemStackHandler, row * 9 + column, startX + column * slotSizePlus2, inventoryY + row * slotSizePlus2)); } } for (int row = 0; row < 3; row++) { for (int column = 0; column < 9; column++) { addSlot(new Slot(playerInv, 9 + row * 9 + column, startX + column * slotSizePlus2, startY + row * slotSizePlus2)); } } for (int column = 0; column < 9; column++) { addSlot(new Slot(playerInv, column, startX + column * slotSizePlus2, hotbarY)); } if(!this.p.getPersistentData().contains("container.items")){ CompoundTag tag = new CompoundTag(); playerInv.player.getPersistentData().put("container.items", tag); } else { CompoundTag tag = this.p.getPersistentData().getCompound("container.items"); for(String key : tag.getAllKeys()){ int index = Integer.valueOf(key); this.getSlot(index).set(ItemStack.of(tag.getCompound(key))); } } } @Override public void broadcastChanges() { CompoundTag tag = new CompoundTag(); int i = 0; for(ItemStack item : this.getItems()){ if(i > 27) break; CompoundTag itemTag = new CompoundTag(); tag.put(String.valueOf(i), item.save(itemTag)); i++; } p.getPersistentData().put("container.items", tag); } @Override protected boolean moveItemStackTo(ItemStack pStack, int pStartIndex, int pEndIndex, boolean pReverseDirection) { return super.moveItemStackTo(pStack, pStartIndex, pEndIndex, pReverseDirection); } @Override public ItemStack quickMoveStack(Player player, int index) { var retStack = ItemStack.EMPTY; final Slot slot = getSlot(index); if (slot.hasItem()) { final ItemStack item = slot.getItem(); retStack = item.copy(); if (index < 27) { if (!moveItemStackTo(item, 27, this.slots.size(), true)) { return ItemStack.EMPTY; } } else if (!moveItemStackTo(item, 0, 27, false)){ return ItemStack.EMPTY; } if (item.isEmpty()) { slot.set(ItemStack.EMPTY); } else { slot.setChanged(); } } return retStack; } @Override public boolean stillValid(Player pPlayer) { return true; } } Player's Vault Container public class VaultMenu extends AbstractContainerMenu{ private final Player p; public VaultMenu(int pContainerId, Inventory playerInv){ this(pContainerId, playerInv, new ItemStackHandler(27)); } public VaultMenu(int pContainerId, Inventory playerInv, ItemStackHandler itemStackHandler) { super(ContainerInit.SHOP_MENU.get(), pContainerId); this.p = playerInv.player; final int slotSizePlus2 = 18, startX = 8, startY = 86, hotbarY = 144, inventoryY = 18; for (int row = 0; row < 3; row++) { for (int column = 0; column < 9; column++) { addSlot(new SlotItemHandler(itemStackHandler, row * 9 + column, startX + column * slotSizePlus2, inventoryY + row * slotSizePlus2)); } } for (int row = 0; row < 3; row++) { for (int column = 0; column < 9; column++) { addSlot(new Slot(playerInv, 9 + row * 9 + column, startX + column * slotSizePlus2, startY + row * slotSizePlus2)); } } for (int column = 0; column < 9; column++) { addSlot(new Slot(playerInv, column, startX + column * slotSizePlus2, hotbarY)); } if(!this.p.getPersistentData().contains("container.items")){ CompoundTag tag = new CompoundTag(); playerInv.player.getPersistentData().put("container.items", tag); } else { CompoundTag tag = this.p.getPersistentData().getCompound("container.items"); for(String key : tag.getAllKeys()){ int index = Integer.valueOf(key); this.getSlot(index).set(ItemStack.of(tag.getCompound(key))); } } } @Override public void broadcastChanges() { CompoundTag tag = new CompoundTag(); int i = 0; for(ItemStack item : this.getItems()){ if(i > 27) break; CompoundTag itemTag = new CompoundTag(); tag.put(String.valueOf(i), item.save(itemTag)); i++; } p.getPersistentData().put("container.items", tag); } @Override protected boolean moveItemStackTo(ItemStack pStack, int pStartIndex, int pEndIndex, boolean pReverseDirection) { return super.moveItemStackTo(pStack, pStartIndex, pEndIndex, pReverseDirection); } @Override public ItemStack quickMoveStack(Player player, int index) { var retStack = ItemStack.EMPTY; final Slot slot = getSlot(index); if (slot.hasItem()) { final ItemStack item = slot.getItem(); retStack = item.copy(); if (index < 27) { if (!moveItemStackTo(item, 27, this.slots.size(), true)) { return ItemStack.EMPTY; } } else if (!moveItemStackTo(item, 0, 27, false)){ return ItemStack.EMPTY; } if (item.isEmpty()) { slot.set(ItemStack.EMPTY); } else { slot.setChanged(); } } return retStack; } @Override public boolean stillValid(Player pPlayer) { return true; } public static MenuConstructor getServerContainer() { return (id, playerInv, player) -> new ShopMenu(id, playerInv, new ItemStackHandler(27)); } } Like I said the code is the exact same except in the Vault container I am modifying player persistent data to hold all the current items in the container from index 0-27, and on the Knights container its only affecting the Knight's persistent data. I am extremely confused, the only explanations I can come up with is somehow on the first instance of the knights container, it copys all the data to my players persistent data(but yet I am not calling it at all) or upon opening the knights container its deleting my persistent data tag that holds all the items. Edited May 3, 2023 by sFXprt Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.