Posted March 26, 20232 yr So previously on 1.16.5 I was using the ItemHandler Capability to read and write the nbt data for the sharetags. But in 1.18.2 Forge doesn't have those methods anymore so I simply copied it in. Obviously, it doesn't work since when I try to get the contents of the itemhandler in my item so that I can render the item on the screen and the stack size, the contained itemstacks don't update until I open the item's inventory. So how can I update the item on the client whenever the itemhandler has changes? I need to get the inventory in BulletCountRender.java and BulletRadialMenu.java Item Class: AbstractPouch.java @Override public void readShareTag(ItemStack stack, @Nullable CompoundTag nbt) { super.readShareTag(stack, nbt); LazyOptional<IItemHandler> optional = AbstractPouch.getData(stack).getOptional(); if (optional.isPresent()){ IItemHandler handler = optional.resolve().get(); if (!(handler instanceof IItemHandlerModifiable)) throw new RuntimeException("IItemHandler instance does not implement IItemHandlerModifiable"); IItemHandlerModifiable itemHandlerModifiable = (IItemHandlerModifiable) handler; ListTag tagList = nbt.getList("ClientInventory", Tag.TAG_COMPOUND); for (int i = 0; i < tagList.size(); i++) { CompoundTag itemTags = tagList.getCompound(i); int j = itemTags.getInt("Slot"); if (j >= 0 && j < handler.getSlots()) { itemHandlerModifiable.setStackInSlot(j, ItemStack.of(itemTags)); } } } } @Nullable @Override public CompoundTag getShareTag(ItemStack stack) { LazyOptional<IItemHandler> optional = AbstractPouch.getData(stack).getOptional(); CompoundTag tag = super.getShareTag(stack); if (optional.isPresent()){ IItemHandler handler = optional.resolve().get(); ListTag nbtTagList = new ListTag(); int size = handler.getSlots(); for (int i = 0; i < size; i++) { ItemStack stack1 = handler.getStackInSlot(i); if (!stack1.isEmpty()) { CompoundTag itemTag = new CompoundTag(); itemTag.putInt("Slot", i); stack1.save(itemTag); nbtTagList.add(itemTag); } } tag.put("ClientInventory", nbtTagList); } return tag; } Edited March 26, 20232 yr by NindyBun
March 26, 20232 yr Author Right, so I just used a few packets to save the inventory as a Listtag to the item and I just use that instead since nbt data is always synced. It's a very crude way but it works for now.
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.