Jump to content

Probleempje met timers


Recommended Posts

Geplaatst: (bewerkt)

Nieuw probleem in mijn script:

Ik heb een zone waar alleen Army en Cops mogen komen. Nu heb ik geprobeerd iets te maken, dat als er speler (die geen Cop of Army is) in dat gebied een GameText op zijn scherm krijgt dat ie in een verboden zone zit. Dan wordt er een andere timer in werking gezet dat als ie niet binnen 10 sec. uit die zone is, een wanted level aan zijn broek krijgt.

Dit heb ik tot nu toe, maar het werkt niet zoals ik wil:

forward PlayerInCarrierArea();
forward LeaveCarrierNow();

Onder OnGameModeInit heb ik dit:

SetTimer("PlayerInCarrierArea",1000,1);

Dan heb ik hier wat er moet gebeuren als de eerste timer is afgelopen:

public PlayerInCarrierArea()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
	if(IsPlayerConnected(i) && IsSpawned[i] == 1)
	{
		new Float:x, Float:y, Float:z;
		GetPlayerPos(i, x, y, z);
		if(x >= 2782.5579 && x <= 3166.1729 && y >= 441.7090 && y <= 520.0420)
		{
			if(gTeam[i] != TEAM_ARMY && gTeam[i] != TEAM_COP)
			{
				GameTextForPlayer(i,"You are in the Restricted area of the Carrier. You have ~r~10 seconds ~w~to leave this area!",5000,5);
				SetTimer("LeaveCarrierNow",10000,0);
			}
		}
	}
}
}

En hier als de tweede timer is afgelopen:

public LeaveCarrierNow()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
	new Float:x, Float:y, Float:z;
	GetPlayerPos(i, x, y, z);
	if(x <=2782.5579 && x >= 3166.1729 && y <= 441.7090 && y >= 520.0420)
	{
		SendClientMessage(i, COLOR_GREEN, "You made it to escape from the cameras, they haven't noticed you");
		return 1;
	}
	new plwl = GetPlayerWantedLevel(i);
  		SetPlayerWantedLevel(i,plwl +15);
	GameTextForPlayer(i,"Too late, the cameras have spotted you! The Army is after you now!",5000,5);
	SendClientMessage(i,COLOR_GREEN, "You now have a Wanted Level of 15. Look out for the army!");
}
for (new j = 0; j < MAX_PLAYERS; j++)
{
	if(gTeam[j] == TEAM_ARMY || PlayerAdminLevel[j] == 5)
	{
			SendClientMessage(j, COLOR_RED, "Carrier Security has discovered an intruder. All units, eliminate the intruder");
	}
}
return 1;
}

Met deze code gebeurt er het volgende:

als ik met een class kom die geen army of cop is, en ik kom in dat gebied, dan verschijnt de GameText uit de eerste timer heel eventjes, en gaat daarna gelijk weer weg.

Dan krijg ik gelijk een wanted level (terwijl de 10 sec. nog niet eens voorbij zijn) en dat herhaalt zich steeds.

Ik krijg steeds elke seconde +15 wanted level.

P.s. als ik het compile, verschijnen er geen errors/warnings.

Bewerkt: door JayKay
Geplaatst: (bewerkt)

Hmm, probeer dit eens.

Zet boven "public OnGameModeInit()" het volgende:

stock Wait(time)
{
new stamp = tickcount();
while (tickcount() - stamp < time)
{
}
return 1;
}

Zet nu boven "SetTimer("LeaveCarrierNow",10000,0);" het volgende:

Wait(10000);

En vervang "SetTimer("LeaveCarrierNow",10000,0);" in de eerste funtie door het volgende:

LeaveCarrierNow();

Ik denk dat hij dan wel werkt. ;)

Bewerkt: door David22
Geplaatst:
...

En verwijder "SetTimer("LeaveCarrierNow",10000,0);" uit OnGameModeInit().

Ik denk dat hij dan wel werkt. ;)

Onder OnGameModeInit() staat niet de timer LeaveCarrierNow(), maar die andere timer PlayerInCarrierArea().

Moet ie dan alsnog weg?

Geplaatst:
...

