←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Operacje na graczu co pare go...

  • +
  • -
A może sma? - zdjęcie 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ł...
Odpowiedz

  • +
  • -
Syczaj - zdjęcie 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.
Odpowiedz

  • +
  • -
speedkill - zdjęcie 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*60
Jakby coś to pytaj :D
getPlayedTime(id)
{
	return Czas_Gracza[id] + get_user_time(id, 1);
}

Użytkownik speedkill edytował ten post 26.02.2012 20:12
Odpowiedz

  • +
  • -
A może sma? - zdjęcie 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 ;P

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)
Odpowiedz

  • +
  • -
speedkill - zdjęcie 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) :P
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 27.02.2012

Nooo, okej, okej, ale przy 8 godzinach już twój warunek działać nie będzie ;P
Odpowiedz

  • +
  • -
Stachuu :D ?? - zdjęcie Stachuu :D ?? 27.02.2012

to moze jak wykona ta operacje to zeruj czas gracza ?
Odpowiedz

  • +
  • -
A może sma? - zdjęcie 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...
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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
Odpowiedz

  • +
  • -
Nakupenda. - zdjęcie Nakupenda. 27.02.2012

od tego jest operator reszty z dzielenia. xD

if(play_time[id]/(60*60) > 0 && play_time[id]/(60*60) % 4 == 0)
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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
Odpowiedz

  • +
  • -
Nakupenda. - zdjęcie 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
Odpowiedz

  • +
  • -
TomekPL - zdjęcie TomekPL 27.02.2012

a nie mozna tego dac w curweapon ? to caly czas bedzie sprawdzac...
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 27.02.2012

play_time[id]%3600
to zwróci liczbe sekund ktora zostanie po odjęciu od calkowitego wyniku wszystkich pelnych godzin
Odpowiedz

  • +
  • -
Cypis' - zdjęcie Cypis' 27.02.2012

a może by czas gry pobrać z gametrackera przez sockety ?
Odpowiedz

  • +
  • -
Nakupenda. - zdjęcie Nakupenda. 27.02.2012

a co wy na to panowie:

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
Odpowiedz

  • +
  • -
A może sma? - zdjęcie 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
Odpowiedz

  • +
  • -
Stachuu :D ?? - zdjęcie 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
Odpowiedz

  • +
  • -
Nakupenda. - zdjęcie Nakupenda. 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

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 serwerze

@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
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 28.02.2012

kombinujecie i kombinujecie

/* 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 xD
Odpowiedz