package WayofTime.alchemicalWizardry.api.spell; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.items.EnergyItems; import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.*; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import java.util.Set; public class SpellParadigmTool extends SpellParadigm { private List leftClickEffectList; private List rightClickEffectList; private List toolUpdateEffectList; private List toolSummonEffectList; private List toolBanishEffectList; private List breakBlockEffectList; private List itemManipulatorEffectList; private List digAreaEffectList; private List specialDamageEffectList; private float maxDamage; private HashMap harvestLevel; private HashMap digSpeed; private HashMap maxDamageHash; private HashMap critChanceHash; private HashMap durationHash; private HashMap toolInfoString; private int fortuneLevel; private boolean silkTouch; private int duration; public SpellParadigmTool() { this.leftClickEffectList = new LinkedList(); this.rightClickEffectList = new LinkedList(); this.toolUpdateEffectList = new LinkedList(); this.toolSummonEffectList = new LinkedList(); this.toolBanishEffectList = new LinkedList(); this.breakBlockEffectList = new LinkedList(); this.itemManipulatorEffectList = new LinkedList(); this.digAreaEffectList = new LinkedList(); this.specialDamageEffectList = new LinkedList(); this.durationHash = new HashMap(); this.toolInfoString = new HashMap(); this.critChanceHash = new HashMap(); this.maxDamage = 5; this.harvestLevel = new HashMap(); this.harvestLevel.put("pickaxe", -1); this.harvestLevel.put("shovel", -1); this.harvestLevel.put("axe", -1); this.digSpeed = new HashMap(); this.digSpeed.put("pickaxe", 1.0f); this.digSpeed.put("shovel", 1.0f); this.digSpeed.put("axe", 1.0f); this.maxDamageHash = new HashMap(); this.maxDamageHash.put("default", 5.0f); this.fortuneLevel = 0; this.silkTouch = false; this.duration = 0; this.durationHash.put("default", 2400); } @Override public void enhanceParadigm(SpellEnhancement enh) { } @Override public void castSpell(World world, EntityPlayer entityPlayer, ItemStack crystal) { if (entityPlayer.worldObj.isRemote) { return; } int cost = this.getTotalCost(); if(!EnergyItems.syphonBatteries(crystal, entityPlayer, cost)) { return; } ItemStack toolStack = this.prepareTool(crystal, world); entityPlayer.setCurrentItemOrArmor(0, toolStack); this.onSummonTool(toolStack, world, entityPlayer); } /** * @param crystalStack * @return stack containing the new multitool */ public ItemStack prepareTool(ItemStack crystalStack, World world) { ItemStack toolStack = new ItemStack(ModItems.customTool, 1); ItemSpellMultiTool itemTool = (ItemSpellMultiTool) ModItems.customTool; itemTool.setItemAttack(toolStack, this.composeMaxDamageFromHash()); Set> harvestLevelSet = this.harvestLevel.entrySet(); for (Entry testMap : harvestLevelSet) { String tool = testMap.getKey(); int level = testMap.getValue(); itemTool.setHarvestLevel(toolStack, tool, level); } Set> digSpeedSet = this.digSpeed.entrySet(); for (Entry testMap : digSpeedSet) { String tool = testMap.getKey(); float speed = testMap.getValue(); itemTool.setDigSpeed(toolStack, tool, speed); } itemTool.setFortuneLevel(toolStack, getFortuneLevel()); itemTool.setSilkTouch(toolStack, this.getSilkTouch()); if (this.getSilkTouch()) { this.addToolString("SilkTouch", "Silk Touch" + " " + SpellHelper.getNumeralForInt(1)); } if (this.getFortuneLevel() > 0) { this.addToolString("Fortune", "Fortune" + " " + SpellHelper.getNumeralForInt(this.getFortuneLevel())); } itemTool.setCritChance(toolStack, this.getCritChance() / 100f); List toolStringList = new LinkedList(); for (String str : this.toolInfoString.values()) { toolStringList.add(str); } itemTool.setToolListString(toolStack, toolStringList); for (Integer integ : this.durationHash.values()) { this.duration += integ; } itemTool.setDuration(toolStack, world, this.duration); itemTool.loadParadigmIntoStack(toolStack, this.bufferedEffectList); EnergyItems.checkAndSetItemOwner(toolStack, EnergyItems.getOwnerName(crystalStack)); itemTool.setContainedCrystal(toolStack, crystalStack); return toolStack; } @Override public int getDefaultCost() { return 100; } public static SpellParadigmTool getParadigmForEffectArray(List effectList) { SpellParadigmTool parad = new SpellParadigmTool(); for (SpellEffect eff : effectList) { parad.addBufferedEffect(eff); } parad.applyAllSpellEffects(); return parad; } public void addLeftClickEffect(ILeftClickEffect eff) { if (eff != null) { this.leftClickEffectList.add(eff); } } public void addRightClickEffect(IRightClickEffect eff) { if (eff != null) { this.rightClickEffectList.add(eff); } } public void addUpdateEffect(IToolUpdateEffect eff) { if (eff != null) { this.toolUpdateEffectList.add(eff); } } public void addToolSummonEffect(IOnSummonTool eff) { if (eff != null) { this.toolSummonEffectList.add(eff); } } public void addToolBanishEffect(IOnBanishTool eff) { if (eff != null) { this.toolBanishEffectList.add(eff); } } public void addBlockBreakEffect(IOnBreakBlock eff) { if (eff != null) { this.breakBlockEffectList.add(eff); } } public void addItemManipulatorEffect(IItemManipulator eff) { if (eff != null) { this.itemManipulatorEffectList.add(eff); } } public void addDigAreaEffect(IDigAreaEffect eff) { if (eff != null) { this.digAreaEffectList.add(eff); } } public void addSpecialDamageEffect(ISpecialDamageEffect eff) { if (eff != null) { this.specialDamageEffectList.add(eff); } } public int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder) { int total = 0; for (ILeftClickEffect effect : this.leftClickEffectList) { total += effect.onLeftClickEntity(stack, attacked, weilder); } return total; } public int onRightClickBlock(ItemStack toolStack, EntityLivingBase weilder, World world, MovingObjectPosition mop) { int total = 0; for (IRightClickEffect effect : this.rightClickEffectList) { total += effect.onRightClickBlock(toolStack, weilder, world, mop); } return total; } public int onRightClickAir(ItemStack toolStack, World world, EntityPlayer player) { int total = 0; for (IRightClickEffect effect : this.rightClickEffectList) { total += effect.onRightClickAir(toolStack, player); } return total; } public int onUpdate(ItemStack toolStack, World world, Entity par3Entity, int invSlot, boolean inHand) { int total = 0; for (IToolUpdateEffect effect : this.toolUpdateEffectList) { total += effect.onUpdate(toolStack, world, par3Entity, invSlot, inHand); } return total; } public int onSummonTool(ItemStack toolStack, World world, Entity entity) { int total = 0; for (IOnSummonTool effect : this.toolSummonEffectList) { total += effect.onSummonTool(toolStack, world, entity); } return total; } public int onBanishTool(ItemStack toolStack, World world, Entity entity, int invSlot, boolean inHand) { int total = 0; for (IOnBanishTool effect : this.toolBanishEffectList) { total += effect.onBanishTool(toolStack, world, entity, invSlot, inHand); } return total; } public int onBreakBlock(ItemStack container, World world, EntityPlayer player, Block block, int meta, int x, int y, int z, ForgeDirection sideBroken) { int total = 0; for (IOnBreakBlock effect : this.breakBlockEffectList) { total += effect.onBlockBroken(container, world, player, block, meta, x, y, z, sideBroken); } return total; } public List handleItemList(ItemStack toolStack, List items) { List heldList = items; for (IItemManipulator eff : this.itemManipulatorEffectList) { List newHeldList = eff.handleItemsOnBlockBroken(toolStack, heldList); heldList = newHeldList; } return heldList; } public int digSurroundingArea(ItemStack container, World world, EntityPlayer player, MovingObjectPosition blockPos, String usedToolClass, float blockHardness, int harvestLvl, ItemSpellMultiTool itemTool) { int cost = 0; for (IDigAreaEffect effect : this.digAreaEffectList) { cost += effect.digSurroundingArea(container, world, player, blockPos, usedToolClass, blockHardness, harvestLvl, itemTool); } return cost; } public int getFortuneLevel() { return this.fortuneLevel; } public void setFortuneLevel(int fortuneLevel) { this.fortuneLevel = fortuneLevel; } public boolean getSilkTouch() { return this.silkTouch; } public void setSilkTouch(boolean silkTouch) { this.silkTouch = silkTouch; } public int getDuration() { return this.duration; } public void setDuration(int duration) { this.duration = duration; } public void setDigSpeed(String toolClass, float digSpeed) { this.digSpeed.put(toolClass, digSpeed); } public void setHarvestLevel(String toolClass, int hlvl) { this.harvestLevel.put(toolClass, hlvl); } public float composeMaxDamageFromHash() { float damage = 0.0f; for (float f : this.maxDamageHash.values()) { damage += f; } return damage; } public void addDamageToHash(String key, float dmg) { this.maxDamageHash.put(key, dmg); } public void addToolString(String key, String str) { if (str != null && key != null) { this.toolInfoString.put(key, str); } } public void addCritChance(String key, float chance) { //Chance is in percentage chance i.e. chance = 1.0 means 1.0% this.critChanceHash.put(key, chance); } public void addDuration(String key, int dur) { this.durationHash.put(key, dur); } public float getCritChance() { float chance = 0.0f; for (float fl : this.critChanceHash.values()) { chance += fl; } return chance; } public float getAddedDamageForEntity(Entity entity) { HashMap hash = new HashMap(); for (ISpecialDamageEffect effect : this.specialDamageEffectList) { hash.put(effect.getKey(), effect.getDamageForEntity(entity)); } float addedDmg = 0.0f; for (float fl : hash.values()) { addedDmg += fl; } return addedDmg; } }