diff options
Diffstat (limited to 'src/main/java/ftbsc/bscv/patches/BlockPushPatch.java')
-rw-r--r-- | src/main/java/ftbsc/bscv/patches/BlockPushPatch.java | 46 |
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 + } + } +} |