Перейти к публикации

это невыносимо


Рекомендованные сообщения

41 минуту назад, Aheotes сказал:

ну... мне сложно об этом говорить, но у тебя есть инструменты . . . да . . . поверь в это . . . 

так мне даже голову никак не опустить -.-

Изменено пользователем delusione
Ссылка на комментарий
  • 2 недели спустя...
10 минут назад, xtrafrancyz сказал:

Баг исправлен.

Он не связан с нашими оптимизациями и существовал еще с самых первых версий Minecraft.

Ниже написано описание причины бага для умных.

Клиент имеет особенность "тонуть" в пустоте, пока чанк не прогрузился и потихоньку опускается вниз. Когда чанк наконец прогружается, то может быть два исхода:
- Чанк загрузился до того как игрок провалился под блок
- Игрок успел провалиться в блок на всего 0.0625
- Игрок провалился еще глубже в блок

В первом случае все нормально, игрок просто приземляется на блок. В последнем случае игрока выталкивает на поверхность и все тоже нормально.

И наконец во втором случае происходит магия. Есть 2 стороны (клиент и сервер) и каждая из них воспринимает эту ситуацию по-своему.

Сервер при каждом перемещении игрока проверяет где тот находился в прошлой точке (в блоке или нет), затем проверяет находится ли новая точка внутри блока. Если игрок был не в блоке и перемещается в точку без блока - то это самое обычное движение, сервер принимает это.
Когда же игрок в прошлой точке находился не в блоке, а на месте новой точке уже находится блок - то сервер не принимает это перемещение и телепортирует игрока обратно, чтобы тот не мог зайти внутрь стены или перемещаться сквозь пол/потолок. Это и есть причина дергания, сервер не позволяет провалиться внутрь блока и возвращает игрока обратно.

Клиент в свою очередь правильно думает что находится уже внутри блока и, следовательно, ничего не мешает ему падать вниз до следующего блока (думаю у вас были ситуации когда вы ходили внутри блока, например при использовании ендер перла). В итоге клиент постоянно падает вниз и сервер постоянно возвращает игрока обратно.

И тут возникает вопрос - А почему сервер думает что игрок находится не в блоке, когда он провалился туда на 0.0625?
Дело в том, что при проверке пересечения хитбокса игрока с блоками, сервер уменьшает хитбокс игрока как раз на 0.0625. Скорее всего, это делается чтобы избавиться от ошибок связанных с погрешностью в вычислениях координат, но это совсем другая тема.

Предположим, координата Y игрока 51.99, это значит что игрок провалился внутрь блока на 0.01. С точки зрения сервера игрок не находится в блоке, так как 51.99+0.0625=52.0525 (хитбокс сжимается к центру, поэтому тут сложение), а на Y=52 уже нет никаких блоков. С точки зрения клиента игрок уже внутри блока и поэтому он его игнорирует и падает. Вот и получается вечное недопонимание сервера с клиентом.

давай теперь также с багом блокхита на дуэлях

Изменено пользователем Jaddie
Ссылка на комментарий
2 часа назад, xtrafrancyz сказал:

Баг исправлен.

Он не связан с нашими оптимизациями и существовал еще с самых первых версий Minecraft.

Ниже написано описание причины бага для умных.

Клиент имеет особенность "тонуть" в пустоте, пока чанк не прогрузился и потихоньку опускается вниз. Когда чанк наконец прогружается, то может быть два исхода:
- Чанк загрузился до того как игрок провалился под блок
- Игрок успел провалиться в блок на всего 0.0625
- Игрок провалился еще глубже в блок

В первом случае все нормально, игрок просто приземляется на блок. В последнем случае игрока выталкивает на поверхность и все тоже нормально.

И наконец во втором случае происходит магия. Есть 2 стороны (клиент и сервер) и каждая из них воспринимает эту ситуацию по-своему.

Сервер при каждом перемещении игрока проверяет где тот находился в прошлой точке (в блоке или нет), затем проверяет находится ли новая точка внутри блока. Если игрок был не в блоке и перемещается в точку без блока - то это самое обычное движение, сервер принимает это.
Когда же игрок в прошлой точке находился не в блоке, а на месте новой точке уже находится блок - то сервер не принимает это перемещение и телепортирует игрока обратно, чтобы тот не мог зайти внутрь стены или перемещаться сквозь пол/потолок. Это и есть причина дергания, сервер не позволяет провалиться внутрь блока и возвращает игрока обратно.

