Jump to content

Recommended Posts

Posted

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.

Posted

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

Posted

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.

Posted

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.

Posted

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

Posted

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.

Posted

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

Posted

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

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

Posted

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++;
                }
            }
        }
    }

Posted

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

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