JayKay Geplaatst: 21 februari 2009 Rapport Geplaatst: 21 februari 2009 (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: 21 februari 2009 door JayKay Reageren
David22 Geplaatst: 21 februari 2009 Rapport Geplaatst: 21 februari 2009 (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: 22 februari 2009 door David22 Reageren
JayKay Geplaatst: 21 februari 2009 Auteur Rapport Geplaatst: 21 februari 2009 ...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? Reageren
David22 Geplaatst: 22 februari 2009 Rapport Geplaatst: 22 februari 2009 ...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 . Reageren
JayKay Geplaatst: 22 februari 2009 Auteur Rapport Geplaatst: 22 februari 2009 (bewerkt) Dan heb ik helaas slecht nieuws, het werkt nu helemaal niet meer Zodra ik in dat gebied kom, krijg ik alleen die eerste GameText te zien, maar voor de rest gebeurt er niks meer. Bewerkt: 23 februari 2009 door JayKay Reageren
David22 Geplaatst: 23 februari 2009 Rapport Geplaatst: 23 februari 2009 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! Reageren
JayKay Geplaatst: 23 februari 2009 Auteur Rapport Geplaatst: 23 februari 2009 (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: 23 februari 2009 door JayKay Reageren
Big Boss Geplaatst: 23 februari 2009 Rapport Geplaatst: 23 februari 2009 (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: 23 februari 2009 door Big Boss Reageren
JayKay Geplaatst: 23 februari 2009 Auteur Rapport Geplaatst: 23 februari 2009 (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: 23 februari 2009 door JayKay Reageren
JayKay Geplaatst: 26 februari 2009 Auteur Rapport Geplaatst: 26 februari 2009 (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: 26 februari 2009 door JayKay Reageren
Big Boss Geplaatst: 26 februari 2009 Rapport Geplaatst: 26 februari 2009 forward PlayerInCarrierArea(playerid); forward LeaveCarrierNow(playerid); Reageren
JayKay Geplaatst: 26 februari 2009 Auteur Rapport Geplaatst: 26 februari 2009 forward PlayerInCarrierArea(playerid);forward LeaveCarrierNow(playerid); Oh ja, stom van me 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. Reageren
Big Boss Geplaatst: 26 februari 2009 Rapport Geplaatst: 26 februari 2009 OnPlayerConnect. OnGameModeInit heeft geen playerid parameter. Reageren
Recommended Posts
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.