Advertisement
TurtyWurty

coral_survive.js

Aug 7th, 2021
1,354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function initializeCoreMod() {
  2.     return {
  3.         'CoralWaterPatch': {
  4.             'target': {
  5.                 'type': 'METHOD',
  6.                 'class': 'net/minecraft/block/CoralBlock',
  7.                 'methodName': 'method_9431',
  8.                 'methodDesc': '(Lnet/minecraft/world/IBlockReader;Lnet/minecraft/util/math/BlockPos;)Z'
  9.             },
  10.             'transformer': function(methodNode) {
  11.                 var Opcodes = Java.type('org.objectweb.asm.Opcodes');
  12.                 var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI');
  13.                 var LabelNode = Java.type('org.objectweb.asm.tree.LabelNode');
  14.                 var InsnNode = Java.type('org.objectweb.asm.tree.InsnNode');
  15.                 var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode');
  16.                 var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode');
  17.                 var JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode');
  18.                 var TypeInsnNode = Java.type('org.objectweb.asm.tree.TypeInsnNode');
  19.                
  20.                 var instructions = methodNode.instructions;
  21.                 var isCall = ASMAPI.findFirstMethodCall(
  22.                     methodNode,
  23.                     ASMAPI.MethodType.VIRTUAL,
  24.                     'net/minecraft/fluid/FluidState',
  25.                     ASMAPI.mapMethod('method_15767'),
  26.                     '(Lnet/minecraft/tags/ITag)Z;'
  27.                 );
  28.                
  29.                 var isCallIndex = instructions.indexOf(isCall);
  30.                 var firstLabelBeforeIsCall = findFirstLabelBeforeIndex(instructions, isCallIndex);
  31.                 var END = new LabelNode();
  32.                 var AFTER_RETURN = new LabelNode();
  33.                 var L1 = findFirstLabel(instructions, 1);
  34.                 instructions.insert(firstLabelBeforeIsCall, ASMAPI.listOf(
  35.                     new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
  36.                     new MethodInsnNode(
  37.                         Opcodes.INVOKVIRTUAL,
  38.                         'net/minecraft/fluid/FluidState',
  39.                         ASMAPI.mapMethod('method_15769'),
  40.                         '()Z',
  41.                         false
  42.                     ),
  43.                     new JumpInsnNode(Opcodes.IFNE, AFTER_RETURN),
  44.                     new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
  45.                     new MethodInsnNode(
  46.                         Opcodes.INVOKEVIRTUAL,
  47.                         'net/minecraft/fluid/FluidState',
  48.                         ASMAPI.mapMethod('method_15772'), // getType
  49.                         '()Lnet/minecraft/fluid/Fluid;',
  50.                         false
  51.                     ),
  52.                     new TypeInsnNode(
  53.                         Opcodes.INSTANCEOF,
  54.                         'io/github/darealturtywurty/fluidfixes/common/FixedFluid'
  55.                     ),
  56.                     new JumpInsnNode(Opcodes.IFEQ, END),
  57.                    
  58.                     new FieldInsnNode(
  59.                         Opcodes.GETSTATIC,
  60.                         'java/lang/System',
  61.                         'out',
  62.                         'Ljava/io/PrintStream;'
  63.                     ),
  64.                     new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
  65.                     new MethodInsnNode(
  66.                         Opcodes.INVOKE_VIRTUAL,
  67.                         'java/io/PrintStream',
  68.                         'println',
  69.                         '(Ljava/lang/Object;)V',
  70.                         false
  71.                     ),
  72.                     new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
  73.                     new MethodInsnNode(
  74.                         Opcodes.INVOKEVIRTUAL,
  75.                         'net/minecraft/fluid/FluidState',
  76.                         ASMAPI.mapMethod('method_15772'), // getType
  77.                         '()Lnet/minecraft/world/level/material/Fluid;',
  78.                         false
  79.                     ),
  80.                     new TypeInsnNode(Opcodes.CHECKCAST, 'io/github/darealturtywurty/fluidfixes/common/FixedFluid'),
  81.                     new MethodInsnNode(
  82.                         Opcodes.INVOKEVIRTUAL,
  83.                         'io/github/darealturtywurty/fluidfixes/common/FixedFluid',
  84.                         'isCanCoralsSurvive',
  85.                         '()Z',
  86.                         false
  87.                     ),
  88.                     new JumpInsnNode(Opcodes.IFEQ, AFTER_RETURN),
  89.                    
  90.                     new InsnNode(Opcodes.ICONST_1),
  91.                     new InsnNode(Opcodes.IRETURN),
  92.                    
  93.                     AFTER_RETURN,
  94.                     new JumpInsnNode(Opcodes.GOTO, L1),
  95.                    
  96.                     END
  97.                 ));
  98.                 return methodNode;
  99.             }
  100.         }
  101.     }
  102. }
  103.  
  104. // Credits Cadiboo
  105. function findFirstLabelBeforeIndex(instructions, startIndex) {
  106.     var length = instructions.size();
  107.     if (!startIndex)
  108.         startIndex = length - 1;
  109.     var i;
  110.     for (i = startIndex; i >= 0; --i) {
  111.         var instruction = instructions.get(i);
  112.         if (instruction.getType() == LABEL) {
  113.             print('Found first label before index ' + startIndex + ': ' + instruction);
  114.             return instruction;
  115.         }
  116.     }
  117.     throw new Error("Error: Couldn't find first label before index " + startIndex);
  118. }
  119.  
  120. // Credits Cadiboo
  121. function findFirstLabel(instructions, startIndex) {
  122.     if (!startIndex)
  123.         startIndex = 0;
  124.     var length = instructions.size();
  125.     var i;
  126.     for (i = startIndex; i < length; ++i) {
  127.         var instruction = instructions.get(i);
  128.         if (instruction.getType() == LABEL) {
  129.             print('Found second label after index ' + startIndex + ': ' + instruction);
  130.             return instruction;
  131.         }
  132.     }
  133.     throw new Error("Error: Couldn't find first label after index " + startIndex + ' in ' + instructions);
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement