package crazypants.enderio.item.darksteel;
import java.util.Iterator;
import java.util.List;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.common.ISpecialArmor;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.EnumHelper;
import thaumcraft.api.IGoggles;
import thaumcraft.api.IVisDiscountGear;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.nodes.IRevealer;
import cofh.api.energy.IEnergyContainerItem;
import com.enderio.core.api.client.gui.IAdvancedTooltipProvider;
import com.enderio.core.common.util.ItemUtil;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Optional.Interface;
import cpw.mods.fml.common.Optional.InterfaceList;
import cpw.mods.fml.common.Optional.Method;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.EnderIO;
import crazypants.enderio.EnderIOTab;
import crazypants.enderio.config.Config;
import crazypants.enderio.item.darksteel.upgrade.ApiaristArmorUpgrade;
import crazypants.enderio.item.darksteel.upgrade.EnergyUpgrade;
import crazypants.enderio.item.darksteel.upgrade.IDarkSteelUpgrade;
import crazypants.enderio.item.darksteel.upgrade.NaturalistEyeUpgrade;
import crazypants.enderio.thaumcraft.GogglesOfRevealingUpgrade;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.core.IArmorNaturalist;
@InterfaceList({
@Interface(iface = "thaumcraft.api.IGoggles", modid = "Thaumcraft"),
@Interface(iface = "thaumcraft.api.IVisDiscountGear", modid = "Thaumcraft"),
@Interface(iface = "thaumcraft.api.nodes.IRevealer", modid = "Thaumcraft"),
@Interface(iface = "forestry.api.apiculture.IArmorApiarist", modid = "Forestry"),
@Interface(iface = "forestry.api.core.IArmorNaturalist", modid = "Forestry")
})
public class ItemDarkSteelArmor extends ItemArmor implements IEnergyContainerItem, ISpecialArmor, IAdvancedTooltipProvider, IDarkSteelItem, IGoggles,
IRevealer, IVisDiscountGear, IArmorApiarist, IArmorNaturalist {
public static final ArmorMaterial MATERIAL = EnumHelper.addArmorMaterial("darkSteel", 35, new int[] { 2, 6, 5, 2 }, 15);
public static final int[] CAPACITY = new int[] { Config.darkSteelPowerStorageBase, Config.darkSteelPowerStorageBase, Config.darkSteelPowerStorageBase * 2,
Config.darkSteelPowerStorageBase * 2 };
public static final int[] RF_PER_DAMAGE_POINT = new int[] { Config.darkSteelPowerStorageBase, Config.darkSteelPowerStorageBase,
Config.darkSteelPowerStorageBase * 2,
Config.darkSteelPowerStorageBase * 2 };
public static final String[] NAMES = new String[] { "helmet", "chestplate", "leggings", "boots" };
boolean gogglesUgradeActive = true;
static {
FMLCommonHandler.instance().bus().register(DarkSteelController.instance);
MinecraftForge.EVENT_BUS.register(DarkSteelController.instance);
MinecraftForge.EVENT_BUS.register(DarkSteelRecipeManager.instance);
}
public static ItemDarkSteelArmor forArmorType(int armorType) {
switch (armorType) {
case 0:
return DarkSteelItems.itemDarkSteelHelmet;
case 1:
return DarkSteelItems.itemDarkSteelChestplate;
case 2:
return DarkSteelItems.itemDarkSteelLeggings;
case 3:
return DarkSteelItems.itemDarkSteelBoots;
}
return null;
}
public static int getPoweredProtectionIncrease(int armorType) {
switch (armorType) {
case 0:
return 1;
case 1:
return 2;
case 2:
case 3:
return 1;
}
return 0;
}
public static ItemDarkSteelArmor create(int armorType) {
ItemDarkSteelArmor res = new ItemDarkSteelArmor(armorType);
res.init();
return res;
}
private final int powerPerDamagePoint;
protected ItemDarkSteelArmor(int armorType) {
super(MATERIAL, 0, armorType);
setCreativeTab(EnderIOTab.tabEnderIO);
String str = "darkSteel_" + NAMES[armorType];
setUnlocalizedName(str);
setTextureName(EnderIO.DOMAIN+ ":" + str);
powerPerDamagePoint = Config.darkSteelPowerStorageBase / MATERIAL.getDurability(armorType);
}
protected void init() {
GameRegistry.registerItem(this, getUnlocalizedName());
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List par3List) {
ItemStack is = new ItemStack(this);
par3List.add(is);
is = new ItemStack(this);
EnergyUpgrade.EMPOWERED_FOUR.writeToItem(is);
EnergyUpgrade.setPowerFull(is);
Iterator<IDarkSteelUpgrade> iter = DarkSteelRecipeManager.instance.recipeIterator();
while (iter.hasNext()) {
IDarkSteelUpgrade upgrade = iter.next();
if (!(upgrade instanceof EnergyUpgrade) && upgrade.canAddToItem(is)) {
upgrade.writeToItem(is);
}
}
par3List.add(is);
}
@Override
public int getIngotsRequiredForFullRepair() {
switch (armorType) {
case 0:
return 5;//EnderIO.itemDarkSteelHelmet;
case 1:
return 8;//EnderIO.itemDarkSteelChestplate;
case 2:
return 7;//EnderIO.itemDarkSteelLeggings;
case 3:
return 4;//EnderIO.itemDarkSteelBoots;
}
return 4;
}
@Override
public void addCommonEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) {
DarkSteelRecipeManager.instance.addCommonTooltipEntries(itemstack, entityplayer, list, flag);
}
@Override
public void addBasicEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) {
DarkSteelRecipeManager.instance.addBasicTooltipEntries(itemstack, entityplayer, list, flag);
}
@Override
public void addDetailedEntries(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) {
if(!Config.addDurabilityTootip) {
list.add(ItemUtil.getDurabilityString(itemstack));
}
String str = EnergyUpgrade.getStoredEnergyString(itemstack);
if(str != null) {
list.add(str);
}
if(EnergyUpgrade.itemHasAnyPowerUpgrade(itemstack)) {
list.add(EnumChatFormatting.WHITE + EnderIO.lang.localize("item.darkSteel_armor.tooltip.line1"));
list.add(EnumChatFormatting.WHITE + EnderIO.lang.localize("item.darkSteel_armor.tooltip.line2"));
if(itemstack.getItem() == DarkSteelItems.itemDarkSteelBoots) {
list.add(EnumChatFormatting.WHITE + EnderIO.lang.localize("item.darkSteel_boots.tooltip.line1"));
list.add(EnumChatFormatting.WHITE + EnderIO.lang.localize("item.darkSteel_boots.tooltip.line2"));
}
}
DarkSteelRecipeManager.instance.addAdvancedTooltipEntries(itemstack, entityplayer, list, flag);
}
@Override
public boolean isDamaged(ItemStack stack) {
return false;
}
@Override
public String getArmorTexture(ItemStack itemStack, Entity entity, int slot, String layer) {
if(armorType == 2) {
return "enderio:textures/models/armor/darkSteel_layer_2.png";
}
return "enderio:textures/models/armor/darkSteel_layer_1.png";
}
public ItemStack createItemStack() {
return new ItemStack(this);
}
@Override
public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) {
if(source.isUnblockable()) {
return new ArmorProperties(0, 0, armor.getMaxDamage() + 1 - armor.getItemDamage());
}
double damageRatio = damageReduceAmount + (getEnergyStored(armor) > 0 ? getPoweredProtectionIncrease(3 - slot) : 0);
damageRatio /= 25D;
ArmorProperties ap = new ArmorProperties(0, damageRatio, armor.getMaxDamage() + 1 - armor.getItemDamage());
return ap;
}
@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
ItemDarkSteelArmor arm = forArmorType(3 - slot);
int powerBonus = getEnergyStored(armor) > 0 ? getPoweredProtectionIncrease(3 - slot) : 0;
return arm.getArmorMaterial().getDamageReductionAmount(3 - slot) + powerBonus;
}
@Override
public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
EnergyUpgrade eu = EnergyUpgrade.loadFromItem(stack);
if(eu != null && eu.isAbsorbDamageWithPower(stack) && eu.getEnergy() > 0) {
eu.extractEnergy(damage * powerPerDamagePoint, false);
} else {
stack.damageItem(damage, entity);
}
if(eu != null) {
eu.writeToItem(stack);
}
}
@Override
public boolean getIsRepairable(ItemStack i1, ItemStack i2) {
return false;
}
@Override
public int receiveEnergy(ItemStack container, int maxReceive, boolean simulate) {
return EnergyUpgrade.receiveEnergy(container, maxReceive, simulate);
}
@Override
public int extractEnergy(ItemStack container, int maxExtract, boolean simulate) {
return EnergyUpgrade.extractEnergy(container, maxExtract, simulate);
}
@Override
public int getEnergyStored(ItemStack container) {
return EnergyUpgrade.getEnergyStored(container);
}
@Override
public int getMaxEnergyStored(ItemStack container) {
return EnergyUpgrade.getMaxEnergyStored(container);
}
//Thaumcraft
@Override
@Method(modid = "Thaumcraft")
public boolean showNodes(ItemStack itemstack, EntityLivingBase player) {
if(itemstack == null || itemstack.getItem() == null || !gogglesUgradeActive) {
return false;
}
return GogglesOfRevealingUpgrade.loadFromItem(itemstack) != null;
}
@Override
@Method(modid = "Thaumcraft")
public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player) {
if(itemstack == null || itemstack.getItem() == null || !gogglesUgradeActive) {
return false;
}
return GogglesOfRevealingUpgrade.loadFromItem(itemstack) != null;
}
@Override
@Method(modid = "Thaumcraft")
public int getVisDiscount(ItemStack stack, EntityPlayer player, Aspect aspect) {
if(stack == null || stack.getItem() != DarkSteelItems.itemDarkSteelHelmet) {
return 0;
}
return GogglesOfRevealingUpgrade.isUpgradeEquipped(player) ? 5 : 0;
}
public boolean isGogglesUgradeActive() {
return gogglesUgradeActive;
}
public void setGogglesUgradeActive(boolean gogglesUgradeActive) {
this.gogglesUgradeActive = gogglesUgradeActive;
}
// Forestry
@Override
@Method(modid = "Forestry")
public boolean protectPlayer(EntityPlayer player, ItemStack armor, String cause, boolean doProtect) {
return ApiaristArmorUpgrade.loadFromItem(armor) != null;
}
@Override
@Method(modid = "Forestry")
public boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee) {
if(armor == null || armor.getItem() != DarkSteelItems.itemDarkSteelHelmet) {
return false;
}
return NaturalistEyeUpgrade.isUpgradeEquipped(player);
}
}