Skocz do zawartości
The_Crew

Łączny czas gry

Rekomendowane odpowiedzi

@UP
Nie, korzystając z funkcji gettime, która zwraca czas wyrażony w sekundach od 01-01-1970.

 

W OnPlayerConnect:

SetPVarInt(playerid, "timetick", gettime());

W OnPlayerDisconnect:

new timetick= GetPVarInt(playerid, "timetick");
new online= gettime()-timetick; // czas online, który trzeba doliczyć do tego zapisanego w bazie danych

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

@UP

Nie, korzystając z funkcji gettime, która zwraca czas wyrażony w sekundach od 01-01-1970.

 

W OnPlayerConnect:

SetPVarInt(playerid, "timetick", gettime());

W OnPlayerDisconnect:

new timetick= GetPVarInt(playerid, "timetick");
new online= gettime()-timetick; // czas online, który trzeba doliczyć do tego zapisanego w bazie danych

 

 

Jeszcze jedno pytanie. Przykładowo przy wczytywaniu tego z bazy dam taki kod:

sscanf(data, "p<|>X", PlayerData[playerid][pOnline])

i co mam wstawić w miejsce X jeśli wyprałem typ TIME w bazie?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to zależy czy przekształciłeś go na H:M:S (godziny, minuty, sekundy) czy zostawiłeś go w sekundach tak jak dostałeś kod od PrzMas'a, jeśli to sekundy to d czyli zwykły int, a jeśli to przekształciłeś na czas to wtedy mozesz albo 3 pola zrobic, godziny, minuty i sekundy, ale zapisywać to jako string czyli s

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam.

Mam do was pytanie w jaki sposób ( najoptymalniej ) można sprawdzić łączny czas gry na serwerze, aby potem zapisać go do bazy MySql.

Możesz skorzystać z funkcji NetStats_GetConnectedTime, unikniesz wtedy dodatkowego kodu w OnPlayerConnect i nie będziesz musiał bawić się PVar'ami czy innymi zmiennymi. Tylko pamiętaj, że ta funkcja zwraca czas w milisekundach, więc jeśli nie chcesz być aż tak dokładny warto podzielić tą wartość przez 1000. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@AxL_

Milisekundy mogą być problematyczne w użyciu z uwagi na możliwość przekroczenia zakresu signed integer i w wyniku dokonywania niezbędnych operacji arytmetycznych byłaby zwracana ujemna wartość.

 

@The_Crew
Ja bym ten czas przechowywał w bazie w postaci zwykłej liczby całkowitej (INT), najlepiej z flagą SIGNED (wartości nieujemne).

OnPlayerConnect(playerid)
{
  SetPVarInt(playerid, "timetick", gettime());

  return 1;
}
OnPlayerDisconnect(playerid, reason)
{
  // wczytanie całkowitego czasu online z bazy do zmiennej 'PlayerData[playerid][pOnline]'
  new online= gettime() - GetPVarInt(playerid, "timetick"); // wyliczenie czasu online na czas danej wizyty na serwerze
  PlayerData[playerid][pOnline] += online; // inkrementacja
  // zapis całkowitego czasu online ze zmiennej 'PlayerData[playerid][pOnline]' do bazy danych

  (...)
}

Czyli schematycznie to [powyższe] będzie w następującej kolejności:

  1. baza danych --> zmienna
  2. zmienna + czas wizyty
  3. zmienna --> baza danych

Można to też zrealizować bez udziału zmiennej jedynie odpowiednie podstawienie w kwerendzie, chyba że ta zmienna jest potrzebna, no to można ją w taki właśnie sposób wykorzystać.

 

Przeliczenie liczby sekund online na sekundy, minuty, godziny, dni, tygodnie, miesiące... nie powinno być chyba problemem.

Mam na myśli przeliczenie w celu przedstawienia odbiorcy (człowiekowi) czytelnej informacji, zamiast surowej liczby sekund, jeśli zajdzie taka potrzeba.

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@AxL_

Milisekundy mogą być problematyczne w użyciu z uwagi na możliwość przekroczenia zakresu signed integer i w wyniku dokonywania niezbędnych operacji arytmetycznych byłaby zwracana ujemna wartość.

Dlatego napisałem o dzieleniu przez 1000. Wtedy otrzymujesz czas w sekundach, czyli dokładnie to samo jak przy użyciu 'gettime'. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@AxL_

7FFFFFFF (hex) + 00000001 (hex) = 80000000 (hex)

signed integer:

00000000 (hex) = 0 (dec)
7FFFFFFF (hex) = 2147483647 (dec)

80000000 (hex) = -2147483648 (dec)
FFFFFFFF (hex) = -1 (dec)

unsigned integer:

00000000 (hex) = 0 (dec)
7FFFFFFF (hex) = 2147483647 (dec)

80000000 (hex) = 2147483648 (dec)
FFFFFFFF (hex) = 4294967295 (dec)
2147483647 (dec) ms = 24d, 20g, 31m, 23s, 647ms

Jeżeli ktoś przekroczy swój nieprzerwany pobyt na serwerze, wynoszący tyle co powyżej, choćby o 1ms to pojawi się problem, wynikający z podziału liczb całkowitych na ujemne i nieujemne oraz związanych z nim ograniczeń programistycznych/sprzętowych, więc teoretycznie unixtime (gettime) jest lepszym rozwiązaniem :P

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Należy jednak wziąć pod uwagę, że ten czas gracza w milisekundach może być od czegoś odliczany, najprawdopodobniej od tej wartości, którą zwraca funkcja GetTickCount (czas od uruchomienia serwera w milisekundach).

Tak więc po 24d, 20g, 31m, 23s, 647ms (tj 2.147.483.647 ms) od uruchomienia serwera funkcja NetStats_GetConnectedTime również może zwracać ujemne wartości.

 

Jeśli ktoś ma wątpliwości to musi zapytać Kalcora jak to z tym jest, ale (jak na razie) na pewno wątpliwości nie budzi funkcja gettime :P

Można też sprawdzić jak wyglądają wyniki obu tych funkcji po 24 dniach nieprzerwanej pracy serwera.

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie no, jak to napisał Michalec, a Ty sam policzyłeś, kto będzie siedział na serwerze 24 DNI? Czas w funkcji 'NetStats_GetConnectedTime' jest odliczany od momentu połączenia się gracza z serwerem i za każdym razem jest resetowany. Nie ma najmniejszego znaczenia ile czasu działa serwer. 'NetStats_GetConnectedTime' i 'GetTickCount' to dwie zupełnie różne, niezależne od siebie funkcje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

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

×