TurtyWurty

coral_survive.js

Aug 2nd, 2021
1,119
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.INVOKESTATIC,
  38.                         'io/github/darealturtywurty/fluidfixes/core/CoreHooks',
  39.                         ASMAPI.mapMethod('isFixedFluid'),
  40.                         '(Lnet/minecraft/fluid/FluidState;)Z',
  41.                         false
  42.                     ),
  43.                     new JumpInsnNode(Opcodes.IFEQ, END),
  44.                    
  45.                     new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
  46.                     new MethodInsnNode(
  47.                         Opcodes.INVOKEVIRTUAL,
  48.                         'net/minecraft/fluid/FluidState',
  49.                         'method_15772', // getType
  50.                         '()Lnet/minecraft/world/level/material/Fluid;',
  51.                         false
  52.                     ),
  53.                     new TypeInsnNode(Opcodes.CHECKCAST, 'io/github/darealturtywurty/fluidfixes/common/FixedFluid'),
  54.                     new MethodInsnNode(
  55.                         Opcodes.INVOKEVIRTUAL,
  56.                         'io/github/darealturtywurty/fluidfixes/common/FixedFluid',
  57.                         'isCanCoralsSurvive',
  58.                         '()Z',
  59.                         false
  60.                     ),
  61.                     new JumpInsnNode(Opcodes.IFEQ, AFTER_RETURN),
  62.                    
  63.                     new InsnNode(Opcodes.ICONST_1),
  64.                     new InsnNode(Opcodes.IRETURN),
  65.                    
  66.                     AFTER_RETURN,
  67.                     new JumpInsnNode(Opcodes.GOTO, L1),
  68.                    
  69.                     END
  70.                 ));
  71.                 return methodNode;
  72.             }
  73.         }
  74.     }
  75. }
  76.  
  77. // Credits Cadiboo
  78. function findFirstLabelBeforeIndex(instructions, startIndex) {
  79.     var length = instructions.size();
  80.     if (!startIndex)
  81.         startIndex = length - 1;
  82.     var i;
  83.     for (i = startIndex; i >= 0; --i) {
  84.         var instruction = instructions.get(i);
  85.         if (instruction.getType() == LABEL) {
  86.             print('Found first label before index ' + startIndex + ': ' + instruction);
  87.             return instruction;
  88.         }
  89.     }
  90.     throw new Error("Error: Couldn't find first label before index " + startIndex);
  91. }
  92.  
  93. // Credits Cadiboo
  94. function findFirstLabel(instructions, startIndex) {
  95.     if (!startIndex)
  96.         startIndex = 0;
  97.     var length = instructions.size();
  98.     var i;
  99.     for (i = startIndex; i < length; ++i) {
  100.         var instruction = instructions.get(i);
  101.         if (instruction.getType() == LABEL) {
  102.             print('Found second label after index ' + startIndex + ': ' + instruction);
  103.             return instruction;
  104.         }
  105.     }
  106.     throw new Error("Error: Couldn't find first label after index " + startIndex + ' in ' + instructions);
  107. }
Advertisement
Add Comment
Please, Sign In to add comment