diff --git a/src/main/java/vazkii/botania/api/mana/IManaDiscountArmor.java b/src/main/java/vazkii/botania/api/mana/IManaDiscountArmor.java new file mode 100644 index 000000000..4baea11c2 --- /dev/null +++ b/src/main/java/vazkii/botania/api/mana/IManaDiscountArmor.java @@ -0,0 +1,30 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jan 28, 2015, 9:22:53 PM (GMT)] + */ +package vazkii.botania.api.mana; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** + * An armor item that implements this can provide a mana discount for mana tools. + * Mana tools are the ones on the main toolset (Pick, Shovel, Axe, Sword and Shovel). + */ +public interface IManaDiscountArmor { + + /** + * Gets the mana discount that this piece of armor provides. This is added + * together to create the full discount. + * Value is to be from 0.0 to 1.0. 0.1 is 10% discount, as an example. + * You can also return negative values to make tools cost more. + */ + public float getDiscount(ItemStack stack, int slot, EntityPlayer player); + +} diff --git a/src/main/java/vazkii/botania/api/mana/ManaItemHandler.java b/src/main/java/vazkii/botania/api/mana/ManaItemHandler.java index 840fa66d7..7811049c4 100644 --- a/src/main/java/vazkii/botania/api/mana/ManaItemHandler.java +++ b/src/main/java/vazkii/botania/api/mana/ManaItemHandler.java @@ -197,4 +197,47 @@ public final class ManaItemHandler { return false; } + + /** + * Requests mana from items in a given player's inventory. This version also + * checks for IManaDiscountArmor items equipped to lower the cost. + * @param manaToGet How much mana is to be requested, if less mana exists than this amount, + * the amount of mana existent will be returned instead, if you want exact values use requestManaExact. + * @param remove If true, the mana will be removed from the target item. Set to false to just check. + * @return The amount of mana received from the request. + */ + public static int requestManaForTool(ItemStack stack, EntityPlayer player, int manaToGet, boolean remove) { + float multiplier = 1F - getFullDiscountForTools(player); + int cost = (int) ((float) manaToGet * multiplier); + return (int) ((float) requestMana(stack, player, cost, remove) / multiplier); + } + + /** + * Requests an exact amount of mana from items in a given player's inventory. This version also + * checks for IManaDiscountArmor items equipped to lower the cost. + * @param manaToGet How much mana is to be requested, if less mana exists than this amount, + * false will be returned instead, and nothing will happen. + * @param remove If true, the mana will be removed from the target item. Set to false to just check. + * @return If the request was succesful. + */ + public static boolean requestManaExactForTool(ItemStack stack, EntityPlayer player, int manaToGet, boolean remove) { + float multiplier = 1F - getFullDiscountForTools(player); + int cost = (int) ((float) manaToGet * multiplier); + return requestManaExact(stack, player, cost, remove); + } + + /** + * Gets the sum of all the discounts on IManaDiscountArmor items equipped + * on the player passed in. + */ + public static float getFullDiscountForTools(EntityPlayer player) { + float discount = 0F; + for(int i = 0; i < player.inventory.armorInventory.length; i++) { + ItemStack armor = player.inventory.armorInventory[i]; + if(armor != null && armor.getItem() instanceof IManaDiscountArmor) + discount += ((IManaDiscountArmor) armor.getItem()).getDiscount(armor, i, player); + } + + return discount; + } } diff --git a/src/main/java/vazkii/botania/common/item/equipment/armor/manasteel/ItemManasteelHelm.java b/src/main/java/vazkii/botania/common/item/equipment/armor/manasteel/ItemManasteelHelm.java index bf5ae2945..e06815638 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/armor/manasteel/ItemManasteelHelm.java +++ b/src/main/java/vazkii/botania/common/item/equipment/armor/manasteel/ItemManasteelHelm.java @@ -10,9 +10,12 @@ */ package vazkii.botania.common.item.equipment.armor.manasteel; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import vazkii.botania.api.mana.IManaDiscountArmor; import vazkii.botania.common.lib.LibItemNames; -public class ItemManasteelHelm extends ItemManasteelArmor { +public class ItemManasteelHelm extends ItemManasteelArmor implements IManaDiscountArmor { public ItemManasteelHelm() { this(LibItemNames.MANASTEEL_HELM); @@ -22,4 +25,9 @@ public class ItemManasteelHelm extends ItemManasteelArmor { super(0, name); } + @Override + public float getDiscount(ItemStack stack, int slot, EntityPlayer player) { + return hasArmorSet(player) ? 0.1F : 0F; + } + } diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/ToolCommons.java b/src/main/java/vazkii/botania/common/item/equipment/tool/ToolCommons.java index 766e61495..36706e30a 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/ToolCommons.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/ToolCommons.java @@ -30,7 +30,7 @@ public final class ToolCommons { public static void damageItem(ItemStack stack, int dmg, EntityLivingBase entity, int manaPerDamage) { int manaToRequest = dmg * manaPerDamage; - boolean manaRequested = entity instanceof EntityPlayer ? ManaItemHandler.requestManaExact(stack, (EntityPlayer) entity, manaToRequest, true) : false; + boolean manaRequested = entity instanceof EntityPlayer ? ManaItemHandler.requestManaExactForTool(stack, (EntityPlayer) entity, manaToRequest, true) : false; if(!manaRequested) stack.damageItem(dmg, entity); diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelAxe.java b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelAxe.java index 2ad2f4d3f..213143f98 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelAxe.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelAxe.java @@ -100,7 +100,7 @@ public class ItemManasteelAxe extends ItemAxe implements IManaUsingItem { @Override public void onUpdate(ItemStack stack, World world, Entity player, int par4, boolean par5) { - if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) + if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExactForTool(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) stack.setItemDamage(stack.getItemDamage() - 1); } diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelPick.java b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelPick.java index fc63f00cc..b4496f2bf 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelPick.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelPick.java @@ -103,7 +103,7 @@ public class ItemManasteelPick extends ItemPickaxe implements IManaUsingItem { @Override public void onUpdate(ItemStack stack, World world, Entity player, int par4, boolean par5) { - if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) + if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExactForTool(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) stack.setItemDamage(stack.getItemDamage() - 1); } diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShears.java b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShears.java index e7754bcbf..17a2c650e 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShears.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShears.java @@ -129,7 +129,7 @@ public class ItemManasteelShears extends ItemShears implements IManaUsingItem { @Override public void onUpdate(ItemStack stack, World world, Entity player, int par4, boolean par5) { - if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) + if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExactForTool(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) stack.setItemDamage(stack.getItemDamage() - 1); } diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShovel.java b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShovel.java index d44db37d2..694183a02 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShovel.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelShovel.java @@ -116,7 +116,7 @@ public class ItemManasteelShovel extends ItemSpade implements IManaUsingItem { @Override public void onUpdate(ItemStack stack, World world, Entity player, int par4, boolean par5) { - if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) + if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExactForTool(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) stack.setItemDamage(stack.getItemDamage() - 1); } diff --git a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelSword.java b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelSword.java index 14a379384..c240bedac 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelSword.java +++ b/src/main/java/vazkii/botania/common/item/equipment/tool/manasteel/ItemManasteelSword.java @@ -94,7 +94,7 @@ public class ItemManasteelSword extends ItemSword implements IManaUsingItem { @Override public void onUpdate(ItemStack stack, World world, Entity player, int par4, boolean par5) { - if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExact(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) + if(!world.isRemote && player instanceof EntityPlayer && stack.getItemDamage() > 0 && ManaItemHandler.requestManaExactForTool(stack, (EntityPlayer) player, MANA_PER_DAMAGE * 2, true)) stack.setItemDamage(stack.getItemDamage() - 1); }