Как правильно предсказать движение, когда игрок невидим?

20

У меня многопользовательская игра, и я делаю предсказания на стороне клиента, но некоторые игроки могут выпить зелье и стать невидимым ...

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

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

Кстати, я уже решил регулярное предсказание движения, оно работает отлично.

affiszervmention
источник
4
Просто отправьте информацию обо всех игроках. Мошенники будут обманывать. Не наносите вред честному опыту игроков и не думайте о создании системы пометок для читеров.
user1306322
2
@ user1306322 Облегчая мошенников, вы также наносите вред честным игрокам. Система пометок - это хорошая идея, но если невидимость является важной частью игры, может потребоваться что-то превентивное.
ThatOneGuy
@ user1895420 Обычно этого достаточно, чтобы не отправлять такие вещи в виде простого текста, так что ни один средний игрок не может легко получить эти данные. Если только технически подкованный человек может это сделать, то это такая же профилактическая мера, как и любая другая.
user1306322
1
Или, возможно, лучше немного изменить механику невидимости, чтобы она не работала в непосредственной близости, так что даже те, кто может обманывать свои данные в игре, не могут получить никакого преимущества.
user1306322
Как насчет того, чтобы просто отправить позицию невидимого игрока (с флажком, чтобы сделать его / ее невидимым) только тогда, когда видимый игрок находится рядом? Это должно дать вам пару кадров, чтобы избежать проблемы чрезмерного движения, в то время как мошенники не должны дать достаточно времени, чтобы среагировать. Для двух невидимых игроков я бы просто проигнорировал столкновение. Если у вас есть центральный сервер, который имеет все позиции игрока, вы также можете иметь координаты, когда транслировать позицию, а когда нет.
JDM

Ответы:

30

Это можно считать проблемой анимации. Если коррекция положения возвращается с сервера из-за попытки переместиться в невидимый объект, отправьте обратно не только исправление, но и флаг, указывающий, почему исправление было необходимо. Вместо того, чтобы игрок швырялся назад, он может делать «вау», покачивая анимацию назад, делая его более правдоподобным, как будто он просто наткнулся на что-то.

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

Анимацию нужно убрать, не позволяя невидимости работать с близкого расстояния. Это дает еще больший стимул невидимым игрокам избегать сближения с другими персонажами. Это обычный подход для стелс-игр и ИИ (замените «невидимый» на «невидимый для цели») и его можно увидеть в PvP-играх, таких как World of Tanks. Не нужно беспокоиться о реакции на столкновение с невидимыми символами, если у вас нет ничего невидимого, когда вы находитесь достаточно близко, чтобы столкнуться с ним (в пределах задержки).

Решение Дракора просто игнорировать столкновения с невидимыми объектами также является хорошим решением. Это снова требует некоторой анимации (для клиента невидимых игроков), поэтому объекты не просто просматривают аватар игрока на его экране. Если ничего другого, вы можете заставить видимые объекты всегда выдвигать невидимые, так что невидимый игрок автоматически удаляется с сервера, если кто-то сталкивается с ним.

Невидимые-невидимые столкновения немного сложнее. Может быть выгодно просто отключить коллизии на них, так как никто не может видеть, обрезаются ли два невидимых объекта (под «невидимым» мы подразумеваем, что оба объекта не видимы для одного и того же клиента). Если один из объектов становится видимым, он автоматически возвращается к реакции видимого-невидимого столкновения (отталкивает невидимый объект).

Все становится сложнее, если невидимость имеет сложные наборы того, кто кого может видеть. Первое или второе решение выше, вероятно, лучше всего здесь, если вам это нужно. Не каждая такая проблема нуждается в техническом решении; многим просто нужны дизайнерские решения (например, не позволяйте этой функции вашим дизайнерам).

Шон Миддледич
источник
5
Игра Team Fortress 2 использует этот первый подход ... Если невидимый шпион касается другого игрока, другой игрок может видеть шпиона (или, если сзади, хотя бы почувствовать какое-то препятствие).
Xantix,
4

Я действительно вижу здесь только два варианта, если вы не хотите сообщать клиенту, где находится невидимый игрок: 1) Вы игнорируете столкновение юнитов для невидимых игроков - простое решение, и игроки не смогут найти невидимых игроков, тесты на столкновение тоже. 2) После выбора прогнозируемого пути вы отправляете серверу прогнозируемый путь и исправляете сам путь на стороне сервера, а затем отправляете новый путь обратно.

Даниэль Русзнак
источник
проблема с игнорированием столкновения для невидимых игроков заключается в том, что невидимый игрок перестает быть невидимым, когда сталкивается с кем-то еще. Кроме того, это не правильно. В моей игре на самом деле нет путей или поиска путей, игроки могут двигаться только в 4 направлениях, по одному шагу за раз
affiszervmention
Затем остается отправить предсказанное движение (либо один вектор, либо массив векторов) и выполнить проверку на стороне сервера. Или просто оживите коррекцию, как сказано ниже.
Даниэль Русзнак
1
Если у вас есть карта на основе сетки и вы все равно проверяете каждый квадрат один за другим, вы также можете попытаться закодировать расположение невидимых символов на стороне сервера с помощью односторонней кодировки, такой как SHA-1 или SHA-2. , затем проверьте свой собственный путь, кодируя проверенные координаты с помощью того же алгоритма. Не могу сказать, что это эффективно с точки зрения производительности, но если вы действительно хотите сделать это на стороне клиента, это решение может также работать с ограниченным числом позиций, и взлом может быть действительно проблематичным из-за огромного количества точек сетки для кодирования и сопоставить с данными в памяти.
Даниэль Русзнак
Я вижу, что это работает. Моя самая маленькая карта имеет 1500 различных позиций. Должен ли я использовать HMAC с ключом, который меняется каждые несколько секунд, чтобы не дать злоумышленнику предварительно вычислить все позиции?
affiszervmention
5
Нет, любая схема, которую вы можете придумать, не будет "защищена" от хакеров. Если клиент может определить, столкнется ли игрок с данной позицией, тогда кто-то может взломать вашу игру. HMAC с вращающимся ключом не помешает клиенту выполнить 1500 HMAC в секунду. Вы не пытаться сделать криптографию самостоятельно. Если вы хотите достичь первоначальной цели, отправляйте клиенту невидимую позицию только в том случае, если они находятся в пределах 1 или 2 тайлов игрока. Тогда вы можете только узнать, находится ли кто-то рядом с вами (что бесполезно, потому что вы можете просто проверить это).
2

Если я что-то не так понимаю, решение простое. Не отправляйте клиенту информацию обо всех невидимых игроках, только о тех, кто находится в пределах досягаемости, чтобы они могли столкнуться в пределах движения в течение прогнозируемого интервала. Другими словами, если клиенту нужно только предсказать 200 мс в будущем, отправляйте информацию только о невидимых игроках в пределах max_player_velocity units/sec * 1/5 secотрядов.

Р..
источник
Я думаю, это может сработать, но моя игра основана на плитках (забыл сказать).
affiszervmention
Так что показывайте только невидимых игроков в соседних клетках, или в 2 шагах, или где-то еще.
R ..
тогда он не уверен, что они столкнутся, и невидимым игрокам придется держаться подальше от любого
взломщика,