2525import com .falsepattern .endlessids .Tags ;
2626import com .falsepattern .endlessids .asm .EndlessIDsCore ;
2727import com .falsepattern .endlessids .asm .EndlessIDsTransformer ;
28+ import com .falsepattern .lib .turboasm .BytePatternMatcher ;
2829import com .falsepattern .lib .turboasm .ClassNodeHandle ;
2930import com .falsepattern .lib .turboasm .TurboClassTransformer ;
3031import lombok .Data ;
@@ -181,6 +182,9 @@ public class ChunkProviderSuperPatcher implements TurboClassTransformer {
181182 private static State <AbstractInsnNode > STATE17 = null ;
182183 private static State <AbstractInsnNode > STATE_FINAL = null ;
183184
185+ private static final BytePatternMatcher chunkClassMatcher ;
186+ private static final BytePatternMatcher getBiomeArrayMethodMatcher ;
187+
184188 static {
185189 if (EndlessIDsCore .deobfuscated ) {
186190 CLASS_BiomeGenBase = new String []{"net/minecraft/world/biome/BiomeGenBase" };
@@ -197,6 +201,9 @@ public class ChunkProviderSuperPatcher implements TurboClassTransformer {
197201 FIELD_biomeID = new String []{"ay" , "field_76756_M" };
198202 METHOD_getBiomeArray = new String []{"m" , "func_76605_m" };
199203 }
204+
205+ chunkClassMatcher = new BytePatternMatcher (CLASS_Chunk , BytePatternMatcher .Mode .Equals );
206+ getBiomeArrayMethodMatcher = new BytePatternMatcher (METHOD_getBiomeArray , BytePatternMatcher .Mode .Equals );
200207 }
201208
202209 static {
@@ -347,35 +354,6 @@ public class ChunkProviderSuperPatcher implements TurboClassTransformer {
347354 });
348355 }
349356
350- private static boolean scanForBrokenCall (MethodNode method ) {
351- val instructions = method .instructions ;
352- val insnCount = instructions .size ();
353- for (int i = 0 ; i < insnCount ; i ++) {
354- val insn = instructions .get (i );
355- if (insn .getOpcode () != Opcodes .INVOKEVIRTUAL ) {
356- continue ;
357- }
358- val invoke = (MethodInsnNode ) insn ;
359-
360- if (anyMatch (invoke .owner , CLASS_Chunk ) && anyMatch (invoke .name , METHOD_getBiomeArray ) &&
361- invoke .desc .equals ("()[B" )) {
362- return true ;
363- }
364- }
365- return false ;
366- }
367-
368- private static boolean anyMatch (List <String > str , String [] candidates ) {
369- for (val s : str ) {
370- for (val candidate : candidates ) {
371- if (s .equals (candidate )) {
372- return true ;
373- }
374- }
375- }
376- return false ;
377- }
378-
379357 private static boolean anyMatch (String str , String [] candidates ) {
380358 for (val candidate : candidates ) {
381359 if (str .equals (candidate )) {
@@ -456,17 +434,16 @@ public String name() {
456434
457435 @ Override
458436 public boolean shouldTransformClass (@ NotNull String className , @ NotNull ClassNodeHandle classNode ) {
459- if ("net.minecraft.world.chunk.storage.AnvilChunkLoader" .equals (className ))
437+ if ("net.minecraft.world.chunk.storage.AnvilChunkLoader" .equals (className )) {
460438 return false ;
461- val cn = classNode .getNode ();
462- if (cn == null )
439+ }
440+
441+ val metadata = classNode .getOriginalMetadata ();
442+ if (metadata == null ) {
463443 return false ;
464- for (MethodNode method : cn .methods ) {
465- if (scanForBrokenCall (method )) {
466- return true ;
467- }
468444 }
469- return false ;
445+
446+ return metadata .matchesBytes (chunkClassMatcher ) && metadata .matchesBytes (getBiomeArrayMethodMatcher );
470447 }
471448
472449 @ Override
@@ -664,4 +641,4 @@ public void updateLocalsState(FrameNode frame) {
664641 }
665642 }
666643 }
667- }
644+ }
0 commit comments