From ed0330659700b9d6154ea0edf82671d88fb43803 Mon Sep 17 00:00:00 2001 From: danyadev Date: Wed, 20 May 2026 09:49:42 +0300 Subject: [PATCH] optimize ChunkProviderSuperPatcher: don't create ClassNode in shouldTransformClass --- gradlew | 0 .../falsepattern/endlessids/EndlessIDs.java | 2 +- .../chunk/ChunkProviderSuperPatcher.java | 53 ++++++------------- 3 files changed, 16 insertions(+), 39 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java index 78be3bc..7f4a0e4 100644 --- a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java +++ b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java @@ -43,7 +43,7 @@ name = Tags.MODNAME, acceptedMinecraftVersions = "[1.7.10]", dependencies = "required-after:chunkapi@[0.8.0,);" + - "required-after:falsepatternlib@[1.9.0,);" + + "required-after:falsepatternlib@[1.11.0,);" + "after:antiidconflict") public class EndlessIDs { public static final byte[] ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER = new byte[0]; diff --git a/src/main/java/com/falsepattern/endlessids/asm/transformer/chunk/ChunkProviderSuperPatcher.java b/src/main/java/com/falsepattern/endlessids/asm/transformer/chunk/ChunkProviderSuperPatcher.java index a2dc52a..9063325 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/transformer/chunk/ChunkProviderSuperPatcher.java +++ b/src/main/java/com/falsepattern/endlessids/asm/transformer/chunk/ChunkProviderSuperPatcher.java @@ -25,6 +25,7 @@ import com.falsepattern.endlessids.Tags; import com.falsepattern.endlessids.asm.EndlessIDsCore; import com.falsepattern.endlessids.asm.EndlessIDsTransformer; +import com.falsepattern.lib.turboasm.BytePatternMatcher; import com.falsepattern.lib.turboasm.ClassNodeHandle; import com.falsepattern.lib.turboasm.TurboClassTransformer; import lombok.Data; @@ -181,6 +182,9 @@ public class ChunkProviderSuperPatcher implements TurboClassTransformer { private static State STATE17 = null; private static State STATE_FINAL = null; + private static final BytePatternMatcher chunkClassMatcher; + private static final BytePatternMatcher getBiomeArrayMethodMatcher; + static { if (EndlessIDsCore.deobfuscated) { CLASS_BiomeGenBase = new String[]{"net/minecraft/world/biome/BiomeGenBase"}; @@ -197,6 +201,9 @@ public class ChunkProviderSuperPatcher implements TurboClassTransformer { FIELD_biomeID = new String[]{"ay", "field_76756_M"}; METHOD_getBiomeArray = new String[]{"m", "func_76605_m"}; } + + chunkClassMatcher = new BytePatternMatcher(CLASS_Chunk, BytePatternMatcher.Mode.Equals); + getBiomeArrayMethodMatcher = new BytePatternMatcher(METHOD_getBiomeArray, BytePatternMatcher.Mode.Equals); } static { @@ -347,35 +354,6 @@ public class ChunkProviderSuperPatcher implements TurboClassTransformer { }); } - private static boolean scanForBrokenCall(MethodNode method) { - val instructions = method.instructions; - val insnCount = instructions.size(); - for (int i = 0; i < insnCount; i++) { - val insn = instructions.get(i); - if (insn.getOpcode() != Opcodes.INVOKEVIRTUAL) { - continue; - } - val invoke = (MethodInsnNode) insn; - - if (anyMatch(invoke.owner, CLASS_Chunk) && anyMatch(invoke.name, METHOD_getBiomeArray) && - invoke.desc.equals("()[B")) { - return true; - } - } - return false; - } - - private static boolean anyMatch(List str, String[] candidates) { - for (val s : str) { - for (val candidate : candidates) { - if (s.equals(candidate)) { - return true; - } - } - } - return false; - } - private static boolean anyMatch(String str, String[] candidates) { for (val candidate : candidates) { if (str.equals(candidate)) { @@ -456,17 +434,16 @@ public String name() { @Override public boolean shouldTransformClass(@NotNull String className, @NotNull ClassNodeHandle classNode) { - if ("net.minecraft.world.chunk.storage.AnvilChunkLoader".equals(className)) + if ("net.minecraft.world.chunk.storage.AnvilChunkLoader".equals(className)) { return false; - val cn = classNode.getNode(); - if (cn == null) + } + + val metadata = classNode.getOriginalMetadata(); + if (metadata == null) { return false; - for (MethodNode method : cn.methods) { - if (scanForBrokenCall(method)) { - return true; - } } - return false; + + return metadata.matchesBytes(chunkClassMatcher) && metadata.matchesBytes(getBiomeArrayMethodMatcher); } @Override @@ -664,4 +641,4 @@ public void updateLocalsState(FrameNode frame) { } } } -} \ No newline at end of file +}