chore: some boilerplate for boat patch

This commit is contained in:
əlemi 2023-02-19 20:20:47 +01:00
parent 627150b570
commit ac4a18a428
Signed by: alemi
GPG key ID: A4895B84D311642C
2 changed files with 71 additions and 0 deletions

View file

@ -0,0 +1,12 @@
package ftbsc.bscv.events;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
public class BoatEvent {
@Cancelable
public class Control extends Event {
public Control() {}
}
}

View file

@ -0,0 +1,59 @@
package ftbsc.bscv.patches;
import net.minecraft.network.IPacket;
import net.minecraftforge.common.MinecraftForge;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
import ftbsc.bscv.events.BoatEvent;
import ftbsc.bscv.events.PacketEvent;
import ftbsc.lll.IInjector;
import ftbsc.lll.tools.InsnSequence;
import ftbsc.lll.tools.PatternMatcher;
public class BoatPatch {
public static class BoatHook {
public static boolean boatControl(IPacket<?> pkt) {
return MinecraftForge.EVENT_BUS.post(new BoatEvent.Control());
}
public static boolean pktOut(IPacket<?> pkt) {
return MinecraftForge.EVENT_BUS.post(new PacketEvent(pkt, true));
}
}
public static class BoatControlOverride implements IInjector, Opcodes {
public String name() { return "BoatControlOverride"; }
public String reason() { return "add hook to cancel vanilla boat controls"; }
public String targetClass() { return "net.minecraft.entity.item.BoatEntity"; }
public String methodName() { return "func_184443_x"; } // void controlBoat()
public String methodDesc() { return "()V"; }
public void inject(ClassNode clazz, MethodNode main) {
// Hook at method start
LabelNode skip = new LabelNode();
InsnSequence is = new InsnSequence();
is.add(new VarInsnNode(ALOAD, 2));
is.add(new MethodInsnNode(
INVOKESTATIC,
"ftbsc/bscv/patches/BoatPatch$BoatHook",
"boatControl",
"(Lnet/minecraft/network/IPacket;)Z"
));
is.add(new JumpInsnNode(IFEQ, skip));
is.add(new InsnNode(RETURN));
is.add(skip);
main.instructions.insert(is);
}
}
}