feat: finished basic freecam module

This commit is contained in:
əlemi 2023-02-13 18:26:28 +01:00
parent 4869fcb698
commit 8cbe8e9a5f
Signed by: alemi
GPG key ID: A4895B84D311642C
2 changed files with 100 additions and 10 deletions

View file

@ -2,10 +2,15 @@ package ftbsc.bscv.module.self;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.BoolArgumentType;
import com.mojang.brigadier.arguments.DoubleArgumentType;
import ftbsc.bscv.BoSCoVicino;
import ftbsc.bscv.events.PacketEvent;
import ftbsc.bscv.ICommons;
import ftbsc.bscv.module.QuickModule;
import ftbsc.bscv.tools.Keyboard;
import net.minecraft.client.entity.player.RemoteClientPlayerEntity;
import net.minecraft.client.network.play.NetworkPlayerInfo;
import net.minecraft.command.CommandSource;
import net.minecraft.network.play.client.CPlayerPacket;
import net.minecraft.util.math.vector.Vector3d;
@ -14,9 +19,16 @@ import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public class Freecam extends QuickModule {
public class Freecam extends QuickModule implements ICommons {
public final ForgeConfigSpec.ConfigValue<Boolean> log;
public final ForgeConfigSpec.ConfigValue<Double> speed;
public final ForgeConfigSpec.ConfigValue<Boolean> drift;
private Vector3d prev_pos = new Vector3d(0.0, 0.0, 0.0);
private float prev_speed = 0.05f;
private GameType prev_gamemode = GameType.SURVIVAL;
private MockPlayer mock_player;
public Freecam(ForgeConfigSpec.Builder builder, CommandDispatcher<CommandSource> dispatcher) {
super("Freecam", Group.SELF, UNBOUND, builder, dispatcher);
@ -26,13 +38,23 @@ public class Freecam extends QuickModule {
BoolArgumentType.bool(), Boolean.class,
builder, dispatcher
);
}
private Vector3d prev_pos = new Vector3d(0.0, 0.0, 0.0);
this.speed = this.option(
"speed", "flight speed in freecam", 0.05,
DoubleArgumentType.doubleArg(0.0), Double.class,
builder, dispatcher
);
this.drift = this.option(
"drift", "allow inertia drift in freecam", true,
BoolArgumentType.bool(), Boolean.class,
builder, dispatcher
);
}
@SubscribeEvent
public void onPacket(PacketEvent event) {
if (BoSCoVicino.minecraft.player == null) return;
if (MC.player == null) return;
if (event.outgoing && event.packet instanceof CPlayerPacket) { // TODO must ignore more packets than just this
if (this.log.get()) {
BoSCoVicino.log(String.format("[X] %s", event.packet.getClass().getName()));
@ -41,20 +63,69 @@ public class Freecam extends QuickModule {
}
}
@SubscribeEvent
protected void onTick(TickEvent.ClientTickEvent event) {
if (MC.player == null) return;
MC.player.abilities.setFlyingSpeed(this.speed.get().floatValue());
if (!this.drift.get() && !Keyboard.isStrafing()) {
MC.player.setDeltaMovement(Vector3d.ZERO);
}
}
@Override
protected void onEnabled() {
if (BoSCoVicino.minecraft.player != null) {
this.prev_pos = BoSCoVicino.minecraft.player.position();
BoSCoVicino.minecraft.gameMode.setLocalMode(GameType.SPECTATOR);
if (MC.player == null) {
BoSCoVicino.log("[!] Can only enable freecam while in-game");
this.disable();
}
this.prev_speed = MC.player.abilities.getFlyingSpeed();
this.prev_pos = MC.player.position();
this.prev_gamemode = MC.gameMode.getPlayerMode();
MC.gameMode.setLocalMode(GameType.SPECTATOR);
MC.player.noCulling = true;
if (MC.getConnection() != null) {
NetworkPlayerInfo info = MC.getConnection().getPlayerInfo(
MC.player.getGameProfile().getId()
);
info.gameMode = GameType.SPECTATOR; // ACCESSTRANSFORMER: public net.minecraft.client.network.play.NetworkPlayerInfo field_178866_b
}
this.mock_player = new MockPlayer();
this.mock_player.setPosAndOldPos(this.prev_pos.x, this.prev_pos.y, this.prev_pos.z);
this.mock_player.setYBodyRot(MC.player.yBodyRot);
MC.level.addPlayer(-666, this.mock_player);
}
@Override
protected void onDisabled() {
if (BoSCoVicino.minecraft.player != null) {
BoSCoVicino.minecraft.gameMode.setLocalMode(GameType.SURVIVAL);
BoSCoVicino.minecraft.player.setPos(this.prev_pos.x, this.prev_pos.y, this.prev_pos.z);
if (MC.player == null) return;
MC.gameMode.setLocalMode(this.prev_gamemode);
MC.player.noCulling = false;
MC.player.abilities.setFlyingSpeed(this.prev_speed);
if (MC.getConnection() != null) {
NetworkPlayerInfo info = MC.getConnection().getPlayerInfo(
MC.player.getGameProfile().getId()
);
info.gameMode = this.prev_gamemode; // ACCESSTRANSFORMER: public net.minecraft.client.network.play.NetworkPlayerInfo field_178866_b
}
MC.player.setPos(this.prev_pos.x, this.prev_pos.y, this.prev_pos.z);
MC.player.setDeltaMovement(Vector3d.ZERO);
MC.level.removeEntity(this.mock_player.getId());
this.mock_player = null; // get rid of reference
}
private class MockPlayer extends RemoteClientPlayerEntity {
public MockPlayer() {
super(MC.level, MC.player.getGameProfile());
this.setId(-666); // TODO hax
}
@Override
public boolean isSpectator() { return false; }
@Override
public boolean isCreative() { return false; }
}
}

View file

@ -0,0 +1,19 @@
package ftbsc.bscv.tools;
import ftbsc.bscv.ICommons;
public class Keyboard implements ICommons {
public static boolean isStrafing() {
return MC.options.keyUp.isDown()
|| MC.options.keyDown.isDown()
|| MC.options.keyLeft.isDown()
|| MC.options.keyRight.isDown();
}
public static boolean isMoving() {
return isStrafing()
|| MC.options.keyJump.isDown()
|| MC.options.keySprint.isDown();
}
}