From b74ed8d431247dffdb41cd7a302d2eba15a69362 Mon Sep 17 00:00:00 2001
From: WayofTime <wtime@live.ca>
Date: Tue, 5 Jan 2016 12:17:05 -0500
Subject: [PATCH] Added self-sacrifice upgrade to living armour.

---
 changelog.txt                                 |  1 +
 .../api/event/SacrificeKnifeUsedEvent.java    |  4 +-
 .../item/ItemSacrificialDagger.java           | 35 ++++----
 .../item/armour/ItemLivingArmour.java         |  8 +-
 .../LivingArmourUpgradeSelfSacrifice.java     | 57 ++++++++++++
 .../StatTrackerSelfSacrifice.java             | 88 +++++++++++++++++++
 .../registry/ModArmourTrackers.java           |  6 +-
 .../bloodmagic/util/handler/EventHandler.java | 43 +++++++++
 .../assets/bloodmagic/lang/en_US.lang         |  1 +
 9 files changed, 220 insertions(+), 23 deletions(-)
 create mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgradeSelfSacrifice.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/StatTrackerSelfSacrifice.java

diff --git a/changelog.txt b/changelog.txt
index 3315a141..9efd4d2a 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -4,6 +4,7 @@ Version 2.0.0-3
 - Fixed client-side issue when shift-clicking lava crystals into a furnace while on a server.
 - Added poison upgrade to Living Armour
 - Fixed digging upgrade
+- Added self sacrifice upgrade to Living Armour (Tough Palms)
 
 
 ------------------------------------------------------
diff --git a/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java b/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java
index e1db5173..49fd07f4 100644
--- a/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java
+++ b/src/main/java/WayofTime/bloodmagic/api/event/SacrificeKnifeUsedEvent.java
@@ -9,14 +9,16 @@ public class SacrificeKnifeUsedEvent extends Event
 {
     public final EntityPlayer player;
     public final int healthDrained;
+    public int lpAdded;
     public boolean shouldDrainHealth;
     public boolean shouldFillAltar;
 
-    public SacrificeKnifeUsedEvent(EntityPlayer player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp)
+    public SacrificeKnifeUsedEvent(EntityPlayer player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded)
     {
         this.player = player;
         this.shouldDrainHealth = shouldDrainHealth;
         this.shouldFillAltar = shouldFillAltar;
         this.healthDrained = hp;
+        this.lpAdded = lpAdded;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java
index 49a9a091..caac80de 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java
@@ -1,33 +1,30 @@
 package WayofTime.bloodmagic.item;
 
-import WayofTime.bloodmagic.BloodMagic;
-import WayofTime.bloodmagic.api.BloodMagicAPI;
-import WayofTime.bloodmagic.api.Constants;
-import WayofTime.bloodmagic.api.DamageSourceBloodMagic;
-import WayofTime.bloodmagic.api.altar.IBloodAltar;
-import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent;
-import WayofTime.bloodmagic.api.util.helper.NBTHelper;
-import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
-import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper;
-import WayofTime.bloodmagic.util.helper.TextHelper;
+import java.util.Arrays;
+import java.util.List;
+
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.EnumAction;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.BlockPos;
 import net.minecraft.util.EnumParticleTypes;
-import net.minecraft.util.StatCollector;
 import net.minecraft.world.World;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
-
-import java.util.Arrays;
-import java.util.List;
+import WayofTime.bloodmagic.BloodMagic;
+import WayofTime.bloodmagic.api.BloodMagicAPI;
+import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.api.altar.IBloodAltar;
+import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent;
+import WayofTime.bloodmagic.api.util.helper.NBTHelper;
+import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
+import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper;
+import WayofTime.bloodmagic.util.helper.TextHelper;
 
 public class ItemSacrificialDagger extends Item
 {
@@ -94,9 +91,11 @@ public class ItemSacrificialDagger extends Item
             return stack;
         }
 
+        int lpAdded = 200;
+
         if (!player.capabilities.isCreativeMode)
         {
-            SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, 2);
+            SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, 2, lpAdded);
             if (MinecraftForge.EVENT_BUS.post(evt))
                 return stack;
 
@@ -108,6 +107,8 @@ public class ItemSacrificialDagger extends Item
 
             if (!evt.shouldFillAltar)
                 return stack;
+
+            lpAdded = evt.lpAdded;
         }
 
         double posX = player.posX;
