aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/util')
-rw-r--r--src/main/java/gregtech/api/util/GT_BaseCrop.java129
-rw-r--r--src/main/java/gregtech/api/util/GT_CircuitryBehavior.java178
-rw-r--r--src/main/java/gregtech/api/util/GT_Config.java86
-rw-r--r--src/main/java/gregtech/api/util/GT_CoverBehavior.java217
-rw-r--r--src/main/java/gregtech/api/util/GT_CreativeTab.java24
-rw-r--r--src/main/java/gregtech/api/util/GT_FoodStat.java102
-rw-r--r--src/main/java/gregtech/api/util/GT_IBoxableWrapper.java12
-rw-r--r--src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java16
-rw-r--r--src/main/java/gregtech/api/util/GT_LanguageManager.java95
-rw-r--r--src/main/java/gregtech/api/util/GT_Log.java35
-rw-r--r--src/main/java/gregtech/api/util/GT_ModHandler.java1730
-rw-r--r--src/main/java/gregtech/api/util/GT_OreDictUnificator.java332
-rw-r--r--src/main/java/gregtech/api/util/GT_PlayedSound.java28
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java1046
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeRegistrator.java313
-rw-r--r--src/main/java/gregtech/api/util/GT_Shaped_Recipe.java95
-rw-r--r--src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java95
-rw-r--r--src/main/java/gregtech/api/util/GT_SpawnEventHandler.java46
-rw-r--r--src/main/java/gregtech/api/util/GT_Utility.java1791
19 files changed, 6370 insertions, 0 deletions
diff --git a/src/main/java/gregtech/api/util/GT_BaseCrop.java b/src/main/java/gregtech/api/util/GT_BaseCrop.java
new file mode 100644
index 0000000000..e7cef2c598
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_BaseCrop.java
@@ -0,0 +1,129 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+import gregtech.api.enums.ConfigCategories;
+import ic2.api.crops.CropCard;
+import ic2.api.crops.Crops;
+import ic2.api.crops.ICropTile;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+
+public class GT_BaseCrop extends CropCard {
+ private String mName = E, mDiscoveredBy = "Gregorius Techneticies", mAttributes[];
+ private int mTier = 0, mMaxSize = 0, mAfterHarvestSize = 0, mHarvestSize = 0, mStats[] = new int[5];
+ private ItemStack mDrop = null, mSpecialDrops[] = null;
+
+ public static ArrayList<GT_BaseCrop> sCropList = new ArrayList<GT_BaseCrop>();
+
+ /**
+ * To create new Crops
+ * @param aID Default ID
+ * @param aCropName Name of the Crop
+ * @param aDiscoveredBy The one who discovered the Crop
+ * @param aDrop The Item which is dropped by the Crop. must be != null
+ * @param aBaseSeed Baseseed to plant this Crop. null == crossbreed only
+ * @param aTier tier of the Crop. forced to be >= 1
+ * @param aMaxSize maximum Size of the Crop. forced to be >= 3
+ * @param aGrowthSpeed how fast the Crop grows. if < 0 then its set to Tier*300
+ * @param aHarvestSize the size the Crop needs to be harvested. forced to be between 2 and max size
+ */
+ public GT_BaseCrop(int aID, String aCropName, String aDiscoveredBy, ItemStack aDrop, ItemStack[] aSpecialDrops, ItemStack aBaseSeed, int aTier, int aMaxSize, int aGrowthSpeed, int aAfterHarvestSize, int aHarvestSize, int aStatChemical, int aStatFood, int aStatDefensive, int aStatColor, int aStatWeed, String[] aAttributes) {
+ mName = aCropName;
+ aID = GT_Config.addIDConfig(ConfigCategories.IDs.crops, mName.replaceAll(" ", "_"), aID);
+ if (aDiscoveredBy != null && !aDiscoveredBy.equals(E)) mDiscoveredBy = aDiscoveredBy;
+ if (aDrop != null && aID > 0 && aID < 256) {
+ mDrop = GT_Utility.copy(aDrop);
+ mSpecialDrops = aSpecialDrops;
+ mTier = Math.max(1, aTier);
+ mMaxSize = Math.max(3, aMaxSize);
+// mGrowthSpeed = aGrowthSpeed>0?aGrowthSpeed:mTier*300;
+ mHarvestSize = Math.min(Math.max(aHarvestSize, 2), mMaxSize);
+ mAfterHarvestSize = Math.min(Math.max(aAfterHarvestSize, 1), mMaxSize-1);
+ mStats[0] = aStatChemical;
+ mStats[1] = aStatFood;
+ mStats[2] = aStatDefensive;
+ mStats[3] = aStatColor;
+ mStats[4] = aStatWeed;
+ mAttributes = aAttributes;
+ if (!Crops.instance.registerCrop(this, aID)) throw new GT_ItsNotMyFaultException("Make sure the Crop ID is valid!");
+ if (aBaseSeed != null) Crops.instance.registerBaseSeed(aBaseSeed, aID, 1, 1, 1, 1);
+ sCropList.add(this);
+ }
+ }
+
+ @Override
+ public byte getSizeAfterHarvest(ICropTile crop) {
+ return (byte)mAfterHarvestSize;
+ }
+
+ @Override
+ public String[] attributes() {
+ return mAttributes;
+ }
+
+ @Override
+ public String discoveredBy() {
+ return mDiscoveredBy;
+ }
+
+ @Override
+ public final boolean canGrow(ICropTile aCrop) {
+ return aCrop.getSize() < maxSize();
+ }
+
+ @Override
+ public final boolean canBeHarvested(ICropTile aCrop) {
+ return aCrop.getSize() >= mHarvestSize;
+ }
+
+ @Override
+ public boolean canCross(ICropTile aCrop) {
+ return aCrop.getSize() + 2 > maxSize();
+ }
+
+ @Override
+ public int stat(int n) {
+ if (n < 0 || n >= mStats.length) return 0;
+ return mStats[n];
+ }
+
+ @Override
+ public String name() {
+ return mName;
+ }
+
+ @Override
+ public int tier() {
+ return mTier;
+ }
+
+ @Override
+ public int maxSize() {
+ return mMaxSize;
+ }
+
+ @Override
+ public ItemStack getGain(ICropTile aCrop) {
+ int tDrop = 0;
+ if (mSpecialDrops != null && (tDrop = new Random().nextInt(mSpecialDrops.length+4)) < mSpecialDrops.length && mSpecialDrops[tDrop] != null) {
+ return GT_Utility.copy(mSpecialDrops[tDrop]);
+ }
+ return GT_Utility.copy(mDrop);
+ }
+
+ @Override
+ public boolean rightclick(ICropTile aCrop, EntityPlayer aPlayer) {
+ if (!canBeHarvested(aCrop)) return false;
+ return aCrop.harvest(aPlayer==null?false:aPlayer instanceof EntityPlayerMP);
+ }
+
+ @Override
+ public int getOptimalHavestSize(ICropTile crop) {
+ return maxSize();
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java
new file mode 100644
index 0000000000..6cda3c202f
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CircuitryBehavior.java
@@ -0,0 +1,178 @@
+package gregtech.api.util;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IRedstoneCircuitBlock;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+/**
+ * Redstone Circuit Control Code
+ *
+ * This should make everything possible what a Redstone Computer or BuildCraft Gate could do.
+ * It is intended to use this similar to BC-Gates (for acquiring Data) and RP Logic Gates.
+ * You could write an extremely specified and complex Logic Gate, which works only for you Setup, like
+ * with ComputerCraft, but you would have to write an extra Mod to add that, as it doesn't work Ingame.
+ *
+ * One can make use of the fact, that ItemStacks can be stored as Integer, so that you can scan
+ * Inventories for specific Items using that. Luckily the Buttons in the GUI enable Copy/Paste of
+ * ItemID+MetaData to Integer, including the WildCard Damage Value when you use rightclick to place it.
+ * You just need to use @GT_Utility.stackToInt(ItemStack aStack) to get it.
+ *
+ * All Functions run usually in a seperate try/catch Block, so that failed Logic won't crash the TileEntity.
+ */
+public abstract class GT_CircuitryBehavior {
+ /**
+ * @param aIndex 0 - 1023 are my own Indices, so use other Numbers!
+ */
+ public GT_CircuitryBehavior(int aIndex) {
+ GregTech_API.sCircuitryBehaviors.put(aIndex, this);
+ }
+
+ /**
+ * Initializes the Parameters of this Circuit, all Parameters have been set to 0 right before calling this
+ * @param aCircuitData, The Data Storage you can use (8 Slots)
+ * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
+ */
+ public abstract void initParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
+
+ /**
+ * Validates the Parameters of this Circuit when a value has been changed by the GUI
+ * Also called right after @initParameters and when the Chunk reloads
+ * @param aCircuitData, The Data Storage you can use (8 Slots and only the first 4 are User definable)
+ * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
+ */
+ public abstract void validateParameters(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
+
+ /**
+ * Called every tick if the Block has enough Energy and if the Block is Active
+ * @param aCircuitData, The Data Storage you can use (8 Slots)
+ * @param aRedstoneCircuitBlock, The Circuit Block MetaTileEntity itself
+ */
+ public abstract void onTick(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock);
+
+ /**
+ * If the ItemStack should be displayed. Parameters are between 0 and 3.
+ */
+ public abstract boolean displayItemStack(int[] aCircuitData, IRedstoneCircuitBlock aRedstoneCircuitBlock, int aIndex);
+
+ /*****************
+ * GUI Functions *
+ *****************/
+
+ /**
+ * The Name of the Gate for the GUI
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract String getName();
+
+ /**
+ * The Description of the Gate for the GUI
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract String getDescription();
+
+ /**
+ * The Description of the Data Field for the GUI
+ */
+ @SideOnly(Side.CLIENT)
+ public abstract String getDataDescription(int[] aCircuitData, int aCircuitDataIndex);
+
+ /**
+ * How the Integer should be displayed in the GUI.
+ * null means, that it just displays as regular Number.
+ */
+ @SideOnly(Side.CLIENT)
+ public String getDataDisplay(int[] aCircuitData, int aCircuitDataIndex) {
+ return null;
+ }
+
+
+ /****************************
+ * Useful Utility Functions *
+ ****************************/
+
+ /**
+ * returns if there is Redstone applied to any of the valid Inputs (OR)
+ */
+ public static final boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ for (byte i = 0; i < 6; i++) {
+ if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * returns if there is Redstone applied to all the valid Inputs (AND)
+ */
+ public static final boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ for (byte i = 0; i < 6; i++) {
+ if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(i) == 0) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * returns if there is Redstone applied to exactly one of the valid Inputs (XOR)
+ */
+ public static final boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ int tRedstoneAmount = 0;
+ for (byte i = 0; i < 6; i++) {
+ if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(i) > 0) {
+ tRedstoneAmount++;
+ }
+ }
+ }
+ return tRedstoneAmount == 1;
+ }
+
+ /**
+ * returns the strongest incoming RS-Power
+ */
+ public static final byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ byte tRedstoneAmount = 0;
+ for (byte i = 0; i < 6; i++) {
+ if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
+ tRedstoneAmount = (byte)Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i));
+ }
+ }
+ return tRedstoneAmount;
+ }
+
+ /**
+ * returns the weakest incoming non-zero RS-Power
+ */
+ public static final byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0;
+ byte tRedstoneAmount = 15;
+ for (byte i = 0; i < 6; i++) {
+ if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
+ if (aRedstoneCircuitBlock.getInputRedstone(i) > 0)
+ tRedstoneAmount = (byte)Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i));
+ }
+ }
+ return tRedstoneAmount;
+ }
+
+ /**
+ * returns the weakest incoming RS-Power
+ */
+ public static final byte getWeakestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) {
+ if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0;
+ byte tRedstoneAmount = 15;
+ for (byte i = 0; i < 6; i++) {
+ if (i != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(i).letsRedstoneGoIn(i, aRedstoneCircuitBlock.getCoverID(i), aRedstoneCircuitBlock.getCoverVariable(i), aRedstoneCircuitBlock.getOwnTileEntity())) {
+ tRedstoneAmount = (byte)Math.min(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(i));
+ }
+ }
+ return tRedstoneAmount;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_Config.java b/src/main/java/gregtech/api/util/GT_Config.java
new file mode 100644
index 0000000000..9ad2ebab50
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_Config.java
@@ -0,0 +1,86 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+import static gregtech.api.enums.GT_Values.F;
+import gregtech.api.GregTech_API;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+public class GT_Config implements Runnable {
+ public static boolean troll = F;
+
+ public static Configuration sConfigFileIDs;
+
+ public static int addIDConfig(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = sConfigFileIDs.get(aCategory.toString().replaceAll("\\|", "."), aName.replaceAll("\\|", "."), aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) sConfigFileIDs.save();
+ return rResult;
+ }
+
+ public final Configuration mConfig;
+
+ public GT_Config(Configuration aConfig) {
+ mConfig = aConfig;
+ mConfig.load();
+ mConfig.save();
+ GregTech_API.sAfterGTPreload.add(this); // in case of crash on startup
+ GregTech_API.sAfterGTLoad.add(this); // in case of crash on startup
+ GregTech_API.sAfterGTPostload.add(this);
+ }
+
+ public static String getStackConfigName(ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return E;
+ Object rName = GT_OreDictUnificator.getAssociation(aStack);
+ if (rName != null) return rName.toString();
+ try {if (GT_Utility.isStringValid(rName = aStack.getUnlocalizedName())) return rName.toString();} catch (Throwable e) {/*Do nothing*/}
+ String sName = aStack.getItem().toString();
+ String[] tmp = sName.split("@");
+ if(tmp.length>0)sName=tmp[0];
+ return sName + "." + aStack.getItemDamage();
+ }
+
+ public boolean get(Object aCategory, ItemStack aStack, boolean aDefault) {
+ String aName = getStackConfigName(aStack);
+ return get(aCategory, aName , aDefault);
+ }
+
+ public boolean get(Object aCategory, String aName, boolean aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(aCategory.toString().replaceAll("\\|", "_"), (aName+"_"+aDefault).replaceAll("\\|", "_"), aDefault);
+ boolean rResult = tProperty.getBoolean(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public int get(Object aCategory, ItemStack aStack, int aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public int get(Object aCategory, String aName, int aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(aCategory.toString().replaceAll("\\|", "_"), (aName+"_"+aDefault).replaceAll("\\|", "_"), aDefault);
+ int rResult = tProperty.getInt(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ public double get(Object aCategory, ItemStack aStack, double aDefault) {
+ return get(aCategory, getStackConfigName(aStack), aDefault);
+ }
+
+ public double get(Object aCategory, String aName, double aDefault) {
+ if (GT_Utility.isStringInvalid(aName)) return aDefault;
+ Property tProperty = mConfig.get(aCategory.toString().replaceAll("\\|", "_"), (aName+"_"+aDefault).replaceAll("\\|", "_"), aDefault);
+ double rResult = tProperty.getDouble(aDefault);
+ if (!tProperty.wasRead() && GregTech_API.sPostloadFinished) mConfig.save();
+ return rResult;
+ }
+
+ @Override
+ public void run() {
+ mConfig.save();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_CoverBehavior.java b/src/main/java/gregtech/api/util/GT_CoverBehavior.java
new file mode 100644
index 0000000000..cfc75f36b8
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CoverBehavior.java
@@ -0,0 +1,217 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+import gregtech.api.interfaces.tileentity.ICoverable;
+import gregtech.api.objects.GT_ItemStack;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+
+/**
+ * For Covers with a special behavior.
+ */
+public abstract class GT_CoverBehavior {
+ /**
+ * Called by updateEntity inside the covered TileEntity. aCoverVariable is the Value you returned last time.
+ */
+ public int doCoverThings(byte aSide, byte aInputRedstone, int aCoverID, int aCoverVariable, ICoverable aTileEntity, long aTimer) {
+ return aCoverVariable;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover.
+ *
+ * return true, if something actually happens.
+ */
+ public boolean onCoverRightclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return false;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover Client Side
+ *
+ * return true, if something actually happens.
+ */
+ public boolean onCoverRightclickClient(byte aSide, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return false;
+ }
+
+ /**
+ * Called when someone rightclicks this Cover with a Screwdriver. Doesn't call @onCoverRightclick in this Case.
+ *
+ * return the new Value of the Cover Variable
+ */
+ public int onCoverScrewdriverclick(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ return aCoverVariable;
+ }
+
+ /**
+ * Checks if the Cover can be placed on this.
+ */
+ public boolean isCoverPlaceable(byte aSide, GT_ItemStack aStack, ICoverable aTileEntity) {
+ return true;
+ }
+
+ /**
+ * Removes the Cover if this returns true, or if aForced is true.
+ * Doesn't get called when the Machine Block is getting broken, only if you break the Cover away from the Machine.
+ */
+ public boolean onCoverRemoval(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity, boolean aForced) {
+ return true;
+ }
+
+ /**
+ * Gives a small Text for the status of the Cover.
+ */
+ public String getDescription(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return E;
+ }
+
+ /**
+ * How Blast Proof the Cover is. 30 is normal.
+ */
+ public float getBlastProofLevel(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 10.0F;
+ }
+
+ /**
+ * If it lets RS-Signals into the Block
+ *
+ * This is just Informative so that Machines know if their Redstone Input is blocked or not
+ */
+ public boolean letsRedstoneGoIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets RS-Signals out of the Block
+ */
+ public boolean letsRedstoneGoOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Fibre-Signals into the Block
+ *
+ * This is just Informative so that Machines know if their Redstone Input is blocked or not
+ */
+ public boolean letsFibreGoIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Fibre-Signals out of the Block
+ */
+ public boolean letsFibreGoOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Energy into the Block
+ */
+ public boolean letsEnergyIn(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Energy out of the Block
+ */
+ public boolean letsEnergyOut(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Liquids into the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ public boolean letsFluidIn(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Liquids out of the Block, aFluid can be null meaning if this is generally allowing Fluids or not.
+ */
+ public boolean letsFluidOut(byte aSide, int aCoverID, int aCoverVariable, Fluid aFluid, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Items into the Block, aSlot = -1 means if it is generally accepting Items (return false for no Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each Slot).
+ */
+ public boolean letsItemsIn(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets Items out of the Block, aSlot = -1 means if it is generally accepting Items (return false for no Interaction at all), aSlot = -2 means if it would accept for all Slots (return true to skip the Checks for each Slot).
+ */
+ public boolean letsItemsOut(byte aSide, int aCoverID, int aCoverVariable, int aSlot, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * If it lets you rightclick the Machine normally
+ */
+ public boolean isGUIClickable(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * Needs to return true for Covers, which have a Redstone Output on their Facing.
+ */
+ public boolean manipulatesSidedRedstoneOutput(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * if this Cover should let Pipe Connections look connected even if it is not the case.
+ */
+ public boolean alwaysLookConnected(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return false;
+ }
+
+ /**
+ * Called to determine the incoming Redstone Signal of a Machine.
+ * Returns the original Redstone per default.
+ * The Cover should @letsRedstoneGoIn or the aInputRedstone Parameter is always 0.
+ */
+ public byte getRedstoneInput(byte aSide, byte aInputRedstone, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return letsRedstoneGoIn(aSide, aCoverID, aCoverVariable, aTileEntity)?aInputRedstone:0;
+ }
+
+ /**
+ * Gets the Tick Rate for doCoverThings of the Cover
+ *
+ * 0 = No Ticks! Yes, 0 is Default, you have to override this
+ */
+ public int getTickRate(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return 0;
+ }
+
+ /**
+ * If this is a simple Cover, which can also be used on Bronze Machines and similar.
+ */
+ public boolean isSimpleCover() {
+ return false;
+ }
+
+ /**
+ * The MC Color of this Lens. -1 for no Color (meaning this isn't a Lens then).
+ */
+ public byte getLensColor(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return -1;
+ }
+
+ /**
+ * @return the ItemStack dropped by this Cover
+ */
+ public ItemStack getDrop(byte aSide, int aCoverID, int aCoverVariable, ICoverable aTileEntity) {
+ return GT_OreDictUnificator.get(true, aTileEntity.getCoverItemAtSide(aSide));
+ }
+
+ /**
+ * @return sets the Cover upon placement.
+ */
+ public void placeCover(byte aSide, ItemStack aCover, ICoverable aTileEntity) {
+ aTileEntity.setCoverIDAtSide(aSide, GT_Utility.stackToInt(aCover));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_CreativeTab.java b/src/main/java/gregtech/api/util/GT_CreativeTab.java
new file mode 100644
index 0000000000..d789fdc8a5
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_CreativeTab.java
@@ -0,0 +1,24 @@
+package gregtech.api.util;
+
+import gregtech.api.enums.ItemList;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public class GT_CreativeTab extends CreativeTabs {
+ public GT_CreativeTab(String aName, String aLocalName) {
+ super("GregTech." + aName);
+ GT_LanguageManager.addStringLocalization("itemGroup.GregTech." + aName, aLocalName);
+ }
+
+ @Override
+ public ItemStack getIconItemStack() {
+ return ItemList.Tool_Cheat.get(1, new ItemStack(Blocks.iron_block, 1));
+ }
+
+ @Override
+ public Item getTabIconItem() {
+ return ItemList.Circuit_Integrated.getItem();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_FoodStat.java b/src/main/java/gregtech/api/util/GT_FoodStat.java
new file mode 100644
index 0000000000..a2134290cf
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_FoodStat.java
@@ -0,0 +1,102 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.F;
+import gregtech.api.damagesources.GT_DamageSources;
+import gregtech.api.interfaces.IFoodStat;
+import gregtech.api.items.GT_MetaBase_Item;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.EnumAction;
+import net.minecraft.item.ItemStack;
+import net.minecraft.potion.PotionEffect;
+
+public class GT_FoodStat implements IFoodStat {
+ private final int mFoodLevel;
+ private final int[] mPotionEffects;
+ private final float mSaturation;
+ private final EnumAction mAction;
+ private final ItemStack mEmptyContainer;
+ private final boolean mAlwaysEdible, mInvisibleParticles, mIsRotten;
+ private boolean mExplosive = F, mMilk = F;
+
+ /**
+ * @param aFoodLevel Amount of Food in Half Bacon [0 - 20]
+ * @param aSaturation Amount of Saturation [0.0F - 1.0F]
+ * @param aAction The Action to be used. If this is null, it uses the Eating Action
+ * @param aEmptyContainer An empty Container (Optional)
+ * @param aAlwaysEdible If this Item is always edible, like Golden Apples or Potions
+ * @param aInvisibleParticles If the Particles of the Potion Effects are invisible
+ * @param aPotionEffects An Array of Potion Effects with %4==0 Elements as follows
+ * ID of a Potion Effect. 0 for none
+ * Duration of the Potion in Ticks
+ * Level of the Effect. [0, 1, 2] are for [I, II, III]
+ * The likelihood that this Potion Effect takes place upon being eaten [1 - 100]
+ */
+ public GT_FoodStat(int aFoodLevel, float aSaturation, EnumAction aAction, ItemStack aEmptyContainer, boolean aAlwaysEdible, boolean aInvisibleParticles, boolean aIsRotten, int... aPotionEffects) {
+ mFoodLevel = aFoodLevel;
+ mSaturation = aSaturation;
+ mAction = aAction==null?EnumAction.eat:aAction;
+ mPotionEffects = aPotionEffects;
+ mEmptyContainer = GT_Utility.copy(aEmptyContainer);
+ mInvisibleParticles = aInvisibleParticles;
+ mAlwaysEdible = aAlwaysEdible;
+ mIsRotten = aIsRotten;
+ }
+
+ public GT_FoodStat setExplosive() {
+ mExplosive = true;
+ return this;
+ }
+
+ public GT_FoodStat setMilk() {
+ mMilk = true;
+ return this;
+ }
+
+ @Override
+ public int getFoodLevel(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mFoodLevel;
+ }
+
+ @Override
+ public float getSaturation(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mSaturation;
+ }
+
+ @Override
+ public void onEaten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ aStack.stackSize--;
+ ItemStack tStack = GT_OreDictUnificator.get(GT_Utility.copy(mEmptyContainer));
+ if (tStack != null && !aPlayer.inventory.addItemStackToInventory(tStack)) aPlayer.dropPlayerItemWithRandomChoice(tStack, true);
+ aPlayer.worldObj.playSoundAtEntity(aPlayer, "random.burp", 0.5F, aPlayer.worldObj.rand.nextFloat() * 0.1F + 0.9F);
+ if (!aPlayer.worldObj.isRemote) {
+ if (mMilk) {
+ aPlayer.curePotionEffects(new ItemStack(Items.milk_bucket, 1, 0));
+ }
+ for (int i = 3; i < mPotionEffects.length; i+=4) {
+ if (aPlayer.worldObj.rand.nextInt(100) < mPotionEffects[i]) {
+ aPlayer.addPotionEffect(new PotionEffect(mPotionEffects[i-3], mPotionEffects[i-2], mPotionEffects[i-1], mInvisibleParticles));
+ }
+ }
+ if (mExplosive) {
+ aPlayer.worldObj.newExplosion(aPlayer, aPlayer.posX, aPlayer.posY, aPlayer.posZ, 4, true, true);
+ aPlayer.attackEntityFrom(GT_DamageSources.getExplodingDamage(), Float.MAX_VALUE);
+ }
+ }
+ }
+
+ @Override
+ public EnumAction getFoodAction(GT_MetaBase_Item aItem, ItemStack aStack) {
+ return mAction;
+ }
+
+ @Override
+ public boolean alwaysEdible(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mAlwaysEdible;
+ }
+
+ @Override
+ public boolean isRotten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
+ return mIsRotten;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java b/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java
new file mode 100644
index 0000000000..8511f76c49
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_IBoxableWrapper.java
@@ -0,0 +1,12 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.T;
+import ic2.api.item.IBoxable;
+import net.minecraft.item.ItemStack;
+
+public class GT_IBoxableWrapper implements IBoxable {
+ @Override
+ public boolean canBeStoredInToolbox(ItemStack itemstack) {
+ return T;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java b/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java
new file mode 100644
index 0000000000..0c15970429
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java
@@ -0,0 +1,16 @@
+package gregtech.api.util;
+
+public class GT_ItsNotMyFaultException extends RuntimeException {
+ private static final long serialVersionUID = -8752778866486460495L;
+
+ private String mError;
+
+ public GT_ItsNotMyFaultException(String aError) {
+ mError = aError;
+ }
+
+ @Override
+ public String toString() {
+ return "The GregTech-Addon has a Problem.\nIT'S NOT MY FAULT!!! Below is how to fix it.\n" + mError + "\nDO NOT COME TO ME WITH THIS CRASH. YOU CAUSED IT YOURSELF, AND I TOLD YOU HOW TO FIX IT!!!";
+ }
+} \ No newline at end of file
diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java
new file mode 100644
index 0000000000..b419b7100f
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java
@@ -0,0 +1,95 @@
+package gregtech.api.util;
+
+import static gregtech.api.enums.GT_Values.E;
+import gregtech.api.GregTech_API;
+
+import java.util.HashMap;
+import java.util.Map.Entry;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+import cpw.mods.fml.common.registry.LanguageRegistry;
+
+public class GT_LanguageManager {
+ public static Configuration sEnglishFile;
+
+ public static final HashMap<String, String> TEMPMAP = new HashMap<String, String>(), BUFFERMAP = new HashMap<String, String>();
+
+ public static String addStringLocalization(String aKey, String aEnglish) {
+ return addStringLocalization(aKey, aEnglish, true);
+ }
+
+ public static String addStringLocalization(String aKey, String aEnglish, boolean aWriteIntoLangFile) {
+ if (aKey == null) return E;
+ if (aWriteIntoLangFile) aEnglish = writeToLangFile(aKey, aEnglish);
+ TEMPMAP.put(aKey.trim(), aEnglish);</