[ROZWIĄZANE] Operacje na graczu co pare go...
A może sma?
26.02.2012
Siema.
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ł...
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ł...
Syczaj
26.02.2012
Nie lepiej sprawdzać na spawnie ile ma godzin w sumie? I wtedy mu coś dać?
Zapisuj czas gry na nvault.
Potem get_user_time + ten zapisany sprawdzaj na każdym spawnie.
Zapisuj czas gry na nvault.
Potem get_user_time + ten zapisany sprawdzaj na każdym spawnie.
speedkill
26.02.2012
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
A może sma?
26.02.2012
No, okej, okej, ale jeżeli chcę coś zrobić raz na np. 4 godziny?
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:
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)
speedkill
27.02.2012
Dzielisz czas otrzymujesz go w godzinach.
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)
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)
A może sma?
27.02.2012
Nooo, okej, okej, ale przy 8 godzinach już twój warunek działać nie będzie
A może sma?
27.02.2012
Jest to jakieś rozwiązanie... Tylko trochę kijowe, jeżeli chcę znać czas, który dany gracz przegrał na serwerze...
G[o]Q
27.02.2012
ja bym to zrobil tak na wejsciu jesli goscia nie ma w vault to wrzucasz mu ze gral te 4h i co spawn zmniejszasz te liczbe jak wyjdzie to ją zapisujesz i przy wejsciu wczytujesz jak liczba bedzie mniejsza od 0 to znowu ustawiasz mu 4h i wywolujesz funkcje
Nakupenda.
27.02.2012
od tego jest operator reszty z dzielenia.
if(play_time[id]/(60*60) > 0 && play_time[id]/(60*60) % 4 == 0)
G[o]Q
27.02.2012
tak ale zle go uzyles
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
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
Nakupenda.
27.02.2012
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
G[o]Q
27.02.2012
play_time[id]%3600to zwróci liczbe sekund ktora zostanie po odjęciu od calkowitego wyniku wszystkich pelnych godzin
Nakupenda.
27.02.2012
a co wy na to panowie:
Użytkownik Nakupenda. edytował ten post 27.02.2012 20:46
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
A może sma?
27.02.2012
Ale 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
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
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
Stachuu :D ??
27.02.2012
to moze zrob ze 1 zmienia liczysz czas a 2 ilosc "eventow" ktore gracz juz zrobił
co event dodajesz do zmiennej++
i porostu czas wymagany potem mnożysz poprzez nr eventu
co event dodajesz do zmiennej++
i porostu czas wymagany potem mnożysz poprzez nr eventu
Nakupenda.
27.02.2012
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
G[o]Q
28.02.2012
kombinujecie i kombinujecie
dopiszcie sobie tylko wczytywanie i zapis
/* 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