Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Как посадить игрока в лодку? / На оценку код

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
29 Июн 2021
Сообщения
85
Реакции
1
Хочу сделать настройку котора будет постоянно закидывать и выкидывать меня с лодки. Это должно обойти античит на том сервере где я играю. И я написал такой модуль, вот только лодка с сервером не может синхронизироваться. Я летать на ней могу сколько угодно, но слезть с неё не получается, а когда перезахожу на сервер меня просто телепортирует на исходное место откуда я начинал полёт. Помогите сделать нормальную настройку autoremount пожалуйста. Я пишу на базе Meteor client fabric 1.21.4
Java:
Expand Collapse Copy
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();
    }
}
 
Последнее редактирование:
Хочу сделать настройку котора будет постоянно закидывать и выкидывать меня с лодки. Это должно обойти античит на том сервере где я играю. И я написал такой модуль, вот только лодка с сервером не может синхронизироваться. Я летать на ней могу сколько угодно, но слезть с неё не получается, а когда перезахожу на сервер меня просто телепортирует на исходное место откуда я начинал полёт. Помогите сделать нормальную настройку autoremount пожалуйста. Я пишу на базе Meteor client fabric 1.21.4
Java:
Expand Collapse Copy
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();
    }
}
Мб визуально летишь
 
Мб визуально летишь
Не визуально, ибо в одиночной игре я пролетаю это расстояние по настоящему. Но при перезаходе лодку телепортирует на то место откуда я начинал полёт. Хотя я сам остаюсь на том месте куда прилетел
 
Назад
Сверху Снизу