GT5-Unofficial/main/java/gregtech/api/items/GT_EnergyArmor_Item.java
2015-04-23 18:14:22 +02:00

328 lines
13 KiB
Java

package gregtech.api.items;
import static gregtech.api.enums.GT_Values.RES_PATH_ITEM;
import gregtech.api.GregTech_API;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Utility;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
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.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.ISpecialArmor;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingFallEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class GT_EnergyArmor_Item extends ItemArmor implements ISpecialArmor {
public int mCharge, mTransfer, mTier, mDamageEnergyCost, mSpecials;
public boolean mChargeProvider;
public double mArmorAbsorbtionPercentage;
public static Map jumpChargeMap = new HashMap();
public GT_EnergyArmor_Item(int aID, String aUnlocalized, String aEnglish, int aCharge, int aTransfer, int aTier, int aDamageEnergyCost, int aSpecials, double aArmorAbsorbtionPercentage, boolean aChargeProvider, int aType, int aArmorIndex) {
super(ArmorMaterial.DIAMOND, aArmorIndex, aType);
setMaxStackSize(1);
setMaxDamage(100);
setNoRepair();
setUnlocalizedName(aUnlocalized);
GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".name", aEnglish);
mCharge = Math.max(1, aCharge);
mTransfer = Math.max(1, aTransfer);
mTier = Math.max(1, aTier);
mSpecials = aSpecials;
mChargeProvider = aChargeProvider;
mDamageEnergyCost = Math.max(0, aDamageEnergyCost);
mArmorAbsorbtionPercentage = aArmorAbsorbtionPercentage;
setCreativeTab(GregTech_API.TAB_GREGTECH);
MinecraftForge.EVENT_BUS.register(this);
}
@Override
public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
ItemStack tStack = aPlayer.inventory.armorInventory[3-armorType];
if (tStack != null) {
for (int i = 0; i < 9; i++) {
if (aPlayer.inventory.mainInventory[i] == aStack) {
aPlayer.inventory.armorInventory[3-armorType] = aPlayer.inventory.mainInventory[i];
aPlayer.inventory.mainInventory[i] = tStack;
return tStack;
}
}
}
return super.onItemRightClick(aStack, aWorld, aPlayer);
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister aIconRegister) {
this.itemIcon = aIconRegister.registerIcon(RES_PATH_ITEM + getUnlocalizedName());
}
@Override
public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
aList.add("Tier: " + mTier);
if ((mSpecials & 1) != 0) aList.add("Rebreather");
if ((mSpecials & 2) != 0) aList.add("Inertia Damper");
if ((mSpecials & 4) != 0) aList.add("Food Replicator");
if ((mSpecials & 8) != 0) aList.add("Medicine Module");
if ((mSpecials & 16) != 0) aList.add("Lamp");
if ((mSpecials & 32) != 0) aList.add("Solarpanel");
if ((mSpecials & 64) != 0) aList.add("Extinguisher Module");
if ((mSpecials & 128) != 0) aList.add("Jump Booster");
if ((mSpecials & 256) != 0) aList.add("Speed Booster");
if ((mSpecials & 512) != 0) aList.add("Invisibility Field");
if ((mSpecials & 1024) != 0) aList.add("Infinite Charge");
}
private static void setCharge(ItemStack aStack) {
NBTTagCompound tNBT = aStack.getTagCompound();
if (tNBT == null) tNBT = new NBTTagCompound();
tNBT.setInteger("charge", 1000000000);
aStack.setTagCompound(tNBT);
}
@Override
public void onArmorTick(World aWorld, EntityPlayer aPlayer, ItemStack aStack) {
if (mSpecials == 0) return;
if (!aPlayer.worldObj.isRemote && (mSpecials & 1) != 0) {
int var4 = aPlayer.getAir();
if (GT_ModHandler.canUseElectricItem(aStack, 1000) && var4 < 50) {
aPlayer.setAir(var4 + 250);
GT_ModHandler.useElectricItem(aStack, 1000, aPlayer);
}
}
if (!aPlayer.worldObj.isRemote && (mSpecials & 4) != 0) {
if (GT_ModHandler.canUseElectricItem(aStack, 50000) && aPlayer.getFoodStats().needFood()) {
aPlayer.getFoodStats().addStats(1, 0.0F);
GT_ModHandler.useElectricItem(aStack, 50000, aPlayer);
}
}
if ((mSpecials & 8) != 0) {
if (GT_ModHandler.canUseElectricItem(aStack, 10000) && aPlayer.isPotionActive(Potion.poison)) {
GT_Utility.removePotion(aPlayer, Potion.poison.id);
GT_ModHandler.useElectricItem(aStack, 10000, aPlayer);
}
if (GT_ModHandler.canUseElectricItem(aStack, 100000) && aPlayer.isPotionActive(Potion.wither)) {
GT_Utility.removePotion(aPlayer, Potion.wither.id);
GT_ModHandler.useElectricItem(aStack, 100000, aPlayer);
}
}
if ((mSpecials & 64) != 0) {
aPlayer.setFire(0);
}
if (!aPlayer.worldObj.isRemote && (mSpecials & 128) != 0) {
float var6 = jumpChargeMap.containsKey(aPlayer) ? ((Float)jumpChargeMap.get(aPlayer)).floatValue() : 1.0F;
if (GT_ModHandler.canUseElectricItem(aStack, 1000) && aPlayer.onGround && var6 < 1.0F) {
var6 = 1.0F;
GT_ModHandler.useElectricItem(aStack, 1000, aPlayer);
}
if (aPlayer.motionY >= 0.0D && var6 > 0.0F && !aPlayer.isInWater()) {
if (GT_ModHandler.getJumpKeyDown(aPlayer) && GT_ModHandler.getBoostKeyDown(aPlayer)) {
if (var6 == 1.0F) {
aPlayer.motionX *= 3.5D;
aPlayer.motionZ *= 3.5D;
}
aPlayer.motionY += (var6 * 0.3F);
var6 = (float)(var6 * 0.75D);
} else if (var6 < 1.0F) {
var6 = 0.0F;
}
}
jumpChargeMap.put(aPlayer, Float.valueOf(var6));
}
if ((mSpecials & 256) != 0) {
if (GT_ModHandler.canUseElectricItem(aStack, 100) && aPlayer.isSprinting() && (aPlayer.onGround && Math.abs(aPlayer.motionX) + Math.abs(aPlayer.motionZ) > 0.10000000149011612D || aPlayer.isInWater())) {
GT_ModHandler.useElectricItem(aStack, 100, aPlayer);
float var7 = 0.22F;
if (aPlayer.isInWater()) {
GT_ModHandler.useElectricItem(aStack, 100, aPlayer);
var7 = 0.1F;
if (aPlayer.motionY > 0) {
aPlayer.motionY += 0.10000000149011612D;
}
}
if (var7 > 0.0F) {
aPlayer.moveFlying(0.0F, 1.0F, var7);
}
}
}
if ((mSpecials & 512) != 0) {
if (GT_ModHandler.canUseElectricItem(aStack, 10000)) {
GT_ModHandler.useElectricItem(aStack, 10000, aPlayer);
aPlayer.addPotionEffect(new PotionEffect(Potion.invisibility.getId(), 25, 1, true));
}
}
if (!aPlayer.worldObj.isRemote && (mSpecials & (16|32)) != 0) {
//if (GregTech_API.sWorldTickCounter%20==0) {
ItemStack tTargetChargeItem = aStack, tTargetDechargeItem = aStack;
if (GT_ModHandler.chargeElectricItem(tTargetChargeItem, 1, Integer.MAX_VALUE, true, true) < 1) {
tTargetChargeItem = aPlayer.inventory.armorInventory[2];
}
if (GT_ModHandler.dischargeElectricItem(tTargetDechargeItem, 10, Integer.MAX_VALUE, true, true, true) < 10) {
tTargetDechargeItem = aPlayer.inventory.armorInventory[2];
}
if (tTargetChargeItem == null || !GT_ModHandler.isElectricItem(tTargetChargeItem)) {
tTargetChargeItem = null;
}
if (tTargetDechargeItem == null || !GT_ModHandler.isElectricItem(tTargetChargeItem) || !(aStack == tTargetDechargeItem || GT_ModHandler.isChargerItem(tTargetDechargeItem))) {
tTargetDechargeItem = null;
}
if (aPlayer.worldObj.isDaytime() && aPlayer.worldObj.canBlockSeeTheSky(MathHelper.floor_double(aPlayer.posX), MathHelper.floor_double(aPlayer.posY+1), MathHelper.floor_double(aPlayer.posZ))) {
if ((mSpecials & 32) != 0 && tTargetChargeItem != null) {
GT_ModHandler.chargeElectricItem(tTargetChargeItem, 20, Integer.MAX_VALUE, true, false);
}
} else {
/* TODO:
if ((mSpecials & 16) != 0 && tTargetDechargeItem != null && GT_ModHandler.canUseElectricItem(tTargetDechargeItem, 10)) {
if (aPlayer.worldObj.getBlock ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ) == Blocks.air)
aPlayer.worldObj.setBlock ((int)aPlayer.posX, (int)aPlayer.posY+1, (int)aPlayer.posZ, GregTech_API.sBlockList[3]);
GT_ModHandler.useElectricItem(tTargetDechargeItem, 10, aPlayer);
}*/
//}
}
}
}
@Override
public boolean getShareTag() {
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item aItem, CreativeTabs var2, List var3) {
ItemStack tCharged = new ItemStack(this, 1), tUncharged = new ItemStack(this, 1, getMaxDamage());
GT_ModHandler.chargeElectricItem(tCharged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
var3.add(tCharged);
var3.add(tUncharged);
}
public boolean canProvideEnergy(ItemStack aStack) {
if ((mSpecials & 1024) != 0) setCharge(aStack);
return mChargeProvider;
}
public Item getChargedItem(ItemStack aStack) {
if ((mSpecials & 1024) != 0) setCharge(aStack);
return this;
}
public Item getEmptyItem(ItemStack aStack) {
if ((mSpecials & 1024) != 0) setCharge(aStack);
return this;
}
public int getMaxCharge(ItemStack aStack) {
if ((mSpecials & 1024) != 0) setCharge(aStack);
return mCharge;
}
public int getTier(ItemStack aStack) {
if ((mSpecials & 1024) != 0) setCharge(aStack);
return mTier;
}
public int getTransferLimit(ItemStack aStack) {
if ((mSpecials & 1024) != 0) setCharge(aStack);
return mTransfer;
}
@Override
public int getItemEnchantability() {
return 0;
}
@Override
public boolean isBookEnchantable(ItemStack itemstack1, ItemStack itemstack2) {
return false;
}
@Override
public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) {
return false;
}
// TODO: @ForgeSubscribe
public void onEntityLivingFallEvent(LivingFallEvent var1) {
if (!var1.entity.worldObj.isRemote && var1.entity instanceof EntityPlayer) {
EntityPlayer var2 = (EntityPlayer)var1.entity;
for (int i = 0; i < 4; i++) {
ItemStack var3 = var2.inventory.armorInventory[i];
if (var3 != null && var3.getItem() == this && (mSpecials & 2) != 0) {
int var4 = (int)var1.distance - 3;
int var5 = (this.mDamageEnergyCost * var4) / 4;
if (var5 <= GT_ModHandler.dischargeElectricItem(var3, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)) {
GT_ModHandler.dischargeElectricItem(var3, var5, Integer.MAX_VALUE, true, false, true);
var1.setCanceled(true);
break;
}
}
}
}
}
@Override
public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase var1, ItemStack var2, DamageSource var3, double var4, int var6) {
return new ISpecialArmor.ArmorProperties((var3 == DamageSource.fall && (mSpecials & 2) != 0)?10:0, getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage, mDamageEnergyCost > 0 ? 25 * GT_ModHandler.dischargeElectricItem(var2, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true) / mDamageEnergyCost : 0);
}
@Override
public int getArmorDisplay(EntityPlayer var1, ItemStack var2, int var3) {
return (int)Math.round(20.0D * getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage);
}
@Override
public void damageArmor(EntityLivingBase var1, ItemStack var2, DamageSource var3, int var4, int var5) {
GT_ModHandler.dischargeElectricItem(var2, var4 * mDamageEnergyCost, Integer.MAX_VALUE, true, false, true);
}
private double getBaseAbsorptionRatio() {
if (mArmorAbsorbtionPercentage <= 0) return 0.00;
switch (this.armorType) {
case 0: return 0.15;
case 1: return 0.40;
case 2: return 0.30;
case 3: return 0.15;
default: return 0.00;
}
}
}