robmart Posted March 10, 2015 Posted March 10, 2015 How do i detect how many of an item the player has and delete them? Quote
Ernio Posted March 10, 2015 Posted March 10, 2015 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? Quote Quote 1.7.10 is no longer supported by forge, you are on your own.
robmart Posted March 11, 2015 Author Posted March 11, 2015 On 3/10/2015 at 6:20 PM, Ernio said: 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 Quote
rustyminer28 Posted March 11, 2015 Posted March 11, 2015 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. Quote
Ernio Posted March 11, 2015 Posted March 11, 2015 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. Quote Quote 1.7.10 is no longer supported by forge, you are on your own.
robmart Posted March 11, 2015 Author Posted March 11, 2015 On 3/11/2015 at 1:49 PM, rustyminer28 said: 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 Reveal hidden contents 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 Quote
Ernio Posted March 11, 2015 Posted March 11, 2015 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. } } } } } Quote Quote 1.7.10 is no longer supported by forge, you are on your own.
robmart Posted March 12, 2015 Author Posted March 12, 2015 On 3/11/2015 at 10:10 PM, Ernio said: 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 Quote
Ernio Posted March 12, 2015 Posted March 12, 2015 On 3/11/2015 at 10:10 PM, Ernio said: 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 Quote Quote 1.7.10 is no longer supported by forge, you are on your own.
robmart Posted March 21, 2015 Author Posted March 21, 2015 On 3/12/2015 at 10:35 PM, Ernio said: Quote 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 Quote
Ernio Posted March 21, 2015 Posted March 21, 2015 Post your code? Quote Quote 1.7.10 is no longer supported by forge, you are on your own.
robmart Posted March 22, 2015 Author Posted March 22, 2015 On 3/21/2015 at 10:05 PM, Ernio said: Post your code? 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++; } } } } Quote
Ernio Posted March 22, 2015 Posted March 22, 2015 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. Quote Quote 1.7.10 is no longer supported by forge, you are on your own.
Recommended Posts
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.