package zmaster587.advancedRocketry.armor;
import java.util.LinkedList;
import java.util.List;
import cpw.mods.fml.common.ObfuscationReflectionHelper;
import zmaster587.advancedRocketry.achievements.ARAchivements;
import zmaster587.advancedRocketry.api.AdvancedRocketryItems;
import zmaster587.advancedRocketry.api.Configuration;
import zmaster587.advancedRocketry.api.IAtmosphere;
import zmaster587.advancedRocketry.api.armor.IFillableArmor;
import zmaster587.advancedRocketry.api.armor.IProtectiveArmor;
import zmaster587.advancedRocketry.atmosphere.AtmosphereType;
import zmaster587.advancedRocketry.client.render.armor.RenderJetPack;
import zmaster587.libVulpes.api.IArmorComponent;
import zmaster587.libVulpes.api.IModularArmor;
import zmaster587.libVulpes.util.EmbeddedInventory;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.ISpecialArmor;
import net.minecraftforge.common.util.Constants.NBT;
/**
* Space Armor
* Any class that extends this will gain the ability to store oxygen and will protect players from the vacuum atmosphere type
*
*/
public class ItemSpaceArmor extends ItemArmor implements ISpecialArmor, IFillableArmor, IProtectiveArmor, IModularArmor {
private final static String componentNBTName = "componentName";
public ItemSpaceArmor(ArmorMaterial material, int component) {
super(material, 0, component);
}
@Override
public void addInformation(ItemStack stack, EntityPlayer p_77624_2_,
List list, boolean p_77624_4_) {
super.addInformation(stack, p_77624_2_, list, p_77624_4_);
list.add("Modules:");
for(ItemStack componentStack : getComponents(stack)) {
list.add(EnumChatFormatting.DARK_GRAY + componentStack.getDisplayName());
}
}
@Override
public ArmorProperties getProperties(EntityLivingBase player,
ItemStack armor, DamageSource source, double damage, int slot) {
if(!source.isUnblockable())
return new ArmorProperties(0, 5, 1);
return new ArmorProperties(0, 0, 0);
}
private EmbeddedInventory loadEmbeddedInventory(ItemStack stack) {
if(stack.hasTagCompound()) {
EmbeddedInventory inv = new EmbeddedInventory(4);
inv.readFromNBT(stack.getTagCompound());
return inv;
}
return new EmbeddedInventory(4);
}
@Override
public ModelBiped getArmorModel(EntityLivingBase entityLiving,
ItemStack itemStack, int armorSlot) {
//if(armorSlot == 1)
//return new RenderJetPack();
return super.getArmorModel(entityLiving, itemStack, armorSlot);
}
private void saveEmbeddedInventory(ItemStack stack, EmbeddedInventory inv) {
if(stack.hasTagCompound()) {
inv.writeToNBT(stack.getTagCompound());
}
else {
NBTTagCompound nbt = new NBTTagCompound();
inv.writeToNBT(nbt);
stack.setTagCompound(nbt);
}
}
@Override
public void onArmorTick(World world, EntityPlayer player,
ItemStack armor) {
super.onArmorTick(world, player, armor);
if(armor.hasTagCompound()) {
//Some upgrades modify player capabilities
EmbeddedInventory inv = loadEmbeddedInventory(armor);
for(int i = 0; i < inv.getSizeInventory(); i++ ) {
ItemStack stack = inv.getStackInSlot(i);
if(stack != null) {
IArmorComponent component = (IArmorComponent)stack.getItem();
component.onTick(world, player, armor, inv, stack);
}
}
saveEmbeddedInventory(armor, inv);
}
ItemStack feet = player.getCurrentArmor(0);
ItemStack leg = player.getCurrentArmor(1);
ItemStack chest = player.getCurrentArmor(2);
ItemStack helm = player.getCurrentArmor(3);
if(feet != null && feet.getItem() instanceof ItemSpaceArmor && leg != null && leg.getItem() instanceof ItemSpaceArmor && chest != null && chest.getItem() instanceof ItemSpaceArmor && helm != null && helm.getItem() instanceof ItemSpaceArmor)
player.triggerAchievement(ARAchivements.suitedUp);
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot,
String type) {
if(stack.getItem() == AdvancedRocketryItems.itemSpaceSuit_Leggings)
return "advancedRocketry:textures/armor/spaceSuit_layer1.png";//super.getArmorTexture(stack, entity, slot, type);
return "advancedRocketry:textures/armor/spaceSuit_layer2.png";
}
@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
return 1;
}
@Override
public void damageArmor(EntityLivingBase entity, ItemStack armor,
DamageSource source, int damage, int slot) {
// TODO Handle armor damage
if(armor.hasTagCompound()) {
EmbeddedInventory inv = loadEmbeddedInventory(armor);
for(int i = 0; i < inv.getSizeInventory(); i++ ) {
ItemStack stack = inv.getStackInSlot(i);
if(stack != null) {
IArmorComponent component = (IArmorComponent)stack.getItem();
component.onArmorDamaged(entity, armor, stack, source, damage);
}
}
saveEmbeddedInventory(armor, inv);
}
}
@Override
public void addArmorComponent(World world, ItemStack armor, ItemStack component, int slot) {
EmbeddedInventory inv = loadEmbeddedInventory(armor);
if(((IArmorComponent)component.getItem()).onComponentAdded(world, armor)) {
inv.setInventorySlotContents(slot, component);
saveEmbeddedInventory(armor, inv);
}
}
public ItemStack removeComponent(World world, ItemStack armor, int index) {
NBTTagCompound nbt;
NBTTagList componentList;
if(armor.hasTagCompound()) {
nbt = armor.getTagCompound();
componentList = nbt.getTagList(componentNBTName, NBT.TAG_COMPOUND);
}
else {
return null;
}
EmbeddedInventory inv = loadEmbeddedInventory(armor);
ItemStack stack = inv.getStackInSlot(index);
inv.setInventorySlotContents(index, null);
if(stack != null) {
IArmorComponent component = (IArmorComponent) stack.getItem();
component.onComponentRemoved(world, armor);
saveEmbeddedInventory(armor, inv);
}
return stack;
}
public List<ItemStack> getComponents(ItemStack armor) {
List<ItemStack> list = new LinkedList<ItemStack>();
NBTTagCompound nbt;
NBTTagList componentList;
if(armor.hasTagCompound()) {
EmbeddedInventory inv = loadEmbeddedInventory(armor);
for(int i = 0; i < inv.getSizeInventory(); i++) {
if(inv.getStackInSlot(i) != null)
list.add(inv.getStackInSlot(i));
}
}
return list;
}
/**
* gets the amount of air remaining in the suit.
* @param stack stack from which to get an amount of air
* @return the amount of air in the stack
*/
@Override
public int getAirRemaining(ItemStack stack) {
if(stack.hasTagCompound()) {
return stack.getTagCompound().getInteger("air");
}
else {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("air", 0);
stack.setTagCompound(nbt);
return getMaxAir();
}
}
/**
* Sets the amount of air remaining in the suit (WARNING: DOES NOT BOUNDS CHECK!)
* @param stack the stack to operate on
* @param amt amount of air to set the suit to
*/
@Override
public void setAirRemaining(ItemStack stack, int amt) {
NBTTagCompound nbt;
if(stack.hasTagCompound()) {
nbt = stack.getTagCompound();
}
else {
nbt = new NBTTagCompound();
}
nbt.setInteger("air", amt);
stack.setTagCompound(nbt);
}
/**
* Decrements air in the suit by amt
* @param stack the item stack to operate on
* @param amt amount of air by which to decrement
* @return The amount of air extracted from the suit
*/
@Override
public int decrementAir(ItemStack stack, int amt) {
NBTTagCompound nbt;
if(stack.hasTagCompound()) {
nbt = stack.getTagCompound();
}
else {
nbt = new NBTTagCompound();
}
int prevAmt = nbt.getInteger("air");
int newAmt = Math.max(prevAmt - amt,0);
nbt.setInteger("air", newAmt);
stack.setTagCompound(nbt);
return prevAmt - newAmt;
}
/**
* Increments air in the suit by amt
* @param stack the item stack to operate on
* @param amt amount of air by which to decrement
* @return The amount of air inserted into the suit
*/
@Override
public int increment(ItemStack stack, int amt) {
NBTTagCompound nbt;
if(stack.hasTagCompound()) {
nbt = stack.getTagCompound();
}
else {
nbt = new NBTTagCompound();
}
int prevAmt = nbt.getInteger("air");
int newAmt = Math.min(prevAmt + amt, getMaxAir());
nbt.setInteger("air", newAmt);
stack.setTagCompound(nbt);
return newAmt - prevAmt;
}
/**
* @return the maximum amount of air allowed in this suit
*/
@Override
public int getMaxAir() {
return Configuration.spaceSuitOxygenTime*1200; //30 minutes;
}
@Override
public boolean protectsFromSubstance(IAtmosphere atmosphere, ItemStack stack, boolean commitProtection) {
return (atmosphere == AtmosphereType.VACUUM || atmosphere == AtmosphereType.LOWOXYGEN) && (this != AdvancedRocketryItems.itemSpaceSuit_Chest || (this == AdvancedRocketryItems.itemSpaceSuit_Chest &&
(commitProtection && ((IFillableArmor)AdvancedRocketryItems.itemSpaceSuit_Chest).decrementAir(stack, 1) > 0)) || (!commitProtection && ((IFillableArmor)AdvancedRocketryItems.itemSpaceSuit_Chest).getAirRemaining(stack) > 0));
}
@Override
public int getNumSlots(ItemStack stack) {
return loadEmbeddedInventory(stack).getSizeInventory();
}
@Override
public ItemStack getComponentInSlot(ItemStack stack, int slot) {
return loadEmbeddedInventory(stack).getStackInSlot(slot);
}
@Override
public IInventory loadModuleInventory(ItemStack stack) {
return loadEmbeddedInventory(stack);
}
@Override
public void saveModuleInventory(ItemStack stack, IInventory inv) {
saveEmbeddedInventory(stack, (EmbeddedInventory)inv);
}
}