Должно ли обнаружение столкновений выполняться на стороне сервера или совместно между клиентом и сервером?

24

Я работаю над онлайн-игрой, которая будет очень тяжело обрабатывать обнаружение столкновений. Модели игроков будут сталкиваться с другими игроками, мобами, структурами, ландшафтом и твердыми объектами, которые существуют только на стороне сервера (не хранятся в файлах данных клиента).

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

Кто-нибудь знает, как это делают обычные ММО? Я знаю, что почти все ММО сейчас чувствительны к взломам физики и обычно борются с ними, выявляя хаки и забанивая людей. Я бы предпочел, чтобы хаки не работали вообще, по крайней мере, для компонента физики.

BarakatX2
источник

Ответы:

21

Кажется, что очевидным ответом является выполнение большей части вашего обнаружения на стороне клиента (для плавности), а затем вы интерполируете то, что говорит сервер, если ваш клиент слишком далеко. Сервер будет тикать с меньшей частотой, чем клиент (например, 10 Гц), и, возможно, ему понадобится базовый код «может ли этот игрок достичь того места, где, по его словам, он находится из своего последнего известного местоположения», что подразумевает какое-то решение типа сетки нав и поиск пути.

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

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

тетрада
источник
24

Итак, несколько ответов здесь.

  • Столкновение на стороне клиента идеально с точки зрения производительности и ощущения игрока. Вы не хотите, чтобы столкновение было медленным, вы хотите, чтобы игроки столкнулись с твердым объектом и остановились. Если вы делаете это на стороне сервера, вы либо смотрите на игроков с резиновой лентой повсюду, либо даете игрокам заметную задержку, когда они пытаются двигаться. Плохое моджо, в обоих случаях.

  • Столкновение на стороне сервера идеально с точки зрения безопасности. Чем ближе ваши клиенты к «тупым терминалам», тем меньше ваша игра. Есть причина, по которой никто не играет в текстовую MUD, не должен беспокоиться о взломах стен или спидхаках - это потому, что клиент не делает ничего заслуживающего упоминания.

  • Выполнение обоих «идеально» почти во всех случаях. Пусть клиенты делают свое дело, затем дважды проверьте сервер, чтобы убедиться, что люди не обманывают. Недостатками являются сложность синхронизации (что именно делать вы , если два не согласны), а само использование процессора сервера.

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

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

ZorbaTHut
источник
3

World of Warcraft не обнаруживает столкновения между игроками / мобами. Это решение может иметь или не иметь технические причины, но на самом деле это должно быть скорее решением по дизайну игры, чем техническим решением:

Представьте, как это может быть использовано в ситуациях «игрок против игрока». Или как трудно было бы использовать банк / аукционный дом / почтовые ящики, если другие (часто бездействующие) игроки блокировали ваше движение!

Что касается обнаружения столкновений между клиентом и сервером - на самом деле, если движение не очень медленное, оно должно быть в первую очередь на стороне клиента, поэтому оно выглядит правильным для каждого клиента. Замедленная реакция с задержкой столкновения и / или столкновение с «невидимыми» объектами было бы довольно неприятно.

bluescrn
источник
1
Хотя вопрос не в том, является ли столкновение игрока с мобом или игроком плохим игровым дизайном, я бы посоветовал взглянуть на такие игры, как Darkfall Online, где все прочно. Это добавляет новое измерение в игровой процесс и позволяет вам делать очень интересные вещи с игрой. Я бы не стал беспокоиться о том, что игроки блокируют такие вещи, как банки, в моей игре, потому что всегда будет небольшой промежуток, через который игроки могут видеть, чтобы открыть объект.
BarakatX2
Вы можете сделать так, чтобы игроки были заблокированы всем, на что он мог атаковать, и всем, на что они не могли атаковать, они могли просто пройти. Например, игроки не смогут ходить через мобов, так как они могут атаковать мобов. Они также не смогут проходить через игроков, пока они помечены для PVP, поскольку они помечены как PVP. Игрок, который не помечен как PVP, может пройти через любого игрока, даже если он не помечен как PVP, потому что он не может атаковать этих игроков.
Азарал
2

Если вы беспокоитесь о взломах, и это имеет большое влияние на ход игры, тогда ответ - ДА.

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

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

Noob Game Developer
источник