feat: added Immovable mod
This commit is contained in:
parent
d5aee8289f
commit
0a2609ac0c
4 changed files with 234 additions and 0 deletions
85
src/main/java/ftbsc/bscv/modules/self/Immovable.java
Normal file
85
src/main/java/ftbsc/bscv/modules/self/Immovable.java
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
package ftbsc.bscv.modules.self;
|
||||||
|
|
||||||
|
import com.google.auto.service.AutoService;
|
||||||
|
|
||||||
|
import ftbsc.bscv.api.ILoadable;
|
||||||
|
import ftbsc.bscv.modules.AbstractModule;
|
||||||
|
import ftbsc.bscv.patches.BlockPushPatch.PlayerBlockPushEvent;
|
||||||
|
import ftbsc.bscv.patches.EntityPushPatch.PlayerEntityPushEvent;
|
||||||
|
import ftbsc.bscv.patches.LiquidPushPatch.PlayerLiquidPushEvent;
|
||||||
|
import ftbsc.bscv.patches.PacketPatch.PacketEvent;
|
||||||
|
import ftbsc.bscv.tools.Setting;
|
||||||
|
import net.minecraft.network.play.server.SEntityVelocityPacket;
|
||||||
|
import net.minecraft.network.play.server.SExplosionPacket;
|
||||||
|
import net.minecraftforge.common.ForgeConfigSpec;
|
||||||
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
|
|
||||||
|
@AutoService(ILoadable.class)
|
||||||
|
public class Immovable extends AbstractModule {
|
||||||
|
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Boolean> explosions;
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Boolean> server;
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Boolean> liquids;
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Boolean> entities;
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Boolean> blocks;
|
||||||
|
|
||||||
|
public Immovable() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.explosions = Setting.Bool.builder()
|
||||||
|
.fallback(true)
|
||||||
|
.name("explosions")
|
||||||
|
.comment("cancel velocity from explosions")
|
||||||
|
.build(this);
|
||||||
|
this.server = Setting.Bool.builder()
|
||||||
|
.fallback(true)
|
||||||
|
.name("server")
|
||||||
|
.comment("cancel velocity sent from server")
|
||||||
|
.build(this);
|
||||||
|
this.liquids = Setting.Bool.builder()
|
||||||
|
.fallback(true)
|
||||||
|
.name("liquids")
|
||||||
|
.comment("cancel velocity from liquids pushing")
|
||||||
|
.build(this);
|
||||||
|
this.entities = Setting.Bool.builder()
|
||||||
|
.fallback(true)
|
||||||
|
.name("entities")
|
||||||
|
.comment("cancel velocity from entities pushing")
|
||||||
|
.build(this);
|
||||||
|
this.blocks = Setting.Bool.builder()
|
||||||
|
.fallback(true)
|
||||||
|
.name("block")
|
||||||
|
.comment("cancel velocity from blocks pushing")
|
||||||
|
.build(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onPacket(PacketEvent.Incoming event) {
|
||||||
|
if (event.packet instanceof SExplosionPacket && this.explosions.get()) {
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.packet instanceof SEntityVelocityPacket && this.server.get()) {
|
||||||
|
SEntityVelocityPacket packet = (SEntityVelocityPacket) event.packet;
|
||||||
|
if (packet.getId() == MC.player.getId()) {
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onEntityCollisions(PlayerEntityPushEvent event) {
|
||||||
|
if (this.entities.get()) event.setCanceled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onBlockCollisions(PlayerBlockPushEvent event) {
|
||||||
|
if (this.blocks.get()) event.setCanceled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onLiquidCollisions(PlayerLiquidPushEvent event) {
|
||||||
|
if (this.liquids.get()) event.setCanceled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
46
src/main/java/ftbsc/bscv/patches/BlockPushPatch.java
Normal file
46
src/main/java/ftbsc/bscv/patches/BlockPushPatch.java
Normal file
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
src/main/java/ftbsc/bscv/patches/EntityPushPatch.java
Normal file
51
src/main/java/ftbsc/bscv/patches/EntityPushPatch.java
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
package ftbsc.bscv.patches;
|
||||||
|
|
||||||
|
import ftbsc.bscv.ICommons;
|
||||||
|
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.entity.Entity;
|
||||||
|
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 EntityPushPatch implements ICommons {
|
||||||
|
|
||||||
|
@Cancelable
|
||||||
|
public static class PlayerEntityPushEvent extends Event {}
|
||||||
|
|
||||||
|
public static boolean shouldCancelEntityCollisions(Entity e) {
|
||||||
|
if (e.equals(MC.player)) {
|
||||||
|
return MinecraftForge.EVENT_BUS.post(new PlayerEntityPushEvent());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Patch(value = Entity.class, reason = "add hook to cancel entity collisions")
|
||||||
|
public abstract static class EntityCollisionsOverride implements Opcodes {
|
||||||
|
@Target
|
||||||
|
abstract void push(double x, double y, double z);
|
||||||
|
|
||||||
|
@Injector
|
||||||
|
public void inject(ClassNode clazz, MethodNode main) {
|
||||||
|
LabelNode skip = new LabelNode();
|
||||||
|
InsnSequence is = new InsnSequence();
|
||||||
|
is.add(new VarInsnNode(ALOAD, 0));
|
||||||
|
is.add(new MethodInsnNode(
|
||||||
|
INVOKESTATIC,
|
||||||
|
"ftbsc/bscv/patches/EntityPushPatch",
|
||||||
|
"shouldCancelEntityCollisions",
|
||||||
|
"(Lnet/minecraft/entity/Entity;)Z"
|
||||||
|
));
|
||||||
|
is.add(new JumpInsnNode(IFEQ, skip));
|
||||||
|
is.add(new InsnNode(RETURN));
|
||||||
|
is.add(skip);
|
||||||
|
|
||||||
|
main.instructions.insert(is); // hook at top
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
52
src/main/java/ftbsc/bscv/patches/LiquidPushPatch.java
Normal file
52
src/main/java/ftbsc/bscv/patches/LiquidPushPatch.java
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
package ftbsc.bscv.patches;
|
||||||
|
|
||||||
|
import ftbsc.bscv.ICommons;
|
||||||
|
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.entity.player.PlayerEntity;
|
||||||
|
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 LiquidPushPatch implements ICommons {
|
||||||
|
|
||||||
|
@Cancelable
|
||||||
|
public static class PlayerLiquidPushEvent extends Event {}
|
||||||
|
|
||||||
|
public static boolean shouldCancelLiquidCollisions(PlayerEntity player) {
|
||||||
|
if (player.equals(MC.player)) {
|
||||||
|
return MinecraftForge.EVENT_BUS.post(new PlayerLiquidPushEvent());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Patch(value = PlayerEntity.class, reason = "add hook to cancel liquid collisions")
|
||||||
|
public abstract static class LiquidCollisionsOverride implements Opcodes {
|
||||||
|
@Target
|
||||||
|
abstract boolean isPushedByFluid();
|
||||||
|
|
||||||
|
@Injector
|
||||||
|
public void inject(ClassNode clazz, MethodNode main) {
|
||||||
|
LabelNode skip = new LabelNode();
|
||||||
|
InsnSequence is = new InsnSequence();
|
||||||
|
is.add(new VarInsnNode(ALOAD, 0));
|
||||||
|
is.add(new MethodInsnNode(
|
||||||
|
INVOKESTATIC,
|
||||||
|
"ftbsc/bscv/patches/LiquidPushPatch",
|
||||||
|
"shouldCancelLiquidCollisions",
|
||||||
|
"(Lnet/minecraft/entity/player/PlayerEntity;)Z"
|
||||||
|
));
|
||||||
|
is.add(new JumpInsnNode(IFEQ, skip));
|
||||||
|
is.add(new InsnNode(ICONST_0));
|
||||||
|
is.add(new InsnNode(IRETURN));
|
||||||
|
is.add(skip);
|
||||||
|
|
||||||
|
main.instructions.insert(is); // hook at top
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue