Chociaż pierwszy komentarz podjąłem w wątpliwość sensu poniżenia części odbiorców bez widocznego zysku, nadal uważam to za interesujące pytanie z technicznego punktu widzenia.
Właśnie wpadłem na ten pomysł: to, co robią oszustowie, to znajdowanie wartości, które je zmieniają i zamrażają. Wyszukiwanie odbywałoby się wtedy tylko między śmiercią lub wydarzeniami, które zmieniły zdrowie gracza. Co więcej, oszust może dopracować wyszukiwanie, odfiltrowując to, co się zmieniło, kiedy „nie umierał”.
Co jeśli licznik „zdrowia” zmienia się cały czas? Ustaw wskaźnik i przenieś go do każdej klatki lub każdej klatki N, jeśli wydajność jest zbyt duża. Lub XOR to z losową wartością, która zmienia każdą ramkę (XORing ponownie w stosunku do tej samej wartości do deszyfrowania przed szyfrowaniem z nową losową wartością).
Jeśli masz inne dane w grze, które zmieniają się przez cały czas (w tym pozycje xiy postaci gracza lub licznik czasu), może to utrudnić ustalenie, które ze wszystkich zmieniających się danych to zdrowie. A zamrożenie całego stanu gry nie jest oszustem.
W celu dalszego wprowadzenia w błąd, możesz przechowywać zdrowie w zwykłej zmiennej tylko do zapisu, oznaczonej jako garnek miodu.
Edytuj :
Mimo to oszust może próbować ustalić, która ze zmiennych, która zmienia się przez cały czas, jest tą, która zamrozi próbę i błąd. Możliwym rozwiązaniem byłoby połączenie ze sobą zmiennych.
Przykład:
Zamiast przechowywać zdrowie (h) i pozycję (x), przechowujesz je w dwóch zmiennych a i b, z których możesz później pobrać wartości:
a = x+h; b = x-h
x = (a+b)/2; h = (a-b)/2
W ten sposób, jeśli oszust zamrozi tylko jedną z nich, a następnie poruszy postać, wpłynie to na pozycję i, w zależności od tego, która została zamrożona, h zostanie ujemne (natychmiastowa śmierć). Możesz przełączać się między powyższymi formułami i:
a = x-h; b = x+h
x = (a+b)/2; h = (b-a)/2
W kolejnych klatkach gwarantujesz, że w co najwyżej 2 klatkach po zamrożeniu jednej ze zmiennych zdrowie zmieni się na 0 w chwili zmiany x. Pamiętaj, że przechowujesz tylko aib. Połącz to z ciągłym XOR, jak wspomniano powyżej. Rezultatem jest zbiór zmiennych, które zmieniają każdą klatkę na pozornie losowe wartości, a zamrożenie dowolnej pojedynczej lub ich części powoduje jedynie niepożądane skutki uboczne w grze, a jednym z nich jest natychmiastowa śmierć.
Dlaczego miałbyś powstrzymywać graczy przed oszustwami (co oznacza oszustwo w grze dla jednego gracza)? W środowisku dla wielu graczy zadaniem serwera jest wykrycie nienaturalnych zmian i przeciwdziałanie im (zazwyczaj poprzez zignorowanie danych wejściowych lub całkowite zablokowanie winowajcy z serwera), ale w środowisku dla jednego gracza nic się nie dzieje poza oszustem niedźwiedzia przysługa.
IOW, chyba że tworzysz grę wieloosobową, to strata pieniędzy, a jeśli myślisz o utwardzeniu złego miejsca.
źródło
Zbadaj znane narzędzia do oszukiwania - i często sprawdzaj, czy którekolwiek z najczęstszych są wykrywane (sprawdź nazwy procesów?)
Jeśli jakieś zostaną wykryte, pozwól graczowi oszukiwać (jeśli jest offline, to nieszkodliwe), ale upewnij się, że żadne wyniki / osiągnięcia nie będą publikowane w żadnym internetowym systemie liderów / systemie osiągnięć - po prostu cicho zawieść?
Nie powstrzyma bardziej zdeterminowanych hakerów, ale zmniejszy ryzyko, że bardziej przypadkowe kody zepsują twoje tabele wyników.
(Może denerwować programistów, którzy mają otwarte i zminimalizowane narzędzia programistyczne do legalnych celów i robią sobie przerwę w grze ...)
źródło
Myślę, że najprostszym rozwiązaniem jest wdrożenie opcji oszukiwania. Wyłącz punktowanie, gdy masz opcję oszukiwania.
Kolejny dobry pomysł, że nie mam pojęcia, jak byś wdrożył. Czy wyłączyć grę, gdy jest zamrożona zmienna pamięci lub coś takiego :)
Powodzenia (Y)
źródło