Jak poprawnie przewidzieć ruch, gdy gracz jest niewidzialny?

20

Mam grę wieloosobową i przewiduję po stronie klienta, ale niektórzy gracze mogą wypić miksturę i stać się niewidzialnym ...

Problem polega na tym, że gdy stają się niewidzialni, nie udostępniam niczego, co klient mógłby wykorzystać, aby wiedzieć, że tam jest, więc kiedy gracz próbuje wejść na płytkę zajmowaną przez niewidzialnego gracza, przewiduje, że mu się to uda, a następnie dostaje brzydka korekta pozycji wysłana przez serwer.

Jednym z rozwiązań byłoby udostępnienie czegoś, aby klient mógł to powiedzieć, ale hakerzy mogliby to wykorzystać, aby dowiedzieć się, gdzie są niewidzialni gracze, oszukiwający.

Przy okazji rozwiązałem już przewidywanie ruchu, działa idealnie.

affiszervmention
źródło
4
Wystarczy wysłać informacje o wszystkich graczach. Oszuści będą oszukiwać. Nie rujnuj uczciwego doświadczenia graczy, zamiast tego pomyśl o stworzeniu systemu oznaczania oszustów.
user1306322
2
@ user1306322 Ułatwiając oszustom, okaleczysz również uczciwych graczy. System flagowania jest dobrym pomysłem, ale jeśli niewidzialność jest dużą częścią gry, coś zapobiegawczego może być konieczne.
ThatOneGuy
@ user1895420 zwykle wystarcza, aby nie wysyłać takich rzeczy zwykłym tekstem, aby żaden przeciętny gracz nie mógł łatwo uzyskać tych danych. Jeśli tylko osoba znająca się na technologii może to zrobić, jest to tak samo dobry środek zapobiegawczy, jak każdy inny.
user1306322
1
Być może lepiej jest nieco zmienić mechanikę niewidzialności, aby nie działała w bliskiej odległości, więc nawet ci, którzy potrafią oszukiwać dane w grze, nie mogą uzyskać żadnej przewagi.
user1306322
A może po prostu wyślesz pozycję niewidzialnego gracza (z flagą, aby był niewidoczny) tylko wtedy, gdy w pobliżu widoczny jest gracz? To powinno dać ci kilka klatek, aby uniknąć problemu z nadmiernym ruchem, a nie powinno dać oszustom wystarczająco dużo czasu na reakcję. W przypadku dwóch niewidzialnych graczy po prostu zignorowałbym kolizję. Jeśli masz centralny serwer, który ma wszystkie pozycje gracza, możesz także koordynować, kiedy nadawać pozycję, a kiedy nie.
jdm

Odpowiedzi:

30

Można to uznać za problem z animacją. Jeśli korekcja pozycji powraca z serwera z powodu próby przejścia do niewidocznego obiektu, odeślij nie tylko korektę, ale flagę wskazującą, dlaczego korekta była potrzebna. Zamiast rzucać gracza do tyłu, może wykonać „woah” animację cofania, dzięki czemu bardziej prawdopodobne jest, że po prostu wpadł na coś.

W grach korzystających z tego podejścia nierzadko zdarza się (przynajmniej chwilowo) niewidzialność wszystkiego, na co wpadł. Między innymi daje to zachętę niewidzialnym graczom do unikania tłumu lub zbliżania się do innych postaci, co zmniejsza częstotliwość zderzeń z niewidzialnym graczem. Zatem nawet jeśli twoja animacja dla tego rodzaju kolizji jest słaba (lub nie istnieje), jest ona nieco ukryta przez niewidzialną postać pojawiającą się w widoczności i wyraźnie telegrafującą do wszystkich, co się właśnie wydarzyło.

Potrzebę animacji można usunąć, nie pozwalając niewidzialności działać z bliskiej odległości. Daje to jeszcze większą motywację niewidzialnym graczom, aby uniknąć zbliżania się do innych postaci. Jest to powszechne podejście do gier opartych na ukryciu i sztucznej inteligencji (zamień „niewidoczny” na „niewidoczny dla celu”) i można je zobaczyć w grach PvP, takich jak World of Tanks. Nie musisz się martwić reakcją na kolizję z niewidzialnymi postaciami, jeśli nic niewidzialnego nigdy nie jest wystarczająco blisko, aby się zderzyć (w granicach opóźnień).

Dobrym rozwiązaniem jest również rozwiązanie Dracora polegające na ignorowaniu kolizji z niewidzialnymi obiektami. To znowu wymaga animacji (dla klienta niewidzialnego gracza), więc obiekty nie tylko przecinają awatar gracza na jego ekranie. Jeśli nic więcej nie możesz spowodować, że widoczne obiekty będą zawsze popychać niewidzialne, tak że niewidzialny gracz zostanie automatycznie odsunięty na serwer, jeśli ktoś z nim zderzy się.

Niewidzialne-niewidoczne kolizje są nieco trudniejsze. Korzystne może być wyłączenie na nich kolizji, ponieważ nikt nie może zobaczyć, czy dwa niewidzialne obiekty się ze sobą przycinają (zakładając, że „niewidoczny” oznacza, że ​​oba obiekty nie są widoczne dla tego samego klienta). Jeśli jeden z obiektów stanie się widoczny, automatycznie powraca do widocznej niewidzialnej reakcji na kolizję (odepchnij niewidzialny obiekt).

