Гайд NoRotate и что это за функция (1.12.2)

Начинающий
Статус
Оффлайн
Регистрация
7 Мар 2024
Сообщения
45
Реакции[?]
2
Поинты[?]
2K

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Всем привет! В даной теме я расскажу и покажу как сделать 1 из видов NoRotate(виды подразумеваются как типы логики функции).

В основном(какие я видел), NoRotate можно поделить на 2 типа:
1 тип: Просто блокирует поворот камеры игрока.
2 тип: Высчитывает ближайший вектор направления(например X+ Z-) и фиксирует камеру на нём.

В нашем случае мы будем рассматривать 2-й тип модуля.



Примечание: Всю логику писал лично я и не брал где-либо.
В теме подразумевается, что вы используете обработчик евентов от forge(т.е. MinecraftForge.EVENT_BUS).




Ну а теперь перейдём к теории, что-бы было более понятно где, что и как работает:


Камера игрока обрабатывается с помощью двух переменных: Yaw и Pitch.
Yaw — это поворот камеры по горизонтали(влево-вправо, если проще).
Pitch — это поворот камеры по вертикали(вверх-вниз аналогично).
И оба эти значения имею формат double.

Так-же они имеют свои ограничения по значениям:
Yaw — -30000000 до 30000000.
Pitch — -90 до 90.

Это все понятно, но как-же повернется наша камера, если выставить значение Yaw, например, на 14580?

Все очень просто. что-бы было проще мы представим вокруг головы игрока некий круг, на котором и будет распологатся наша градусная мера:

Без названия28_20240429160753.png

Как мы видим, когда угол камеры становится больше 360 он возвращается к 0 и идет дальше(хоть в майне это будет работать по другому, но для игрока будет всё точно так-же). Поделив наше число на 360 и отняв целое число мы получили значение в промежутке 0/0.9999... . Поделив 360 на это число мы получим градус, на который повернется камера. Получается, при значении 14580 наша камера повернется на 180 градусов. Не так уж и сложно.

Так-же, для заметки, мы можем записать некоторые значения этого числа для градусов:
0/360 градусов — 0
45 — 0.125
90 — 0.25
135 — 0.375
180 — 0.5
225 — 0.625
270 — 0.75
315 — 0.875


А с Pitch ещё проще будет. Мы можем также представить градусную меру, но уже в виде полукруга:

Без названия29_20240429161630.png

И т.к. наш Pitch имеет ограничение -90/90, то наша камера просто повернется на тот угол, на который вы укажете.


Окей, но как это нам пригодится в создании функции?

Это напрямую зависит на работу нашей функции. Давайте уже приступим к практике:

Для начала создадим класс, где будет производится все вычисления и создадим все нужные нам переменные:
NoRotateMathUtil:
public class NoRotateMathUtil {
    public static int CorrectlyYaw;
    public static int CorrectlyPitch;
    protected static double checkYaw1;
    protected static double checkYaw2;
    protected static double checkPitch1;
    protected static double checkPitch2;
    protected static int isNegative = 0;
    protected static int isNegative2 = 0;
}
После создадим метод для вычисления нужного Yaw:
Java:
public static void RotateYawMath() {
        Minecraft mc = Minecraft.getMinecraft();
        double yaw = mc.player.rotationYaw;
        yaw = yaw / 360;
        if (yaw < 0) {
            isNegative = 1;
            yaw = -yaw;
        } else
            isNegative = 0;
        int yawint = (int)yaw;
        yaw = yaw - yawint;
}
Как видно в коде мы получаем Yaw игрока и делим его на 360, после проверяем, отрицательный он или нет, и выставляем нужное значения переменной, а после получаем дробное значение.

Теперь создадим ещё четыре метода:
Java:
protected static void checkIsNegativeYaw(int a, int b) {
    if (a == 1) {
        CorrectlyYaw = -b;
    } else {
        CorrectlyYaw = b;
    }
}

