Як правильно передбачити рух, коли гравець невидимий?


20

У мене є багатокористувацька гра і я роблю передбачення на стороні клієнта, але деякі гравці можуть випити зілля і стати невидимими ...

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

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

До речі, я вже вирішив регулярне передбачення руху, воно працює чудово.


4
Просто надішліть інформацію про всіх гравців. Шахраї обдурять. Не калічуйте досвід чесних гравців, а не думайте про створення системи позначок для шахраїв.
user1306322

2
@ user1306322 Полегшаючи шахраїв, ви також покалічите чесних гравців. Система позначення - хороша ідея, але якщо невидимість є великою частиною гри, щось превентивне може бути необхідним.
ThatOneGuy

@ user1895420, як правило, досить добре, щоб не надсилати такі речі в простому тексті, так що жоден середній гравець не може легко отримати ці дані. Якщо тільки людина, здатна на техніку, може це зробити, настільки ж хороший запобіжний захід, як і будь-який.
користувач1306322

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

Як щодо того, щоб просто надіслати позицію невидимого гравця (з прапором, щоб він / її було невидимим) лише тоді, коли видимий гравець поруч? Це повинно дати вам кілька кадрів, щоб уникнути проблеми надмірного руху, в той час як це не повинно давати шахраям достатньо часу для реакції. Для двох невидимих ​​гравців я просто ігнорував зіткнення. Якщо у вас є центральний сервер, який має всі позиції гравця, ви також можете його координувати, коли транслювати позицію, а коли ні.
jdm

Відповіді:


30

Це можна вважати проблемою анімації. Якщо виправлення позиції повертається з сервера через спробу переміщення у невидимий об’єкт, надішліть назад не лише виправлення, але прапор із зазначенням того, чому корекція потрібна. Замість того, щоб гравець вискакував назад, він може зробити "woah" вид анімації назад, роблячи це більш правдоподібно схожим на те, що він просто натрапив на щось.

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

Необхідність анімації може бути усунена, не дозволяючи невидим працювати на близькій відстані. Це ще більше стимулює невидимих ​​гравців уникати наближення до інших персонажів. Це загальний підхід для ігор на основі стелс і AI (замініть "невидимий" на "не видно цілі") і його можна побачити в PvP-іграх, таких як World of Tanks. Не потрібно турбуватися про реакцію на зіткнення з невидимими символами, якщо ви нічого невидимого ніколи не наблизите до вас (в межах затримки).

Рішення Дракора просто ігнорувати зіткнення з невидимими об’єктами - також хороше. Для цього знову потрібні анімації (для клієнта невидимих ​​гравців), тому об’єкти не просто пробиваються через аватар гравця на його екрані. Якщо нічого іншого, ви можете змусити видимі об’єкти завжди натискати невидимі, щоб невидимий програвач автоматично переміщувався з шляху на сервер, якщо хтось зіткнувся з ним.

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

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


5
У грі Team Fortress 2 використовується перший підхід ... Якщо невидимий шпигун торкається іншого гравця, інший гравець може побачити шпигуна (або, якщо ззаду, принаймні відчути якусь перешкоду).
Ксантікс

4

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


проблема з ігноруванням зіткнення для невидимих ​​гравців полягає в тому, якщо невидимий гравець перестає бути невидимим правильним, коли він стикається з кимось іншим. Крім того, це не вірно. У моїй грі у мене дійсно немає доріжок або проходження маршрутів, гравці можуть рухатись лише у 4-х напрямках, один крок за часом
affiszervmention

Потім залишається надіслати передбачуваний рух (або один вектор, або масив векторів) і здійснити перевірку на стороні сервера. Або просто оживити виправлення, як сказано нижче.
Даніель Рушняк

1
Якщо у вас є карта на основі сітки і будь-який раз перевіряєте кожен квадрат один за одним, ви також можете спробувати кодувати розташування невидимих ​​символів на стороні сервера за допомогою однобічного кодування, наприклад SHA-1 або SHA-2 , а потім перевірити власний шлях, кодуючи перевірені координати тим самим алгоритмом. Не можу сказати, що це ефективність, але якщо ви дійсно хочете зробити це на стороні клієнта, це рішення може працювати також з обмеженою кількістю позицій, а злом може бути справді клопітким через велику кількість точок сітки для кодування і збігаються з даними в пам'яті.
Даніель Рушняк

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

5
Ні, жодна схема, яку ви можете придумати, не була б "захищеною" від хакерів. Якщо клієнт може визначити, чи зіграє гравець проти заданої позиції, то хтось може зламати вашу гру. HMACing за допомогою обертового ключа не завадить клієнту робити 1500 HMAC в секунду. Ви НЕ намагатися зробити криптографію самостійно. Якщо ви хочете досягти початкової мети, надішліть клієнту лише невидиму позицію гравця, якщо вони знаходяться в межах 1 або 2 плиток гравця. Тоді ви можете лише зламати, щоб дізнатись, чи є хтось поруч з вами (що не корисно, тому що ви можете просто рухатися, щоб перевірити це).

2

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


Я думаю, це могло б працювати, але моя гра заснована на плитках (забула сказати).
affiszervmention

Тож виявляйте лише невидимих ​​гравців у сусідніх плитках, або за 2 кроки, або ще.
Р ..

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