Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function initializeCoreMod() {
- return {
- 'CoralWaterPatch': {
- 'target': {
- 'type': 'METHOD',
- 'class': 'net/minecraft/block/CoralBlock',
- 'methodName': 'method_9431',
- 'methodDesc': '(Lnet/minecraft/world/IBlockReader;Lnet/minecraft/util/math/BlockPos;)Z'
- },
- 'transformer': function(methodNode) {
- var Opcodes = Java.type('org.objectweb.asm.Opcodes');
- var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI');
- var LabelNode = Java.type('org.objectweb.asm.tree.LabelNode');
- var InsnNode = Java.type('org.objectweb.asm.tree.InsnNode');
- var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode');
- var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode');
- var JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode');
- var TypeInsnNode = Java.type('org.objectweb.asm.tree.TypeInsnNode');
- var instructions = methodNode.instructions;
- var isCall = ASMAPI.findFirstMethodCall(
- methodNode,
- ASMAPI.MethodType.VIRTUAL,
- 'net/minecraft/fluid/FluidState',
- ASMAPI.mapMethod('method_15767'),
- '(Lnet/minecraft/tags/ITag)Z;'
- );
- var isCallIndex = instructions.indexOf(isCall);
- var firstLabelBeforeIsCall = findFirstLabelBeforeIndex(instructions, isCallIndex);
- var END = new LabelNode();
- var AFTER_RETURN = new LabelNode();
- var L1 = findFirstLabel(instructions, 1);
- instructions.insert(firstLabelBeforeIsCall, ASMAPI.listOf(
- new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
- new MethodInsnNode(
- Opcodes.INVOKVIRTUAL,
- 'net/minecraft/fluid/FluidState',
- ASMAPI.mapMethod('method_15769'),
- '()Z',
- false
- ),
- new JumpInsnNode(Opcodes.IFNE, AFTER_RETURN),
- new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
- new MethodInsnNode(
- Opcodes.INVOKEVIRTUAL,
- 'net/minecraft/fluid/FluidState',
- ASMAPI.mapMethod('method_15772'), // getType
- '()Lnet/minecraft/fluid/Fluid;',
- false
- ),
- new TypeInsnNode(
- Opcodes.INSTANCEOF,
- 'io/github/darealturtywurty/fluidfixes/common/FixedFluid'
- ),
- new JumpInsnNode(Opcodes.IFEQ, END),
- new FieldInsnNode(
- Opcodes.GETSTATIC,
- 'java/lang/System',
- 'out',
- 'Ljava/io/PrintStream;'
- ),
- new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
- new MethodInsnNode(
- Opcodes.INVOKE_VIRTUAL,
- 'java/io/PrintStream',
- 'println',
- '(Ljava/lang/Object;)V',
- false
- ),
- new VarInsnNode(Opcodes.ALOAD, 5), // fluidstate
- new MethodInsnNode(
- Opcodes.INVOKEVIRTUAL,
- 'net/minecraft/fluid/FluidState',
- ASMAPI.mapMethod('method_15772'), // getType
- '()Lnet/minecraft/world/level/material/Fluid;',
- false
- ),
- new TypeInsnNode(Opcodes.CHECKCAST, 'io/github/darealturtywurty/fluidfixes/common/FixedFluid'),
- new MethodInsnNode(
- Opcodes.INVOKEVIRTUAL,
- 'io/github/darealturtywurty/fluidfixes/common/FixedFluid',
- 'isCanCoralsSurvive',
- '()Z',
- false
- ),
- new JumpInsnNode(Opcodes.IFEQ, AFTER_RETURN),
- new InsnNode(Opcodes.ICONST_1),
- new InsnNode(Opcodes.IRETURN),
- AFTER_RETURN,
- new JumpInsnNode(Opcodes.GOTO, L1),
- END
- ));
- return methodNode;
- }
- }
- }
- }
- // Credits Cadiboo
- function findFirstLabelBeforeIndex(instructions, startIndex) {
- var length = instructions.size();
- if (!startIndex)
- startIndex = length - 1;
- var i;
- for (i = startIndex; i >= 0; --i) {
- var instruction = instructions.get(i);
- if (instruction.getType() == LABEL) {
- print('Found first label before index ' + startIndex + ': ' + instruction);
- return instruction;
- }
- }
- throw new Error("Error: Couldn't find first label before index " + startIndex);
- }
- // Credits Cadiboo
- function findFirstLabel(instructions, startIndex) {
- if (!startIndex)
- startIndex = 0;
- var length = instructions.size();
- var i;
- for (i = startIndex; i < length; ++i) {
- var instruction = instructions.get(i);
- if (instruction.getType() == LABEL) {
- print('Found second label after index ' + startIndex + ': ' + instruction);
- return instruction;
- }
- }
- throw new Error("Error: Couldn't find first label after index " + startIndex + ' in ' + instructions);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement