Гайд Как работают античиты майнкрафт серверов.

Начинающий
Статус
Оффлайн
Регистрация
28 Апр 2022
Сообщения
8
Реакции[?]
2
Поинты[?]
0
ПВП:
Есть много способов определить, играет ли игрок с читами во время ПВП;
Некоторые современные античиты проверяют ваш яв/скорость питча, ускорение, рандомизацию, GCD и тд.

- Combat rotation Speed :
Они будут смотреть если у вас есть постоянная скорость вращения в течение нескольких тиков (если у вас есть быстрое вращение)
Пример:

Код:
        private final Buffer sameYawStreak = new Buffer(80);
        private final Buffer sameYawStreakHighYaw = new Buffer(20);
     
        private final Buffer outOfStepStreak = new Buffer(5);
        private double lastYaw, lastYawDelta, lastYawAccel;
        private long possibleLag;
     
        private final Deque<Double> samples = Lists.newLinkedList();
        private final Deque<Double> finals = Lists.newLinkedList();
     
        @override
        public void handle(WrappedPacket packet) {
            if (packet instanceof CPacketFlying) {
                CPacketFlying wrapper = (CPacketFlying) packet;
                if (wrapper.isRotation()) {
                    double yaw = wrapper.getYaw();
                    double yawDelta = Math.abs(yaw - lastYaw);
                    double yawAccel = Math.abs(yawDelta - lastYawDelta);
                    boolean isSame = (yawDelta == lastYawDelta);
                    if(yawDelta >= 2 && yawDelta <= 10 && lastYawDelta >= 2 && lastYawDelta <= 10){
                        if(samples.size() <= 40){
                            samples.add(yawDelta);
                        }
                        if(finals.size() <= 40){
                            finals.add(lastYawDelta);
                        }
                        if(finals.size() >= 40 && samples.size() >= 40){
                            double avgYawDelta = MathUtil.getAverage(samples);
                            double lastAvgYawDelta = MathUtil.getAverage(finals);
                            double dif = Math.abs(avgYawDelta - lastAvgYawDelta);
     
                            if(dif <= 0.01f){
                                fail("Too consistent average yaw speed=" + dif + " avy:" + avgYawDelta + " Lavy" + lastAvgYawDelta);
                            }
     
                            if(dif >= 0.8f) {
                                outOfStepStreak.add();
                                if (outOfStepStreak.getValue() >= 2) {
                                    fail("Average yaw speed is out of step=" + dif + " avy:" + avgYawDelta + " Lavy" + lastAvgYawDelta);
                                }
                            }else{
                                outOfStepStreak.reduce(0.5f);
                            }
                            finals.clear();
                            samples.clear();
                        }
                    }
                    lastYaw = yaw;
                    lastYawDelta = yawDelta;
                    lastYawAccel = yawAccel;
                }
            }
        }


это задетектит если скорость разницы ява слишком похожа.

- Combat rotation Randomization:

Есть некоторые античиты, которые будут проверять разницу между явом + питчом и будут смотреть если у вас слишком высокая скорость ява без достаточного перемещения питча.


Код:
       @override
        public void handle(WrappedPacket packet) {
            if (packet instanceof CPacketFlying) {
                CPacketFlying wrapper = (CPacketFlying) packet;
                if (wrapper.isRotation()) {
                    double yaw = wrapper.getYaw();
                    double pitch = wrapper.getPitch();
                    double pitchDelta = Math.abs(pitch - lastPitch);
                    double yawDelta = Math.abs(yaw - lastYaw);
                    double yawAccel = Math.abs(yawDelta - lastYawDelta);
                    //Check for invalid flicking rotations
                    if(Math.abs(pitch) <= 88){
                        if(yawDelta >= 10 && pitchDelta <= 1E-6){ //1E-6 = 0.000001
                            streak.add();
                            if(streak.getValue() >= 20){
                                fail("Has impossible rotation differences");
                            }
                        }else{
                            streak.reduce(2);
                        }
                    }
                    //debug code
                    if(yawDelta > 1 && yawAccel > 0 && yawDelta <= 30) { //2.3
                        if(samples.size() <= 120){
                            samples.add(yawAccel);
                        }else{
                            if(finals.size() <= 5){
                                finals.add((double) MathUtil.getGraph(samples).getPositives());
                            }else{
                                //kurt < 0
                                /*Bukkit.broadcastMessage("avg" + MathUtil.getAverage(finals));
                                Bukkit.broadcastMessage("devit" + MathUtil.deviation(finals));
                                Bukkit.broadcastMessage("kurt" + MathUtil.kurtosis(finals));
                                Bukkit.broadcastMessage("med" + MathUtil.median(finals));
                                Bukkit.broadcastMessage("GRAPH:" + MathUtil.getGraph(samples).getGraph());
                                */
                                finals.clear();
                               /* Bukkit.broadcastMessage("GRAPH:" + MathUtil.getGraph(samples).getGraph());
                                Bukkit.broadcastMessage("POSITIVES: " + MathUtil.getGraph(samples).getPositives());
                                Bukkit.broadcastMessage("NEGATIVES: " + MathUtil.getGraph(samples).getNegatives());*/
                            }
                            samples.clear();
                        }
                        /*Bukkit.broadcastMessage("------");
                        Bukkit.broadcastMessage("YAW ACCEL:" + yawAccel);
                        Bukkit.broadcastMessage("YAW DELTA:" + yawDelta);
                        Bukkit.broadcastMessage("------");*/
                    }
                    lastPitch = pitch;
                    lastYaw = yaw;
                    lastYawDelta = yawDelta;
                    lastYawAccel = yawAccel;
                }
            }
        }