@@ -126,7 +127,7 @@ public class ItemSacrificialDagger extends Item
             return stack;
 
         // TODO - Check if SoulFray is active
-        findAndFillAltar(world, player, 200);
+        findAndFillAltar(world, player, lpAdded);
 
         return stack;
     }
diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java
index eff7eb02..7c546354 100644
--- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java
+++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java
@@ -44,7 +44,7 @@ public class ItemLivingArmour extends ItemArmor
     {
         if (this == ModItems.livingArmourChest)
         {
-            LivingArmour armour = this.getLivingArmour(stack);
+            LivingArmour armour = getLivingArmour(stack);
             for (Entry<String, LivingArmourUpgrade> entry : armour.upgradeMap.entrySet())
             {
                 LivingArmourUpgrade upgrade = entry.getValue();
@@ -117,7 +117,7 @@ public class ItemLivingArmour extends ItemArmor
         return super.getUnlocalizedName(stack) + names[armorType];
     }
 
-    public LivingArmour getLivingArmour(ItemStack stack)
+    public static LivingArmour getLivingArmour(ItemStack stack)
     {
         NBTTagCompound livingTag = getArmourTag(stack);
 
@@ -143,7 +143,7 @@ public class ItemLivingArmour extends ItemArmor
         setArmourTag(stack, livingTag);
     }
 
-    public NBTTagCompound getArmourTag(ItemStack stack)
+    public static NBTTagCompound getArmourTag(ItemStack stack)
     {
         if (!stack.hasTagCompound())
         {
@@ -166,7 +166,7 @@ public class ItemLivingArmour extends ItemArmor
         tag.setTag(Constants.NBT.LIVING_ARMOUR, livingTag);
     }
 
-    public LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack)
+    public static LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack)
     {
         if (!armourMap.containsKey(stack))
         {
diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgradeSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgradeSelfSacrifice.java
new file mode 100644
index 00000000..137632d8
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgradeSelfSacrifice.java
@@ -0,0 +1,57 @@
+package WayofTime.bloodmagic.livingArmour;
+
+import net.minecraft.nbt.NBTTagCompound;
+import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade;
+
+public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade
+{
+    public static final int[] costs = new int[] { 10, 25, 50, 80, 120 };
+    public static final double[] sacrificeModifier = new double[] { 0.2, 0.4, 0.6, 0.8, 1.0 };
+
+    public LivingArmourUpgradeSelfSacrifice(int level)
+    {
+        super(level);
+    }
+
+    public double getSacrificeModifier()
+    {
+        return sacrificeModifier[this.level];
+    }
+
+    @Override
+    public String getUniqueIdentifier()
+    {
+        return Constants.Mod.MODID + ".upgrade.selfSacrifice";
+    }
+
+    @Override
+    public int getMaxTier()
+    {
+        return 5; // Set to here until I can add more upgrades to it.
+    }
+
+    @Override
+    public int getCostOfUpgrade()
+    {
+        return costs[this.level];
+    }
+
+    @Override
+    public void writeToNBT(NBTTagCompound tag)
+    {
+        // EMPTY
+    }
+
+    @Override
+    public void readFromNBT(NBTTagCompound tag)
+    {
+        // EMPTY
+    }
+
+    @Override
+    public String getUnlocalizedName()
+    {
+        return tooltipBase + "selfSacrifice";
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTrackerSelfSacrifice.java
new file mode 100644
index 00000000..f17aadd0
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTrackerSelfSacrifice.java
@@ -0,0 +1,88 @@
+package WayofTime.bloodmagic.livingArmour;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
+import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade;
+import WayofTime.bloodmagic.api.livingArmour.StatTracker;
+
+public class StatTrackerSelfSacrifice extends StatTracker
+{
+    public static HashMap<LivingArmour, Integer> changeMap = new HashMap<LivingArmour, Integer>();
+    public static int[] sacrificesRequired = new int[] { 50, 200, 400, 600, 800 }; //testing
+
+    public int totalSacrifices = 0;
+
+    public static void incrementCounter(LivingArmour armour)
+    {
+        changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1);
+    }
+
+    @Override
+    public String getUniqueIdentifier()
+    {
+        return Constants.Mod.MODID + ".tracker.selfSacrifice";
+    }
+
+    @Override
+    public void resetTracker()
+    {
+        this.totalSacrifices = 0;
+    }
+
+    @Override
+    public void readFromNBT(NBTTagCompound tag)
+    {
+        totalSacrifices = tag.getInteger(Constants.Mod.MODID + ".tracker.selfSacrifice");
+    }
+
+    @Override
+    public void writeToNBT(NBTTagCompound tag)
+    {
+        tag.setInteger(Constants.Mod.MODID + ".tracker.selfSacrifice", totalSacrifices);
+
+    }
+
+    @Override
+    public boolean onTick(World world, EntityPlayer player, LivingArmour livingArmour)
+    {
+        if (changeMap.containsKey(livingArmour))
+        {
+            int change = Math.abs(changeMap.get(livingArmour));
+            if (change > 0)
+            {
+                totalSacrifices += Math.abs(changeMap.get(livingArmour));
+
+                changeMap.put(livingArmour, 0);
+
+                this.markDirty();
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    public List<LivingArmourUpgrade> getUpgrades()
+    {
+        // TODO Auto-generated method stub
+        List<LivingArmourUpgrade> upgradeList = new ArrayList<LivingArmourUpgrade>();
+
+        for (int i = 0; i < 5; i++)
+        {
+            if (totalSacrifices > sacrificesRequired[i])
+            {
+                upgradeList.add(new LivingArmourUpgradeSelfSacrifice(i));
+            }
+        }
+
+        return upgradeList;
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java
index d4ba4b60..3e37e062 100644
--- a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java
+++ b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java
@@ -3,10 +3,12 @@ package WayofTime.bloodmagic.registry;
 import WayofTime.bloodmagic.api.livingArmour.LivingArmourHandler;
 import WayofTime.bloodmagic.livingArmour.LivingArmourUpgradeDigging;
 import WayofTime.bloodmagic.livingArmour.LivingArmourUpgradePoisonResist;
+import WayofTime.bloodmagic.livingArmour.LivingArmourUpgradeSelfSacrifice;
 import WayofTime.bloodmagic.livingArmour.LivingArmourUpgradeSpeed;
 import WayofTime.bloodmagic.livingArmour.StatTrackerDigging;
 import WayofTime.bloodmagic.livingArmour.StatTrackerMovement;
 import WayofTime.bloodmagic.livingArmour.StatTrackerPoison;
+import WayofTime.bloodmagic.livingArmour.StatTrackerSelfSacrifice;
 
 public class ModArmourTrackers
 {
@@ -15,9 +17,11 @@ public class ModArmourTrackers
         LivingArmourHandler.registerStatTracker(StatTrackerMovement.class);
         LivingArmourHandler.registerStatTracker(StatTrackerDigging.class);
         LivingArmourHandler.registerStatTracker(StatTrackerPoison.class);
+        LivingArmourHandler.registerStatTracker(StatTrackerSelfSacrifice.class);
 
-        LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSpeed(1));
+        LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSpeed(0));
         LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeDigging(0));
         LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradePoisonResist(0));
+        LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSelfSacrifice(0));
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java
index c6e79976..0c926dfb 100644
--- a/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java
+++ b/src/main/java/WayofTime/bloodmagic/util/handler/EventHandler.java
@@ -16,7 +16,9 @@ import WayofTime.bloodmagic.ConfigHandler;
 import WayofTime.bloodmagic.api.BlockStack;
 import WayofTime.bloodmagic.api.BloodMagicAPI;
 import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.api.event.SacrificeKnifeUsedEvent;
 import WayofTime.bloodmagic.api.event.TeleposeEvent;
+import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade;
 import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
 import WayofTime.bloodmagic.block.BlockAltar;
 import WayofTime.bloodmagic.item.ItemAltarMaker;
@@ -24,7 +26,9 @@ import WayofTime.bloodmagic.item.armour.ItemLivingArmour;
 import WayofTime.bloodmagic.item.gear.ItemPackSacrifice;
 import WayofTime.bloodmagic.livingArmour.LivingArmour;
 import WayofTime.bloodmagic.livingArmour.LivingArmourUpgradeDigging;
+import WayofTime.bloodmagic.livingArmour.LivingArmourUpgradeSelfSacrifice;
 import WayofTime.bloodmagic.livingArmour.StatTrackerDigging;
+import WayofTime.bloodmagic.livingArmour.StatTrackerSelfSacrifice;
 import WayofTime.bloodmagic.registry.ModBlocks;
 import WayofTime.bloodmagic.registry.ModItems;
 import WayofTime.bloodmagic.util.ChatUtil;
@@ -113,6 +117,15 @@ public class EventHandler
         EntityPlayer player = event.getPlayer();
         if (player != null)
         {
+            for (int i = 0; i < 4; i++)
+            {
+                ItemStack stack = player.getCurrentArmor(i);
+                if (stack == null || !(stack.getItem() instanceof ItemLivingArmour))
+                {
+                    return;
+                }
+            }
+
             ItemStack chestStack = player.getCurrentArmor(2);
             if (chestStack != null && chestStack.getItem() instanceof ItemLivingArmour)
             {
@@ -126,4 +139,34 @@ public class EventHandler
             }
         }
     }
+
+    @SubscribeEvent
+    public void selfSacrificeEvent(SacrificeKnifeUsedEvent event)
+    {
+        EntityPlayer player = event.player;
+
+        for (int i = 0; i < 4; i++)
+        {
+            ItemStack stack = player.getCurrentArmor(i);
+            if (stack == null || !(stack.getItem() instanceof ItemLivingArmour))
+            {
+                return;
+            }
+        }
+
+        ItemStack chestStack = player.getCurrentArmor(2);
+        LivingArmour armour = ItemLivingArmour.armourMap.get(chestStack);
+        if (armour != null)
+        {
+            StatTrackerSelfSacrifice.incrementCounter(armour);
+            LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(Constants.Mod.MODID + ".upgrade.selfSacrifice", chestStack);
+
+            if (upgrade instanceof LivingArmourUpgradeSelfSacrifice)
+            {
+                double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier();
+
+                event.lpAdded = (int) (event.lpAdded * (1 + modifier));
+            }
+        }
+    }
 }
diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang
index fc2cce2d..2dfe33f2 100644
--- a/src/main/resources/assets/bloodmagic/lang/en_US.lang
+++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang
@@ -226,6 +226,7 @@ tooltip.BloodMagic.telepositionFocus.demonic=Used to move blocks in the world
 tooltip.BloodMagic.livingArmour.upgrade.speed=Quick Feet
 tooltip.BloodMagic.livingArmour.upgrade.digging=Dwarven Might
 tooltip.BloodMagic.livingArmour.upgrade.poisonResist=Poison Resistance
+tooltip.BloodMagic.livingArmour.upgrade.selfSacrifice=Tough Palms
 tooltip.BloodMagic.livingArmour.upgrade.level=(Level %d)
 
 # Ritual