From 313c4e58d9f44e7518d4df764642b2d3940af2a6 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Tue, 23 Apr 2024 23:13:52 +0200 Subject: [PATCH] Fix most reflection related crashes --- .../fabricatedforge/compat/ExtraRemapper.java | 7 +- .../compat/asm/ASMRemapperTransformer.java | 103 +++++++++++++++++- .../compat/asm/BetterClassWriter.java | 26 +---- .../compat/asm/RemapAwareClass.java | 80 ++++++++++++++ .../mixin/nei/FurnaceRecipeHandlerMixin.java | 19 ---- .../fabricated-forge-mods.accesswidener | 28 +---- .../fabricated-forge.mods.mixins.json | 1 - .../mods/fml/relauncher/FMLRelauncher.java | 16 --- .../fabricatedforge/ForgeModRemapper.java | 57 ---------- src/main/resources/forge_at.cfg | 6 + 10 files changed, 192 insertions(+), 151 deletions(-) create mode 100644 mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/RemapAwareClass.java delete mode 100644 mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/mixin/nei/FurnaceRecipeHandlerMixin.java diff --git a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/ExtraRemapper.java b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/ExtraRemapper.java index cfbaf559..8b3649a6 100644 --- a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/ExtraRemapper.java +++ b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/ExtraRemapper.java @@ -37,7 +37,12 @@ public void registerVisitors(VisitorInfos visitorInfos) { @Override public void afterRemap() { Mixins.addConfiguration("fabricated-forge.mods.mixins.json"); - Utils.TRANSFORMER_EXCLUSIONS.add("fr.catcore.fabricatedforge.compat.asm.BetterClassWriter"); + Utils.TRANSFORMER_EXCLUSIONS.add("fr.catcore."); + try { + Class.forName("fr.catcore.fabricatedforge.compat.asm.RemapAwareClass"); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } ClassTransformer.registerPostTransformer(new ASMRemapperTransformer()); } } diff --git a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/ASMRemapperTransformer.java b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/ASMRemapperTransformer.java index a2100c74..66aa9408 100644 --- a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/ASMRemapperTransformer.java +++ b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/ASMRemapperTransformer.java @@ -1,12 +1,16 @@ package fr.catcore.fabricatedforge.compat.asm; import fr.catcore.modremapperapi.api.IClassTransformer; +import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; +import org.jetbrains.annotations.Nullable; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.*; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class ASMRemapperTransformer implements IClassTransformer, Opcodes { @@ -27,6 +31,65 @@ public class ASMRemapperTransformer implements IClassTransformer, Opcodes { {"org/objectweb/asm/ClassWriter", "fr/catcore/fabricatedforge/compat/asm/BetterClassWriter"} }); + private final static Map>> CALL_REPLACER = new HashMap<>(); + + private final static List TRANSFORMED = new ArrayList<>(); + + private static void registerCallReplacer(String className, Object... args) { + Map> classMap = CALL_REPLACER.compute(className, (s, stringMapMap) -> new HashMap<>()); + + for (int i = 0; i < args.length; i++) { + String name = (String) args[i]; + String desc = (String) args[i + 1]; + ClassAwareMember member = (ClassAwareMember) args[i + 2]; + + Map methodMap = classMap.compute(name, (s, stringClassAwareMemberMap) -> new HashMap<>()); + methodMap.put(desc, member); + + i += 2; + } + } + + static { + registerCallReplacer("java/lang/Class", + "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", new ClassAwareMember( + "fr/catcore/fabricatedforge/compat/asm/RemapAwareClass", + "getDeclaredMethod", + "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;" + ), + + "getDeclaredField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;", new ClassAwareMember( + "fr/catcore/fabricatedforge/compat/asm/RemapAwareClass", + "getDeclaredField", + "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;" + ), + + "getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", new ClassAwareMember( + "fr/catcore/fabricatedforge/compat/asm/RemapAwareClass", + "getMethod", + "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;" + ), + + "getField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;", new ClassAwareMember( + "fr/catcore/fabricatedforge/compat/asm/RemapAwareClass", + "getField", + "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;" + ), + + "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", new ClassAwareMember( + "fr/catcore/fabricatedforge/compat/asm/RemapAwareClass", + "forName", + "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;" + ), + + "forName", "(Ljava/lang/String;)Ljava/lang/Class;", new ClassAwareMember( + "fr/catcore/fabricatedforge/compat/asm/RemapAwareClass", + "forName", + "(Ljava/lang/String;)Ljava/lang/Class;" + ) + ); + } + @Override public boolean handlesClass(String s, String s1) { for (String exclude : EXCLUDED) { @@ -38,6 +101,9 @@ public boolean handlesClass(String s, String s1) { @Override public byte[] transformClass(String s, String s1, byte[] bytes) { + if (TRANSFORMED.contains(s)) return bytes; + TRANSFORMED.add(s); + ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(bytes); classReader.accept(classNode, 0); @@ -56,12 +122,31 @@ public byte[] transformClass(String s, String s1, byte[] bytes) { typeInsnNode.desc = INSTANCE_REPLACER.get(typeInsnNode.desc); touched = true; } - } else if (insnNode.getOpcode() == INVOKESPECIAL && insnNode instanceof MethodInsnNode) { + } else if (insnNode instanceof MethodInsnNode) { MethodInsnNode methodInsnNode = (MethodInsnNode) insnNode; - if (methodInsnNode.name.equals("") && INSTANCE_REPLACER.containsKey(methodInsnNode.owner)) { - methodInsnNode.owner = INSTANCE_REPLACER.get(methodInsnNode.owner); - touched = true; + if (methodInsnNode.getOpcode() == INVOKESPECIAL) { + if (methodInsnNode.name.equals("") && INSTANCE_REPLACER.containsKey(methodInsnNode.owner)) { + methodInsnNode.owner = INSTANCE_REPLACER.get(methodInsnNode.owner); + touched = true; + } + } else if (methodInsnNode.getOpcode() == INVOKEVIRTUAL || methodInsnNode.getOpcode() == INVOKESTATIC) { + if (CALL_REPLACER.containsKey(methodInsnNode.owner)) { + Map> classMethods = CALL_REPLACER.get(methodInsnNode.owner); + + if (classMethods.containsKey(methodInsnNode.name)) { + Map classMethod = classMethods.get(methodInsnNode.name); + + if (classMethod.containsKey(methodInsnNode.desc)) { + ClassAwareMember classAwareMember = classMethod.get(methodInsnNode.desc); + methodInsnNode.setOpcode(INVOKESTATIC); + methodInsnNode.owner = classAwareMember.owner; + methodInsnNode.name = classAwareMember.name; + methodInsnNode.desc = classAwareMember.desc; + touched = true; + } + } + } } } @@ -71,7 +156,7 @@ public byte[] transformClass(String s, String s1, byte[] bytes) { } if (touched) { - ClassWriter classWriter = new ClassWriter(3); + ClassWriter classWriter = new BetterClassWriter(3); classNode.accept(classWriter); bytes = classWriter.toByteArray(); @@ -90,4 +175,12 @@ private static Map arrayToMap(String[][] arrays) { return map; } + + public static class ClassAwareMember extends MappingUtils.ClassMember { + public final String owner; + public ClassAwareMember(String owner, String name, @Nullable String desc) { + super(name, desc); + this.owner = owner; + } + } } diff --git a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/BetterClassWriter.java b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/BetterClassWriter.java index 39681dd1..e9640e30 100644 --- a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/BetterClassWriter.java +++ b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/BetterClassWriter.java @@ -1,6 +1,5 @@ package fr.catcore.fabricatedforge.compat.asm; -import net.fabricmc.loader.api.FabricLoader; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; @@ -13,31 +12,8 @@ public BetterClassWriter(ClassReader classReader, int flags) { super(classReader, flags); } - @Override - protected String getCommonSuperClass(String type1, String type2) { - try { - return super.getCommonSuperClass(type1, type2); - } catch (TypeNotPresentException e) { - if ("cpw/mods/fml/common/MinecraftDummyContainer".equals(type1) && "cpw/mods/fml/common/ModContainer".equals(type2)) { - return type2; - } - - if ("net/minecraft/class_1071".equals(type1) && "net/minecraft/class_987".equals(type2)) { - return "java/lang/Object"; - } - - if ("net/minecraft/class_987".equals(type1) && "java/lang/Object".equals(type2)) { - return type2; - } - - System.out.println("Common of: " + type1 + " " + type2); - e.printStackTrace(); - return "java/lang/Object"; - } - } - @Override protected ClassLoader getClassLoader() { - return FabricLoader.getInstance().getClass().getClassLoader(); + return this.getClass().getClassLoader(); } } diff --git a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/RemapAwareClass.java b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/RemapAwareClass.java new file mode 100644 index 00000000..08756c5d --- /dev/null +++ b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/asm/RemapAwareClass.java @@ -0,0 +1,80 @@ +package fr.catcore.fabricatedforge.compat.asm; + +import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class RemapAwareClass { + public static Class forName(String className) + throws ClassNotFoundException { + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + className = MappingUtils.mapClass(className); + + return Class.forName(className); + } + } + public static Class forName(String className, boolean initialize, + ClassLoader loader) + throws ClassNotFoundException { + try { + return Class.forName(className, initialize, loader); + } catch (ClassNotFoundException e) { + className = MappingUtils.mapClass(className); + + return Class.forName(className, initialize, loader); + } + } + + public static Method getDeclaredMethod(Class clazz, String name, Class... parameterTypes) throws NoSuchMethodException { + try { + return clazz.getDeclaredMethod(name, parameterTypes); + } catch (NoSuchMethodException e) { + name = MappingUtils.mapMethod(clazz, name, parameterTypes).name; + + return clazz.getDeclaredMethod(name, parameterTypes); + } + } + + public static Field getDeclaredField(Class clazz, String name) throws NoSuchFieldException { + try { + return clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + name = MappingUtils.mapField(clazz, name).name; + + return clazz.getDeclaredField(name); + } + } + + public static Method getMethod(Class clazz, String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException { + final String originalName = name; + try { + return clazz.getMethod(name, parameterTypes); + } catch (NoSuchMethodException e) { + name = MappingUtils.mapMethod(clazz, name, parameterTypes).name; + + try { + return clazz.getMethod(name, parameterTypes); + } catch (NoSuchMethodException e1) { + return getDeclaredMethod(clazz, originalName, parameterTypes); + } + } + } + + public static Field getField(Class clazz, String name) throws NoSuchFieldException, SecurityException { + final String originalName = name; + try { + return clazz.getField(name); + } catch (NoSuchFieldException e) { + name = MappingUtils.mapField(clazz, name).name; + + try { + return clazz.getField(name); + } catch (NoSuchFieldException e1) { + return getDeclaredField(clazz, originalName); + } + } + } +} diff --git a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/mixin/nei/FurnaceRecipeHandlerMixin.java b/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/mixin/nei/FurnaceRecipeHandlerMixin.java deleted file mode 100644 index 6c5f00ea..00000000 --- a/mod-compat/src/main/java/fr/catcore/fabricatedforge/compat/mixin/nei/FurnaceRecipeHandlerMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.catcore.fabricatedforge.compat.mixin.nei; - -import codechicken.nei.recipe.FurnaceRecipeHandler; -import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.lang.reflect.Method; - -@Mixin(FurnaceRecipeHandler.class) -public class FurnaceRecipeHandlerMixin { - @Redirect(method = "findFuels", remap = false, at = @At(value = "INVOKE", target = "Ljava/lang/Class;getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;")) - private static Method fixFindFuels(Class instance, String name, Class[] parameterTypes) throws NoSuchMethodException { - name = MappingUtils.mapMethod(instance, name, parameterTypes).name; - - return instance.getDeclaredMethod(name, parameterTypes); - } -} diff --git a/mod-compat/src/main/resources/fabricated-forge-mods.accesswidener b/mod-compat/src/main/resources/fabricated-forge-mods.accesswidener index a3cc19ce..1d9c0d02 100644 --- a/mod-compat/src/main/resources/fabricated-forge-mods.accesswidener +++ b/mod-compat/src/main/resources/fabricated-forge-mods.accesswidener @@ -1,29 +1,3 @@ accessWidener v2 named -### NEI -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen field_1346 Lnet/minecraft/client/render/item/ItemRenderer; -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen backgroundWidth I -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen backgroundHeight I -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen x I -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen y I -accessible method net/minecraft/client/gui/screen/ingame/HandledScreen getSlotAt (II)Lnet/minecraft/inventory/slot/Slot; -extendable method net/minecraft/client/gui/screen/ingame/HandledScreen getSlotAt (II)Lnet/minecraft/inventory/slot/Slot; -accessible method net/minecraft/client/gui/screen/ingame/HandledScreen onMouseClick (Lnet/minecraft/inventory/slot/Slot;III)V -accessible method net/minecraft/client/gui/screen/ingame/HandledScreen drawSlot (Lnet/minecraft/inventory/slot/Slot;)V -extendable method net/minecraft/client/gui/screen/ingame/HandledScreen drawSlot (Lnet/minecraft/inventory/slot/Slot;)V - -accessible field net/minecraft/client/class_469 connection Lnet/minecraft/network/Connection; -accessible field net/minecraft/entity/EntityType CLASS_ID_MAP Ljava/util/Map; -accessible field net/minecraft/client/gui/screen/Screen textRenderer Lnet/minecraft/client/font/TextRenderer; -accessible field net/minecraft/client/gui/screen/Screen field_1229 Lnet/minecraft/client/Minecraft; -accessible method net/minecraft/client/gui/DrawableHelper fillGradient (IIIIII)V -accessible field net/minecraft/client/gui/DrawableHelper zOffset F -accessible field net/minecraft/client/gui/screen/ingame/CreativeInventoryScreen selectedTab I -accessible field net/minecraft/client/gui/screen/Screen buttons Ljava/util/List; -accessible class net/minecraft/inventory/slot/class_1019 -accessible method net/minecraft/inventory/slot/class_1019 (Lnet/minecraft/screen/PlayerScreenHandler;Lnet/minecraft/inventory/Inventory;IIII)V - -accessible field net/minecraft/world/chunk/ServerChunkProvider chunks Ljava/util/List; -accessible field net/minecraft/inventory/CraftingInventory stacks [Lnet/minecraft/item/ItemStack; -accessible field net/minecraft/client/Minecraft ticker Lnet/minecraft/client/render/ClientTickTracker; -accessible field net/minecraft/nbt/NbtCompound data Ljava/util/Map; \ No newline at end of file +accessible field net/minecraft/client/Minecraft ticker Lnet/minecraft/client/render/ClientTickTracker; \ No newline at end of file diff --git a/mod-compat/src/main/resources/fabricated-forge.mods.mixins.json b/mod-compat/src/main/resources/fabricated-forge.mods.mixins.json index 1b03f76e..45b543eb 100644 --- a/mod-compat/src/main/resources/fabricated-forge.mods.mixins.json +++ b/mod-compat/src/main/resources/fabricated-forge.mods.mixins.json @@ -12,7 +12,6 @@ "codechickencore.DelegatedTransformerMixin", "codechickencore.DescriptorMappingMixin", "immibiscore.ImmibisCoreMixin", - "nei.FurnaceRecipeHandlerMixin", "nei.TMIUninstallerMixin", "treecapitator.ItemInWorldManagerTransformerMixin" ], diff --git a/src/main/java/cpw/mods/fml/relauncher/FMLRelauncher.java b/src/main/java/cpw/mods/fml/relauncher/FMLRelauncher.java index 14d52185..13a0ffc8 100644 --- a/src/main/java/cpw/mods/fml/relauncher/FMLRelauncher.java +++ b/src/main/java/cpw/mods/fml/relauncher/FMLRelauncher.java @@ -170,22 +170,6 @@ private void setupHome(File minecraftHome) { } private File computeExistingClientHome() { -// Class mcMaster = ReflectionHelper.getClass(this.getClass().getClassLoader(), new String[]{"net.minecraft.client.Minecraft"}); -// String str = System.getProperty("minecraft.applet.TargetDirectory"); -// if (str != null) { -// str = str.replace('/', File.separatorChar); -// ReflectionHelper.setPrivateValue(mcMaster, null, new File(str), new String[]{"minecraftDir", "an", "minecraftDir"}); -// } -// -// Method setupHome = ReflectionHelper.findMethod(mcMaster, null, new String[]{"getMinecraftDir", "getMinecraftDir", "b"}, new Class[0]); -// -// try { -// setupHome.invoke(null); -// } catch (Exception var5) { -// } -// -// return (File)ReflectionHelper.getPrivateValue(mcMaster, null, new String[]{"minecraftDir", "an", "minecraftDir"}); - return FabricLoader.getInstance().getGameDir().toFile(); } diff --git a/src/main/java/fr/catcore/fabricatedforge/ForgeModRemapper.java b/src/main/java/fr/catcore/fabricatedforge/ForgeModRemapper.java index a1acca1e..7c6dae6e 100644 --- a/src/main/java/fr/catcore/fabricatedforge/ForgeModRemapper.java +++ b/src/main/java/fr/catcore/fabricatedforge/ForgeModRemapper.java @@ -5,7 +5,6 @@ import fr.catcore.modremapperapi.remapping.RemapUtil; import fr.catcore.modremapperapi.remapping.VisitorInfos; import net.fabricmc.loader.api.FabricLoader; -import org.spongepowered.asm.mixin.Mixins; import java.util.HashMap; import java.util.List; @@ -51,12 +50,6 @@ public void getMappingList(RemapUtil.MappingList mappings) { mappings.add("TradeEntry", "net/minecraft/TradeEntry"); } - private String getOfficialClassName(String className) { - className = className.replace("/", "."); - className = FabricLoader.getInstance().getMappingResolver().unmapClassName("official", className); - return className.replace(".", "/"); - } - @Override public void registerVisitors(VisitorInfos infos) { infos.registerMethodMethodIns( @@ -87,56 +80,6 @@ public void registerVisitors(VisitorInfos infos) { new VisitorInfos.MethodNamed("net/minecraft/class_988", "PERSISTED_NBT_TAG"), new VisitorInfos.MethodNamed("fr/catcore/fabricatedforge/forged/ReflectionUtils", "PERSISTED_NBT_TAG") ); - - // Mystcraft - infos.registerMethodFieldIns( - new VisitorInfos.MethodNamed("xcompwiz/mystcraft/Mystcraft", "registeredDims"), - new VisitorInfos.MethodNamed("fr/catcore/fabricatedforge/compat/MystcraftCompat", "registeredDims") - ); - -// // CodeChickenCore -// infos.registerMethodMethodIns( -// new VisitorInfos.MethodNamed("codechicken/core/asm/ClassOverrider", "overrideBytes"), -// new VisitorInfos.MethodNamed("fr/catcore/fabricatedforge/compat/CodeChickenCoreCompat", "overrideBytes") -// ); -// -// // NEI -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "aqh"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "net.minecraft.class_409") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "apn"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "net.minecraft.class_388") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "agu"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "net.minecraft.class_159") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "aig"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "net.minecraft.class_197") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "c"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "method_1033") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "a"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "method_419") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "(Lup;IIILjw;)V"), -// new VisitorInfos.MethodValue("codechicken/nei/asm/NEITransformer", "(Lnet/minecraft/class_1150;IIILnet/minecraft/class_871;)V") -// ); -// infos.registerMethodMethodIns( -// new VisitorInfos.MethodNamed("codechicken/nei/TMIUninstaller", "getJarFile"), -// new VisitorInfos.MethodNamed("fr/catcore/fabricatedforge/compat/CodeChickenCoreCompat", "getJarFile") -// ); -// infos.registerMethodLdcIns( -// new VisitorInfos.MethodValue("codechicken/nei/recipe/FurnaceRecipeHandler", "getItemBurnTime"), -// new VisitorInfos.MethodValue("codechicken/nei/recipe/FurnaceRecipeHandler", "method_519") -// ); } @Override diff --git a/src/main/resources/forge_at.cfg b/src/main/resources/forge_at.cfg index cf6c2b5d..660c5736 100644 --- a/src/main/resources/forge_at.cfg +++ b/src/main/resources/forge_at.cfg @@ -126,3 +126,9 @@ public yc.o #FD:World/field_73018_p #prevThunderingStrength public ayp.b(Llq;)V #MD:WorldClient/func_72847_b #releaseEntitySkin #WorldServer public in.b(Llq;)V #MD:WorldServer/func_72847_b #releaseEntitySkin +public in.N #FD:WorldServer/field_73068_P #allPlayersSleeping +# ChunkCache +public ys.e # FD:ChunkCache/field_72815_e # worldObj +# InventoryLargeChest +public kz.c #FD:InventoryLargeChest/field_70478_c #lowerChest +public kz.b #FD:InventoryLargeChest/field_70477_b #upperChest \ No newline at end of file