Jump to content

[1.12.2] Creating Item Handler Capabilty for extended inventory


Recommended Posts

Posted (edited)

I want to create an extra inventory slot for the player. But i can't use the slot when the GUI is opened. I think it has to do with how i use the capability. Also I'm not that much familiar with capabilities .

Provider:

Spoiler

public class ExtraSlotProvider implements ICapabilitySerializable<NBTBase> {

	@CapabilityInject(IItemHandler.class)
	public static final Capability<IItemHandler> EXTRA_SLOT = null;
	
	private IItemHandler instance = new ItemStackHandler(1);
	
	@Override
	public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
		return capability == EXTRA_SLOT;
	}

	@Override
	public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
		return capability == EXTRA_SLOT ? EXTRA_SLOT.<T> cast(this.instance) : null;
	}

	@Override
	public NBTBase serializeNBT() {
		return EXTRA_SLOT.getStorage().writeNBT(EXTRA_SLOT, this.instance, null);
	}

	@Override
	public void deserializeNBT(NBTBase nbt) {
		EXTRA_SLOT.getStorage().readNBT(EXTRA_SLOT, this.instance, null, nbt);
	}

}

 

 

Attach Capabilies:

Spoiler

@EventBusSubscriber
public class SQUATEventHandler {

	public static final ResourceLocation EXTRA_SLOT = new ResourceLocation(TEST_MOD.MOD_ID, "extra_slot");
	
	@SubscribeEvent
	public static void attachCapability(AttachCapabilitiesEvent<Entity> event) {
		if (event.getObject() instanceof EntityPlayer) {
			event.addCapability(EXTRA_SLOT, new ExtraSlotProvider());
		}
	}
}

 

 

Container:

Spoiler

	public ContainerFlightInventory(InventoryPlayer playerInv) {
		IItemHandler inventory = playerInv.player.getCapability(ExtraSlotProvider.EXTRA_SLOT, null);
		
		int slot = 0;

		for (int k = 0; k < 9; k++) {
			addSlotToContainer(new Slot(playerInv, slot++, 8 + k * 18, 142));
		}
		
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 9; j++) {
				addSlotToContainer(new Slot(playerInv, slot++, 8 + j * 18, 84 + i * 18));
			}
		}
		
		for (int l = 0; l < 4; l++) {
			addSlotToContainer(new Slot(playerInv, slot++, 8, 62 - l * 18));
		}
		
		addSlotToContainer(new Slot(playerInv, slot++, 77, 62));
		
		//extra slot
		addSlotToContainer(new SlotItemHandler(inventory, slot++, 152, 8));
		
	}

 

 

Any help is appreciated.

Edited by Meldexun
Posted

You haven't provided neither enough of your code nor a better description of your issue. What does "can't use the slot" mean? Is it not physically there? Can you not put anything in it? Is it not saved? We need more details than a simple "doesn't work".

 

As for your capability code it's fine. You don't need a field for the capability though, forge already provides one. 

Your container slot ID is wrong. Since this is slot 0 in your inventory it's ID should also be 0. IDs are relative to the inventory, not the slot's index. See any vanilla's container for an example.

Posted
23 minutes ago, V0idWa1k3r said:

You haven't provided neither enough of your code nor a better description of your issue. What does "can't use the slot" mean? Is it not physically there? Can you not put anything in it? Is it not saved? We need more details than a simple "doesn't work".

Ok, i'm sorry that really is a bad description... So the GUI shows up with all the normal inventory slots of the player and i can use them normally. But when i hover over my extra slot it makes that white overlay. So the slot is there but i can't put any item in it.

What other code do you want to see?

 

27 minutes ago, V0idWa1k3r said:

Your container slot ID is wrong. Since this is slot 0 in your inventory it's ID should also be 0. IDs are relative to the inventory, not the slot's index. See any vanilla's container for an example. 

I have also thought that but when i change the ID to 0 my extra slot is just a copy of the vanilla inventory slot with the ID 0.

Posted
6 minutes ago, Meldexun said:

I have also thought that but when i change the ID to 0 my extra slot is just a copy of the vanilla inventory slot with the ID 0.

This happens because this

On 4/5/2019 at 9:21 PM, Meldexun said:

IItemHandler inventory = playerInv.player.getCapability(ExtraSlotProvider.EXTRA_SLOT, null);

returns the player's base inventory. In this case you need a custom capability class and you can't use the default IItemHandler(or rather you can't use the capability instance injected into the field that expects a IItemHalder capability).

 

I think you can just make an extension of ItemStackHandler and register it separately and use it as your capability.

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.