aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/items
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/items')
-rw-r--r--src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java125
-rw-r--r--src/main/java/gregtech/api/items/GT_BreederCell_Item.java147
-rw-r--r--src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java67
-rw-r--r--src/main/java/gregtech/api/items/GT_CoolantCell_Item.java82
-rw-r--r--src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java340
-rw-r--r--src/main/java/gregtech/api/items/GT_Generic_Block.java22
-rw-r--r--src/main/java/gregtech/api/items/GT_Generic_Item.java167
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaBase_Item.java622
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java415
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X01.java213
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Item_X32.java224
-rw-r--r--src/main/java/gregtech/api/items/GT_MetaGenerated_Tool.java1013
-rw-r--r--src/main/java/gregtech/api/items/GT_RadioactiveCellIC_Item.java196
-rw-r--r--src/main/java/gregtech/api/items/GT_RadioactiveCell_Item.java159
-rw-r--r--src/main/java/gregtech/api/items/GT_Tool_Item.java41
15 files changed, 3833 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java b/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java
new file mode 100644
index 0000000000..31a44f3dbc
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Block_LongDistancePipe.java
@@ -0,0 +1,125 @@
+package gregtech.api.items;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Textures;
+import gregtech.api.interfaces.IIconContainer;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_LongDistancePipe;
+import gregtech.common.blocks.GT_Material_Machines;
+
+public class GT_Block_LongDistancePipe extends GT_Generic_Block {
+
+ public IIconContainer[] mIcons;
+
+ public GT_Block_LongDistancePipe() {
+ super(GT_Item_LongDistancePipe.class, "gt.block.longdistancepipe", new GT_Material_Machines());
+ setStepSound(soundTypeMetal);
+ setCreativeTab(GregTech_API.TAB_GREGTECH);
+ GregTech_API.registerMachineBlock(this, -1);
+
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".0.name", "Long Distance Fluid Pipeline Pipe");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Long Distance Item Pipeline Pipe");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + "." + 32767 + ".name", "Any Sub Block of this");
+
+ ItemList.Long_Distance_Pipeline_Fluid_Pipe.set(new ItemStack(this, 1, 0));
+ ItemList.Long_Distance_Pipeline_Item_Pipe.set(new ItemStack(this, 1, 1));
+ mIcons = new IIconContainer[] { Textures.BlockIcons.LONG_DISTANCE_PIPE_FLUID,
+ Textures.BlockIcons.LONG_DISTANCE_PIPE_ITEM };
+ }
+
+ @Override
+ public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ super.onBlockAdded(aWorld, aX, aY, aZ);
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMetaData) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ super.breakBlock(aWorld, aX, aY, aZ, aBlock, aMetaData);
+ }
+
+ @Override
+ public String getHarvestTool(int aMeta) {
+ return "wrench";
+ }
+
+ @Override
+ public int getHarvestLevel(int aMeta) {
+ return 2;
+ }
+
+ @Override
+ public float getBlockHardness(World aWorld, int aX, int aY, int aZ) {
+ return Blocks.stone.getBlockHardness(aWorld, aX, aY, aZ);
+ }
+
+ @Override
+ public float getExplosionResistance(Entity aTNT) {
+ return Blocks.iron_block.getExplosionResistance(aTNT);
+ }
+
+ @Override
+ public String getUnlocalizedName() {
+ return this.mUnlocalizedName;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return StatCollector.translateToLocal(this.mUnlocalizedName + ".name");
+ }
+
+ @Override
+ public IIcon getIcon(int ordinalSide, int aMeta) {
+ return mIcons[aMeta % mIcons.length].getIcon();
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister aIconRegister) {}
+
+ @Override
+ public boolean canCreatureSpawn(EnumCreatureType type, IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ public int damageDropped(int metadata) {
+ return metadata;
+ }
+
+ @Override
+ public int getDamageValue(World aWorld, int aX, int aY, int aZ) {
+ return aWorld.getBlockMetadata(aX, aY, aZ);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void getSubBlocks(Item aItem, CreativeTabs aCreativeTab, List<ItemStack> aList) {
+ for (int i = 0; i < 3; i++) {
+ ItemStack aStack = new ItemStack(aItem, 1, i);
+ if (!aStack.getDisplayName()
+ .contains(".name")) aList.add(aStack);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/items/GT_BreederCell_Item.java b/src/main/java/gregtech/api/items/GT_BreederCell_Item.java
new file mode 100644
index 0000000000..3d51415783
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_BreederCell_Item.java
@@ -0,0 +1,147 @@
+package gregtech.api.items;
+
+import static gregtech.api.util.GT_Utility.formatNumbers;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.world.World;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import ic2.api.reactor.IReactor;
+import ic2.api.reactor.IReactorComponent;
+import ic2.core.IC2Potion;
+
+/**
+ * A {@link ic2.core.item.reactor.ItemReactorLithiumCell}, but can be used to produce anything!
+ *
+ * @author glee8e
+ */
+public class GT_BreederCell_Item extends GT_Generic_Item implements IReactorComponent {
+
+ protected final int mHeatBonusStep;
+ protected final int mHeatBonusMultiplier;
+ protected ItemStack mProduct;
+ protected boolean deflector = false;
+ protected boolean hidden = false;
+ protected boolean neiAdded = false;
+
+ public GT_BreederCell_Item(String aUnlocalized, String aEnglish, String aEnglishTooltip, int aHeatBonusStep,
+ int aHeatBonusMultiplier, int aRequiredPulse, Supplier<ItemStack> aProduct) {
+ super(aUnlocalized, aEnglish, aEnglishTooltip);
+ this.mHeatBonusStep = aHeatBonusStep;
+ this.mHeatBonusMultiplier = aHeatBonusMultiplier;
+ this.setMaxDamage(aRequiredPulse);
+ setNoRepair();
+ GregTech_API.sAfterGTPostload.add(() -> {
+ mProduct = aProduct.get();
+ if (!hidden && !neiAdded) {
+ GT_Values.RA.addIC2ReactorBreederCell(
+ new ItemStack(this),
+ mProduct,
+ deflector,
+ mHeatBonusStep,
+ mHeatBonusMultiplier,
+ getMaxDamage());
+ neiAdded = true;
+ }
+ });
+ }
+
+ public GT_BreederCell_Item setDeflector() {
+ deflector = true;
+ return this;
+ }
+
+ public GT_BreederCell_Item setHidden() {
+ hidden = true;
+ return this;
+ }
+
+ @Override
+ public void onUpdate(ItemStack stack, World world, Entity entity, int slotIndex, boolean isCurrentItem) {
+ if ((entity instanceof EntityLivingBase entityLiving)) {
+ if (!GT_Utility.isWearingFullRadioHazmat(entityLiving)) {
+ IC2Potion.radiation.applyTo(entityLiving, 20, 1);
+ }
+ }
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ aList.add(transItem("019", "Bath with neutron in a hot reactor"));
+ int rDmg = aStack.getItemDamage() * 4 / getMaxDamage();
+ EnumChatFormatting color2 = switch (rDmg) {
+ case 0 -> EnumChatFormatting.DARK_GRAY;
+ case 1, 2 -> EnumChatFormatting.GRAY;
+ default -> EnumChatFormatting.WHITE;
+ };
+ aList.add(
+ String.format(
+ transItem("020", "Progress: %s/%s"),
+ "" + color2 + formatNumbers(aStack.getItemDamage()) + EnumChatFormatting.RESET,
+ "" + formatNumbers(getMaxDamage())));
+ if (aStack.getItemDamage() > 0) aList.add(EnumChatFormatting.RED + transItem("021", "Radiation Hazard"));
+ }
+
+ @Override
+ public int getItemStackLimit(ItemStack stack) {
+ return stack.getItemDamage() == 0 ? maxStackSize : 1;
+ }
+
+ @Override
+ public void processChamber(IReactor reactor, ItemStack yourStack, int x, int y, boolean heatrun) {}
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor reactor, ItemStack yourStack, ItemStack pulsingStack, int youX, int youY,
+ int pulseX, int pulseY, boolean heatrun) {
+ if (heatrun) {
+ int myLevel = getNewDamage(reactor, yourStack);
+ if (myLevel >= getMaxDamage()) reactor.setItemAt(youX, youY, mProduct.copy());
+ else yourStack.setItemDamage(myLevel);
+ }
+
+ return deflector;
+ }
+
+ protected int getNewDamage(IReactor reactor, ItemStack stack) {
+ return stack.getItemDamage() + 1 + reactor.getHeat() / mHeatBonusStep * mHeatBonusMultiplier;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return false;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor reactor, ItemStack yourStack, int x, int y) {
+ return 0;
+ }
+
+ @Override
+ public int alterHeat(IReactor reactor, ItemStack yourStack, int x, int y, int heat) {
+ return heat;
+ }
+
+ @Override
+ public float influenceExplosion(IReactor reactor, ItemStack yourStack) {
+ return 0.0F;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ return 1.0D - (double) stack.getItemDamageForDisplay() / (double) stack.getMaxDamage();
+ }
+}
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..eb3c6276cf
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_CoolantCellIC_Item.java
@@ -0,0 +1,67 @@
+package gregtech.api.items;
+
+import net.minecraft.item.ItemStack;
+
+import ic2.api.reactor.IReactor;
+import ic2.api.reactor.IReactorComponent;
+
+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);
+ }
+
+ @Override
+ public void processChamber(IReactor aReactor, ItemStack aStack, int x, int y, boolean aHeatRun) {}
+
+ @Override
+ public boolean acceptUraniumPulse(IReactor aReactor, ItemStack aStack, ItemStack pulsingStack, int youX, int youY,
+ int pulseX, int pulseY, boolean aHeatRun) {
+ return false;
+ }
+
+ @Override
+ public boolean canStoreHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return !aReactor.isFluidCooled() || getControlTagOfStack(aStack) == 0;
+ }
+
+ @Override
+ public int getMaxHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return this.heatStorage;
+ }
+
+ @Override
+ public int getCurrentHeat(IReactor aReactor, ItemStack aStack, int x, int y) {
+ return getHeatOfStack(aStack);
+ }
+
+ @Override
+ public float influenceExplosion(IReactor aReactor, ItemStack aStack) {
+ return 1.0F + this.heatStorage / 30000.0F;
+ }
+
+ @Override
+ 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, 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..6ed7dae3b0
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_CoolantCell_Item.java
@@ -0,0 +1,82 @@
+package gregtech.api.items;
+
+import java.util.List;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.GregTech_API;
+import ic2.core.util.StackUtil;
+
+public class GT_CoolantCell_Item extends GT_Generic_Item {
+
+ protected final 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 static int getHeatOfStack(ItemStack aStack) {
+ NBTTagCompound tNBT = aStack.getTagCompound();
+ if (tNBT == null) {
+ tNBT = new NBTTagCompound();
+ aStack.setTagCompound(tNBT);
+ }
+ return tNBT.getInteger("heat");
+ }
+
+ 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 heatRatio = (double) aHeat / (double) this.heatStorage;
+ int damage = (int) (aStack.getMaxDamage() * heatRatio);
+ if (damage >= aStack.getMaxDamage()) {
+ damage = aStack.getMaxDamage() - 1;
+ }
+ aStack.setItemDamage(damage);
+ }
+ }
+
+ @Override
+ public void addAdditionalToolTips(List<String> aList, ItemStack aStack, EntityPlayer aPlayer) {
+ super.addAdditionalToolTips(aList, aStack, aPlayer);
+ int rHeat = getHeatOfStack(aStack) * 10 / this.heatStorage;
+ EnumChatFormatting color = switch (rHeat) {
+ case 0 -> EnumChatFormatting.BLUE;
+ case 1, 2 -> EnumChatFormatting.GREEN;
+ case 3, 4, 5, 6 -> EnumChatFormatting.YELLOW;
+ case 7, 8 -> EnumChatFormatting.RED;
+ default -> EnumChatFormatting.DARK_RED;
+ };
+ aList.add(
+ EnumChatFormatting.WHITE
+ + String.format(transItem("000", "Stored Heat: %s"), "" + color + getHeatOfStack(aStack)));
+ if (getControlTagOfStack(aStack) == 1) {
+ aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line1"));
+ aList.add(StatCollector.translateToLocal("ic2.reactoritem.heatwarning.line2"));
+ }
+ }
+
+ 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..9c7b7c173c
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_EnergyArmor_Item.java
@@ -0,0 +1,340 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+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;
+import gregtech.api.GregTech_API;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+public class GT_EnergyArmor_Item extends ItemArmor implements ISpecialArmor {
+
+ public static Map<EntityPlayer, Float> jumpChargeMap = new ConcurrentHashMap<>();
+ public int mCharge, mTransfer, mTier, mDamageEnergyCost, mSpecials;
+ public boolean mChargeProvider;
+ public double mArmorAbsorbtionPercentage;
+
+ 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);
+ }
+
+ 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 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(GregTech.getResourcePath(getUnlocalizedName()));
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> 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");
+ }
+
+ @Override
+ public void onArmorTick(World aWorld, EntityPlayer aPlayer, ItemStack aStack) {
+ if (mSpecials == 0) return;
+
+ if (!aPlayer.worldObj.isRemote && (mSpecials & 1) != 0) {
+ int airSupply = aPlayer.getAir();
+ if (GT_ModHandler.canUseElectricItem(aStack, 1000) && airSupply < 50) {
+ aPlayer.setAir(airSupply + 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 jumpCharge = jumpChargeMap.getOrDefault(aPlayer, 1.0F);
+
+ if (GT_ModHandler.canUseElectricItem(aStack, 1000) && aPlayer.onGround && jumpCharge < 1.0F) {
+ jumpCharge = 1.0F;
+ GT_ModHandler.useElectricItem(aStack, 1000, aPlayer);
+ }
+
+ if (aPlayer.motionY >= 0.0D && jumpCharge > 0.0F && !aPlayer.isInWater()) {
+ if (GT_ModHandler.getJumpKeyDown(aPlayer) && GT_ModHandler.getBoostKeyDown(aPlayer)) {
+ if (jumpCharge == 1.0F) {
+ aPlayer.motionX *= 3.5D;
+ aPlayer.motionZ *= 3.5D;
+ }
+
+ aPlayer.motionY += (jumpCharge * 0.3F);
+ jumpCharge = (float) (jumpCharge * 0.75D);
+ } else if (jumpCharge < 1.0F) {
+ jumpCharge = 0.0F;
+ }
+ }
+
+ jumpChargeMap.put(aPlayer, jumpCharge);
+ }
+
+ 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 bonus = 0.22F;
+
+ if (aPlayer.isInWater()) {
+ GT_ModHandler.useElectricItem(aStack, 100, aPlayer);
+ bonus = 0.1F;
+
+ if (aPlayer.motionY > 0) {
+ aPlayer.motionY += 0.10000000149011612D;
+ }
+ }
+
+ aPlayer.moveFlying(0.0F, 1.0F, bonus);
+ }
+ }
+
+ 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 (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 creativeTab, List<ItemStack> outputSubItems) {
+ ItemStack tCharged = new ItemStack(this, 1), tUncharged = new ItemStack(this, 1, getMaxDamage());
+ GT_ModHandler.chargeElectricItem(tCharged, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
+ outputSubItems.add(tCharged);
+ outputSubItems.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 ingredient, ItemStack bookEnchant) {
+ return false;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack toBeRepaired, ItemStack repairWith) {
+ return false;
+ }
+
+ // TODO: @ForgeSubscribe
+ public void onEntityLivingFallEvent(LivingFallEvent event) {
+ if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer player) {
+ for (int i = 0; i < 4; i++) {
+ ItemStack armor = player.inventory.armorInventory[i];
+ if (armor != null && armor.getItem() == this && (mSpecials & 2) != 0) {
+ int distanceFactor = (int) event.distance - 3;
+ int energyCost = (this.mDamageEnergyCost * distanceFactor) / 4;
+ if (energyCost <= GT_ModHandler
+ .dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)) {
+ GT_ModHandler.dischargeElectricItem(armor, energyCost, Integer.MAX_VALUE, true, false, true);
+ event.setCanceled(true);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source,
+ double damage, int slotIndex) {
+ return new ISpecialArmor.ArmorProperties(
+ (source == DamageSource.fall && (mSpecials & 2) != 0) ? 10 : 0,
+ getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage,
+ mDamageEnergyCost > 0 ? 25
+ * GT_ModHandler.dischargeElectricItem(armor, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, true)
+ / mDamageEnergyCost : 0);
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slotIndex) {
+ return (int) Math.round(20.0D * getBaseAbsorptionRatio() * mArmorAbsorbtionPercentage);
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack itemStack, DamageSource source, int damage,
+ int slotIndex) {
+ GT_ModHandler
+ .dischargeElectricItem(itemStack, damage * mDamageEnergyCost, Integer.MAX_VALUE, true, false, true);
+ }
+
+ private double getBaseAbsorptionRatio() {
+ if (mArmorAbsorbtionPercentage <= 0) return 0.00;
+ return switch (this.armorType) {
+ case 0, 3 -> 0.15;
+ case 1 -> 0.40;
+ case 2 -> 0.30;
+ default -> 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..7aaef6d5ca
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Generic_Block.java
@@ -0,0 +1,22 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.GT_Values.W;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.item.ItemBlock;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import gregtech.api.util.GT_LanguageManager;
+
+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");
+ }
+}
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..a1e01c92c7
--- /dev/null
+++ b/src/main/java/gregtech/api/items/GT_Generic_Item.java
@@ -0,0 +1,167 @@
+package gregtech.api.items;
+
+import static gregtech.api.enums.Mods.GregTech;
+
+import java.util.List;
+
+import net.minecraft.block.BlockDispenser;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.dispenser.Behavior