aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlkalus <3060479+draknyte1@users.noreply.github.com>2018-10-24 15:23:33 +0100
committerAlkalus <3060479+draknyte1@users.noreply.github.com>2018-10-24 15:23:33 +0100
commit5ea5183724134c5ca6259ef7efcf46209661ecc7 (patch)
tree42c8633394c05f74a00ff508e16f878e7a779fa0 /src
parent77988b402385ebdb5becc80c6c178648cb5f5642 (diff)
downloadGT5-Unofficial-5ea5183724134c5ca6259ef7efcf46209661ecc7.tar.gz
GT5-Unofficial-5ea5183724134c5ca6259ef7efcf46209661ecc7.tar.bz2
GT5-Unofficial-5ea5183724134c5ca6259ef7efcf46209661ecc7.zip
+ Added ASM patch for GT MetaTile Tooltips.
% Improve GT ASM.
Diffstat (limited to 'src')
-rw-r--r--src/Java/gtPlusPlus/api/helpers/MaterialHelper.java41
-rw-r--r--src/Java/gtPlusPlus/api/objects/minecraft/FormattedTooltipString.java25
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java2
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java138
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java5
-rw-r--r--src/Java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java95
-rw-r--r--src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java10
7 files changed, 313 insertions, 3 deletions
diff --git a/src/Java/gtPlusPlus/api/helpers/MaterialHelper.java b/src/Java/gtPlusPlus/api/helpers/MaterialHelper.java
index 0acee40a0f..43f8ddeb19 100644
--- a/src/Java/gtPlusPlus/api/helpers/MaterialHelper.java
+++ b/src/Java/gtPlusPlus/api/helpers/MaterialHelper.java
@@ -2,10 +2,15 @@ package gtPlusPlus.api.helpers;
import net.minecraft.item.ItemStack;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
-
+import gregtech.api.metatileentity.implementations.GT_MetaPipeEntity_Fluid;
+import gregtech.api.util.GT_OreDictUnificator;
import gtPlusPlus.core.material.Material;
+import gtPlusPlus.core.util.Utils;
import gtPlusPlus.core.util.minecraft.ItemUtils;
public class MaterialHelper {
@@ -17,4 +22,38 @@ public class MaterialHelper {
return ItemUtils.getGregtechOreStack(oreprefix, material, amount);
}
+ /**
+ * Generates a 16 Fluid Pipe
+ * @see {@code Example: Copper 16x Pipe (Materials.Copper, Materials.Copper.mName, "Copper", ID, 60, 1000, true)}
+ * @param aMaterial - Pipe Material
+ * @param name - Pipe Internal name
+ * @param displayName - Pipe Display Name
+ * @param aID - Pipe's Meta ID
+ * @param baseCapacity - Pipes Base Capacity
+ * @param heatCapacity - Pipe Max Temp
+ * @param gasProof - Is Gas Proof?
+ * @return A boolean which corresponds to whether or not the Pipe was registered to the Ore Dictionary.
+ */
+ public static boolean generateHexadecuplePipe(Materials aMaterial, String name, String displayName, int aID,
+ int baseCapacity, int heatCapacity, boolean gasProof) {
+ if (Utils.getGregtechVersionAsInt() >= 50930) {
+ try {
+ Class<GT_MetaPipeEntity_Fluid> aPipeEntity = GT_MetaPipeEntity_Fluid.class;
+ Constructor<GT_MetaPipeEntity_Fluid> constructor = aPipeEntity
+ .getConstructor(new Class[] { int.class, String.class, String.class, float.class,
+ Materials.class, int.class, int.class, boolean.class, int.class });
+ if (constructor != null) {
+ GT_MetaPipeEntity_Fluid aPipe;
+ aPipe = constructor.newInstance(aID, "GT_Pipe_" + name + "_Hexadecuple",
+ "Hexadecuple " + displayName + " Fluid Pipe", 1.0F, aMaterial, baseCapacity, heatCapacity,
+ gasProof, 16);
+ return GT_OreDictUnificator.registerOre("pipeHexadecuple" + aMaterial, aPipe.getStackForm(1L));
+ }
+
+ } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException
+ | IllegalArgumentException | InvocationTargetException e) {
+ }
+ }
+ return false;
+ }
}
diff --git a/src/Java/gtPlusPlus/api/objects/minecraft/FormattedTooltipString.java b/src/Java/gtPlusPlus/api/objects/minecraft/FormattedTooltipString.java
new file mode 100644
index 0000000000..ec13c82ea0
--- /dev/null
+++ b/src/Java/gtPlusPlus/api/objects/minecraft/FormattedTooltipString.java
@@ -0,0 +1,25 @@
+package gtPlusPlus.api.objects.minecraft;
+
+public class FormattedTooltipString {
+
+ public final String mText;
+ public final boolean mPrefix;
+
+ public FormattedTooltipString(String aText, boolean aPrefix) {
+ mText = aText;
+ mPrefix = aPrefix;
+ }
+
+ public String getTooltip(Object aTagValue) {
+ String aTip;
+
+ if (mPrefix) {
+ aTip = mText+": "+aTagValue.toString();
+ }
+ else {
+ aTip = ""+aTagValue.toString()+": "+mText;
+ }
+ return aTip;
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java
index e65d9d11eb..0d2fcc70a4 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java
@@ -16,7 +16,7 @@ import gtPlusPlus.preloader.DevHelper;
public class ClassTransformer_GT_BlockMachines_NBT {
//The qualified name of the class we plan to transform.
- private static final String className = "micdoodle8.mods.galacticraft.core.util.FluidUtil";
+ private static final String className = "gregtech.common.blocks.GT_Block_Machines";
//gregtech/common/blocks/GT_Block_Machines
private final boolean isValid;
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java
new file mode 100644
index 0000000000..49981d134e
--- /dev/null
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java
@@ -0,0 +1,138 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.*;
+
+import java.io.IOException;
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.preloader.DevHelper;
+
+public class ClassTransformer_GT_ItemMachines_Tooltip {
+
+ //The qualified name of the class we plan to transform.
+ private static final String className = "gregtech.common.blocks.GT_Item_Machines";
+ //gregtech/common/blocks/GT_Item_Machines
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ String aEntityPlayer;
+ String aItemStack;
+ String aWorld;
+
+ private static boolean doesMethodAlreadyExist = false;
+
+ public ClassTransformer_GT_ItemMachines_Tooltip(byte[] basicClass, boolean obfuscated) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ try {
+ aTempReader = new ClassReader(className);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ new ClassReader(basicClass).accept(new localClassVisitor(aTempWriter), 0);
+ } catch (IOException e) {}
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ }
+ else {
+ isValid = false;
+ }
+ reader = aTempReader;
+ writer = aTempWriter;
+
+ if (reader != null && writer != null && !doesMethodAlreadyExist) {
+ aEntityPlayer = obfuscated ? DevHelper.getObfuscated("net/minecraft/entity/player/EntityPlayer") : "net/minecraft/entity/player/EntityPlayer";
+ aItemStack = obfuscated ? DevHelper.getObfuscated("net/minecraft/item/ItemStack") : "net/minecraft/item/ItemStack";
+ aWorld = obfuscated ? DevHelper.getObfuscated("net/minecraft/world/World") : "net/minecraft/world/World";
+
+ injectMethod("addInformation");
+ }
+
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public void injectMethod(String aMethodName) {
+ MethodVisitor mv;
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+".");
+ if (aMethodName.equals("addInformation")) {
+
+ mv = getWriter().visitMethod(ACC_PUBLIC, "addInformation", "(L"+aItemStack+";L"+aEntityPlayer+";Ljava/util/List;Z)V", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ Label l1 = new Label();
+ Label l2 = new Label();
+ mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
+ mv.visitLabel(l0);
+ mv.visitLineNumber(120, l0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitVarInsn(ILOAD, 4);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy", "conStructGtTileBlockTooltip", "(L"+aItemStack+";L"+aEntityPlayer+";Ljava/util/List;Z)V", false);
+ mv.visitLabel(l1);
+ mv.visitLineNumber(121, l1);
+ Label l3 = new Label();
+ mv.visitJumpInsn(GOTO, l3);
+ mv.visitLabel(l2);
+ mv.visitFrame(F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ mv.visitVarInsn(ASTORE, 5);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(122, l4);
+ mv.visitVarInsn(ALOAD, 5);
+ mv.visitFieldInsn(GETSTATIC, "gregtech/api/util/GT_Log", "err", "Ljava/io/PrintStream;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "printStackTrace", "(Ljava/io/PrintStream;)V", false);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(124, l3);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitInsn(RETURN);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLocalVariable("this", "Lgregtech/common/blocks/GT_Item_Machines;", null, l0, l5, 0);
+ mv.visitLocalVariable("aStack", "L"+aItemStack+";", null, l0, l5, 1);
+ mv.visitLocalVariable("aPlayer", "L"+aEntityPlayer+";", null, l0, l5, 2);
+ mv.visitLocalVariable("aList", "Ljava/util/List;", null, l0, l5, 3);
+ mv.visitLocalVariable("par4", "Z", null, l0, l5, 4);
+ mv.visitLocalVariable("e", "Ljava/lang/Throwable;", null, l4, l3, 5);
+ mv.visitMaxs(4, 6);
+ mv.visitEnd();
+}
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Method injection complete.");
+
+ }
+
+ public static final class localClassVisitor extends ClassVisitor {
+
+ public localClassVisitor(ClassVisitor cv) {
+ super(ASM5, cv);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ if (name.equals("addInformation")) {
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Found method "+name+", Patching.");
+ return null;
+ }
+ MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ return methodVisitor;
+ }
+ }
+
+}
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
index 3738140b0d..c54f81c456 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -77,6 +77,11 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] Gregtech NBT Persistency Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_GT_BlockMachines_NBT(basicClass, obfuscated).getWriter().toByteArray();
}
+ //Patching Meta Tile Tooltips
+ if (transformedName.equals("gregtech.common.blocks.GT_Item_Machines")) {
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Transforming %s", transformedName);
+ return new ClassTransformer_GT_ItemMachines_Tooltip(basicClass, obfuscated).getWriter().toByteArray();
+ }
return basicClass;
}
diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java b/src/Java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
index 6881c900b5..da6171651f 100644
--- a/src/Java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
+++ b/src/Java/gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy.java
@@ -5,7 +5,9 @@ import static gtPlusPlus.xmod.gregtech.common.covers.GTPP_Cover_Overflow.mOverfl
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
@@ -13,11 +15,22 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.fluids.FluidStack;
import gregtech.GT_Mod;
import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_Utility;
import gregtech.common.GT_Proxy;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.api.objects.data.ObjMap;
+import gtPlusPlus.api.objects.minecraft.FormattedTooltipString;
import gtPlusPlus.core.util.reflect.ProxyFinder;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
@@ -25,6 +38,8 @@ public class Meta_GT_Proxy {
public static List<Runnable> GT_BlockIconload = new ArrayList<>();
public static List<Runnable> GT_ItemIconload = new ArrayList<>();
+
+ public static final Map<String, FormattedTooltipString> mCustomGregtechMetaTooltips = new LinkedHashMap<String, FormattedTooltipString>();
@SideOnly(Side.CLIENT)
public static IIconRegister sBlockIcons, sItemIcons;
@@ -119,5 +134,85 @@ public class Meta_GT_Proxy {
}
return null;
}
+
+ public void setCustomGregtechTooltip(String aNbtTagName, FormattedTooltipString aData) {
+ mCustomGregtechMetaTooltips.put(aNbtTagName, aData);
+ }
+
+ public static void conStructGtTileBlockTooltip(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean par4) {
+ try {
+ int tDamage = aStack.getItemDamage();
+ if ((tDamage <= 0) || (tDamage >= GregTech_API.METATILEENTITIES.length)) {
+ return;
+ }
+
+ if (GregTech_API.METATILEENTITIES[tDamage] != null) {
+ IGregTechTileEntity tTileEntity = GregTech_API.METATILEENTITIES[tDamage].getBaseMetaTileEntity();
+ if (tTileEntity.getDescription() != null) {
+ int i = 0;
+ for (String tDescription : tTileEntity.getDescription()) {
+ if (GT_Utility.isStringValid(tDescription)) {
+ if(tDescription.contains("%%%")){
+ String[] tString = tDescription.split("%%%");
+ if(tString.length>=2){
+ StringBuffer tBuffer = new StringBuffer();
+ Object tRep[] = new String[tString.length / 2];
+ for (int j = 0; j < tString.length; j++)
+ if (j % 2 == 0) tBuffer.append(tString[j]);
+ else {tBuffer.append(" %s"); tRep[j / 2] = tString[j];}
+ aList.add(String.format(GT_LanguageManager.addStringLocalization("TileEntity_DESCRIPTION_" + tDamage + "_Index_" + i++, tBuffer.toString(), !GregTech_API.sPostloadFinished), tRep));
+ }
+ }else{String tTranslated = GT_LanguageManager.addStringLocalization("TileEntity_DESCRIPTION_" + tDamage + "_Index_" + i++, tDescription, !GregTech_API.sPostloadFinished );
+ aList.add(tTranslated.equals("") ? tDescription : tTranslated);}
+ }else i++;
+ }
+ }
+ if (tTileEntity.getEUCapacity() > 0L) {
+ if (tTileEntity.getInputVoltage() > 0L) {
+ aList.add(GT_LanguageManager.addStringLocalization("TileEntity_EUp_IN", "Voltage IN: ", !GregTech_API.sPostloadFinished ) + EnumChatFormatting.GREEN + tTileEntity.getInputVoltage() + " (" + GT_Values.VN[GT_Utility.getTier(tTileEntity.getInputVoltage())] + ")" + EnumChatFormatting.GRAY);
+ }
+ if (tTileEntity.getOutputVoltage() > 0L) {
+ aList.add(GT_LanguageManager.addStringLocalization("TileEntity_EUp_OUT", "Voltage OUT: ", !GregTech_API.sPostloadFinished ) + EnumChatFormatting.GREEN + tTileEntity.getOutputVoltage() + " (" + GT_Values.VN[GT_Utility.getTier(tTileEntity.getOutputVoltage())] + ")" + EnumChatFormatting.GRAY);
+ }
+ if (tTileEntity.getOutputAmperage() > 1L) {
+ aList.add(GT_LanguageManager.addStringLocalization("TileEntity_EUp_AMOUNT", "Amperage: ", !GregTech_API.sPostloadFinished ) + EnumChatFormatting.YELLOW + tTileEntity.getOutputAmperage() + EnumChatFormatting.GRAY);
+ }
+ aList.add(GT_LanguageManager.addStringLocalization("TileEntity_EUp_STORE", "Capacity: ", !GregTech_API.sPostloadFinished ) + EnumChatFormatting.BLUE + tTileEntity.getEUCapacity() + EnumChatFormatting.GRAY);
+ }
+ }
+ NBTTagCompound aNBT = aStack.getTagCompound();
+ if (aNBT != null) {
+ if (aNBT.getBoolean("mMuffler")) {
+ aList.add(GT_LanguageManager.addStringLocalization("GT_TileEntity_MUFFLER", "has Muffler Upgrade", !GregTech_API.sPostloadFinished ));
+ }
+ if (aNBT.getBoolean("mSteamConverter")) {
+ aList.add(GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMCONVERTER", "has Steam Upgrade", !GregTech_API.sPostloadFinished ));
+ }
+ int tAmount = 0;
+ if ((tAmount = aNBT.getByte("mSteamTanks")) > 0) {
+ aList.add(tAmount + " " + GT_LanguageManager.addStringLocalization("GT_TileEntity_STEAMTANKS", "Steam Tank Upgrades", !GregTech_API.sPostloadFinished ));
+ }
+
+ FluidStack afluid = net.minecraftforge.fluids.FluidStack.loadFluidStackFromNBT(aNBT.getCompoundTag("mFluid"));
+ if (afluid != null) {
+ int tFluidAmount = afluid.amount;
+ if (tFluidAmount > 0) {
+ aList.add(tFluidAmount + " " + GT_LanguageManager.addStringLocalization("GT_TileEntity_FLUIDTANK", "Fluid: "+afluid.getLocalizedName()+" "+tFluidAmount+"L", !GregTech_API.sPostloadFinished ));
+ }
+ }
+
+ //Add Custom Tooltips
+ for (String s : mCustomGregtechMetaTooltips.keySet()) {
+ if (aNBT.hasKey(s)) {
+ String aTip = mCustomGregtechMetaTooltips.get(s).getTooltip(aNBT.getString(s));
+ aList.add(aTip);
+ }
+ }
+
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
}
diff --git a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
index 34056ced24..e0cfd78a6d 100644
--- a/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
+++ b/src/Java/gtPlusPlus/xmod/gregtech/common/tileentities/storage/GT_MetaTileEntity_TieredTank.java
@@ -26,7 +26,15 @@ public class GT_MetaTileEntity_TieredTank extends GT_MetaTileEntity_BasicTank {
@Override
public String[] getDescription() {
- return new String[] {this.mDescription, "Not a portable tank.", CORE.GT_Tooltip};
+ String[] aTip;
+ if (this.mFluid == null) {
+ //aTip = new String[] {this.mDescription, "Not a very portable tank.", CORE.GT_Tooltip};
+ aTip = super.getDescription();
+ }
+ else {
+ aTip = new String[] {this.mDescription, "A portable tank.", "Fluid: "+mFluid.getLocalizedName()+" "+mFluid.amount+"L", CORE.GT_Tooltip};
+ }
+ return aTip;
}
@Override