En verwijder "SetTimer("LeaveCarrierNow",10000,0);" uit OnGameModeInit().

Ik denk dat hij dan wel werkt. ;)

Onder OnGameModeInit() staat niet de timer LeaveCarrierNow(), maar die andere timer PlayerInCarrierArea().

Moet ie dan alsnog weg?

Oeps, een foutje gemaakt :$ . Nee, die moet blijven staan ;).

Geplaatst: (bewerkt)

Dan heb ik helaas slecht nieuws, het werkt nu helemaal niet meer :7

Zodra ik in dat gebied kom, krijg ik alleen die eerste GameText te zien, maar voor de rest gebeurt er niks meer.

Bewerkt: door JayKay
Geplaatst:

Hmm, ik heb het script even herschreven, ik denk dat hij het zo wel doet.

new InCarrier[MAX_PLAYERS];
forward PlayerInCarrierArea();
forward LeaveCarrierNow();

stock Wait(time)
{
new stamp = tickcount();
while (tickcount() - stamp < time)
{
}
return 1;
}

public OnGameModeInit()
{
SetTimer("PlayerInCarrierArea",1000,1);
return 1;
}

public OnPlayerSpawn(playerid)
{
InCarrier[playerid] = 0;
return 1;
}

public PlayerInCarrierArea()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
	if(IsPlayerConnected(i) == 1)
	{
		new Float:x, Float:y, Float:z;
		GetPlayerPos(i, x, y, z);
		if(x >= 2782.5579 && x <= 3166.1729 && y >= 441.7090 && y <= 520.0420)
		{
			if(gTeam[i] != TEAM_ARMY && gTeam[i] != TEAM_COP)
			{
				GameTextForPlayer(i,"You are in the Restricted area of the Carrier. You have ~r~10 seconds ~w~to leave this area!",5000,5);
 				InCarrier[i] = 1;
 				Wait(10000);
 				LeaveCarrierNow();
			}
		}
	}
}
return 1;
}

public LeaveCarrierNow()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
	if (InCarrier[i] == 1)
	{
		new Float:x, Float:y, Float:z;
		GetPlayerPos(i, x, y, z);
		if(x <=2782.5579 && x >= 3166.1729 && y <= 441.7090 && y >= 520.0420)
		{
			SendClientMessage(i, COLOR_GREEN, "You made it to escape from the cameras, they haven't noticed you");
			return 1;
		}
		new plwl = GetPlayerWantedLevel(i);
	   	SetPlayerWantedLevel(i,plwl +15);
		GameTextForPlayer(i,"Too late, the cameras have spotted you! The Army is after you now!",5000,5);
		SendClientMessage(i,COLOR_GREEN, "You now have a Wanted Level of 15. Look out for the army!");
	}
  }
for (new j = 0; j < MAX_PLAYERS; j++)
{
	if(gTeam[j] == TEAM_ARMY || PlayerAdminLevel[j] == 5)
	{
		SendClientMessage(j, COLOR_RED, "Carrier Security has discovered an intruder. All units, eliminate the intruder");
	}
}
return 1;
}

Meld even of hij het doet ;). Succes ermee!

Geplaatst: (bewerkt)
Hmm, ik heb het script even herschreven, ik denk dat hij het zo wel doet.

new InCarrier[MAX_PLAYERS];
forward PlayerInCarrierArea();
forward LeaveCarrierNow();

stock Wait(time)
{
new stamp = tickcount();
while (tickcount() - stamp < time)
{
}
return 1;
}

public OnGameModeInit()
{
SetTimer("PlayerInCarrierArea",1000,1);
return 1;
}

public OnPlayerSpawn(playerid)
{
InCarrier[playerid] = 0;
return 1;
}

public PlayerInCarrierArea()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
	if(IsPlayerConnected(i) == 1)
	{
		new Float:x, Float:y, Float:z;
		GetPlayerPos(i, x, y, z);
		if(x >= 2782.5579 && x <= 3166.1729 && y >= 441.7090 && y <= 520.0420)
		{
			if(gTeam[i] != TEAM_ARMY && gTeam[i] != TEAM_COP)
			{
				GameTextForPlayer(i,"You are in the Restricted area of the Carrier. You have ~r~10 seconds ~w~to leave this area!",5000,5);
 				InCarrier[i] = 1;
 				Wait(10000);
 				LeaveCarrierNow();
			}
		}
	}
}
return 1;
}