protected static void checkIsNegativePitch(int a, int b) {
    if (a == 1) {
        CorrectlyPitch = -b;
    } else {
        CorrectlyPitch = b;
    }
}

protected static void checkYawRotate(double maxValue, double minValue, double yaw) {
    checkYaw1 = maxValue - yaw;
    checkYaw2 = yaw - minValue;
}

protected static void checkPitchRotate(double maxValue, double minValue, double pitch) {
    checkPitch1 = maxValue - pitch;
    checkPitch2 = pitch - minValue;
}
А теперь в конце RotateYawMath добавляем этот код:
Java:
if (yaw <= 0.125 && yaw >= 0) {
            checkYaw1 = 0.125 - yaw;
            if (yaw > checkYaw1)
                checkIsNegativeYaw(isNegative, 45);
            else
                CorrectlyYaw = 0;
        }
        if (yaw <= 0.25 && yaw >= 0.125) {
            checkYawRotate(0.25, 0.125, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 45);
            else
                checkIsNegativeYaw(isNegative, 90);
        }
        if (yaw <= 0.375 && yaw >= 0.25) {
            checkYawRotate(0.375, 0.25, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 90);
            else
                checkIsNegativeYaw(isNegative, 135);
        }
        if (yaw <= 0.5 && yaw >= 0.375) {
            checkYawRotate(0.5, 0.375, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 135);
            else
                checkIsNegativeYaw(isNegative, 180);
        }
        if (yaw <= 0.625 && yaw >= 0.5) {
            checkYawRotate(0.625, 0.5, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 180);
            else
                checkIsNegativeYaw(isNegative, 225);
        }
        if (yaw <= 0.75 && yaw >= 0.625) {
            checkYawRotate(0.75, 0.625, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 225);
            else
                checkIsNegativeYaw(isNegative, 270);
        }
        if (yaw <= 0.875 && yaw >= 0.75) {
            checkYawRotate(0.875, 0.75, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 270);
            else
                checkIsNegativeYaw(isNegative, 315);
        }
        if (yaw >= 0.875) {
            checkYaw1 = yaw - 0.875;
            if (checkYaw1 <= 0.0625)
                checkIsNegativeYaw(isNegative, 315);
            else
                checkIsNegativeYaw(isNegative, 360);
        }
Если немного разобратся в этой бурде, то можно понять, что она вычисляет ближайшее направление для дробного значения и выставляет переменной CorrectlyYaw нужное значение.


Теперь создаём метод RotatePitchMath:
Java:
public static void RotatePitchMath() {
        Minecraft mc = Minecraft.getMinecraft();
        double pitch = mc.player.rotationPitch;
        if (pitch < 0) {
            isNegative2 = 1;
            pitch = -pitch;
        } else
            isNegative2 = 0;
        if (pitch <= 90 && pitch >= 45) {
            checkPitchRotate(90, 45, pitch);
            if (checkPitch1 > checkPitch2)
                checkIsNegativePitch(isNegative2, 45);
            else
                checkIsNegativePitch(isNegative2, 90);
        }
        if (pitch <= 45 && pitch >= 0) {
            checkPitch1 = 45 - pitch;
            if (checkPitch1 <= pitch)
                checkIsNegativePitch(isNegative2, 45);
            else
                CorrectlyPitch = 0;
        }
    }
Он уже просто вычисляет ближайшее направление для Pitch игрока, т.к. для этого числа не нужна никакая обработка.


Отлично, теперь создайте новый модуль и вставьте в него это:
Java:
@SubscribeEvent
    public void onUpdate(TickEvent.PlayerTickEvent e) {
        if (mc.world == null || mc.player == null) return;

        NoRotateMathUtil.RotateYawMath();
        NoRotateMathUtil.RotatePitchMath();
        mc.player.rotationYaw = NoRotateMathUtil.CorrectlyYaw;
        boolean box = getCheckbox(this.name, "BlockPitchRotate"); // boolean значение настройки "BlockPitchRotate"
        if (box)
            mc.player.rotationPitch = NoRotateMathUtil.CorrectlyPitch;
    }
