I'm creating a custom item that changes when it's used on a mob. I'm using the following code (taken from here) in the item to do it:
public boolean itemInteractionForEntity(ItemStack item, EntityLiving entity)
{ if (entity instanceof EntityCow)
{
ItemStack var2 = Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem();
if (var2 != null && var2.itemID == MyMod.widgetEmpty.itemID)
{
if (var2.stackSize == 1)
{
Minecraft.getMinecraft().thePlayer.inventory.setInventorySlotContents(Minecraft.getMinecraft().thePlayer.inventory.currentItem, new
ItemStack(MyMod.widgetFull));
}
else if (!Minecraft.getMinecraft().thePlayer.inventory.addItemStackToInventory(new ItemStack(MyMod.widgetFull)))
{
Minecraft.getMinecraft().thePlayer.dropPlayerItem(new ItemStack(MyMod.widgetFull.itemID, 1, 0));
}
return true;
}
return false;
}
return false;
}
This works fine, but when the player equips the item and right clicks, the item reverts to the empty type.
I stepped through the code and it looks like this is what is happening. Item.onItemUse and Item.onItemRightClick get called, return false and the code returns to the main game loop. At this point, the item is still the full type. If I continue to step, I just go through the main game loop over and over.
When I click resume, at some point a packet arrives with a playerEntity object that has an inventory that contains the empty item type. This goes through all the updates and overwrites the player inventory with the empty object ItemStack.
Is this some sort of client/server thing? I don't know how these packets get generated. Even though I'm in single player mode, is there a server side inventory that I'm not updating?