Posted July 30, 20223 yr I am looking to make a container that is opened through an item and has a seperate inventory for each player like an enderchest. I have created a capability to do this however it does not work. Here is the code: ItemStackHandler: public class CharmBagItemStackHandler extends ItemStackHandler implements CharmBagItemHandler { public int size; public CharmBagItemStackHandler(int size) { super(size); } public CharmBagItemStackHandler() { super(9); } public void copyFrom(CharmBagItemStackHandler source) { this.size = source.size; } } Capability provider(the code is a little messy): public class CharmBagProvider implements ICapabilityProvider, INBTSerializable<CompoundTag>{ public static Capability<CharmBagItemStackHandler> Handler = CapabilityManager.get(new CapabilityToken<>(){}); private CharmBagItemStackHandler inventory = new CharmBagItemStackHandler(9); private Player player; public static CharmBagItemStackHandler CHARMBAG = null; private LazyOptional<CharmBagItemHandler> lazyOptional = LazyOptional.of(() -> inventory); @Nonnull private CharmBagItemStackHandler createHandler() { if (CHARMBAG == null) { CHARMBAG = new CharmBagItemStackHandler(); } return CHARMBAG; } @Override public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) { if (cap == Handler) { lazyOptional.cast(); } return LazyOptional.empty(); } @Override public CompoundTag serializeNBT() { return inventory.serializeNBT(); } @Override public void deserializeNBT(CompoundTag nbt) { inventory.deserializeNBT(nbt); } } Container: public class CharmsBagContainer extends AbstractContainerMenu{ private final ItemStack charmBag; private final Level level; // Client Constructor public CharmsBagContainer(int id, Inventory playerInv) { this(id, playerInv, playerInv.player.getMainHandItem()); } // Server constructor public CharmsBagContainer(int id, Inventory inventory, ItemStack item) { super(ContainerInit.CHARM_CONTAINER.get(), id); this.level = inventory.player.level; this.charmBag = item; Player player = inventory.player; System.out.println(player.getCapability(CharmBagProvider.Handler).isPresent()); player.getCapability(CharmBagProvider.Handler).ifPresent(handler -> { for(int i = 0; i < 3; ++i) { for(int j = 0; j < 3; ++j) { this.addSlot(new SlotItemHandler(handler, j + i * 3, 44 + j * 18, 16 + i * 18)); } } }); this.addPlayerHotbar(inventory); this.addPlayerInventory(inventory); } private void addPlayerInventory(Inventory inv){ for(int i = 0; i < 3; ++i) { for(int j = 0; j < 9; ++j) { this.addSlot(new Slot(inv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } } private void addPlayerHotbar(Inventory inv){ for(int k = 0; k < 9; ++k) { this.addSlot(new Slot(inv, k, 8 + k * 18, 142)); } } @Override public ItemStack quickMoveStack(Player pPlayer, int pIndex) { ItemStack toReturn = ItemStack.EMPTY; Slot slot = this.getSlot(pIndex); if(slot != null && slot.hasItem()){ ItemStack stack = slot.getItem(); toReturn = stack.copy(); if(pIndex < 9){ if(!this.moveItemStackTo(stack, 9, this.slots.size(), true)){ return ItemStack.EMPTY; } }else if(!this.moveItemStackTo(stack, 0, 9, false)){ return ItemStack.EMPTY; } if(!stack.isEmpty()){ slot.set(ItemStack.EMPTY); }else{ slot.setChanged(); } } return toReturn; } @Override public boolean stillValid(Player player) { return player.getMainHandItem().is(this.charmBag.getItem()); } EventHandler: @SubscribeEvent public static void onAttachCapabilitiesPlayer(AttachCapabilitiesEvent<Entity> event){ if (event.getObject() instanceof Player) { if (!event.getObject().getCapability(MaxHealthProvider.MAX_HEALTH_CHANGER).isPresent()) { // The player does not already have this capability so we need to add the capability provider here event.addCapability(new ResourceLocation(truffleMod.MOD_ID, "max_health"), new MaxHealthProvider()); } } } @SubscribeEvent public static void onPlayerCloned(PlayerEvent.Clone event) { if (event.isWasDeath()) { // We need to copyFrom the capabilities event.getOriginal().getCapability(MaxHealthProvider.MAX_HEALTH_CHANGER).ifPresent(oldStore -> { event.getPlayer().getCapability(MaxHealthProvider.MAX_HEALTH_CHANGER).ifPresent(newStore -> { newStore.copyFrom(oldStore); }); }); } } @SubscribeEvent public static void onRegisterCapabilities(RegisterCapabilitiesEvent event) { event.register(MaxHealth.class); } } My issue is probably with attaching the capability as I print to show if the player has the capability and it prints false.
July 30, 20223 yr Author 4 hours ago, diesieben07 said: This makes zero sense. Do not do this. Have you verified with the debugger that your attach event handler is called? Yes
July 30, 20223 yr Author https://github.com/ND0322/Truffle-Mod/tree/main/main/java/com/ND0322/trufflemod
July 30, 20223 yr Author Woops I set it to private. I changed it now https://github.com/ND0322/Truffle-Mod
July 31, 20223 yr Take a look at this, then the error should be clear. Edited July 31, 20223 yr by Luis_ST
July 31, 20223 yr Author @SubscribeEvent public static void onAttachCapabilitiesPlayer(AttachCapabilitiesEvent<Entity> event){ if (event.getObject() instanceof Player) { if (!event.getObject().getCapability(CharmBagProvider.Handler).isPresent()) { event.addCapability(new ResourceLocation(truffleMod.MOD_ID, "charm_bag_cap"), new CharmBagProvider()); System.out.println("added"); } System.out.println("eventRan"); } } I have put two prints to check that the event is called and both are called Edited July 31, 20223 yr by ND0322
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.