При включении он будет вычислять ближайшее направление, исходя из Yaw и Pitch игрока, и поворачивать его к нему.


Вот и всё. Я знаю, что весь код получился большим, но мне лень это всё оптимизировать.:roflanEbalo:

Так-же есть один баг(или фича, как посмотреть), что если сильно дернуть мышкой, то вы повернетесь на другое направление. Это можно исправить, если немного подумать.

Так-же с помощью этой утилки вы можете сделать вывод на экран Direction игрока(например Direction: X+; Direction: X- Z+), но это уже сами придумаете.

P.S. Попытался как можно чщательнее всё разжевать, что-бы был полностью понятен принцип работы модуля. Хз.

Если кому-то в падлу читать всю тему то вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
8 Май 2023
Сообщения
457
Реакции[?]
5
Поинты[?]
6K
Всем привет! В даной теме я расскажу и покажу как сделать 1 из видов NoRotate(виды подразумеваются как типы логики функции).

В основном(какие я видел), NoRotate можно поделить на 2 типа:
1 тип: Просто блокирует поворот камеры игрока.
2 тип: Высчитывает ближайший вектор направления(например X+ Z-) и фиксирует камеру на нём.

В нашем случае мы будем рассматривать 2-й тип модуля.



Примечание: Всю логику писал лично я и не брал где-либо.
В теме подразумевается, что вы используете обработчик евентов от forge(т.е. MinecraftForge.EVENT_BUS).




Ну а теперь перейдём к теории, что-бы было более понятно где, что и как работает:


Камера игрока обрабатывается с помощью двух переменных: Yaw и Pitch.
Yaw — это поворот камеры по горизонтали(влево-вправо, если проще).
Pitch — это поворот камеры по вертикали(вверх-вниз аналогично).
И оба эти значения имею формат double.

Так-же они имеют свои ограничения по значениям:
Yaw — -30000000 до 30000000.
Pitch — -90 до 90.

Это все понятно, но как-же повернется наша камера, если выставить значение Yaw, например, на 14580?

Все очень просто. что-бы было проще мы представим вокруг головы игрока некий круг, на котором и будет распологатся наша градусная мера:

Посмотреть вложение 275709

Как мы видим, когда угол камеры становится больше 360 он возвращается к 0 и идет дальше(хоть в майне это будет работать по другому, но для игрока будет всё точно так-же). Поделив наше число на 360 и отняв целое число мы получили значение в промежутке 0/0.9999... . Поделив 360 на это число мы получим градус, на который повернется камера. Получается, при значении 14580 наша камера повернется на 180 градусов. Не так уж и сложно.

Так-же, для заметки, мы можем записать некоторые значения этого числа для градусов:
0/360 градусов — 0
45 — 0.125
90 — 0.25
135 — 0.375
180 — 0.5
225 — 0.625
270 — 0.75
315 — 0.875


А с Pitch ещё проще будет. Мы можем также представить градусную меру, но уже в виде полукруга:

Посмотреть вложение 275710

И т.к. наш Pitch имеет ограничение -90/90, то наша камера просто повернется на тот угол, на который вы укажете.


Окей, но как это нам пригодится в создании функции?

Это напрямую зависит на работу нашей функции. Давайте уже приступим к практике:

