Skocz do zawartości
  • 0
V Fighter

Niezależny zegar gry

Pytanie

Witam. W wielu grach typu klikacze, jest coś takiego, że kiedy na przykład nie gramy, a wejdziemy do gry po jakimś czasie, gra daje nam jakiś bonus w zależności od tego, jak długo nas nie było. Z tym, że zwykłe zapisywanie daty przy wyjściu z gry i porównywanie zapisu z aktualną przy ponownym starcie jest nienajlepszym rozwiązaniem, bo gracz może wyjść z gry i zmienić datę w systemie, a gdy wejdzie, otrzyma bonus, na który powinien czekać. Mam nadzieję, że dobrze to opisałem. I pytanie brzmi, jak mogę tego dokonać?  Jak zabezpieczyć grę przed takimi oszustwami? Gra potrzebuje swojego niezależnego od systemu zegara. Dodam tak od razu, że gra jest offline. Dziękuję za przeczytanie i czekam niecierpliwie na pomoc kogoś doświadczonego

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

21 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Prędzej czy później będzie chciał z powrotem zmienić datę na rzeczywistą więc gra może cofnięcie czasu wykryć i ukarać gracza? O taki luźny pomysł

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Hmm. Pomysł niesamowicie prosty i całkiem dobry. Jednak to taka prowizorka trochę :/. Ale jak to robią gry tego typu. Już nieraz próbowałem to obejść na Androidzie. Wyłączałem grę, dla pewności Internet, Dane Komórkowe, Wi Fi... Zmieniałem godzinę o +1h, ale gdy odpaliłem grę, nic się w niej nie zmieniło. Nawet próbowałem z restartem telefonu, bo podejrzewałem, że gra utworzyła sobie jakiś mini serwer na telefonie, dzięki czemu serwer niezależnie liczy czas, a gra go sprawdza. Jednak taki serwer najwidoczniej jest jakoś dobrze ukryty przed zamykaniem procesów i nie mam pojęcia, bo to już kosmiczne domysły, ale musi działać nawet, jeśli telefon jest wyłączony. Wiele gier tak przetestowałem i wszystkie mają taki mechanizm, To trochę tak, jakby korzystały z wbudowanego zegara w urządzeniu. Tak samo, jak w PC na płycie głównej też jest zegar (taki mały srebrny walcowy element podobny do kondensatora prawdopodobnie), dzięki któremu jeśli mamy kompa bez neta, a go ponownie odpalimy, to godzina jest aktualizowana. Więc już nie wiem, aktualnie jestem głupi i prosiłbym, żeby mnie ktoś jakoś oświecił w tym temacie. I am Lord, masz dobry pomysł, ale to tymczasowa alternatywa dla tego, czego szukam. Na Marketplace'ie się tego nie znajdzie, na Google po angielsku się tego też nie znajdzie, nie wiem, jak oni to robią, a rozwiązanie jest pewnie banalnie proste...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

W takim Idle Kingdoms widzę że gra po prostu sprawdza czy skok czasowy nie był większy od całej doby. Jak był to prosi o połączenie się z internetem w celu synchronizacji.

 

X9Rstl9.png

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Ale jednak prosi o połączenie z netem. A jest też sporo takich gier offline. Na razie nie mogę przytoczyć przykładu, ale jak będę miał możliwość, to wrzucę tu kilka. A jak sprawa wyglądałaby, gdybym chciał pozyskać przez moją grę czas z jakiegoś serwera? Jakiegokolwiek nawet. Mógłbym zobaczyć jakiś prosty kod? Prawdę mówiąc zawsze odstraszało mnie programowanie gierek online, bo nigdy mi się to nie udawało

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dowiedziałem się dziś, że można w jakiś sposób pobrać znacznik czasowy GPS (Android), który jest zegarem niezależnym od ustawienia zegara systemowego. No ale co z tego, jak nie wiem, jak te dane pobrać. Chyba DLLkę będzie trzeba do tego zrobić, czy coś w ten deseń. Ale to tak, jak z Księżycem. Wiem, że można na nim wylądować, ale za cholerę nie wiem, jak wystartować xd.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Jeśli to gra na androida, to ja bym po prostu raz na sekundę zapisywał w pliku INI obecny czas, a potem jak odpalasz grę odczytywał ten czas, odejmował od obecnego i wykonał skrypt dodający zasoby na podstawie czasu np.:

GOLD = floor(sekundy/120); // 1 złoto co 2 sekundy
WOOD = floor(sekundy/240); // 1 drewno co 4 sekundy

