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): //
Koristi y_timers lakše je a i bolje
Kako setujes tajmer bolesttimer[playerid] ? I daj citav kod ne samo tu liniju
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]
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
Hvala ti puno. I dalje se bas ne razumem najbolje u timere i kako funkcionisu pa nisam bas najbolje razumeo.