- Rotation GCD:
Теперь мы подойдем к забавной части, где будут в детекте все пастед киллауры 2015 года.

Майнкрафт обычно получает из питча наибольший общий делитель (находится в EntityRenderer#getMouseOver). Существуют античиты, которые перестраивают ваш gcd на стороне сервера и определяют, есть ли у вас недопустимая чувствительность/десятичные числа.

как его вычисляют античиты:


Код:
      public void update(PlayerLocation to, PlayerLocation from) {
            // Get the rotation deltas.
            float deltaYaw = Math.abs(to.getYaw() - from.getYaw());
            float deltaPitch = Math.abs(to.getPitch() - from.getPitch());
            float joltYaw = Math.abs(deltaYaw - this.lastYawDelta);
            float joltPitch = Math.abs(deltaPitch - this.lastPitchDelta);
     
            // Make sure the player is rotating.
            if (to.getYaw() != from.getYaw() || to.getPitch() != from.getPitch()) {
                if(deltaPitch > 0 && deltaPitch < 30) {
                    handleCinematic(joltYaw, joltPitch);
                    final float gcd = (float) MathUtil.gcd(deltaPitch, this.lastPitchDelta);
                    final double sensitivityModifier = Math.cbrt(0.8333 * gcd);
                    final double sensitivityStepTwo = (sensitivityModifier / 0.6) - 0.3333;
                    final double finalSensitivity = sensitivityStepTwo * 200;
     
                    this.finalSensitivity = finalSensitivity;
     
                    this.sensitivitySamples.add((int) finalSensitivity);
     
                    if (this.sensitivitySamples.size() >= 40) {
                        this.sensitivity = (MathUtil.getMode(this.sensitivitySamples)).floatValue();
     
                        final float gcdOne = (float) ((this.sensitivity / 200F) * 0.6F + 0.2F);
                        this.gcd = (gcdOne * gcdOne * gcdOne * 1.2F);
                        this.processed = true;
                        this.sensitivitySamples.clear();
                    }
                }
                this.lastPitchDelta = deltaPitch;
                this.lastYawDelta = deltaYaw;
                this.lastJoltYaw = joltYaw;
                this.lastJoltPitch = joltPitch;
                if (processed) {
                    for (RotationHandler check : data.getCheckManager().getRotationChecks())
                        check.handle(to, from);
                }
            }
        }
     
     
    MATHUTIL:
        public Number getMode(Collection<? extends Number> samples) {
            Map<Number, Integer> frequencies = new HashMap<>();
     
            samples.forEach(i -> frequencies.put(i, frequencies.getOrDefault(i, 0) + 1));
     
            Number mode = null;
            int highest = 0;
     
            for (var entry : frequencies.entrySet()) {
                if (entry.getValue() > highest) {
                    mode = entry.getKey();
                    highest = entry.getValue();
                }
            }
     
            return mode;
        }

Как античиты используют его для обнаружения вашей неверной ротации:
Код:
if(mouseTracker.getSensitivity() <= -1 || mouseTracker.getSensitivity() > 201){
                    this.fail(mouseTracker.getSensitivity() + "%");
 }

---------------------------------------
Я закину вам спойлер расширенной проверки, которой нет ни у кого, потому что большинство пастед античитов не могут синхронизировать цель с вашим собственным пингом, чтобы иметь 0 различий между тем, что видит игрок и сервер.

Большинство людей использовали ротацию зомби из майнкрафта, так проверили это, во-первых, это было бесполезно, пока парень не попытался синхронизировать целевую позицию с точным пингом игрока, которого проверял античит.

Я не буду углубляться в это, но оставлю вам хороший пример
Пожалуйста, авторизуйтесь для просмотра ссылки.



Movement:
здесь мы попадаем на территорию мозга, где большинство людей болтают о том, как обойти анти-чит, они дают советы которые даже не будут работать в 2017 античитах в 2022 году)))

Старый добрый MotionX/Z (SpeedHack, он же movement)
В 2022 есть какие-то античиты, которые полностью перестроили движок движения майнкрафта в свой античит и просто ищут отличия, если будут отличия 0.0001, вы провалите проверку

Другие методы:
Некоторые люди не хотели внедрять код майна в свой античит либо потому, что они не могут, потому что у них есть мусорная система синхронизации плеера, либо они слишком ленивы.
Например, есть проверки на трение в воздухе, по умолчанию в майнкрафте вы будете двигаться в воздухе примерно на 2% медленнее за тик, люди написали проверки, которые учитывают это, например:

