package pneumaticCraft.common.item; import java.util.List; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.client.renderer.texture.IIconRegister; 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.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import pneumaticCraft.PneumaticCraft; import pneumaticCraft.api.item.IPressurizable; import pneumaticCraft.client.render.item.RenderItemPneumaticHelmet; import pneumaticCraft.client.render.pneumaticArmor.RenderCoordWireframe; import pneumaticCraft.common.DateEventHandler; import pneumaticCraft.common.NBTUtil; import pneumaticCraft.common.config.Config; import pneumaticCraft.common.util.PneumaticCraftUtils; import pneumaticCraft.lib.Log; import pneumaticCraft.lib.ModIds; import pneumaticCraft.lib.PneumaticValues; import pneumaticCraft.lib.Textures; import pneumaticCraft.proxy.CommonProxy.EnumGuiId; import thaumcraft.api.IGoggles; import thaumcraft.api.IRepairable; import thaumcraft.api.IVisDiscountGear; import thaumcraft.api.aspects.Aspect; import thaumcraft.api.nodes.IRevealer; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.Optional.Interface; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @Optional.InterfaceList({@Interface(iface = "thaumcraft.api.IRepairable", modid = ModIds.THAUMCRAFT), @Interface(iface = "thaumcraft.api.IGoggles", modid = ModIds.THAUMCRAFT), @Interface(iface = "thaumcraft.api.IVisDiscountGear", modid = ModIds.THAUMCRAFT), @Interface(iface = "thaumcraft.api.nodes.IRevealer", modid = ModIds.THAUMCRAFT)}) public class ItemPneumaticArmor extends ItemArmor implements IPressurizable, IChargingStationGUIHolderItem, IRepairable, IRevealer, IGoggles, IVisDiscountGear{ private final String textureLocation; private final int volume; public ItemPneumaticArmor(String textureLocation, ItemArmor.ArmorMaterial par2EnumArmorMaterial, int par3, int par4, int volume, int maxAir){ super(par2EnumArmorMaterial, par3, par4); this.textureLocation = textureLocation; this.volume = volume; setMaxDamage(maxAir); setCreativeTab(PneumaticCraft.tabPneumaticCraft); } @Override public void registerIcons(IIconRegister register){ itemIcon = register.registerIcon(Textures.ICON_LOCATION + textureLocation); } @Override public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type){ return Textures.ARMOR_PNEUMATIC + "_1.png"; } @Override @SideOnly(Side.CLIENT) public void getSubItems(Item par1, CreativeTabs tab, List subItems){ subItems.add(new ItemStack(this)); ItemStack chargedStack = new ItemStack(this); addAir(chargedStack, PneumaticValues.PNEUMATIC_HELMET_VOLUME * 10); subItems.add(chargedStack); } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack iStack, EntityPlayer player, List textList, boolean par4){ float pressure = getPressure(iStack); textList.add((pressure < 0.5F ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GREEN) + "Pressure: " + Math.round(pressure * 10D) / 10D + " bar"); ItemStack[] inventoryStacks = getUpgradeStacks(iStack); boolean isArmorEmpty = true; for(ItemStack stack : inventoryStacks) { if(stack != null) { isArmorEmpty = false; break; } } if(isArmorEmpty) { textList.add("Insert in Charging Station to install upgrades"); } else { textList.add("Upgrades installed:"); PneumaticCraftUtils.sortCombineItemStacksAndToString(textList, inventoryStacks); ItemStack searchedStack = getSearchedStack(iStack); if(searchedStack != null) { for(int i = 0; i < textList.size(); i++) { if(((String)textList.get(i)).contains("Item Search")) { textList.set(i, textList.get(i) + " (searching " + searchedStack.getDisplayName() + ")"); break; } } } RenderCoordWireframe coordHandler = getCoordTrackLocation(iStack); if(coordHandler != null) { for(int i = 0; i < textList.size(); i++) { if(((String)textList.get(i)).contains("Coordinate Tracker")) { textList.set(i, textList.get(i) + " (tracking " + coordHandler.x + ", " + coordHandler.y + ", " + coordHandler.z + " in " + coordHandler.worldObj.provider.getDimensionName() + ")"); break; } } } } ItemPneumatic.addTooltip(iStack, player, textList); } /** * Retrieves the upgrades currently installed on the given armor stack. */ public static ItemStack[] getUpgradeStacks(ItemStack iStack){ NBTTagCompound tag = NBTUtil.getCompoundTag(iStack, "UpgradeInventory"); ItemStack[] inventoryStacks = new ItemStack[9]; if(tag != null) { NBTTagList itemList = tag.getTagList("Items", 10); if(itemList != null) { for(int i = 0; i < itemList.tagCount(); i++) { NBTTagCompound slotEntry = itemList.getCompoundTagAt(i); int j = slotEntry.getByte("Slot"); if(j >= 0 && j < 9) { inventoryStacks[j] = ItemStack.loadItemStackFromNBT(slotEntry); } } } } return inventoryStacks; } public static int getUpgrades(int upgradeDamage, ItemStack iStack){ int upgrades = 0; ItemStack[] stacks = getUpgradeStacks(iStack); for(ItemStack stack : stacks) { if(stack != null && stack.getItem() == Itemss.machineUpgrade && stack.getItemDamage() == upgradeDamage) { upgrades += stack.stackSize; } } return upgrades; } @SideOnly(Side.CLIENT) public static ItemStack getSearchedStack(){ return getSearchedStack(PneumaticCraft.proxy.getPlayer().getCurrentArmor(3)); } public static ItemStack getSearchedStack(ItemStack helmetStack){ if(helmetStack == null || !NBTUtil.hasTag(helmetStack, "SearchStack")) return null; NBTTagCompound tag = NBTUtil.getCompoundTag(helmetStack, "SearchStack"); if(tag.getInteger("itemID") == -1) return null; return new ItemStack(Item.getItemById(tag.getInteger("itemID")), 1, tag.getInteger("itemDamage")); } @SideOnly(Side.CLIENT) public static RenderCoordWireframe getCoordTrackLocation(ItemStack helmetStack){ if(helmetStack == null || !NBTUtil.hasTag(helmetStack, "CoordTracker")) return null; NBTTagCompound tag = NBTUtil.getCompoundTag(helmetStack, "CoordTracker"); if(tag.getInteger("y") == -1 || FMLClientHandler.instance().getClient().theWorld.provider.dimensionId != tag.getInteger("dimID")) return null; return new RenderCoordWireframe(FMLClientHandler.instance().getClient().theWorld, tag.getInteger("x"), tag.getInteger("y"), tag.getInteger("z")); } @SideOnly(Side.CLIENT) public static String getEntityFilter(ItemStack helmetStack){ if(helmetStack == null || !NBTUtil.hasTag(helmetStack, "entityFilter")) return ""; return NBTUtil.getString(helmetStack, "entityFilter"); } public static void setEntityFilter(ItemStack helmetStack, String filter){ if(helmetStack != null) { NBTUtil.setString(helmetStack, "entityFilter", filter); } } @Override public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack){ return false; } @Override public float getPressure(ItemStack iStack){ int volume = ItemPneumaticArmor.getUpgrades(ItemMachineUpgrade.UPGRADE_VOLUME_DAMAGE, iStack) * PneumaticValues.VOLUME_VOLUME_UPGRADE + PneumaticValues.PNEUMATIC_HELMET_VOLUME; int oldVolume = NBTUtil.getInteger(iStack, "volume"); if(volume < oldVolume) { int currentAir = NBTUtil.getInteger(iStack, "air"); currentAir = currentAir * volume / oldVolume; NBTUtil.setInteger(iStack, "air", currentAir); } NBTUtil.setInteger(iStack, "volume", volume); return (float)NBTUtil.getInteger(iStack, "air") / volume; } public boolean hasSufficientPressure(ItemStack iStack){ return getPressure(iStack) > 0F; } @Override public float maxPressure(ItemStack iStack){ return 10F; } @Override public void addAir(ItemStack iStack, int amount){ int oldAir = NBTUtil.getInteger(iStack, "air"); NBTUtil.setInteger(iStack, "air", Math.max(oldAir + amount, 0)); } @Override public EnumGuiId getGuiID(){ return EnumGuiId.PNEUMATIC_HELMET; } /** * Override this method to have an item handle its own armor rendering. * * @param entityLiving The entity wearing the armor * @param itemStack The itemStack to render the model of * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet * * @return A ModelBiped to render instead of the default */ @Override @SideOnly(Side.CLIENT) public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot){ if(armorSlot == 0 && (Config.useHelmetModel || DateEventHandler.isIronManEvent())) { RenderItemPneumaticHelmet.INSTANCE.render(entityLiving); RenderPlayer render = (RenderPlayer)RenderManager.instance.entityRenderMap.get(EntityPlayer.class); ModelBiped model = armorSlot == 2 ? render.modelArmor : render.modelArmorChestplate; model.bipedHead.showModel = false; return model; } return null; } private boolean hasThaumcraftUpgradeAndPressure(ItemStack stack){ return hasSufficientPressure(stack) && getUpgrades(ItemMachineUpgrade.UPGRADE_THAUMCRAFT, stack) > 0; } @Override @Optional.Method(modid = ModIds.THAUMCRAFT) public int getVisDiscount(ItemStack stack, EntityPlayer player, Aspect aspect){ return hasThaumcraftUpgradeAndPressure(stack) ? 5 : 0; } @Override public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player){ return hasThaumcraftUpgradeAndPressure(itemstack); } @Override public boolean showNodes(ItemStack itemstack, EntityLivingBase player){ return hasThaumcraftUpgradeAndPressure(itemstack); } /** * Called to tick armor in the armor slot. Override to do something * * @param world * @param player * @param itemStack */ @Override public void onArmorTick(World world, EntityPlayer player, ItemStack iStack){ super.onArmorTick(world, player, iStack); if(!world.isRemote && NBTUtil.hasTag(iStack, "Inventory") && iStack.getTagCompound().getTag("Inventory") instanceof NBTTagCompound) { Log.info("Converting 'Inventory' tag to 'UpgradeInventory' in Pneumatic items"); iStack.getTagCompound().setTag("UpgradeInventory", iStack.getTagCompound().getTag("Inventory")); iStack.getTagCompound().removeTag("Inventory"); } } }