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:
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
Config = {}
Config.Framework = "qb" -- 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
qb-core/client/events.lua | RegisterNetEvent('QBCore:Command:SpawnVehicle')
function Trim(value)
if value then
return (string.gsub(value, "^%s*(.-)%s*$", "%1"))
else
return ""
end
end
RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName)
local ped = PlayerPedId()
local hash = GetHashKey(vehName)
local veh = GetVehiclePedIsUsing(ped)
if not IsModelInCdimage(hash) then return end
RequestModel(hash)
while not HasModelLoaded(hash) do
Wait(0)
end
if IsPedInAnyVehicle(ped) then
SetEntityAsMissionEntity(veh, true, true)
DeleteVehicle(veh)
end
local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false)
TaskWarpPedIntoVehicle(ped, vehicle, -1)
SetVehicleFuelLevel(vehicle, 100.0)
SetVehicleDirtLevel(vehicle, 0.0)
SetModelAsNoLongerNeeded(hash)
TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle))
local plate = Trim(GetVehicleNumberPlateText(vehicle)):upper()
TriggerEvent('jc_core:excluirVehiculo', plate)
end)
If you have any questions or problems, do not hesitate to contact us:
Discord: https://discord.gg/EDuZKM7Zuv
Last updated