Sistem plate

Započeo cofilinko, Septembar 13, 2023, 23:22:06 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

Pitanje/savjet: Sta se desava sa timerom koji svakih sat vremena daje platu kada se server restartuje na npr. 5-10 minuta. Da li ce taj timer kasniti 5 minuta i da li postoji neki nacin da se to ispravi ili ja samo previse razmisljam o toj prepreci.
Opširnije:
Dodatno:
Aj napuni pun i vozi odavde,
na autoput u najveci krug,
da najbolje razmislim ko mi je drug.

Tajmer krece kada se server pokrene. Ako traje sat vremena, nema veze s vremenom u svetu.
- open.mp regional coordinator -

Citat: Mergevos poslato Septembar 13, 2023, 23:28:29 POSLE PODNE
Tajmer krece kada se server pokrene. Ako traje sat vremena, nema veze s vremenom u svetu.
Ma ja to razumem, nego ako se server ugasi na nekih 10-15 minuta i onda se pokrene, plata ce za isto toliko kasniti. Sad ne znam da li je bolje da se saceka okruglo vreme (npr 18:00) i da se server opet otvori.
Aj napuni pun i vozi odavde,
na autoput u najveci krug,
da najbolje razmislim ko mi je drug.

Citat: cofilinko poslato Septembar 13, 2023, 23:29:37 POSLE PODNE
Ma ja to razumem, nego ako se server ugasi na nekih 10-15 minuta i onda se pokrene, plata ce za isto toliko kasniti. Sad ne znam da li je bolje da se saceka okruglo vreme (npr 18:00) i da se server opet otvori.

Timer mozes pozvati kada hoces. Ukoliko hoces da se pozove na pocetku sledeceg sata (npr. 19:00, 18:00, 15:00) pomocu gettime funkcije mozes uzeti trenutne minute i ostalo je jednostavna matematika.
PS. SA-MP timer nisu 100% tacni. Ako ti je neophodno da budu tacni koristi neki od pluginova kao sto je ovaj - https://github.com/bmisiak/samp-precise-timers ili open.mp server.

Napomena za plugin, imao sam slucaj da su me ti tajmeri od plugina ujebali, jednostavno je bio slucaj da se nije kill, iako je cak i plugin vracao da je killed.

Citat: // xunder poslato Septembar 13, 2023, 23:42:08 POSLE PODNE
Timer mozes pozvati kada hoces. Ukoliko hoces da se pozove na pocetku sledeceg sata (npr. 19:00, 18:00, 15:00) pomocu gettime funkcije mozes uzeti trenutne minute i ostalo je jednostavna matematika.
PS. SA-MP timer nisu 100% tacni. Ako ti je neophodno da budu tacni koristi neki od pluginova kao sto je ovaj - https://github.com/bmisiak/samp-precise-timers ili open.mp server.
U timeru koji se poziva na svaki minut sam ubacio ovo jer sam video da dosta servera koristi nesto slicno ovome
[pawn]
new sati,minuti, sekund;
gettime(sati,minuti, sekund);
if(minuti == 0){
    Plata(i);
}
[/pawn]
Zanima me vase misljenje oko ovakvog koda. Takodje, probao sam sinoc i radilo je. Evo danas sam pokrenuo kucni server u 11:20-11:25 i plata mi je legla tacno u 12:00:44.
Aj napuni pun i vozi odavde,
na autoput u najveci krug,
da najbolje razmislim ko mi je drug.

Citat: cofilinko poslato Septembar 14, 2023, 12:01:08 POSLE PODNE
U timeru koji se poziva na svaki minut sam ubacio ovo jer sam video da dosta servera koristi nesto slicno ovome
[pawn]
new sati,minuti, sekund;
gettime(sati,minuti, sekund);
if(minuti == 0){
    Plata(i);
}
[/pawn]
Zanima me vase misljenje oko ovakvog koda. Takodje, probao sam sinoc i radilo je. Evo danas sam pokrenuo kucni server u 11:20-11:25 i plata mi je legla tacno u 12:00:44.