Для начала создадим класс, где будет производится все вычисления и создадим все нужные нам переменные:
NoRotateMathUtil:
public class NoRotateMathUtil {
    public static int CorrectlyYaw;
    public static int CorrectlyPitch;
    protected static double checkYaw1;
    protected static double checkYaw2;
    protected static double checkPitch1;
    protected static double checkPitch2;
    protected static int isNegative = 0;
    protected static int isNegative2 = 0;
}
После создадим метод для вычисления нужного Yaw:
Java:
public static void RotateYawMath() {
        Minecraft mc = Minecraft.getMinecraft();
        double yaw = mc.player.rotationYaw;
        yaw = yaw / 360;
        if (yaw < 0) {
            isNegative = 1;
            yaw = -yaw;
        } else
            isNegative = 0;
        int yawint = (int)yaw;
        yaw = yaw - yawint;
}
Как видно в коде мы получаем Yaw игрока и делим его на 360, после проверяем, отрицательный он или нет, и выставляем нужное значения переменной, а после получаем дробное значение.

Теперь создадим ещё четыре метода:
Java:
protected static void checkIsNegativeYaw(int a, int b) {
    if (a == 1) {
        CorrectlyYaw = -b;
    } else {
        CorrectlyYaw = b;
    }
}

protected static void checkIsNegativePitch(int a, int b) {
    if (a == 1) {
        CorrectlyPitch = -b;
    } else {
        CorrectlyPitch = b;
    }
}

protected static void checkYawRotate(double maxValue, double minValue, double yaw) {
    checkYaw1 = maxValue - yaw;
    checkYaw2 = yaw - minValue;
}

protected static void checkPitchRotate(double maxValue, double minValue, double pitch) {
    checkPitch1 = maxValue - pitch;
    checkPitch2 = pitch - minValue;
}
А теперь в конце RotateYawMath добавляем этот код:
Java:
if (yaw <= 0.125 && yaw >= 0) {
            checkYaw1 = 0.125 - yaw;
            if (yaw > checkYaw1)
                checkIsNegativeYaw(isNegative, 45);
            else
                CorrectlyYaw = 0;
        }
        if (yaw <= 0.25 && yaw >= 0.125) {
            checkYawRotate(0.25, 0.125, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 45);
            else
                checkIsNegativeYaw(isNegative, 90);
        }
        if (yaw <= 0.375 && yaw >= 0.25) {
            checkYawRotate(0.375, 0.25, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 90);
            else
                checkIsNegativeYaw(isNegative, 135);
        }
        if (yaw <= 0.5 && yaw >= 0.375) {
            checkYawRotate(0.5, 0.375, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 135);
            else
                checkIsNegativeYaw(isNegative, 180);
        }
        if (yaw <= 0.625 && yaw >= 0.5) {
            checkYawRotate(0.625, 0.5, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 180);
            else
                checkIsNegativeYaw(isNegative, 225);
        }
        if (yaw <= 0.75 && yaw >= 0.625) {
            checkYawRotate(0.75, 0.625, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 225);
            else
                checkIsNegativeYaw(isNegative, 270);
        }
        if (yaw <= 0.875 && yaw >= 0.75) {
            checkYawRotate(0.875, 0.75, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 270);
            else
                checkIsNegativeYaw(isNegative, 315);
        }
        if (yaw >= 0.875) {
            checkYaw1 = yaw - 0.875;
            if (checkYaw1 <= 0.0625)
                checkIsNegativeYaw(isNegative, 315);
            else
                checkIsNegativeYaw(isNegative, 360);
        }
Если немного разобратся в этой бурде, то можно понять, что она вычисляет ближайшее направление для дробного значения и выставляет переменной CorrectlyYaw нужное значение.


Теперь создаём метод RotatePitchMath:
Java:
public static void RotatePitchMath() {
        Minecraft mc = Minecraft.getMinecraft();
        double pitch = mc.player.rotationPitch;
        if (pitch < 0) {
            isNegative2 = 1;
            pitch = -pitch;
        } else
            isNegative2 = 0;
        if (pitch <= 90 && pitch >= 45) {
            checkPitchRotate(90, 45, pitch);
            if (checkPitch1 > checkPitch2)
                checkIsNegativePitch(isNegative2, 45);
            else
                checkIsNegativePitch(isNegative2, 90);
        }
        if (pitch <= 45 && pitch >= 0) {
            checkPitch1 = 45 - pitch;
            if (checkPitch1 <= pitch)
                checkIsNegativePitch(isNegative2, 45);
            else
                CorrectlyPitch = 0;
        }
    }
