Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

When should it happen?

 

To access inventory:

player.inventory... and you can pretty much manipulate any ItemStack[slot_index]

 

As to "detecting"

Should it be on tick? on Click? on some event?

1.7.10 is no longer supported by forge, you are on your own.

  • Author

When should it happen?

 

To access inventory:

player.inventory... and you can pretty much manipulate any ItemStack[slot_index]

 

As to "detecting"

Should it be on tick? on Click? on some event?

What i want is when i pick up an item it detects how many i have in my inventory and then it deletes them

Use the hasItem() method on the player.inventory, then iterate through mainInventory with a for loop, incrementing an int variable every time you come across an ItemStack with the correct item. If the item is correct, use consumeInventoryItem() to delete it.

For future - use words wisely. "When pick up" is not same as "when added to inventory". Please precise that.

 

As to how - post above pretty much outlines everything.

 

You will be scanning for item in EntityItemPickupEvent (for "pick up") or in PlayerTickEvent (phase start, side server).

Using hasItem() and then iterating is waste of CPU. Do it all in one loop. Iterate check it item is right and increment total quantity, if quantity > max, remove item/stack.

1.7.10 is no longer supported by forge, you are on your own.

  • Author

Use the hasItem() method on the player.inventory, then iterate through mainInventory with a for loop, incrementing an int variable every time you come across an ItemStack with the correct item. If the item is correct, use consumeInventoryItem() to delete it.

I have no idea how to do that I came up with this which probably is totally wrong xD

 

 

if (e.entityPlayer.inventory.hasItem(ITEM)){

            for (int i = 0; i < 36; i++) {

                ItemStack is  = e.entityPlayer.inventory.getStackInSlot(i);

 

                if (is == null) {

                    i++;

                    return;

                }

            }

        }

 

 

If that is right i have no idea what I do after that

Subscribe to PlayerTickEvent. Pseudo:

static int maxItemAmout = 10; //max limit of your item.
//check phase to be START.
PlayerTickEvent event; // this doesnt look like it, learn how to use events.
if (!event.player.world.isRemote){ //run code on server-side
    int count = 0;
    for (int i = 0; i < event.player.inventory.length; ++i){
        ItemStack stack = event.player.inventory[i];
        if (stack != null){
            if (stack.getItem() == yourItem){
                if (count >= maxItemAmout){
                    //set stack to null, since you cant have any more (limit exceeded), go to next slot.
                }
                else{
                    count += stack.getStackSize()
                    //again check if count is exceded and if is lower stack size by amout you exceeded.
                }
            }
        }
    }
}

 

1.7.10 is no longer supported by forge, you are on your own.

  • Author

Subscribe to PlayerTickEvent. Pseudo:

static int maxItemAmout = 10; //max limit of your item.
//check phase to be START.
PlayerTickEvent event; // this doesnt look like it, learn how to use events.
if (!event.player.world.isRemote){ //run code on server-side
    int count = 0;
    for (int i = 0; i < event.player.inventory.length; ++i){
        ItemStack stack = event.player.inventory[i];
        if (stack != null){
            if (stack.getItem() == yourItem){
                if (count >= maxItemAmout){
                    //set stack to null, since you cant have any more (limit exceeded), go to next slot.
                }
                else{
                    count += stack.getStackSize()
                    //again check if count is exceded and if is lower stack size by amout you exceeded.
                }
            }
        }
    }
}

 

The line

                ItemStack stack = event.player.inventory[i];

Gives me the error Array type expected; found: ´net.minecraft.entity.player.InventoryPlayer´

And there is no such method as getStackSize

Subscribe to PlayerTickEvent. Pseudo:

 

You can't expect anyone to write whole method for you.

 

Learn Java and your IDE (eclipse). It proposes you methods/fields.

 

Hints:

player.inventory.mainInventory

ItemStack.stackSize

 

1.7.10 is no longer supported by forge, you are on your own.

  • 2 weeks later...
  • Author

Subscribe to PlayerTickEvent. Pseudo:

 

You can't expect anyone to write whole method for you.

 

Learn Java and your IDE (eclipse). It proposes you methods/fields.

 

Hints:

player.inventory.mainInventory

ItemStack.stackSize

Sorry for no reply in a loooong time...

So the scanning of the inventory works but it does not see that i have my item in my inventory

Post your code? :P

1.7.10 is no longer supported by forge, you are on your own.

  • Author

Post your code? :P

I made all of the i++ for testing

static int maxItemAmount = 1;
    int count = 0;
    ItemStack item;

@SubscribeEvent
    public void PlayerTickEvent(TickEvent.PlayerTickEvent event) {
        if (!event.player.worldObj.isRemote) {
            for (int i = 0; i < event.player.inventory.mainInventory.length; ) {
                System.out.println(i);
                item = event.player.inventory.mainInventory[i];
                LogHelper.info(item);
                ItemStack stack = event.player.inventory.mainInventory[i];
                if (stack != null) {
                    if (stack.getItem() == InitItem.StrawberrySeedFake) {
                        if (count >= maxItemAmount) {
                            LogHelper.info("BLUEBERRY");
                        } else {
                            count += stack.stackSize;
                            if (count >= maxItemAmount) {
                                LogHelper.info("BLUEBERRY");
                                i++;
                            } else {
                                i++;
                            }
                        }
                    } else {
                        i++;
                    }
                } else {
                    i++;
                }
            }
        }
    }

private static int maxItemAmount = 10;

@SubscribeEvent
public void PlayerTickEvent(TickEvent.PlayerTickEvent event)
{
	if (event.phase == Phase.START)
	{
		if (!event.player.worldObj.isRemote)
		{
			int count = 0;
			for (int i = 0; i < event.player.inventory.mainInventory.length; ++i)
			{
				ItemStack stack = event.player.inventory.mainInventory[i];
				if (stack != null)
				{
					if (stack.getItem() == Items.stick)
					{
						count += stack.stackSize;
					}
				}
			}
			while (count > maxItemAmount)
			{
				event.player.inventory.consumeInventoryItem(Items.stick);
				--count;
			}
		}
	}
}

 

Example of working code. Now the flaw is - server may be consuming items but will not send packet to client.

 

I've tried using event.player.inventory.markDirty(); but this got me nowhere.

 

You have to either send inventory packet on your own if any item was changed, or do this event on both sides. (without !isRemote).

 

Seems like doing it on both sides will give you predicted effects :)

 

P.S - oh and OBVIOUSLY, this code is SHIT (very-not optimal). Look at method i used and make some smart looping.

1.7.10 is no longer supported by forge, you are on your own.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.