Kod je ispravan, s tim da ne moras praviti varijable koje ti ne sluze nicemu. Primjer:

new minutes;
gettime(_, minutes, _);
if (minutes == 0) Plata(i);


Tvoj nacin je potpuno ispravan i osigurace da se funkcija "Plata" pozove onda kada ti to zelis. Pobrini se da ti se timer ne poziva 2 puta u jednoj minuti jer ce to znaciti da se funkcija "Plata" poziva 2 puta u istoj (nultoj) minuti.
Razlika izmedju tvog nacina i gore navedenog je sto ces vise puta (u zavisnosti od intervala timera) pozvati sam callback timera i izvrsiti PAWN kod. Ipak, ukoliko je to citav kod koji pozivas ne moras previse da se brines o tome da li ce i koliko (0) uticati na performanse.

Citat: // xunder poslato Septembar 15, 2023, 00:26:39 PRE PODNE
Kod je ispravan, s tim da ne moras praviti varijable koje ti ne sluze nicemu. Primjer:

new minutes;
gettime(_, minutes, _);
if (minutes == 0) Plata(i);


Tvoj nacin je potpuno ispravan i osigurace da se funkcija "Plata" pozove onda kada ti to zelis. Pobrini se da ti se timer ne poziva 2 puta u jednoj minuti jer ce to znaciti da se funkcija "Plata" poziva 2 puta u istoj (nultoj) minuti.
Razlika izmedju tvog nacina i gore navedenog je sto ces vise puta (u zavisnosti od intervala timera) pozvati sam callback timera i izvrsiti PAWN kod. Ipak, ukoliko je to citav kod koji pozivas ne moras previse da se brines o tome da li ce i koliko (0) uticati na performanse.
Iz ovog narednog. Ako ja ovo dobro radim. Timer se poziva na svaki 1 minut, prolazi kroz sve igrace i ako je igrac ulogovan(upisao sifru/registrovano se) i ako se minuti poklapaju sa 0 onda se plata daje. Licno ne vidim ovde duplo pozivanje davanje plate. Ako gresim, ispravi me naravno.
Zanima me samo, posto provera za minut stoji == 0, da li ce se plata davati samo ako je vreme na primer sati:00 ili i kad je sati:01. Mislim da ne bi trebalo.
Hvala puno sto si izdvojio vremena da mi pomognes i objasnis.
Ako uocis nekakvu gresku, slobodno me ispravi.
[pawn]
public OnGameModeInit()
{
   SetTimer("MinutTimer", 60000, true);
   return 1;
}
forward MinutTimer();
public MinutTimer()
{
    for(new i=0; i<= GetPlayerPoolSize(); i++)
    {
        if(Ulogovan > 0)
   {
      new sati,minuti, sekund;
      gettime(sati,minuti, sekund);
      if(minuti == 0)
      {
             Plata(i);
      }
      PlayerInfo[pPayDayPoen]++;
   }
   return 1;
}
[/pawn]
Aj napuni pun i vozi odavde,
na autoput u najveci krug,
da najbolje razmislim ko mi je drug.

Napisao ti je kako da izbegnes dodatne varijable, tu si ga iskulirao i pitao je l dobro iako nisi primenio nista,
gettime funkciju koristi pre petlje, jedanput, ne za svakog igraca posebno (znaci da imas 1000 igraca ti bi pozvao func gettime 1000 puta, ovako 1x),
u petlji definisi varijablu u kojoj ces cuvati najvisi id igraca tj GetPlayerPoolSize(), po tvom nacinu na svakoj iteraciji ces pozivati ovu funkciju (do 1000 puta, zavisi od najviseg ID-a u tom trenutku), ovako samo jednom,
btw. implementiraj foreach ili y_iterate ako koristis ysi i pocni da koristis iteratore (za igrace u ovom slucaju)


[pawn]forward MinutTimer();
public MinutTimer()
{
   new minuti;
   gettime(_, minuti, _);
   for(new i, player_pool_size = GetPlayerPoolSize(); i <= player_pool_size; ++i)
   {
      if(Ulogovan)
      {
         if(minuti == 0) Plata(i);
         PlayerInfo[pPayDayPoen]++;
      }
   }
   return 1;
}[/pawn]

Citat: PazzOnee poslato Septembar 15, 2023, 07:08:11 PRE PODNE
Napisao ti je kako da izbegnes dodatne varijable, tu si ga iskulirao i pitao je l dobro iako nisi primenio nista,
gettime funkciju koristi pre petlje, jedanput, ne za svakog igraca posebno (znaci da imas 1000 igraca ti bi pozvao func gettime 1000 puta, ovako 1x),
u petlji definisi varijablu u kojoj ces cuvati najvisi id igraca tj GetPlayerPoolSize(), po tvom nacinu na svakoj iteraciji ces pozivati ovu funkciju (do 1000 puta, zavisi od najviseg ID-a u tom trenutku), ovako samo jednom,
btw. implementiraj foreach ili y_iterate ako koristis ysi i pocni da koristis iteratore (za igrace u ovom slucaju)


[pawn]forward MinutTimer();
public MinutTimer()
{
   new minuti;
   gettime(_, minuti, _);
   for(new i, player_pool_size = GetPlayerPoolSize(); i <= player_pool_size; ++i)
   {
      if(Ulogovan)
      {
         if(minuti == 0) Plata(i);
         PlayerInfo[pPayDayPoen]++;
      }
   }
   return 1;
}[/pawn]

Jel se može koristiti i IsPlayerConnected umjesto ovo Ulogovan
Ako se može ja bi stavio if(IsPlayerConnected(i))
Poslednja Izmena: Septembar 15, 2023, 09:07:11 PRE PODNE od ivanboskic1

Provera da li je igrac konektovan i ulogovan nisu isto, tako da ne mozes da zamenis jedno sa drugim, ali treba da dodas proveru da li je igrac konektovan pre provere da li je ulogovan (u ovom slucaju), ako radis kao i on (loop kroz max id), ali ako koristis iterator (foreach, y_iterate) za igrace onda nema potrebe, jer kada ga dodaju u iterator za igrace, podrazumeva se da je igrac konektovan i nema potrebe za tom proverom

Citat: PazzOnee poslato Septembar 15, 2023, 07:08:11 PRE PODNE
Napisao ti je kako da izbegnes dodatne varijable, tu si ga iskulirao i pitao je l dobro iako nisi primenio nista,
gettime funkciju koristi pre petlje, jedanput, ne za svakog igraca posebno (znaci da imas 1000 igraca ti bi pozvao func gettime 1000 puta, ovako 1x),
u petlji definisi varijablu u kojoj ces cuvati najvisi id igraca tj GetPlayerPoolSize(), po tvom nacinu na svakoj iteraciji ces pozivati ovu funkciju (do 1000 puta, zavisi od najviseg ID-a u tom trenutku), ovako samo jednom,
btw. implementiraj foreach ili y_iterate ako koristis ysi i pocni da koristis iteratore (za igrace u ovom slucaju)


[pawn]forward MinutTimer();
public MinutTimer()
{
   new minuti;
   gettime(_, minuti, _);
   for(new i, player_pool_size = GetPlayerPoolSize(); i <= player_pool_size; ++i)
   {
      if(Ulogovan)
      {
         if(minuti == 0) Plata(i);
         PlayerInfo[pPayDayPoen]++;
      }
   }
   return 1;
}[/pawn]

Moja greska. Nisam sve lepo pažljivo procitao gore. Sve u svemu shvatio sam šta si zeleo da mi kažeš. Hvala puno obojici na izdvojenom vremenu.
Aj napuni pun i vozi odavde,
na autoput u najveci krug,
da najbolje razmislim ko mi je drug.