SA-MP Forums Archive
OnPlayerStateChange Problem - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: OnPlayerStateChange Problem (/showthread.php?tid=530968)



OnPlayerStateChange Problem - Fachrul48 - 10.08.2014

Hello SA:MP Users , Today I Got This Bunch Of Message From crashdetect Plugins
Код:
[09:56:11] [debug] Run time error 4: "Array index out of bounds"
[09:56:11] [debug]   Accessing element at index 999 past array upper bound 500
[09:56:11] [debug] Backtrace (most recent call first):
[09:56:11] [debug] #0  000702d4 in OnPlayerStateChange () from ggrpboombox.amx
I Checked my OnPlayerStateChange
Код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
    if(newstate != 2) NOPTrigger[playerid] = 0;
    if(IsPlayerNPC(playerid))
	{
	    if(newstate == PLAYER_STATE_SPECTATING)
	    {
        	TogglePlayerSpectating(playerid, false);
		}
		return 1;
	}
	if(GettingSpectated[playerid] != 999)
	{
	    new spectator = GettingSpectated[playerid];
	    if(!IsPlayerConnected(spectator))
	    {
	        GettingSpectated[playerid] = 999;
	        Spectate[spectator] = 999;
		}

	    if(newstate == PLAYER_STATE_DRIVER && PlayerInfo[spectator][pAdmin] >= 2 || newstate == PLAYER_STATE_PASSENGER && PlayerInfo[spectator][pAdmin] >= 2)
	    {
	        TogglePlayerSpectating(spectator, true);
			new carid = GetPlayerVehicleID( playerid );
			PlayerSpectateVehicle( spectator, carid );
			SetPVarInt(spectator, "SpecState", newstate);
	    }
	    else if(newstate == PLAYER_STATE_ONFOOT && PlayerInfo[spectator][pAdmin] >= 2)
	    {
	        TogglePlayerSpectating(spectator, true);
		   	PlayerSpectatePlayer( spectator, playerid );
		   	SetPlayerInterior( spectator, GetPlayerInterior( playerid ) );
			SetPVarInt(spectator, "SpecState", newstate);
	    }
	}
	if(newstate == PLAYER_STATE_ONFOOT)
	{
 		if(Audio_IsClientConnected(playerid))
		{
			Audio_Stop(playerid, stationidp[playerid]);
 			stationidp[playerid] = 0;
		}


	    new spectator = GettingSpectated[playerid];
	    if(PlayerInfo[spectator][pAdmin] >= 2) {
	        // Preventing possible buffer overflows with the arrays
	 		TogglePlayerSpectating(spectator, true);
			PlayerSpectatePlayer( spectator, playerid );
			SetPlayerInterior( spectator, GetPlayerInterior( playerid ) );
			SetPVarInt(spectator, "SpecState", newstate);
			SetPlayerInterior( spectator, GetPlayerInterior( playerid ) );
			SetPlayerVirtualWorld( spectator, GetPlayerVirtualWorld( playerid ) );
		}

	    if(oldstate == PLAYER_STATE_DRIVER)
		{
			SetPlayerWeaponsEx(playerid);
		}
		else if(oldstate == PLAYER_STATE_PASSENGER) SetPlayerWeaponsEx(playerid);

		if(ConnectedToPC[playerid] == 1337)//mdc
	    {
            SendClientMessageEx(playerid, COLOR_LIGHTBLUE, "* Anda keluar dari MDC.");
	        ConnectedToPC[playerid] = 0;
		}
        if(TransportDuty[playerid] > 0)
		{
		    if(TransportDuty[playerid] == 1)
			{
		        TaxiDrivers -= 1;
			}
			else if(TransportDuty[playerid] == 2)
			{
			    BusDrivers -= 1;
			}
			TransportDuty[playerid] = 0;
			new string[42];
			format(string, sizeof(string), "* Anda sekarang berhenti bertugas dan mendapatkan $%d.", TransportMoney[playerid]);
			SendClientMessageEx(playerid, COLOR_LIGHTBLUE, string);
			GivePlayerCash(playerid, TransportMoney[playerid]);
			ConsumingMoney[playerid] = 1; TransportValue[playerid] = 0; TransportMoney[playerid] = 0;
			SetPlayerColor(playerid, TEAM_HIT_COLOR);
			TransportTime[playerid] = 0;
   			TransportCost[playerid] = 0;
		}
		if(TransportDriver[playerid] < 999)
		{
			new string[128];
			TransportMoney[TransportDriver[playerid]] += TransportCost[playerid];
			format(string, sizeof(string), "~w~Total Argo~n~~r~$%d",TransportCost[playerid]);
			GameTextForPlayer(playerid, string, 5000, 3);
			format(string, sizeof(string), "~w~penumpang keluar dari taxi.~n~~g~Mendapatkan $%d",TransportCost[playerid]);
			GameTextForPlayer(TransportDriver[playerid], string, 5000, 3);
			GivePlayerCash(playerid, -TransportCost[playerid]);

			new ip[32], ipex[32];
			GetPlayerIp(playerid, ip, sizeof(ip));
			GetPlayerIp(TransportDriver[playerid], ipex, sizeof(ipex));
			TaxiWarn[playerid][TransportDriver[playerid]] += TransportCost[playerid];
			if(TaxiWarn[playerid][TransportDriver[playerid]] >= 10000)
			{
				format(string, sizeof(string), "%s (IP:%s) has taxied %s (IP:%s) $%d in this session.", GetPlayerNameEx(playerid), ip, GetPlayerNameEx(TransportDriver[playerid]), ipex, TaxiWarn[playerid][TransportDriver[playerid]]);
				Log("logs/pay.log", string);
				ABroadCast(COLOR_YELLOW, string, 2);
			}
			TransportTime[TransportDriver[playerid]] = 0;
			TransportCost[TransportDriver[playerid]] = 0;
			TransportCost[playerid] = 0;
			TransportTime[playerid] = 0;
			TransportDriver[playerid] = 999;
		}
		TelePos[playerid][0] = 0.0;
		TelePos[playerid][1] = 0.0;
	}
I'm just copying a part of it , if i copyed a whole onplayerstatechange code it will be a bunch of code sorry for the bad english
+NOTE : when i get a bunch of [09:56:11] [debug] Accessing element at index 999 past array upper bound 500
[09:56:11] [debug] Backtrace (most recent call first):
[09:56:11] [debug] #0 000702d4 in OnPlayerStateChange () from ggrpboombox.amx , the server is down


Re: OnPlayerStateChange Problem - Misiur - 10.08.2014

Quote:

Accessing element at index 999 past array upper bound 500

What does it mean? And why so many people are getting it? Long story short: your array has 500 slots, and you want to access nonexistent index at 999.

I don't know if you've written this code, but look at
pawn Код:
if(GettingSpectated[playerid] != 999)
Code inside this if statement won't execute when GettingSpectated for this specific player is not set (i.e if equal 999 don't do that block). But, later in code (outside of this block) you have
pawn Код:
new spectator = GettingSpectated[playerid];
if(PlayerInfo[spectator][pAdmin] >= 2) {
What if GettingSpectated[playerid] is equal 999? Bam, your error. The fix:
pawn Код:
//This line
if(PlayerInfo[spectator][pAdmin] >= 2) {
//Changes into
if(spectator != 999 && PlayerInfo[spectator][pAdmin] >= 2) {
I just swifted through your code, so there might be some other cause, but it's identical example, all you have to do is look for such pitfalls.