summaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/bscv/patches/BlockPushPatch.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/ftbsc/bscv/patches/BlockPushPatch.java')
-rw-r--r--src/main/java/ftbsc/bscv/patches/BlockPushPatch.java46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/java/ftbsc/bscv/patches/BlockPushPatch.java b/src/main/java/ftbsc/bscv/patches/BlockPushPatch.java
new file mode 100644
index 0000000..50fb677
--- /dev/null
+++ b/src/main/java/ftbsc/bscv/patches/BlockPushPatch.java
@@ -0,0 +1,46 @@
+package ftbsc.bscv.patches;
+
+import ftbsc.lll.processor.annotations.Injector;
+import ftbsc.lll.processor.annotations.Patch;
+import ftbsc.lll.processor.annotations.Target;
+import ftbsc.lll.tools.InsnSequence;
+import net.minecraft.client.entity.player.ClientPlayerEntity;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.eventbus.api.Cancelable;
+import net.minecraftforge.eventbus.api.Event;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.*;
+
+public class BlockPushPatch {
+
+ @Cancelable
+ public static class PlayerBlockPushEvent extends Event {}
+
+ public static boolean shouldCancelBlockCollisions() {
+ return MinecraftForge.EVENT_BUS.post(new PlayerBlockPushEvent());
+ }
+
+ @Patch(value = ClientPlayerEntity.class, reason = "add hook to cancel block collisions")
+ public abstract static class BlockCollisionsOverride implements Opcodes {
+ @Target
+ abstract void moveTowardsClosestSpace(double x, double z);
+
+ @Injector
+ public void inject(ClassNode clazz, MethodNode main) {
+ LabelNode skip = new LabelNode();
+ InsnSequence is = new InsnSequence();
+ is.add(new MethodInsnNode(
+ INVOKESTATIC,
+ "ftbsc/bscv/patches/BlockPushPatch",
+ "shouldCancelBlockCollisions",
+ "()Z"
+ ));
+ is.add(new JumpInsnNode(IFEQ, skip));
+ is.add(new InsnNode(RETURN));
+ is.add(skip);
+
+ main.instructions.insert(is); // hook at top
+ }
+ }
+}