aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/core/util
diff options
context:
space:
mode:
authorAlkalus <3060479+draknyte1@users.noreply.github.com>2019-12-30 01:48:09 +0000
committerGitHub <noreply@github.com>2019-12-30 01:48:09 +0000
commit5af823e80a611090216375fecd3794d345446830 (patch)
treec54a19977b4a25cb86f54394eb9711aaf268efe3 /src/Java/gtPlusPlus/core/util
parenta731e939c6b9a70ac9fd444dbf06243f63f29c06 (diff)
parentcc825179dce70a5f2c4a13730639e3300243e21a (diff)
downloadGT5-Unofficial-5af823e80a611090216375fecd3794d345446830.tar.gz
GT5-Unofficial-5af823e80a611090216375fecd3794d345446830.tar.bz2
GT5-Unofficial-5af823e80a611090216375fecd3794d345446830.zip
Merge pull request #525 from alkcorp/DevTop
+ 6 Months of work, let's get the ball rolling.
Diffstat (limited to 'src/Java/gtPlusPlus/core/util')
-rw-r--r--src/Java/gtPlusPlus/core/util/Utils.java48
-rw-r--r--src/Java/gtPlusPlus/core/util/data/ArrayUtils.java17
-rw-r--r--src/Java/gtPlusPlus/core/util/math/MathUtils.java70
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/ClientUtils.java18
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/FluidUtils.java56
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java9
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java182
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/LangUtils.java56
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/MaterialUtils.java5
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/OreDictUtils.java25
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java143
-rw-r--r--src/Java/gtPlusPlus/core/util/reflect/OreDictUtils.java7
-rw-r--r--src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java260
13 files changed, 736 insertions, 160 deletions
diff --git a/src/Java/gtPlusPlus/core/util/Utils.java b/src/Java/gtPlusPlus/core/util/Utils.java
index bb1d9064e8..c73f9ee7a4 100644
--- a/src/Java/gtPlusPlus/core/util/Utils.java
+++ b/src/Java/gtPlusPlus/core/util/Utils.java
@@ -2,13 +2,23 @@ package gtPlusPlus.core.util;
import java.awt.Color;
import java.awt.Graphics;
-import java.io.*;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
import javax.xml.bind.DatatypeConverter;
@@ -17,30 +27,15 @@ import org.apache.commons.lang3.EnumUtils;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
-import net.minecraft.block.Block;
-import net.minecraft.client.Minecraft;
-import net.minecraft.entity.Entity;
-import net.minecraft.item.Item.ToolMaterial;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraft.nbt.NBTTagString;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.util.ChatComponentText;
-import net.minecraft.util.IChatComponent;
-import net.minecraft.world.World;
-
import gregtech.GT_Mod;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
-import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.TC_Aspects;
import gregtech.api.enums.TC_Aspects.TC_AspectStack;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_Utility;
-
import gtPlusPlus.GTplusplus;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.api.objects.data.AutoMap;
@@ -59,6 +54,18 @@ import gtPlusPlus.plugin.villagers.tile.TileEntityGenericSpawner;
import ic2.core.Ic2Items;
import ic2.core.init.InternalName;
import ic2.core.item.resources.ItemCell;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.Entity;
+import net.minecraft.item.Item.ToolMaterial;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.IChatComponent;
+import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fluids.FluidContainerRegistry;
@@ -73,6 +80,10 @@ public class Utils {
public static final boolean isServer() {
return FMLCommonHandler.instance().getEffectiveSide().isServer();
}
+
+ public static final boolean isClient() {
+ return FMLCommonHandler.instance().getEffectiveSide().isClient();
+ }
static class ShortTimerTask extends TimerTask {
@Override
@@ -367,9 +378,6 @@ public class Utils {
}
final Color c = new Color(r, g, b);
String temp = Integer.toHexString(c.getRGB() & 0xFFFFFF).toUpperCase();
-
- // System.out.println( "hex: " + Integer.toHexString( c.getRGB() &
- // 0xFFFFFF ) + " hex value:"+temp);
temp = Utils.appenedHexNotationToString(String.valueOf(temp));
Logger.WARNING("Made " + temp + " - Hopefully it's not a mess.");
Logger.WARNING("It will decode into " + Integer.decode(temp) + ".");
diff --git a/src/Java/gtPlusPlus/core/util/data/ArrayUtils.java b/src/Java/gtPlusPlus/core/util/data/ArrayUtils.java
index cca58467ef..3e96220995 100644
--- a/src/Java/gtPlusPlus/core/util/data/ArrayUtils.java
+++ b/src/Java/gtPlusPlus/core/util/data/ArrayUtils.java
@@ -1,10 +1,15 @@
package gtPlusPlus.core.util.data;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
-import net.minecraft.item.ItemStack;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.api.objects.data.AutoMap;
+import net.minecraft.item.ItemStack;
public class ArrayUtils {
@@ -75,5 +80,13 @@ public class ArrayUtils {
}
}
+ public static String toString(Object[] aArray, String string) {
+ return org.apache.commons.lang3.ArrayUtils.toString(aArray, string);
+ }
+
+ public static String toString(Object[] aArray) {
+ return org.apache.commons.lang3.ArrayUtils.toString(aArray);
+ }
+
}
diff --git a/src/Java/gtPlusPlus/core/util/math/MathUtils.java b/src/Java/gtPlusPlus/core/util/math/MathUtils.java
index bda722b47e..2f4db2efcc 100644
--- a/src/Java/gtPlusPlus/core/util/math/MathUtils.java
+++ b/src/Java/gtPlusPlus/core/util/math/MathUtils.java
@@ -13,6 +13,8 @@ import gtPlusPlus.core.util.Utils;
public class MathUtils {
+ final static Random rand = CORE.RANDOM;
+
/**
* Returns a psuedo-random number between min and max, inclusive.
* The difference between min and max can be at most
@@ -23,9 +25,6 @@ public class MathUtils {
* @return Integer between min and max, inclusive.
* @see java.util.Random#nextInt(int)
*/
-
- final static Random rand = CORE.RANDOM;
-
public static int randInt(final int min, final int max) {
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
@@ -692,6 +691,39 @@ public class MathUtils {
public static int balance(int aInput, int aMin, int aMax) {
return Math.max(Math.min(aInput, aMax), aMin);
}
+
+ /**
+ * Balances a number within a range.
+ * @param aInput - The number to balance
+ * @param aMin - The minimum bounds
+ * @param aMax - The maximum bounds
+ * @return - A Number which will be between the bounds, or a boundary value.
+ */
+ public static Number balance(Number aInput, Number aMin, Number aMax) {
+ return max(min(aInput, aMax), aMin);
+ }
+
+ /**
+ * Balances a number within a range.
+ * @param aInput - The number to balance
+ * @param aMin - The minimum bounds
+ * @param aMax - The maximum bounds
+ * @return - An Integer which will be between the bounds, or a boundary value.
+ */
+ public static int balanceInt(Number aInput, Number aMin, Number aMax) {
+ return MathUtils.safeCast_LongToInt((long) balance(max(min(aInput, aMax), aMin), Integer.MIN_VALUE, Integer.MAX_VALUE));
+ }
+
+ /**
+ * Balances a number within a range.
+ * @param aInput - The number to balance
+ * @param aMin - The minimum bounds
+ * @param aMax - The maximum bounds
+ * @return - A Long which will be between the bounds, or a boundary value.
+ */
+ public static long balanceLong(Number aInput, Number aMin, Number aMax) {
+ return (long) balance(max(min(aInput, aMax), aMin), Long.MIN_VALUE, Long.MAX_VALUE);
+ }
public static int getValueWithinRange(int i, int aMin, int aMax) {
int aAmount = Math.max(Math.min(i, aMax), aMin);
@@ -703,5 +735,37 @@ public class MathUtils {
int aRemainder = (int) (aLong - (aIntMaxInLong * Integer.MAX_VALUE));
return new Pair<Integer, Integer>(aIntMaxInLong, aRemainder);
}
+
+
+
+
+ /**
+ * Returns the smaller of two {@code Number}s. That is,
+ * the result the argument closer to the value of
+ * {@link Long#MIN_VALUE}. If the arguments have the same
+ * value, the result is that same value.
+ *
+ * @param a an argument.
+ * @param b another argument.
+ * @return the smaller of {@code a} and {@code b}.
+ */
+ public static Number min(Number a, Number b) {
+ return (a.longValue() <= b.longValue()) ? a : b;
+ }
+
+ /**
+ * Returns the greater of two {@code Number}s. That is, the
+ * result is the argument closer to the value of
+ * {@link Long#MAX_VALUE}. If the arguments have the same value,
+ * the result is that same value.
+ *
+ * @param a an argument.
+ * @param b another argument.
+ * @return the larger of {@code a} and {@code b}.
+ */
+ public static Number max(Number a, Number b) {
+ return (a.longValue() >= b.longValue()) ? a : b;
+ }
+
}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/ClientUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/ClientUtils.java
new file mode 100644
index 0000000000..806f83d830
--- /dev/null
+++ b/src/Java/gtPlusPlus/core/util/minecraft/ClientUtils.java
@@ -0,0 +1,18 @@
+package gtPlusPlus.core.util.minecraft;
+
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.relauncher.Side;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+
+public class ClientUtils {
+
+ static {
+ if (FMLCommonHandler.instance().getSide() == Side.SERVER) {
+ Logger.ERROR("Something tried to access the ClientUtils class from the Server Side.");
+ Logger.ERROR("Soft crashing to prevent data corruption.");
+ CORE.crash();
+ }
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/FluidUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/FluidUtils.java
index 09263bb639..d7b6bc0a30 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/FluidUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/FluidUtils.java
@@ -6,15 +6,17 @@ import net.minecraft.item.ItemStack;
import gregtech.api.enums.Dyes;
import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
import gregtech.api.util.GT_LanguageManager;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.api.objects.minecraft.FluidGT6;
import gtPlusPlus.core.item.base.BaseItemComponent;
import gtPlusPlus.core.item.base.cell.BaseItemPlasmaCell;
+import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.material.Material;
-import gtPlusPlus.core.material.MaterialGenerator;
import gtPlusPlus.core.material.MaterialStack;
+import gtPlusPlus.core.recipe.common.CI;
import gtPlusPlus.core.util.Utils;
import gtPlusPlus.xmod.gregtech.api.enums.GregtechOrePrefixes.GT_Materials;
import net.minecraftforge.fluids.*;
@@ -147,7 +149,7 @@ public class FluidUtils {
public static Fluid addGtFluid(final String aName, final String aLocalized, final GT_Materials aMaterial, final int aState, final long aTemperatureK, final ItemStack aFullContainer, final ItemStack aEmptyContainer, final int aFluidAmount, final boolean aGenerateCell) {
- Fluid g = addGTFluid(aName, "fluid.autogenerated", aLocalized, aMaterial.mRGBa, aState, aTemperatureK, aFullContainer, aEmptyContainer, aFluidAmount, aGenerateCell);
+ Fluid g = addGTFluid(aName, "fluid.autogenerated", aLocalized, aMaterial != null ? aMaterial.mRGBa : new short[]{255, 255, 255, 0}, aState, aTemperatureK, aFullContainer, aEmptyContainer, aFluidAmount, aGenerateCell);
if (g != null) {
if (aMaterial != null) {
switch (aState) {
@@ -203,7 +205,7 @@ public class FluidUtils {
ItemStack temp = null;
//Generate a Cell if we need to
if (ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cellPlasma"+aMaterial.getUnlocalizedName(), 1) == null){
- final Item temp2 = new BaseItemPlasmaCell(aMaterial);
+ new BaseItemPlasmaCell(aMaterial);
temp = aMaterial.getPlasmaCell(1);
}
else {
@@ -308,7 +310,7 @@ public class FluidUtils {
rFluid.setTemperature((int) (aTemperatureK));
}
if ((aFullContainer != null) && (aEmptyContainer != null) && !FluidContainerRegistry.registerFluidContainer(new FluidStack(rFluid, aFluidAmount), aFullContainer, aEmptyContainer)) {
- MaterialGenerator.addFluidCannerRecipe(aFullContainer, container(aFullContainer, false), null, new FluidStack(rFluid, aFluidAmount));
+ CORE.RA.addFluidCannerRecipe(CI.emptyCells(1), aFullContainer, new FluidStack(rFluid, aFluidAmount));
}
else {
//Utils.LOG_INFO("Failed creating recipes to fill/empty cells of "+aName+".");
@@ -460,21 +462,17 @@ public class FluidUtils {
aGenerateCell);
if (dustStack != null){
- MaterialGenerator.addFluidExtractionRecipe(
- dustStack, //Input
- null, //Input 2
+ CORE.RA.addFluidExtractionRecipe(
+ dustStack, //Input 2
FluidUtils.getFluidStack(gtFluid, amountPerItem), //Fluid Output
- 0, //Chance
1*20, //Duration
16 //Eu Tick
);
}
if (dustStack2 != null){
- MaterialGenerator.addFluidExtractionRecipe(
- dustStack2, //Input
- null, //Input 2
+ CORE.RA.addFluidExtractionRecipe(
+ dustStack2, //Input 2
FluidUtils.getFluidStack(gtFluid, amountPerItem), //Fluid Output
- 0, //Chance
1*20, //Duration
16 //Eu Tick
);
@@ -564,12 +562,12 @@ public class FluidUtils {
}
public static FluidStack getWildcardFluidStack(String aFluidName, int amount) {
- FluidStack aFStack1 = (FluidUtils.getFluidStack("molten"+"."+aFluidName.toLowerCase(), 1));
- FluidStack aFStack2 = (FluidUtils.getFluidStack("fluid"+"."+aFluidName.toLowerCase(), 1));
- FluidStack aFStack3 = (FluidUtils.getFluidStack(aFluidName.toLowerCase(), 1));
- FluidStack aFStack4 = (FluidUtils.getFluidStack(aFluidName, 1));
- FluidStack aFStack5 = (FluidUtils.getFluidStack("liquid_"+aFluidName.toLowerCase(), 1));
- FluidStack aFStack6 = (FluidUtils.getFluidStack("liquid"+"."+aFluidName.toLowerCase(), 1));
+ FluidStack aFStack1 = (FluidUtils.getFluidStack("molten"+"."+aFluidName.toLowerCase(), amount));
+ FluidStack aFStack2 = (FluidUtils.getFluidStack("fluid"+"."+aFluidName.toLowerCase(), amount));
+ FluidStack aFStack3 = (FluidUtils.getFluidStack(aFluidName.toLowerCase(), amount));
+ FluidStack aFStack4 = (FluidUtils.getFluidStack(aFluidName, amount));
+ FluidStack aFStack5 = (FluidUtils.getFluidStack("liquid_"+aFluidName.toLowerCase(), amount));
+ FluidStack aFStack6 = (FluidUtils.getFluidStack("liquid"+"."+aFluidName.toLowerCase(), amount));
if (aFStack1 != null) {
return aFStack1;
}
@@ -590,6 +588,28 @@ public class FluidUtils {
}
return null;
}
+
+ public static FluidStack getWildcardFluidStack(Materials aMaterial, int amount) {
+ FluidStack aFStack1 = aMaterial.getFluid(amount);
+ FluidStack aFStack2 = aMaterial.getGas(amount);
+ FluidStack aFStack3 = aMaterial.getMolten(amount);
+ FluidStack aFStack4 = aMaterial.getSolid(amount);
+ if (aFStack1 != null) {
+ return aFStack1;
+ }
+ else if (aFStack2 != null) {
+ return aFStack2;
+ }
+ else if (aFStack3 != null) {
+ return aFStack3;
+ }
+ else if (aFStack4 != null) {
+ return aFStack4;
+ }
+ else {
+ return null;
+ }
+ }
}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java
index c529f60ba1..d69dd5d66e 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java
@@ -306,7 +306,14 @@ public class HazmatUtils {
//Logger.INFO("[Hazmat] Item was mapped for TTs");
Collections.sort(aTempTooltipData);
//Logger.INFO("[Hazmat] Sorted TTs");
- return aTempTooltipData.toArray();
+
+ String[] mBuiltOutput = new String[aTempTooltipData.size()];
+ int aIndex = 0;
+ for (String i : aTempTooltipData) {
+ mBuiltOutput[aIndex++] = i;
+ }
+
+ return mBuiltOutput;
}
}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java
index adeaf8c8ad..cb490203df 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java
@@ -7,6 +7,7 @@ import java.util.Map;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
+import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
@@ -30,6 +31,7 @@ import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.lib.LoadedMods;
import gtPlusPlus.core.material.Material;
import gtPlusPlus.core.util.Utils;
+import gtPlusPlus.core.util.math.MathUtils;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
import gtPlusPlus.xmod.gregtech.api.items.Gregtech_MetaTool;
import gtPlusPlus.xmod.gregtech.common.items.MetaGeneratedGregtechTools;
@@ -41,10 +43,11 @@ import net.minecraft.init.Items;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.Item.ToolMaterial;
-import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
+import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.oredict.OreDictionary;
@@ -57,13 +60,13 @@ public class ItemUtils {
public static ItemStack getSimpleStack(final Block x) {
return simpleMetaStack(Item.getItemFromBlock(x), 0, 1);
}
-
+
public static ItemStack getSimpleStack(final Block x, int i) {
if (i == 0) {
return getSimpleStack(x, i, 1);
}
-
+
return getSimpleStack(x, 0, i);
}
@@ -205,29 +208,28 @@ public class ItemUtils {
}
}
- @SuppressWarnings("unused")
- public static ItemStack simpleMetaStack(final Item item, final int meta, final int size) {
- try {
- if (item == null) {
- return null;
- }
- Item em = item;
- final Item em1 = item;
- Logger.WARNING("Found: " + em1.getUnlocalizedName() + ":" + meta);
- if (em1 != null) {
- if (null == em) {
- em = em1;
- }
- if (em != null) {
- final ItemStack metaStack = new ItemStack(em, size, meta);
- return metaStack;
- }
- }
- return null;
- } catch (final NullPointerException e) {
- // Utils.LOG_ERROR(item.getUnlocalizedName()+" not found. [NULL]");
+ public static ItemStack simpleMetaStack(ItemStack simpleStack, int meta, int size) {
+ return simpleMetaStack(simpleStack.getItem(), meta, size);
+ }
+
+ public static ItemStack simpleMetaStack(final Item item, int meta, int size) {
+ if (item == null) {
return null;
}
+ if (meta < 0 || meta > Short.MAX_VALUE) {
+ meta = 0;
+ }
+ if (size < 0 || size > 64) {
+ size = 1;
+ }
+ //Logger.INFO("Found Metastack: " + item.getUnlocalizedName() + ":" + meta);
+ //Logger.INFO(""+ReflectionUtils.getMethodName(0));
+ //Logger.INFO(""+ReflectionUtils.getMethodName(1));
+ //Logger.INFO(""+ReflectionUtils.getMethodName(2));
+ //Logger.INFO(""+ReflectionUtils.getMethodName(3));
+ //Logger.INFO(""+ReflectionUtils.getMethodName(4));
+ final ItemStack metaStack = new ItemStack(item, size, meta);
+ return metaStack;
}
public static ItemStack simpleMetaStack(final Block block, final int meta, final int size) {
@@ -302,9 +304,9 @@ public class ItemUtils {
else {
mTemp = Utils.sanitizeString(mTemp);
}
-
-
-
+
+
+
if (oredictName.contains("rod")) {
String s = "stick"+oredictName.substring(3);
oredictName = s;
@@ -371,7 +373,7 @@ public class ItemUtils {
return returnValue.copy();
}
}
-
+
Logger.RECIPE(oredictName + " was not valid.");
return null;
} catch (final Throwable t) {
@@ -402,7 +404,7 @@ public class ItemUtils {
new BaseItemDustUnique("itemDust" + unlocalizedName, materialName, mChemForm, Colour, "Dust"),
new BaseItemDustUnique("itemDustSmall" + unlocalizedName, materialName, mChemForm, Colour, "Small"),
new BaseItemDustUnique("itemDustTiny" + unlocalizedName, materialName, mChemForm, Colour, "Tiny") };
-
+
//Generate Shaped/Shapeless Recipes
final ItemStack normalDust = ItemUtils.getSimpleStack(output[0]);
@@ -456,7 +458,7 @@ public class ItemUtils {
Logger.WARNING("4 Small dust from 1 Dust Recipe: "+materialName+" - Failed");
}
}
-
+
return output;
}
@@ -486,7 +488,7 @@ public class ItemUtils {
public static Item[] generateSpecialUseDusts(final Material material, final boolean onlyLargeDust) {
return generateSpecialUseDusts(material, onlyLargeDust, false);
}
-
+
public static Item[] generateSpecialUseDusts(final Material material, final boolean onlyLargeDust, final boolean disableExtraRecipes) {
final String materialName = material.getLocalizedName();
final String unlocalizedName = Utils.sanitizeString(materialName);
@@ -693,20 +695,22 @@ public class ItemUtils {
public static String[] getArrayStackNamesAsArray(final ItemStack[] aStack) {
final String[] itemNames = aStack == null ? new String[] {} : new String[aStack.length];
- Logger.INFO(""+aStack.length);
-
+ if (aStack != null){
+ Logger.INFO(""+aStack.length);
+ }
+
if (aStack == null || aStack.length < 1) {
return itemNames;
}
-
+
int arpos = 0;
for (final ItemStack alph : aStack) {
if (alph == null) {
continue;
}
try {
- itemNames[arpos] = alph.getDisplayName();
- arpos++;
+ itemNames[arpos] = alph.getDisplayName();
+ arpos++;
}
catch (Throwable t) {
t.printStackTrace();
@@ -998,15 +1002,15 @@ public class ItemUtils {
return true;
}
-
-
+
+
public static IInventory organiseInventory(IInventory aInputInventory) {
ItemStack[] p = new ItemStack[aInputInventory.getSizeInventory()];
for (int o = 0; o < aInputInventory.getSizeInventory(); o++) {
p[o] = aInputInventory.getStackInSlot(o);
}
//ItemStack[] g = organiseInventory(p);
-
+
IInventory aTemp = aInputInventory;
for (int i = 0; i < p.length; ++i) {
for (int j = i + 1; j < p.length; ++j) {
@@ -1016,22 +1020,22 @@ public class ItemUtils {
}
}
}
-
+
/*
for (int o = 0; o < aInputInventory.getSizeInventory(); o++) {
aTemp.setInventorySlotContents(o, g[o]);
}*/
return aTemp;
}
-
-
+
+
public static ItemStack[] organiseInventory(ItemStack[] aInputs) {
//Update Slots
int aInvSize = aInputs.length;
ItemStack[] newArray = new ItemStack[aInvSize];
-
-
+
+
//Try merge stacks
for (int i = 0; i < aInvSize; i++) {
for (int i2 = 0; i2 < aInvSize; i2++) {
@@ -1045,29 +1049,29 @@ public class ItemUtils {
}
//Try Merge
else {
-
+
if (GT_Utility.areStacksEqual(t1[0], t1[1])) {
- while ((t1[0].stackSize < 64 && t1[1].stackSize > 0)) {
- t1[0].stackSize++;
- t1[1].stackSize--;
- if (t1[1].stackSize <= 0) {
- t1[1] = null;
- break;
- }
- if (t1[0].stackSize == 64) {
- break;
- }
- }
- newArray[i] = t1[1];
- newArray[i2] = t1[0];
+ while ((t1[0].stackSize < 64 && t1[1].stackSize > 0)) {
+ t1[0].stackSize++;
+ t1[1].stackSize--;
+ if (t1[1].stackSize <= 0) {
+ t1[1] = null;
+ break;
+ }
+ if (t1[0].stackSize == 64) {
+ break;
+ }
+ }
+ newArray[i] = t1[1];
+ newArray[i2] = t1[0];
}
}
}
}
}
-
+
ItemStack[] newArray2 = new ItemStack[aInvSize];
-
+
//Move nulls to end
int count2 = 0;
for (int i = 0; i < aInvSize; i++)
@@ -1075,10 +1079,18 @@ public class ItemUtils {
newArray2[count2++] = newArray[i];
while (count2 < aInvSize)
newArray2[count2++] = null;
-
+
return newArray2;
+
+ }
+ public static String getFluidName(FluidStack aFluid) {
+ return aFluid != null ? aFluid.getFluid().getLocalizedName(aFluid) : "NULL";
+ }
+
+ public static String getFluidName(Fluid aFluid) {
+ return aFluid != null ? aFluid.getLocalizedName() : "NULL";
}
public static String getItemName(ItemStack aStack) {
@@ -1089,7 +1101,7 @@ public class ItemUtils {
try {
aDisplay = ("" + StatCollector
.translateToLocal(aStack.getItem().getUnlocalizedNameInefficiently(aStack) + ".name"))
- .trim();
+ .trim();
if (aStack.hasTagCompound()) {
if (aStack.stackTagCompound != null && aStack.stackTagCompound.hasKey("display", 10)) {
NBTTagCompound nbttagcompound = aStack.stackTagCompound.getCompoundTag("display");
@@ -1117,7 +1129,7 @@ public class ItemUtils {
String aDisplay = null;
try {
aDisplay = (aStack.getUnlocalizedName()).trim();
-
+
} catch (Throwable t) {
aDisplay = aStack.getItem().getUnlocalizedName();
}
@@ -1126,7 +1138,7 @@ public class ItemUtils {
}
return aDisplay;
}
-
+
public static boolean isItemGregtechTool(ItemStack aStack) {
if (aStack == null) {
return false;
@@ -1139,49 +1151,49 @@ public class ItemUtils {
}
return false;
}
-
+
public static boolean isToolWrench(ItemStack aWrench) {
if (isItemGregtechTool(aWrench) && (aWrench.getItemDamage() == 16 || aWrench.getItemDamage() == 120 || aWrench.getItemDamage() == 122 || aWrench.getItemDamage() == 124 || aWrench.getItemDamage() == 7734)) {
return true;
}
return false;
}
-
+
public static boolean isToolMallet(ItemStack aMallet) {
if (isItemGregtechTool(aMallet) && (aMallet.getItemDamage() == 14)) {
return true;
}
return false;
}
-
+
public static boolean isToolScrewdriver(ItemStack aScrewdriver) {
if (isItemGregtechTool(aScrewdriver) && (aScrewdriver.getItemDamage() == 22 || aScrewdriver.getItemDamage() == 150)) {
return true;
}
return false;
}
-
+
public static boolean isToolCrowbar(ItemStack aCrowbar) {
if (isItemGregtechTool(aCrowbar) && (aCrowbar.getItemDamage() == 20)) {
return true;
}
return false;
}
-
+
public static boolean isToolWirecutters(ItemStack aWirecutters) {
if (isItemGregtechTool(aWirecutters) && (aWirecutters.getItemDamage() == 26)) {
return true;
}
return false;
}
-
+
public static boolean isToolHammer(ItemStack aHammer) {
if (isItemGregtechTool(aHammer) && (aHammer.getItemDamage() == 12 || aHammer.getItemDamage() == 7734)) {
return true;
}
return false;
}
-
+
public static boolean isToolSolderingIron(ItemStack aSoldering) {
if (isItemGregtechTool(aSoldering) && (aSoldering.getItemDamage() == 160)) {
return true;
@@ -1210,14 +1222,38 @@ public class ItemUtils {
public static ItemStack getEnchantedBook(Enchantment aEnch, int aLevel) {
return enchantItem(new ItemStack(Items.enchanted_book), aEnch, aLevel);
}
-
+
public static ItemStack enchantItem(ItemStack aStack, Enchantment aEnch, int aLevel) {
Items.enchanted_book.addEnchantment(aStack, new EnchantmentData(aEnch, aLevel));
return aStack;
}
public static boolean doesOreDictHaveEntryFor(String string) {
- return OreDictionary.doesOreNameExist(string);
+ return OreDictUtils.containsValidEntries(string);
+ }
+
+ public static void hideItemFromNEI(ItemStack aItemToHide) {
+ codechicken.nei.api.API.hideItem(aItemToHide);
+ }
+
+ public static ItemStack getNullStack() {
+ return GT_Values.NI;
+ }
+
+
+ public static ItemStack depleteStack(ItemStack aStack) {
+ return depleteStack(aStack, 1);
+ }
+
+ public static ItemStack depleteStack(ItemStack aStack, int aAmount) {
+ final int cap = aStack.stackSize;
+ if (cap > 1 && cap > aAmount) {
+ aStack.stackSize = (MathUtils.balance((aStack.stackSize - 1), 0, 64));
+ if (aStack.stackSize > 0) {
+ return aStack;
+ }
+ }
+ return getNullStack();
}
}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/LangUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/LangUtils.java
new file mode 100644
index 0000000000..ea161e4adb
--- /dev/null
+++ b/src/Java/gtPlusPlus/core/util/minecraft/LangUtils.java
@@ -0,0 +1,56 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import cpw.mods.fml.common.registry.LanguageRegistry;
+import gregtech.api.util.GT_LanguageManager;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+
+public class LangUtils {
+
+
+ public static boolean rewriteEntryForLanguageRegistry(String aKey, String aNewValue){
+ return rewriteEntryForLanguageRegistry("en_US", aKey, aNewValue);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static boolean rewriteEntryForLanguageRegistry(String aLang, String aKey, String aNewValue){
+ LanguageRegistry aInstance = LanguageRegistry.instance();
+ Field aModLanguageData = ReflectionUtils.getField(LanguageRegistry.class, "modLanguageData");
+ if (aModLanguageData != null){
+ Map<String,Properties> aProps = new HashMap<String, Properties>();
+ Object aInstanceProps;
+ try {
+ aInstanceProps = aModLanguageData.get(aInstance);
+ if (aInstanceProps != null){
+ aProps = (Map<String, Properties>) aInstanceProps;
+ Properties aLangProps = aProps.get(aLang);
+ if (aLangProps != null){
+ if (aLangProps.containsKey(aKey)) {
+ aLangProps.remove(aKey);
+ aLangProps.put(aKey, aNewValue);
+ }
+ else {
+ aLangProps.put(aKey, aNewValue);
+ }
+ aProps.remove(aLang);
+ aProps.put(aLang, aLangProps);
+ ReflectionUtils.setField(aInstance, aModLanguageData, aProps);
+ }
+ }
+ }
+ catch (IllegalArgumentException | IllegalAccessException e) {
+
+ }
+ }
+ return false;
+ }
+
+ public static String trans(String aNr, String aEnglish) {
+ return GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_" + aNr, aEnglish, false);
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/MaterialUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
index 364430b07d..9c623bb9be 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/MaterialUtils.java
@@ -25,6 +25,7 @@ import gtPlusPlus.core.material.state.MaterialState;
import gtPlusPlus.core.util.Utils;
import gtPlusPlus.core.util.data.EnumUtils;
import gtPlusPlus.core.util.data.StringUtils;
+import gtPlusPlus.core.util.math.MathUtils;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
@@ -207,9 +208,9 @@ public class MaterialUtils {
return true;
}
- public static int getTierOfMaterial(final int aMeltingPoint){
+ public static int getTierOfMaterial(final double aMeltingPoint){
- return aMeltingPoint < 1000 ? 0 : (Math.round(aMeltingPoint/1000));
+ return aMeltingPoint < 1000 ? 0 : (MathUtils.roundToClosestInt(aMeltingPoint/1000f));
/*if ((aMeltingPoint >= 0) && (aMeltingPoint <= 1000)){
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/OreDictUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/OreDictUtils.java
new file mode 100644
index 0000000000..324d39b863
--- /dev/null
+++ b/src/Java/gtPlusPlus/core/util/minecraft/OreDictUtils.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.core.util.minecraft;
+
+import java.util.List;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+public class OreDictUtils {
+
+ public static boolean containsValidEntries(String aOreName) {
+ boolean a = OreDictionary.doesOreNameExist(aOreName);
+ List<ItemStack> b = OreDictionary.getOres(aOreName, false);
+
+ if (!a) {
+ return false;
+ }
+ else {
+ if (b == null || b.isEmpty()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
index aeeb4ae5be..2ae2a9f1de 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/gregtech/PollutionUtils.java
@@ -1,16 +1,30 @@
package gtPlusPlus.core.util.minecraft.gregtech;
+import static gtPlusPlus.core.lib.CORE.MAIN_GREGTECH_5U_EXPERIMENTAL_FORK;
+
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.apache.commons.lang3.ArrayUtils;
+
import gregtech.GT_Mod;
+import gregtech.api.enums.OrePrefixes;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
import gregtech.common.GT_Proxy;
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.api.objects.data.AutoMap;
+import gtPlusPlus.core.item.base.cell.BaseItemCell;
import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.material.MISC_MATERIALS;
+import gtPlusPlus.core.material.MaterialGenerator;
+import gtPlusPlus.core.util.minecraft.FluidUtils;
+import gtPlusPlus.core.util.minecraft.ItemUtils;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import net.minecraft.item.ItemStack;
import net.minecraft.world.chunk.Chunk;
+import net.minecraftforge.fluids.FluidStack;
public class PollutionUtils {
@@ -22,13 +36,19 @@ public class PollutionUtils {
private static Method mGetPollution;
private static Method mGetPollution2;
+ public static AutoMap<FluidStack> mPollutionFluidStacks = new AutoMap<FluidStack>();
+
static {
- if (CORE.MAIN_GREGTECH_5U_EXPERIMENTAL_FORK || CORE.GTNH) {
+ if (MAIN_GREGTECH_5U_EXPERIMENTAL_FORK || CORE.GTNH) {
mIsPollutionEnabled = mPollution();
} else {
mIsPollutionEnabled = false;
}
}
+
+ public static boolean isPollutionEnabled() {
+ return mIsPollutionEnabled;
+ }
public static boolean mPollution() {
try {
@@ -119,8 +139,57 @@ public class PollutionUtils {
return addPollution(aChunk, -pollutionValue);
}
+ public static boolean nullifyPollution(IGregTechTileEntity te) {
+ if (te == null) {
+ return false;
+ }
+ return nullifyPollution((IHasWorldObjectAndCoords) te);
+ }
+
+ public static boolean nullifyPollution(IHasWorldObjectAndCoords aTileOfSomeSort) {
+ if (aTileOfSomeSort == null) {
+ return false;
+ }
+ IHasWorldObjectAndCoords j = (IHasWorldObjectAndCoords) aTileOfSomeSort;
+ Chunk c = j.getWorld().getChunkFromBlockCoords(j.getXCoord(), j.getZCoord());
+ return nullifyPollution(c);
+ }
+
+ public static boolean nullifyPollution(Chunk aChunk) {
+ try {
+ if (aChunk == null) {
+ return false;
+ }
+ long getCurrentPollution = getPollution(aChunk);
+ if (getCurrentPollution <= 0) {
+ return false;
+ }
+ else {
+ if (mAddPollution2 != null) {
+ mAddPollution2.invoke(null, aChunk, -getCurrentPollution);
+ return true;
+ }
+ else {
+ Class<?> GT_Pollution = ReflectionUtils.getClass("gregtech.common.GT_Pollution");
+ if (GT_Pollution != null) {
+ Method addPollution = ReflectionUtils.getMethod(GT_Pollution, "addPollution", Chunk.class, int.class);
+ if (addPollution != null) {
+ mAddPollution2 = addPollution;
+ mAddPollution2.invoke(null, aChunk, 0);
+ return true;
+ }
+ }
+ }
+ }
+
+ } catch (SecurityException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException e) {
+ }
+ return false;
+ }
+
public static int getPollution(IGregTechTileEntity te) {
- if (mIsPollutionEnabled)
+ if (MAIN_GREGTECH_5U_EXPERIMENTAL_FORK)
try {
if (te == null) {
return 0;
@@ -143,7 +212,7 @@ public class PollutionUtils {
}
public static int getPollution(Chunk te) {
- if (mIsPollutionEnabled)
+ if (MAIN_GREGTECH_5U_EXPERIMENTAL_FORK)
try {
if (te == null) {
return 0;
@@ -164,5 +233,73 @@ public class PollutionUtils {
}
return 0;
}
+
+ public static boolean setPollutionFluids() {
+ if (mPollutionFluidStacks.isEmpty()) {
+ FluidStack CD, CM, SD;
+ CD = FluidUtils.getFluidStack("carbondioxide", 1000);
+ CM = FluidUtils.getFluidStack("carbonmonoxide", 1000);
+ SD = FluidUtils.getFluidStack("sulfurdioxide", 1000);
+ if (PollutionUtils.mPollutionFluidStacks.size() == 0) {
+ if (CD != null) {
+ Logger.INFO("[PollutionCompat] Found carbon dioxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(CD);
+ MISC_MATERIALS.CARBON_DIOXIDE.registerComponentForMaterial(CD);
+ ItemStack cellCD = ItemUtils.getItemStackOfAmountFromOreDict("cellCarbonDioxide", 1);
+ if (ItemUtils.checkForInvalidItems(cellCD)) {
+ Logger.INFO("[PollutionCompat] Found carbon dioxide cell, registering component.");
+ MISC_MATERIALS.CARBON_DIOXIDE.registerComponentForMaterial(OrePrefixes.cell, cellCD);
+ }
+ else {
+ Logger.INFO("[PollutionCompat] Did not find carbon dioxide cell, registering new component.");
+ new BaseItemCell(MISC_MATERIALS.CARBON_DIOXIDE);
+ }
+ }
+ else {
+ MaterialGenerator.generate(MISC_MATERIALS.CARBON_DIOXIDE, false, false);
+ }
+
+ if (CM != null) {
+ Logger.INFO("[PollutionCompat] Found carbon monoxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(CM);
+ MISC_MATERIALS.CARBON_MONOXIDE.registerComponentForMaterial(CM);
+ ItemStack cellCD = ItemUtils.getItemStackOfAmountFromOreDict("cellCarbonMonoxide", 1);
+ if (ItemUtils.checkForInvalidItems(cellCD)) {
+ Logger.INFO("[PollutionCompat] Found carbon monoxide cell, registering component.");
+ MISC_MATERIALS.CARBON_MONOXIDE.registerComponentForMaterial(OrePrefixes.cell, cellCD);
+ }
+ else {
+ Logger.INFO("[PollutionCompat] Did not find carbon monoxide cell, registering new component.");
+ new BaseItemCell(MISC_MATERIALS.CARBON_MONOXIDE);
+ }
+ }
+ else {
+ MaterialGenerator.generate(MISC_MATERIALS.CARBON_MONOXIDE, false, false);
+ }
+
+ if (SD != null) {
+ Logger.INFO("[PollutionCompat] Found sulfur dioxide fluid, registering it.");
+ PollutionUtils.mPollutionFluidStacks.put(SD);
+ }
+ }
+ if (PollutionUtils.mPollutionFluidStacks.size() > 0) {
+ return true;
+ }
+ return false;
+ }
+ else {
+ if (mPollutionFluidStacks.size() != 3) {
+ Logger.INFO("Unable to detect all 3 pollution fluids. Found: ");
+ Logger.INFO(ArrayUtils.toString(mPollutionFluidStacks));
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+
+
+
+ }
}
diff --git a/src/Java/gtPlusPlus/core/util/reflect/OreDictUtils.java b/src/Java/gtPlusPlus/core/util/reflect/OreDictUtils.java
deleted file mode 100644
index 6d34733545..0000000000
--- a/src/Java/gtPlusPlus/core/util/reflect/OreDictUtils.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package gtPlusPlus.core.util.reflect;
-
-public class OreDictUtils {
-
-
-
-}
diff --git a/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java b/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
index 2371753fe6..135f98dd17 100644
--- a/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
+++ b/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
@@ -25,10 +25,25 @@ import gtPlusPlus.core.util.data.StringUtils;
public class ReflectionUtils {
- public static Map<String, Class> mCachedClasses = new LinkedHashMap<String, Class>();
+ public static Map<String, Class<?>> mCachedClasses = new LinkedHashMap<String, Class<?>>();
public static Map<String, CachedMethod> mCachedMethods = new LinkedHashMap<String, CachedMethod>();
public static Map<String, CachedField> mCachedFields = new LinkedHashMap<String, CachedField>();
+ public static Map<String, CachedConstructor> mCachedConstructors = new LinkedHashMap<String, CachedConstructor>();
+ private static class CachedConstructor {
+
+ private final Constructor<?> METHOD;
+
+ public CachedConstructor(Constructor<?> aCons) {
+ METHOD = aCons;
+ }
+
+ public Constructor<?> get() {
+ return METHOD;
+ }
+
+ }
+
private static class CachedMethod {
private final boolean STATIC;
@@ -69,11 +84,11 @@ public class ReflectionUtils {
}
- private static boolean cacheClass(Class aClass) {
+ private static boolean cacheClass(Class<?> aClass) {
if (aClass == null) {
return false;
}
- Class y = mCachedClasses.get(aClass.getCanonicalName());
+ Class<?> y = mCachedClasses.get(aClass.getCanonicalName());
if (y == null) {
mCachedClasses.put(aClass.getCanonicalName(), aClass);
return true;
@@ -81,7 +96,7 @@ public class ReflectionUtils {
return false;
}
- private static boolean cacheMethod(Class aClass, Method aMethod) {
+ private static boolean cacheMethod(Class<?> aClass, Method aMethod) {
if (aMethod == null) {
return false;
}
@@ -94,7 +109,7 @@ public class ReflectionUtils {
return false;
}
- private static boolean cacheField(Class aClass, Field aField) {
+ private static boolean cacheField(Class<?> aClass, Field aField) {
if (aField == null) {
return false;
}
@@ -107,17 +122,60 @@ public class ReflectionUtils {
return false;
}
+ private static boolean cacheConstructor(Class<?> aClass, Constructor<?> aConstructor) {
+ if (aConstructor == null) {
+ return false;
+ }
+ CachedConstructor y = mCachedConstructors.get(aClass.getName()+"."+ArrayUtils.toString(aConstructor.getParameterTypes()));
+ if (y == null) {
+ mCachedConstructors.put(aClass.getName()+"."+ArrayUtils.toString(aConstructor.getParameterTypes()), new CachedConstructor(aConstructor));
+ return true;
+ }
+ return false;
+ }
+
+
+ /**
+ * Returns a cached {@link Constructor} object.
+ * @param aClass - Class containing the Constructor.
+ * @param aTypes - Varags Class Types for objects constructor.
+ * @return - Valid, non-final, {@link Method} object, or {@link null}.
+ */
+ public static Constructor<?> getConstructor(Class<?> aClass, Class<?>... aTypes) {
+ if (aClass == null || aTypes == null) {
+ return null;
+ }
+
+ String aMethodKey = ArrayUtils.toString(aTypes);
+ //Logger.REFLECTION("Looking up method in cache: "+(aClass.getName()+"."+aMethodName + "." + aMethodKey));
+ CachedConstructor y = mCachedConstructors.get(aClass.getName() + "." + aMethodKey);
+ if (y == null) {
+ Constructor<?> u = getConstructor_Internal(aClass, aTypes);
+ if (u != null) {
+ Logger.REFLECTION("Caching Constructor: "+aClass.getName() + "." + aMethodKey);
+ cacheConstructor(aClass, u);
+ return u;
+ } else {
+ return null;
+ }
+ } else {
+ return y.get();
+ }
+ }
+
+
+
/**
* Returns a cached {@link Class} object.
* @param aClassCanonicalName - The canonical name of the underlying class.
* @return - Valid, {@link Class} object, or {@link null}.
*/
- public static Class getClass(String aClassCanonicalName) {
+ public static Class<?> getClass(String aClassCanonicalName) {
if (aClassCanonicalName == null || aClassCanonicalName.length() <= 0) {
return null;
}
- Class y = mCachedClasses.get(aClassCanonicalName);
+ Class<?> y = mCachedClasses.get(aClassCanonicalName);
if (y == null) {
y = getClass_Internal(aClassCanonicalName);
if (y != null) {
@@ -149,7 +207,7 @@ public class ReflectionUtils {
* @param aTypes - Varags Class Types for {@link Method}'s constructor.
* @return - Valid, non-final, {@link Method} object, or {@link null}.
*/
- public static Method getMethod(Class aClass, String aMethodName, Class... aTypes) {
+ public static Method getMethod(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
if (aClass == null || aMethodName == null || aMethodName.length() <= 0) {
return null;
}
@@ -169,6 +227,17 @@ public class ReflectionUtils {
return y.get();
}
}
+
+ public static boolean isStaticMethod(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
+ return isStaticMethod(ReflectionUtils.getMethod(aClass, aMethodName, aTypes));
+ }
+
+ public static boolean isStaticMethod(Method aMethod) {
+ if (aMethod != null && Modifier.isStatic(aMethod.getModifiers())) {
+ return true;
+ }
+ return false;
+ }
@@ -178,7 +247,7 @@ public class ReflectionUtils {
* @param aFieldName - Field name in {@link String} form.
* @return - Valid, non-final, {@link Field} object, or {@link null}.
*/
- public static Field getField(final Class aClass, final String aFieldName) {
+ public static Field getField(final Class<?> aClass, final String aFieldName) {
if (aClass == null || aFieldName == null || aFieldName.length() <= 0) {
return null;
}
@@ -293,7 +362,7 @@ public class ReflectionUtils {
return loaded > 0;
}
-
+
public static boolean setField(final Object object, final String fieldName, final Object fieldValue) {
Class<?> clazz = object.getClass();
@@ -313,8 +382,8 @@ public class ReflectionUtils {
}
}
return false;
-
-
+
+
}
public static boolean setField(final Object object, final Field field, final Object fieldValue) {
@@ -381,7 +450,6 @@ public class ReflectionUtils {
public static boolean invoke(Object objectInstance, String methodName, Class[] parameters, Object[] values){
if (objectInstance == null || methodName == null || parameters == null || values == null){
- //Logger.REFLECTION("Null value when trying to Dynamically invoke "+methodName+" on an object of type: "+objectInstance.getClass().getName());
return false;
}
Class<?> mLocalClass = (objectInstance instanceof Class ? (Class<?>) objectInstance : objectInstance.getClass());
@@ -389,6 +457,28 @@ public class ReflectionUtils {
try {
Method mInvokingMethod = mLocalClass.getDeclaredMethod(methodName, parameters);
if (mInvokingMethod != null){
+ return invoke(objectInstance, mInvokingMethod, values);
+ }
+ }
+ catch (NoSuchMethodException | SecurityException | IllegalArgumentException e) {
+ Logger.REFLECTION("Failed to Dynamically invoke "+methodName+" on an object of type: "+mLocalClass.getName());
+ }
+
+ Logger.REFLECTION("Invoke failed or did something wrong.");
+ return false;
+ }
+
+ public static boolean invoke(Object objectInstance, Method method, Object[] values){
+ if (method == null || values == null || (!ReflectionUtils.isStaticMethod(method) && objectInstance == null)){
+ //Logger.REFLECTION("Null value when trying to Dynamically invoke "+methodName+" on an object of type: "+objectInstance.getClass().getName());
+ return false;
+ }
+ String methodName = method.getName();
+ String classname = objectInstance != null ? objectInstance.getClass().getCanonicalName() : method.getDeclaringClass().getCanonicalName();
+ Logger.REFLECTION("Trying to invoke "+methodName+" on an instance of "+classname+".");
+ try {
+ Method mInvokingMethod = method;
+ if (mInvokingMethod != null){
Logger.REFLECTION(methodName+" was not null.");
if ((boolean) mInvokingMethod.invoke(objectInstance, values)){
Logger.REFLECTION("Successfully invoked "+methodName+".");
@@ -398,14 +488,10 @@ public class ReflectionUtils {
Logger.REFLECTION("Invocation failed for "+methodName+".");
}
}
- else {
- Logger.REFLECTION(methodName+" is null.");
- }
}
- catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
- Logger.REFLECTION("Failed to Dynamically invoke "+methodName+" on an object of type: "+mLocalClass.getName());
- }
-
+ catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ Logger.REFLECTION("Failed to Dynamically invoke "+methodName+" on an object of type: "+classname);
+ }
Logger.REFLECTION("Invoke failed or did something wrong.");
return false;
}
@@ -484,11 +570,11 @@ public class ReflectionUtils {
* Internal Magic that probably should not get exposed.
*/
-
-
-
-
-
+
+
+
+
+
@@ -662,7 +748,7 @@ public class ReflectionUtils {
return m;
}
- private static Method getMethod_Internal(Class aClass, String aMethodName, Class... aTypes) {
+ private static Method getMethod_Internal(Class<?> aClass, String aMethodName, Class<?>... aTypes) {
Method m = null;
try {
Logger.REFLECTION("Method: Internal Lookup: "+aMethodName);
@@ -688,6 +774,55 @@ public class ReflectionUtils {
}
return m;
}
+
+ private static Constructor<?> getConstructor_Internal(Class<?> aClass, Class<?>... aTypes) {
+ Constructor<?> c = null;
+ try {
+ Logger.REFLECTION("Constructor: Internal Lookup: "+aClass.getName());
+ c = aClass.getDeclaredConstructor(aTypes);
+ if (c != null) {
+ c.setAccessible(true);
+ int modifiers = c.getModifiers();
+ Field modifierField = c.getClass().getDeclaredField("modifiers");
+ modifiers = modifiers & ~Modifier.FINAL;
+ modifierField.setAccessible(true);
+ modifierField.setInt(c, modifiers);
+ }
+ }
+ catch (Throwable t) {
+ Logger.REFLECTION("Constructor: Internal Lookup Failed: "+aClass.getName());
+ try {
+ c = getConstructorRecursively(aClass, aTypes);
+ } catch (Exception e) {
+ Logger.REFLECTION("Unable to find method '"+aClass.getName()+"'");
+ e.printStackTrace();
+ dumpClassInfo(aClass);
+ }
+ }
+ return c;
+ }
+
+ private static Constructor<?> getConstructorRecursively(Class<?> aClass, Class<?>... aTypes) throws Exception {
+ try {
+ Logger.REFLECTION("Constructor: Recursion Lookup: "+aClass.getName());
+ Constructor<?> c = aClass.getConstructor(aTypes);
+ if (c != null) {
+ c.setAccessible(true);
+ int modifiers = c.getModifiers();
+ Field modifierField = c.getClass().getDeclaredField("modifiers");
+ modifiers = modifiers & ~Modifier.FINAL;
+ modifierField.setAccessible(true);
+ modifierField.setInt(c, modifiers);
+ }
+ return c;
+ } catch (final NoSuchMethodException | IllegalArgumentException | IllegalAccessException e) {
+ final Class<?> superClass = aClass.getSuperclass();
+ if (superClass == null || superClass == Object.class) {
+ throw e;
+ }
+ return getConstructor_Internal(superClass, aTypes);
+ }
+ }
private static Method getMethodRecursively(final Class<?> clazz, final String aMethodName) throws NoSuchMethodException {
try {
@@ -704,7 +839,7 @@ public class ReflectionUtils {
}
}
- private static void dumpClassInfo(Class aClass) {
+ private static void dumpClassInfo(Class<?> aClass) {
Logger.INFO("We ran into an error processing reflection in "+aClass.getName()+", dumping all data for debugging.");
// Get the methods
Method[] methods = aClass.getDeclaredMethods();
@@ -720,7 +855,7 @@ public class ReflectionUtils {
System.out.println(f.getName());
}
Logger.INFO("Dumping all Constructors.");
- for (Constructor c : consts) {
+ for (Constructor<?> c : consts) {
System.out.println(c.getName()+" | "+c.getParameterCount()+" | "+StringUtils.getDataStringFromArray(c.getParameterTypes()));
}
}
@@ -767,15 +902,52 @@ public class ReflectionUtils {
}
private static Class<?> getClass_Internal(String string) {
+ Class<?> aClass = null;
if (ReflectionUtils.doesClassExist(string)) {
try {
- return Class.forName(string);
+ aClass = Class.forName(string);
}
catch (ClassNotFoundException e) {
- return getNonPublicClass(string);
+ aClass = getNonPublicClass(string);
}
}
- return null;
+
+ if (aClass == null) {
+ String aClassName = "";
+ Logger.REFLECTION("Splitting "+string+" to try look for hidden classes.");
+ String[] aData = string.split("\\.");
+ Logger.REFLECTION("Obtained "+aData.length+" pieces.");
+ for (int i=0;i<(aData.length-1);i++) {
+ aClassName += (i > 0) ? "."+aData[i] : ""+aData[i];
+ Logger.REFLECTION("Building: "+aClassName);
+ }
+ Logger.REFLECTION("Trying to search '"+aClassName+"' for inner classes.");
+ Class<?> clazz = ReflectionUtils.getClass(aClassName);
+
+ Class[] y = clazz.getDeclaredClasses();
+ if (y == null || y.length <= 0) {
+ Logger.REFLECTION("No hidden inner classes found.");
+ return null;
+ }
+ else {
+ boolean found = false;
+ for (Class<?> h : y) {
+ Logger.REFLECTION("Found hidden inner class: "+h.getCanonicalName());
+ if (h.getSimpleName().toLowerCase().equals(aData[aData.length-1].toLowerCase())) {
+ Logger.REFLECTION("Found correct class. ["+aData[aData.length-1]+"] Caching at correct location: "+string);
+ Logger.REFLECTION("Found at location: "+h.getCanonicalName());
+ ReflectionUtils.mCachedClasses.put(string, h);
+ aClass = h;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return null;
+ }
+ }
+ }
+ return aClass;
}
/**
@@ -800,4 +972,30 @@ public class ReflectionUtils {
}
+ public static boolean doesFieldExist(String clazz, String string) {
+ return doesFieldExist(ReflectionUtils.getClass(clazz), string);
+ }
+
+ public static boolean doesFieldExist(Class<?> clazz, String string) {
+ if (clazz != null) {
+ if (ReflectionUtils.getField(clazz, string) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static Object getFieldValue(Field field) {
+ return getFieldValue(field, null);
+ }
+
+ public static Object getFieldValue(Field field, Object instance) {
+ try {
+ return field.get(instance);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ }
+ return null;
+ }
+
+
}