Jail time problem.
#1

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
}
Reply
#2

/Bump

Please someone help me to fix it, its urgent.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)