Balkan SA:MP

PAWN skriptanje, gamemodovi, filterskripte, include fajlovi, mape, pluginovi => Razgovor u vezi PAWN - skriptanja => Temu započeo: Neckiy poslato Maj 10, 2021, 01:40:08 PRE PODNE

Naslov: Pomoc u vezi sistema bolesti
Poruka od: Neckiy poslato Maj 10, 2021, 01:40:08 PRE PODNE
Problem(error/warning): Sto se tice razboljevanja sve lepo radi, pise kad se razbolim i na odredjeni timer mi skida helte, problem nastaje kada ukucam komandu /iskoristilek, koja treba da prekine timer ali nista se ne desi i helti nastavljaju da se gube.
Deo skripte: [pawn]CMD:iskoristilek(playerid, params[])
{
   if(UlogovaniIgrac[playerid] == 0) return SCM(playerid,-1,"{FF0000}[GRESKA] {FFFFFF}Niste ulogovani.");
   if(zamrznut[playerid] == 1) return SCM(playerid,-1,"{FF0000}[GRESKA] {FFFFFF}Ne mozes to sad!");
   if(PlayerInfo[playerid][pBolestan] == 0) return SCM(playerid,-1,"{FF0000}[GRESKA] {FFFFFF}Niste bolesni!");
   if(PlayerInfo[playerid][pLek] == 0) return SCM(playerid,-1,"{FF0000}[GRESKA] {FFFFFF}Nemate lek, kupite ga u apoteci!");
   TextDrawShowForPlayer(playerid, Bolest_TD[2]);
   PlayerInfo[playerid][pBolestan] = 0;
   PlayerInfo[playerid][pLek] -= 1;
   KillTimer(bolesttimer[playerid]);
   SetTimerEx("BolestTDHide", 3500, false, "i", playerid);
   SacuvajAkaunt(playerid);
   return 1;
}
[/pawn]
Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log): //
Naslov: Odg: Pomoc u vezi sistema bolesti
Poruka od: Claus poslato Maj 10, 2021, 09:00:11 PRE PODNE
Koristi y_timers lakše je a i bolje
Naslov: Odg: Pomoc u vezi sistema bolesti
Poruka od: Bit Frosty poslato Maj 10, 2021, 11:08:12 PRE PODNE
Kako setujes tajmer    bolesttimer[playerid] ? I daj citav kod ne samo tu liniju
Naslov: Odg: Pomoc u vezi sistema bolesti
Poruka od: Neckiy poslato Maj 10, 2021, 12:30:54 POSLE PODNE
Jbg, prosli put sam poslao ceo kod pa mi mod zatvorio objavu, poslacu ti sad sve lepo.
Komandu imas na pocetku.
Ovo je u OnGameModeInit, to je timer sa kojim se igrac razboljeva.
[pawn]SetTimer("RazboleliSteSe",30000,false);[/pawn]
Ovo je taj timer RazboleliSteSe:
[pawn]forward RazboleliSteSe();
public RazboleliSteSe()
{
   for(new i = 0; i < MAX_PLAYERS; i++)
   {
      new Float:health;
      TextDrawShowForAll(Bolest_TD[0]);
      GetPlayerHealth(i, health);
      SetPlayerHealth(i, health - 20);
      PlayerInfo[pBolestan] = 1;
      SetTimer("BolestTDHide", 3500, false);
      bolesttimer = SetTimer("BolesniSte", 10000, true);
      SacuvajAkaunt(i);
   }
   return 1;
}[/pawn]
I ovo je timer BolesniSte tj bolesttimer[playerid] je:
[pawn]forward BolesniSte();
public BolesniSte()
{
   for(new i = 0; i < MAX_PLAYERS; i++)
   {
      new Float:health;
      TextDrawShowForAll(Bolest_TD[1]);
      GetPlayerHealth(i, health);
      SetPlayerHealth(i, health - 20);
      SetTimer("BolestTDHide", 90000, false);
   }
   return 1;
}[/pawn]
Naslov: Odg: Pomoc u vezi sistema bolesti
Poruka od: Bit Frosty poslato Maj 10, 2021, 12:53:58 POSLE PODNE
Mesas tajmere i nacin na koji se pozivaju. Pozvao si jednom RazboleliSteSe iz GM init, znaci kad start server pozvace s e jednom i to je to (verovatno si hteo svakih 30 minuta ili nesto tako da se poziva ali nije vezano za trenutni problem).
U tom callbacku startujes za svakog igraca po jedan tajmer BolesniSte ali ne prosledjujes ID. Plus ne proveravas da li je igrac online.
Znaci ako imas MAX_PLAYERS 100 onda ces pozvati 100x taj callback svakih 100 sekundi.
A u BolesniSte opet imas loop za svakog igraca i opet ne proveravas da li je konektovan. Uglavnom po ideji ovo te ubije odmah svakih 10 sekundi (skine ti po 20hp 100x za manje od sekund).

Posto imas bolesttimer[MAX_PLAYERS] predpostavljam da si to hteo da bude za svakog igraca. Onda trebas da prosledis id igraca koji se razbolio:
[pawn]bolesttimer = SetTimerEx("BolesniSte", 10000, true, "d", i);[/pawn]

I u BolesniSte da dodas playerid kao argument i da maknes loop. Ispravljeni kod ispod:
[pawn]
forward RazboleliSteSe();
public RazboleliSteSe()
{
   for(new i = 0; i < MAX_PLAYERS; i++)
   {
      if(!IsPlayerConnected(i)) continue;
      new Float:health;
      TextDrawShowForPlayer(playerid, Bolest_TD[0]);//Samo igracu koji se razbolio (to jest svima posto su u loop)
      GetPlayerHealth(i, health);
      SetPlayerHealth(i, health - 20);
      PlayerInfo[pBolestan] = 1;
      //Prosledjujemo playerid to jest i kao argument
      SetTimerEx("BolestTDHide", 3500, false, "d", i);
      bolesttimer = SetTimerEx("BolesniSte", 10000, true, "d", i);
      SacuvajAkaunt(i);
   }
   return 1;
}
[/pawn]
[pawn]
forward BolesniSte(playerid);
public BolesniSte(playerid)
{
   if(!IsPlayerConnected(playerid)) return 0;

   new Float:health;
   TextDrawShowForPlayer(playerid, Bolest_TD[1]);
   GetPlayerHealth(playerid, health);
   SetPlayerHealth(playerid, health - 20);

   //Ispravio sam i prosledio sam playerid
   //Ali jesi li siguran da si ovde hteo ovo? :D
   SetTimerEx("BolestTDHide", 90000, false, "d", playerid);
   return 1;
}[/pawn]


Ostaje ti jos BolestTDHide da promenis da ti prima playerid kao argument i naravno da sakrijes TD za tog igraca i sta vec tamo radis. Znaci nema loop-a za sve igrace kao ni u BolesniSte
Naslov: Odg: Pomoc u vezi sistema bolesti
Poruka od: Neckiy poslato Maj 10, 2021, 13:36:49 POSLE PODNE
Hvala ti puno. I dalje se bas ne razumem najbolje u timere i kako funkcionisu pa nisam bas najbolje razumeo.