Pomoc u vezi sistema bolesti


Započeo Neckiy, Maj 10, 2021, 01:40:08 PRE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

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:
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;
}

Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log):
//
Poslednja Izmena: Maj 10, 2021, 13:57:38 POSLE PODNE od M Ө M Σ N Z I
Mnogo ljudi mi govori da sam autistican.
U pravu su...


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.
SetTimer("RazboleliSteSe",30000,false);

Ovo je taj timer RazboleliSteSe:
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[i][pBolestan] = 1;
		SetTimer("BolestTDHide", 3500, false);
		bolesttimer[i] = SetTimer("BolesniSte", 10000, true);
		SacuvajAkaunt(i);
	}
	return 1;
}

I ovo je timer BolesniSte tj bolesttimer[playerid] je:
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;
}

Mnogo ljudi mi govori da sam autistican.
U pravu su...

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:
bolesttimer[i] = SetTimerEx("BolesniSte", 10000, true, "d", i);


I u BolesniSte da dodas playerid kao argument i da maknes loop. Ispravljeni kod ispod:
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[i][pBolestan] = 1;
		//Prosledjujemo playerid to jest i kao argument
		SetTimerEx("BolestTDHide", 3500, false, "d", i);
		bolesttimer[i] = SetTimerEx("BolesniSte", 10000, true, "d", i);
		SacuvajAkaunt(i);
	}
	return 1;
}

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;
}



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.
Mnogo ljudi mi govori da sam autistican.
U pravu su...