package openmods.utils; import java.util.Iterator; import java.util.Map; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.AnvilUpdateEvent; public class VanillaAnvilLogic { private int modifierCost; private int levelCost; private ItemStack outputStack; public VanillaAnvilLogic(ItemStack inputStack, ItemStack modifierStack) { this.levelCost = 0; this.modifierCost = -1; this.outputStack = null; // almost vanilla logic, with few renames and minor variable declaration cleanup int i = 0; int j = 0; int k; int l; int i1; int k1; int l1; if (inputStack == null) return; ItemStack inputStackCopy = inputStack.copy(); @SuppressWarnings("unchecked") Map<Integer, Integer> inputEnchantments = EnchantmentHelper.getEnchantments(inputStackCopy); boolean isEnchantedBook = false; int materialCost = inputStack.getRepairCost() + (modifierStack == null? 0 : modifierStack.getRepairCost()); if (modifierStack != null) { if (!onAnvilChange(inputStack, modifierStack, materialCost)) return; isEnchantedBook = modifierStack.getItem() == Items.enchanted_book && Items.enchanted_book.func_92110_g(modifierStack).tagCount() > 0; if (inputStackCopy.isItemStackDamageable() && inputStackCopy.getItem().getIsRepairable(inputStack, modifierStack)) { k = Math.min(inputStackCopy.getItemDamageForDisplay(), inputStackCopy.getMaxDamage() / 4); if (k <= 0) return; for (l = 0; k > 0 && l < modifierStack.stackSize; ++l) { i1 = inputStackCopy.getItemDamageForDisplay() - k; inputStackCopy.setItemDamage(i1); i += Math.max(1, k / 100) + inputEnchantments.size(); k = Math.min(inputStackCopy.getItemDamageForDisplay(), inputStackCopy.getMaxDamage() / 4); } this.modifierCost = l; } else { if (!isEnchantedBook && (inputStackCopy.getItem() != modifierStack.getItem() || !inputStackCopy.isItemStackDamageable())) return; if (inputStackCopy.isItemStackDamageable() && !isEnchantedBook) { k = inputStack.getMaxDamage() - inputStack.getItemDamageForDisplay(); l = modifierStack.getMaxDamage() - modifierStack.getItemDamageForDisplay(); i1 = l + inputStackCopy.getMaxDamage() * 12 / 100; int j1 = k + i1; k1 = inputStackCopy.getMaxDamage() - j1; if (k1 < 0) k1 = 0; if (k1 < inputStackCopy.getItemDamage()) { inputStackCopy.setItemDamage(k1); i += Math.max(1, i1 / 100); } } @SuppressWarnings("unchecked") Map<Integer, Integer> modifierEnchantments = EnchantmentHelper.getEnchantments(modifierStack); Iterator<Integer> iterator1 = modifierEnchantments.keySet().iterator(); while (iterator1.hasNext()) { i1 = iterator1.next(); Enchantment enchantment = Enchantment.enchantmentsList[i1]; k1 = inputEnchantments.containsKey(i1)? inputEnchantments.get(i1) : 0; l1 = modifierEnchantments.get(i1); int i3; if (k1 == l1) { ++l1; i3 = l1; } else { i3 = Math.max(l1, k1); } l1 = i3; int i2 = l1 - k1; boolean flag1 = enchantment.canApply(inputStack); if (inputStack.getItem() == Items.enchanted_book) flag1 = true; Iterator<Integer> iterator = inputEnchantments.keySet().iterator(); while (iterator.hasNext()) { int j2 = iterator.next(); if (j2 != i1 && !enchantment.canApplyTogether(Enchantment.enchantmentsList[j2])) { flag1 = false; i += i2; } } if (flag1) { if (l1 > enchantment.getMaxLevel()) l1 = enchantment.getMaxLevel(); inputEnchantments.put(i1, l1); int l2 = 0; switch (enchantment.getWeight()) { case 1: l2 = 8; break; case 2: l2 = 4; case 3: case 4: case 6: case 7: case 8: case 9: default: break; case 5: l2 = 2; break; case 10: l2 = 1; } if (isEnchantedBook) { l2 = Math.max(1, l2 / 2); } i += l2 * i2; } } } } k = 0; for (Iterator<Integer> iterator1 = inputEnchantments.keySet().iterator(); iterator1.hasNext(); materialCost += k + k1 * l1) { i1 = iterator1.next(); Enchantment enchantment = Enchantment.enchantmentsList[i1]; k1 = inputEnchantments.get(i1); l1 = 0; ++k; switch (enchantment.getWeight()) { case 1: l1 = 8; break; case 2: l1 = 4; case 3: case 4: case 6: case 7: case 8: case 9: default: break; case 5: l1 = 2; break; case 10: l1 = 1; } if (isEnchantedBook) l1 = Math.max(1, l1 / 2); } if (isEnchantedBook) materialCost = Math.max(1, materialCost / 2); if (isEnchantedBook && !inputStackCopy.getItem().isBookEnchantable(inputStackCopy, modifierStack)) inputStackCopy = null; this.levelCost = materialCost + i; if (i <= 0) inputStackCopy = null; if (j == i && j > 0 && this.levelCost >= 40) this.levelCost = 39; if (this.levelCost >= 40) inputStackCopy = null; if (inputStackCopy != null) { l = inputStackCopy.getRepairCost(); if (modifierStack != null && l < modifierStack.getRepairCost()) l = modifierStack.getRepairCost(); if (inputStackCopy.hasDisplayName()) l -= 9; if (l < 0) l = 0; l += 2; inputStackCopy.setRepairCost(l); EnchantmentHelper.setEnchantments(inputEnchantments, inputStackCopy); } outputStack = inputStackCopy; } private boolean onAnvilChange(ItemStack inputItem, ItemStack modifierItem, int baseCost) { AnvilUpdateEvent e = new AnvilUpdateEvent(inputItem, modifierItem, inputItem.getDisplayName(), baseCost); if (MinecraftForge.EVENT_BUS.post(e)) return false; if (e.output != null) { this.outputStack = e.output; this.levelCost = e.cost; this.modifierCost = e.materialCost; return false; } return true; } public int getModifierCost() { return modifierCost; } public int getLevelCost() { return levelCost; } public ItemStack getOutputStack() { return outputStack; } }