aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus
diff options
context:
space:
mode:
authorAlkalus <Draknyte1@hotmail.com>2020-04-07 15:12:31 +0100
committerAlkalus <Draknyte1@hotmail.com>2020-04-07 15:12:31 +0100
commitcfbd10cfb2644a981b9b2763166aa66fce5cd491 (patch)
treeacd969969f05ca2883203eef6409cc217102c4bc /src/Java/gtPlusPlus
parentacf7193504fba4a7165d2ba5732cc9ce5f35ec55 (diff)
downloadGT5-Unofficial-cfbd10cfb2644a981b9b2763166aa66fce5cd491.tar.gz
GT5-Unofficial-cfbd10cfb2644a981b9b2763166aa66fce5cd491.tar.bz2
GT5-Unofficial-cfbd10cfb2644a981b9b2763166aa66fce5cd491.zip
+ Added support for Custom Machines being registered to the PA. (If GT is up-to date)
+ Added more ASM patches for better Hazmat handling. % Renamed Chemical Dehydrator to Dehydrator for clearer logic in NEI. $ Fixed a small bug in ReflectionUtils. $ Rewrote parts of my Hazmat handling, it should now work correctly for all items which apply radiation from IC2/GT or their addons.
Diffstat (limited to 'src/Java/gtPlusPlus')
-rw-r--r--src/Java/gtPlusPlus/GTplusplus.java2
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java222
-rw-r--r--src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java42
-rw-r--r--src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java8
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java664
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_IC2_Hazmat.java6
-rw-r--r--src/Java/gtPlusPlus/xmod/gregtech/HANDLER_GT.java4
-rw-r--r--src/Java/gtPlusPlus/xmod/gregtech/loaders/misc/AddCustomMachineToPA.java51
8 files changed, 873 insertions, 126 deletions
diff --git a/src/Java/gtPlusPlus/GTplusplus.java b/src/Java/gtPlusPlus/GTplusplus.java
index 0e70baf524..4ddec1f9f4 100644
--- a/src/Java/gtPlusPlus/GTplusplus.java
+++ b/src/Java/gtPlusPlus/GTplusplus.java
@@ -182,7 +182,6 @@ public class GTplusplus implements ActionListener {
public void init(final FMLInitializationEvent event) {
INIT_PHASE.INIT.setPhaseActive(true);
proxy.init(event);
- HazmatUtils.init();
proxy.registerNetworkStuff();
Meta_GT_Proxy.init();
Core_Manager.init();
@@ -199,6 +198,7 @@ public class GTplusplus implements ActionListener {
public void postInit(final FMLPostInitializationEvent event) {
INIT_PHASE.POST_INIT.setPhaseActive(true);
proxy.postInit(event);
+ HazmatUtils.init();
BookHandler.runLater();
Meta_GT_Proxy.postInit();
Core_Manager.postInit();
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java
index 87c9517c9d..1bb4c53bd2 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/HazmatUtils.java
@@ -1,31 +1,28 @@
package gtPlusPlus.core.util.minecraft;
-import static gregtech.api.GregTech_API.sBioHazmatList;
-import static gregtech.api.GregTech_API.sElectroHazmatList;
-import static gregtech.api.GregTech_API.sFrostHazmatList;
-import static gregtech.api.GregTech_API.sGasHazmatList;
-import static gregtech.api.GregTech_API.sHeatHazmatList;
-import static gregtech.api.GregTech_API.sRadioHazmatList;
-
-import java.util.Collections;
+import static gregtech.api.GregTech_API.*;
+
+import java.lang.reflect.Field;
import java.util.HashMap;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.GregTech_API;
import gregtech.api.objects.GT_HashSet;
import gregtech.api.objects.GT_ItemStack;
-import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
import gtPlusPlus.GTplusplus;
import gtPlusPlus.GTplusplus.INIT_PHASE;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.api.objects.data.AutoMap;
-import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.lib.LoadedMods;
import gtPlusPlus.core.util.Utils;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
+import ic2.core.Ic2Items;
import ic2.core.item.armor.ItemArmorHazmat;
import ic2.core.item.armor.ItemArmorNanoSuit;
import ic2.core.item.armor.ItemArmorQuantumSuit;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
@@ -33,44 +30,15 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent;
public class HazmatUtils {
public static final GT_HashSet<GT_ItemStack> sHazmatList = new GT_HashSet<GT_ItemStack>();
+
+ private static final HashMap<Item, Boolean> aIgnoreNBTMap = new HashMap<Item, Boolean>();
private static final HashMap<String, AutoMap<String>> mToolTips = new HashMap<String, AutoMap<String>>();
private static boolean mInit = false;
private static HazmatUtils mInstance;
-
- private static final String[] mDefaultHazmat = new String[] {
- "IC2:itemArmorNanoHelmet:27",
- "IC2:itemArmorNanoChestplate:27",
- "IC2:itemArmorNanoLegs:27",
- "IC2:itemArmorNanoBoots:27",
-
- "IC2:itemArmorQuantumHelmet:27",
- "IC2:itemArmorQuantumChestplate:27",
- "IC2:itemArmorQuantumLegs:27",
- "IC2:itemArmorQuantumBoots:27",
- };
-
-
- private static final String[] mGravisuit = new String[] {
- "GraviSuite:advNanoChestPlate:27",
- "GraviSuite:graviChestPlate:27",
- };
- private static final String[] mElectroMagicTools = new String[] {
- "EMT:NanosuitGogglesRevealing:27",
- "EMT:NanoBootsTraveller:27",
- "EMT:NanosuitWing:27",
- "EMT:itemArmorQuantumChestplate:27",
- "EMT:QuantumGogglesRevealing:27",
- "EMT:QuantumBootsTraveller:27",
- "EMT:QuantumWing:27",
- };
- private static final String[] mAdvancedSolarPanels = new String[] {
- "AdvancedSolarPanel:advanced_solar_helmet:27",
- "AdvancedSolarPanel:hybrid_solar_helmet:27",
- "AdvancedSolarPanel:ultimate_solar_helmet:27",
- };
+ @SuppressWarnings("rawtypes")
public static void init() {
if (mInit) {
return;
@@ -78,40 +46,101 @@ public class HazmatUtils {
mInstance = new HazmatUtils();
- sHazmatList.add(GT_ModHandler.getIC2Item("hazmatHelmet", 1L, 32767));
- sHazmatList.add(GT_ModHandler.getIC2Item("hazmatChestplate", 1L, 32767));
- sHazmatList.add(GT_ModHandler.getIC2Item("hazmatLeggings", 1L, 32767));
- sHazmatList.add(GT_ModHandler.getIC2Item("hazmatBoots", 1L, 32767));
+ sHazmatList.add(ItemUtils.getSimpleStack(Ic2Items.hazmatHelmet, 1));
+ sHazmatList.add(ItemUtils.getSimpleStack(Ic2Items.hazmatChestplate, 1));
+ sHazmatList.add(ItemUtils.getSimpleStack(Ic2Items.hazmatLeggings, 1));
+ sHazmatList.add(ItemUtils.getSimpleStack(Ic2Items.hazmatBoots, 1));
// Make Nano a hazmat suit
// Make Quantum a hazmat suit
if (LoadedMods.IndustrialCraft2 || LoadedMods.IndustrialCraft2Classic) {
- for (String aItemName : mDefaultHazmat) {
- String[] aSplit = aItemName.split(":");
- addProtection(GT_ModHandler.getIC2Item(aSplit[1], 1L, 32767));
+ AutoMap<ItemStack> aVanillaIC2Armour = new AutoMap<ItemStack>();
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.nanoHelmet, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.nanoBodyarmor, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.nanoLeggings, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.nanoBoots, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.quantumHelmet, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.quantumBodyarmor, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.quantumLeggings, 1));
+ aVanillaIC2Armour.add(ItemUtils.getSimpleStack(Ic2Items.quantumBoots, 1));
+ for (ItemStack aItem : aVanillaIC2Armour) {
+ addProtection(aItem);
}
Logger.INFO("[Hazmat] Registered IC2 Items as hazmat gear.");
}
if (LoadedMods.isModLoaded("EMT")) {
- for (String aItemName : mElectroMagicTools) {
- addProtection(ItemUtils.getItemStackFromFQRN(aItemName, 1));
+ AutoMap<Field> aItemFields = new AutoMap<Field>();
+ Class aItemsEMT = ReflectionUtils.getClass("emt.init.EMTItems");
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "nanoThaumicHelmet"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "nanoWing"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "nanoBootsTraveller"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "quantumThaumicHelmet"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "quantumWing"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "quantumArmor"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "quantumBootsTraveller"));
+ AutoMap<ItemStack> aEMT = new AutoMap<ItemStack>();
+ for (Field aItemField : aItemFields) {
+ Item aItemObject = null;
+ if (aItemField != null) {
+ try {
+ aItemObject = (Item) aItemField.get(null);
+ }
+ catch (Exception t) {
+ t.printStackTrace();
+ }
+ }
+ if (aItemObject != null) {
+ aEMT.add(ItemUtils.getSimpleStack(aItemObject));
+ }
+ else {
+ Logger.INFO("[Hazmat] Could not get "+aItemField.getName()+" from "+aItemsEMT.getName());
+ }
+ }
+ Logger.INFO("[Hazmat] Registering "+aEMT.size()+" EMT Items as hazmat gear.");
+ for (ItemStack aItem : aEMT) {
+ addProtection(aItem);
}
Logger.INFO("[Hazmat] Registered EMT Items as hazmat gear.");
}
- if (LoadedMods.isModLoaded("GraviSuite")) {
- for (String aItemName : mGravisuit) {
- addProtection(ItemUtils.getItemStackFromFQRN(aItemName, 1));
+ if (LoadedMods.isModLoaded("GraviSuite")) {
+ AutoMap<Field> aItemFields = new AutoMap<Field>();
+ Class aItemsGravisuite = ReflectionUtils.getClass("gravisuite.GraviSuite");
+ aItemFields.add(ReflectionUtils.getField(aItemsGravisuite, "advNanoChestPlate"));
+ aItemFields.add(ReflectionUtils.getField(aItemsGravisuite, "graviChestPlate"));
+ AutoMap<ItemStack> aGravisuite = new AutoMap<ItemStack>();
+ for (Field aItemField : aItemFields) {
+ Item aItemObject = (Item) ReflectionUtils.getFieldValue(aItemField);
+ if (aItemObject != null) {
+ aGravisuite.add(ItemUtils.getSimpleStack(aItemObject));
+ }
+ }
+ Logger.INFO("[Hazmat] Registering "+aGravisuite.size()+" Gravisuit Items as hazmat gear.");
+ for (ItemStack aItem : aGravisuite) {
+ addProtection(aItem);
}
Logger.INFO("[Hazmat] Registered Gravisuit Items as hazmat gear.");
}
if (LoadedMods.isModLoaded("AdvancedSolarPanel")) {
- for (String aItemName : mAdvancedSolarPanels) {
- addProtection(ItemUtils.getItemStackFromFQRN(aItemName, 1));
+ AutoMap<Field> aItemFields = new AutoMap<Field>();
+ Class aItemsEMT = ReflectionUtils.getClass("advsolar.common.AdvancedSolarPanel");
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "advancedSolarHelmet"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "hybridSolarHelmet"));
+ aItemFields.add(ReflectionUtils.getField(aItemsEMT, "ultimateSolarHelmet"));
+ AutoMap<ItemStack> aASP = new AutoMap<ItemStack>();
+ for (Field aItemField : aItemFields) {
+ Item aItemObject = (Item) ReflectionUtils.getFieldValue(aItemField);
+ if (aItemObject != null) {
+ aASP.add(ItemUtils.getSimpleStack(aItemObject));
+ }
+ }
+ Logger.INFO("[Hazmat] Registering "+aASP.size()+" Adv. Solar Items as hazmat gear.");
+ for (ItemStack aItem : aASP) {
+ addProtection(aItem);
}
Logger.INFO("[Hazmat] Registered Adv. Solar Items as hazmat gear.");
}
@@ -127,38 +156,36 @@ public class HazmatUtils {
@SubscribeEvent
public void onItemTooltip(ItemTooltipEvent event) {
//Logger.INFO("Ticking Hazmat handler");
- if (GTplusplus.CURRENT_LOAD_PHASE != INIT_PHASE.STARTED
- && GTplusplus.CURRENT_LOAD_PHASE != INIT_PHASE.SERVER_START) {
- //Logger.INFO("[Hazmat] Bad Phase : " + GTplusplus.CURRENT_LOAD_PHASE);
- return;
- }
- if (event.itemStack == null || isVanillaHazmatPiece(event.itemStack)) {
- //Logger.INFO("[Hazmat] Invalid Itemstack or vanilla hazmat");
- return;
- } else {
- ItemStack aStackTemp = event.itemStack;
- GT_ItemStack aStack = new GT_ItemStack(aStackTemp);
- if (isNanoArmourPiece(aStackTemp) || isQuantumArmourPiece(aStackTemp)) {
- event.toolTip.add(EnumChatFormatting.DARK_PURPLE+"Provides full hazmat protection.");
- }
- else {
- //Logger.INFO("[Hazmat] Finding Tooltip Data");
- String[] aTooltips = getTooltips(aStack);
- if (aTooltips == null || aTooltips.length == 0) {
- //Logger.INFO("[Hazmat] No Info!");
- return;
- } else {
- //Logger.INFO("[Hazmat] Found Tooltips!");
- if (providesProtection(aStackTemp)) {
- event.toolTip.add(EnumChatFormatting.LIGHT_PURPLE+"Provides full hazmat protection.");
+ if (GTplusplus.CURRENT_LOAD_PHASE == INIT_PHASE.STARTED) {
+
+ if (event.itemStack == null || isVanillaHazmatPiece(event.itemStack)) {
+ //Logger.INFO("[Hazmat] Invalid Itemstack or vanilla hazmat");
+ return;
+ } else {
+ ItemStack aStackTemp = event.itemStack;
+ GT_ItemStack aStack = new GT_ItemStack(aStackTemp);
+ if (isNanoArmourPiece(aStackTemp) || isQuantumArmourPiece(aStackTemp)) {
+ event.toolTip.add(EnumChatFormatting.DARK_PURPLE+"Provides full hazmat protection.");
+ }
+ else {
+ //Logger.INFO("[Hazmat] Finding Tooltip Data");
+ String[] aTooltips = getTooltips(aStack);
+ if (aTooltips == null || aTooltips.length == 0) {
+ //Logger.INFO("[Hazmat] No Info!");
+ return;
} else {
- event.toolTip.add(mToolTipText);
- for (String r : aTooltips) {
- event.toolTip.add(" - " + r);
+ //Logger.INFO("[Hazmat] Found Tooltips!");
+ if (providesProtection(aStackTemp)) {
+ event.toolTip.add(EnumChatFormatting.LIGHT_PURPLE+"Provides full hazmat protection.");
+ } else {
+ event.toolTip.add(mToolTipText);
+ for (String r : aTooltips) {
+ event.toolTip.add(" - " + r);
+ }
}
}
- }
- }
+ }
+ }
}
}
@@ -176,7 +203,7 @@ public class HazmatUtils {
if (living == null || living.isDead) {
return false;
} else {
-
+
// Map All Player Armour slots
AutoMap<ItemStack> aEquipment = new AutoMap<ItemStack>();
for (int i = 1; i < 5; ++i) {
@@ -193,11 +220,13 @@ public class HazmatUtils {
// Compare Equipment to all items mapped for full hazmat.
for (ItemStack aSlotStack : aEquipment) {
if (!isHazmatPiece(aSlotStack)) {
+ //Logger.INFO("Found item which is not hazmat. "+ItemUtils.getItemName(aSlotStack));
return false;
}
}
// We are in some kind of full hazmat, huzzah!
+ //Logger.INFO("Has full hazmat.");
return true;
}
}
@@ -250,8 +279,8 @@ public class HazmatUtils {
* @return - Did we register this ItemStack properly?
*/
public static boolean addProtection(ItemStack aVanStack) {
- if (ItemUtils.checkForInvalidItems(aVanStack)) {
- Logger.INFO("=========================Bad Hazmat Addition==============");
+ if (!ItemUtils.checkForInvalidItems(aVanStack)) {
+ Logger.INFO("=================Bad Hazmat Addition======================");
Logger.INFO("Called from: "+ReflectionUtils.getMethodName(0));
Logger.INFO(ReflectionUtils.getMethodName(1));
Logger.INFO(ReflectionUtils.getMethodName(2));
@@ -276,6 +305,7 @@ public class HazmatUtils {
return false;
}
}
+ aIgnoreNBTMap.put(aVanStack.getItem(), true);
Logger.INFO("[Hazmat] Protection added for all 6 damage types, registering to master Hazmat list.");
sHazmatList.add(aStack);
return true;
@@ -360,23 +390,29 @@ public class HazmatUtils {
}
for (GT_ItemStack o : aSet) {
if (o != null) {
+ if (GT_Utility.areStacksEqual(o.toStack(), aStack, true)) {
+ return true;
+ }
if (o.isStackEqual(aStack)){
return true;
}
+ if (o.mItem == aStack.getItem() && EnergyUtils.EU.isElectricItem(aStack)) {
+ return true;
+ }
}
}
return false;
}
private static String[] getTooltips(GT_ItemStack aStack) {
- String aKey = convertGtItemstackToStringData(aStack);
+ String aKey = convertGtItemstackToStringDataIgnoreDamage(aStack);
AutoMap<String> aTempTooltipData = mToolTips.get(aKey);
- if (aTempTooltipData == null) {
+ if (aTempTooltipData == null || aTempTooltipData.isEmpty()) {
//Logger.INFO("[Hazmat] Item was not mapped for TTs - "+aKey);
return new String[] {};
} else {
//Logger.INFO("[Hazmat] Item was mapped for TTs");
- Collections.sort(aTempTooltipData);
+ //Collections.sort(aTempTooltipData);
//Logger.INFO("[Hazmat] Sorted TTs");
String[] mBuiltOutput = new String[aTempTooltipData.size()];
@@ -390,15 +426,15 @@ public class HazmatUtils {
}
private static void registerTooltip(GT_ItemStack aStack, String aTooltip) {
- String aKey = convertGtItemstackToStringData(aStack);
+ String aKey = convertGtItemstackToStringDataIgnoreDamage(aStack);
Logger.INFO("[Hazmat] Mapping " + aTooltip + " for " + aKey);
AutoMap<String> aTempTooltipData = mToolTips.get(aKey);
if (aTempTooltipData == null) {
Logger.INFO("No data mapped yet, creating.");
aTempTooltipData = new AutoMap<String>();
+ mToolTips.put(aKey, aTempTooltipData);
}
aTempTooltipData.add(aTooltip);
- mToolTips.put(convertGtItemstackToStringData(aStack), aTempTooltipData);
}
public static ItemStack getStackFromGtStack(GT_ItemStack aGtStack) {
diff --git a/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java b/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java
index 3cb2d4cec3..19a40fd9e6 100644
--- a/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java
+++ b/src/Java/gtPlusPlus/core/util/minecraft/ItemUtils.java
@@ -109,7 +109,7 @@ public class ItemUtils {
final ItemStack y = ItemUtils.simpleMetaStack(x, WILDCARD_VALUE, 1);
return y;
}
-
+
public static ItemStack getIC2Cell(final String S) {
final ItemStack moreTemp = ItemUtils.getItemStackOfAmountFromOreDictNoBroken("cell" + S, 1);
@@ -174,7 +174,7 @@ public class ItemUtils {
Logger.ERROR(ItemUtils.getItemName(stack) + " not registered. [NULL]");
}
}
-
+
public static void addItemToOreDictionary(final ItemStack stack, final String oreDictName) {
addItemToOreDictionary(stack, oreDictName, false);
}
@@ -291,19 +291,29 @@ public class ItemUtils {
public static ItemStack getItemStackFromFQRN(final String fqrn, final int Size) // fqrn = fully qualified resource name
{
+ Logger.INFO("Trying to split string '"+fqrn+"'.");
final String[] fqrnSplit = fqrn.split(":");
if (fqrnSplit.length < 2) {
return null;
}
- else if (fqrnSplit.length == 2) {
- return GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
- }
else {
- if (fqrnSplit.length == 3) {
+ if (fqrnSplit.length == 2) {
+ Logger.INFO("Mod: "+fqrnSplit[0]+", Item: "+fqrnSplit[1]);
+ return GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
+ }
+ else if (fqrnSplit.length == 3 && fqrnSplit[2] != null && fqrnSplit[2].length() > 0) {
+ Logger.INFO("Mod: "+fqrnSplit[0]+", Item: "+fqrnSplit[1]+", Meta: "+fqrnSplit[2]);
ItemStack aStack = GameRegistry.findItemStack(fqrnSplit[0], fqrnSplit[1], Size);
- int aMeta = Integer.getInteger(fqrnSplit[2]);
- return ItemUtils.simpleMetaStack(aStack, aMeta, Size);
+ int aMeta = Integer.parseInt(fqrnSplit[2]);
+ if (aStack != null && (aMeta >= 0 && aMeta <= Short.MAX_VALUE)){
+ return ItemUtils.simpleMetaStack(aStack, aMeta, Size);
+ }
+ else {
+ Logger.INFO("Could not find instance of Item: "+fqrnSplit[1]);
+
+ }
}
+
}
return null;
}
@@ -1081,11 +1091,11 @@ public class ItemUtils {
}
-
+
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";
}
@@ -1262,7 +1272,7 @@ public class ItemUtils {
}
return false;
}
-
+
public static boolean isCatalyst(ItemStack aStack) {
if (GT_Utility.areStacksEqual(aStack, RocketFuels.Formaldehyde_Catalyst_Stack, true)) {
return true;
@@ -1293,7 +1303,7 @@ public class ItemUtils {
}
return false;
}
-
+
public static boolean isMillingBall(ItemStack aStack) {
if (GT_Utility.areStacksEqual(aStack, GenericChem.mMillingBallAlumina, true)) {
return true;
@@ -1307,9 +1317,9 @@ public class ItemUtils {
public static String getLocalizedNameOfBlock(Block aBlock, int aMeta) {
return LangUtils.getLocalizedNameOfBlock(aBlock, aMeta);
}
-
-
+
+
public static boolean doesItemListEntryExist(String string) {
ItemList[] aListValues = ItemList.class.getEnumConstants();
for (ItemList aItem : aListValues) {
@@ -1337,11 +1347,11 @@ public class ItemUtils {
}
return aOther;
}
-
+
public static ItemStack getValueOfItemList(String string, int aAmount, ItemList aOther) {
return getValueOfItemList(string, aOther).get(aAmount);
}
-
+
public static ItemStack getValueOfItemList(String string, int aAmount, ItemStack aOther) {
ItemList[] aListValues = ItemList.class.getEnumConstants();
for (ItemList aItem : aListValues) {
diff --git a/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java b/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
index 59d20835ae..8b9b5cf94f 100644
--- a/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
+++ b/src/Java/gtPlusPlus/core/util/reflect/ReflectionUtils.java
@@ -537,17 +537,17 @@ public class ReflectionUtils {
public static Object invokeNonBool(Object objectInstance, Method method, Object[] values){
- if (objectInstance == null || method == null || values == null){
+ if ((!ReflectionUtils.isStaticMethod(method) && objectInstance == null) || method == null || values == null){
return false;
}
String methodName = method.getName();
- Class<?> mLocalClass = (objectInstance instanceof Class ? (Class<?>) objectInstance : objectInstance.getClass());
- Logger.REFLECTION("Trying to invoke "+methodName+" on an instance of "+mLocalClass.getCanonicalName()+".");
+ String classname = objectInstance != null ? objectInstance.getClass().getCanonicalName() : method.getDeclaringClass().getCanonicalName();
+ Logger.REFLECTION("Trying to invoke "+methodName+" on an instance of "+classname+".");
try {
return method.invoke(objectInstance, values);
}
catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
- Logger.REFLECTION("Failed to Dynamically invoke "+methodName+" on an object of type: "+mLocalClass.getName());
+ Logger.REFLECTION("Failed to Dynamically invoke "+methodName+" on an object of type: "+classname);
}
Logger.REFLECTION("Invoke failed or did something wrong.");
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java
index 307900ad9e..3381518c1f 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Utility.java
@@ -1,11 +1,6 @@
package gtPlusPlus.preloader.asm.transformers;
-import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
-import static org.objectweb.asm.Opcodes.ACC_STATIC;
-import static org.objectweb.asm.Opcodes.ASM5;
-import static org.objectweb.asm.Opcodes.INVOKESTATIC;
-import static org.objectweb.asm.Opcodes.IRETURN;
-import static org.objectweb.asm.Opcodes.LLOAD;
+import static org.objectweb.asm.Opcodes.*;
import org.apache.logging.log4j.Level;
import org.objectweb.asm.ClassReader;
@@ -47,6 +42,7 @@ public class ClassTransformer_GT_Utility {
if (reader != null && writer != null) {
FMLRelaunchLog.log("[GT++ ASM] Gregtech Utilities Patch", Level.INFO, "Attempting Method Injection.");
injectMethod("getTier");
+ injectMethod("applyRadioactivity");
}
}
@@ -85,6 +81,638 @@ public class ClassTransformer_GT_Utility {
mv.visitEnd();
didInject = true;
}
+ if (aMethodName.equals("applyRadioactivity")){
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "applyRadioactivity", "(Lnet/minecraft/entity/EntityLivingBase;II)Z", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitLineNumber(1352, l0);
+ mv.visitVarInsn(ILOAD, 1);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFLE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitJumpInsn(IFNULL, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getCreatureAttribute", "()Lnet/minecraft/entity/EnumCreatureAttribute;", false);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/entity/EnumCreatureAttribute", "UNDEAD", "Lnet/minecraft/entity/EnumCreatureAttribute;");
+ mv.visitJumpInsn(IF_ACMPEQ, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getCreatureAttribute", "()Lnet/minecraft/entity/EnumCreatureAttribute;", false);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/entity/EnumCreatureAttribute", "ARTHROPOD", "Lnet/minecraft/entity/EnumCreatureAttribute;");
+ mv.visitJumpInsn(IF_ACMPEQ, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESTATIC, "ic2/core/item/armor/ItemArmorHazmat", "hasCompleteHazmat", "(Lnet/minecraft/entity/EntityLivingBase;)Z", false);
+ mv.visitJumpInsn(IFNE, l1);
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitLineNumber(1353, l2);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitVarInsn(ASTORE, 3);
+ Label l3 = new Label();
+ mv.visitLabel(l3);
+ mv.visitLineNumber(1354, l3);
+ mv.visitVarInsn(ALOAD, 0);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitTypeInsn(NEW, "net/minecraft/potion/PotionEffect");
+ mv.visitInsn(DUP);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "moveSlowdown", "Lnet/minecraft/potion/Potion;");
+ mv.visitFieldInsn(GETFIELD, "net/minecraft/potion/Potion", "id", "I");
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitIntInsn(SIPUSH, 140);
+ mv.visitInsn(IMUL);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitInsn(IMUL);
+ mv.visitInsn(ICONST_0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "moveSlowdown", "Lnet/minecraft/potion/Potion;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getActivePotionEffect", "(Lnet/minecraft/potion/Potion;)Lnet/minecraft/potion/PotionEffect;", false);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(ASTORE, 3);
+ Label l5 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l5);
+ mv.visitInsn(ICONST_0);
+ Label l6 = new Label();
+ mv.visitJumpInsn(GOTO, l6);
+ mv.visitLabel(l5);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 6, new Object[] {"net/minecraft/entity/EntityLivingBase", l4, l4, INTEGER, INTEGER, INTEGER});
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/potion/PotionEffect", "getDuration", "()I", false);
+ mv.visitLabel(l6);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 7, new Object[] {"net/minecraft/entity/EntityLivingBase", l4, l4, INTEGER, INTEGER, INTEGER, INTEGER});
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitInsn(IADD);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(ICONST_5);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitInsn(IMUL);
+ mv.visitIntInsn(BIPUSH, 7);
+ mv.visitInsn(IDIV);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitMethodInsn(INVOKESPECIAL, "net/minecraft/potion/PotionEffect", "<init>", "(III)V", false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "addPotionEffect", "(Lnet/minecraft/potion/PotionEffect;)V", false);
+ Label l7 = new Label();
+ mv.visitLabel(l7);
+ mv.visitLineNumber(1355, l7);
+ mv.visitVarInsn(ALOAD, 0);
+ Label l8 = new Label();
+ mv.visitLabel(l8);
+ mv.visitTypeInsn(NEW, "net/minecraft/potion/PotionEffect");
+ mv.visitInsn(DUP);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "digSlowdown", "Lnet/minecraft/potion/Potion;");
+ mv.visitFieldInsn(GETFIELD, "net/minecraft/potion/Potion", "id", "I");
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitIntInsn(SIPUSH, 150);
+ mv.visitInsn(IMUL);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitInsn(IMUL);
+ mv.visitInsn(ICONST_0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "digSlowdown", "Lnet/minecraft/potion/Potion;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getActivePotionEffect", "(Lnet/minecraft/potion/Potion;)Lnet/minecraft/potion/PotionEffect;", false);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(ASTORE, 3);
+ Label l9 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l9);
+ mv.visitInsn(ICONST_0);
+ Label l10 = new Label();
+ mv.visitJumpInsn(GOTO, l10);
+ mv.visitLabel(l9);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 6, new Object[] {"net/minecraft/entity/EntityLivingBase", l8, l8, INTEGER, INTEGER, INTEGER});
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/potion/PotionEffect", "getDuration", "()I", false);
+ mv.visitLabel(l10);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 7, new Object[] {"net/minecraft/entity/EntityLivingBase", l8, l8, INTEGER, INTEGER, INTEGER, INTEGER});
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitInsn(IADD);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(ICONST_5);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitInsn(IMUL);
+ mv.visitIntInsn(BIPUSH, 7);
+ mv.visitInsn(IDIV);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitMethodInsn(INVOKESPECIAL, "net/minecraft/potion/PotionEffect", "<init>", "(III)V", false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "addPotionEffect", "(Lnet/minecraft/potion/PotionEffect;)V", false);
+ Label l11 = new Label();
+ mv.visitLabel(l11);
+ mv.visitLineNumber(1356, l11);
+ mv.visitVarInsn(ALOAD, 0);
+ Label l12 = new Label();
+ mv.visitLabel(l12);
+ mv.visitTypeInsn(NEW, "net/minecraft/potion/PotionEffect");
+ mv.visitInsn(DUP);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "confusion", "Lnet/minecraft/potion/Potion;");
+ mv.visitFieldInsn(GETFIELD, "net/minecraft/potion/Potion", "id", "I");
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitIntInsn(SIPUSH, 130);
+ mv.visitInsn(IMUL);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitInsn(IMUL);
+ mv.visitInsn(ICONST_0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "confusion", "Lnet/minecraft/potion/Potion;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getActivePotionEffect", "(Lnet/minecraft/potion/Potion;)Lnet/minecraft/potion/PotionEffect;", false);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(ASTORE, 3);
+ Label l13 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l13);
+ mv.visitInsn(ICONST_0);
+ Label l14 = new Label();
+ mv.visitJumpInsn(GOTO, l14);
+ mv.visitLabel(l13);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 6, new Object[] {"net/minecraft/entity/EntityLivingBase", l12, l12, INTEGER, INTEGER, INTEGER});
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/potion/PotionEffect", "getDuration", "()I", false);
+ mv.visitLabel(l14);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 7, new Object[] {"net/minecraft/entity/EntityLivingBase", l12, l12, INTEGER, INTEGER, INTEGER, INTEGER});
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitInsn(IADD);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(ICONST_5);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitInsn(IMUL);
+ mv.visitIntInsn(BIPUSH, 7);
+ mv.visitInsn(IDIV);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitMethodInsn(INVOKESPECIAL, "net/minecraft/potion/PotionEffect", "<init>", "(III)V", false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "addPotionEffect", "(Lnet/minecraft/potion/PotionEffect;)V", false);
+ Label l15 = new Label();
+ mv.visitLabel(l15);
+ mv.visitLineNumber(1357, l15);
+ mv.visitVarInsn(ALOAD, 0);
+ Label l16 = new Label();
+ mv.visitLabel(l16);
+ mv.visitTypeInsn(NEW, "net/minecraft/potion/PotionEffect");
+ mv.visitInsn(DUP);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "weakness", "Lnet/minecraft/potion/Potion;");
+ mv.visitFieldInsn(GETFIELD, "net/minecraft/potion/Potion", "id", "I");
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitIntInsn(SIPUSH, 150);
+ mv.visitInsn(IMUL);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitInsn(IMUL);
+ mv.visitInsn(ICONST_0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "weakness", "Lnet/minecraft/potion/Potion;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getActivePotionEffect", "(Lnet/minecraft/potion/Potion;)Lnet/minecraft/potion/PotionEffect;", false);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(ASTORE, 3);
+ Label l17 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l17);
+ mv.visitInsn(ICONST_0);
+ Label l18 = new Label();
+ mv.visitJumpInsn(GOTO, l18);
+ mv.visitLabel(l17);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 6, new Object[] {"net/minecraft/entity/EntityLivingBase", l16, l16, INTEGER, INTEGER, INTEGER});
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/potion/PotionEffect", "getDuration", "()I", false);
+ mv.visitLabel(l18);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 7, new Object[] {"net/minecraft/entity/EntityLivingBase", l16, l16, INTEGER, INTEGER, INTEGER, INTEGER});
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitInsn(IADD);
+ mv.visitInsn(ICONST_0);
+ mv.visitInsn(ICONST_5);
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitInsn(IMUL);
+ mv.visitIntInsn(BIPUSH, 7);
+ mv.visitInsn(IDIV);
+ mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);
+ mv.visitMethodInsn(INVOKESPECIAL, "net/minecraft/potion/PotionEffect", "<init>", "(III)V", false);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "addPotionEffect", "(Lnet/minecraft/potion/PotionEffect;)V", false);
+ Label l19 = new Label();
+ mv.visitLabel(l19);
+ mv.visitLineNumber(1358, l19);
+ mv.visitVarInsn(ALOAD, 0);
+ Label l20 = new Label();
+ mv.visitLabel(l20);
+ mv.visitTypeInsn(NEW, "net/minecraft/potion/PotionEffect");
+ mv.visitInsn(DUP);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "hunger", "Lnet/minecraft/potion/Potion;");
+ mv.visitFieldInsn(GETFIELD, "net/minecraft/potion/Potion", "id", "I");
+ mv.visitVarInsn(ILOAD, 1);
+ mv.visitIntInsn(SIPUSH, 130);
+ mv.visitInsn(IMUL);
+ mv.visitVarInsn(ILOAD, 2);
+ mv.visitInsn(IMUL);
+ mv.visitInsn(ICONST_0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETSTATIC, "net/minecraft/potion/Potion", "hunger", "Lnet/minecraft/potion/Potion;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/entity/EntityLivingBase", "getActivePotionEffect", "(Lnet/minecraft/potion/Potion;)Lnet/minecraft/potion/PotionEffect;", false);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(ASTORE, 3);
+ Label l21 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l21);
+ mv.visitInsn(ICONST_0);
+ Label l22 = new Label();
+ mv.visitJumpInsn(GOTO, l22);
+ mv.visitLabel(l21);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 6, new Object[] {"net/minecraft/entity/EntityLivingBase", l20, l20, INTEGER, INTEGER, INTEGER});
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/potion/PotionEffect", "getDuration", "()I", false);
+ mv.visitLabel(l22);
+ mv.visitFrame(F_FULL, 4, new Object[] {"net/minecraft/entity/EntityLivingBase", INTEGER, INTEGER, "net/minecraft/potion/PotionEffect"}, 7, new Object[] {"net/minecraft/entity/EntityLivingBase", l20, l20, INTEGER, INTEGER, INTEGER, I