diff options
author | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2019-03-04 16:09:00 +0000 |
---|---|---|
committer | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2019-03-04 16:09:00 +0000 |
commit | f8814f83fa9f34e6088e98bed0561ce6cb13842d (patch) | |
tree | 50e1bd323d315ebd91c350fbf2ab2e84166ce9c5 /src/Java/gtPlusPlus | |
parent | b126379ca7e069c93c3b42a7e87e77c209a894c3 (diff) | |
download | GT5-Unofficial-f8814f83fa9f34e6088e98bed0561ce6cb13842d.tar.gz GT5-Unofficial-f8814f83fa9f34e6088e98bed0561ce6cb13842d.tar.bz2 GT5-Unofficial-f8814f83fa9f34e6088e98bed0561ce6cb13842d.zip |
- Disabled custom Tinkers Materials for the time being.
% Reworking custom TC aspects.
% Migrated lots of TC code to be reflective instead.
Diffstat (limited to 'src/Java/gtPlusPlus')
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"); |