327 lines
13 KiB
Java
327 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;
|
|
}
|
|
}
|
|
}
|