-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для 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?
Все очень просто. что-бы было проще мы представим вокруг головы игрока некий круг, на котором и будет распологатся наша градусная мера:
Как мы видим, когда угол камеры становится больше 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 ещё проще будет. Мы можем также представить градусную меру, но уже в виде полукруга:
И т.к. наш Pitch имеет ограничение -90/90, то наша камера просто повернется на тот угол, на который вы укажете.
Окей, но как это нам пригодится в создании функции?
Это напрямую зависит на работу нашей функции. Давайте уже приступим к практике:
Для начала создадим класс, где будет производится все вычисления и создадим все нужные нам переменные:
После создадим метод для вычисления нужного Yaw:
Как видно в коде мы получаем Yaw игрока и делим его на 360, после проверяем, отрицательный он или нет, и выставляем нужное значения переменной, а после получаем дробное значение.
Теперь создадим ещё четыре метода:
А теперь в конце RotateYawMath добавляем этот код:
Если немного разобратся в этой бурде, то можно понять, что она вычисляет ближайшее направление для дробного значения и выставляет переменной CorrectlyYaw нужное значение.
Теперь создаём метод RotatePitchMath:
Он уже просто вычисляет ближайшее направление для Pitch игрока, т.к. для этого числа не нужна никакая обработка.
Отлично, теперь создайте новый модуль и вставьте в него это:
При включении он будет вычислять ближайшее направление, исходя из Yaw и Pitch игрока, и поворачивать его к нему.
Вот и всё. Я знаю, что весь код получился большим, но мне лень это всё оптимизировать.
Так-же есть один баг(или фича, как посмотреть), что если сильно дернуть мышкой, то вы повернетесь на другое направление. Это можно исправить, если немного подумать.
Так-же с помощью этой утилки вы можете сделать вывод на экран Direction игрока(например Direction: X+; Direction: X- Z+), но это уже сами придумаете.
P.S. Попытался как можно чщательнее всё разжевать, что-бы был полностью понятен принцип работы модуля. Хз.
Если кому-то в падлу читать всю тему то вот
В основном(какие я видел), NoRotate можно поделить на 2 типа:
1 тип: Просто блокирует поворот камеры игрока.
2 тип: Высчитывает ближайший вектор направления(например X+ Z-) и фиксирует камеру на нём.
В нашем случае мы будем рассматривать 2-й тип модуля.
Примечание: Всю логику писал лично я и не брал где-либо.
В теме подразумевается, что вы используете обработчик евентов от forge(т.е. MinecraftForge.EVENT_BUS).
Ну а теперь перейдём к теории, что-бы было более понятно где, что и как работает:
Камера игрока обрабатывается с помощью двух переменных: Yaw и Pitch.
Yaw — это поворот камеры по горизонтали(влево-вправо, если проще).
Pitch — это поворот камеры по вертикали(вверх-вниз аналогично).
И оба эти значения имею формат double.
Так-же они имеют свои ограничения по значениям:
Yaw — -30000000 до 30000000.
Pitch — -90 до 90.
Это все понятно, но как-же повернется наша камера, если выставить значение Yaw, например, на 14580?
Все очень просто. что-бы было проще мы представим вокруг головы игрока некий круг, на котором и будет распологатся наша градусная мера:
Как мы видим, когда угол камеры становится больше 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 ещё проще будет. Мы можем также представить градусную меру, но уже в виде полукруга:
И т.к. наш 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;
}
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;
}
Теперь создадим ещё четыре метода:
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;
}
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);
}
Теперь создаём метод 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;
}
}
Отлично, теперь создайте новый модуль и вставьте в него это:
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;
}
Вот и всё. Я знаю, что весь код получился большим, но мне лень это всё оптимизировать.
Так-же есть один баг(или фича, как посмотреть), что если сильно дернуть мышкой, то вы повернетесь на другое направление. Это можно исправить, если немного подумать.
Так-же с помощью этой утилки вы можете сделать вывод на экран Direction игрока(например Direction: X+; Direction: X- Z+), но это уже сами придумаете.
P.S. Попытался как можно чщательнее всё разжевать, что-бы был полностью понятен принцип работы модуля. Хз.
Если кому-то в падлу читать всю тему то вот
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Последнее редактирование: