From e19d324dca5e885ac5847b17817a05d824d018bb Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Sun, 20 Dec 2020 23:32:12 +0000 Subject: [PATCH] Include offhand inventory in imbued item updating (and armour, while we're at it), fixes #493 --- .../electroblob/wizardry/data/WizardData.java | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/main/java/electroblob/wizardry/data/WizardData.java b/src/main/java/electroblob/wizardry/data/WizardData.java index 2b723acf..27d04b34 100644 --- a/src/main/java/electroblob/wizardry/data/WizardData.java +++ b/src/main/java/electroblob/wizardry/data/WizardData.java @@ -346,35 +346,47 @@ public class WizardData implements INBTSerializable { // For each item in the player's inventory for(ItemStack stack : player.inventory.mainInventory){ - if(stack.isItemEnchanted()){ + updateImbutedItem(stack, activeImbuements); + } + for(ItemStack stack : player.inventory.armorInventory){ + updateImbutedItem(stack, activeImbuements); + } + for(ItemStack stack : player.inventory.offHandInventory){ + updateImbutedItem(stack, activeImbuements); + } - NBTTagList enchantmentList = stack.getItem() == Items.ENCHANTED_BOOK ? - ItemEnchantedBook.getEnchantments(stack) : stack.getEnchantmentTagList(); + // Removes all imbuements from the map that are no longer active + this.imbuementDurations.keySet().retainAll(activeImbuements); + } - Iterator iterator = enchantmentList.iterator(); - // For each of the item's enchantments - while(iterator.hasNext()){ - NBTTagCompound enchantmentTag = (NBTTagCompound) iterator.next(); - Enchantment enchantment = Enchantment.getEnchantmentByID(enchantmentTag.getShort("id")); - // Ignores the enchantment unless it is an imbuement - if(enchantment instanceof Imbuement){ - int duration = this.getImbuementDuration(enchantment); - // If the imbuement is still active: - if(duration > 0){ - // Decrements the timer - this.imbuementDurations.put((Imbuement)enchantment, duration - IMBUEMENT_UPDATE_INTERVAL); - // Adds this imbuement to the set of imbuements that need to be kept - activeImbuements.add((Imbuement)enchantment); - }else{ - // Otherwise, removes the enchantment from the item - iterator.remove(); // FIXME: Apparently this can cause a CME - } + private void updateImbutedItem(ItemStack stack, Set activeImbuements){ + + if(stack.isItemEnchanted()){ + + NBTTagList enchantmentList = stack.getItem() == Items.ENCHANTED_BOOK ? + ItemEnchantedBook.getEnchantments(stack) : stack.getEnchantmentTagList(); + + Iterator iterator = enchantmentList.iterator(); + // For each of the item's enchantments + while(iterator.hasNext()){ + NBTTagCompound enchantmentTag = (NBTTagCompound) iterator.next(); + Enchantment enchantment = Enchantment.getEnchantmentByID(enchantmentTag.getShort("id")); + // Ignores the enchantment unless it is an imbuement + if(enchantment instanceof Imbuement){ + int duration = this.getImbuementDuration(enchantment); + // If the imbuement is still active: + if(duration > 0){ + // Decrements the timer + this.imbuementDurations.put((Imbuement)enchantment, duration - IMBUEMENT_UPDATE_INTERVAL); + // Adds this imbuement to the set of imbuements that need to be kept + activeImbuements.add((Imbuement)enchantment); + }else{ + // Otherwise, removes the enchantment from the item + iterator.remove(); // FIXME: Apparently this can cause a CME } } } } - // Removes all imbuements from the map that are no longer active - this.imbuementDurations.keySet().retainAll(activeImbuements); } // Ally designation system