feat: basic boatfly mod + patches
This commit is contained in:
commit
7473f181d4
5 changed files with 230 additions and 0 deletions
|
@ -72,6 +72,7 @@ public class BoSCoVicino implements ICommons {
|
||||||
BoSCoVicino.mods.add(new AutoFish(cfg, dp).done(cfg));
|
BoSCoVicino.mods.add(new AutoFish(cfg, dp).done(cfg));
|
||||||
BoSCoVicino.mods.add(new AutoTool(cfg, dp).done(cfg));
|
BoSCoVicino.mods.add(new AutoTool(cfg, dp).done(cfg));
|
||||||
BoSCoVicino.mods.add(new Freecam(cfg, dp).done(cfg));
|
BoSCoVicino.mods.add(new Freecam(cfg, dp).done(cfg));
|
||||||
|
BoSCoVicino.mods.add(new BoatFly(cfg, dp).done(cfg));
|
||||||
|
|
||||||
BoSCoVicino.spec = cfg.build();
|
BoSCoVicino.spec = cfg.build();
|
||||||
|
|
||||||
|
|
22
src/main/java/ftbsc/bscv/events/BoatEvent.java
Normal file
22
src/main/java/ftbsc/bscv/events/BoatEvent.java
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package ftbsc.bscv.events;
|
||||||
|
|
||||||
|
import net.minecraftforge.eventbus.api.Cancelable;
|
||||||
|
import net.minecraftforge.eventbus.api.Event;
|
||||||
|
|
||||||
|
public class BoatEvent {
|
||||||
|
|
||||||
|
@Cancelable
|
||||||
|
public static class Control extends Event {
|
||||||
|
public Control() { super(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Cancelable
|
||||||
|
public static class ClampRotation extends Event {
|
||||||
|
public ClampRotation() { super(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Cancelable
|
||||||
|
public static class Gravity extends Event {
|
||||||
|
public Gravity() { super(); }
|
||||||
|
}
|
||||||
|
}
|
89
src/main/java/ftbsc/bscv/modules/motion/BoatFly.java
Normal file
89
src/main/java/ftbsc/bscv/modules/motion/BoatFly.java
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
package ftbsc.bscv.modules.motion;
|
||||||
|
|
||||||
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
|
import com.mojang.brigadier.arguments.BoolArgumentType;
|
||||||
|
import com.mojang.brigadier.arguments.DoubleArgumentType;
|
||||||
|
|
||||||
|
import ftbsc.bscv.ICommons;
|
||||||
|
import ftbsc.bscv.events.BoatEvent;
|
||||||
|
import ftbsc.bscv.modules.Module;
|
||||||
|
import ftbsc.bscv.tools.Keyboard;
|
||||||
|
import net.minecraft.command.CommandSource;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.util.math.vector.Vector2f;
|
||||||
|
import net.minecraft.util.math.vector.Vector3d;
|
||||||
|
import net.minecraftforge.common.ForgeConfigSpec;
|
||||||
|
import net.minecraftforge.event.TickEvent;
|
||||||
|
import net.minecraftforge.event.TickEvent.Phase;
|
||||||
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
|
|
||||||
|
public class BoatFly extends Module implements ICommons {
|
||||||
|
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Double> speed;
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Double> rise;
|
||||||
|
public final ForgeConfigSpec.ConfigValue<Boolean> gravity;
|
||||||
|
|
||||||
|
public BoatFly(ForgeConfigSpec.Builder builder, CommandDispatcher<CommandSource> dispatcher) {
|
||||||
|
super("BoatFly", Group.MOTION, builder, dispatcher);
|
||||||
|
|
||||||
|
this.speed = this.option(
|
||||||
|
"speed", "magnitude of boat movement", 1.,
|
||||||
|
DoubleArgumentType.doubleArg(), Double.class,
|
||||||
|
builder, dispatcher
|
||||||
|
);
|
||||||
|
|
||||||
|
this.rise = this.option(
|
||||||
|
"rise", "vertical speed", 0.5,
|
||||||
|
DoubleArgumentType.doubleArg(), Double.class,
|
||||||
|
builder, dispatcher
|
||||||
|
);
|
||||||
|
|
||||||
|
this.gravity = this.option(
|
||||||
|
"gravity", "toggle boat gravity", true,
|
||||||
|
BoolArgumentType.bool(), Boolean.class,
|
||||||
|
builder, dispatcher
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onBoatControl(BoatEvent.Control event) {
|
||||||
|
if (MC.player != null && MC.player.getVehicle() != null) {
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onBoatClampRotation(BoatEvent.ClampRotation event) {
|
||||||
|
if (MC.player != null && MC.player.getVehicle() != null) {
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onBoatGravity(BoatEvent.Gravity event) {
|
||||||
|
if (!this.gravity.get() && MC.player != null && MC.player.getVehicle() != null) {
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void onTick(TickEvent.ClientTickEvent event) {
|
||||||
|
if (event.phase == Phase.END) return;
|
||||||
|
if (MC.player == null) {
|
||||||
|
this.disable();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Entity vehicle = MC.player.getVehicle();
|
||||||
|
if (vehicle == null) return;
|
||||||
|
|
||||||
|
vehicle.yRot = MC.player.yRot;
|
||||||
|
|
||||||
|
if (Keyboard.isMoving()) {
|
||||||
|
Vector2f motion = MC.player.input.getMoveVector();
|
||||||
|
double speed = this.speed.get();
|
||||||
|
Vector3d delta = new Vector3d(motion.x * speed, MC.options.keyJump.isDown() ? this.rise.get() : 0., motion.y * speed);
|
||||||
|
vehicle.setDeltaMovement(delta.yRot((float) -(MC.player.yRot * (Math.PI / 180F))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
115
src/main/java/ftbsc/bscv/patches/BoatPatch.java
Normal file
115
src/main/java/ftbsc/bscv/patches/BoatPatch.java
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
package ftbsc.bscv.patches;
|
||||||
|
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
|
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
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.ICommons;
|
||||||
|
import ftbsc.bscv.events.BoatEvent;
|
||||||
|
import ftbsc.lll.IInjector;
|
||||||
|
import ftbsc.lll.tools.InsnSequence;
|
||||||
|
|
||||||
|
public class BoatPatch {
|
||||||
|
|
||||||
|
public static class BoatHook implements ICommons {
|
||||||
|
public static boolean boatControl() {
|
||||||
|
return MinecraftForge.EVENT_BUS.post(new BoatEvent.Control());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean boatClampRotation() {
|
||||||
|
return MinecraftForge.EVENT_BUS.post(new BoatEvent.ClampRotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean boatGravityCheck(Entity entity) {
|
||||||
|
if (MC.player == null) return false;
|
||||||
|
if (MC.player.getVehicle() == null) return false;
|
||||||
|
if (MC.player.getVehicle() != entity) return false;
|
||||||
|
return MinecraftForge.EVENT_BUS.post(new BoatEvent.Gravity());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 MethodInsnNode(
|
||||||
|
INVOKESTATIC,
|
||||||
|
"ftbsc/bscv/patches/BoatPatch$BoatHook",
|
||||||
|
"boatControl",
|
||||||
|
"()Z"
|
||||||
|
));
|
||||||
|
is.add(new JumpInsnNode(IFEQ, skip));
|
||||||
|
is.add(new InsnNode(RETURN));
|
||||||
|
is.add(skip);
|
||||||
|
|
||||||
|
main.instructions.insert(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BoatClampOverride implements IInjector, Opcodes {
|
||||||
|
public String name() { return "BoatClampOverride"; }
|
||||||
|
public String reason() { return "add hook to cancel vanilla boat rotation clamping"; }
|
||||||
|
public String targetClass() { return "net.minecraft.entity.item.BoatEntity"; }
|
||||||
|
public String methodName() { return "func_184454_a"; } // void clampRotation(Entity e)
|
||||||
|
public String methodDesc() { return "(Lnet/minecraft/entity/Entity;)V"; }
|
||||||
|
|
||||||
|
public void inject(ClassNode clazz, MethodNode main) {
|
||||||
|
// Hook at method start
|
||||||
|
LabelNode skip = new LabelNode();
|
||||||
|
InsnSequence is = new InsnSequence();
|
||||||
|
is.add(new MethodInsnNode(
|
||||||
|
INVOKESTATIC,
|
||||||
|
"ftbsc/bscv/patches/BoatPatch$BoatHook",
|
||||||
|
"boatClampRotation",
|
||||||
|
"()Z"
|
||||||
|
));
|
||||||
|
is.add(new JumpInsnNode(IFEQ, skip));
|
||||||
|
is.add(new InsnNode(RETURN));
|
||||||
|
is.add(skip);
|
||||||
|
|
||||||
|
main.instructions.insert(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BoatGravityOverride implements IInjector, Opcodes {
|
||||||
|
public String name() { return "BoatGravityOverride"; }
|
||||||
|
public String reason() { return "add hook to alter vanilla boat gravity"; }
|
||||||
|
public String targetClass() { return "net.minecraft.entity.Entity"; }
|
||||||
|
public String methodName() { return "func_189652_ae"; } // boolean isNoGravity()
|
||||||
|
public String methodDesc() { return "()Z"; }
|
||||||
|
|
||||||
|
public void inject(ClassNode clazz, MethodNode main) {
|
||||||
|
// Hook at method start
|
||||||
|
LabelNode skip = new LabelNode();
|
||||||
|
InsnSequence is = new InsnSequence();
|
||||||
|
is.add(new VarInsnNode(ALOAD, 0));
|
||||||
|
is.add(new MethodInsnNode(
|
||||||
|
INVOKESTATIC,
|
||||||
|
"ftbsc/bscv/patches/BoatPatch$BoatHook",
|
||||||
|
"boatGravityCheck",
|
||||||
|
"(Lnet/minecraft/entity/Entity;)Z"
|
||||||
|
));
|
||||||
|
is.add(new JumpInsnNode(IFEQ, skip));
|
||||||
|
is.add(new InsnNode(ICONST_1));
|
||||||
|
is.add(new InsnNode(IRETURN));
|
||||||
|
is.add(skip);
|
||||||
|
|
||||||
|
main.instructions.insert(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,2 +1,5 @@
|
||||||
ftbsc.bscv.patches.PacketPatch$IncomingPacketInterceptor
|
ftbsc.bscv.patches.PacketPatch$IncomingPacketInterceptor
|
||||||
ftbsc.bscv.patches.PacketPatch$OutgoingPacketInterceptor
|
ftbsc.bscv.patches.PacketPatch$OutgoingPacketInterceptor
|
||||||
|
ftbsc.bscv.patches.BoatPatch$BoatControlOverride
|
||||||
|
ftbsc.bscv.patches.BoatPatch$BoatClampOverride
|
||||||
|
ftbsc.bscv.patches.BoatPatch$BoatGravityOverride
|
||||||
|
|
Loading…
Reference in a new issue