To wszystko staje się trudniejsze, jeśli niewidzialność ma skomplikowane zestawy osób, które mogą zobaczyć, kogo. Pierwsze lub drugie rozwiązanie powyżej jest prawdopodobnie najlepsze tutaj, jeśli jest potrzebne. Nie każdy taki problem wymaga rozwiązania technicznego; wiele tylko potrzebuje rozwiązań projektowych (np. nie zezwalaj na tę funkcję swoim projektantom).

Sean Middleditch
źródło
5
W grze Team Fortress 2 stosuje się to pierwsze podejście ... Jeśli niewidzialny szpieg dotknie innego gracza, inny gracz może go zobaczyć (lub jeśli z tyłu wyczuje jakąś przeszkodę).
Xantix,
4

Naprawdę widzę tutaj tylko dwie opcje, jeśli nie chcesz powiedzieć klientowi, gdzie jest niewidzialny gracz: 1) Ignorujesz kolizję jednostek dla niewidzialnych graczy - proste rozwiązanie, a gracze nie byliby w stanie znaleźć niewidzialnych graczy według testy zderzeniowe. 2) Po podjęciu decyzji o przewidywanej ścieżce, wyślesz serwerowi przewidywaną ścieżkę i poprawisz samą ścieżkę po stronie serwera, a następnie odeślesz nową ścieżkę z powrotem.

Daniel Rusznyak
źródło
Problem z ignorowaniem kolizji dla niewidzialnych graczy polega na tym, że niewidzialny gracz przestaje być niewidzialny, gdy zderza się z kimś innym. Ponadto nie wydaje się to właściwe. W mojej grze tak naprawdę nie mam ścieżek ani szukania ścieżek, gracze mogą poruszać się tylko w 4 kierunkach, krok po kroku
afiszervmention
Następnie pozostaje wysłać przewidywany ruch (pojedynczy wektor lub tablicę wektorów) i wykonać kontrolę po stronie serwera. Lub po prostu animuj poprawkę, jak powiedziano poniżej.
Daniel Rusznyak
1
Jeśli masz mapę opartą na siatce i i tak sprawdzasz każdy kwadrat jeden po drugim, możesz również spróbować zakodować położenie niewidzialnych znaków po stronie serwera za pomocą kodowania jednokierunkowego, takiego jak SHA-1 lub SHA-2 , a następnie sprawdź własną ścieżkę, kodując sprawdzone współrzędne za pomocą tego samego algorytmu. Nie można powiedzieć, że jest efektywny pod względem wydajności, ale jeśli naprawdę chcesz to zrobić po stronie klienta, to rozwiązanie może również działać z ograniczoną liczbą pozycji, a hakowanie może być naprawdę kłopotliwe z powodu dużej liczby punktów siatki do zakodowania i dopasuj do danych w pamięci.
Daniel Rusznyak
Widzę, że działa. Moja najmniejsza mapa ma 1500 różnych pozycji. Czy powinienem używać HMAC ze zmianą klucza co kilka sekund, aby uniemożliwić napastnikowi wstępne obliczenie wszystkich pozycji?
affiszervmention
5
Nie, każdy wymyślony przez Ciebie schemat nie byłby „bezpieczny” przed hakerami. Jeśli klient może ustalić, czy gracz zderzy się z daną pozycją, ktoś może zhakować twoją grę. HMACing z obrotowym kluczem nie uniemożliwi klientowi wykonania 1500 HMAC na sekundę. Czy nie próbować robić kryptografii siebie. Jeśli chcesz osiągnąć pierwotny cel, wyślij klientowi niewidzialną pozycję gracza, tylko jeśli znajduje się on w odległości 1 lub 2 płytek od gracza. Wtedy możesz tylko zhakować, aby dowiedzieć się, czy ktoś jest tuż obok ciebie (co nie jest przydatne, ponieważ możesz po prostu przejść, aby to sprawdzić).
2

O ile czegoś nie rozumiem, rozwiązanie jest proste. Nie wysyłaj informacji o kliencie na temat wszystkich niewidzialnych graczy, tylko tych, którzy znajdują się w zasięgu, że mogą być narażeni na kolizję w granicach ruchu podczas przewidywanego interwału. Innymi słowy, jeśli klient musi przewidywać tylko 200 ms w przyszłości, wysyłaj informacje tylko o niewidzialnych graczach w max_player_velocity units/sec * 1/5 secoddalonych od siebie jednostkach.

R ..
źródło
Myślę, że to może działać, ale moja gra jest oparta na kafelkach (zapomniałem powiedzieć).
affiszervmention
Dlatego odsłaniaj tylko niewidzialnych graczy na sąsiadujących kafelkach lub 2 kroki dalej, czy cokolwiek innego.
R ..
wtedy nie ma pewności, że się zderzą, a niewidzialni gracze będą musieli trzymać się z dala od każdego, kto
hakuje,