public LeaveCarrierNow()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
	if (InCarrier[i] == 1)
	{
		new Float:x, Float:y, Float:z;
		GetPlayerPos(i, x, y, z);
		if(x <=2782.5579 && x >= 3166.1729 && y <= 441.7090 && y >= 520.0420)
		{
			SendClientMessage(i, COLOR_GREEN, "You made it to escape from the cameras, they haven't noticed you");
			return 1;
		}
		new plwl = GetPlayerWantedLevel(i);
	   	SetPlayerWantedLevel(i,plwl +15);
		GameTextForPlayer(i,"Too late, the cameras have spotted you! The Army is after you now!",5000,5);
		SendClientMessage(i,COLOR_GREEN, "You now have a Wanted Level of 15. Look out for the army!");
	}
  }
for (new j = 0; j < MAX_PLAYERS; j++)
{
	if(gTeam[j] == TEAM_ARMY || PlayerAdminLevel[j] == 5)
	{
		SendClientMessage(j, COLOR_RED, "Carrier Security has discovered an intruder. All units, eliminate the intruder");
	}
}
return 1;
}

Meld even of hij het doet ;). Succes ermee!

Als ik nu dat gebied binnenkom, dan krijg ik wel die tekst weer te zien, maar er gebeurt daarna nog steeds niks.

Nu wou ik een command typen, maar dat werkte niet.

Wat bleek nou, mijn client reageerde nergens meer op, kon geen commands meer typen, niet meer chatten, en mijn ping bleef steeds op 0 staan.

Na een tijdje restartte de server automatisch.

Dit vond ik in de log (misschien dat het helpt):

Mon Feb 23 18:24:43 CET 2009 :: Server is using too much resources, it'll be restarted within a few seconds.

Mon Feb 23 18:24:47 CET 2009 :: Server not running (possible crash), restarting.

P.s. Moet InCarrier[playerid] =0 niet onder OnPlayerConnect() staan?

Bewerkt: door JayKay
Geplaatst: (bewerkt)

Ik houd dit topic al een tijd lang in de gaten, maar ik heb nooit een werkende oplossing kunnen bedenken, tot ik SetTimerEx tegenkwam op de SA-MP Wiki.

Probeer eens:

//OnPlayerConnect:

SetTimerEx("PlayerInCarrierArea", 1000, true, "i", playerid); // geeft het playerid door aan de functie


// Rest van de code

public PlayerInCarrierArea(playerid)
{
if(InCarrier[playerid] == 1) return false; // Als de speler al in de carrier is, stop. Volgende timer is reeds in werking.

new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
if(x >= 2782.5579 && x <= 3166.1729 && y >= 441.7090 && y <= 520.0420)
{
	if(gTeam[playerid] != TEAM_ARMY || gTeam[playerid] != TEAM_COP)
	{
		GameTextForPlayer(playerid,"You are in the Restricted area of the Carrier. You have ~r~10 seconds ~w~to leave this area!",5000,5);
		InCarrier[playerid] = 1;
		SetTimer("LeaveCarrierNow", 10000, 0);
	}
}
return 1;
}

public LeaveCarrierNow(playerid)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);

if(x <=2782.5579 && x >= 3166.1729 && y <= 441.7090 && y >= 520.0420)
{
	SendClientMessage(playerid, COLOR_GREEN, "You made it to escape from the cameras, they haven't noticed you");
			InCarrier[playerid] = 0;
	return 1;
}

new plwl = GetPlayerWantedLevel(i);
SetPlayerWantedLevel(i,plwl +15);
GameTextForPlayer(playerid,"Too late, the cameras have spotted you! The Army is after you now!",5000,5);
SendClientMessage(playerid,COLOR_GREEN, "You now have a Wanted Level of 15. Look out for the army!");