Он уже просто вычисляет ближайшее направление для Pitch игрока, т.к. для этого числа не нужна никакая обработка.


Отлично, теперь создайте новый модуль и вставьте в него это:
Java:
@SubscribeEvent
    public void onUpdate(TickEvent.PlayerTickEvent e) {
        if (mc.world == null || mc.player == null) return;

        NoRotateMathUtil.RotateYawMath();
        NoRotateMathUtil.RotatePitchMath();
        mc.player.rotationYaw = NoRotateMathUtil.CorrectlyYaw;
        boolean box = getCheckbox(this.name, "BlockPitchRotate"); // boolean значение настройки "BlockPitchRotate"
        if (box)
            mc.player.rotationPitch = NoRotateMathUtil.CorrectlyPitch;
    }
При включении он будет вычислять ближайшее направление, исходя из Yaw и Pitch игрока, и поворачивать его к нему.


Вот и всё. Я знаю, что весь код получился большим, но мне лень это всё оптимизировать.:roflanEbalo:

Так-же есть один баг(или фича, как посмотреть), что если сильно дернуть мышкой, то вы повернетесь на другое направление. Это можно исправить, если немного подумать.

Так-же с помощью этой утилки вы можете сделать вывод на экран Direction игрока(например Direction: X+; Direction: X- Z+), но это уже сами придумаете.

P.S. Попытался как можно чщательнее всё разжевать, что-бы был полностью понятен принцип работы модуля. Хз.

Если кому-то в падлу читать всю тему то вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Неплох, расписал все подробно и понятно. Заранее предупреждаю пастеров это не экспенсив реади)))

P.s. почему не кто не оценил эту топ тему
 
Начинающий
Статус
Оффлайн
Регистрация
7 Мар 2024
Сообщения
294
Реакции[?]
6
Поинты[?]
4K
Неплох, расписал все подробно и понятно. Заранее предупреждаю пастеров это не экспенсив реади)))

P.s. почему не кто не оценил эту топ тему
Потому что вероятно всего она спизженая у американ гайс комьюнити
 
Начинающий
Статус
Оффлайн
Регистрация
7 Мар 2024
Сообщения
45
Реакции[?]
2
Поинты[?]
2K
Потому что вероятно всего она спизженая у американ гайс комьюнити
В примечании чётко написано , что "Всю логику писал лично я и не брал где-либо"(если логика моя то и тема, очевидно, моя). Да и мне смысла нету шастать по другим форумам и нагло брать темы.
 
Начинающий
Статус
Оффлайн
Регистрация
22 Янв 2024
Сообщения
79
Реакции[?]
0
Поинты[?]
0
Всем привет! В даной теме я расскажу и покажу как сделать 1 из видов NoRotate(виды подразумеваются как типы логики функции).

В основном(какие я видел), NoRotate можно поделить на 2 типа:
1 тип: Просто блокирует поворот камеры игрока.
2 тип: Высчитывает ближайший вектор направления(например X+ Z-) и фиксирует камеру на нём.

В нашем случае мы будем рассматривать 2-й тип модуля.



Примечание: Всю логику писал лично я и не брал где-либо.
В теме подразумевается, что вы используете обработчик евентов от forge(т.е. MinecraftForge.EVENT_BUS).




Ну а теперь перейдём к теории, что-бы было более понятно где, что и как работает:


Камера игрока обрабатывается с помощью двух переменных: Yaw и Pitch.
Yaw — это поворот камеры по горизонтали(влево-вправо, если проще).
Pitch — это поворот камеры по вертикали(вверх-вниз аналогично).
И оба эти значения имею формат double.