Argument, że można zhackować jest słaby, bo nawet jakbyś przes sieć przesyłał czas, to można zhackować request np. przepuszczając go przez PC który udaje router (udostępnianie internetu).

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Wniosek jest taki, że jak ktoś będzie chciał zhackować, to i tak zhackuje.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

ja bym zapisał poza czasem, jego hash + jakaś sól :)

 

np. md5('tajne' + string(time));

 

a potem przy odczycie porównał, to dopiero dekompilacja źródła by pomogła obejść takie coś :) jak ktoś podmieni czas, to policzymy mu 0 sekund.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Threef:"Wystarczy zapytanie do serwera o czas."

^

Autor:"Dodam tak od razu, że gra jest offline."

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Jeśli pozyskanie czasu z serwera jest proste, to ja poproszę o jakiś kod, jak to pobrać. Bo z tym offline to chyba jest jakaś tajemnica ogromna, strzeżona jak granice "płaskiej Ziemi" według płaskoziemców xd. Serio, jak pobrać datę z serwera? Zawsze to komuś pomoże, kto tu zerknie. Takie alternatywne rozwiązanie problemu :).

 

gnysek, co to da? Przecież jeśli zdekodujesz zapisany czas na przykład przy ponownym odpaleniu gry, to jeśli będziesz chciał porównać czas, to tylko z systemowym. A systemowy jest modyfikowalny. Równie dobrze można ostatni czas zapisać po prostu w INI. Chyba, że nie zrozumiałem Twojej idei, bo w pracy przysypiam czytając to xd

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
14 godzin temu, Threef napisał:

Wystarczy zapytanie do serwera o czas.

Puszczasz request przez PC, ustawiasz przekierowanie domeny na 127.0.0.1 w pliku hosts, robisz skrypt php który zwraca inny czas - oszukane.

 

Tak samo jak przy zmianie zegara w telefonie.

 

A czas z serwera pobierasz tak, że robisz skrypt PHP który go zwraca - nie pamiętam czy GMS potrafi czytać czas unixowy, wtedy wystarczy "echo time();".

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
5 godzin temu, gnysek napisał:

Puszczasz request przez PC, ustawiasz przekierowanie domeny na 127.0.0.1 w pliku hosts, robisz skrypt php który zwraca inny czas - oszukane.

Chyba że pobierasz więcej danych niż sam unix time, albo jeszcze szyfrujesz jakimś banalnym sposobem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

A powie mi ktoś, jak to zrobić jak zielonemu? Bo z GM:S'em działam już sporo, ale nigdy nie udało mi się zrobić czegokolwiek online

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Możesz to zrobić na wiele sposóbów. Po swojemu to potrzebujesz server z PHP na którym wrzucisz plik czas.php a w nim to co podał gnysek. 

Później twoja gra odpytuje ten plik na twoim serwerze przy pomocy funkcji http_get().

 

Drugie rozwiązanie to odpytywanie jakiegoś publicznego API takie jak to http://api.geonames.org/timezoneJSON?formatted=true&lat=47.01&lng=10.2&username=demo&style=full

Zwraca ci ono informacje jako JSON. Możesz je odczytać przy pomocy funkcji json_encode() która zamienia te dane w ds_map który potem możesz odczytać. Wszystkie przykłady są w dokumentacji przy każdej z tych funkcji.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

json_decode() :P i opcja z tamtym API jest lepsza, poniewaz nie zamieniasz gotowej opony na drewniane kolo :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

ja bym zrobił tak, że w kodzie PHP dajesz:

<?php
$key = 'azs123123';
echo json_encode(array('time'=>time(), 'hash' => md5(time() . $key));

 

a po stronie GMa, jak odbierasz dane:

//result to ds_mapa już po json_decode

var time = result[? "time"];
var hash = result[? "hash"];
var key = "azs123123";
var check = md5( time + key); 

if (check == hash) {
 // czas z serwera jest niesfałszowany
}

 

Tak długo, jak ktoś nie znajdzie klucza w skompilowanej grze, tak długo system jest bezpieczny (bo hash z serwera będzie trudny do odczytania nawet z tablic tęczowych).

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Okej. Dopiero teraz mogę na poważnie zasiąść przed kompem, bo wolne. Wszystko obczaję i dam znać, jak bardzo głupi jestem w tym temacie za kilka dni xd, bo jeszcze kilka innych projektów robię

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×