Mieliśmy ten problem z niektórymi CCG online, nad którymi pracowałem. Najlepsze rozwiązanie, jakie widziałem:
1) Gracze MUSZĄ łączyć się z serwerem, a nie bezpośrednio ze sobą, i NIGDY nie należy przekazywać adresów IP przeciwników w danych przesyłanych strumieniowo do graczy. Zapobiega to atakom typu „odmowa usługi”, w których gracz zmusza przeciwnika do wygrania.
2) Zerwane połączenie = przegrywasz, przeciwnik wygrywa. Musimy założyć, że jeśli upuściłeś, była to kropla, aby uniknąć pewnej straty.
3) Rozłącza próbę ponownego nawiązania połączenia przez pewien czas, aby niewielka czkawka nie zmusiła cię do utraty z własnej winy. Idealnie, czas jest wystarczająco długi, aby umożliwić komuś ponowne połączenie, jeśli przypadkowo kopnął kabel, ale wystarczająco krótki, aby przeciwnik nie był sfrustrowany i nie zasnął podczas oczekiwania. Wydaje mi się, że około 45 do 60 sekund było w porządku.
4) Pozwól graczom zgłosić przeciwników. Jest to konieczne, aby nikt nie znalazł irytującego sposobu obejścia Twojej polisy. Na przykład być może tak werbalnie obelżywy, że przeciwnik spada tylko po to, aby się stamtąd wydostać, lub ciągle się rozłącza i łączy ponownie, aby wydłużyć czas gry, lub stonewalling, aby uniknąć przegranej lub cokolwiek innego. Nie możesz zatrzymać WSZYSTKICH złych zachowań, ale możesz włączyć mechanizm zgłaszania tego w grze, a następnie pozwolić działowi obsługi klienta zająć się resztą.
Musiałem poradzić sobie z tym problemem raz w grze wyścigowej online, w której przegrani gracze często wyłączali konsole, aby uniknąć straty w swoich rekordach. Jednak sprawdza się bardzo dobrze w każdej sytuacji PvP.
Moje rozwiązanie wyglądało następująco:
Na początku meczu, gdy wszyscy gracze dołączą i rozpocznie się gra, obliczyć, jaki byłby wynik, gdyby nasz gracz przegrał mecz. W naszej grze wyścigowej „przegrany” oznacza „znalazł się na ostatnim miejscu”, a zwykły wynik to „minus N punktów w rankingu graczy”.
Zapisz wynik w bezpiecznej lokalizacji (Savegame, liderów, obszar danych online itp.).
Wraz z wynikiem przechowuj flagę „GameStarted”. To tylko oznacza, że gra się rozpoczęła. Będziemy go później potrzebować.
Po zakończeniu gry oblicz rzeczywisty wynik i zastosuj go do wyników / statystyk graczy. Odznacz flagę „GameStarted”. Jest to normalny proces ukończenia gry.
Jeśli jednak gracz rozłączy się, odłączy kabel lub wyłączy zasilanie, ostatecznie wróci do menu gier. W kodzie menu sprawdzamy flagę „GameStarted”. Jeśli jest ustawiony, jesteśmy pewni, że wcześniej wykryliśmy rozłączenie w grze. Następnie możemy zastosować zapisany wynik do wyników / statystyk graczy. Będzie tak samo, jakby gracz przegrał grę. Dobrze jest też ustawić alert informujący gracza o tym, co się dzieje. Następnie, gdy zobaczy, że istnieją konsekwencje odłączenia w trakcie gry, zobaczysz, że zachowanie zaczyna się zmieniać.
źródło
Myślę, że jedynym sposobem, aby tego dokonać, jest struktura twojej gry. Istnieją dwa sposoby, dzięki którym oszukiwanie jest mniej pożądane: kara lub nagroda. Więc jeśli nie chcesz kary negatywnej, pomyśl o sposobach nagradzania gracza, który nie upuścił.
Zamiast nagrody z PvP, która jest łupem zdobytego ciała (co sprawia, że upuszczenie jest bardzo złą rzeczą), wygrana daje nagrodę, taką jak exp., Złoto lub coś zupełnie innego (Punkty? Ranking?). Jeśli jeden z graczy zostanie wyrzucony, pozostały gracz otrzymuje nagrodę, a gracz, który został wyrzucony, nie otrzymuje nic, ale nic nie traci. Chyba że jest to system rankingowy, w którym to przypadku gracz opuszczający może stracić część punktów rankingowych.
źródło
Lineage II robi to tak:
Osobiście zrobiłbym to podobnie, pozwalając tylko graczom wstępnie zdefiniować działania, które ich postać podejmuje w momencie rozłączenia (zostań i walcz, biegnij do najbliższej bezpiecznej strefy unikając agro, używaj zwykłego zwoju ucieczki, używaj błogosławionego zwoju ucieczka, ...) i niech postacie pozostaną w świecie gry, nawet jeśli gracz nie jest zalogowany.
źródło
Ten, który się rozłączył, umrze, gdy dostanie wystarczająco noża, a drugi zostanie uznany za zabicie. Coś bardziej łagodnego zostanie wykorzystane.
Ogólnie rzecz biorąc, Twoje ciało opuszcza świat od 1 do 5 minut.
źródło
Nie ma sposobu, aby ustalić, co spowodowało rozłączenie (czy nastąpiło wyłączenie zasilania? Czy wściekłość rzuciłem moją maszynę o ścianę?), Więc możesz jedynie założyć, że użytkownik próbuje (lub spróbuje) oszukać i narazić ich na niebezpieczeństwo przez X minut.
źródło
Sposób obsługi tego przez EVE Online jest następujący:
Statek zaczyna atakować warp 15 sekund po rozłączeniu. Jeśli jest zakodowana, statek nie wypaczy się. (Statek twojej postaci zacznie „uciekać” po 15 sekundach, chyba że zostanie „uwięziony” przez innego gracza)
Timer PVP (czas, po którym gracz „ucieka” podczas walki PvP) jest ustawiony na 3 minuty. (Ma to na celu przeciwdziałanie wielu innym licznikom).
Timer NPC pozostaje na 1 minucie, ale statek wypacza się po 15 sekundach, chyba że NPC zostanie zakodowany.
Gdy statek jest zablokowany przez gracza, powinien przełączyć się na licznik czasu PvP (aby go skontrować za pomocą 1-minutowego timera, jeśli rozłączy się w okolicznościach, w których nie można go celować, dopóki zegar nie zostanie ustawiony).
źródło
Jeśli masz sposób na modelowanie zwyczajnych schematów graczy w bitwie, możesz wysłać ich do trybu AI, aż ponownie się połączą lub bitwa się zakończy, w zależności od tego, co nastąpi wcześniej. Ale nie przyznawaj im żadnych nagród (exp, przedmiotów itp.) Za bitwę, chyba że powrócą w X czasie.
źródło
Zaimplementowałbym jakąś histerezę. Możesz użyć marchewki i kija. Ale wybór, który użyć, może być oparty na historii (możesz również dokonać analizy ich połączenia i bieżącej „zdolności wygranej” i użyć tego). Mam nadzieję, że tak zrobisz to osobiście. Prosty model:
Możesz to nadużyć tak. Ale zrobienie tego może wymagać więcej wysiłku niż tylko ugryzienie kuli. (Jeśli zajęło to 2 DC, aby na przykład być złym, możesz technicznie pozbyć się połowy swoich strat. Ale to zmniejsza pewne nadużycia, a w przypadku mniej niż sprytnych graczy wszystkie nadużycia).
Użycie tego oznacza, że tablice wyników nie sumują się do 100%. Ponieważ możesz DC, gdy jesteś dobry i nie nagrywać straty. Ale drugi dobry gracz może zanotować zwycięstwo. Również nie sumowanie do 100% oznacza, że 2 graczy może współpracować, wyłączając odtwarzacz DC, aby wygrać stos.
Więc nie był niezawodny, ale dodana Bayesowska analiza połączenia gamestate + mogła prawdopodobnie wykryć funkcjonalność i uczynić ten schemat kuloodpornym. (Możesz pokonać analizę bayesowską, ale ludzie nie są w tym dobrzy, a matematyka jest dla większości ludzi poza zasięgiem, nie wspominając już o inwestowaniu czasu w „przygotowanie” walki, aby przetrwać z DC w porządku).
źródło