Так-же они имеют свои ограничения по значениям:
Yaw — -30000000 до 30000000.
Pitch — -90 до 90.

Это все понятно, но как-же повернется наша камера, если выставить значение Yaw, например, на 14580?

Все очень просто. что-бы было проще мы представим вокруг головы игрока некий круг, на котором и будет распологатся наша градусная мера:

Посмотреть вложение 275709

Как мы видим, когда угол камеры становится больше 360 он возвращается к 0 и идет дальше(хоть в майне это будет работать по другому, но для игрока будет всё точно так-же). Поделив наше число на 360 и отняв целое число мы получили значение в промежутке 0/0.9999... . Поделив 360 на это число мы получим градус, на который повернется камера. Получается, при значении 14580 наша камера повернется на 180 градусов. Не так уж и сложно.

Так-же, для заметки, мы можем записать некоторые значения этого числа для градусов:
0/360 градусов — 0
45 — 0.125
90 — 0.25
135 — 0.375
180 — 0.5
225 — 0.625
270 — 0.75
315 — 0.875


А с Pitch ещё проще будет. Мы можем также представить градусную меру, но уже в виде полукруга:

Посмотреть вложение 275710

И т.к. наш Pitch имеет ограничение -90/90, то наша камера просто повернется на тот угол, на который вы укажете.


Окей, но как это нам пригодится в создании функции?

Это напрямую зависит на работу нашей функции. Давайте уже приступим к практике:

Для начала создадим класс, где будет производится все вычисления и создадим все нужные нам переменные:
NoRotateMathUtil:
public class NoRotateMathUtil {
    public static int CorrectlyYaw;
    public static int CorrectlyPitch;
    protected static double checkYaw1;
    protected static double checkYaw2;
    protected static double checkPitch1;
    protected static double checkPitch2;
    protected static int isNegative = 0;
    protected static int isNegative2 = 0;
}
После создадим метод для вычисления нужного Yaw:
Java:
public static void RotateYawMath() {
        Minecraft mc = Minecraft.getMinecraft();
        double yaw = mc.player.rotationYaw;
        yaw = yaw / 360;
        if (yaw < 0) {
            isNegative = 1;
            yaw = -yaw;
        } else
            isNegative = 0;
        int yawint = (int)yaw;
        yaw = yaw - yawint;
}
Как видно в коде мы получаем Yaw игрока и делим его на 360, после проверяем, отрицательный он или нет, и выставляем нужное значения переменной, а после получаем дробное значение.

Теперь создадим ещё четыре метода:
Java:
protected static void checkIsNegativeYaw(int a, int b) {
    if (a == 1) {
        CorrectlyYaw = -b;
    } else {
        CorrectlyYaw = b;
    }
}

protected static void checkIsNegativePitch(int a, int b) {
    if (a == 1) {
        CorrectlyPitch = -b;
    } else {
        CorrectlyPitch = b;
    }
}

protected static void checkYawRotate(double maxValue, double minValue, double yaw) {
    checkYaw1 = maxValue - yaw;
    checkYaw2 = yaw - minValue;
}

