Попытался написать собственный дисеблер для обхода ncp, но ничего не вышло. По идеи он должен добавлять случайные отклонения в координаты пакетов движения, чтобы сбить античит с толку, но этого не происходит и сервер почти моментально отменяет коррекцию позиции. Я уже и мерцание добавил для пущего рандома, но всё опять же не работает. Подскажите пожалуйста, какими методами лучше всего маскироваться от ncp?
Java:
package meteordevelopment.meteorclient.systems.modules.misc;
import meteordevelopment.meteorclient.events.packets.PacketEvent;
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.network.packet.Packet;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket;
import java.util.Random;
public class NCPDisabler extends Module {
private final SettingGroup sgGeneral = settings.getDefaultGroup();
private final SettingGroup sgMovement = settings.createGroup("Movement");
private final Setting<Boolean> debug = sgGeneral.add(new BoolSetting.Builder()
.name("debug")
.description("Показывает отладочную информацию")
.defaultValue(false)
.build()
);
private final Setting<Boolean> modifyMovement = sgMovement.add(new BoolSetting.Builder()
.name("modify-movement")
.description("Добавляет случайные отклонения в движение")
.defaultValue(true)
.build()
);
private final Setting<Boolean> flicker = sgMovement.add(new BoolSetting.Builder()
.name("flicker")
.description("Периодически включает/выключает модификацию движения")
.defaultValue(false)
.visible(modifyMovement::get)
.build()
);
private final Setting<Integer> flickerCycles = sgMovement.add(new IntSetting.Builder()
.name("flicker-cycles")
.description("Количество включений/выключений за период")
.defaultValue(3)
.min(1)
.max(10)
.visible(() -> modifyMovement.get() && flicker.get())
.build()
);
private final Setting<Integer> flickerInterval = sgMovement.add(new IntSetting.Builder()
.name("flicker-interval")
.description("Длительность периода в тиках")
.defaultValue(40)
.min(10)
.max(200)
.sliderRange(10, 200)
.visible(() -> modifyMovement.get() && flicker.get())
.build()
);
private final Setting<Double> motionNoise = sgMovement.add(new DoubleSetting.Builder()
.name("motion-noise")
.description("Величина отклонений движения")
.defaultValue(0.001)
.min(0.0)
.max(0.01)
.visible(modifyMovement::get)
.build()
);
private final Random random = new Random();
private int flickerTimer = 0;
private boolean isFlickerActive = false;
private int currentCycle = 0;
public NCPDisabler() {
super(Categories.Misc, "NCP Disabler", "Обходит проверки ncp... Наверное");
}
@Override
public void onActivate() {
flickerTimer = 0;
currentCycle = 0;
isFlickerActive = true;
if (debug.get()) info("Модуль активирован");
}
@Override
public void onDeactivate() {
if (debug.get()) info("Модуль деактивирован");
}
@EventHandler
private void onPacketSend(PacketEvent.Send event) {
if (event.packet instanceof PlayerMoveC2SPacket && modifyMovement.get()) {
handleMovementPacket(event);
}
}
@EventHandler
private void onPacketReceive(PacketEvent.Receive event) {
if (event.packet instanceof PlayerPositionLookS2CPacket) {
if (debug.get()) warning("Отмена коррекции позиции сервером");
event.cancel();
}
}
@EventHandler
private void onTick(TickEvent.Post event) {
if (modifyMovement.get() && flicker.get()) {
flickerTimer++;
int stateDuration = flickerInterval.get() / (flickerCycles.get() * 2);
if (stateDuration <= 0) stateDuration = 1;
if (flickerTimer >= stateDuration) {
flickerTimer = 0;
isFlickerActive = !isFlickerActive;
if (!isFlickerActive) {
currentCycle++;
if (currentCycle >= flickerCycles.get() * 2) {
currentCycle = 0;
}
}
if (debug.get()) info("Flicker: " + (isFlickerActive ? "ON" : "OFF"));
}
}
}
private void handleMovementPacket(PacketEvent.Send event) {
PlayerMoveC2SPacket packet = (PlayerMoveC2SPacket) event.packet;
boolean actuallyModify = !flicker.get() || (flicker.get() && isFlickerActive);
if (actuallyModify) {
double x = packet.getX(randomNoise());
double y = packet.getY(randomNoise());
double z = packet.getZ(randomNoise());
event.packet = new PlayerMoveC2SPacket.PositionAndOnGround(
x, y, z, packet.isOnGround()
);
}
}
private double randomNoise() {
return (random.nextDouble() - 0.5) * 2 * motionNoise.get();
}
}