mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-17 13:56:02 +01:00
Compare commits
1 Commits
v2.3.2
...
feat/qb-co
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70a1487420 |
@@ -23,17 +23,14 @@ end)
|
|||||||
|
|
||||||
RegisterNetEvent("ND:revivePlayer", function()
|
RegisterNetEvent("ND:revivePlayer", function()
|
||||||
if source == "" then return end
|
if source == "" then return end
|
||||||
local oldPed = cache.ped
|
local veh = GetVehiclePedIsIn(cache.ped)
|
||||||
local veh = GetVehiclePedIsIn(oldPed)
|
|
||||||
local seat = cache.seat
|
local seat = cache.seat
|
||||||
local coords = GetEntityCoords(oldPed)
|
local coords = GetEntityCoords(cache.ped)
|
||||||
local armor = GetPedArmour(oldPed)
|
NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, GetEntityHeading(cache.ped), true, true, false)
|
||||||
|
|
||||||
NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, GetEntityHeading(oldPed), true, true, false)
|
|
||||||
|
|
||||||
local ped = PlayerPedId()
|
local ped = PlayerPedId()
|
||||||
if oldPed ~= ped then
|
if cache.ped ~= ped then
|
||||||
DeleteEntity(oldPed)
|
DeleteEntity(cache.ped)
|
||||||
ClearAreaOfPeds(coords.x, coords.y, coords.z, 0.2, false)
|
ClearAreaOfPeds(coords.x, coords.y, coords.z, 0.2, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -46,7 +43,6 @@ RegisterNetEvent("ND:revivePlayer", function()
|
|||||||
SetBlockingOfNonTemporaryEvents(ped, false)
|
SetBlockingOfNonTemporaryEvents(ped, false)
|
||||||
SetPedCanRagdollFromPlayerImpact(ped, true)
|
SetPedCanRagdollFromPlayerImpact(ped, true)
|
||||||
ClearPedTasksImmediately(ped)
|
ClearPedTasksImmediately(ped)
|
||||||
SetPedArmour(ped, armor)
|
|
||||||
|
|
||||||
if veh and veh ~= 0 then
|
if veh and veh ~= 0 then
|
||||||
SetPedIntoVehicle(ped, veh, seat)
|
SetPedIntoVehicle(ped, veh, seat)
|
||||||
|
|||||||
@@ -15,8 +15,7 @@ Config = {
|
|||||||
requireKeys = GetConvarInt("core:requireKeys", 1) == 1,
|
requireKeys = GetConvarInt("core:requireKeys", 1) == 1,
|
||||||
useInventoryForKeys = GetConvarInt("core:useInventoryForKeys", 1) == 1,
|
useInventoryForKeys = GetConvarInt("core:useInventoryForKeys", 1) == 1,
|
||||||
groups = json.decode(GetConvar("core:groups", "[]")),
|
groups = json.decode(GetConvar("core:groups", "[]")),
|
||||||
compatibility = json.decode(GetConvar("core:compatibility", "[]")),
|
compatibility = json.decode(GetConvar("core:compatibility", "[]"))
|
||||||
lockpickTries = GetConvarInt("core:lockpickTries", 3)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Discord rich presence.
|
-- Discord rich presence.
|
||||||
|
|||||||
@@ -1,14 +1,4 @@
|
|||||||
return {
|
return {
|
||||||
{
|
|
||||||
garageType = "land",
|
|
||||||
groups = {"lsfd"},
|
|
||||||
ped = vector4(370.9027, -593.8090, 28.8681, 73.6009),
|
|
||||||
vehicleSpawns = {
|
|
||||||
vec4(366.7840, -591.4883, 28.7261, 339.6823),
|
|
||||||
vec4(365.0753, -582.8641, 28.7156, 135.0064),
|
|
||||||
vec4(357.4239, -604.7719, 28.6767, 177.1355),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
garageType = "land",
|
garageType = "land",
|
||||||
groups = {"sahp", "lspd", "bcso"},
|
groups = {"sahp", "lspd", "bcso"},
|
||||||
@@ -250,52 +240,4 @@ return {
|
|||||||
vector4(216.56, -801.90, 30.79, 69.39)
|
vector4(216.56, -801.90, 30.79, 69.39)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
garageType = "land",
|
|
||||||
ped = vector4(587.5941, 2744.2844, 42.0691, 181.0514),
|
|
||||||
vehicleSpawns = {
|
|
||||||
vector4(584.3921, 2721.3599, 41.6483, 184.3260),
|
|
||||||
vector4(577.1069, 2736.2322, 41.6097, 184.6912),
|
|
||||||
vector4(577.9459, 2721.0010, 41.6481, 185.1414),
|
|
||||||
vector4(574.1685, 2735.7288, 41.6397, 184.5562)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
garageType = "land",
|
|
||||||
ped = vector4(2746.1726, 3458.7378, 55.8272, 245.1009),
|
|
||||||
vehicleSpawns = {
|
|
||||||
vector4(2768.2136, 3456.2710, 55.2840, 67.7897),
|
|
||||||
vector4(2759.3218, 3451.1448, 55.4786, 248.0150),
|
|
||||||
vector4(2763.6526, 3445.0544, 55.4741, 66.9754),
|
|
||||||
vector4(2787.2947, 3467.1001, 54.9407, 247.4356),
|
|
||||||
vector4(2773.9514, 3471.6238, 55.0407, 246.8264)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
garageType = "land",
|
|
||||||
ped = vector4(120.4042, 6623.5190, 31.9593, 228.8283),
|
|
||||||
vehicleSpawns = {
|
|
||||||
vector4(155.9047, 6593.3252, 31.4343, 359.3789),
|
|
||||||
vector4(155.7900, 6602.6978, 31.4463, 358.8232),
|
|
||||||
vector4(145.8267, 6614.0996, 31.4007, 178.7948),
|
|
||||||
vector4(145.6977, 6602.8950, 31.4397, 181.0616),
|
|
||||||
vector4(132.4042, 6585.2139, 31.5501, 91.0906)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
garageType = "heli",
|
|
||||||
groups = {"lspd"},
|
|
||||||
ped = vector4(465.6194, -985.4730, 43.6918, 0.8591),
|
|
||||||
vehicleSpawns = {
|
|
||||||
vector4(449.3105, -981.1057, 44.0788, 359.6042)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
garageType = "heli",
|
|
||||||
groups = {"lsfd"},
|
|
||||||
ped = vector4(339.6271, -581.0325, 74.1656, 267.8232),
|
|
||||||
vehicleSpawns = {
|
|
||||||
vector4(351.3463, -588.1304, 74.1698, 108.5617)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -356,9 +356,8 @@ AddStateBagChangeHandler("locked", nil, function(bagName, key, value, reserved,
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local function getProps(veh)
|
lib.callback.register("ND_Vehicles:getProps", function(netId)
|
||||||
if not veh or not DoesEntityExist(veh) then return end
|
local veh = getVehFromNetId(netId)
|
||||||
|
|
||||||
local props = lib.getVehicleProperties(veh)
|
local props = lib.getVehicleProperties(veh)
|
||||||
local colorPrimary, colorSecondary = GetVehicleColours(veh)
|
local colorPrimary, colorSecondary = GetVehicleColours(veh)
|
||||||
if not props then return end
|
if not props then return end
|
||||||
@@ -369,18 +368,7 @@ local function getProps(veh)
|
|||||||
props.className = vehicleClassNames[GetVehicleClass(veh)]
|
props.className = vehicleClassNames[GetVehicleClass(veh)]
|
||||||
props.makeName = GetLabelText(GetMakeNameFromVehicleModel(props.model))
|
props.makeName = GetLabelText(GetMakeNameFromVehicleModel(props.model))
|
||||||
props.modelName = GetLabelText(GetDisplayNameFromVehicleModel(props.model))
|
props.modelName = GetLabelText(GetDisplayNameFromVehicleModel(props.model))
|
||||||
|
|
||||||
return props
|
return props
|
||||||
end
|
|
||||||
|
|
||||||
lib.callback.register("ND_Vehicles:getProps", function(netId)
|
|
||||||
local veh = getVehFromNetId(netId)
|
|
||||||
return getProps(veh)
|
|
||||||
end)
|
|
||||||
|
|
||||||
lib.callback.register("ND_Vehicles:getPropsFromCurrentVeh", function()
|
|
||||||
local veh = GetVehiclePedIsIn(cache.ped)
|
|
||||||
return getProps(veh)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
lib.callback.register("ND_Vehicles:getVehicleModelMakeLabel", function(model)
|
lib.callback.register("ND_Vehicles:getVehicleModelMakeLabel", function(model)
|
||||||
@@ -609,7 +597,7 @@ local function lockpickVehicle()
|
|||||||
}
|
}
|
||||||
|
|
||||||
lib.requestAnimDict("veh@break_in@0h@p_m_one@")
|
lib.requestAnimDict("veh@break_in@0h@p_m_one@")
|
||||||
for i=1, Config.lockpickTries do
|
for i=1, 7 do
|
||||||
TaskPlayAnimAdvanced(cache.ped, "veh@break_in@0h@p_m_one@", "std_force_entry_ds", pos.x, pos.y, pos.z+0.025, rot.x, rot.y, rot.z, 8.0, 8.0, 1800, 28, 0.1)
|
TaskPlayAnimAdvanced(cache.ped, "veh@break_in@0h@p_m_one@", "std_force_entry_ds", pos.x, pos.y, pos.z+0.025, rot.x, rot.y, rot.z, 8.0, 8.0, 1800, 28, 0.1)
|
||||||
local dificulty = dificulties[math.random(1, #dificulties)]
|
local dificulty = dificulties[math.random(1, #dificulties)]
|
||||||
local success = lib.skillCheck(dificulty)
|
local success = lib.skillCheck(dificulty)
|
||||||
|
|||||||
@@ -1 +1,73 @@
|
|||||||
if not lib.table.contains(Config.compatibility, "qb") then return end
|
if not lib.table.contains(Config.compatibility, "qb") then return end
|
||||||
|
|
||||||
|
local QBCore = {}
|
||||||
|
|
||||||
|
QBCore.Config = QBConfig
|
||||||
|
QBCore.Shared = QBShared
|
||||||
|
QBCore.ClientCallbacks = {}
|
||||||
|
QBCore.ServerCallbacks = {}
|
||||||
|
|
||||||
|
QBCore.Players = {}
|
||||||
|
QBCore.Functions = {}
|
||||||
|
QBCore.Player_Buckets = {}
|
||||||
|
QBCore.Entity_Buckets = {}
|
||||||
|
QBCore.UsableItems = {}
|
||||||
|
|
||||||
|
function QBCore.Functions.GetCoords(entity)
|
||||||
|
local coords = GetEntityCoords(entity)
|
||||||
|
local heading = GetEntityHeading(entity)
|
||||||
|
return vec4(coords.x, coords.y, coords.z, heading)
|
||||||
|
end
|
||||||
|
|
||||||
|
function QBCore.Functions.GetIdentifier(source, idtype)
|
||||||
|
if GetConvarInt("sv_fxdkMode", 0) == 1 then return "license:fxdk" end
|
||||||
|
return GetPlayerIdentifierByType(source, idtype or "license")
|
||||||
|
end
|
||||||
|
|
||||||
|
function QBCore.Functions.GetSource(identifier)
|
||||||
|
for src, _ in pairs(NDCore.players) do
|
||||||
|
local idens = GetPlayerIdentifiers(src)
|
||||||
|
for _, id in pairs(idens) do
|
||||||
|
if identifier == id then
|
||||||
|
return src
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local function createPlayer(player)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function QBCore.Functions.GetPlayer(source)
|
||||||
|
if type(source) == "number" then
|
||||||
|
return createPlayer(NDCore.players[source])
|
||||||
|
else
|
||||||
|
return createPlayer(NDCore.players[QBCore.Functions.GetSource(source)])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function QBCore.Functions.GetPlayerByCitizenId(citizenid)
|
||||||
|
for src in pairs(NDCore.players) do
|
||||||
|
if NDCore.players[src].id == citizenid then
|
||||||
|
return NDCore.players[src]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- function QBCore.Functions.GetOfflinePlayerByCitizenId(citizenid)
|
||||||
|
-- return QBCore.Player.GetOfflinePlayer(citizenid)
|
||||||
|
-- end
|
||||||
|
|
||||||
|
-- function QBCore.Functions.GetPlayerByLicense(license)
|
||||||
|
-- return QBCore.Player.GetPlayerByLicense(license)
|
||||||
|
-- end
|
||||||
|
|
||||||
|
function QBCore.Functions.GetPlayerByPhone(number)
|
||||||
|
for src in pairs(NDCore.players) do
|
||||||
|
if NDCore.players[src].phonenumber == number then
|
||||||
|
return createPlayer(NDCore.players[src])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
author "Andyyy#7666"
|
author "Andyyy#7666"
|
||||||
description "ND Framework Core"
|
description "ND Framework Core"
|
||||||
version "2.3.2"
|
version "2.1.2"
|
||||||
|
|
||||||
fx_version "cerulean"
|
fx_version "cerulean"
|
||||||
game "gta5"
|
game "gta5"
|
||||||
@@ -37,10 +37,7 @@ files {
|
|||||||
"compatibility/**/locale.lua"
|
"compatibility/**/locale.lua"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependency "oxmysql"
|
||||||
"ox_lib",
|
|
||||||
"oxmysql"
|
|
||||||
}
|
|
||||||
|
|
||||||
-- below were used with backwards compatibility but could interfere with resources checking if the resources are started.
|
-- below were used with backwards compatibility but could interfere with resources checking if the resources are started.
|
||||||
-- provide "es_extended"
|
-- provide "es_extended"
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ local moneyActions = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lib.addCommand("setmoney", {
|
lib.addCommand("setmoney", {
|
||||||
help = "Admin command, set a players money.",
|
help = "Admin command, manage player money.",
|
||||||
restricted = "group.admin",
|
restricted = "group.admin",
|
||||||
params = {
|
params = {
|
||||||
{
|
{
|
||||||
@@ -54,7 +54,7 @@ lib.addCommand("setmoney", {
|
|||||||
duration = 10000
|
duration = 10000
|
||||||
})
|
})
|
||||||
|
|
||||||
if not source or source == 0 then return end
|
if not source then return end
|
||||||
TriggerClientEvent("chat:addMessage", source, {
|
TriggerClientEvent("chat:addMessage", source, {
|
||||||
color = {50, 100, 235},
|
color = {50, 100, 235},
|
||||||
multiline = true,
|
multiline = true,
|
||||||
@@ -96,7 +96,7 @@ lib.addCommand("setjob", {
|
|||||||
duration = 10000
|
duration = 10000
|
||||||
})
|
})
|
||||||
|
|
||||||
if not source or source == 0 then return end
|
if not source then return end
|
||||||
TriggerClientEvent("chat:addMessage", source, {
|
TriggerClientEvent("chat:addMessage", source, {
|
||||||
color = {50, 100, 235},
|
color = {50, 100, 235},
|
||||||
multiline = true,
|
multiline = true,
|
||||||
@@ -155,7 +155,7 @@ lib.addCommand("setgroup", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if not source or source == 0 then return end
|
if not source then return end
|
||||||
TriggerClientEvent("chat:addMessage", source, {
|
TriggerClientEvent("chat:addMessage", source, {
|
||||||
color = {50, 100, 235},
|
color = {50, 100, 235},
|
||||||
multiline = true,
|
multiline = true,
|
||||||
@@ -164,7 +164,7 @@ lib.addCommand("setgroup", {
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
lib.addCommand("skin", {
|
lib.addCommand("skin", {
|
||||||
help = "Admin command, show character clothing menu for player.",
|
help = "Admin command, set player into character clothing menu.",
|
||||||
restricted = "group.admin",
|
restricted = "group.admin",
|
||||||
params = {
|
params = {
|
||||||
{
|
{
|
||||||
@@ -178,7 +178,7 @@ lib.addCommand("skin", {
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
lib.addCommand("character", {
|
lib.addCommand("character", {
|
||||||
help = "Admin command, show character selection menu for player.",
|
help = "Admin command, set player into character selection menu.",
|
||||||
restricted = "group.admin",
|
restricted = "group.admin",
|
||||||
params = {
|
params = {
|
||||||
{
|
{
|
||||||
@@ -206,7 +206,7 @@ lib.addCommand("pay", {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, function(source, args, raw)
|
}, function(source, args, raw)
|
||||||
if not source or source == 0 then return end
|
if not source then return end
|
||||||
|
|
||||||
local player = NDCore.getPlayer(source)
|
local player = NDCore.getPlayer(source)
|
||||||
local targetPlayer = NDCore.getPlayer(args.target)
|
local targetPlayer = NDCore.getPlayer(args.target)
|
||||||
@@ -262,22 +262,38 @@ lib.addCommand("pay", {
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
lib.addCommand("unlock", {
|
lib.addCommand("unlock", {
|
||||||
help = "Admin Command, force unlock a vehicle.",
|
help = "Admin Command, force unlock vehicle.",
|
||||||
restricted = "group.admin",
|
restricted = "group.admin",
|
||||||
}, function(source, args, raw)
|
}, function(source, args, raw)
|
||||||
local ped = GetPlayerPed(source)
|
local ped = GetPlayerPed(source)
|
||||||
|
local playerVeh = GetVehiclePedIsIn(ped)
|
||||||
local coords = GetEntityCoords(ped)
|
local coords = GetEntityCoords(ped)
|
||||||
local veh = lib.getClosestVehicle(coords, 2.5, true)
|
local vehicles = GetAllVehicles()
|
||||||
|
local maxDistance = 2.0
|
||||||
|
local closestVehicle
|
||||||
|
|
||||||
if not veh then return end
|
if not playerVeh or playerVeh == 0 or not DoesEntityExist(playerVeh) then
|
||||||
|
for i=1, #vehicles do
|
||||||
local state = Entity(veh).state
|
local vehicle = vehicles[i]
|
||||||
state.hotwired = true
|
local vehicleCoords = GetEntityCoords(vehicle)
|
||||||
state.locked = false
|
local distance = #(coords-vehicleCoords)
|
||||||
|
|
||||||
|
if distance < maxDistance then
|
||||||
|
maxDistance = distance
|
||||||
|
closestVehicle = vehicle
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not closestVehicle or not DoesEntityExist(closestVehicle) then return end
|
||||||
|
local state = Entity(closestVehicle).state
|
||||||
|
state.locked = false
|
||||||
|
else
|
||||||
|
local state = Entity(playerVeh).state
|
||||||
|
state.hotwired = true
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
lib.addCommand("revive", {
|
lib.addCommand("revive", {
|
||||||
help = "Admin command, revive a player.",
|
help = "Admin command, revive player.",
|
||||||
restricted = "group.admin",
|
restricted = "group.admin",
|
||||||
params = {
|
params = {
|
||||||
{
|
{
|
||||||
@@ -305,36 +321,48 @@ lib.addCommand("dv", {
|
|||||||
}
|
}
|
||||||
}, function(source, args, raw)
|
}, function(source, args, raw)
|
||||||
local ped = GetPlayerPed(source)
|
local ped = GetPlayerPed(source)
|
||||||
local coords = GetEntityCoords(ped)
|
local veh = GetVehiclePedIsIn(ped)
|
||||||
local count = 0
|
if veh and veh ~= 0 and DoesEntityExist(veh) then
|
||||||
local message = nil
|
|
||||||
local veh = lib.getClosestVehicle(coords, 3.0)
|
|
||||||
|
|
||||||
if args.range then
|
|
||||||
local vehicles = lib.getNearbyVehicles(coords, args.range)
|
|
||||||
count = #vehicles
|
|
||||||
|
|
||||||
for i=1, count do
|
|
||||||
local veh = vehicles[i]
|
|
||||||
DeleteEntity(veh.vehicle)
|
|
||||||
end
|
|
||||||
elseif veh then
|
|
||||||
DeleteEntity(veh)
|
DeleteEntity(veh)
|
||||||
count = 1
|
return TriggerClientEvent("chat:addMessage", source, {
|
||||||
|
color = {50, 100, 235},
|
||||||
|
multiline = true,
|
||||||
|
args = {"Staff action", "deleted 1 vehicle"}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local count = 0
|
||||||
|
local coords = GetEntityCoords(ped)
|
||||||
|
if args.range then
|
||||||
|
for _, veh in ipairs(GetAllVehicles()) do
|
||||||
|
local vehDist = #(GetEntityCoords(veh) - coords)
|
||||||
|
if vehDist < args.range then
|
||||||
|
DeleteEntity(veh)
|
||||||
|
count += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return TriggerClientEvent("chat:addMessage", source, {
|
||||||
|
color = {50, 100, 235},
|
||||||
|
multiline = true,
|
||||||
|
args = {"Staff action", ("deleted %d vehicles"):format(count)}
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
if count == 0 then
|
local closest, dist
|
||||||
message = {"Staff action [dv]", "no vehicles found"}
|
for _, veh in ipairs(GetAllVehicles()) do
|
||||||
elseif count == 1 then
|
local vehDist = #(GetEntityCoords(veh) - coords)
|
||||||
message = {"Staff action [dv]", "deleted 1 vehicle"}
|
if vehDist < 5.0 and not closest or (dist and dist > vehDist) then
|
||||||
else
|
closest = veh
|
||||||
message = {"Staff action [dv]", ("deleted %d vehicles"):format(count)}
|
dist = vehDist
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not closest then return "no vehicle found nearby" end
|
||||||
|
DeleteEntity(closest)
|
||||||
TriggerClientEvent("chat:addMessage", source, {
|
TriggerClientEvent("chat:addMessage", source, {
|
||||||
color = {50, 100, 235},
|
color = {50, 100, 235},
|
||||||
multiline = true,
|
multiline = true,
|
||||||
args = message
|
args = {"Staff action", "deleted 1 vehicle"}
|
||||||
})
|
})
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -405,7 +433,7 @@ lib.addCommand("unfreeze", {
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
lib.addCommand("vehicle", {
|
lib.addCommand("vehicle", {
|
||||||
help = "Admin command, spawn a vehicle.",
|
help = "Admin command, unfreeze a player.",
|
||||||
restricted = "group.admin",
|
restricted = "group.admin",
|
||||||
params = {
|
params = {
|
||||||
{
|
{
|
||||||
@@ -438,45 +466,3 @@ lib.addCommand("vehicle", {
|
|||||||
Wait(100)
|
Wait(100)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
lib.addCommand("claim-veh", {
|
|
||||||
help = "Admin command, add a copy of the vehicle you're inside to players garage.",
|
|
||||||
restricted = "group.admin",
|
|
||||||
params = {
|
|
||||||
{
|
|
||||||
name = "target",
|
|
||||||
type = "playerId",
|
|
||||||
help = "Target player's server id"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, function(source, args, raw)
|
|
||||||
local player = NDCore.getPlayer(source)
|
|
||||||
if not player then return end
|
|
||||||
|
|
||||||
local targetPlayer = NDCore.getPlayer(args.target)
|
|
||||||
if not targetPlayer then
|
|
||||||
return player.notify({
|
|
||||||
title = "Player not found!",
|
|
||||||
description = "Target player not found, make sure they select a charcter!",
|
|
||||||
type = "error"
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local properties = lib.callback.await("ND_Vehicles:getPropsFromCurrentVeh", source)
|
|
||||||
if not properties then
|
|
||||||
return player.notify({
|
|
||||||
title = "Vehicle data not found!",
|
|
||||||
description = "The vehicle properties data was not found!",
|
|
||||||
type = "error"
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
NDCore.setVehicleOwned(targetPlayer.id, properties, true)
|
|
||||||
|
|
||||||
player.notify({
|
|
||||||
title = "Vehicle added!",
|
|
||||||
description = ("The vehicle has now been added to %s's garage!"):format(targetPlayer.name),
|
|
||||||
type = "success"
|
|
||||||
})
|
|
||||||
end)
|
|
||||||
|
|||||||
@@ -1,10 +1,3 @@
|
|||||||
function NDCore.getPlayerIdentifierByType(src, indentifierType)
|
|
||||||
if Config.sv_lan then
|
|
||||||
return ("%s:sv_lan"):format(indentifierType)
|
|
||||||
end
|
|
||||||
return GetPlayerIdentifierByType(src, indentifierType)
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param src number
|
---@param src number
|
||||||
---@return table
|
---@return table
|
||||||
function NDCore.getPlayer(src)
|
function NDCore.getPlayer(src)
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ Config = {
|
|||||||
adminDiscordRoles = json.decode(GetConvar("core:adminDiscordRoles", "[]")),
|
adminDiscordRoles = json.decode(GetConvar("core:adminDiscordRoles", "[]")),
|
||||||
groupRoles = json.decode(GetConvar("core:groupRoles", "[]")),
|
groupRoles = json.decode(GetConvar("core:groupRoles", "[]")),
|
||||||
multiCharacter = false,
|
multiCharacter = false,
|
||||||
compatibility = json.decode(GetConvar("core:compatibility", "[]")),
|
compatibility = json.decode(GetConvar("core:compatibility", "[]"))
|
||||||
sv_lan = GetConvar("sv_lan", "false") == "true",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SetConvarServerInfo("Discord", Config.discordInvite)
|
SetConvarServerInfo("Discord", Config.discordInvite)
|
||||||
@@ -44,11 +43,6 @@ local function getIdentifierList(src)
|
|||||||
list[identifierType] = identifier
|
list[identifierType] = identifier
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if Config.sv_lan then
|
|
||||||
list[Config.characterIdentifier] = NDCore.getPlayerIdentifierByType(src, Config.characterIdentifier)
|
|
||||||
end
|
|
||||||
|
|
||||||
return list
|
return list
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -58,10 +52,6 @@ AddEventHandler("playerJoining", function(oldId)
|
|||||||
PlayersInfo[src] = tempPlayersInfo[oldTempId]
|
PlayersInfo[src] = tempPlayersInfo[oldTempId]
|
||||||
tempPlayersInfo[oldTempId] = nil
|
tempPlayersInfo[oldTempId] = nil
|
||||||
|
|
||||||
if Config.sv_lan then
|
|
||||||
lib.addPrincipal(("player.%s"):format(src), "group.admin")
|
|
||||||
end
|
|
||||||
|
|
||||||
if Config.multiCharacter then return end
|
if Config.multiCharacter then return end
|
||||||
Wait(3000)
|
Wait(3000)
|
||||||
|
|
||||||
@@ -113,7 +103,7 @@ AddEventHandler("playerConnecting", function(name, setKickReason, deferrals)
|
|||||||
|
|
||||||
if mainIdentifier and Config.discordBotToken ~= "false" and Config.discordGuildId ~= "false" then
|
if mainIdentifier and Config.discordBotToken ~= "false" and Config.discordGuildId ~= "false" then
|
||||||
discordInfo = checkDiscordIdentifier(identifiers)
|
discordInfo = checkDiscordIdentifier(identifiers)
|
||||||
if not discordInfo and Config.discordMemeberRequired and not Config.sv_lan then
|
if not discordInfo and Config.discordMemeberRequired then
|
||||||
deferrals.done(("Your discord was not found, join our discord here: %s."):format(Config.discordInvite))
|
deferrals.done(("Your discord was not found, join our discord here: %s."):format(Config.discordInvite))
|
||||||
Wait(0)
|
Wait(0)
|
||||||
end
|
end
|
||||||
@@ -122,17 +112,6 @@ AddEventHandler("playerConnecting", function(name, setKickReason, deferrals)
|
|||||||
deferrals.update("Connecting...")
|
deferrals.update("Connecting...")
|
||||||
Wait(0)
|
Wait(0)
|
||||||
|
|
||||||
if Config.sv_lan then
|
|
||||||
tempPlayersInfo[tempSrc] = {
|
|
||||||
identifiers = {
|
|
||||||
[Config.characterIdentifier] = "sv_lan"
|
|
||||||
},
|
|
||||||
discord = discordInfo
|
|
||||||
}
|
|
||||||
deferrals.done()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if mainIdentifier then
|
if mainIdentifier then
|
||||||
tempPlayersInfo[tempSrc] = {
|
tempPlayersInfo[tempSrc] = {
|
||||||
identifiers = identifiers,
|
identifiers = identifiers,
|
||||||
@@ -160,7 +139,7 @@ AddEventHandler("onResourceStop", function(name)
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
MySQL.ready(function()
|
SetTimeout(500, function()
|
||||||
NDCore.loadSQL({
|
NDCore.loadSQL({
|
||||||
"database/characters.sql",
|
"database/characters.sql",
|
||||||
"database/vehicles.sql"
|
"database/vehicles.sql"
|
||||||
@@ -177,7 +156,7 @@ RegisterNetEvent("ND:playerEliminated", function(info)
|
|||||||
})
|
})
|
||||||
end)
|
end)
|
||||||
|
|
||||||
RegisterNetEvent("ND:updateClothing", function(clothing)
|
RegisterNetEvent("ND::updateClothing", function(clothing)
|
||||||
local src = source
|
local src = source
|
||||||
local player = NDCore.getPlayer(src)
|
local player = NDCore.getPlayer(src)
|
||||||
if not player or not clothing or type(clothing) ~= "table" then return end
|
if not player or not clothing or type(clothing) ~= "table" then return end
|
||||||
|
|||||||
@@ -113,8 +113,8 @@ local function createCharacterTable(info)
|
|||||||
TriggerEvent("ND:moneyChange", self.source, key, value, "set", reason)
|
TriggerEvent("ND:moneyChange", self.source, key, value, "set", reason)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self), key)
|
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
|
||||||
TriggerEvent("ND:updateCharacter", self, key)
|
TriggerEvent("ND:updateCharacter", self)
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param key string|table
|
---@param key string|table
|
||||||
@@ -128,8 +128,8 @@ local function createCharacterTable(info)
|
|||||||
else
|
else
|
||||||
self.metadata[key] = value
|
self.metadata[key] = value
|
||||||
end
|
end
|
||||||
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self), "metadata")
|
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
|
||||||
TriggerEvent("ND:updateCharacter", self, "metadata")
|
TriggerEvent("ND:updateCharacter", self)
|
||||||
return self.metadata
|
return self.metadata
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -221,24 +221,12 @@ local function createCharacterTable(info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if licenses then
|
if licenses then
|
||||||
local found = false
|
self.metadata.licenses[#licenses+1] = license
|
||||||
|
|
||||||
for i=1, #licenses do
|
|
||||||
if licenses[i].type == licenseType then
|
|
||||||
self.metadata.licenses[i] = license
|
|
||||||
found = true
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not found then
|
|
||||||
self.metadata.licenses[#licenses+1] = license
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
self.metadata.licenses = {license}
|
self.metadata.licenses = {license}
|
||||||
end
|
end
|
||||||
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self), "metadata")
|
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
|
||||||
TriggerEvent("ND:updateCharacter", self, "metadata")
|
TriggerEvent("ND:updateCharacter", self)
|
||||||
end
|
end
|
||||||
|
|
||||||
function self.getLicense(identifier)
|
function self.getLicense(identifier)
|
||||||
@@ -341,15 +329,12 @@ local function createCharacterTable(info)
|
|||||||
---@param rank number
|
---@param rank number
|
||||||
---@param isJob boolean
|
---@param isJob boolean
|
||||||
---@return boolean
|
---@return boolean
|
||||||
function self.addGroup(name, rank, customGroup, isJob)
|
function self.addGroup(name, rank, info, isJob)
|
||||||
local groupRank = tonumber(rank) or 1
|
local groupRank = tonumber(rank) or 1
|
||||||
local groupInfo = lib.table.deepclone(Config.groups?[name] or {})
|
local groupInfo = info or Config.groups?[name]
|
||||||
local bossRank = groupInfo?.minimumBossRank
|
local bossRank = groupInfo?.minimumBossRank
|
||||||
|
|
||||||
for k, v in pairs(customGroup or {}) do
|
-- if not groupInfo then return end
|
||||||
groupInfo[k] = v
|
|
||||||
end
|
|
||||||
|
|
||||||
if isJob then
|
if isJob then
|
||||||
for _, group in pairs(self.groups) do
|
for _, group in pairs(self.groups) do
|
||||||
group.isJob = nil
|
group.isJob = nil
|
||||||
@@ -362,13 +347,12 @@ local function createCharacterTable(info)
|
|||||||
rankName = groupInfo?.ranks?[groupRank] or groupRank,
|
rankName = groupInfo?.ranks?[groupRank] or groupRank,
|
||||||
rank = groupRank,
|
rank = groupRank,
|
||||||
isJob = isJob,
|
isJob = isJob,
|
||||||
isBoss = bossRank and groupRank >= bossRank,
|
isBoss = bossRank and groupRank >= bossRank
|
||||||
metadata = groupInfo.metadata or {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if not isJob then
|
if not isJob then
|
||||||
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self), "groups")
|
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
|
||||||
TriggerEvent("ND:updateCharacter", self, "groups")
|
TriggerEvent("ND:updateCharacter", self)
|
||||||
end
|
end
|
||||||
|
|
||||||
lib.addPrincipal(self.source, ("group.%s"):format(name))
|
lib.addPrincipal(self.source, ("group.%s"):format(name))
|
||||||
@@ -393,9 +377,8 @@ local function createCharacterTable(info)
|
|||||||
end
|
end
|
||||||
|
|
||||||
self.groups[name] = nil
|
self.groups[name] = nil
|
||||||
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self), "groups")
|
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
|
||||||
TriggerEvent("ND:updateCharacter", self, "groups")
|
TriggerEvent("ND:updateCharacter", self)
|
||||||
TriggerEvent("ND:groupRemoved", self, group)
|
|
||||||
lib.removePrincipal(self.source, ("group.%s"):format(name))
|
lib.removePrincipal(self.source, ("group.%s"):format(name))
|
||||||
return group
|
return group
|
||||||
end
|
end
|
||||||
@@ -410,8 +393,8 @@ local function createCharacterTable(info)
|
|||||||
self.job = job.name
|
self.job = job.name
|
||||||
self.jobInfo = job
|
self.jobInfo = job
|
||||||
end
|
end
|
||||||
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self), "job")
|
self.triggerEvent("ND:updateCharacter", removeCharacterFunctions(self))
|
||||||
TriggerEvent("ND:updateCharacter", self, "job")
|
TriggerEvent("ND:updateCharacter", self)
|
||||||
return job
|
return job
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -438,7 +421,7 @@ end
|
|||||||
---@param info table
|
---@param info table
|
||||||
---@return table
|
---@return table
|
||||||
function NDCore.newCharacter(src, info)
|
function NDCore.newCharacter(src, info)
|
||||||
local identifier = NDCore.getPlayerIdentifierByType(src, Config.characterIdentifier)
|
local identifier = GetPlayerIdentifierByType(src, Config.characterIdentifier)
|
||||||
if not identifier then return end
|
if not identifier then return end
|
||||||
|
|
||||||
local charInfo = {
|
local charInfo = {
|
||||||
@@ -480,7 +463,7 @@ end
|
|||||||
function NDCore.fetchCharacter(id, src)
|
function NDCore.fetchCharacter(id, src)
|
||||||
local result
|
local result
|
||||||
if src then
|
if src then
|
||||||
result = MySQL.query.await("SELECT * FROM nd_characters WHERE charid = ? and identifier = ?", {id, NDCore.getPlayerIdentifierByType(src, Config.characterIdentifier)})
|
result = MySQL.query.await("SELECT * FROM nd_characters WHERE charid = ? and identifier = ?", {id, GetPlayerIdentifierByType(src, Config.characterIdentifier)})
|
||||||
else
|
else
|
||||||
result = MySQL.query.await("SELECT * FROM nd_characters WHERE charid = ?", {id})
|
result = MySQL.query.await("SELECT * FROM nd_characters WHERE charid = ?", {id})
|
||||||
end
|
end
|
||||||
@@ -509,7 +492,7 @@ end
|
|||||||
---@return table
|
---@return table
|
||||||
function NDCore.fetchAllCharacters(src)
|
function NDCore.fetchAllCharacters(src)
|
||||||
local characters = {}
|
local characters = {}
|
||||||
local result = MySQL.query.await("SELECT * FROM nd_characters WHERE identifier = ?", {NDCore.getPlayerIdentifierByType(src, Config.characterIdentifier)})
|
local result = MySQL.query.await("SELECT * FROM nd_characters WHERE identifier = ?", {GetPlayerIdentifierByType(src, Config.characterIdentifier)})
|
||||||
|
|
||||||
for i=1, #result do
|
for i=1, #result do
|
||||||
local info = result[i]
|
local info = result[i]
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
local ox_inventory
|
local ox_inventory
|
||||||
local inventoryStarted = false
|
local inventoryStarted = false
|
||||||
local spawnedPlayerVehicles = {}
|
local spawnedPlayerVehicles = {}
|
||||||
local vehicleTypes = json.decode(GetResourceKvpString("ND_Core:vehTypes") or "[]")
|
|
||||||
|
|
||||||
NDCore.isResourceStarted("ox_inventory", function(started)
|
NDCore.isResourceStarted("ox_inventory", function(started)
|
||||||
inventoryStarted = started
|
inventoryStarted = started
|
||||||
@@ -9,24 +8,16 @@ NDCore.isResourceStarted("ox_inventory", function(started)
|
|||||||
ox_inventory = exports.ox_inventory
|
ox_inventory = exports.ox_inventory
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local function getVehicleType(coords, model)
|
local function getVehicleType(model)
|
||||||
if vehicleTypes[model] then
|
local tempVehicle = CreateVehicle(model, 0, 0, 0, 0, true, true)
|
||||||
return vehicleTypes[model]
|
|
||||||
end
|
|
||||||
|
|
||||||
local tempVehicle = CreateVehicle(model, coords.x, coords.y, coords.z-5.0, coords.w, true, false)
|
|
||||||
local time = os.time()
|
local time = os.time()
|
||||||
|
while not DoesEntityExist(tempVehicle) and time-os.time() < 5 do Wait(5) end
|
||||||
while not DoesEntityExist(tempVehicle) and os.time()-time < 5 do Wait(0) end
|
|
||||||
if not DoesEntityExist(tempVehicle) then return end
|
if not DoesEntityExist(tempVehicle) then return end
|
||||||
|
local entityType = GetVehicleType(tempVehicle)
|
||||||
local vehType = GetVehicleType(tempVehicle)
|
|
||||||
DeleteEntity(tempVehicle)
|
DeleteEntity(tempVehicle)
|
||||||
|
return entityType
|
||||||
vehicleTypes[model] = vehType
|
|
||||||
SetResourceKvp("ND_Core:vehTypes", json.encode(vehicleTypes))
|
|
||||||
|
|
||||||
return vehType
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function generatePlate()
|
local function generatePlate()
|
||||||
@@ -108,15 +99,6 @@ function NDCore.getVehicle(entity)
|
|||||||
DeleteEntity(entity)
|
DeleteEntity(entity)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- remvoe vehicle from db.
|
|
||||||
function self.remove(keepEntity)
|
|
||||||
if not keepEntity and DoesEntityExist(entity) then
|
|
||||||
DeleteEntity(entity)
|
|
||||||
end
|
|
||||||
MySQL.query("DELETE FROM nd_vehicles WHERE id = ?", {self.id})
|
|
||||||
end
|
|
||||||
|
|
||||||
--- set vehicle properties
|
--- set vehicle properties
|
||||||
---@param props table
|
---@param props table
|
||||||
function self.setProperties(props)
|
function self.setProperties(props)
|
||||||
@@ -174,22 +156,13 @@ function NDCore.getVehicle(entity)
|
|||||||
|
|
||||||
function self.setMetadata(key, value)
|
function self.setMetadata(key, value)
|
||||||
self.metadata[key] = value
|
self.metadata[key] = value
|
||||||
|
|
||||||
if DoesEntityExist(entity) then
|
if DoesEntityExist(entity) then
|
||||||
local state = Entity(self.entity).state
|
local state = Entity(self.entity).state
|
||||||
|
local metadata = state.metadata
|
||||||
if not state.metadata then
|
metadata[key] = value
|
||||||
state.metadata = self.metadata
|
state.metadata = metadata
|
||||||
else
|
|
||||||
state.metadata[key] = value
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
if not self.id or not self.owner then return end
|
||||||
if not self.id or not self.owner then
|
|
||||||
lib.print.debug(('Skipped storing metadata for vehicle %s as it does not have an id/owner associated with it.'):format(self.entity))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
MySQL.query("UPDATE nd_vehicles SET metadata = ? WHERE id = ?", {json.encode(self.metadata), self.id})
|
MySQL.query("UPDATE nd_vehicles SET metadata = ? WHERE id = ?", {json.encode(self.metadata), self.id})
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -280,14 +253,14 @@ function NDCore.createVehicle(info)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local model = info.model or properties.model
|
local model = info.model or properties.model
|
||||||
local vehType = getVehicleType(spawnCoords, model)
|
local vehType = getVehicleType(model)
|
||||||
if not vehType then
|
if not vehType then
|
||||||
return Citizen.Trace("NDCore.createVehicle", "vehType not found")
|
return Citizen.Trace("NDCore.createVehicle", "vehType not found")
|
||||||
end
|
end
|
||||||
|
|
||||||
local veh = CreateVehicleServerSetter(model, vehType, spawnCoords.x, spawnCoords.y, spawnCoords.z, spawnCoords.w)
|
local veh = CreateVehicleServerSetter(model, vehType, spawnCoords.x, spawnCoords.y, spawnCoords.z, spawnCoords.w)
|
||||||
local time = os.time()
|
local time = os.time()
|
||||||
while not DoesEntityExist(veh) and os.time()-time < 5 do Wait(5) end
|
while not DoesEntityExist(veh) and time-os.time() < 5 do Wait(5) end
|
||||||
if not veh or not DoesEntityExist(veh) then
|
if not veh or not DoesEntityExist(veh) then
|
||||||
return Citizen.Trace("NDCore.createVehicle", "vehicle entity doesn't exist")
|
return Citizen.Trace("NDCore.createVehicle", "vehicle entity doesn't exist")
|
||||||
end
|
end
|
||||||
@@ -438,8 +411,7 @@ function NDCore.spawnOwnedVehicle(source, vehicleId, coords, heading)
|
|||||||
if not player then return end
|
if not player then return end
|
||||||
|
|
||||||
local vehicle = NDCore.getVehicleById(vehicleId)
|
local vehicle = NDCore.getVehicleById(vehicleId)
|
||||||
if not vehicle or vehicle.owner ~= player.id then return end
|
if not vehicle or not vehicle.available or vehicle.owner ~= player.id then return end
|
||||||
if not vehicle.available and not vehicle.impounded then return end
|
|
||||||
|
|
||||||
MySQL.query.await("UPDATE nd_vehicles SET stored = ? WHERE id = ?", {0, vehicleId})
|
MySQL.query.await("UPDATE nd_vehicles SET stored = ? WHERE id = ?", {0, vehicleId})
|
||||||
|
|
||||||
@@ -729,11 +701,6 @@ RegisterNetEvent("ND_Vehicles:takeVehicle", function(vehId, locations)
|
|||||||
local vehicle = NDCore.getVehicleById(vehId)
|
local vehicle = NDCore.getVehicleById(vehId)
|
||||||
local player = NDCore.getPlayer(src)
|
local player = NDCore.getPlayer(src)
|
||||||
if not player or not vehicle or vehicle.owner ~= player.id then return end
|
if not player or not vehicle or vehicle.owner ~= player.id then return end
|
||||||
|
|
||||||
local info = NDCore.spawnOwnedVehicle(src, vehicle.id, isParkingAvailable(locations))
|
|
||||||
if not info then return end
|
|
||||||
TriggerClientEvent("ND_Vehicles:blip", src, info.netId, true)
|
|
||||||
|
|
||||||
if vehicle.impounded then
|
if vehicle.impounded then
|
||||||
local reclaimPrice = vehicle.metadata.impoundReclaimPrice or 200
|
local reclaimPrice = vehicle.metadata.impoundReclaimPrice or 200
|
||||||
if not player.deductMoney("bank", reclaimPrice, "Vehicle impound reclaim") then
|
if not player.deductMoney("bank", reclaimPrice, "Vehicle impound reclaim") then
|
||||||
@@ -752,6 +719,10 @@ RegisterNetEvent("ND_Vehicles:takeVehicle", function(vehId, locations)
|
|||||||
})
|
})
|
||||||
MySQL.query.await("UPDATE nd_vehicles SET impounded = ? WHERE id = ?", {0, vehicle.id})
|
MySQL.query.await("UPDATE nd_vehicles SET impounded = ? WHERE id = ?", {0, vehicle.id})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local info = NDCore.spawnOwnedVehicle(src, vehicle.id, isParkingAvailable(locations))
|
||||||
|
if not info then return end
|
||||||
|
TriggerClientEvent("ND_Vehicles:blip", src, info.netId, true)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
lib.callback.register("ND_Vehicles:getOwnedVehicles", function(src)
|
lib.callback.register("ND_Vehicles:getOwnedVehicles", function(src)
|
||||||
|
|||||||
Reference in New Issue
Block a user