Jota Dev Parking - Ilegal NPC`s

Here you can see the documentation to learn how to install our store's NPC and parking control system.

How to start the script for its correct operation:

Install dependency, works for ESX and QB-Core

Put in your server.cfg

# JotaDev Parking | Ilegal NPC´s
ensure jc_npcs

This is the script configuration:

Config = {}

Config.Framework = "esx" -- Inserte esx | para ESX o qb | para QB-Core

Config.LocPickItem = "lockpick"
Config.DestroyLockPick = 1 -- Destroza la ganzua tras 1 intento

Config.AdvancedLockPickItem = "advancedlockpick"
Config.DestroyAdvancedLockPick = 3 -- Destroza la ganzua avanzada tras 3 intentos

Config.ProbabilityCallPolice = 35 -- Probabilidad la cual genera para llamar a la policia sobre 100% para cada ganzuado de los coches de los npc

Config.SpawnZones = {
    {
        name = "Garage Rojo",
        spawnSpots = {
            { pos = vector3(-312.479, -770.203, 33.964), heading = 339.67 },
            { pos = vector3(-287.128, -747.678, 33.964), heading = 157.67 },
            { pos = vector3(-273.222, -764.953, 33.964), heading = 69.67 },
            { pos = vector3(-356.347, -759.838, 33.968), heading = 280.67 },
            { pos = vector3(-341.911, -760.328, 43.606), heading = 269.67 },
            { pos = vector3(-323.135, -751.574, 43.605), heading = 165.67 },
            { pos = vector3(-275.730, -768.378, 43.605), heading = 62.67 },
            { pos = vector3(-322.939, -750.946, 33.968), heading = 156.67 },
            { pos = vector3(-341.300, -767.271, 33.969), heading = 94.67 },
            { pos = vector3(-310.575, -755.668, 38.779), heading = 155.67 },
        },
        vehicles = { "sultan", "toros", "buccaneer2", "dominator3", "astron", "deity", "bestiagts", "comet6" },
    },
    {
        name = "Garage Lujo",
        spawnSpots = {
            { pos = vector3(360.4423, 293.8222, 103.52), heading = 249.67 },
            { pos = vector3(357.7977, 286.6299, 103.50), heading = 252.67 },
            { pos = vector3(359.9601, 272.3106, 103.10), heading = 155.67 },
            { pos = vector3(364.0373, 270.7085, 103.07), heading = 338.67 },
            { pos = vector3(375.0644, 264.9645, 103.01), heading = 336.67 },
            { pos = vector3(389.2043, 273.1504, 103.00), heading = 73.67 },
            { pos = vector3(391.7491, 280.8003, 102.98), heading = 250.67 },
            { pos = vector3(386.9699, 290.9280, 103.04), heading = 161.67 },
            { pos = vector3(374.8834, 283.8346, 103.18), heading = 165.67 },
        },
        vehicles = { "italirsx", "italigto", "pariah", "schlagen", "tenf", "ignus", "xa21", "bati2", "manchez" },
    },
}

Config.Lenguaje = {
    title = "Interacción con NPC",
    hostage = "👥 Coger de Rehén",
    hostage_desc = "Usa a este NPC como escudo humano",
    follow = "🚶 Hacer que te siga",
    follow_desc = "Este NPC te seguirá a todas partes.",
    kneel = "🧎 Arrodillarse",
    kneel_desc = "Hace que el NPC que te sigue se arrodille.",
    release = "🏃 Soltar",
    release_desc = "El NPC dejará de seguirte y saldrá corriendo.",
    search = "🔪 Cachear NPC",
    search_desc = "Buscar objetos o dinero",
    cancel = "❌ Cancelar"
}

Config.RewardsChance = {
    enabled = true,
    percent = 70 -- Porcentaje de probabilidad de encontrar algo (0-100)
}

Config.Rewards = {
    money = {
        enabled = true,
        min = 100,
        max = 500
    },
    items = {
        enabled = false,
        list = {
            { name = "water", min = 1, max = 3 },
            { name = "lockpick", min = 1, max = 2 },
        }
    }
}


if Config.Framework == 'qb' then
    QBCore = exports['qb-core']:GetCoreObject()
elseif Config.Framework == 'esx' then
    ESX = exports["es_extended"]:getSharedObject()
else
    print '^1[^6jc_npcs^1] ^2Framework No encontrada, ingrese esx o qb^0'
    return
end

Add to your vehicle spawn code:

es_extended/client/functions.lua | ESX.Game.SpawnVehicle

function Trim(value)
    if value then
        return (string.gsub(value, "^%s*(.-)%s*$", "%1"))
    else
        return ""
    end
end

function ESX.Game.SpawnVehicle(vehicleModel, coords, heading, cb, networked)
    if cb and not ESX.IsFunctionReference(cb) then
        error("Invalid callback function")
    end

    local model = type(vehicleModel) == "number" and vehicleModel or joaat(vehicleModel)
    local vector = type(coords) == "vector3" and coords or vec(coords.x, coords.y, coords.z)
    local isNetworked = networked == nil or networked

    local playerCoords = GetEntityCoords(ESX.PlayerData.ped)
    if not vector or not playerCoords then
        return
    end

    local dist = #(playerCoords - vector)
    if dist > 424 then -- Onesync infinity Range (https://docs.fivem.net/docs/scripting-reference/onesync/)
        local executingResource = GetInvokingResource() or "Unknown"
        return error(("Resource ^5%s^1 Tried to spawn vehicle on the client but the position is too far away (Out of onesync range)."):format(executingResource))
    end

    local promise = not cb and promise.new()
    CreateThread(function()
        local modelHash = ESX.Streaming.RequestModel(model)
        if not modelHash then
            if promise then
                return promise:reject(("Tried to spawn invalid vehicle - ^5%s^7!"):format(model))
            end
           error(("Tried to spawn invalid vehicle - ^5%s^7!"):format(model))
        end

        local vehicle = CreateVehicle(model, vector.x, vector.y, vector.z, heading, isNetworked, true)

        if networked then
            local id = NetworkGetNetworkIdFromEntity(vehicle)
            SetNetworkIdCanMigrate(id, true)
            SetEntityAsMissionEntity(vehicle, true, true)
        end
        SetVehicleHasBeenOwnedByPlayer(vehicle, true)
        SetVehicleNeedsToBeHotwired(vehicle, false)
        SetModelAsNoLongerNeeded(model)
        SetVehRadioStation(vehicle, "OFF")
        local plate = Trim(GetVehicleNumberPlateText(vehicle)):upper()
        TriggerEvent('jc_core:excluirVehiculo', plate)
        
        RequestCollisionAtCoord(vector.x, vector.y, vector.z)
        while not HasCollisionLoadedAroundEntity(vehicle) do
            Wait(0)
        end

        if promise then
            promise:resolve(vehicle)
        elseif cb then
            cb(vehicle)
        end
    end)

    if promise then
        return Citizen.Await(promise)
    end
end

If you have any questions or problems, do not hesitate to contact us:

Last updated