Клиент в свою очередь правильно думает что находится уже внутри блока и, следовательно, ничего не мешает ему падать вниз до следующего блока (думаю у вас были ситуации когда вы ходили внутри блока, например при использовании ендер перла). В итоге клиент постоянно падает вниз и сервер постоянно возвращает игрока обратно.

И тут возникает вопрос - А почему сервер думает что игрок находится не в блоке, когда он провалился туда на 0.0625?
Дело в том, что при проверке пересечения хитбокса игрока с блоками, сервер уменьшает хитбокс игрока как раз на 0.0625. Скорее всего, это делается чтобы избавиться от ошибок связанных с погрешностью в вычислениях координат, но это совсем другая тема.

Предположим, координата Y игрока 51.99, это значит что игрок провалился внутрь блока на 0.01. С точки зрения сервера игрок не находится в блоке, так как 51.99+0.0625=52.0525 (хитбокс сжимается к центру, поэтому тут сложение), а на Y=52 уже нет никаких блоков. С точки зрения клиента игрок уже внутри блока и поэтому он его игнорирует и падает. Вот и получается вечное недопонимание сервера с клиентом.

ура молодец

Ссылка на комментарий
8 часов назад, xtrafrancyz сказал:

Баг исправлен.

Он не связан с нашими оптимизациями и существовал еще с самых первых версий Minecraft.

Ниже написано описание причины бага для умных.

Клиент имеет особенность "тонуть" в пустоте, пока чанк не прогрузился и потихоньку опускается вниз. Когда чанк наконец прогружается, то может быть два исхода:
- Чанк загрузился до того как игрок провалился под блок
- Игрок успел провалиться в блок на всего 0.0625
- Игрок провалился еще глубже в блок

В первом случае все нормально, игрок просто приземляется на блок. В последнем случае игрока выталкивает на поверхность и все тоже нормально.

И наконец во втором случае происходит магия. Есть 2 стороны (клиент и сервер) и каждая из них воспринимает эту ситуацию по-своему.

Сервер при каждом перемещении игрока проверяет где тот находился в прошлой точке (в блоке или нет), затем проверяет находится ли новая точка внутри блока. Если игрок был не в блоке и перемещается в точку без блока - то это самое обычное движение, сервер принимает это.
Когда же игрок в прошлой точке находился не в блоке, а на месте новой точке уже находится блок - то сервер не принимает это перемещение и телепортирует игрока обратно, чтобы тот не мог зайти внутрь стены или перемещаться сквозь пол/потолок. Это и есть причина дергания, сервер не позволяет провалиться внутрь блока и возвращает игрока обратно.

Клиент в свою очередь правильно думает что находится уже внутри блока и, следовательно, ничего не мешает ему падать вниз до следующего блока (думаю у вас были ситуации когда вы ходили внутри блока, например при использовании ендер перла). В итоге клиент постоянно падает вниз и сервер постоянно возвращает игрока обратно.

И тут возникает вопрос - А почему сервер думает что игрок находится не в блоке, когда он провалился туда на 0.0625?
Дело в том, что при проверке пересечения хитбокса игрока с блоками, сервер уменьшает хитбокс игрока как раз на 0.0625. Скорее всего, это делается чтобы избавиться от ошибок связанных с погрешностью в вычислениях координат, но это совсем другая тема.

Предположим, координата Y игрока 51.99, это значит что игрок провалился внутрь блока на 0.01. С точки зрения сервера игрок не находится в блоке, так как 51.99+0.0625=52.0525 (хитбокс сжимается к центру, поэтому тут сложение), а на Y=52 уже нет никаких блоков. С точки зрения клиента игрок уже внутри блока и поэтому он его игнорирует и падает. Вот и получается вечное недопонимание сервера с клиентом.

вау

Ссылка на комментарий

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Сейчас на странице   1 пользователь

×
×
  • Создать...