mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-17 05:56:01 +01:00
wip(server/vehicle): vehicle functions & management
This commit is contained in:
@@ -36,46 +36,95 @@ local function generateVehiclePlate(newPlate)
|
|||||||
return plate
|
return plate
|
||||||
end
|
end
|
||||||
|
|
||||||
local function createVehicleInfo(info)
|
local function getVehicleDatabaseInfo(vehicle)
|
||||||
local entity = info.entity
|
if not vehicle then return end
|
||||||
|
local stored = vehicle.stored == 1
|
||||||
|
local impounded = vehicle.impounded == 1
|
||||||
|
return {
|
||||||
|
id = vehicle.id,
|
||||||
|
owner = vehicle.owner,
|
||||||
|
plate = vehicle.plate,
|
||||||
|
properties = json.decode(vehicle.properties) or {}
|
||||||
|
stored = stored,
|
||||||
|
impounded = impounded,
|
||||||
|
stolen = vehicle.stolen == 1,
|
||||||
|
available = not impounded and not stored
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
function info.delete()
|
function NDCore.getVehicleById(vehicleId)
|
||||||
|
local result = MySQL.query.await("SELECT * FROM nd_vehicles WHERE id = ?", {vehicleId})
|
||||||
|
return getVehicleDatabaseInfo(result?[1])
|
||||||
|
end
|
||||||
|
|
||||||
|
function NDCore.getVehicle(info)
|
||||||
|
local infoType = type(info) == "table"
|
||||||
|
local entity = infoType and info.entity or info
|
||||||
|
if not DoesEntityExist(entity) then return end
|
||||||
|
|
||||||
|
if not infoType then
|
||||||
|
info = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
local state = Entity(entity).state
|
||||||
|
local self = {
|
||||||
|
entity = entity,
|
||||||
|
id = info.id or state.id,
|
||||||
|
owner = info.owner or state.owner,
|
||||||
|
keys = info.keys or state.keys,
|
||||||
|
properties = info.properties or state.props,
|
||||||
|
locked = info.locked or state.locked,
|
||||||
|
hotwired = info.hotwired or state.hotwired,
|
||||||
|
metadata = info.metadata or state.metadata,
|
||||||
|
netId = info.netId or NetworkGetNetworkIdFromEntity(entity)
|
||||||
|
}
|
||||||
|
|
||||||
|
-- delete vehicle
|
||||||
|
function self.delete()
|
||||||
if not DoesEntityExist(entity) then return end
|
if not DoesEntityExist(entity) then return end
|
||||||
DeleteEntity(entity)
|
DeleteEntity(entity)
|
||||||
end
|
end
|
||||||
|
|
||||||
function info.properties(props)
|
-- set vehicle properties
|
||||||
|
function self.setProperties(props)
|
||||||
if not DoesEntityExist(entity) then return end
|
if not DoesEntityExist(entity) then return end
|
||||||
|
local properties = type(props) == "string" and json.decode(props) or props
|
||||||
local state = Entity(entity).state
|
local state = Entity(entity).state
|
||||||
state.props = type(props) == "string" and json.decode(props) or props
|
state.props = properties
|
||||||
|
self.properties = properties
|
||||||
|
local id = self.id
|
||||||
|
if not id then return end
|
||||||
|
MySQL.query.await("UPDATE nd_vehicles SET properties = ? WHERE id = ?", {json.encode(properties), id})
|
||||||
end
|
end
|
||||||
|
|
||||||
function info.plate(plate)
|
-- update vehicle plate
|
||||||
|
function self.plate(plate)
|
||||||
if not DoesEntityExist(entity) or MySQL.scalar.await("SELECT 1 FROM nd_vehicles WHERE plate = ?", {plate}) then return end
|
if not DoesEntityExist(entity) or MySQL.scalar.await("SELECT 1 FROM nd_vehicles WHERE plate = ?", {plate}) then return end
|
||||||
SetVehicleNumberPlateText(entity, plate)
|
if self.properties then
|
||||||
|
self.properties.plate = plate
|
||||||
|
local state = Entity(entity).state
|
||||||
|
state.props = self.properties
|
||||||
|
end
|
||||||
|
|
||||||
|
if not self.id or not self.owner then return end
|
||||||
|
MySQL.query("UPDATE nd_vehicles SET plate = ? WHERE id = ?", {plate, self.id})
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
return info
|
function self.store(delete)
|
||||||
|
if delete then
|
||||||
|
self.delete()
|
||||||
|
end
|
||||||
|
if not self.id or not self.owner then return end
|
||||||
|
MySQL.query.await("UPDATE nd_vehicles SET properties = ?, stored = ? WHERE id = ?", {json.encode(self.properties), 1, self.id})
|
||||||
|
-- player.triggerEvent("ND_Vehicles:returnVehicles", NDCore.getVehicles(player.id))
|
||||||
end
|
end
|
||||||
|
|
||||||
function NDCore.getVehicle(entity)
|
if self.id then
|
||||||
if not DoesEntityExist(entity) then return end
|
playerOwnedVehicles[self.id] = self
|
||||||
|
end
|
||||||
|
|
||||||
local state = Entity(entity).state
|
return self
|
||||||
local vehicleId = state.id
|
|
||||||
if not vehicleId then return end
|
|
||||||
|
|
||||||
return createVehicleInfo({
|
|
||||||
entity = entity,
|
|
||||||
owner = state.owner,
|
|
||||||
id = vehicleId,
|
|
||||||
properties = state.props,
|
|
||||||
locked = state.locked,
|
|
||||||
keys = state.keys,
|
|
||||||
hotwired = state.hotwired,
|
|
||||||
metadata = state.metadata
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function NDCore.getVehicles(characterId)
|
function NDCore.getVehicles(characterId)
|
||||||
@@ -84,13 +133,10 @@ function NDCore.getVehicles(characterId)
|
|||||||
|
|
||||||
local vehicles = {}
|
local vehicles = {}
|
||||||
for _, vehicle in pairs(result) do
|
for _, vehicle in pairs(result) do
|
||||||
vehicles[#vehicles+1] = {
|
local info = getVehicleDatabaseInfo(vehicle)
|
||||||
available = vehicle.stored == 1,
|
if info then
|
||||||
owner = vehicle.owner,
|
vehicles[#vehicles+1] = info
|
||||||
id = vehicle.id,
|
end
|
||||||
plate = vehicle.plate,
|
|
||||||
properties = json.decode(vehicle.properties)
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
return vehicles
|
return vehicles
|
||||||
end
|
end
|
||||||
@@ -179,12 +225,7 @@ function NDCore.createVehicle(info)
|
|||||||
state.locked = true
|
state.locked = true
|
||||||
local keys = info.keys or {}
|
local keys = info.keys or {}
|
||||||
|
|
||||||
if vehicleId then
|
if not vehicleId then
|
||||||
playerOwnedVehicles[vehicleId] = {
|
|
||||||
netid = netId,
|
|
||||||
entity = veh
|
|
||||||
}
|
|
||||||
else
|
|
||||||
vehicleId = ("temp_%s%d"):format(string.char(math.random(65, 90)), math.random(1, 999999))
|
vehicleId = ("temp_%s%d"):format(string.char(math.random(65, 90)), math.random(1, 999999))
|
||||||
end
|
end
|
||||||
if not properties.plate then
|
if not properties.plate then
|
||||||
@@ -201,25 +242,30 @@ function NDCore.createVehicle(info)
|
|||||||
local vehicleName
|
local vehicleName
|
||||||
if inventoryStarted and Config.useInventoryForKeys then
|
if inventoryStarted and Config.useInventoryForKeys then
|
||||||
for charId, _ in pairs(keys) do
|
for charId, _ in pairs(keys) do
|
||||||
|
local playerSource = charId == owner and info.source
|
||||||
|
if not playerSource then
|
||||||
local player = NDCore.getPlayers("id", charId, true)[1]
|
local player = NDCore.getPlayers("id", charId, true)[1]
|
||||||
local source = player and player.source
|
playerSource = player and player.source
|
||||||
if source then
|
|
||||||
if not vehicleName then
|
|
||||||
vehicleName = lib.callback.await("ND_Vehicles:getVehicleModelMakeLabel", source, model) or ""
|
|
||||||
end
|
end
|
||||||
NDCore.giveVehicleAccess(source, veh, true, vehicleId, netId, properties and properties.plate, model, vehicleName, owner)
|
if playerSource then
|
||||||
|
if not vehicleName then
|
||||||
|
vehicleName = lib.callback.await("ND_Vehicles:getVehicleModelMakeLabel", playerSource, model) or ""
|
||||||
|
end
|
||||||
|
NDCore.giveVehicleAccess(playerSource, veh, true, vehicleId, netId, properties and properties.plate, model, vehicleName, owner)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return createVehicleInfo({
|
return NDCore.getVehicle({
|
||||||
entity = veh,
|
entity = veh,
|
||||||
netId = netId,
|
|
||||||
owner = owner,
|
|
||||||
id = vehicleId,
|
id = vehicleId,
|
||||||
|
owner = owner,
|
||||||
|
keys = keys
|
||||||
properties = properties,
|
properties = properties,
|
||||||
locked = true,
|
locked = true,
|
||||||
keys = keys
|
hotwired = state.hotwired,
|
||||||
|
metadata = state.metadata
|
||||||
|
netId = netId,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -228,8 +274,9 @@ function NDCore.transferVehicle(vehicleId, fromSource, toSource)
|
|||||||
local playerFrom = NDCore.getPlayer(fromSource)
|
local playerFrom = NDCore.getPlayer(fromSource)
|
||||||
MySQL.query.await("UPDATE nd_vehicles SET owner = ? WHERE id = ?", {playerTo.id, vehicleId})
|
MySQL.query.await("UPDATE nd_vehicles SET owner = ? WHERE id = ?", {playerTo.id, vehicleId})
|
||||||
|
|
||||||
if not playerOwnedVehicles[vehicleId] then return end
|
local info = playerOwnedVehicles[vehicleId]
|
||||||
local veh = NetworkGetEntityFromNetworkId(playerOwnedVehicles[vehicleId].netid)
|
if not info then return end
|
||||||
|
local veh = NetworkGetEntityFromNetworkId(info.netId)
|
||||||
if not veh then
|
if not veh then
|
||||||
playerFrom.notify({
|
playerFrom.notify({
|
||||||
title = "Ownership transfered",
|
title = "Ownership transfered",
|
||||||
@@ -254,7 +301,7 @@ function NDCore.transferVehicle(vehicleId, fromSource, toSource)
|
|||||||
[playerTo.id] = true
|
[playerTo.id] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
playerFrom.triggerEvent("ND_Vehicles:blip", playerOwnedVehicles[vehicleId].netid, false)
|
playerFrom.triggerEvent("ND_Vehicles:blip", info.netId, false)
|
||||||
|
|
||||||
playerFrom.notify({
|
playerFrom.notify({
|
||||||
title = "Ownership transfered",
|
title = "Ownership transfered",
|
||||||
@@ -314,57 +361,25 @@ function NDCore.giveVehicleKeys(vehicle, source, target)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function NDCore.spawnOwnedVehicle(source, vehicleId, coords, heading)
|
function NDCore.spawnOwnedVehicle(source, vehicleId, coords, heading)
|
||||||
local player = NDCore.getPlayer(source)
|
local player = NDCore.getPlayer(src)
|
||||||
if not player then return end
|
if not player then return end
|
||||||
local vehicles = NDCore.getVehicles(player.id)
|
|
||||||
for _, vehicle in pairs(vehicles) do
|
local vehicle = NDCore.getVehicleById(nil, vehicleId)
|
||||||
if vehicle.id == vehicleId and vehicle.owner == player.id then
|
if not vehicle or not vehicle.available or vehicle.owner ~= player.id then return end
|
||||||
|
|
||||||
|
vehicle.stored = false
|
||||||
MySQL.query.await("UPDATE nd_vehicles SET stored = ? WHERE id = ?", {0, vehicleId})
|
MySQL.query.await("UPDATE nd_vehicles SET stored = ? WHERE id = ?", {0, vehicleId})
|
||||||
vehicle.available = false
|
player.triggerEvent("ND_Vehicles:returnVehicles", NDCore.getVehicles(player.id))
|
||||||
player.triggerEvent("ND_Vehicles:returnVehicles", vehicles)
|
|
||||||
return NDCore.createVehicle({
|
return NDCore.createVehicle({
|
||||||
owner = vehicle.owner,
|
owner = player.id,
|
||||||
model = vehicle.properties.model,
|
model = vehicle.properties.model,
|
||||||
coords = vec4(coords.x, coords.y, coords.z, coords.w or heading),
|
coords = vec4(coords.x, coords.y, coords.z, coords.w or coords.heading or heading),
|
||||||
properties = vehicle.properties,
|
properties = vehicle.properties,
|
||||||
vehicleId = vehicleId,
|
vehicleId = vehicleId,
|
||||||
source = source
|
source = source
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function NDCore.returnVehicleToGarage(source, veh, properties)
|
|
||||||
local player = NDCore.getPlayer(source)
|
|
||||||
if not DoesEntityExist(veh) then return end
|
|
||||||
|
|
||||||
local vehID = Entity(veh).state.id
|
|
||||||
local vehicles = NDCore.getVehicles(player.id)
|
|
||||||
|
|
||||||
for _, vehicle in pairs(vehicles) do
|
|
||||||
if vehicle.owner == player.id and vehicle.id == vehID then
|
|
||||||
MySQL.query.await("UPDATE nd_vehicles SET properties = ?, stored = ? WHERE id = ?", {json.encode(properties), 1, vehID})
|
|
||||||
player.triggerEvent("ND_Vehicles:returnVehicles", NDCore.getVehicles(player.id))
|
|
||||||
DeleteEntity(veh)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function NDCore.saveVehicleProperties(source, veh, properties)
|
|
||||||
local player = NDCore.getPlayer(source)
|
|
||||||
if not DoesEntityExist(veh) then return end
|
|
||||||
|
|
||||||
local vehID = Entity(veh).state.id
|
|
||||||
local vehicles = NDCore.getVehicles(player.id)
|
|
||||||
|
|
||||||
for _, vehicle in pairs(vehicles) do
|
|
||||||
if vehicle.owner == player.id and vehicle.id == vehID then
|
|
||||||
MySQL.query.await("UPDATE nd_vehicles SET properties = ? WHERE id = ?", {json.encode(properties), vehID})
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
RegisterNetEvent("ND_Vehicles:lockpick", function(netId, success)
|
RegisterNetEvent("ND_Vehicles:lockpick", function(netId, success)
|
||||||
local veh = NetworkGetEntityFromNetworkId(netId)
|
local veh = NetworkGetEntityFromNetworkId(netId)
|
||||||
@@ -444,7 +459,7 @@ end
|
|||||||
local function lockNearestVehicle(source, vehId, metadata)
|
local function lockNearestVehicle(source, vehId, metadata)
|
||||||
local ped = GetPlayerPed(source)
|
local ped = GetPlayerPed(source)
|
||||||
local pedCoords = GetEntityCoords(ped)
|
local pedCoords = GetEntityCoords(ped)
|
||||||
local veh = playerOwnedVehicles[vehId] and playerOwnedVehicles[vehId].entity
|
local veh = playerOwnedVehicles[vehId]?.entity
|
||||||
|
|
||||||
if veh and DoesEntityExist(veh) then
|
if veh and DoesEntityExist(veh) then
|
||||||
local vehCoords = GetEntityCoords(veh)
|
local vehCoords = GetEntityCoords(veh)
|
||||||
@@ -553,3 +568,14 @@ RegisterNetEvent("ND_Vehicles:disableKey", function(slot)
|
|||||||
ox_inventory:SetMetadata(src, slot, key.metadata)
|
ox_inventory:SetMetadata(src, slot, key.metadata)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
RegisterCommand("test", function(src, args, rawCommand)
|
||||||
|
local ped = GetPlayerPed(src)
|
||||||
|
local coords = GetEntityCoords(ped)
|
||||||
|
NDCore.spawnOwnedVehicle(src, 35, vec4(coords.x, coords.y, coords.z, GetEntityHeading(ped)))
|
||||||
|
end, false)
|
||||||
|
|
||||||
|
RegisterCommand("test2", function(source, args, rawCommand)
|
||||||
|
local src = source
|
||||||
|
local properties = lib.callback.await("ND_Vehicles:getProps", src)
|
||||||
|
NDCore.setVehicleOwned(src, properties, true)
|
||||||
|
end, false)
|
||||||
|
|||||||
Reference in New Issue
Block a user