for (new i = 0; i < MAX_PLAYERS; i++)
{
	if(gTeam[i] == TEAM_ARMY || PlayerAdminLevel[i] == 5)
	{
		SendClientMessage(i, COLOR_RED, "Carrier Security has discovered an intruder. All units, eliminate the intruder");
	}
}
return 1;
}

Bewerkt: door Big Boss
Geplaatst: (bewerkt)
Ik houd dit topic al een tijd lang in de gaten, maar ik heb nooit een werkende oplossing kunnen bedenken, tot ik SetTimerEx tegenkwam op de SA-MP Wiki.

Probeer eens:

//OnPlayerConnect:

SetTimerEx("PlayerInCarrierArea", 1000, true, "i", playerid); // geeft het playerid door aan de functie


// Rest van de code

public PlayerInCarrierArea(playerid)
{
if(InCarrier[playerid] == 1) return false; // Als de speler al in de carrier is, stop. Volgende timer is reeds in werking.

new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
if(x >= 2782.5579 && x <= 3166.1729 && y >= 441.7090 && y <= 520.0420)
{
	if(gTeam[playerid] != TEAM_ARMY || gTeam[playerid] != TEAM_COP)
	{
		GameTextForPlayer(playerid,"You are in the Restricted area of the Carrier. You have ~r~10 seconds ~w~to leave this area!",5000,5);
		InCarrier[playerid] = 1;
		SetTimer("LeaveCarrierNow", 10000, 0);
	}
}
return 1;
}

public LeaveCarrierNow(playerid)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);

if(x <=2782.5579 && x >= 3166.1729 && y <= 441.7090 && y >= 520.0420)
{
	SendClientMessage(playerid, COLOR_GREEN, "You made it to escape from the cameras, they haven't noticed you");
			InCarrier[playerid] = 0;
	return 1;
}

new plwl = GetPlayerWantedLevel(i);
SetPlayerWantedLevel(i,plwl +15);
GameTextForPlayer(playerid,"Too late, the cameras have spotted you! The Army is after you now!",5000,5);
SendClientMessage(playerid,COLOR_GREEN, "You now have a Wanted Level of 15. Look out for the army!");

for (new i = 0; i < MAX_PLAYERS; i++)
{
	if(gTeam[i] == TEAM_ARMY || PlayerAdminLevel[i] == 5)
	{
		SendClientMessage(i, COLOR_RED, "Carrier Security has discovered an intruder. All units, eliminate the intruder");
	}
}
return 1;
}

Moet ik dan de normale SetTimer("PlayerInCarrierArea", 1000, 1) weghalen?

En het stukje vanaf new plwl = GetPlayerWantedLevel(i) moet dat geen playerid worden nu?

EDIT: en de SetTimerEx moet toch onder OnGameModeInit() en niet onder OnPlayerConnect()?

Bewerkt: door JayKay
Geplaatst: (bewerkt)

Heb er weer nieuwe errors bij:

C:\Program Files\Rockstar Games\GTA San Andreas\SAMP-server\gamemodes\lvrcr-nieuw.pwn(1505) : error 017: undefined symbol "playerid"
C:\Program Files\Rockstar Games\GTA San Andreas\SAMP-server\gamemodes\lvrcr-nieuw.pwn(3231) : error 025: function heading differs from prototype
C:\Program Files\Rockstar Games\GTA San Andreas\SAMP-server\gamemodes\lvrcr-nieuw.pwn(3248) : error 025: function heading differs from prototype
Pawn compiler 3.2.3664	 	 	Copyright © 1997-2006, ITB CompuPhase


3 Errors.

Op regel 1505 staat die SetTimerEx, op regel 3231 staat public PlayerInCarrierArea(playerid) en op regel 3248 staat public LeaveCarrierNow(playerid).

Bewerkt: door JayKay
Geplaatst:
forward PlayerInCarrierArea(playerid);

forward LeaveCarrierNow(playerid);

Oh ja, stom van me :duh:

Maar moet die SetTimerEx nou onder OnGameModeInit() of onder OnPlayerConnect()? (bij Wiki SA:MP staat ie nl. wel onder OnGameModeInit)

Blijft nog 1 error over: de bovenste van de vorige 3.

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...