package crazypants.enderio.item.darksteel; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.event.AnvilUpdateEvent; import net.minecraftforge.oredict.OreDictionary; import com.enderio.core.common.util.OreDictionaryHelper; import com.google.common.collect.ImmutableList; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import crazypants.enderio.EnderIO; import crazypants.enderio.item.darksteel.upgrade.ApiaristArmorUpgrade; import crazypants.enderio.item.darksteel.upgrade.EnergyUpgrade; import crazypants.enderio.item.darksteel.upgrade.GliderUpgrade; import crazypants.enderio.item.darksteel.upgrade.IDarkSteelUpgrade; import crazypants.enderio.item.darksteel.upgrade.JumpUpgrade; import crazypants.enderio.item.darksteel.upgrade.NaturalistEyeUpgrade; import crazypants.enderio.item.darksteel.upgrade.NightVisionUpgrade; import crazypants.enderio.item.darksteel.upgrade.SolarUpgrade; import crazypants.enderio.item.darksteel.upgrade.SoundDetectorUpgrade; import crazypants.enderio.item.darksteel.upgrade.SpeedUpgrade; import crazypants.enderio.item.darksteel.upgrade.SpoonUpgrade; import crazypants.enderio.item.darksteel.upgrade.SwimUpgrade; import crazypants.enderio.item.darksteel.upgrade.TravelUpgrade; import crazypants.enderio.material.Alloy; import crazypants.enderio.thaumcraft.ThaumcraftCompat; public class DarkSteelRecipeManager { public static DarkSteelRecipeManager instance = new DarkSteelRecipeManager(); private List<IDarkSteelUpgrade> upgrades = new ArrayList<IDarkSteelUpgrade>(); public DarkSteelRecipeManager() { upgrades.add(EnergyUpgrade.EMPOWERED); upgrades.add(EnergyUpgrade.EMPOWERED_TWO); upgrades.add(EnergyUpgrade.EMPOWERED_THREE); upgrades.add(EnergyUpgrade.EMPOWERED_FOUR); upgrades.add(JumpUpgrade.JUMP_ONE); upgrades.add(JumpUpgrade.JUMP_TWO); upgrades.add(JumpUpgrade.JUMP_THREE); upgrades.add(SpeedUpgrade.SPEED_ONE); upgrades.add(SpeedUpgrade.SPEED_TWO); upgrades.add(SpeedUpgrade.SPEED_THREE); upgrades.add(GliderUpgrade.INSTANCE); upgrades.add(SoundDetectorUpgrade.INSTANCE); upgrades.add(SwimUpgrade.INSTANCE); upgrades.add(NightVisionUpgrade.INSTANCE); upgrades.add(TravelUpgrade.INSTANCE); upgrades.add(SpoonUpgrade.INSTANCE); upgrades.add(SolarUpgrade.SOLAR_ONE); upgrades.add(SolarUpgrade.SOLAR_TWO); if(Loader.isModLoaded("Thaumcraft")) { ThaumcraftCompat.loadUpgrades(upgrades); } if(Loader.isModLoaded("Forestry")) { upgrades.add(NaturalistEyeUpgrade.INSTANCE); upgrades.add(ApiaristArmorUpgrade.HELMET); upgrades.add(ApiaristArmorUpgrade.CHEST); upgrades.add(ApiaristArmorUpgrade.LEGS); upgrades.add(ApiaristArmorUpgrade.BOOTS); } } @SubscribeEvent public void handleAnvilEvent(AnvilUpdateEvent evt) { if(evt.left == null || evt.right == null) { return; } if(evt.left.getItem() instanceof IDarkSteelItem && OreDictionaryHelper.hasName(evt.right, Alloy.DARK_STEEL.getOreIngot())) { handleRepair(evt); } else { handleUpgrade(evt); } } private void handleRepair(AnvilUpdateEvent evt) { ItemStack targetStack = evt.left; ItemStack ingots = evt.right; //repair event IDarkSteelItem targetItem = (IDarkSteelItem)targetStack.getItem(); int maxIngots = targetItem.getIngotsRequiredForFullRepair(); double damPerc = (double)targetStack.getItemDamage()/ targetStack.getMaxDamage(); int requiredIngots = (int)Math.ceil(damPerc * maxIngots); if(ingots.stackSize > requiredIngots) { return; } int damageAddedPerIngot = (int)Math.ceil((double)targetStack.getMaxDamage()/maxIngots); int totalDamageRemoved = damageAddedPerIngot * ingots.stackSize; ItemStack resultStack = targetStack.copy(); resultStack.setItemDamage(Math.max(0, resultStack.getItemDamage() - totalDamageRemoved)); evt.output = resultStack; evt.cost = ingots.stackSize + (int)Math.ceil(getEnchantmentRepairCost(resultStack)/2); } private void handleUpgrade(AnvilUpdateEvent evt) { for (IDarkSteelUpgrade upgrade : upgrades) { if(upgrade.isUpgradeItem(evt.right) && upgrade.canAddToItem(evt.left)) { ItemStack res = new ItemStack(evt.left.getItem(), 1, evt.left.getItemDamage()); if(evt.left.stackTagCompound != null) { res.stackTagCompound = (NBTTagCompound) evt.left.stackTagCompound.copy(); } upgrade.writeToItem(res); evt.output = res; evt.cost = upgrade.getLevelCost(); return; } } } public static int getEnchantmentRepairCost(ItemStack itemStack) { //derived from ContainerRepair int res = 0; Map map1 = EnchantmentHelper.getEnchantments(itemStack); Iterator iter = map1.keySet().iterator(); while (iter.hasNext()) { int i1 = ((Integer) iter.next()).intValue(); Enchantment enchantment = Enchantment.enchantmentsList[i1]; int level = ((Integer) map1.get(Integer.valueOf(i1))).intValue(); if(enchantment.canApply(itemStack)) { if(level > enchantment.getMaxLevel()) { level = enchantment.getMaxLevel(); } int costPerLevel = 0; switch (enchantment.getWeight()) { case 1: costPerLevel = 8; break; case 2: costPerLevel = 4; case 3: case 4: case 6: case 7: case 8: case 9: default: break; case 5: costPerLevel = 2; break; case 10: costPerLevel = 1; } res += costPerLevel * level; } } return res; } public List<IDarkSteelUpgrade> getUpgrades() { return upgrades; } public void addCommonTooltipEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) { for (IDarkSteelUpgrade upgrade : upgrades) { if(upgrade.hasUpgrade(itemstack)) { upgrade.addCommonEntries(itemstack, entityplayer, list, flag); } } } public void addBasicTooltipEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) { for (IDarkSteelUpgrade upgrade : upgrades) { if(upgrade.hasUpgrade(itemstack)) { upgrade.addBasicEntries(itemstack, entityplayer, list, flag); } } } public void addAdvancedTooltipEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) { List<IDarkSteelUpgrade> applyableUpgrades = new ArrayList<IDarkSteelUpgrade>(); for (IDarkSteelUpgrade upgrade : upgrades) { if(upgrade.hasUpgrade(itemstack)) { upgrade.addDetailedEntries(itemstack, entityplayer, list, flag); } else if(upgrade.canAddToItem(itemstack)) { applyableUpgrades.add(upgrade); } } if(!applyableUpgrades.isEmpty()) { list.add(EnumChatFormatting.YELLOW + EnderIO.lang.localize("tooltip.anvilupgrades") + " "); for (IDarkSteelUpgrade up : applyableUpgrades) { list.add(EnumChatFormatting.DARK_AQUA + "" + "" + EnderIO.lang.localizeExact(up.getUnlocalizedName() + ".name") + ": "); list.add(EnumChatFormatting.DARK_AQUA + "" + EnumChatFormatting.ITALIC + " " + up.getUpgradeItemName() + " + " + up.getLevelCost() + " " + EnderIO.lang.localize("item.darkSteel.tooltip.lvs")); } } } public Iterator<IDarkSteelUpgrade> recipeIterator() { return ImmutableList.copyOf(upgrades).iterator(); } }