Jump to content

[1.8.9]How to tell when an item is removed from the players inventory?


Looke81

Recommended Posts

You can't.

 

No.

 

No, not even then.

 

No, you can't.  Its impossible.  There are so many ways an item can leave the player's inventory that you cannot know that it even has as some of them don't fire any sort of event or notification to any other system that it has removed the item.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

ItemDropEvent

and no.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Hmm I'm not sure if you understand what I meant because I just used ItemTossEvent and that:

 

* Event that is fired whenever a player tosses (Q) an item or drag-n-drops a

* stack of items outside the inventory GUI screens. Canceling the event will

* stop the items from entering the world, but will not prevent them being

* removed from the inventory - and thus removed from the system.

 

However the throwing outside the player gui works but the dropping on the ground only works on one side and i need it on both client and server.

BioWarfare Mod: http://goo.gl/BYWQty

Link to comment
Share on other sites

If you are familiar with the mod baubles it is an api that allows you to add "rings" and "amulets". I am calling the methods that these items use when they need to be activated if they are in my custom inventory. But i need to turn these attributes off if the item inventory is removed from the players inventory.

TickHandler


public class TatEventHandler {

@SubscribeEvent
public void PlayerEvent(PlayerEvent event) {

	EntityPlayer player = event.entityPlayer;

	if (player instanceof EntityPlayer) {
		if (player.isDead) {
			for (int a = 0; a < player.inventory.mainInventory.length; a++) {
				if (player.inventory.getStackInSlot(a) == new ItemStack(TatItems.itemBaublesBag)) {
					ItemStack baublesbag = player.inventory.getStackInSlot(a);
					InventoryBaublesBag inventorybaublesbag = (InventoryBaublesBag) BaublesBag.getInventory(baublesbag, player);
					for (int b = 0; b < inventorybaublesbag.inventory.length; b++) {
						if (inventorybaublesbag.getStackInSlot(b) != null && inventorybaublesbag.getStackInSlot(b).getItem() instanceof IBauble) {
							((IBauble) inventorybaublesbag.getStackInSlot(b).getItem()).onUnequipped(inventorybaublesbag.getStackInSlot(b), player);

						}
					}

				}
			}

		}
	}
}

@SubscribeEvent
public void ItemTossEvent(ItemTossEvent event) {
	EntityPlayer player = event.player;
	if (event.entityItem.getEntityItem().getItem() == TatItems.itemBaublesBag) {
		ItemStack baublesbag = event.entityItem.getEntityItem();
		InventoryBaublesBag inventorybaublesbag = (InventoryBaublesBag) BaublesBag.getInventory(baublesbag, player);
		for (int a = 0; a < inventorybaublesbag.inventory.length; a++) {
			if (inventorybaublesbag.getStackInSlot(a) != null && inventorybaublesbag.getStackInSlot(a).getItem() instanceof IBauble) {
				((IBauble) inventorybaublesbag.getStackInSlot(a).getItem()).onUnequipped(inventorybaublesbag.getStackInSlot(a), player);


			}
		}
	}
}

}

BioWarfare Mod: http://goo.gl/BYWQty

Link to comment
Share on other sites

When you're done, try shoving your item into an Item Frame.

 

Good luck solving that.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

When you're done, try shoving your item into an Item Frame.

 

Good luck solving that.

Very good point. Not to mention every other mod that takes the item out of the players inventory. Is there anyway to tell when the items stacksize has been decreased?Otherwise I may have to use a different approach with this whole thing but for now il continue on.

 

Use a debugger to find out what is happening. From what I can see the code paths for "press q" and "drop item outside inventory" are the same thing.

 

Well I thought it was a server client issue because throwing the item didn't stop my flight but i still took damage and so with this:

@SubscribeEvent
public void ItemTossEvent(ItemTossEvent event) {
	EntityPlayer player = event.player;
	if (event.entityItem.getEntityItem().getItem() == TatItems.itemBaublesBag) {
		ItemStack baublesbag = event.entityItem.getEntityItem();
		InventoryBaublesBag inventorybaublesbag = (InventoryBaublesBag) BaublesBag.getInventory(baublesbag, player);
		for (int a = 0; a < inventorybaublesbag.inventory.length; a++) {
			if (inventorybaublesbag.getStackInSlot(a) != null && inventorybaublesbag.getStackInSlot(a).getItem() instanceof IBauble) {
				if(player.worldObj.isRemote){
					System.out.println("client");
				}
				if(!player.worldObj.isRemote){
					System.out.println("server");
				}
				((IBauble) inventorybaublesbag.getStackInSlot(a).getItem()).onUnequipped(inventorybaublesbag.getStackInSlot(a), player);


			}
		}
	}
}

Putting the item outside the inventory prints both client and server whereas pressing "q" only prints server. So I think I am right in saying I need to send a packet from the server to the client then? Not an expert.

BioWarfare Mod: http://goo.gl/BYWQty

Link to comment
Share on other sites

When you're done, try shoving your item into an Item Frame.

 

Good luck solving that.

Very good point. Not to mention every other mod that takes the item out of the players inventory. Is there anyway to tell when the items stacksize has been decreased?Otherwise I may have to use a different approach with this whole thing but for now il continue on.

 

As I said, there is NO event, NO notification, NO function that is called when this occurs.  The item stack's direct property object

stacksize

is decremented.  You can't even ASM that.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

I am here just to reassure (second others) you that tracking items (itemstacks) in: inventories (mobs, players, blocks) and world itself - while possible for some of those parties - will NEVER be fully safe/working. It is simply impossible to do that using any standard approach.

 

As to non-standard apporach - it won't end well (been there, done that), and again will never be "exact" and safe.

 

You can only track few things about items, but not all.

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

Link to comment
Share on other sites

I'm confused as to why you are going about things the way your are ...

 

It sounds like you have a bauble that gives the user some buff as long as they have some other "fuel" item in their inventory.

Can't you achieve what you want by using the baubles ontick event. Every x ticks look at the players inventory and if they have the item, give the buff for x ticks. If they don't have the item then the buff won't get refreshed.

Current Project: Armerger 

Planned mods: Light Drafter  | Ore Swords

Looking for help getting a mod off the ground? Coding  | Textures

Link to comment
Share on other sites

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.