Хочу сделать настройку котора будет постоянно закидывать и выкидывать меня с лодки. Это должно обойти античит на том сервере где я играю. И я написал такой модуль, вот только лодка с сервером не может синхронизироваться. Я летать на ней могу сколько угодно, но слезть с неё не получается, а когда перезахожу на сервер меня просто телепортирует на исходное место откуда я начинал полёт. Помогите сделать нормальную настройку autoremount пожалуйста. Я пишу на базе Meteor client fabric 1.21.4
Java:
package meteordevelopment.meteorclient.systems.modules.movement;
import meteordevelopment.meteorclient.events.entity.BoatMoveEvent;
import meteordevelopment.meteorclient.events.packets.PacketEvent;
import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.mixininterface.IVec3d;
import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.modules.Categories;
import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.meteorclient.utils.player.PlayerUtils;
import meteordevelopment.orbit.EventHandler;
import net.minecraft.entity.Entity;
import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket;
import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket;
import net.minecraft.network.packet.s2c.play.VehicleMoveS2CPacket;
import net.minecraft.util.Hand;
import net.minecraft.util.math.Vec3d;
public class BoatFly extends Module {
private final SettingGroup sgGeneral = settings.getDefaultGroup();
private final SettingGroup sgAutoMount = settings.createGroup("Auto Mount");
private final SettingGroup sgSync = settings.createGroup("Sync");
private final Setting<Double> speed = sgGeneral.add(new DoubleSetting.Builder()
.name("speed")
.description("Горизонтальная скорость")
.defaultValue(10)
.min(0)
.sliderMax(50)
.build()
);
private final Setting<Double> verticalSpeed = sgGeneral.add(new DoubleSetting.Builder()
.name("vertical-speed")
.description("Вертикальная скорость")
.defaultValue(6)
.min(0)
.sliderMax(20)
.build()
);
private final Setting<Double> fallSpeed = sgGeneral.add(new DoubleSetting.Builder()
.name("fall-speed")
.description("Скорость падения")
.defaultValue(0.1)
.min(0)
.build()
);
private final Setting<Boolean> cancelServerPackets = sgGeneral.add(new BoolSetting.Builder()
.name("cancel-server-packets")
.description("Игнорировать пакеты сервера")
.defaultValue(true)
.build()
);
private final Setting<Boolean> antiKick = sgGeneral.add(new BoolSetting.Builder()
.name("anti-kick")
.description("Предотвращает кик")
.defaultValue(true)
.build()
);
// Auto Mount settings
private final Setting<Boolean> autoMount = sgAutoMount.add(new BoolSetting.Builder()
.name("auto-mount")
.description("Автопосадка в лодку")
.defaultValue(true)
.build()
);
private final Setting<Double> mountRange = sgAutoMount.add(new DoubleSetting.Builder()
.name("mount-range")
.description("Радиус обнаружения лодки")
.defaultValue(5.0)
.min(1.0)
.max(10.0)
.visible(autoMount::get)
.build()
);
private final Setting<Boolean> teleportToBoat = sgAutoMount.add(new BoolSetting.Builder()
.name("teleport-to-boat")
.description("Телепортировать игрока на лодку при выкидывании")
.defaultValue(true)
.visible(autoMount::get)
.build()
);
// Sync settings
private final Setting<Boolean> enableSync = sgSync.add(new BoolSetting.Builder()
.name("enable-sync")
.description("Синхронизация")
.defaultValue(true)
.build()
);
private final Setting<SyncMode> syncMode = sgSync.add(new EnumSetting.Builder<SyncMode>()
.name("sync-mode")
.description("Режим синхронизации")
.defaultValue(SyncMode.Dismount)
.visible(enableSync::get)
.build()
);
private final Setting<Integer> dismountInterval = sgSync.add(new IntSetting.Builder()
.name("dismount-interval")
.description("Интервал выкидывания с лодки")
.defaultValue(40)
.min(10)
.max(100)
.visible(() -> enableSync.get() && syncMode.get() == SyncMode.Dismount)
.build()
);
private final Setting<Integer> dismountTicks = sgSync.add(new IntSetting.Builder()
.name("dismount-ticks")
.description("Скорость выкидывания с лодки")
.defaultValue(2)
.min(1)
.max(5)
.visible(() -> enableSync.get() && syncMode.get() == SyncMode.Dismount)
.build()
);
private int syncTimer = 0;
private int dismountTimer = 0;
private int mountTimer = 0;
private boolean isDismounting = false;
private Entity targetBoat = null;
private int flightTicks = 0;
private int noBoatTicks = 0;
private String lastBoatUUID = null;
private boolean isNewBoat = false;
public BoatFly() {
super(Categories.Movement, "boat-fly", "Обходит Grim (наверное)");
}
@Override
public void onActivate() {
syncTimer = 0;
dismountTimer = 0;
mountTimer = 0;
isDismounting = false;
targetBoat = null;
flightTicks = 0;
noBoatTicks = 0;
lastBoatUUID = null;
isNewBoat = false;
if (mc.player != null && mc.player.getVehicle() instanceof BoatEntity boat) {
targetBoat = boat;
lastBoatUUID = boat.getUuidAsString();
}
}
@EventHandler
private void onBoatMove(BoatMoveEvent event) {
if (event.boat.getControllingPassenger() != mc.player) return;
targetBoat = event.boat;
String currentUUID = event.boat.getUuidAsString();
if (!currentUUID.equals(lastBoatUUID)) {
isNewBoat = true;
lastBoatUUID = currentUUID;
}
flightTicks++;
if (antiKick.get()) {
event.boat.setNoGravity(true);
}
event.boat.setYaw(mc.player.getYaw());
Vec3d vel = PlayerUtils.getHorizontalVelocity(speed.get());
double velX = vel.getX();
double velY = 0;
double velZ = vel.getZ();
if (mc.options.jumpKey.isPressed()) {
velY += verticalSpeed.get() / 20;
} else if (mc.options.sprintKey.isPressed()) {
velY -= verticalSpeed.get() / 20;
} else {
velY -= fallSpeed.get() / 20;
}
((IVec3d) event.boat.getVelocity()).meteor$set(velX, velY, velZ);
if (enableSync.get() && syncMode.get() == SyncMode.Packet && mc.getNetworkHandler() != null) {
Vec3d pos = event.boat.getPos();
VehicleMoveC2SPacket packet = new VehicleMoveC2SPacket(pos, event.boat.getYaw(), event.boat.getPitch(), false);
mc.getNetworkHandler().sendPacket(packet);
}
}
@EventHandler
private void onTick(TickEvent.Post event) {
if (mc.player == null) return;
boolean inBoat = mc.player.getVehicle() instanceof BoatEntity;
if (inBoat) {
targetBoat = mc.player.getVehicle();
noBoatTicks = 0;
mountTimer = 0;
if (enableSync.get() && syncMode.get() == SyncMode.Dismount) {
handleDismountSync();
}
} else {
noBoatTicks++;
if (autoMount.get() && !isDismounting) {
mountTimer--;
if (mountTimer <= 0) {
tryMountBoat();
mountTimer = 10;
}
}
}
if (isDismounting) {
handleDismountPhase(inBoat);
}
}
private void handleDismountSync() {
if (!enableSync.get() || syncMode.get() != SyncMode.Dismount || isDismounting) return;
syncTimer--;
if (syncTimer <= 0) {
startDismountSync();
syncTimer = dismountInterval.get();
}
}
private void startDismountSync() {
if (mc.player.getVehicle() instanceof BoatEntity) {
targetBoat = mc.player.getVehicle();
mc.player.dismountVehicle();
isDismounting = true;
dismountTimer = dismountTicks.get();
}
}
private void handleDismountPhase(boolean inBoat) {
dismountTimer--;
if (dismountTimer <= 0) {
if (!inBoat && targetBoat != null && targetBoat.isAlive()) {
remountBoat();
}
isDismounting = false;
}
}
private void remountBoat() {
if (targetBoat == null || !targetBoat.isAlive() || mc.player == null) return;
if (teleportToBoat.get()) {
Vec3d boatPos = targetBoat.getPos();
mc.player.setPosition(boatPos.x, boatPos.y + 0.5, boatPos.z);
}
boolean success = mc.player.startRiding(targetBoat, true);
if (!success && mc.getNetworkHandler() != null) {
PlayerInteractEntityC2SPacket packet = PlayerInteractEntityC2SPacket.interact(targetBoat, false, Hand.MAIN_HAND);
mc.getNetworkHandler().sendPacket(packet);
}
}
private void tryMountBoat() {
if (mc.world == null || mc.player == null) return;
if (targetBoat != null && targetBoat.isAlive()) {
if (mountToBoat(targetBoat)) {
return;
}
}
for (Entity entity : mc.world.getEntities()) {
if (!(entity instanceof BoatEntity)) continue;
double distance = mc.player.squaredDistanceTo(entity);
if (distance > mountRange.get() * mountRange.get()) continue;
if (mountToBoat(entity)) {
targetBoat = entity;
isNewBoat = true;
lastBoatUUID = entity.getUuidAsString();
break;
}
}
}
private boolean mountToBoat(Entity boat) {
if (boat == null || !boat.isAlive() || mc.player == null) return false;
if (teleportToBoat.get()) {
Vec3d boatPos = boat.getPos();
mc.player.setPosition(boatPos.x, boatPos.y + 0.5, boatPos.z);
}
boolean success = mc.player.startRiding(boat, true);
if (!success && mc.getNetworkHandler() != null) {
PlayerInteractEntityC2SPacket packet = PlayerInteractEntityC2SPacket.interact(boat, false, Hand.MAIN_HAND);
mc.getNetworkHandler().sendPacket(packet);
success = true;
}
return success;
}
@EventHandler
private void onReceivePacket(PacketEvent.Receive event) {
if (event.packet instanceof VehicleMoveS2CPacket && cancelServerPackets.get()) {
event.cancel();
}
}
@Override
public void onDeactivate() {
if (targetBoat != null) {
targetBoat.setNoGravity(false);
}
if (mc.player != null && mc.player.getVehicle() instanceof BoatEntity boat) {
boat.setNoGravity(false);
}
}
public enum SyncMode {
Packet("Packet"),
Dismount("Dismount");
private final String title;
SyncMode(String title) {
this.title = title;
}
@Override
public String toString() {
return title;
}
}
@Override
public String getInfoString() {
if (isDismounting) return "Syncing";
if (!autoMount.get() && mc.player != null && !(mc.player.getVehicle() instanceof BoatEntity)) return "No Boat";
return syncMode.get().toString();
}
}
Последнее редактирование: