GT5-Unofficial/main/java/gregtech/api/items/GT_MetaBase_Item.java

555 lines
22 KiB
Java
Raw Normal View History

2015-04-23 16:14:22 +00:00
package gregtech.api.items;
import static gregtech.api.enums.GT_Values.D1;
import static gregtech.api.enums.GT_Values.V;
import gregtech.api.enums.SubTag;
import gregtech.api.interfaces.IItemBehaviour;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Utility;
import ic2.api.item.ElectricItem;
import ic2.api.item.IElectricItem;
import ic2.api.item.IElectricItemManager;
import ic2.api.item.ISpecialElectricItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.minecraft.dispenser.IBlockSource;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.inventory.Container;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;
public abstract class GT_MetaBase_Item extends GT_Generic_Item implements ISpecialElectricItem, IElectricItemManager, IFluidContainerItem {
/* ---------- CONSTRUCTOR AND MEMBER VARIABLES ---------- */
private final HashMap<Short, ArrayList<IItemBehaviour<GT_MetaBase_Item>>> mItemBehaviors = new HashMap<Short, ArrayList<IItemBehaviour<GT_MetaBase_Item>>>();
/**
* Creates the Item using these Parameters.
* @param aUnlocalized The Unlocalized Name of this Item.
* @param aGeneratedPrefixList The OreDict Prefixes you want to have generated.
*/
public GT_MetaBase_Item(String aUnlocalized) {
super(aUnlocalized, "Generated Item", null, false);
setHasSubtypes(true);
setMaxDamage(0);
}
/**
* Adds a special Item Behaviour to the Item.
*
* Note: the boolean Behaviours sometimes won't be executed if another boolean Behaviour returned true before.
*
* @param aMetaValue the Meta Value of the Item you want to add it to. [0 - 32765]
* @param aBehavior the Click Behavior you want to add.
* @return the Item itself for convenience in constructing.
*/
public final GT_MetaBase_Item addItemBehavior(int aMetaValue, IItemBehaviour<GT_MetaBase_Item> aBehavior) {
if (aMetaValue < 0 || aMetaValue >= 32766 || aBehavior == null) return this;
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)aMetaValue);
if (tList == null) {
tList = new ArrayList<IItemBehaviour<GT_MetaBase_Item>>(1);
mItemBehaviors.put((short)aMetaValue, tList);
}
tList.add(aBehavior);
return this;
}
public abstract Long[] getElectricStats(ItemStack aStack);
public abstract Long[] getFluidContainerStats(ItemStack aStack);
@Override
public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) {
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) if (tBehavior.hasProjectile(this, aProjectileType, aStack)) return true;
return super.hasProjectile(aProjectileType, aStack);
}
@Override
public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, double aZ) {
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) {
EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aX, aY, aZ);
if (rArrow != null) return rArrow;
}
return super.getProjectile(aProjectileType, aStack, aWorld, aX, aY, aZ);
}
@Override
public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity, float aSpeed) {
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) {
EntityArrow rArrow = tBehavior.getProjectile(this, aProjectileType, aStack, aWorld, aEntity, aSpeed);
if (rArrow != null) return rArrow;
}
return super.getProjectile(aProjectileType, aStack, aWorld, aEntity, aSpeed);
}
@Override
public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) {
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) if (tBehavior.canDispense(this, aSource, aStack)) return tBehavior.onDispense(this, aSource, aStack);
return super.onDispense(aSource, aStack);
}
@Override
public boolean isItemStackUsable(ItemStack aStack) {
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) if (!tBehavior.isItemStackUsable(this, aStack)) return false;
return super.isItemStackUsable(aStack);
}
@Override
public boolean onLeftClickEntity(ItemStack aStack, EntityPlayer aPlayer, Entity aEntity) {
use(aStack, 0, aPlayer);
isItemStackUsable(aStack);
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) try {
if (tBehavior.onLeftClickEntity(this, aStack, aPlayer, aEntity)) {
if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
return true;
}
if (aStack.stackSize <= 0) {
aPlayer.destroyCurrentEquippedItem();
return false;
}
} catch(Throwable e) {
if (D1) e.printStackTrace(GT_Log.err);
}
return false;
}
@Override
public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, int aSide, float hitX, float hitY, float hitZ) {
use(aStack, 0, aPlayer);
isItemStackUsable(aStack);
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) try {
if (tBehavior.onItemUse(this, aStack, aPlayer, aWorld, aX, aY, aZ, aSide, hitX, hitY, hitZ)) {
if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
return true;
}
if (aStack.stackSize <= 0) {
aPlayer.destroyCurrentEquippedItem();
return false;
}
} catch(Throwable e) {
if (D1) e.printStackTrace(GT_Log.err);
}
return false;
}
@Override
public boolean onItemUseFirst(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, int aSide, float hitX, float hitY, float hitZ) {
use(aStack, 0, aPlayer);
isItemStackUsable(aStack);
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) try {
if (tBehavior.onItemUseFirst(this, aStack, aPlayer, aWorld, aX, aY, aZ, aSide, hitX, hitY, hitZ)) {
if (aStack.stackSize <= 0) aPlayer.destroyCurrentEquippedItem();
return true;
}
if (aStack.stackSize <= 0) {
aPlayer.destroyCurrentEquippedItem();
return false;
}
} catch(Throwable e) {
if (D1) e.printStackTrace(GT_Log.err);
}
return false;
}
@Override
public ItemStack onItemRightClick(ItemStack aStack, World aWorld, EntityPlayer aPlayer) {
use(aStack, 0, aPlayer);
isItemStackUsable(aStack);
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) try {
aStack = tBehavior.onItemRightClick(this, aStack, aWorld, aPlayer);
} catch(Throwable e) {
if (D1) e.printStackTrace(GT_Log.err);
}
return aStack;
}
@Override
public final void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
String tKey = getUnlocalizedName(aStack) + ".tooltip", tString = GT_LanguageManager.getTranslation(tKey);
if (GT_Utility.isStringValid(tString) && !tKey.equals(tString)) aList.add(tString);
Long[]
tStats = getElectricStats(aStack);
if (tStats != null) {
if (tStats[3] > 0) {
aList.add(EnumChatFormatting.AQUA + "Contains " + GT_Utility.formatNumbers(tStats[3]) + " EU Tier: " + (tStats[2]>=0?tStats[2]:0) + EnumChatFormatting.GRAY);
} else {
long tCharge = getRealCharge(aStack);
if (tStats[3] == -2 && tCharge <= 0) {
aList.add(EnumChatFormatting.AQUA + "Empty. You should recycle it properly." + EnumChatFormatting.GRAY);
} else {
aList.add(EnumChatFormatting.AQUA + "" + GT_Utility.formatNumbers(tCharge) + " / " + GT_Utility.formatNumbers(Math.abs(tStats[0])) + " EU - Voltage: " + V[(int)(tStats[2]>=0?tStats[2]<V.length?tStats[2]:V.length-1:1)] + EnumChatFormatting.GRAY);
}
}
}
tStats = getFluidContainerStats(aStack);
if (tStats != null && tStats[0] > 0) {
FluidStack tFluid = getFluidContent(aStack);
aList.add(EnumChatFormatting.BLUE + ((tFluid==null?"No Fluids Contained":GT_Utility.getFluidName(tFluid, true))) + EnumChatFormatting.GRAY);
aList.add(EnumChatFormatting.BLUE + ((tFluid==null?0:tFluid.amount) + "L / " + tStats[0] + "L") + EnumChatFormatting.GRAY);
}
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) aList = tBehavior.getAdditionalToolTips(this, aList, aStack);
addAdditionalToolTips(aList, aStack);
}
@Override
public void onUpdate(ItemStack aStack, World aWorld, Entity aPlayer, int aTimer, boolean aIsInHand) {
ArrayList<IItemBehaviour<GT_MetaBase_Item>> tList = mItemBehaviors.get((short)getDamage(aStack));
if (tList != null) for (IItemBehaviour<GT_MetaBase_Item> tBehavior : tList) tBehavior.onUpdate(this, aStack, aWorld, aPlayer, aTimer, aIsInHand);
}
@Override
public final boolean canProvideEnergy(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null) return false;
return tStats[3] > 0 || (aStack.stackSize == 1 && (tStats[3] == -2 || tStats[3] == -3));
}
@Override
public final double getMaxCharge(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null) return 0;
return Math.abs(tStats[0]);
}
@Override
public final double getTransferLimit(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null) return 0;
return Math.max(tStats[1], tStats[3]);
}
@Override
public final double charge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit, boolean aSimulate) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null || tStats[2] > aTier || !(tStats[3] == -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) || aStack.stackSize != 1) return 0;
long tChargeBefore = getRealCharge(aStack), tNewCharge = aCharge==Integer.MAX_VALUE?Long.MAX_VALUE:Math.min(Math.abs(tStats[0]), tChargeBefore + (aIgnoreTransferLimit?(long)aCharge:Math.min(tStats[1], (long)aCharge)));
if (!aSimulate) setCharge(aStack, tNewCharge);
return tNewCharge-tChargeBefore;
}
@Override
public final double discharge(ItemStack aStack, double aCharge, int aTier, boolean aIgnoreTransferLimit, boolean aBatteryAlike, boolean aSimulate) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null || tStats[2] > aTier) return 0;
if (aBatteryAlike && !canProvideEnergy(aStack)) return 0;
if (tStats[3] > 0) {
if (aCharge < tStats[3] || aStack.stackSize < 1) return 0;
if (!aSimulate) aStack.stackSize--;
return tStats[3];
}
long tChargeBefore = getRealCharge(aStack), tNewCharge = Math.max(0, tChargeBefore - (aIgnoreTransferLimit?(long)aCharge:Math.min(tStats[1], (long)aCharge)));
if (!aSimulate) setCharge(aStack, tNewCharge);
return tChargeBefore-tNewCharge;
}
@Override
public final double getCharge(ItemStack aStack) {
return getRealCharge(aStack);
}
@Override
public final boolean canUse(ItemStack aStack, double aAmount) {
return getRealCharge(aStack) >= aAmount;
}
@Override
public final boolean use(ItemStack aStack, double aAmount, EntityLivingBase aPlayer) {
chargeFromArmor(aStack, aPlayer);
if (aPlayer instanceof EntityPlayer && ((EntityPlayer)aPlayer).capabilities.isCreativeMode) return true;
double tTransfer = discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, true);
if (tTransfer == aAmount) {
discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
chargeFromArmor(aStack, aPlayer);
return true;
}
discharge(aStack, aAmount, Integer.MAX_VALUE, true, false, false);
chargeFromArmor(aStack, aPlayer);
return false;
}
@Override
public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) {
if (aPlayer == null || aPlayer.worldObj.isRemote) return;
for (int i = 1; i < 5; i++) {
ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
if (GT_ModHandler.isElectricItem(tArmor)) {
IElectricItem tArmorItem = (IElectricItem)tArmor.getItem();
if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= getTier(aStack)) {
double tCharge = ElectricItem.manager.discharge(tArmor, charge(aStack, Integer.MAX_VALUE-1, Integer.MAX_VALUE, true, true), Integer.MAX_VALUE, true, true, false);
if (tCharge > 0) {
charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
if (aPlayer instanceof EntityPlayer) {
Container tContainer = ((EntityPlayer)aPlayer).openContainer;
if (tContainer != null) tContainer.detectAndSendChanges();
}
}
}
}
}
}
/*
@Override
public final int getMaxCharge(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null) return 0;
return (int)Math.abs(tStats[0]);
}
@Override
public final int getTransferLimit(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null) return 0;
return (int)Math.max(tStats[1], tStats[3]);
}
@Override
public final int charge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, boolean aSimulate) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null || tStats[2] > aTier || !(tStats[3] == -1 || tStats[3] == -3 || (tStats[3] < 0 && aCharge == Integer.MAX_VALUE)) || aStack.stackSize != 1) return 0;
long tChargeBefore = getRealCharge(aStack), tNewCharge = aCharge==Integer.MAX_VALUE?Long.MAX_VALUE:Math.min(Math.abs(tStats[0]), tChargeBefore + (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge)));
if (!aSimulate) setCharge(aStack, tNewCharge);
return (int)(tNewCharge-tChargeBefore);
}
@Override
public final int discharge(ItemStack aStack, int aCharge, int aTier, boolean aIgnoreTransferLimit, boolean aSimulate) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null || tStats[2] > aTier) return 0;
if (tStats[3] > 0) {
if (aCharge < tStats[3] || aStack.stackSize < 1) return 0;
if (!aSimulate) aStack.stackSize--;
return (int)(long)tStats[3];
}
long tChargeBefore = getRealCharge(aStack), tNewCharge = Math.max(0, tChargeBefore - (aIgnoreTransferLimit?aCharge:Math.min(tStats[1], aCharge)));
if (!aSimulate) setCharge(aStack, tNewCharge);
return (int)(tChargeBefore-tNewCharge);
}
@Override
public final int getCharge(ItemStack aStack) {
return (int)Math.min(Integer.MAX_VALUE, getRealCharge(aStack));
}
@Override
public final boolean canUse(ItemStack aStack, int aAmount) {
return getRealCharge(aStack) >= aAmount;
}
@Override
public final boolean use(ItemStack aStack, int aAmount, EntityLivingBase aPlayer) {
chargeFromArmor(aStack, aPlayer);
if (aPlayer instanceof EntityPlayer && ((EntityPlayer)aPlayer).capabilities.isCreativeMode) return true;
int tTransfer = discharge(aStack, aAmount, Integer.MAX_VALUE, true, true);
if (tTransfer == aAmount) {
discharge(aStack, aAmount, Integer.MAX_VALUE, true, false);
chargeFromArmor(aStack, aPlayer);
return true;
}
discharge(aStack, aAmount, Integer.MAX_VALUE, true, false);
chargeFromArmor(aStack, aPlayer);
return false;
}
@Override
public final void chargeFromArmor(ItemStack aStack, EntityLivingBase aPlayer) {
if (aPlayer == null || aPlayer.worldObj.isRemote) return;
for (int i = 1; i < 5; i++) {
ItemStack tArmor = aPlayer.getEquipmentInSlot(i);
if (GT_ModHandler.isElectricItem(tArmor)) {
IElectricItem tArmorItem = (IElectricItem)tArmor.getItem();
if (tArmorItem.canProvideEnergy(tArmor) && tArmorItem.getTier(tArmor) >= getTier(aStack)) {
int tCharge = ElectricItem.manager.discharge(tArmor, charge(aStack, Integer.MAX_VALUE-1, Integer.MAX_VALUE, true, true), Integer.MAX_VALUE, true, false);
if (tCharge > 0) {
charge(aStack, tCharge, Integer.MAX_VALUE, true, false);
if (aPlayer instanceof EntityPlayer) {
Container tContainer = ((EntityPlayer)aPlayer).openContainer;
if (tContainer != null) tContainer.detectAndSendChanges();
}
}
}
}
}
}
*/
public final long getRealCharge(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null) return 0;
if (tStats[3] > 0) return (int)(long)tStats[3];
NBTTagCompound tNBT = aStack.getTagCompound();
return tNBT==null?0:tNBT.getLong("GT.ItemCharge");
}
public final boolean setCharge(ItemStack aStack, long aCharge) {
Long[] tStats = getElectricStats(aStack);
if (tStats == null || tStats[3] > 0) return false;
NBTTagCompound tNBT = aStack.getTagCompound();
if (tNBT == null) tNBT = new NBTTagCompound();
tNBT.removeTag("GT.ItemCharge");
aCharge = Math.min(tStats[0]<0?Math.abs(tStats[0] / 2):aCharge, Math.abs(tStats[0]));
if (aCharge > 0) {
aStack.setItemDamage(getChargedMetaData(aStack));
tNBT.setLong("GT.ItemCharge", aCharge);
} else {
aStack.setItemDamage(getEmptyMetaData(aStack));
}
if (tNBT.hasNoTags()) aStack.setTagCompound(null); else aStack.setTagCompound(tNBT);
isItemStackUsable(aStack);
return true;
}
public short getChargedMetaData(ItemStack aStack) {return (short)aStack.getItemDamage();}
public short getEmptyMetaData(ItemStack aStack) {return (short)aStack.getItemDamage();}
@Override
public FluidStack getFluid(ItemStack aStack) {
return getFluidContent(aStack);
}
@Override
public int getCapacity(ItemStack aStack) {
Long[] tStats = getFluidContainerStats(aStack);
return tStats==null?0:(int)Math.max(0, tStats[0]);
}
@Override
public int fill(ItemStack aStack, FluidStack aFluid, boolean doFill) {
if (aStack == null || aStack.stackSize != 1) return 0;
ItemStack tStack = GT_Utility.fillFluidContainer(aFluid, aStack, false, false);
if (tStack != null) {
aStack.setItemDamage(tStack.getItemDamage());
aStack.func_150996_a(tStack.getItem());
return GT_Utility.getFluidForFilledItem(tStack, false).amount;
}
Long[] tStats = getFluidContainerStats(aStack);
if (tStats == null || tStats[0] <= 0 || aFluid == null || aFluid.getFluid().getID() <= 0 || aFluid.amount <= 0) return 0;
2015-04-23 16:14:22 +00:00
FluidStack tFluid = getFluidContent(aStack);
if (tFluid == null || tFluid.getFluid().getID() <= 0) {
2015-04-23 16:14:22 +00:00
if (aFluid.amount <= tStats[0]) {
if (doFill) {
setFluidContent(aStack, aFluid);
}
return aFluid.amount;
}
if (doFill) {
tFluid = aFluid.copy();
tFluid.amount = (int)(long)tStats[0];
setFluidContent(aStack, tFluid);
}
return (int)(long)tStats[0];
}
if (!tFluid.isFluidEqual(aFluid)) return 0;
int space = (int)(long)tStats[0] - tFluid.amount;
if (aFluid.amount <= space) {
if (doFill) {
tFluid.amount += aFluid.amount;
setFluidContent(aStack, tFluid);
}
return aFluid.amount;
}
if (doFill) {
tFluid.amount = (int)(long)tStats[0];
setFluidContent(aStack, tFluid);
}
return space;
}
@Override
public FluidStack drain(ItemStack aStack, int maxDrain, boolean doDrain) {
if (aStack == null || aStack.stackSize != 1) return null;
FluidStack tFluid = GT_Utility.getFluidForFilledItem(aStack, false);
if (tFluid != null && maxDrain >= tFluid.amount) {
ItemStack tStack = GT_Utility.getContainerItem(aStack, false);
if (tStack == null) {
aStack.stackSize = 0;
return tFluid;
}
aStack.setItemDamage(tStack.getItemDamage());
aStack.func_150996_a(tStack.getItem());
return tFluid;
}
Long[] tStats = getFluidContainerStats(aStack);
if (tStats == null || tStats[0] <= 0) return null;
tFluid = getFluidContent(aStack);
if (tFluid == null) return null;
int used = maxDrain;
if (tFluid.amount < used) used = tFluid.amount;
if (doDrain) {
tFluid.amount -= used;
setFluidContent(aStack, tFluid);
}
FluidStack drained = tFluid.copy();
drained.amount = used;
return drained;
}
public FluidStack getFluidContent(ItemStack aStack) {
Long[] tStats = getFluidContainerStats(aStack);
if (tStats == null || tStats[0] <= 0) return GT_Utility.getFluidForFilledItem(aStack, false);
NBTTagCompound tNBT = aStack.getTagCompound();
return tNBT==null?null:FluidStack.loadFluidStackFromNBT(tNBT.getCompoundTag("GT.FluidContent"));
}
public void setFluidContent(ItemStack aStack, FluidStack aFluid) {
NBTTagCompound tNBT = aStack.getTagCompound();
if (tNBT == null) tNBT = new NBTTagCompound(); else tNBT.removeTag("GT.FluidContent");
if (aFluid != null && aFluid.amount > 0) tNBT.setTag("GT.FluidContent", aFluid.writeToNBT(new NBTTagCompound()));
if (tNBT.hasNoTags()) aStack.setTagCompound(null); else aStack.setTagCompound(tNBT);
isItemStackUsable(aStack);
}
@Override
public int getItemStackLimit(ItemStack aStack) {
Long[] tStats = getElectricStats(aStack);
if (tStats != null && (tStats[3] == -1 || tStats[3] == -3) && getRealCharge(aStack) > 0) return 1;
tStats = getFluidContainerStats(aStack);
if (tStats != null) return (int)(long)tStats[1];
return 64;
}
@Override public final Item getChargedItem(ItemStack itemStack) {return this;}
@Override public final Item getEmptyItem(ItemStack itemStack) {return this;}
@Override public final int getTier(ItemStack aStack) {Long[] tStats = getElectricStats(aStack); return (int)(tStats==null?Integer.MAX_VALUE:tStats[2]);}
@Override public final String getToolTip(ItemStack aStack) {return null;} // This has its own ToolTip Handler, no need to let the IC2 Handler screw us up at this Point
@Override public final IElectricItemManager getManager(ItemStack aStack) {return this;} // We are our own Manager
@Override public final boolean getShareTag() {return true;} // just to be sure.
@Override public int getItemEnchantability() {return 0;}
@Override public boolean isBookEnchantable(ItemStack aStack, ItemStack aBook) {return false;}
@Override public boolean getIsRepairable(ItemStack aStack, ItemStack aMaterial) {return false;}
}