21.12.2013, 13:45
Guys whats wrong on this script? Player is crashing their GTA after the time is 10 seconds. I tried to fix this problem but couldn't find anything wrong. Can someone please help me to fix it?
pawn Код:
// Forward the function to timer to check players every second to see if they're wanted
forward Police_CheckWantedPlayers(playerid);
forward UnjailPlayer(playerid);
// This timer is created every time a player changes his class to police
public Police_CheckWantedPlayers(playerid)
{
// Scan through all players
for (new PlayerToCheck; PlayerToCheck < MAX_PLAYERS; PlayerToCheck++)
{
// check if this player is connected
if (IsPlayerConnected(PlayerToCheck))
{
//Check if that player is wanted
if (GetPlayerWantedLevel(PlayerToCheck) > 0)
SetPlayerMarkerForPlayer(playerid, PlayerToCheck, 0xFF0000FF); // Make that player red to the police-player
else
{
// Reset the playercolor based on the player's class
switch (APlayerData[PlayerToCheck][PlayerClass])
{
case ClassTruckDriver: SetPlayerMarkerForPlayer(playerid, PlayerToCheck, ColorClassTruckDriver);
case ClassPolice: SetPlayerMarkerForPlayer(playerid, PlayerToCheck, ColorClassPolice);
case ClassAssistance: SetPlayerMarkerForPlayer(playerid, PlayerToCheck, ColorClassAssistance);
}
}
}
}
}
// This function gets called when a police player presses the SECUNDAIRY FIRE button (to warn nearby wanted players)
Police_WarnNearbyPlayers(playerid)
{
// Setup local variables
new Float:x, Float:y, Float:z, Name[24], Msg[128];
// Scan through all players
for (new PlayerToCheck; PlayerToCheck < MAX_PLAYERS; PlayerToCheck++)
{
// check if this player is connected
if (IsPlayerConnected(PlayerToCheck))
{
// Check if the current player is wanted
if (GetPlayerWantedLevel(PlayerToCheck) > 0)
{
// Get the position of this player
GetPlayerPos(PlayerToCheck, x, y, z);
// Check if the police-player is in range of the player
if (IsPlayerInRangeOfPoint(playerid, 50.0, x, y, z))
{
GameTextForPlayer(PlayerToCheck, TXT_PoliceWarnPlayer, 3000, 4); // Warn the player
// Also start a timer which gives the player a chance to stop and get a fine
// If he doesn't stop, the player will be sent to jail when he gets fined
if (APlayerData[PlayerToCheck][PoliceWarnedMe] == false)
{
APlayerData[PlayerToCheck][PoliceWarnedMe] = true;
APlayerData[PlayerToCheck][Value_PoliceCanJailMe] = 60;
APlayerData[PlayerToCheck][Timer_PoliceCanJailMe] = SetTimerEx("Timer_PoliceCanJailPlayer", 5000, true, "i", PlayerToCheck);
}
// Let the police player know that he warned the player
GetPlayerName(PlayerToCheck, Name, sizeof(Name));
format(Msg, 128, "{0080FF}**You have given %s a pull-over warning.", Name);
SendClientMessage(playerid, 0xFFFFFFFF, Msg);
}
}
}
}
return 1;
}
// This function gets called when a police player presses the FIRE key (to fine nearby wanted players) when he's on foot
Police_FineNearbyPlayers(playerid)
{
// Setup local variables
new Float:x, Float:y, Float:z;
// Scan through all players
for (new PlayerToCheck; PlayerToCheck < MAX_PLAYERS; PlayerToCheck++)
{
// check if this player is connected
if (IsPlayerConnected(PlayerToCheck))
{
// Check if the other player isn't the same police player
if (PlayerToCheck != playerid)
{
// Check if the current player is wanted and the wanted player is driving slowly (below 30 kph)
if ((GetPlayerWantedLevel(PlayerToCheck) > 0) && (APlayerData[PlayerToCheck][PlayerSpeed] < 30))
{
// Get the position of this player
GetPlayerPos(PlayerToCheck, x, y, z);
// Check if the police-player is in range of the player (police player and wanted player must be within 10 meters of eachother)
if (IsPlayerInRangeOfPoint(playerid, 10.0, x, y, z))
{
// Fine the player
Police_PayFine(playerid, PlayerToCheck);
// Exit the function
return 1;
}
// Check if the police-player is in range of the player (he can be inside his vehicle or on foot)
if (IsPlayerInRangeOfPoint(playerid, 50.0, x, y, z))
{
GameTextForPlayer(PlayerToCheck, TXT_PoliceWarnPlayer, 3000, 4); // Warn the player
// Also start a timer which gives the player a chance to stop and get a fine
// If he doesn't stop, the player will be sent to jail when he gets fined
if (APlayerData[PlayerToCheck][PoliceWarnedMe] == false)
{
APlayerData[PlayerToCheck][PoliceWarnedMe] = true;
APlayerData[PlayerToCheck][Value_PoliceCanJailMe] = DefaultWarnTimeBeforeJail;
APlayerData[PlayerToCheck][Timer_PoliceCanJailMe] = SetTimerEx("Timer_PoliceCanJailPlayer", 5000, true, "i", PlayerToCheck);
}
}
}
}
}
}
return 1;
}
// Pay the police player and fine the player
Police_PayFine(playerid, PlayerToFine)
{
// Setup local variables
new PoliceName[24], FinedPlayerName[24], PoliceMsg[200], PlayerMsg[200], JailTime, Fine;
// Get the names of the police player and the wanted player
GetPlayerName(playerid, PoliceName, 24);
GetPlayerName(PlayerToFine, FinedPlayerName, 24);
// Check if the wanted player's timer hasn't ran out yet
if (APlayerData[PlayerToFine][PoliceCanJailMe] == false)
{
// Calculate the fine
Fine = GetPlayerWantedLevel(PlayerToFine) * DefaultFinePerStar;
// Reward the police player (give cash and points)
RewardPlayer(playerid, Fine, GetPlayerWantedLevel(PlayerToFine));
// Let the police player know that he fined the player
format(PoliceMsg, 200, TXT_PoliceFinedPlayerReward, FinedPlayerName, Fine);
SendClientMessage(playerid, 0xFFFFFFFF, PoliceMsg);
// Let the wanted player pay the fine
RewardPlayer(PlayerToFine, -Fine, 0);
format(PlayerMsg, 200, TXT_PlayerGotFinedByPolice, PoliceName, Fine);
SendClientMessage(PlayerToFine, 0xFFFFFFFF, PlayerMsg);
// Let the other players know that the police player has fined the wanted player
format(PoliceMsg, 200, TXT_PoliceFinedPlayer, PoliceName, FinedPlayerName);
SendClientMessageToAll(0xFFFFFFFF, PoliceMsg);
// Increase the stats for fining a player
APlayerData[playerid][StatsPoliceFined]++;
}
else // The wanted player didn't pull over, now the police player has the right to send him to jail and double the fine
{
// Set jailtime
JailTime = DefaultJailTime;
// Calculate the fine (double the normal fine)
Fine = GetPlayerWantedLevel(PlayerToFine) * DefaultFinePerStar * 2;
// Reward the police player (give cash and points)
RewardPlayer(playerid, Fine, GetPlayerWantedLevel(PlayerToFine));
// Let the police player know that he jailed the wanted player
format(PoliceMsg, 200, TXT_PoliceJailedPlayerReward, FinedPlayerName, Fine);
SendClientMessage(playerid, 0xFFFFFFFF, PoliceMsg);
// Let the wanted player pay a double fine
RewardPlayer(PlayerToFine, -Fine, 0);
// Let the player know he's been jailed and for how long
format(PlayerMsg, 200, TXT_PlayerGotJailedByPolice, PoliceName, (JailTime / 60));
SendClientMessage(PlayerToFine, 0xFFFFFFFF, PlayerMsg);
// Let the other players know that the police player has jailed the wanted player
format(PoliceMsg, 200, TXT_PoliceJailedPlayer, PoliceName, FinedPlayerName, (JailTime / 60));
SendClientMessageToAll(0xFFFFFFFF, PoliceMsg);
// Teleport the player to jail
Police_JailPlayer(PlayerToFine, JailTime);
// Increase the stats for jailing a player
APlayerData[playerid][StatsPoliceJailed]++;
}
// Clear the wanted player's wanted status (the speedometer will automatically clear all data and kill the timer)
SetPlayerWantedLevel(PlayerToFine, 0);
// Also save the data (in case the server crashes, progress would be lost)
PlayerFile_Save(playerid);
PlayerFile_Save(PlayerToFine);
return 1;
}
// This function ports the player inside the jail and sets a timer to get him back out
Police_JailPlayer(playerid, JailTime)
{
// First remove the player from his vehicle
RemovePlayerFromVehicle(playerid);
// Set the player in the virtual world of the jail (so other players cannot see the jailed players on their radar)
SetPlayerVirtualWorld(playerid, WORLD_JAIL);
// Set player interior to the police station in San Fierro
SetPlayerInterior(playerid, 10);
// Put the player inside the jail
SetPlayerPos(playerid, 220.0, 110.0, 999.1);
// Store the jailtime for this player
APlayerData[playerid][PlayerJailed] = JailTime;
// Start the jailtimer, which checks every second if the player is allowed to get out
KillTimer(APlayerData[playerid][PlayerJailedTimer]);
APlayerData[playerid][PlayerJailedTimer] = SetTimerEx("UnjailPlayer", 1000, true, "i", playerid);
// If the player started a job, let it fail
if (APlayerData[playerid][JobStarted] == true)
{
// Stop any job that may have started
switch (APlayerData[playerid][PlayerClass])
{
case ClassTruckDriver: Trucker_EndJob(playerid);
case ClassPolice: Police_EndJob(playerid);
}
// Inform the player that he failed the mission
GameTextForPlayer(playerid, TXT_FailedMission, 5000, 4);
// Reduce the player's cash by 1000
RewardPlayer(playerid, -500, 0);
}
return 1;
}
// This is the timer that runs for every player who's in jail
public UnjailPlayer(playerid)
{
new JailMsg[20];
// Check if the player is allowed to leave yet
if (APlayerData[playerid][PlayerJailed] == 0)
{
// Set the player in the normal world
SetPlayerVirtualWorld(playerid, 0);
// Set player interior to the outside
SetPlayerInterior(playerid, 0);
// Put the player outside the jail (he should spawn at the location where he spawned after login or after choosing a rescue-point)
SpawnPlayer(playerid);
// Also, kill the jailtimer
KillTimer(APlayerData[playerid][PlayerJailedTimer]);
}
else
{
// Show the remaining jailtime (only if the remaining time is below 60 seconds)
if (APlayerData[playerid][PlayerJailed] < 60)
{
format(JailMsg, 20, TXT_JailTimer, APlayerData[playerid][PlayerJailed]);
GameTextForPlayer(playerid, JailMsg, 750, 4);
}
// Decrease the jailtime by 1 second
APlayerData[playerid][PlayerJailed] = APlayerData[playerid][PlayerJailed] - 1;
}
}
// This function gets called when the police player dies (or changes class)
Police_EndJob(playerid)
{
// Kill the PlayerCheckTimer
KillTimer(APlayerData[playerid][PlayerCheckTimer]);
// Scan through all players (to reset them to their default colors for the police-player)
for (new PlayerToCheck; PlayerToCheck < MAX_PLAYERS; PlayerToCheck++)
{
// check if this player is connected
if (IsPlayerConnected(PlayerToCheck))
{
// Reset the playercolor based on the player's class
switch (APlayerData[PlayerToCheck][PlayerClass])
{
case ClassTruckDriver: SetPlayerMarkerForPlayer(playerid, PlayerToCheck, ColorClassTruckDriver);
case ClassPolice: SetPlayerMarkerForPlayer(playerid, PlayerToCheck, ColorClassPolice);
case ClassAssistance: SetPlayerMarkerForPlayer(playerid, PlayerToCheck, ColorClassAssistance);
}
}
}
return 1;
}
// This timer is started when a wanted player was warned by a police player
forward Timer_PoliceCanJailPlayer(playerid);
public Timer_PoliceCanJailPlayer(playerid)
{
// Setup local variables
new Msg[128];
// Let the player know how much time he has left to pull over
format(Msg, 128, "{FF0000}**You have %i seconds to pull-over and stop.", APlayerData[playerid][Value_PoliceCanJailMe]);
SendClientMessage(playerid, 0xFFFFFFFF, Msg);
// Check if the timer has ran out
if (APlayerData[playerid][Value_PoliceCanJailMe] == 0)
{
// Set a switch that indicates that this player didn't stop when he got the warning from the police player
// When the police can catch him now, he'll be sent to jail and the fine is doubled
APlayerData[playerid][PoliceCanJailMe] = true;
// Also kill the timer, as it's not needed anymore
KillTimer(APlayerData[playerid][Timer_PoliceCanJailMe]);
// Let the player know what consequences it will have by not stopping
format(Msg, 128, "{FF0000}**You didn't pull-over and stop in time, police can jail you.");
SendClientMessage(playerid, 0xFFFFFFFF, Msg);
format(Msg, 128, "{FF0000}**You need to pay an extra fine as well.");
SendClientMessage(playerid, 0xFFFFFFFF, Msg);
}
// Reduce the remaining time by 5 seconds
APlayerData[playerid][Value_PoliceCanJailMe] = APlayerData[playerid][Value_PoliceCanJailMe] - 5;
return 1;
}
// This function creates a spikestrip when the player is standing
SpikeStrip_Create(playerid)
{
// Setup local variables
new StripIndex = -1, Float:x, Float:y, Float:z, Float:rot;
// Check if a spikestrip can be created
for (new i; i < MAX_SPIKESTRIPS; i++)
{
if (ASpikeStrips[i][SpikeTime] == 0)
{
StripIndex = i;
break;
}
}
// Check if a free index has been found
if (StripIndex != -1)
{
// Get the position of the player
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, rot);
// Create a new spike-strip object at the location of the player and store the coordinates of the spikestrip
ASpikeStrips[StripIndex][SpikeObject] = CreateObject(2892, x, y, z - 1.0, 0.0, 0.0, rot + 90.0);
ASpikeStrips[StripIndex][SpikeX] = x;
ASpikeStrips[StripIndex][SpikeY] = y;
ASpikeStrips[StripIndex][SpikeZ] = z;
// Set the time for this timer to 1 minute
ASpikeStrips[StripIndex][SpikeTime] = 600;
// Create a timer that checks all players in range to see if they run over the spikestrip
ASpikeStrips[StripIndex][SpikeTimer] = SetTimerEx("CheckSpikeStrip", 100, true, "i", StripIndex);
// Let the player know he created a spikestrip
SendClientMessage(playerid, 0xFFFFFFFF, "{0080FF}**You've placed a spikestrip");
}
else
SendClientMessage(playerid, 0xFFFFFFFF, "{FF0000}**The maximum numbers of spikes are already placed.");
}
// This timer checks the spikestrips that have been planted (they automatically disappear after one minute)
forward CheckSpikeStrip(StripIndex);
public CheckSpikeStrip(StripIndex)
{
// Setup local variables
new vid, panels, doors, lights, tires;
// Decrease the time left for the spikestrip
ASpikeStrips[StripIndex][SpikeTime]--;
// Check if the spikestrip is still allowed to exist
if (ASpikeStrips[StripIndex][SpikeTime] > 0)
{
// Loop through all players
for (new playerid; playerid < MAX_PLAYERS; playerid++)
{
// Check if the player is connected
if (APlayerData[playerid][LoggedIn] == true)
{
// Check if the player is the driver of a vehicle
if (GetPlayerVehicleSeat(playerid) == 0)
{
// Get the vehicleid
vid = GetPlayerVehicleID(playerid);
// Check if the player is near the spikestrip object
if (IsPlayerInRangeOfPoint(playerid, 7.0, ASpikeStrips[StripIndex][SpikeX], ASpikeStrips[StripIndex][SpikeY], ASpikeStrips[StripIndex][SpikeZ]))
{
// Pop all the tires of the player's vehicle
GetVehicleDamageStatus(vid, panels, doors, lights, tires);
UpdateVehicleDamageStatus(vid, panels, doors, lights, 15);
}
}
}
}
}
else
{
// Kill the timer and destroy the spikestrip object
DestroyObject(ASpikeStrips[StripIndex][SpikeObject]);
KillTimer(ASpikeStrips[StripIndex][SpikeTimer]);
}
return 1;
}
// This function sends the given message to all police players
Police_SendMessage(PoliceMessage[])
{
for (new PoliceID; PoliceID < MAX_PLAYERS; PoliceID++) // Loop through all players
if (APlayerData[PoliceID][LoggedIn] == true) // Check if this player has logged in
if (APlayerData[PoliceID][PlayerClass] == ClassPolice) // Check if this player is a police player
SendClientMessage(PoliceID, 0xFFFFFFFF, PoliceMessage); // Send the message to the police player
}