protected static void checkPitchRotate(double maxValue, double minValue, double pitch) {
    checkPitch1 = maxValue - pitch;
    checkPitch2 = pitch - minValue;
}
А теперь в конце RotateYawMath добавляем этот код:
Java:
if (yaw <= 0.125 && yaw >= 0) {
            checkYaw1 = 0.125 - yaw;
            if (yaw > checkYaw1)
                checkIsNegativeYaw(isNegative, 45);
            else
                CorrectlyYaw = 0;
        }
        if (yaw <= 0.25 && yaw >= 0.125) {
            checkYawRotate(0.25, 0.125, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 45);
            else
                checkIsNegativeYaw(isNegative, 90);
        }
        if (yaw <= 0.375 && yaw >= 0.25) {
            checkYawRotate(0.375, 0.25, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 90);
            else
                checkIsNegativeYaw(isNegative, 135);
        }
        if (yaw <= 0.5 && yaw >= 0.375) {
            checkYawRotate(0.5, 0.375, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 135);
            else
                checkIsNegativeYaw(isNegative, 180);
        }
        if (yaw <= 0.625 && yaw >= 0.5) {
            checkYawRotate(0.625, 0.5, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 180);
            else
                checkIsNegativeYaw(isNegative, 225);
        }
        if (yaw <= 0.75 && yaw >= 0.625) {
            checkYawRotate(0.75, 0.625, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 225);
            else
                checkIsNegativeYaw(isNegative, 270);
        }
        if (yaw <= 0.875 && yaw >= 0.75) {
            checkYawRotate(0.875, 0.75, yaw);
            if (checkYaw1 > checkYaw2)
                checkIsNegativeYaw(isNegative, 270);
            else
                checkIsNegativeYaw(isNegative, 315);
        }
        if (yaw >= 0.875) {
            checkYaw1 = yaw - 0.875;
            if (checkYaw1 <= 0.0625)
                checkIsNegativeYaw(isNegative, 315);
            else
                checkIsNegativeYaw(isNegative, 360);
        }
Если немного разобратся в этой бурде, то можно понять, что она вычисляет ближайшее направление для дробного значения и выставляет переменной CorrectlyYaw нужное значение.


Теперь создаём метод RotatePitchMath:
Java:
public static void RotatePitchMath() {
        Minecraft mc = Minecraft.getMinecraft();
        double pitch = mc.player.rotationPitch;
        if (pitch < 0) {
            isNegative2 = 1;
            pitch = -pitch;
        } else
            isNegative2 = 0;
        if (pitch <= 90 && pitch >= 45) {
            checkPitchRotate(90, 45, pitch);
            if (checkPitch1 > checkPitch2)
                checkIsNegativePitch(isNegative2, 45);
            else
                checkIsNegativePitch(isNegative2, 90);
        }
        if (pitch <= 45 && pitch >= 0) {
            checkPitch1 = 45 - pitch;
            if (checkPitch1 <= pitch)
                checkIsNegativePitch(isNegative2, 45);
            else
                CorrectlyPitch = 0;
        }
    }
Он уже просто вычисляет ближайшее направление для Pitch игрока, т.к. для этого числа не нужна никакая обработка.


Отлично, теперь создайте новый модуль и вставьте в него это:
Java:
@SubscribeEvent
    public void onUpdate(TickEvent.PlayerTickEvent e) {
        if (mc.world == null || mc.player == null) return;

        NoRotateMathUtil.RotateYawMath();
        NoRotateMathUtil.RotatePitchMath();
        mc.player.rotationYaw = NoRotateMathUtil.CorrectlyYaw;
        boolean box = getCheckbox(this.name, "BlockPitchRotate"); // boolean значение настройки "BlockPitchRotate"
        if (box)
            mc.player.rotationPitch = NoRotateMathUtil.CorrectlyPitch;
    }
При включении он будет вычислять ближайшее направление, исходя из Yaw и Pitch игрока, и поворачивать его к нему.


Вот и всё. Я знаю, что весь код получился большим, но мне лень это всё оптимизировать.:roflanEbalo:

Так-же есть один баг(или фича, как посмотреть), что если сильно дернуть мышкой, то вы повернетесь на другое направление. Это можно исправить, если немного подумать.

Так-же с помощью этой утилки вы можете сделать вывод на экран Direction игрока(например Direction: X+; Direction: X- Z+), но это уже сами придумаете.

P.S. Попытался как можно чщательнее всё разжевать, что-бы был полностью понятен принцип работы модуля. Хз.

Если кому-то в падлу читать всю тему то вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Хорош! Реально всё подробно расписал, новичкам поможет.
 
Сверху Снизу