diff --git a/src/main/java/electroblob/wizardry/item/ItemFlamecatcher.java b/src/main/java/electroblob/wizardry/item/ItemFlamecatcher.java index 0e69a622..d8b57e54 100644 --- a/src/main/java/electroblob/wizardry/item/ItemFlamecatcher.java +++ b/src/main/java/electroblob/wizardry/item/ItemFlamecatcher.java @@ -1,11 +1,11 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; -import electroblob.wizardry.client.DrawingUtils; import electroblob.wizardry.entity.projectile.EntityFlamecatcherArrow; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.spell.Flamecatcher; +import electroblob.wizardry.util.InventoryUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -111,7 +111,7 @@ public class ItemFlamecatcher extends ItemBow implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/item/ItemFlamingAxe.java b/src/main/java/electroblob/wizardry/item/ItemFlamingAxe.java index a015fd30..416adefa 100644 --- a/src/main/java/electroblob/wizardry/item/ItemFlamingAxe.java +++ b/src/main/java/electroblob/wizardry/item/ItemFlamingAxe.java @@ -4,6 +4,7 @@ import com.google.common.collect.Multimap; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.EntityUtils; +import electroblob.wizardry.util.InventoryUtils; import electroblob.wizardry.util.MagicDamage; import electroblob.wizardry.util.MagicDamage.DamageType; import net.minecraft.entity.Entity; @@ -81,7 +82,7 @@ public class ItemFlamingAxe extends ItemAxe implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/item/ItemFrostAxe.java b/src/main/java/electroblob/wizardry/item/ItemFrostAxe.java index 35ed354b..e9cf5912 100644 --- a/src/main/java/electroblob/wizardry/item/ItemFrostAxe.java +++ b/src/main/java/electroblob/wizardry/item/ItemFrostAxe.java @@ -5,6 +5,7 @@ import electroblob.wizardry.registry.Spells; import electroblob.wizardry.registry.WizardryPotions; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.EntityUtils; +import electroblob.wizardry.util.InventoryUtils; import electroblob.wizardry.util.MagicDamage; import electroblob.wizardry.util.MagicDamage.DamageType; import net.minecraft.entity.Entity; @@ -83,7 +84,7 @@ public class ItemFrostAxe extends ItemAxe implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/item/ItemLightningHammer.java b/src/main/java/electroblob/wizardry/item/ItemLightningHammer.java index f8bb19e9..9c6aa979 100644 --- a/src/main/java/electroblob/wizardry/item/ItemLightningHammer.java +++ b/src/main/java/electroblob/wizardry/item/ItemLightningHammer.java @@ -7,6 +7,7 @@ import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.spell.LightningHammer; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.EntityUtils; +import electroblob.wizardry.util.InventoryUtils; import electroblob.wizardry.util.MagicDamage; import electroblob.wizardry.util.MagicDamage.DamageType; import electroblob.wizardry.util.ParticleBuilder; @@ -112,7 +113,7 @@ public class ItemLightningHammer extends Item implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/item/ItemSpectralBow.java b/src/main/java/electroblob/wizardry/item/ItemSpectralBow.java index 0bbad2b8..7ba0e290 100644 --- a/src/main/java/electroblob/wizardry/item/ItemSpectralBow.java +++ b/src/main/java/electroblob/wizardry/item/ItemSpectralBow.java @@ -2,6 +2,7 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; import electroblob.wizardry.registry.Spells; +import electroblob.wizardry.util.InventoryUtils; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -105,7 +106,7 @@ public class ItemSpectralBow extends ItemBow implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/item/ItemSpectralPickaxe.java b/src/main/java/electroblob/wizardry/item/ItemSpectralPickaxe.java index b48ae2b2..90ba3264 100644 --- a/src/main/java/electroblob/wizardry/item/ItemSpectralPickaxe.java +++ b/src/main/java/electroblob/wizardry/item/ItemSpectralPickaxe.java @@ -1,6 +1,7 @@ package electroblob.wizardry.item; import electroblob.wizardry.registry.Spells; +import electroblob.wizardry.util.InventoryUtils; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -62,7 +63,7 @@ public class ItemSpectralPickaxe extends ItemPickaxe implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/item/ItemSpectralSword.java b/src/main/java/electroblob/wizardry/item/ItemSpectralSword.java index 345cac72..a21a4c77 100644 --- a/src/main/java/electroblob/wizardry/item/ItemSpectralSword.java +++ b/src/main/java/electroblob/wizardry/item/ItemSpectralSword.java @@ -3,6 +3,7 @@ package electroblob.wizardry.item; import com.google.common.collect.Multimap; import electroblob.wizardry.registry.Spells; import electroblob.wizardry.util.EntityUtils; +import electroblob.wizardry.util.InventoryUtils; import net.minecraft.entity.Entity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; @@ -77,7 +78,7 @@ public class ItemSpectralSword extends ItemSword implements IConjuredItem { @Override public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean selected){ int damage = stack.getItemDamage(); - if(damage > stack.getMaxDamage()) entity.replaceItemInInventory(slot, ItemStack.EMPTY); + if(damage > stack.getMaxDamage()) InventoryUtils.replaceItemInInventory(entity, slot, stack, ItemStack.EMPTY); stack.setItemDamage(damage + 1); } diff --git a/src/main/java/electroblob/wizardry/util/InventoryUtils.java b/src/main/java/electroblob/wizardry/util/InventoryUtils.java index 438458e0..acb3bb42 100644 --- a/src/main/java/electroblob/wizardry/util/InventoryUtils.java +++ b/src/main/java/electroblob/wizardry/util/InventoryUtils.java @@ -1,5 +1,6 @@ package electroblob.wizardry.util; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; @@ -10,6 +11,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHandSide; import net.minecraft.util.NonNullList; +import net.minecraft.world.World; import java.util.ArrayList; import java.util.Arrays; @@ -142,4 +144,28 @@ public final class InventoryUtils { && ItemStack.areItemStackTagsEqual(stack1, stack2); } + /** + * A version of {@link Entity#replaceItemInInventory(int, ItemStack)} that takes a slot index specific to the main, + * armour and offhand inventories, as passed to {@link Item#onUpdate(ItemStack, World, Entity, int, boolean)}, + * rather than the proper slot index used everywhere else (just why, Mojang?). + * @param entity The entity to replace the item for + * @param slot The slot index to replace + * @param original The item stack currently in the slot (required for technical reasons) + * @param replacement The new item stack + * @return True if an item was replaced, false if not + */ + public static boolean replaceItemInInventory(Entity entity, int slot, ItemStack original, ItemStack replacement){ + // Check slots that aren't in the main inventory first by comparing with the existing item + if(entity instanceof EntityLivingBase){ + for(EntityEquipmentSlot eslot : EntityEquipmentSlot.values()){ + if(((EntityLivingBase)entity).getItemStackFromSlot(eslot) == original){ + entity.setItemStackToSlot(eslot, replacement); + return true; + } + } + } + // Otherwise use the normal behaviour + return entity.replaceItemInInventory(slot, replacement); + } + }