diff options
| author | Shawn Buckley <shawntbuckley@gmail.com> | 2015-10-18 23:04:39 -0400 |
|---|---|---|
| committer | Shawn Buckley <shawntbuckley@gmail.com> | 2015-10-18 23:04:39 -0400 |
| commit | 85c804fa112fd1f19c91e45d150a787cfbf0f7a8 (patch) | |
| tree | cb302d8e0f46e06be0b1d391317578b165aec245 /src/main/java/gregtech/api/items | |
| parent | ce25063b910bb3bdd2b0c234b185fc4077caebdb (diff) | |
| download | GT5-Unofficial-85c804fa112fd1f19c91e45d150a787cfbf0f7a8.tar.gz GT5-Unofficial-85c804fa112fd1f19c91e45d150a787cfbf0f7a8.tar.bz2 GT5-Unofficial-85c804fa112fd1f19c91e45d150a787cfbf0f7a8.zip | |
Move source directory
Diffstat (limited to 'src/main/java/gregtech/api/items')
20 files changed, 3310 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java b/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java new file mode 100644 index 0000000000..c24e3947f2 --- /dev/null +++ b/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java @@ -0,0 +1,78 @@ +package gregtech.api.items; + + +import ic2.api.reactor.IReactor; +import ic2.api.reactor.IReactorComponent; +import net.minecraft.item.ItemStack; + +public class GT_CoolantCellIC_Item + extends GT_CoolantCell_Item + implements IReactorComponent +{ + public GT_CoolantCellIC_Item(String aUnlocalized, String aEnglish, int aMaxStore) + { + super(aUnlocalized, aEnglish, aMaxStore); + } + + public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {} + + public boolean acceptUraniumPulse(IReactor aReactor, ItemStack aStack, ItemStack pulsingStack, int youX, int youY, int pulseX, int pulseY, boolean aHeatRun) + { + return false; + } + + public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) + { + if(aReactor.isFluidCooled()&&(getControlTagOfStack(aStack))!=0){ + return false; + } + return true; + } + + public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) + { + return this.heatStorage; + } + + public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) + { + return getHeatOfStack(aStack); + } + + public float influenceExplosion(IReactor aReactor, ItemStack aStack) + { + return 1.0F + this.heatStorage / 30000.0F; + } + + public int alterHeat(IReactor aReactor, ItemStack aStack, int x, int y, int aHeat) + { + + int tHeat = getHeatOfStack(aStack); + if ((tHeat == 0) && (getControlTagOfStack(aStack) != 0)) { + setControlTagOfStack(aStack, 0); + } + tHeat += aHeat; + if (tHeat > this.heatStorage) + { + aReactor.setItemAt(x, y, (ItemStack)null); + aHeat = this.heatStorage - tHeat + 1; + } + else + { + if (tHeat < 0) + { + aHeat = tHeat; + tHeat = 0; + } + else + { + aHeat = 0; + } + if ((tHeat > 0) && (getControlTagOfStack(aStack) == 0) && (!aReactor.isFluidCooled())) { + setControlTagOfStack(aStack, 1); + } + setHeatForStack(aStack, tHeat); + } + return aHeat; + } +} diff --git a/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java b/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java new file mode 100644 index 0000000000..fe56ffc310 --- /dev/null +++ b/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java @@ -0,0 +1,82 @@ +package gregtech.api.items; + +import gregtech.api.GregTech_API; +import ic2.core.util.StackUtil; + +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; + +public class GT_CoolantCell_Item + extends GT_Generic_Item +{ + protected int heatStorage; + + public GT_CoolantCell_Item(String aUnlocalized, String aEnglish, int aMaxStore) + { + super(aUnlocalized, aEnglish, null); + this.setMaxStackSize(1); + this.setMaxDamage(100); + setNoRepair(); + this.heatStorage = aMaxStore; + this.setCreativeTab(GregTech_API.TAB_GREGTECH); + } + + protected void setHeatForStack(ItemStack aStack, int aHeat) + { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) + { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + tNBT.setInteger("heat", aHeat); + if (this.heatStorage > 0) + { + double var4 = (double)aHeat / (double)this.heatStorage; + int var6 = (int)(aStack.getMaxDamage() * var4); + if (var6 >= aStack.getMaxDamage()) { + var6 = aStack.getMaxDamage() - 1; + } + aStack.setItemDamage(var6); + } + } + + public void addAdditionalToolTips(List aList, ItemStack aStack) + { + super.addAdditionalToolTips(aList, aStack); + aList.add("Stored Heat: " + getHeatOfStack(aStack)); + switch (getControlTagOfStack(aStack)) + { + case 1: + aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line1")); + aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line2")); + } + } + + protected static int getHeatOfStack(ItemStack aStack) + { + NBTTagCompound tNBT = aStack.getTagCompound(); + if (tNBT == null) + { + tNBT = new NBTTagCompound(); + aStack.setTagCompound(tNBT); + } + return tNBT.getInteger("heat"); + } + + public int getControlTagOfStack(ItemStack stack) + { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + return nbtData.getInteger("tag"); + } + + public void setControlTagOfStack(ItemStack stack, int tag) + { + NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(stack); + nbtData.setInteger("tag", tag); + } + +} diff --git a/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java new file mode 100644 index 0000000000..4cbfd5445d --- /dev/null +++ b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java @@ -0,0 +1,327 @@ +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; + } + } +} diff --git a/src/main/java/gregtech/api/items/GT_Generic_Block.java b/src/main/java/gregtech/api/items/GT_Generic_Block.java new file mode 100644 index 0000000000..a4fd8b61a4 --- /dev/null +++ b/src/main/java/gregtech/api/items/GT_Generic_Block.java @@ -0,0 +1,19 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GT_Values.W; +import gregtech.api.util.GT_LanguageManager; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.ItemBlock; +import cpw.mods.fml.common.registry.GameRegistry; + +public class GT_Generic_Block extends Block { + protected final String mUnlocalizedName; + + protected GT_Generic_Block(Class<? extends ItemBlock> aItemClass, String aName, Material aMaterial) { + super(aMaterial); + setBlockName(mUnlocalizedName = aName); + GameRegistry.registerBlock(this, aItemClass, getUnlocalizedName()); + GT_LanguageManager.addStringLocalization(getUnlocalizedName()+"." + W + ".name", "Any Sub Block of this one"); + } +}
\ No newline at end of file diff --git a/src/main/java/gregtech/api/items/GT_Generic_Item.java b/src/main/java/gregtech/api/items/GT_Generic_Item.java new file mode 100644 index 0000000000..a90c13a204 --- /dev/null +++ b/src/main/java/gregtech/api/items/GT_Generic_Item.java @@ -0,0 +1,144 @@ +package gregtech.api.items; + +import static gregtech.api.enums.GT_Values.MOD_ID; +import static gregtech.api.enums.GT_Values.RES_PATH_ITEM; +import gregtech.api.GregTech_API; +import gregtech.api.enums.SubTag; +import gregtech.api.interfaces.IProjectileItem; +import gregtech.api.util.GT_Config; +import gregtech.api.util.GT_LanguageManager; +import gregtech.api.util.GT_ModHandler; +import gregtech.api.util.GT_Utility; + +import java.util.List; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.BehaviorProjectileDispense; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** + * Extended by most Items, also used as a fallback Item, to prevent the accidental deletion when Errors occur. + */ +public class GT_Generic_Item extends Item implements IProjectileItem { + protected IIcon mIcon; + private final String mName, mTooltip; + + public GT_Generic_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip) { + this(aUnlocalized, aEnglish, aEnglishTooltip, true); + } + + public GT_Generic_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip, boolean aWriteToolTipIntoLangFile) { + super(); + mName = "gt." + aUnlocalized; + GT_LanguageManager.addStringLocalization(mName + ".name", aEnglish); + if (GT_Utility.isStringValid(aEnglishTooltip)) GT_LanguageManager.addStringLocalization(mTooltip = mName + ".tooltip_main", aEnglishTooltip, aWriteToolTipIntoLangFile); else mTooltip = null; + setCreativeTab(GregTech_API.TAB_GREGTECH); + GameRegistry.registerItem(this, mName, MOD_ID); + BlockDispenser.dispenseBehaviorRegistry.putObject(this, new GT_Item_Dispense()); + } + + @Override public final Item setUnlocalizedName(String aName) {return this;} + @Override public final String getUnlocalizedName() {return mName;} + @Override public String getUnlocalizedName(ItemStack aStack) {return getHasSubtypes()?mName+"."+getDamage(aStack):mName;} + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister aIconRegister) { + mIcon = aIconRegister.registerIcon(RES_PATH_ITEM + (GT_Config.troll?"troll":mName)); + } + + @Override + public boolean doesSneakBypassUse(World aWorld, int aX, int aY, int aZ, EntityPlayer aPlayer) { + return true; + } + + @Override + public IIcon getIconFromDamage(int par1) { + return mIcon; + } + + public int getTier(ItemStack aStack) { + return 0; + } + + @Override + public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) { + if (getMaxDamage() > 0 && !getHasSubtypes()) aList.add((aStack.getMaxDamage() - getDamage(aStack)) + " / " + aStack.getMaxDamage()); + if (mTooltip != null) aList.add(GT_LanguageManager.getTranslation(mTooltip)); + if (GT_ModHandler.isElectricItem(aStack)) aList.add("Tier: " + getTier(aStack)); + addAdditionalToolTips(aList, aStack); + } + + protected void addAdditionalToolTips(List aList, ItemStack aStack) { + // + } + + @Override + public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { + isItemStackUsable(aStack); + } + + public boolean isItemStackUsable(ItemStack aStack) { + return true; + } + + public ItemStack onDispense(IBlockSource aSource, ItemStack aStack) { + EnumFacing enumfacing = BlockDispenser.func_149937_b(aSource.getBlockMetadata()); + IPosition iposition = BlockDispenser.func_149939_a(aSource); + ItemStack itemstack1 = aStack.splitStack(1); + BehaviorDefaultDispenseItem.doDispense(aSource.getWorld(), itemstack1, 6, enumfacing, iposition); + return aStack; + } + + public static class GT_Item_Dispense extends BehaviorProjectileDispense { + @Override + public ItemStack dispenseStack(IBlockSource aSource, ItemStack aStack) { + return ((GT_Generic_Item)aStack.getItem()).onDispense(aSource, aStack); + } + + @Override + protected IProjectile getProjectileEntity(World aWorld, IPosition aPosition) { + return null; + } + } + + @Override + public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, double aX, double aY, double aZ) { + return null; + } + + @Override + public EntityArrow getProjectile(SubTag aProjectileType, ItemStack aStack, World aWorld, EntityLivingBase aEntity, float aSpeed) { + return null; + } + + @Override + public boolean hasProjectile(SubTag aProjectileType, ItemStack aStack) { + return false; + } + + @Override + public ItemStack getContainerItem(ItemStack aStack) { + return null; + } + + @Override + public boolean hasContainerItem(ItemStack aStack) { + return getContainerItem(aStack) != null; + } +}
\ No newline at end of file diff --git a/src/main/java/gregtech/api/items/GT_MetaBase_Item.java b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java new file mode 100644 index 0000000000..4a0cd6f655 --- /dev/null +++ b/src/main/java/gregtech/api/items/GT_MetaBase_Item.java @@ -0,0 +1,555 @@ +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 a |
