Додумался я значит до одного интересного эксплойта! Суть работы проста: посылаем серверу инфу о том, что мы находимся чуть дальше чем положено, сервер думает, хммммммммм, этот говнюк не должен там находится! И применяет телепортацию ко мне, чтобы я "вернулся" в исходное место. Ясен пень, никакой телепортации не происходит, однако, велосити (импульс) от телепортации сохраняется! Далее я этот импульс в лодку шмяк, и изменяю его направление, чтобы лодка летела куда нужно. И всё, таким образом я летаю в лодке!!! Изначально, такую хитрость я хотел применить к античиту Grim, и казалось бы, всё как обычно, обход не сработал. Но когда я зашёл на сервер где стоит Old Matrix, обход сработал!!! Я могу летать довольно быстро, но есть проблема: при слишком резких поворотах, снижении скорости или иногда и вовсе при приземлении, меня кикает с сервера по причине (Movement). Протестируйте мой boatfly кому не лень, и подскажите пожалуйста как его можно улучшить. Сразу скажу, что я уже добавлял настройку для плавности движений, но она никакого результата не дала
Java:
package meteordevelopment.meteorclient.systems.modules.movement;
import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.modules.Categories;
import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.orbit.EventHandler;
import net.minecraft.entity.Entity;
import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.util.math.Vec3d;
public class BoatFly extends Module {
private final SettingGroup sgGeneral = settings.getDefaultGroup();
private final SettingGroup sgAdvanced = settings.createGroup("Advanced");
// Обыячные настройки
private final Setting<Double> speed = sgGeneral.add(new DoubleSetting.Builder()
.name("speed")
.description("Горизонтальная скорость")
.defaultValue(1.0)
.min(0.1)
.sliderMax(20.0)
.build()
);
private final Setting<Double> upSpeed = sgGeneral.add(new DoubleSetting.Builder()
.name("up-speed")
.description("Вертикальная скорость")
.defaultValue(0.5)
.min(0.0)
.sliderMax(2.0)
.build()
);
private final Setting<Double> downSpeed = sgGeneral.add(new DoubleSetting.Builder()
.name("down-speed")
.description("Скорость падения")
.defaultValue(0.1)
.min(0.0)
.sliderMax(1.0)
.build()
);
private final Setting<Boolean> autoToggle = sgGeneral.add(new BoolSetting.Builder()
.name("auto-toggle")
.description("Авто выключение")
.defaultValue(true)
.build()
);
// Продвинутые настройки
private final Setting<Double> triggerHeight = sgAdvanced.add(new DoubleSetting.Builder()
.name("trigger-height")
.description("На сколько блоков выше \"основного\" блока должна быть запущена рассинхронизация")
.defaultValue(0.5)
.min(0.001)
.sliderMax(5.0)
.build()
);
private final Setting<Double> delay = sgAdvanced.add(new DoubleSetting.Builder()
.name("delay")
.description("Задержка между рассинхронизацией в тиках")
.defaultValue(2.0)
.min(1.0)
.sliderMax(20.0)
.build()
);
private final Setting<Boolean> requireGround = sgAdvanced.add(new BoolSetting.Builder()
.name("require-ground")
.description("Рассинхронизация работает только если лодка стоит на блоках")
.defaultValue(true)
.build()
);
private final Setting<Boolean> jitter = sgAdvanced.add(new BoolSetting.Builder()
.name("jitter")
.description("Добавляет случайный шум")
.defaultValue(true)
.build()
);
private final Setting<Boolean> syncRotation = sgGeneral.add(new BoolSetting.Builder()
.name("sync-rotation")
.description("Поворачивает лодку в направлении взгляда")
.defaultValue(true)
.build()
);
private int delayTimer = 0;
private boolean wasInBoat = false;
public BoatFly() {
super(Categories.Movement, "boat-fly", "Использует эксплойт для полёта на лодке");
}
@Override
public void onActivate() {
delayTimer = 0;
wasInBoat = mc.player.getVehicle() instanceof BoatEntity;
}
@EventHandler
private void onTick(TickEvent.Post event) {
Entity vehicle = mc.player.getVehicle();
// Проверьте, находится ли игрок в лодке
if (!(vehicle instanceof BoatEntity)) {
if (autoToggle.get() && wasInBoat) {
toggle();
info("Вы вышли из лодки. Выключение");
}
wasInBoat = false;
return;
}
wasInBoat = true;
BoatEntity boat = (BoatEntity) vehicle;
// Синхронизирует поворот лодки со взглядом игрока
if (syncRotation.get()) {
boat.setYaw(mc.player.getYaw());
boat.setPitch(mc.player.getPitch());
}
// Jitter настройка
delayTimer++;
double currentDelay = delay.get();
if (jitter.get()) {
currentDelay += (Math.random() * 2) - 1;
}
if (delayTimer < currentDelay) {
return;
}
delayTimer = 0;
// Проверяет, думает ли сервер, что мы на месте
boolean serverOnGround = requireGround.get() && boat.isOnGround();
if (requireGround.get() && !serverOnGround) {
return;
}
// Получение текущего велосити и применение движения
Vec3d velocity = boat.getVelocity();
Vec3d newVelocity = new Vec3d(velocity.x, velocity.y, velocity.z);
// Контроль движения
if (mc.options.jumpKey.isPressed()) {
newVelocity = new Vec3d(newVelocity.x, upSpeed.get(), newVelocity.z);
} else if (mc.options.sneakKey.isPressed()) {
newVelocity = new Vec3d(newVelocity.x, -downSpeed.get(), newVelocity.z);
} else {
newVelocity = new Vec3d(newVelocity.x, 0.08, newVelocity.z);
}
// Управление горизонтальным перемещением
float yaw = boat.getYaw();
float forward = mc.player.forwardSpeed;
float side = mc.player.sidewaysSpeed;
if (forward != 0 || side != 0) {
double radYaw = Math.toRadians(yaw);
double x = -Math.sin(radYaw) * forward + Math.cos(radYaw) * side;
double z = Math.cos(radYaw) * forward + Math.sin(radYaw) * side;
newVelocity = new Vec3d(
newVelocity.x + x * speed.get() * 0.1,
newVelocity.y,
newVelocity.z + z * speed.get() * 0.1
);
}
// Применяет окончательное велосити
boat.setVelocity(newVelocity);
}
}