Код:
      double deltaXZ = user.getMovementProcessor().getDeltaXZ();
     
                    double lastDeltaXZ = user.getMovementProcessor().getLastDeltaXZ();
     
                    double prediction = lastDeltaXZ * 0.91F+ 0.026F;
                    if (user.getCombatProcessor().getVelocityTicks() >= 1 && user.getCombatProcessor().getVelocityTicks() <= 8) {
                        if (user.getActionProcessor().getVelocityTimer().hasNotPassed(10
                                + user.getConnectionProcessor().getClientTick())) {
                            prediction += user.getCombatProcessor().getVelocityHNoTrans();
                        }
                    }
                    double motionXZ = deltaXZ - prediction;
     
                    if (!user.getMovementProcessor().isOnGround() && !user.getMovementProcessor().isLastGround()) {
                        if (motionXZ > 0.001 && deltaXZ > 0.2) {
                            if (++threshold > 1) {
                                flag(user, "Modifying air speed", "mxz="+motionXZ);
                            }
                        } else {
                            threshold -= Math.min(threshold, 0.00000001);
                        }
                    }

MotionY, также известный как funny fly/glide ;
То же самое и выше, некоторые люди внедрили весь движок майна в свои античиты, а некоторые нет.
Почти все античиты предсказывают ваше движение Y, в EntityLivingBase майнкрафта вас будет тянуть вниз гравитация * 0,98 и фиксированное движение Y 0,08

Как античиты обнаруживают, что у вас аномальное движение Y:

Код:
        @override
        public void onPacket(PacketEvent event) {
            User user = event.getUser();
     
            switch (event.getType()) {
                case Packet.Client.FLYING:
                case Packet.Client.LOOK:
                case Packet.Client.POSITION_LOOK:
                case Packet.Client.POSITION: {
                    //    Bukkit.broadcastMessage(""+user.getBlockData().nearWater);
     
                    if (user.shouldCancel()
                            || user.getActionProcessor().getServerPositionTimer().hasNotPassed(3)
                            || user.getLastTeleportTimer().hasNotPassed(20)
                            || user.getMovementProcessor().isBouncedOnSlime()
                            || user.getVehicleTicks() > 0
                            || EntityUtil.isOnBoat(user)
                            || user.getLastBlockPlaceCancelTimer().hasNotPassed(3)
                            || user.getBlockData().webTicks > 0
                            || user.getBlockData().cakeTicks > 0
                            || user.getBlockData().climbableTicks > 0
                            || user.getBlockData().stairTicks > 0
                            || user.getBlockData().slabTicks > 0
                            || user.getLastBlockPlaceTimer().hasNotPassed(3)
                            || user.getBlockData().underBlockTicks > 0
                            || user.getBlockData().waterTicks > 0
                            || user.getBlockData().lavaTicks > 0
                            || user.getBlockData().door
                            || !user.isChunkLoaded()
                            || user.getMovementProcessor().getDeltaXZ() < 0.2
                            && user.getPotionProcessor().getJumpTicks() > 0
                            || user.getActionProcessor().getVelocityTimer().hasNotPassed(9)
                            && user.getLastFallDamageTimer().passed(20)
                            || user.getTick() < 60) {
                        threshold = 0;
                        return;
                    }
     
                    double deltaY = user.getMovementProcessor().getDeltaY();
     
                    double lastDeltaY = user.getMovementProcessor().getLastDeltaY();
     
     
                    double gravity = 0.9800000190734863D;
                    double fallMotion = 0.08D;
     
                    double prediction = (lastDeltaY - fallMotion) * gravity;
     
                    if (!user.getMovementProcessor().isOnGround()
                            && user.getMovementProcessor().isLastGround() && deltaY > 0.0) {
                        prediction = 0.42F + (user.getPotionProcessor().getJumpAmplifier() * 0.1F);
                    }
     
                    double totalUp = Math.abs(deltaY - prediction);
     
                    double max = 0.005;
     
                    if (!user.getMovementProcessor().isOnGround() && !user.getMovementProcessor().isLastGround()) {
                        if (totalUp > max && Math.abs(prediction) > max) {
     
                            if (++threshold > 1) {
                                flag(user, "Invalid motion prediction", "t="+totalUp + " y="+deltaY + " p="+prediction);
                            }
                        } else {
                            threshold -= Math.min(threshold, 0.0000001f);
                        }
                    }
                }
            }
 
Уникальное звание
Пользователь
Статус
Оффлайн
Регистрация
8 Авг 2019
Сообщения
681
Реакции[?]
132
Поинты[?]
6K
Как связаны проверки 1 ас с другими?
 
Пользователь
Статус
Оффлайн
Регистрация
18 Фев 2022
Сообщения
594
Реакции[?]
100
Поинты[?]
40K
Как это читать вообще? Какие-то гугл транслейт строки, ты бы хоть попытался перефразировать предложения, на будущее: юзай
Пожалуйста, авторизуйтесь для просмотра ссылки.
когда переводишь статьи
 
Сверху Снизу