package chbachman.armour.upgrade;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
import chbachman.api.configurability.Configurable;
import chbachman.api.configurability.ConfigurableField;
import chbachman.api.item.IModularItem;
import chbachman.api.util.ArmourSlot;
import chbachman.armour.upgrade.upgradeList.UpgradeBasic;
import chbachman.armour.util.EnergyUtil;
public abstract class UpgradeProtective extends UpgradeBasic {
@Configurable
public ConfigurableField protection = new ConfigurableField(this.getBaseName() + "Protection", "upgrade.chbachman.protection.protection", 50);
final int maxProtection;
public UpgradeProtective(String name, int protection) {
super(name);
this.maxProtection = protection;
}
@Override
public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
IModularItem item = (IModularItem) armor.getItem();
if (EnergyUtil.isEmpty(armor)) {
return new ArmorProperties(0, 0, 0);
}
if (this.shouldDefend(player, armor, source, damage, slot)) {
item.damageArmour(armor, (int) (this.getEnergyPerDamage(armor) * damage));
float temp = maxProtection * protection.get(armor).getPercentage() * (limitDamage(player, armor, source, damage, slot) / 100F);
return new ArmorProperties(0, temp / 100, Integer.MAX_VALUE);
}
return new ArmorProperties(0, 0, 0);
}
@Override
public boolean isCompatible(IModularItem item, ItemStack stack, int armorType) {
return item.isArmour();
}
@Override
public int getArmourDisplay(EntityPlayer player, ItemStack stack, ArmourSlot slot) {
return (int) (protection.get(stack).getAmount() / 25);
}
/**
* Limits the damage protected by this piece of armour to the value
* returned. Default implementation just breaks up the damage protection by
* slot.
*
* @param player
* @param armor
* @param source
* @param damage
* @param slot
* @return
*/
public int limitDamage(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
switch (slot) {
case HELMET:
return 15;
case CHESTPLATE:
return 40;
case LEGS:
return 30;
case BOOTS:
return 15;
default:
return 0;
}
}
/**
* Return whether the upgrade should defend against the current situation.
*
* @param player
* @param armor
* @param source
* @param damage
* @param slot
* @return
*/
public abstract boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot);
/**
* Return the energy drained per damage.
*
* @param stack
* @return
*/
public abstract int getEnergyPerDamage(ItemStack stack);
// Simple Subclasses Follow
public static class UpgradeProjectileProtection extends UpgradeProtective {
public UpgradeProjectileProtection() {
super("projectileProtector", 75);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source.isProjectile();
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeFire extends UpgradeProtective {
public UpgradeFire() {
super("fireProtector", 75);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source.isFireDamage();
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeExplosion extends UpgradeProtective {
public UpgradeExplosion() {
super("explosionProtector", 75);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source.isExplosion();
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeUnblockable extends UpgradeProtective {
public UpgradeUnblockable() {
super("unblockableProtector", 10);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source.isUnblockable();
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeMagic extends UpgradeProtective {
public UpgradeMagic() {
super("magicProtector", 20);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source.isMagicDamage();
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeWither extends UpgradeProtective {
public UpgradeWither() {
super("witherProtector", 20);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source == DamageSource.wither;
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeLava extends UpgradeProtective {
public UpgradeLava() {
super("lavaProtector", 75);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return source == DamageSource.lava;
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
public static class UpgradeGeneralProtection extends UpgradeProtective {
public UpgradeGeneralProtection() {
super("generalProtection", 80);
}
@Override
public boolean shouldDefend(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, ArmourSlot slot) {
return true;
}
@Override
public int getEnergyPerDamage(ItemStack stack) {
return 100;
}
}
}