aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus
diff options
context:
space:
mode:
Diffstat (limited to 'src/Java/gtPlusPlus')
-rw-r--r--src/Java/gtPlusPlus/xmod/thaumcraft/aspect/GTPP_AspectCompat.java76
-rw-r--r--src/Java/gtPlusPlus/xmod/thaumcraft/aspect/TC_Aspect.java243
-rw-r--r--src/Java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java2
3 files changed, 265 insertions, 56 deletions
diff --git a/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/GTPP_AspectCompat.java b/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/GTPP_AspectCompat.java
index e3aeed75bd..96df6485f8 100644
--- a/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/GTPP_AspectCompat.java
+++ b/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/GTPP_AspectCompat.java
@@ -13,6 +13,8 @@ import gregtech.api.util.GT_LanguageManager;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import net.minecraft.block.Block;
@@ -25,62 +27,26 @@ public class GTPP_AspectCompat implements IThaumcraftCompat {
public static volatile Method m = null;
+ private static HashMap<String, TC_Aspect> mAspectCache = new LinkedHashMap<String, TC_Aspect>();
+
public GTPP_AspectCompat() {
- // Standard Aspects
- GTPP_Aspects.AER.mAspect = Aspect.AIR;
- GTPP_Aspects.ALIENIS.mAspect = Aspect.ELDRITCH;
- GTPP_Aspects.AQUA.mAspect = Aspect.WATER;
- GTPP_Aspects.ARBOR.mAspect = Aspect.TREE;
- GTPP_Aspects.AURAM.mAspect = Aspect.AURA;
- GTPP_Aspects.BESTIA.mAspect = Aspect.BEAST;
- GTPP_Aspects.COGNITIO.mAspect = Aspect.MIND;
- GTPP_Aspects.CORPUS.mAspect = Aspect.FLESH;
- GTPP_Aspects.EXANIMIS.mAspect = Aspect.UNDEAD;
- GTPP_Aspects.FABRICO.mAspect = Aspect.CRAFT;
- GTPP_Aspects.FAMES.mAspect = Aspect.HUNGER;
- GTPP_Aspects.GELUM.mAspect = Aspect.COLD;
- GTPP_Aspects.GRANUM.mAspect = Aspect.PLANT;
- GTPP_Aspects.HERBA.mAspect = Aspect.PLANT;
- GTPP_Aspects.HUMANUS.mAspect = Aspect.MAN;
- GTPP_Aspects.IGNIS.mAspect = Aspect.FIRE;
- GTPP_Aspects.INSTRUMENTUM.mAspect = Aspect.TOOL;
- GTPP_Aspects.ITER.mAspect = Aspect.TRAVEL;
- GTPP_Aspects.LIMUS.mAspect = Aspect.SLIME;
- GTPP_Aspects.LUCRUM.mAspect = Aspect.GREED;
- GTPP_Aspects.LUX.mAspect = Aspect.LIGHT;
- GTPP_Aspects.MACHINA.mAspect = Aspect.MECHANISM;
- GTPP_Aspects.MESSIS.mAspect = Aspect.CROP;
- GTPP_Aspects.METALLUM.mAspect = Aspect.METAL;
- GTPP_Aspects.METO.mAspect = Aspect.HARVEST;
- GTPP_Aspects.MORTUUS.mAspect = Aspect.DEATH;
- GTPP_Aspects.MOTUS.mAspect = Aspect.MOTION;
- GTPP_Aspects.ORDO.mAspect = Aspect.ORDER;
- GTPP_Aspects.PANNUS.mAspect = Aspect.CLOTH;
- GTPP_Aspects.PERDITIO.mAspect = Aspect.ENTROPY;
- GTPP_Aspects.PERFODIO.mAspect = Aspect.MINE;
- GTPP_Aspects.PERMUTATIO.mAspect = Aspect.EXCHANGE;
- GTPP_Aspects.POTENTIA.mAspect = Aspect.ENERGY;
- GTPP_Aspects.PRAECANTATIO.mAspect = Aspect.MAGIC;
- GTPP_Aspects.SANO.mAspect = Aspect.HEAL;
- GTPP_Aspects.SENSUS.mAspect = Aspect.SENSES;
- GTPP_Aspects.SPIRITUS.mAspect = Aspect.SOUL;
- GTPP_Aspects.TELUM.mAspect = Aspect.WEAPON;
- GTPP_Aspects.TERRA.mAspect = Aspect.EARTH;
- GTPP_Aspects.TEMPESTAS.mAspect = Aspect.WEATHER;
- GTPP_Aspects.TENEBRAE.mAspect = Aspect.DARKNESS;
- GTPP_Aspects.TUTAMEN.mAspect = Aspect.ARMOR;
- GTPP_Aspects.VACUOS.mAspect = Aspect.VOID;
- GTPP_Aspects.VENENUM.mAspect = Aspect.POISON;
- GTPP_Aspects.VICTUS.mAspect = Aspect.LIFE;
- GTPP_Aspects.VINCULUM.mAspect = Aspect.TRAP;
- GTPP_Aspects.VITIUM.mAspect = Aspect.TAINT;
- GTPP_Aspects.VITREUS.mAspect = Aspect.CRYSTAL;
- GTPP_Aspects.VOLATUS.mAspect = Aspect.FLIGHT;
- GTPP_Aspects.STRONTIO.mAspect = (Aspect) TC_Aspects.STRONTIO.mAspect;
- GTPP_Aspects.NEBRISUM.mAspect = (Aspect) TC_Aspects.NEBRISUM.mAspect;
- GTPP_Aspects.ELECTRUM.mAspect = (Aspect) TC_Aspects.ELECTRUM.mAspect;
- GTPP_Aspects.MAGNETO.mAspect = (Aspect) TC_Aspects.MAGNETO.mAspect;
- GTPP_Aspects.RADIO.mAspect = (Aspect) TC_Aspects.RADIO.mAspect;
+
+
+ //Generate all existing Aspects as TC_Aspects
+ LinkedHashMap<String, Object> h = TC_Aspect.getVanillaAspectList();
+ for (String g : h.keySet()) {
+ Object aBaseAspect = h.get(g);
+ if (aBaseAspect != null && TC_Aspect.isObjectAnAspect(aBaseAspect)) {
+ TC_Aspect aS = TC_Aspect.getAspect(g);
+ if (aS != null) {
+ mAspectCache.put(g, aS);
+ continue;
+ }
+ }
+ }
+
+
+
// Custom Aspects
GTPP_Aspects.CUSTOM_1.mAspect = new Aspect("custom1", 15647411, new Aspect[]{Aspect.COLD, Aspect.FIRE},
diff --git a/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/TC_Aspect.java b/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/TC_Aspect.java
new file mode 100644
index 0000000000..b05b6f1e2b
--- /dev/null
+++ b/src/Java/gtPlusPlus/xmod/thaumcraft/aspect/TC_Aspect.java
@@ -0,0 +1,243 @@
+package gtPlusPlus.xmod.thaumcraft.aspect;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import gtPlusPlus.api.objects.Logger;
+import gtPlusPlus.core.lib.CORE;
+import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import net.minecraft.util.ResourceLocation;
+
+/**
+ * Wrapper class for Thaumcraft Aspects.
+ * Used to avoid compile time dependencies.
+ * @author Alkalus
+ *
+ */
+public class TC_Aspect {
+
+ private static Class mClass_Aspect;
+ private static Field mField_Aspects;
+
+ private final String tag;
+ private final TC_Aspect[] components;
+ private final int color;
+ private String chatcolor;
+ private final ResourceLocation image;
+ private final int blend;
+
+ private final Object mAspect;
+
+
+
+
+ /**
+ * Statically set the Class objects
+ */
+ static {
+ mClass_Aspect = ReflectionUtils.getClass("thaumcraft.api.aspects.Aspect");
+ }
+
+ /**
+ * Gets the total aspect list from Thaumcraft, which should contain all other registered aspects.
+ * @return - A LinkedHashMap(String, Aspect);
+ */
+ public static LinkedHashMap<String, Object> getVanillaAspectList() {
+ try {
+ if (mField_Aspects == null) {
+ mField_Aspects = ReflectionUtils.getField(mClass_Aspect, "aspects");
+ }
+ return (LinkedHashMap<String, Object>) mField_Aspects.get(null);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ Logger.REFLECTION("Failed configuring TC Aspect compatibility.");
+ return new LinkedHashMap<String, Object>();
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /**
+ * Vanilla Aspect Constructor
+ * @param tag - Aspect Name
+ * @param color
+ * @param chatcolor
+ * @param blend
+ */
+ public TC_Aspect(String tag, int color, String chatcolor, int blend) {
+ this(tag, color, (TC_Aspect[]) null, blend);
+ this.chatcolor = chatcolor;
+ }
+
+ /**
+ *
+ * Vanilla Aspect Constructor
+ * @param tag - Aspect Name
+ * @param color
+ * @param components
+ */
+ public TC_Aspect(String tag, int color, TC_Aspect[] components) {
+ this(tag, color, components, true, 1);
+ }
+
+ /**
+ *
+ * Vanilla Aspect Constructor
+ * @param tag - Aspect Name
+ * @param color
+ * @param components
+ * @param blend
+ */
+ public TC_Aspect(String tag, int color, TC_Aspect[] components, int blend) {
+ this(tag, color, components, true, blend);
+ }
+
+
+ /**
+ *
+ * Vanilla Aspect Constructor
+ * @param tag - Aspect Name
+ * @param color
+ * @param components
+ * @param image
+ * @param blend
+ */
+ public TC_Aspect(String tag, int color, TC_Aspect[] components, boolean vanilla, int blend) {
+ this(tag, color, components, vanilla ? new ResourceLocation("thaumcraft", "textures/aspects/" + tag.toLowerCase() + ".png") : new ResourceLocation(CORE.MODID, "textures/aspects/" + tag.toLowerCase() + ".png"), blend);
+ }
+
+
+ public TC_Aspect(String tag, int color, TC_Aspect[] components, ResourceLocation image, int blend) {
+ if (getAspectList().containsKey(tag)) {
+ throw new IllegalArgumentException(tag + " already registered!");
+ } else {
+ this.tag = tag;
+ this.components = components;
+ this.color = color;
+ this.image = image;
+ this.blend = blend;
+ this.mAspect = this.generateTcAspect();
+ }
+ }
+
+
+
+ /**
+ * Generates a TC_Aspect from an object, presummed to be a TC Aspect.
+ * @param aBaseAspect - The TC Aspect to generate from.
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ */
+ public TC_Aspect(Object aBaseAspect) throws IllegalArgumentException, IllegalAccessException {
+ this((String) ReflectionUtils.getField(mClass_Aspect, "tag").get(aBaseAspect), (int) ReflectionUtils.getField(mClass_Aspect, "color").get(aBaseAspect), generateAspectArrayInternal(ReflectionUtils.getField(mClass_Aspect, "components"), aBaseAspect), (ResourceLocation) ReflectionUtils.getField(mClass_Aspect, "image").get(aBaseAspect), (int) ReflectionUtils.getField(mClass_Aspect, "blend").get(aBaseAspect));
+ Field aChatColour = ReflectionUtils.getField(mClass_Aspect, "chatcolor");
+ chatcolor = (String) aChatColour.get(aBaseAspect);
+ }
+
+
+ /**
+ * Internal Map containing all the TC_Aspects.
+ */
+ private static Map<String, TC_Aspect> mInternalAspectCache = new LinkedHashMap<String, TC_Aspect>();
+
+ /**
+ * Public getter for all TC_Aspects
+ * @param aAspectName - Aspect Name
+ * @return - A GT++ Aspect wrapper or null. (TC_Aspect)
+ */
+ public static TC_Aspect getAspect(String aAspectName) {
+ TC_Aspect g = mInternalAspectCache.get(aAspectName);
+ if (g != null) {
+ return g;
+ }
+ else {
+ try {
+ TC_Aspect aTemp = new TC_Aspect(getAspectList().get(aAspectName));
+ if (aTemp != null) {
+ mInternalAspectCache.put(aAspectName, aTemp);
+ return aTemp;
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ public static Map<String, TC_Aspect> getAspectList(){
+ return mInternalAspectCache;
+ }
+
+
+ private static TC_Aspect[] generateAspectArrayInternal(Field aField, Object aInstance) {
+ //thaumcraft.api.aspects.Aspect.Aspect()
+ Object[] components;
+ TC_Aspect[] aAspectArray;
+ try {
+ components = (Object[]) aField.get(aInstance);
+ aAspectArray = new TC_Aspect[components.length];
+ if (components.length > 0) {
+ int i = 0;
+ for (Object g : components) {
+ aAspectArray[i] = getAspect((String) ReflectionUtils.getField(mClass_Aspect, "tag").get(g));
+ i++;
+ }
+ }
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ e.printStackTrace();
+ aAspectArray = new TC_Aspect[0];
+ }
+ return aAspectArray;
+ }
+
+ /**
+ * Tasty code to generate TC Aspects reflectively.
+ * @return
+ */
+ public Object generateTcAspect() {
+ try {
+ //thaumcraft.api.aspects.Aspect.Aspect()
+ Object aAspectArray = (Object[]) Array.newInstance(mClass_Aspect, 1);
+ if (components.length > 0) {
+ aAspectArray = (Object[]) Array.newInstance(mClass_Aspect, components.length);
+ int i = 0;
+ for (TC_Aspect g : components) {
+ ((Object[]) aAspectArray)[i++] = g.mAspect;
+ }
+ }
+ Constructor constructor = mClass_Aspect.getConstructor(String.class, int.class, aAspectArray.getClass(), ResourceLocation.class, int.class);
+ Object myObject = constructor.newInstance(tag, color, aAspectArray, image, blend);
+
+ //Set chat colour
+ if (chatcolor != null && chatcolor.length() > 0) {
+ Method setChatColour = ReflectionUtils.getMethod(mClass_Aspect, "setChatcolor", String.class);
+ if (setChatColour != null) {
+ setChatColour.invoke(myObject, chatcolor);
+ }
+ }
+ return myObject;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ public static boolean isObjectAnAspect(Object aAspect) {
+ return mClass_Aspect.isInstance(aAspect);
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java b/src/Java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
index 9ba10fc40e..3b2bcba5dd 100644
--- a/src/Java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
+++ b/src/Java/gtPlusPlus/xmod/tinkers/HANDLER_Tinkers.java
@@ -38,7 +38,7 @@ public class HANDLER_Tinkers {
if (LoadedMods.TiCon) {
for (BaseTinkersMaterial y : mTinkerMaterials) {
- y.generate();
+ //y.generate();
}
Class aTinkersSmeltery = ReflectionUtils.getClass("tconstruct.smeltery.TinkerSmeltery");