Чи слід виявляти зіткнення на стороні сервера або спільно між клієнтом / сервером?


24

Я працюю над онлайн-грою, яка матиме дуже важку обробку виявлення зіткнень. Моделі гравців зіткнуться з іншими гравцями, мобами, структурами, місцевістю та твердими об'єктами, які існують лише на стороні сервера (не зберігаються у файлах даних клієнта).

З метою безпеки я повинен робити усі сервери виявлення зіткнень? Або я повинен змусити клієнта зробити виявлення і якось сервер слідкувати за ним якось? Я відчуваю, що сервер буде занадто багато зробити сам (я розробляю двигун для сотні гравців на одному сервері).

Хтось знає, як це роблять основні ММО? Я знаю, що майже всі ММО зараз чутливі до хакерів фізики і зазвичай мають справу з ними, виявляючи хаки та забороняючи людей. Я вважаю за краще, щоб хаки взагалі не спрацювали, принаймні для фізичної складової.

Відповіді:


21

Здається, очевидною відповіддю є більшість ваших клієнтів виявлення (для гладкості), а потім ви інтерполюєте те, що говорить сервер, якщо ваш клієнт занадто далеко. Сервер поставить галочку менш часто, ніж клієнт (наприклад, 10 Гц), і, ймовірно, потрібно мати базовий код "чи може цей гравець дістатися там, де він каже, що він перебуває з останнього відомого місця розташування", з чого випливає якесь рішення типу nav mesh та накладання маршруту.

Це може бути надмірно повільним, залежно від ваших потреб. Ви можете прийняти дизайнерське рішення, наприклад, не турбуватися про зіткнення гравця-гравця на сервері. Більшість ігор, наскільки я знаю, це навіть не цікавить клієнта. Це дійсно залежить від ваших потреб.

Але правилом є те, що ви ніколи не повинні довіряти клієнту. Якщо це впливає на геймплей, вам доведеться хоча б перевірити його на сервері.


24

Отже, тут кілька відповідей.

  • Зіткнення на стороні клієнта ідеально з точки зору виступу та з точки зору гравця. Ви не хочете, щоб зіткнення були млявими, ви хочете, щоб гравці врізалися в твердий предмет і зупинялися. Якщо ви робите це на стороні сервера, ви або дивитесь на гравців з гумовою стрічкою всюди, або даєте гравцям помітні відставання, коли вони намагаються рухатися. Погане моджо, в обох випадках.

  • Зіткнення на стороні сервера ідеально з точки зору безпеки. Чим ближче ваші клієнти доходять до "німих терміналів", тим менш вигідною буде ваша гра. Існує причина, що ніхто не грає на текстовому MUD не повинен турбуватися про wallhacks або speedhacks - це тому, що клієнт не робить нічого, що варто згадувати.

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

  • Що я рекомендую, це зробити це майже повністю на стороні клієнта. Клієнт авторитетно ставиться до своєї позиції, як і у повноцінної клієнтської системи, і робить всю власну обробку. На додаток до цього, ви випадковим чином сервер час від часу перевіряє різних гравців. Тримайте навантаження на сервер низькою, але це викличе шахраїв на диво швидко.

Крім того, зробіть це на стороні клієнта поки що, додайте перевірку на стороні сервера в якийсь момент в майбутньому, якщо ваша гра стане досить популярною, що люди її обманюють. Що, будьмо чесними, напевно, не буде, тому зараз немає сенсу витрачати на це кодер.


3

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

Уявіть, наскільки корисно це може бути в ситуаціях гравця проти гравця. Або як важко було б користуватися банком / аукціонним домом / поштовими скриньками, якщо інші (часто простоючі) гравці заблокували ваш рух!

Що стосується виявлення зіткнень на основі клієнта та сервера - дійсно, якщо рух не дуже повільний, він повинен бути в основному на стороні клієнта, тому він виглядає правильно кожному клієнту. Відставання / затримка реакції на зіткнення та / або зіткнення з «невидимими» об'єктами було б дуже неприємно.


1
Хоча питання не в тому, чи зіткнення гравця проти мобу / гравця - це поганий дизайн гри, я б запропонував переглянути такі ігри, як Darkfall Online, де все суцільно. Це додає геймплею новий вимір і дозволяє робити дуже цікаві речі з грою. Я б не переймався тим, що гравці блокують такі речі, як банки, в моїй грі, тому що завжди буде невеликий проміжок, через який гравці можуть побачити, щоб відкрити об'єкт.
BarakatX2

У вас можуть бути заблоковані гравці будь-чим, що може напасти, і все, що вони не можуть атакувати, вони можуть просто пройти. Наприклад, гравці не зможуть ходити по мобах, оскільки вони можуть атакувати мобів. Вони також не зможуть пройти через гравців, поки вони позначені для PVP, оскільки вони позначені PVP. Гравець, який не позначений PVP, може пройти через будь-якого гравця, навіть того, хто не зазнав ПВП, оскільки він не може атакувати цих гравців.
Азарал

2

Якщо ви стурбовані хаками, і це має великий вплив на гру, тоді відповідь ТАК.

У моїй браузерній грі, яка є "міською будівлею", гра мене не турбує про хаки, оскільки клієнтський движок не вийде з ладу, коли я розміщую збережений стан гри.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.