mirror of
https://github.com/ND-Framework/ND_Core.git
synced 2026-08-17 05:56:01 +01:00
refactor(server/vehicle): functions & more
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
local ox_inventory
|
local ox_inventory
|
||||||
local inventoryStarted = false
|
local inventoryStarted = false
|
||||||
local playerOwnedVehicles = {}
|
local spawnedPlayerVehicles = {}
|
||||||
|
|
||||||
NDCore.isResourceStarted("ox_inventory", function(started)
|
NDCore.isResourceStarted("ox_inventory", function(started)
|
||||||
inventoryStarted = started
|
inventoryStarted = started
|
||||||
@@ -36,6 +36,10 @@ local function generateVehiclePlate(newPlate)
|
|||||||
return plate
|
return plate
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function generateTemporaryVehicleId()
|
||||||
|
return ("temp_%s%d"):format(string.char(math.random(65, 90)), math.random(1, 999999))
|
||||||
|
end
|
||||||
|
|
||||||
local function getVehicleDatabaseInfo(vehicle)
|
local function getVehicleDatabaseInfo(vehicle)
|
||||||
if not vehicle then return end
|
if not vehicle then return end
|
||||||
local stored = vehicle.stored == 1
|
local stored = vehicle.stored == 1
|
||||||
@@ -44,7 +48,7 @@ local function getVehicleDatabaseInfo(vehicle)
|
|||||||
id = vehicle.id,
|
id = vehicle.id,
|
||||||
owner = vehicle.owner,
|
owner = vehicle.owner,
|
||||||
plate = vehicle.plate,
|
plate = vehicle.plate,
|
||||||
properties = json.decode(vehicle.properties) or {}
|
properties = json.decode(vehicle.properties) or {},
|
||||||
stored = stored,
|
stored = stored,
|
||||||
impounded = impounded,
|
impounded = impounded,
|
||||||
stolen = vehicle.stolen == 1,
|
stolen = vehicle.stolen == 1,
|
||||||
@@ -256,121 +260,116 @@ function NDCore.createVehicle(info)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return NDCore.getVehicle({
|
return NDCore.getVehicle(entity)
|
||||||
entity = veh,
|
|
||||||
id = vehicleId,
|
|
||||||
owner = owner,
|
|
||||||
keys = keys
|
|
||||||
properties = properties,
|
|
||||||
locked = true,
|
|
||||||
hotwired = state.hotwired,
|
|
||||||
metadata = state.metadata
|
|
||||||
netId = netId,
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function NDCore.transferVehicle(vehicleId, fromSource, toSource)
|
--- transfer ownership of a vehicle between players
|
||||||
local playerTo = NDCore.getPlayer(toSource)
|
---@param vehicleId number|string
|
||||||
|
---@param fromSource number
|
||||||
|
---@param toSource number
|
||||||
|
---@return boolean
|
||||||
|
function NDCore.transferVehicleOwnership(vehicleId, fromSource, toSource)
|
||||||
local playerFrom = NDCore.getPlayer(fromSource)
|
local playerFrom = NDCore.getPlayer(fromSource)
|
||||||
|
local playerTo = NDCore.getPlayer(toSource)
|
||||||
|
if not playerFrom or not playerTo then return end
|
||||||
|
|
||||||
|
local vehicle = NDCore.getVehicleById(vehicleId)
|
||||||
|
if not vehicle or vehicle.owner ~= playerFrom.id then return end
|
||||||
|
|
||||||
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})
|
||||||
|
local vehicleInfo = spawnedPlayerVehicles[vehicleId]
|
||||||
|
|
||||||
local info = playerOwnedVehicles[vehicleId]
|
if vehicleInfo then
|
||||||
if not info then return end
|
local veh, netId, model = vehicleInfo.entity, vehicleInfo.netId, GetEntityModel(veh)
|
||||||
local veh = NetworkGetEntityFromNetworkId(info.netId)
|
playerFrom.triggerEvent("ND_Vehicles:blip", netId, false)
|
||||||
if not veh then
|
playerTo.triggerEvent("ND_Vehicles:blip", netId, true)
|
||||||
playerFrom.notify({
|
|
||||||
title = "Ownership transfered",
|
NDCore.giveVehicleAccess(fromSource, veh, false, {
|
||||||
description = "Vehicle ownership of has been transfered.",
|
vehicleId = vehicleId,
|
||||||
type = "success",
|
netId = netId,
|
||||||
position = "bottom-right",
|
model = model,
|
||||||
duration = 4000
|
owner = playerFrom.id
|
||||||
})
|
})
|
||||||
playerTo.notify({
|
|
||||||
title = "Ownership received",
|
local state = Entity(veh).state
|
||||||
description = "Received vehicle ownership.",
|
state.owner = playerTo.id
|
||||||
type = "inform",
|
NDCore.giveVehicleAccess(toSource, veh, true, {
|
||||||
position = "bottom-right",
|
vehicleId = vehicleId,
|
||||||
duration = 4000
|
netId = netId,
|
||||||
|
model = model,
|
||||||
|
owner = playerTo.id
|
||||||
})
|
})
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local state = Entity(veh).state
|
|
||||||
state.owner = playerTo.id
|
|
||||||
state.keys = {
|
|
||||||
[playerTo.id] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
playerFrom.triggerEvent("ND_Vehicles:blip", info.netId, false)
|
|
||||||
|
|
||||||
playerFrom.notify({
|
playerFrom.notify({
|
||||||
title = "Ownership transfered",
|
title = "Ownership transfered",
|
||||||
description = ("Vehicle ownership of %s has been transfered."):format(GetVehicleNumberPlateText(veh)),
|
description = ("Vehicle ownership of %s has been transfered."):format(vehicle.plate),
|
||||||
type = "success",
|
|
||||||
position = "bottom-right",
|
position = "bottom-right",
|
||||||
duration = 4000
|
type = "success"
|
||||||
})
|
})
|
||||||
playerTo.notify({
|
playerTo.notify({
|
||||||
title = "Ownership received",
|
title = "Ownership received",
|
||||||
description = ("Received vehicle ownership of %s."):format(GetVehicleNumberPlateText(veh)),
|
description = ("Received vehicle ownership of %s."):format(vehicle.plate),
|
||||||
type = "inform",
|
position = "bottom-right"
|
||||||
position = "bottom-right",
|
|
||||||
duration = 4000
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
function NDCore.setVehicleOwned(src, properties, stored)
|
|
||||||
local player = NDCore.getPlayer(src)
|
|
||||||
local plate = generateVehiclePlate()
|
|
||||||
properties.plate = plate
|
|
||||||
local id = MySQL.insert.await("INSERT INTO nd_vehicles (owner, plate, properties, stored) VALUES (?, ?, ?, ?)", {player.id, properties.plate, json.encode(properties), stored and 1 or 0})
|
|
||||||
local vehicles = NDCore.getVehicles(player.id)
|
|
||||||
player.triggerEvent("ND_Vehicles:returnVehicles", vehicles)
|
|
||||||
return id
|
|
||||||
end
|
|
||||||
|
|
||||||
function NDCore.giveVehicleKeys(vehicle, source, target)
|
|
||||||
local state = Entity(vehicle).state
|
|
||||||
if not state then return end
|
|
||||||
|
|
||||||
local player = NDCore.getPlayer(source)
|
|
||||||
local owner = state.owner
|
|
||||||
if not owner and owner ~= player.id then return end
|
|
||||||
|
|
||||||
local keys = state.keys
|
|
||||||
if not keys then return end
|
|
||||||
|
|
||||||
local targetPlayer = NDCore.getPlayer(target)
|
|
||||||
state.keys[targetPlayer.id] = true
|
|
||||||
|
|
||||||
player.notify({
|
|
||||||
title = "Keys shared",
|
|
||||||
description = ("You've shared vehicle keys to %s."):format(GetVehicleNumberPlateText(vehicle)),
|
|
||||||
type = "success",
|
|
||||||
position = "bottom-right",
|
|
||||||
duration = 4000
|
|
||||||
})
|
|
||||||
targetPlayer.notify({
|
|
||||||
title = "Keys received",
|
|
||||||
description = ("Received vehicle keys to %s."):format(GetVehicleNumberPlateText(vehicle)),
|
|
||||||
type = "inform",
|
|
||||||
position = "bottom-right",
|
|
||||||
duration = 4000
|
|
||||||
})
|
})
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- set vehicle as owned by player
|
||||||
|
---@param playerId number
|
||||||
|
---@param properties table
|
||||||
|
---@param stored boolean
|
||||||
|
---@return vehicleId number
|
||||||
|
function NDCore.setVehicleOwned(playerId, properties, stored)
|
||||||
|
local plate = generateVehiclePlate()
|
||||||
|
properties.plate = plate
|
||||||
|
return MySQL.insert.await("INSERT INTO nd_vehicles (owner, plate, properties, stored) VALUES (?, ?, ?, ?)", {playerId, plate, json.encode(properties), stored and 1 or 0})
|
||||||
|
end
|
||||||
|
|
||||||
|
--- give a player access to another players vehicle as if they are next to eachother and hand the keys.
|
||||||
|
---@param source number
|
||||||
|
---@param target number
|
||||||
|
---@param vehicle number
|
||||||
|
---@return boolean
|
||||||
|
function NDCore.shareVehicleKeys(source, target, vehicle)
|
||||||
|
if not vehicle or not DoesEntityExist(vehicle) then return end
|
||||||
|
|
||||||
|
local player = NDCore.getPlayer(source)
|
||||||
|
local targetPlayer = NDCore.getPlayer(target)
|
||||||
|
local state = Entity(vehicle).state
|
||||||
|
if not targetPlayer or not player or player.id ~= state.owner then return end
|
||||||
|
|
||||||
|
NDCore.giveVehicleAccess(target, vehicle, true)
|
||||||
|
local plate = GetVehicleNumberPlateText(vehicle)
|
||||||
|
|
||||||
|
player.notify({
|
||||||
|
title = "Keys shared",
|
||||||
|
description = ("You've shared vehicle keys to %s."):format(plate),
|
||||||
|
position = "bottom-right",
|
||||||
|
type = "success",
|
||||||
|
})
|
||||||
|
targetPlayer.notify({
|
||||||
|
title = "Keys received",
|
||||||
|
description = ("Received vehicle keys to %s."):format(plate),
|
||||||
|
position = "bottom-right",
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--- spawned a vehicle that's owned by the player and checks for availability
|
||||||
|
---@param source number
|
||||||
|
---@param vehicleId number
|
||||||
|
---@param coords vector4
|
||||||
|
---@return table
|
||||||
function NDCore.spawnOwnedVehicle(source, vehicleId, coords, heading)
|
function NDCore.spawnOwnedVehicle(source, vehicleId, coords, heading)
|
||||||
local player = NDCore.getPlayer(src)
|
local player = NDCore.getPlayer(src)
|
||||||
if not player then return end
|
if not player then return end
|
||||||
|
|
||||||
local vehicle = NDCore.getVehicleById(nil, vehicleId)
|
local vehicle = NDCore.getVehicleById(vehicleId)
|
||||||
if not vehicle or not vehicle.available or vehicle.owner ~= player.id then return end
|
if not vehicle or not vehicle.available or vehicle.owner ~= player.id then return end
|
||||||
|
|
||||||
vehicle.stored = false
|
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})
|
||||||
player.triggerEvent("ND_Vehicles:returnVehicles", NDCore.getVehicles(player.id))
|
|
||||||
|
|
||||||
return NDCore.createVehicle({
|
return NDCore.createVehicle({
|
||||||
owner = player.id,
|
owner = player.id,
|
||||||
model = vehicle.properties.model,
|
model = vehicle.properties.model,
|
||||||
@@ -381,26 +380,7 @@ function NDCore.spawnOwnedVehicle(source, vehicleId, coords, heading)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
RegisterNetEvent("ND_Vehicles:lockpick", function(netId, success)
|
local function toggleVehicleLock(source, entity, nearby, metadata)
|
||||||
local veh = NetworkGetEntityFromNetworkId(netId)
|
|
||||||
local owner = NetworkGetEntityOwner(veh)
|
|
||||||
TriggerClientEvent("ND_Vehicles:syncAlarm", owner, netId)
|
|
||||||
if not success then return end
|
|
||||||
local state = Entity(veh).state
|
|
||||||
state.locked = false
|
|
||||||
end)
|
|
||||||
|
|
||||||
RegisterNetEvent("ND_Vehicles:hotwire", function(netId)
|
|
||||||
local src = source
|
|
||||||
local ped = GetPlayerPed(src)
|
|
||||||
local playerVeh = GetVehiclePedIsIn(ped)
|
|
||||||
local veh = NetworkGetEntityFromNetworkId(netId)
|
|
||||||
if not playerVeh or playerVeh == 0 or playerVeh ~= veh then return end
|
|
||||||
local state = Entity(veh).state
|
|
||||||
state.hotwired = true
|
|
||||||
end)
|
|
||||||
|
|
||||||
local function toggleVehicleLock(source, veh, nearby, metadata)
|
|
||||||
local player = NDCore.getPlayer(source)
|
local player = NDCore.getPlayer(source)
|
||||||
|
|
||||||
if metadata and not metadata.keyEnabled then
|
if metadata and not metadata.keyEnabled then
|
||||||
@@ -421,10 +401,11 @@ local function toggleVehicleLock(source, veh, nearby, metadata)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
local state = Entity(veh).state
|
local vehicle = NDCore.getVehicle(entity)
|
||||||
local locked = not state.locked
|
local locked = not vehicle.locked
|
||||||
state.locked = locked
|
vehicle.setLocked(locked)
|
||||||
player.triggerEvent("ND_Vehicles:keyFob", NetworkGetNetworkIdFromEntity(veh))
|
|
||||||
|
player.triggerEvent("ND_Vehicles:keyFob", vehicle.netId)
|
||||||
if locked then
|
if locked then
|
||||||
return player.notify({
|
return player.notify({
|
||||||
title = "LOCKED",
|
title = "LOCKED",
|
||||||
@@ -459,7 +440,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]?.entity
|
local veh = spawnedPlayerVehicles[vehId]?.entity
|
||||||
|
|
||||||
if veh and DoesEntityExist(veh) then
|
if veh and DoesEntityExist(veh) then
|
||||||
local vehCoords = GetEntityCoords(veh)
|
local vehCoords = GetEntityCoords(veh)
|
||||||
@@ -477,6 +458,7 @@ local function lockNearestVehicle(source, vehId, metadata)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- inventory keys using item.
|
||||||
exports("keys", function(event, item, inventory, slot, data)
|
exports("keys", function(event, item, inventory, slot, data)
|
||||||
if event ~= "usingItem" or not Config.useInventoryForKeys or not inventoryStarted then return end
|
if event ~= "usingItem" or not Config.useInventoryForKeys or not inventoryStarted then return end
|
||||||
local metadata
|
local metadata
|
||||||
@@ -493,6 +475,7 @@ exports("keys", function(event, item, inventory, slot, data)
|
|||||||
return false
|
return false
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- if using inventory and inventory keys players can spawn keys when in their vehicle with this command.
|
||||||
RegisterCommand("getkeys", function(source, args, rawCommand)
|
RegisterCommand("getkeys", function(source, args, rawCommand)
|
||||||
if not Config.useInventoryForKeys or not inventoryStarted then return end
|
if not Config.useInventoryForKeys or not inventoryStarted then return end
|
||||||
local veh = GetVehiclePedIsIn(GetPlayerPed(source))
|
local veh = GetVehiclePedIsIn(GetPlayerPed(source))
|
||||||
@@ -568,6 +551,38 @@ RegisterNetEvent("ND_Vehicles:disableKey", function(slot)
|
|||||||
ox_inventory:SetMetadata(src, slot, key.metadata)
|
ox_inventory:SetMetadata(src, slot, key.metadata)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- sync alarm when vehicle is lockpicked.
|
||||||
|
RegisterNetEvent("ND_Vehicles:lockpick", function(netId, success)
|
||||||
|
local src = source
|
||||||
|
local veh = NetworkGetEntityFromNetworkId(netId)
|
||||||
|
if not veh or not DoesEntityExist(veh) then return end
|
||||||
|
|
||||||
|
local ped = GetPlayerPed(src)
|
||||||
|
local pedCoords = GetEntityCoords(ped)
|
||||||
|
local vehCoords = GetEntityCoords(veh)
|
||||||
|
if #(pedCoords-vehCoords) > 5.0 then return end
|
||||||
|
|
||||||
|
local owner = NetworkGetEntityOwner(veh)
|
||||||
|
TriggerClientEvent("ND_Vehicles:syncAlarm", owner, netId)
|
||||||
|
|
||||||
|
if not success then return end
|
||||||
|
local state = Entity(veh).state
|
||||||
|
state.locked = false
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- sync alarm if vehicle gets hotwired.
|
||||||
|
RegisterNetEvent("ND_Vehicles:hotwire", function(netId)
|
||||||
|
local src = source
|
||||||
|
local ped = GetPlayerPed(src)
|
||||||
|
local playerVeh = GetVehiclePedIsIn(ped)
|
||||||
|
local veh = NetworkGetEntityFromNetworkId(netId)
|
||||||
|
if not playerVeh or playerVeh == 0 or playerVeh ~= veh then return end
|
||||||
|
local state = Entity(veh).state
|
||||||
|
state.hotwired = true
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- lib.callback.await("ND_Vehicles:getProps", src)
|
||||||
|
|
||||||
RegisterCommand("test", function(src, args, rawCommand)
|
RegisterCommand("test", function(src, args, rawCommand)
|
||||||
local ped = GetPlayerPed(src)
|
local ped = GetPlayerPed(src)
|
||||||
local coords = GetEntityCoords(ped)
|
local coords = GetEntityCoords(ped)
|
||||||
|
|||||||
Reference in New Issue
Block a user