Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
[ROZWIĄZANE] Operacje na graczu co pare godzin
#1
Napisano 26.02.2012 19:39
Chcę wykonywać jakąś tam akcję na graczu co kilka godzin przegranych przez niego na serwerze.
Wiem, że jest funkcja get_user_time, ale nie za bardzo wiem jak optymalnie sprawdzać czy gracz gra już określoną ilość czasu.
Mógłby mi ktoś podpowiedzieć jak to najlepiej zrobić? Wydaję mi się, że task powtarzany co 1 sekundę to raczej słaby pomysł...
#3
Napisano 26.02.2012 20:11
zmienna new Czas_Gracza[33] Potem zapis do nvault/sql ( polecam sql ), i potem ten czas będzie w sekundach. W funkcji np.spawn'u będziesz musiał go podzielić new godziny Czas_Gracza[id] / 60*60 W tym przypadku możesz zrobić tak new godziny = getPlayedTime(id) / 60*60Jakby coś to pytaj
getPlayedTime(id) { return Czas_Gracza[id] + get_user_time(id, 1); }
Użytkownik speedkill edytował ten post 26.02.2012 20:12
If you can dream it, you can do it.
#4
Napisano 26.02.2012 22:00
Załóżmy, że przy spawnie mam przegrane 230 minut.
dzielę: getPlayedTime(id)(230*60) / (60*60) = 3,8(3)
A więc, jeszcze nie grałem 4 godzin na serwerze.
Mineło trochę czasu.
Przy kolejnym spawnie mam już 241 minut, czyli (241*60) / 3600 = 4,01(6), więc teraz powinienem wykonać na graczu jakąś tam operację.
Tylko, że przy kolejnym spawnie też ona sie wykona, a ja chcę wykonywać ją CO 4 godziny, a nie PO 4 godzinach
Gdyby nie fakt, że gracz przy spawnie może mieć przegrane np. 241 minut (a nie 240) to bym zrobił to w taki sposób:
if(play_time[id]/60) % 240 == 0) { cośtam } // play_time[id] to czas gry w sekundach od 1. połącznia z serwerem (zapisywane na nvalut)
#5
Napisano 27.02.2012 15:19
Teraz w spawnie zrobisz if(play_time[id]/60*60 >=4 && play_time[id]/60*60 < 5)
Możesz sprawdzić tak, ale nie jestem pewny.
Możesz tez Podzielić go tak żeby otrzymać godziny i minuty, teraz przy spawnie sprawdzaj czy jest = 4 && miunty[id] < 30)
If you can dream it, you can do it.
#6
Napisano 27.02.2012 15:35
#7
Napisano 27.02.2012 15:43
#8
Napisano 27.02.2012 15:49
#9
Napisano 27.02.2012 15:59
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#10
Napisano 27.02.2012 16:08
if(play_time[id]/(60*60) > 0 && play_time[id]/(60*60) % 4 == 0)
#11
Napisano 27.02.2012 16:19
pozatym nakupenda twoj sposób o ile podalbys poprawny kod dzialalby tylko gdy gracz respil by się w dokladnej sekundzie minięcia tych 4h a tu nie o to chodzi
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#12
Napisano 27.02.2012 16:58
tak ale zle go uzyles
hmm, a zakładając że by się respił dokładnie w tej sekundzie, jak powinien wyglądać mój kod poprawiony?
Użytkownik Nakupenda. edytował ten post 27.02.2012 16:59
#13
Napisano 27.02.2012 17:11
#14
Napisano 27.02.2012 17:26
play_time[id]%3600to zwróci liczbe sekund ktora zostanie po odjęciu od calkowitego wyniku wszystkich pelnych godzin
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
#15
Napisano 27.02.2012 17:54
#16
Napisano 27.02.2012 20:45
new ilosc[33], stara_ilosc[33]
public client_connect(id)
{
stara_ilosc[id] = floatround(play_time[id]/(4 * 60 * 60), floatround_floor)
}
public Nowa_Runda()
{
for(new id = 0; id<32; id++)
{
ilosc[id] = floatround(play_time[id]/(4 * 60 * 60), floatround_floor)
if(stara_ilosc[id] != ilosc[id])
{
stara_ilosc[id]++
jakas_funkcja(id)
}
}
}
Użytkownik Nakupenda. edytował ten post 27.02.2012 20:46
#17
Napisano 27.02.2012 21:05
Więc funkcja wykona się, gdy wejdę na serwer np. z czasem 4:14, ale też i 4:26 - nie wykona się tylko raz ;F
Choć teraz tak sobie myślę, że może oprócz całkowitego czasu gry zapisywać sobie jeszcze jakąś zmienną Bool? Tylko jeszcze myszę wymyślić co ona mi da ;D
#18
Napisano 27.02.2012 22:13
co event dodajesz do zmiennej++
i porostu czas wymagany potem mnożysz poprzez nr eventu
#19
Napisano 27.02.2012 23:16
Nie rozumiem Twojego toku myślenia Funkcja zostaje wykonana, gdy miną 4*3600 sekundy od ostatniego wykonania funkcji i już, to wcale nie musi być dokładnie tyle w chwili respa, po to jest floatround_floor. Zresztą najlepiej sam sprawdź na serwerzeAle floatround(0,5, floatround_floor) i floatround(0,95, floatround_floor) zwróci 0.
Więc funkcja wykona się, gdy wejdę na serwer np. z czasem 4:14, ale też i 4:26 - nie wykona się tylko raz ;F
@edit:
wyobraź sobie że wbijasz sobie na serwer z czasem 4:16, czyli dokładnie 15240 sekund
stara_ilosc sprawdzana przy wejsciu gracza wynosi 15240/14400 a zaokrąglając w dół jest to 1
po przegraniu np. 30 minut, stara ilosc sie nie zmienia, a nowa ilosc wynosi 15240+30*60 = 17040
i mamy sprawdzenie w nowej rundzie: 17040/14400 w zaokrągleniu w dół nadal wynosi 1 ! Czyli ponieważ stara_ilosc == ilosc, to nic się nie dzieje
a kiedy nowa ilosc bedzie różna od starej ilości? Jak wyniesie 2. A kiedy wyniesie dwa? Gdy łączny czas gracza będzie większy od 8:00
tutaj nic nie musi być co do sekundy, po prostu po przekroczeniu kolejnych 4 godzin wyonywana jest podczas zrespienia funkcja
Poprawcie mnie jeśli się myle
#20
Napisano 28.02.2012 01:48
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <amxmisc> #include <hamsandwich> #define PLUGIN "4h" #define VERSION "1.0" #define AUTHOR "G[o]Q" new time_play[33]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) RegisterHam(Ham_Spawn,"player","PlayerSpawnPost",1); } public PlayerSpawnPost(id){ static temp_time=time_play[id]+get_user_time(id); if(temp_time/3600 >=4){ Bonus(id); temp_time[id]=0; } } public client_connect(id){ wczytaj_dane(id); } public client_disconnect(id){ zapisz_dane(id) time_play[id]=0; } public Bonus(id){ // FUNKCJA ODPOWIEDZIALNA ZA BONUS } public zapisz_dane(id){ time_play[id]+=get_user_time(id); //TUTAJ IMPLEMENTACJA ZAPISU DO VAULT } public wczytaj_dane(id){ //TUTAJ IMPLEMENTACJA WCZYTYWANIA Z VAULT }
dopiszcie sobie tylko wczytywanie i zapis
Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka
GG:6022845 (nie pomagam za free osobom ponizej rangi MoD)
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych