mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-29 03:01:31 +00:00
feat(es_extended/server/classes/vehicle): add vehicle class
This commit is contained in:
@@ -25,6 +25,7 @@ server_scripts {
|
||||
'server/common.lua',
|
||||
'server/modules/callback.lua',
|
||||
'server/classes/player.lua',
|
||||
'server/classes/vehicle.lua',
|
||||
'server/classes/overrides/*.lua',
|
||||
'server/functions.lua',
|
||||
'server/modules/onesync.lua',
|
||||
|
||||
@@ -0,0 +1,209 @@
|
||||
---@class DbVehicle
|
||||
---@field owner string
|
||||
---@field plate string
|
||||
---@field vehicle string
|
||||
---@field type string
|
||||
---@field job? string
|
||||
---@field stored boolean
|
||||
---@field parking? string
|
||||
---@field pound? string
|
||||
|
||||
---@class VehicleData
|
||||
---@field plate string
|
||||
---@field netId number
|
||||
---@field entity number
|
||||
---@field modelHash number
|
||||
---@field owner string
|
||||
|
||||
---@class VehicleClass
|
||||
---@field plate string
|
||||
---@field isValid fun(self:VehicleClass):boolean
|
||||
---@field new fun(owner:string, plate:string, coords:vector4): VehicleClass?
|
||||
---@field getPlate fun(self:VehicleClass):string?
|
||||
---@field getNetId fun(self:VehicleClass):number?
|
||||
---@field getEntity fun(self:VehicleClass):number?
|
||||
---@field getModelHash fun(self:VehicleClass):number?
|
||||
---@field getProps fun(self:VehicleClass):table?
|
||||
---@field getOwner fun(self:VehicleClass):string?
|
||||
---@field setPlate fun(self:VehicleClass, plate:string):boolean
|
||||
---@field setProps fun(self:VehicleClass, props:table):boolean
|
||||
---@field setOwner fun(self:VehicleClass, owner:string):boolean
|
||||
---@field delete fun(self:VehicleClass):nil
|
||||
Core.vehicleClass = {
|
||||
plate = "",
|
||||
new = function(owner, plate, coords)
|
||||
assert(type(owner) == "string", "Expected 'owner' to be a string")
|
||||
assert(type(plate) == "string", "Expected 'plate' to be a string")
|
||||
assert(type(coords) == "vector4", "Expected 'coords' to be a vector4")
|
||||
|
||||
if Core.vehicles[plate] then
|
||||
local obj = table.clone(Core.vehicleClass)
|
||||
obj.plate = plate
|
||||
|
||||
if obj:isValid() then
|
||||
return obj
|
||||
end
|
||||
end
|
||||
|
||||
local dbVehicle = MySQL.single.await("SELECT * FROM `owned_vehicles` WHERE `stored` = true AND `owner` = ? AND `plate` = ?", { owner, plate }) --[[@as DbVehicle]]
|
||||
if not dbVehicle then
|
||||
return
|
||||
end
|
||||
|
||||
local vehicleProps = json.decode(dbVehicle.vehicle)
|
||||
if type(vehicleProps.model) ~= "number" then
|
||||
model = joaat(model)
|
||||
end
|
||||
|
||||
local netId = ESX.OneSync.SpawnVehicle(model, coords.xyz, coords.w, vehicleProps)
|
||||
if not netId then
|
||||
return
|
||||
end
|
||||
|
||||
local entity = NetworkGetEntityFromNetworkId(netId)
|
||||
if entity <= 0 then
|
||||
return
|
||||
end
|
||||
|
||||
Entity(entity).state:set("owner", owner, false)
|
||||
|
||||
local vehicle = {
|
||||
plate = plate,
|
||||
entity = entity,
|
||||
netId = netId,
|
||||
modelHash = model,
|
||||
owner = owner,
|
||||
}
|
||||
Core.vehicles[plate] = vehicle
|
||||
|
||||
MySQL.update.await("UPDATE `owned_vehicles` SET `stored` = 0 WHERE `owner` = ? AND `plate` = ?", { owner, plate })
|
||||
|
||||
local obj = table.clone(Core.vehicleClass)
|
||||
obj.plate = plate
|
||||
TriggerEvent("esx:createdExtendedVehicle", obj)
|
||||
|
||||
return obj
|
||||
end,
|
||||
isValid = function(self)
|
||||
local xVehicle = Core.vehicles[self.plate]
|
||||
if not xVehicle then
|
||||
return false
|
||||
end
|
||||
|
||||
local entity = NetworkGetEntityFromNetworkId(xVehicle.netId)
|
||||
if entity <= 0 or Entity(entity).state.owner ~= xVehicle.owner then
|
||||
self:delete()
|
||||
return false
|
||||
end
|
||||
|
||||
local plate = ESX.Math.Trim(GetVehicleNumberPlateText(entity))
|
||||
if plate ~= xVehicle.plate then
|
||||
self:delete()
|
||||
return false
|
||||
end
|
||||
|
||||
xVehicle.entity = entity
|
||||
|
||||
return true
|
||||
end,
|
||||
getNetId = function(self)
|
||||
if not self:isValid() then
|
||||
return
|
||||
end
|
||||
|
||||
return Core.vehicles[self.plate].netId
|
||||
end,
|
||||
getEntity = function(self)
|
||||
if not self:isValid() then
|
||||
return
|
||||
end
|
||||
|
||||
return Core.vehicles[self.plate].entity
|
||||
end,
|
||||
getPlate = function(self)
|
||||
if not self:isValid() then
|
||||
return
|
||||
end
|
||||
|
||||
return Core.vehicles[self.plate].plate
|
||||
end,
|
||||
getModelHash = function(self)
|
||||
if not self:isValid() then
|
||||
return
|
||||
end
|
||||
|
||||
return Core.vehicles[self.plate].modelHash
|
||||
end,
|
||||
getProps = function(self)
|
||||
if not self:isValid() then
|
||||
return
|
||||
end
|
||||
|
||||
return Core.vehicles[self.plate].props
|
||||
end,
|
||||
getOwner = function(self)
|
||||
if not self:isValid() then
|
||||
return
|
||||
end
|
||||
|
||||
return Core.vehicles[self.plate].owner
|
||||
end,
|
||||
setPlate = function(self, plate)
|
||||
if not self:isValid() then
|
||||
return false
|
||||
end
|
||||
assert(type(plate) == "string", "Expected 'plate' to be a string")
|
||||
|
||||
local xVehicle = Core.vehicles[self.plate]
|
||||
SetVehicleNumberPlateText(xVehicle.entity, plate)
|
||||
xVehicle.plate = plate
|
||||
MySQL.update.await("UPDATE `owned_vehicles` SET `plate` = ? WHERE `plate` = ? AND `owner` = ?", { plate, xVehicle.plate, xVehicle.owner })
|
||||
|
||||
return true
|
||||
end,
|
||||
setProps = function(self, props)
|
||||
if not self:isValid() then
|
||||
return false
|
||||
end
|
||||
assert(type(props) == "table", "Expected 'props' to be a table")
|
||||
|
||||
local xVehicle = Core.vehicles[self.plate]
|
||||
Entity(xVehicle.entity).state:set("VehicleProperties", props, true)
|
||||
MySQL.update.await("UPDATE `owned_vehicles` SET `vehicle` = ? WHERE `plate` = ? AND `owner` = ?", json.encode(props), xVehicle.plate, xVehicle.owner)
|
||||
|
||||
return true
|
||||
end,
|
||||
setOwner = function(self, owner)
|
||||
if not self:isValid() then
|
||||
return false
|
||||
end
|
||||
assert(type(owner) == "string", "Expected 'owner' to be a string")
|
||||
|
||||
local xVehicle = Core.vehicles[self.plate]
|
||||
if xVehicle.owner == owner then
|
||||
return true
|
||||
end
|
||||
|
||||
Entity(xVehicle.entity).state:set("owner", owner, false)
|
||||
xVehicle.owner = owner
|
||||
MySQL.update.await("UPDATE `owned_vehicles` SET `owner` = ? WHERE `plate` = ?", { owner, xVehicle.plate })
|
||||
|
||||
return true
|
||||
end,
|
||||
delete = function(self)
|
||||
local xVehicle = Core.vehicles[self.plate]
|
||||
if not xVehicle then
|
||||
return
|
||||
end
|
||||
|
||||
local entity = NetworkGetEntityFromNetworkId(xVehicle.netId)
|
||||
if entity >= 0 and Entity(entity).state.owner == xVehicle.owner then
|
||||
DeleteEntity(xVehicle.entity)
|
||||
end
|
||||
|
||||
MySQL.update.await("UPDATE `owned_vehicles` SET `stored` = 1 WHERE `plate` = ?", { xVehicle.plate })
|
||||
TriggerEvent("esx:deletedExtendedVehicle", self)
|
||||
|
||||
Core.vehicles[self.plate] = nil
|
||||
end,
|
||||
}
|
||||
@@ -11,6 +11,8 @@ Core.PlayerFunctionOverrides = {}
|
||||
Core.DatabaseConnected = false
|
||||
Core.playersByIdentifier = {}
|
||||
|
||||
---@type table<string, VehicleData>
|
||||
Core.vehicles = {}
|
||||
Core.vehicleTypesByModel = {}
|
||||
|
||||
RegisterNetEvent("esx:onPlayerSpawn", function()
|
||||
|
||||
Reference in New Issue
Block a user