ed
This commit is contained in:
parent
6d22d5f77c
commit
63fbc60a00
86 changed files with 8352 additions and 3428 deletions
|
@ -0,0 +1,535 @@
|
|||
---@param text string
|
||||
function Framework.Client.ShowTextUI(text)
|
||||
if (Config.DrawText == "auto" and GetResourceState("jg-textui") == "started") or Config.DrawText == "jg-textui" then
|
||||
exports["jg-textui"]:DrawText(text)
|
||||
elseif (Config.DrawText == "auto" and GetResourceState("ox_lib") == "started") or Config.DrawText == "ox_lib" then
|
||||
exports["ox_lib"]:showTextUI(text, {
|
||||
position = "left-center"
|
||||
})
|
||||
elseif (Config.DrawText == "auto" and GetResourceState("okokTextUI") == "started") or Config.DrawText == "okokTextUI" then
|
||||
exports["okokTextUI"]:Open(text, "lightblue", "left")
|
||||
elseif (Config.DrawText == "auto" and GetResourceState("ps-ui") == "started") or Config.DrawText == "ps-ui" then
|
||||
exports["ps-ui"]:DisplayText(text, "primary")
|
||||
elseif Config.Framework == "QBCore" then
|
||||
exports["qb-core"]:DrawText(text)
|
||||
else
|
||||
error("You do not have a TextUI system set up!")
|
||||
end
|
||||
end
|
||||
|
||||
function Framework.Client.HideTextUI()
|
||||
if (Config.DrawText == "auto" and GetResourceState("jg-textui") == "started") or Config.DrawText == "jg-textui" then
|
||||
exports["jg-textui"]:HideText()
|
||||
elseif (Config.DrawText == "auto" and GetResourceState("ox_lib") == "started") or Config.DrawText == "ox_lib" then
|
||||
exports["ox_lib"]:hideTextUI()
|
||||
elseif (Config.DrawText == "auto" and GetResourceState("okokTextUI") == "started") or Config.DrawText == "okokTextUI" then
|
||||
exports["okokTextUI"]:Close()
|
||||
elseif (Config.DrawText == "auto" and GetResourceState("ps-ui") == "started") or Config.DrawText == "ps-ui" then
|
||||
exports["ps-ui"]:HideText()
|
||||
elseif Config.Framework == "QBCore" then
|
||||
exports["qb-core"]:HideText()
|
||||
else
|
||||
error("You do not have a TextUI system set up!")
|
||||
end
|
||||
end
|
||||
|
||||
---@param garageId string
|
||||
---@param text string
|
||||
---@param onSelect function
|
||||
function Framework.Client.RadialMenuAdd(garageId, text, onSelect)
|
||||
if not Config.UseRadialMenu then return end
|
||||
|
||||
if (Config.RadialMenu == "auto" and GetResourceState("ox_lib") == "started") or Config.RadialMenu == "ox_lib" then
|
||||
lib.addRadialItem({
|
||||
id = garageId,
|
||||
icon = "warehouse",
|
||||
label = text,
|
||||
onSelect = onSelect
|
||||
})
|
||||
else
|
||||
error("You do not have a radial menu system set up!")
|
||||
end
|
||||
end
|
||||
|
||||
---@param garageId string
|
||||
function Framework.Client.RadialMenuRemove(garageId)
|
||||
if not Config.UseRadialMenu then return end
|
||||
|
||||
if (Config.RadialMenu == "auto" and GetResourceState("ox_lib") == "started") or Config.RadialMenu == "ox_lib" then
|
||||
lib.removeRadialItem(garageId)
|
||||
else
|
||||
error("You do not have a radial menu system set up!")
|
||||
end
|
||||
end
|
||||
|
||||
---@param entity? integer|false
|
||||
---@param coords vector4|vector3
|
||||
---@param garageId string
|
||||
---@param vehicleType "car"|"air"|"sea"
|
||||
---@param garageType "personal"|"job"|"gang"|"impound"
|
||||
---@return integer
|
||||
function Framework.Client.RegisterTarget(entity, coords, garageId, vehicleType, garageType)
|
||||
if not entity then
|
||||
entity = createPedForTarget(coords)
|
||||
end
|
||||
|
||||
if (Config.Target == "auto" and GetResourceState("ox_target") == "started") or Config.Target == "ox_target" then
|
||||
exports.ox_target:addLocalEntity(entity, {
|
||||
{
|
||||
label = garageType == "impound" and Config.OpenImpoundPrompt or Config.OpenGaragePrompt,
|
||||
icon = "warehouse",
|
||||
onSelect = function()
|
||||
TriggerEvent("jg-advancedgarages:client:open-garage", garageId, vehicleType, false)
|
||||
end
|
||||
},
|
||||
garageType ~= "impound" and {
|
||||
label = Config.InsertVehiclePrompt,
|
||||
icon = "warehouse",
|
||||
onSelect = function()
|
||||
TriggerEvent("jg-advancedgarages:client:store-vehicle", garageId, vehicleType, false)
|
||||
end
|
||||
} or nil
|
||||
})
|
||||
elseif (Config.Target == "auto" and GetResourceState("qb-target") == "started") or Config.Target == "qb-target" then
|
||||
exports["qb-target"]:AddTargetEntity(entity, {
|
||||
options = {
|
||||
{
|
||||
label = garageType == "impound" and Config.OpenImpoundPrompt or Config.OpenGaragePrompt,
|
||||
targeticon = "fas fa-warehouse",
|
||||
action = function()
|
||||
TriggerEvent("jg-advancedgarages:client:open-garage", garageId, vehicleType, false)
|
||||
end
|
||||
},
|
||||
garageType ~= "impound" and {
|
||||
label = Config.InsertVehiclePrompt,
|
||||
targeticon = "fas fa-warehouse",
|
||||
action = function()
|
||||
TriggerEvent("jg-advancedgarages:client:store-vehicle", garageId, vehicleType, false)
|
||||
end
|
||||
} or nil
|
||||
},
|
||||
distance = 10.0
|
||||
})
|
||||
else
|
||||
error("You do not have a target system set up!")
|
||||
end
|
||||
|
||||
return entity
|
||||
end
|
||||
|
||||
---@param entity integer
|
||||
function Framework.Client.RemoveTarget(entity)
|
||||
if not entity then return end
|
||||
|
||||
DeleteEntity(entity)
|
||||
|
||||
if (Config.Target == "auto" and GetResourceState("ox_target") == "started") or Config.Target == "ox_target" then
|
||||
exports.ox_target:removeLocalEntity(entity)
|
||||
elseif (Config.Target == "auto" and GetResourceState("qb-target") == "started") or Config.Target == "qb-target" then
|
||||
exports["qb-target"]:RemoveTargetEntity(entity)
|
||||
else
|
||||
error("You do not have a target system set up!")
|
||||
end
|
||||
end
|
||||
|
||||
---@param msg string
|
||||
---@param type? "success" | "warning" | "error"
|
||||
---@param time? number
|
||||
function Framework.Client.Notify(msg, type, time)
|
||||
type = type or "success"
|
||||
time = time or 5000
|
||||
|
||||
if (Config.Notifications == "auto" and GetResourceState("okokNotify") == "started") or Config.Notifications == "okokNotify" then
|
||||
exports["okokNotify"]:Alert("Garages", msg, time, type)
|
||||
elseif (Config.Notifications == "auto" and GetResourceState("ps-ui") == "started") or Config.Notifications == "ps-ui" then
|
||||
exports["ps-ui"]:Notify(msg, type, time)
|
||||
elseif (Config.Notifications == "auto" and GetResourceState("ox_lib") == "started") or Config.Notifications == "ox_lib" then
|
||||
exports["ox_lib"]:notify({
|
||||
title = "Garages",
|
||||
description = msg,
|
||||
type = type
|
||||
})
|
||||
else
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Functions.Notify(msg, type, time)
|
||||
elseif Config.Framework == "Qbox" then
|
||||
exports.qbx_core:Notify(msg, type, time)
|
||||
elseif Config.Framework == "ESX" then
|
||||
return ESX.ShowNotification(msg, type)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RegisterNetEvent("jg-advancedgarages:client:notify", function(...)
|
||||
Framework.Client.Notify(...)
|
||||
end)
|
||||
|
||||
--
|
||||
-- Player Functions
|
||||
--
|
||||
|
||||
---@return table | false playerData
|
||||
function Framework.Client.GetPlayerData()
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Functions.GetPlayerData()
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return exports.qbx_core:GetPlayerData()
|
||||
elseif Config.Framework == "ESX" then
|
||||
return ESX.GetPlayerData()
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@return string | false identifier
|
||||
function Framework.Client.GetPlayerIdentifier()
|
||||
local playerData = Framework.Client.GetPlayerData()
|
||||
if not playerData then return false end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return playerData.citizenid
|
||||
elseif Config.Framework == "ESX" then
|
||||
return playerData.identifier
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param type "cash" | "bank" | "money"
|
||||
function Framework.Client.GetBalance(type)
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Functions.GetPlayerData().money[type]
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return exports.qbx_core:GetPlayerData().money[type]
|
||||
elseif Config.Framework == "ESX" then
|
||||
if type == "cash" then type = "money" end
|
||||
|
||||
for i, acc in pairs(ESX.GetPlayerData().accounts) do
|
||||
if acc.name == type then
|
||||
return acc.money
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
---@return {name: string, grade: number} | false job
|
||||
function Framework.Client.GetPlayerJob()
|
||||
local player = Framework.Client.GetPlayerData()
|
||||
if not player or not player.job then return {} end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return {
|
||||
name = player.job.name,
|
||||
label = player.job.label,
|
||||
grade = player.job.grade.level
|
||||
}
|
||||
elseif Config.Framework == "ESX" then
|
||||
return {
|
||||
name = player.job.name,
|
||||
label = player.job.label,
|
||||
grade = player.job.grade
|
||||
}
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@return {name: string, grade: number} | false gang
|
||||
function Framework.Client.GetPlayerGang()
|
||||
if (Config.Gangs == "auto" and GetResourceState("rcore_gangs") == "started") or Config.Gangs == "rcore_gangs" then
|
||||
local gang = exports.rcore_gangs:GetPlayerGang()
|
||||
if not gang then return {} end
|
||||
|
||||
return {
|
||||
name = gang.name,
|
||||
label = gang.name,
|
||||
grade = 0 -- rcore_gangs' grade system are only strings
|
||||
}
|
||||
elseif (Config.Gangs == "auto" and GetResourceState("qb-gangs") == "started") or Config.Gangs == "qb-gangs" or Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
local player = Framework.Client.GetPlayerData()
|
||||
if not player or not player.gang then return {} end
|
||||
|
||||
return {
|
||||
name = player.gang.name,
|
||||
label = player.gang.label,
|
||||
grade = player.gang.grade.level
|
||||
}
|
||||
elseif Config.Framework == "ESX" then
|
||||
-- To implement gangs in ESX, enable Config.GangEnableCustomESXIntegration & then add the necessary exports here.
|
||||
-- It must return the same data structure as QB/X above, with { name, label, grade }
|
||||
-- Heads up, you must also add the exports to sv-functions.lua -> Framework.Server.GetPlayerGang
|
||||
error("ESX does not natively support gangs.");
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@return boolean dead
|
||||
function Framework.Client.IsPlayerDead()
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
local player = Framework.Client.GetPlayerData()
|
||||
if not player then return false end
|
||||
|
||||
if player.metadata.isdead or player.metadata.inlaststand then
|
||||
return true
|
||||
end
|
||||
elseif Config.Framework == "ESX" then
|
||||
return IsEntityDead(cache.ped)
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--
|
||||
-- Vehicle Functions
|
||||
--
|
||||
|
||||
---@param vehicle integer
|
||||
---@return number fuelLevel
|
||||
function Framework.Client.VehicleGetFuel(vehicle)
|
||||
if not DoesEntityExist(vehicle) then return 0 end
|
||||
|
||||
if (Config.FuelSystem == "LegacyFuel" or Config.FuelSystem == "ps-fuel" or Config.FuelSystem == "lj-fuel" or Config.FuelSystem == "cdn-fuel" or Config.FuelSystem == "hyon_gas_station" or Config.FuelSystem == "okokGasStation" or Config.FuelSystem == "nd_fuel" or Config.FuelSystem == "myFuel") then
|
||||
return exports[Config.FuelSystem]:GetFuel(vehicle)
|
||||
elseif Config.FuelSystem == "ti_fuel" then
|
||||
local level, type = exports["ti_fuel"]:getFuel(vehicle)
|
||||
TriggerServerEvent("jg-advancedgarages:server:save-ti-fuel-type", Framework.Client.GetPlate(vehicle), type)
|
||||
return level
|
||||
elseif Config.FuelSystem == "ox_fuel" or Config.FuelSystem == "Renewed-Fuel" then
|
||||
return GetVehicleFuelLevel(vehicle)
|
||||
elseif Config.FuelSystem == "rcore_fuel" then
|
||||
return exports.rcore_fuel:GetVehicleFuelPercentage(vehicle)
|
||||
else
|
||||
return 65 -- or set up custom fuel system here...
|
||||
end
|
||||
end
|
||||
|
||||
---@param vehicle integer
|
||||
---@param fuel number
|
||||
function Framework.Client.VehicleSetFuel(vehicle, fuel)
|
||||
if not DoesEntityExist(vehicle) then return false end
|
||||
|
||||
if (Config.FuelSystem == "LegacyFuel" or Config.FuelSystem == "ps-fuel" or Config.FuelSystem == "lj-fuel" or Config.FuelSystem == "cdn-fuel" or Config.FuelSystem == "hyon_gas_station" or Config.FuelSystem == "okokGasStation" or Config.FuelSystem == "nd_fuel" or Config.FuelSystem == "myFuel" or Config.FuelSystem == "Renewed-Fuel") then
|
||||
exports[Config.FuelSystem]:SetFuel(vehicle, fuel)
|
||||
elseif Config.FuelSystem == "ti_fuel" then
|
||||
local fuelType = lib.callback.await("jg-advancedgarages:server:get-ti-fuel-type", false, Framework.Client.GetPlate(vehicle))
|
||||
exports["ti_fuel"]:setFuel(vehicle, fuel, fuelType or nil)
|
||||
elseif Config.FuelSystem == "ox_fuel" then
|
||||
Entity(vehicle).state.fuel = fuel
|
||||
elseif Config.FuelSystem == "rcore_fuel" then
|
||||
exports.rcore_fuel:SetVehicleFuel(vehicle, fuel)
|
||||
else
|
||||
-- Setup custom fuel system here
|
||||
end
|
||||
end
|
||||
|
||||
---@param plate string
|
||||
---@param vehicleEntity integer
|
||||
---@param origin "personal" | "job" | "gang"
|
||||
function Framework.Client.VehicleGiveKeys(plate, vehicleEntity, origin)
|
||||
if not DoesEntityExist(vehicleEntity) then return false end
|
||||
if not plate or plate == "" then
|
||||
print("^1[ERROR] No plate provided to VehicleGiveKeys function^0")
|
||||
return false
|
||||
end
|
||||
|
||||
plate = plate:upper()
|
||||
|
||||
if Config.VehicleKeys == "qb-vehiclekeys" then
|
||||
TriggerEvent("vehiclekeys:client:SetOwner", plate)
|
||||
elseif Config.VehicleKeys == "qbx_vehiclekeys" then
|
||||
TriggerEvent("vehiclekeys:client:SetOwner", plate)
|
||||
-- lib.callback.await("qbx_vehiclekeys:server:giveKeys", false, VehToNet(vehicleEntity))
|
||||
elseif Config.VehicleKeys == "jaksam-vehicles-keys" then
|
||||
TriggerServerEvent("vehicles_keys:selfGiveVehicleKeys", plate)
|
||||
elseif Config.VehicleKeys == "mk_vehiclekeys" then
|
||||
exports["mk_vehiclekeys"]:AddKey(vehicleEntity)
|
||||
elseif Config.VehicleKeys == "qs-vehiclekeys" then
|
||||
local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicleEntity))
|
||||
exports["qs-vehiclekeys"]:GiveKeys(plate, model)
|
||||
elseif Config.VehicleKeys == "wasabi_carlock" then
|
||||
exports.wasabi_carlock:GiveKey(plate)
|
||||
elseif Config.VehicleKeys == "cd_garage" then
|
||||
TriggerEvent("cd_garage:AddKeys", plate)
|
||||
elseif Config.VehicleKeys == "okokGarage" then
|
||||
TriggerServerEvent("okokGarage:GiveKeys", plate)
|
||||
elseif Config.VehicleKeys == "t1ger_keys" then
|
||||
if origin == "job" then
|
||||
local vehicleName = GetDisplayNameFromVehicleModel(GetEntityModel(vehicleEntity))
|
||||
exports['t1ger_keys']:GiveJobKeys(plate, vehicleName, true)
|
||||
else
|
||||
TriggerServerEvent("t1ger_keys:updateOwnedKeys", plate, true)
|
||||
end
|
||||
elseif Config.VehicleKeys == "MrNewbVehicleKeys" then
|
||||
exports.MrNewbVehicleKeys:GiveKeys(vehicleEntity)
|
||||
elseif Config.VehicleKeys == "Renewed" then
|
||||
exports["Renewed-Vehiclekeys"]:addKey(plate)
|
||||
elseif Config.VehicleKeys == "tgiann-hotwire" then
|
||||
exports["tgiann-hotwire"]:CheckKeyInIgnitionWhenSpawn(vehicleEntity, plate)
|
||||
else
|
||||
-- Setup custom key system here...
|
||||
end
|
||||
end
|
||||
|
||||
---@param plate string
|
||||
---@param vehicleEntity integer
|
||||
---@param origin "personal" | "job" | "gang"
|
||||
function Framework.Client.VehicleRemoveKeys(plate, vehicleEntity, origin)
|
||||
if not DoesEntityExist(vehicleEntity) then return false end
|
||||
if not plate or plate == "" then
|
||||
print("^1[ERROR] No plate provided to VehicleRemoveKeys function^0")
|
||||
return false
|
||||
end
|
||||
|
||||
plate = plate:upper()
|
||||
|
||||
if Config.VehicleKeys == "qs-vehiclekeys" then
|
||||
local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicleEntity))
|
||||
exports["qs-vehiclekeys"]:RemoveKeys(plate, model)
|
||||
elseif Config.VehicleKeys == "wasabi_carlock" then
|
||||
exports.wasabi_carlock:RemoveKey(plate)
|
||||
elseif Config.VehicleKeys == "t1ger_keys" then
|
||||
TriggerServerEvent("t1ger_keys:updateOwnedKeys", plate, false)
|
||||
elseif Config.VehicleKeys == "MrNewbVehicleKeys" then
|
||||
exports.MrNewbVehicleKeys:RemoveKeys(vehicleEntity)
|
||||
elseif Config.VehicleKeys == "Renewed" then
|
||||
exports["Renewed-Vehiclekeys"]:removeKey(plate)
|
||||
else
|
||||
-- Setup custom key system here...
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
---@param vehicle table
|
||||
---@return string|number|false model
|
||||
function Framework.Client.GetModelColumn(vehicle)
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return vehicle.vehicle or tonumber(vehicle.hash) or false
|
||||
elseif Config.Framework == "ESX" then
|
||||
if not vehicle or not vehicle.vehicle then return false end
|
||||
|
||||
if type(vehicle.vehicle) == "string" then
|
||||
if not json.decode(vehicle.vehicle) then return false end
|
||||
return json.decode(vehicle.vehicle).model
|
||||
else
|
||||
return vehicle.vehicle.model
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param vehicle integer
|
||||
---@return table | false
|
||||
function Framework.Client.GetModsColumn(vehicle)
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
if type(vehicle.mods) == "string" then
|
||||
return json.decode(vehicle.mods)
|
||||
else
|
||||
return vehicle.mods
|
||||
end
|
||||
elseif Config.Framework == "ESX" then
|
||||
if type(vehicle.vehicle) == "string" then
|
||||
return json.decode(vehicle.vehicle)
|
||||
else
|
||||
return vehicle.vehicle
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param vehicle integer
|
||||
---@return table|false props
|
||||
function Framework.Client.GetVehicleProperties(vehicle)
|
||||
if GetResourceState("jg-mechanic") == "started" then
|
||||
return exports["jg-mechanic"]:getVehicleProperties(vehicle)
|
||||
else
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Functions.GetVehicleProperties(vehicle)
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return lib.getVehicleProperties(vehicle) or false
|
||||
elseif Config.Framework == "ESX" then
|
||||
return ESX.Game.GetVehicleProperties(vehicle)
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param vehicle integer
|
||||
---@param props table
|
||||
function Framework.Client.SetVehicleProperties(vehicle, props)
|
||||
if GetResourceState("jg-mechanic") == "started" then
|
||||
return exports["jg-mechanic"]:setVehicleProperties(vehicle, props)
|
||||
else
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Functions.SetVehicleProperties(vehicle, props)
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return lib.setVehicleProperties(vehicle, props)
|
||||
elseif Config.Framework == "ESX" then
|
||||
return ESX.Game.SetVehicleProperties(vehicle, props)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@param vehicle integer
|
||||
---@return string|false plate
|
||||
function Framework.Client.GetPlate(vehicle)
|
||||
local plate = GetVehicleNumberPlateText(vehicle)
|
||||
if not plate or plate == nil or plate == "" then return false end
|
||||
|
||||
if GetResourceState("brazzers-fakeplates") == "started" then
|
||||
local originalPlate = lib.callback.await("jg-advancedgarages:server:brazzers-get-plate-from-fakeplate", false, plate)
|
||||
if originalPlate then plate = originalPlate end
|
||||
end
|
||||
|
||||
local trPlate = string.gsub(plate, "^%s*(.-)%s*$", "%1")
|
||||
return trPlate
|
||||
end
|
||||
|
||||
-- Get a nice vehicle label from either QBCore shared or GTA natives
|
||||
---@param model string | number
|
||||
function Framework.Client.GetVehicleLabel(model)
|
||||
local hash = convertModelToHash(model)
|
||||
|
||||
if Config.VehicleLabels[model] then
|
||||
return Config.VehicleLabels[model]
|
||||
end
|
||||
|
||||
if Config.VehicleLabels[tostring(hash)] then
|
||||
return Config.VehicleLabels[tostring(hash)]
|
||||
end
|
||||
|
||||
if type(model) == "string" and Config.Framework == "QBCore" then
|
||||
local vehShared = QBCore.Shared.Vehicles?[model]
|
||||
if vehShared then
|
||||
return vehShared.brand .. " " .. vehShared.name
|
||||
end
|
||||
end
|
||||
|
||||
if Config.Framework == "Qbox" then
|
||||
local vehShared = exports.qbx_core:GetVehiclesByHash()?[hash]
|
||||
if vehShared then
|
||||
return vehShared.brand .. " " .. vehShared.name
|
||||
end
|
||||
end
|
||||
|
||||
local makeName = GetMakeNameFromVehicleModel(hash)
|
||||
local modelName = GetDisplayNameFromVehicleModel(hash)
|
||||
local label = GetLabelText(makeName) .. " " .. GetLabelText(modelName)
|
||||
|
||||
if makeName == "CARNOTFOUND" or modelName == "CARNOTFOUND" then
|
||||
label = tostring(model)
|
||||
else
|
||||
if GetLabelText(modelName) == "NULL" and GetLabelText(makeName) == "NULL" then
|
||||
label = (makeName or "") .. " " .. (modelName or "")
|
||||
elseif GetLabelText(makeName) == "NULL" then
|
||||
label = GetLabelText(modelName)
|
||||
end
|
||||
end
|
||||
|
||||
return label
|
||||
end
|
|
@ -0,0 +1,37 @@
|
|||
if (Config.Framework == "auto" and GetResourceState("es_extended") == "started") or Config.Framework == "ESX" then
|
||||
-- Player data
|
||||
Globals.PlayerData = ESX.GetPlayerData()
|
||||
|
||||
RegisterNetEvent("esx:playerLoaded")
|
||||
AddEventHandler("esx:playerLoaded", function(xPlayer)
|
||||
Globals.PlayerData = xPlayer
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
|
||||
RegisterNetEvent("esx:setJob")
|
||||
AddEventHandler("esx:setJob", function(job)
|
||||
Globals.PlayerData.job = job
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
|
||||
-- ESX admincar replacement
|
||||
RegisterNetEvent("jg-advancedgarages:client:set-vehicle-owned", function()
|
||||
local vehicle = cache.vehicle
|
||||
local vehicleProps = Framework.Client.GetVehicleProperties(vehicle)
|
||||
if not vehicleProps then return end
|
||||
|
||||
if not vehicle or vehicle == 0 then
|
||||
return Framework.Client.Notify(Locale.notInsideVehicleError, "error")
|
||||
end
|
||||
|
||||
local plate = vehicleProps.plate
|
||||
|
||||
local vehicleModel = GetEntityArchetypeName(vehicle)
|
||||
local veh = lib.callback.await("jg-advancedgarages:server:get-vehicle", false, vehicleModel, plate)
|
||||
if veh then
|
||||
return Framework.Client.Notify(Locale.vehiclePlateExistsError, "error")
|
||||
end
|
||||
|
||||
TriggerServerEvent("jg-advancedgarages:server:set-vehicle-owned", vehicleProps)
|
||||
end)
|
||||
end
|
|
@ -0,0 +1,23 @@
|
|||
if (Config.Framework == "auto" and GetResourceState("es_extended") == "started") or Config.Framework == "ESX" then
|
||||
-- /admincar db insert
|
||||
RegisterNetEvent("jg-advancedgarages:server:set-vehicle-owned", function(vehicleProps)
|
||||
local src = source
|
||||
|
||||
if not Framework.Server.IsAdmin(src) then
|
||||
return Framework.Server.Notify(src, "INSUFFICIENT_PERMISSIONS", "error")
|
||||
end
|
||||
|
||||
local player = ESX.GetPlayerFromId(src)
|
||||
|
||||
MySQL.insert.await("INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (?, ?, ?)", {
|
||||
player.identifier, vehicleProps.plate, json.encode(vehicleProps)
|
||||
})
|
||||
|
||||
Framework.Server.Notify(src, string.gsub(Locale.vehicleReceived, "%%{value}", vehicleProps.plate))
|
||||
end)
|
||||
|
||||
-- /admincar command
|
||||
ESX.RegisterCommand("admincar", "admin", function(xPlayer)
|
||||
TriggerClientEvent("jg-advancedgarages:client:set-vehicle-owned", xPlayer.source)
|
||||
end, false)
|
||||
end
|
61
resources/[carscripts]/jg-advancedgarages/framework/main.lua
Normal file
61
resources/[carscripts]/jg-advancedgarages/framework/main.lua
Normal file
|
@ -0,0 +1,61 @@
|
|||
QBCore, ESX = nil, nil
|
||||
Framework = {
|
||||
Client = {},
|
||||
Server = {},
|
||||
Queries = {
|
||||
GetVehicles = "SELECT * FROM %s WHERE %s = ? AND job_vehicle = 0 AND gang_vehicle = 0",
|
||||
GetJobVehicles = "SELECT * FROM %s WHERE %s = ? AND job_vehicle = 1 AND job_vehicle_rank <= ?",
|
||||
GetGangVehicles = "SELECT * FROM %s WHERE %s = ? AND gang_vehicle = 1 AND gang_vehicle_rank <= ?",
|
||||
GetImpoundVehiclesWhitelist = "SELECT * FROM %s WHERE garage_id = ? AND impound = 1",
|
||||
GetImpoundVehiclesPublic = "SELECT * FROM %s WHERE garage_id = ? AND impound = 1 AND impound_retrievable = 1 AND (%s = ? OR %s = ? OR %s = ?)",
|
||||
GetVehicle = "SELECT * FROM %s WHERE %s = ? AND plate = ?",
|
||||
GetVehicleNoIdentifier = "SELECT * FROM %s WHERE plate = ?",
|
||||
GetVehiclePlateOnly = "SELECT plate FROM %s WHERE plate = ?",
|
||||
GetPrivateGarages = "SELECT * FROM player_priv_garages WHERE owners LIKE ?",
|
||||
StoreVehicle = "UPDATE %s SET in_garage = 1, garage_id = ?, fuel = ?, body = ?, engine = ?, damage = ? WHERE %s IN (?) AND plate = ?",
|
||||
SetInGarage = "UPDATE %s SET in_garage = 1 WHERE plate = ?",
|
||||
UpdateProps = "UPDATE %s SET %s = ? WHERE plate = ?",
|
||||
VehicleDriveOut = "UPDATE %s SET in_garage = 0 WHERE %s = ? AND plate = ?",
|
||||
UpdateGarageId = "UPDATE %s SET garage_id = ? WHERE %s = ? AND plate = ?",
|
||||
UpdatePlayerId = "UPDATE %s SET %s = ? WHERE %s = ? AND plate = ?",
|
||||
UpdateVehicleNickname = "UPDATE %s SET nickname = ? WHERE %s = ? AND plate = ?",
|
||||
UpdateVehiclePlate = "UPDATE %s SET plate = ?, %s = ? WHERE plate = ?",
|
||||
ImpoundVehicle = "UPDATE %s SET impound = 1, impound_retrievable = ?, impound_data = ?, garage_id = ?, fuel = ?, body = ?, engine = ?, damage = ? WHERE plate = ?",
|
||||
ImpoundReturnToGarage = "UPDATE %s SET impound = 0, impound_data = '', garage_id = ?, in_garage = ? WHERE plate = ?",
|
||||
SetJobVehicle = "UPDATE %s SET %s = ?, job_vehicle = 1, job_vehicle_rank = ? WHERE plate = ?",
|
||||
SetGangVehicle = "UPDATE %s SET %s = ?, gang_vehicle = 1, gang_vehicle_rank = ? WHERE plate = ?",
|
||||
SetSocietyVehicleAsPlayerOwned = "UPDATE %s SET %s = ?, job_vehicle = 0, gang_vehicle = 0 WHERE plate = ?",
|
||||
DeleteVehicle = "DELETE FROM %s WHERE plate = ?",
|
||||
}
|
||||
}
|
||||
|
||||
if (Config.Framework == "auto" and GetResourceState("qbx_core") == "started") or Config.Framework == "Qbox" then
|
||||
Config.Framework = "Qbox"
|
||||
|
||||
Framework.VehiclesTable = "player_vehicles"
|
||||
Framework.PlayerIdentifier = "citizenid"
|
||||
Framework.VehProps = "mods"
|
||||
Framework.PlayersTable = "players"
|
||||
Framework.PlayersTableId = "citizenid"
|
||||
elseif (Config.Framework == "auto" and GetResourceState("qb-core") == "started") or Config.Framework == "QBCore" then
|
||||
QBCore = exports['qb-core']:GetCoreObject()
|
||||
Config.Framework = "QBCore"
|
||||
|
||||
Framework.VehiclesTable = "player_vehicles"
|
||||
Framework.PlayerIdentifier = "citizenid"
|
||||
Framework.VehProps = "mods"
|
||||
Framework.PlayersTable = "players"
|
||||
Framework.PlayersTableId = "citizenid"
|
||||
|
||||
elseif (Config.Framework == "auto" and GetResourceState("es_extended") == "started") or Config.Framework == "ESX" then
|
||||
ESX = exports["es_extended"]:getSharedObject()
|
||||
Config.Framework = "ESX"
|
||||
|
||||
Framework.VehiclesTable = "owned_vehicles"
|
||||
Framework.PlayerIdentifier = "owner"
|
||||
Framework.VehProps = "vehicle"
|
||||
Framework.PlayersTable = "users"
|
||||
Framework.PlayersTableId = "identifier"
|
||||
else
|
||||
error("You need to set the Config.Framework to either \"QBCore\" or \"ESX\" or \"Qbox\"!")
|
||||
end
|
|
@ -0,0 +1,22 @@
|
|||
if (Config.Framework == "auto" and GetResourceState("qb-core") == "started") or Config.Framework == "QBCore" then
|
||||
-- Player data
|
||||
Globals.PlayerData = QBCore.Functions.GetPlayerData()
|
||||
|
||||
RegisterNetEvent("QBCore:Client:OnPlayerLoaded")
|
||||
AddEventHandler("QBCore:Client:OnPlayerLoaded", function()
|
||||
Globals.PlayerData = QBCore.Functions.GetPlayerData()
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
|
||||
RegisterNetEvent("QBCore:Client:OnJobUpdate")
|
||||
AddEventHandler("QBCore:Client:OnJobUpdate", function(job)
|
||||
Globals.PlayerData.job = job
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
|
||||
RegisterNetEvent("QBCore:Client:OnGangUpdate")
|
||||
AddEventHandler("QBCore:Client:OnGangUpdate", function(gang)
|
||||
Globals.PlayerData.gang = gang
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
end
|
|
@ -0,0 +1,55 @@
|
|||
if (Config.Framework == "auto" and GetResourceState("qb-core") == "started") or Config.Framework == "QBCore" then
|
||||
-- qb-phone fix
|
||||
QBCore.Functions.CreateCallback("jg-advancedgarages:server:GetVehiclesPhone", function(source, cb)
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
|
||||
local vehicles = MySQL.query.await("SELECT * FROM player_vehicles WHERE citizenid = ? AND job_vehicle = ? AND gang_vehicle = ?", {Player.PlayerData.citizenid, 0, 0})
|
||||
|
||||
for i, vehicle in pairs(vehicles) do
|
||||
local vehShared = QBCore.Shared.Vehicles[vehicle.vehicle]
|
||||
local vehBrand, vehName, vehState
|
||||
local vehGarage = vehicle.garage_id
|
||||
|
||||
if vehShared then
|
||||
vehBrand = vehShared.brand
|
||||
vehName = vehShared.name
|
||||
else
|
||||
vehBrand = ""
|
||||
vehName = vehicle.vehicle
|
||||
end
|
||||
|
||||
if vehicle.impound == 1 then
|
||||
vehGarage = Locale.impound
|
||||
vehState = json.decode(vehicle.impound_data).reason
|
||||
elseif vehicle.in_garage then
|
||||
vehState = Locale.inGarage
|
||||
else
|
||||
vehState = Locale.notInGarage
|
||||
end
|
||||
|
||||
vehicles[i] = {
|
||||
fullname = vehBrand .. " " .. vehName,
|
||||
brand = vehBrand,
|
||||
model = vehName,
|
||||
garage = vehGarage,
|
||||
state = vehState,
|
||||
plate = vehicle.plate,
|
||||
fuel = vehicle.fuel,
|
||||
engine = vehicle.engine,
|
||||
body = vehicle.body
|
||||
}
|
||||
end
|
||||
|
||||
cb(vehicles)
|
||||
end)
|
||||
|
||||
-- qb-vehiclesales fix
|
||||
QBCore.Functions.CreateCallback("qb-garage:server:checkVehicleOwner", function(source, cb, plate)
|
||||
local src = source
|
||||
local pData = QBCore.Functions.GetPlayer(src)
|
||||
|
||||
local result = MySQL.single.await("SELECT * FROM player_vehicles WHERE plate = ? AND citizenid = ?", {plate, pData.PlayerData.citizenid})
|
||||
if result then cb(true, result.balance)
|
||||
else cb(false) end
|
||||
end)
|
||||
end
|
|
@ -0,0 +1,22 @@
|
|||
if (Config.Framework == "auto" and GetResourceState("qbx_core") == "started") or Config.Framework == "Qbox" then
|
||||
-- Player data
|
||||
Globals.PlayerData = exports.qbx_core:GetPlayerData()
|
||||
|
||||
RegisterNetEvent("QBCore:Client:OnPlayerLoaded")
|
||||
AddEventHandler("QBCore:Client:OnPlayerLoaded", function()
|
||||
Globals.PlayerData = exports.qbx_core:GetPlayerData()
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
|
||||
RegisterNetEvent("QBCore:Client:OnJobUpdate")
|
||||
AddEventHandler("QBCore:Client:OnJobUpdate", function(job)
|
||||
Globals.PlayerData.job = job
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
|
||||
RegisterNetEvent("QBCore:Client:OnGangUpdate")
|
||||
AddEventHandler("QBCore:Client:OnGangUpdate", function(gang)
|
||||
Globals.PlayerData.gang = gang
|
||||
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
|
||||
end)
|
||||
end
|
|
@ -0,0 +1,317 @@
|
|||
--
|
||||
-- Core Functions
|
||||
--
|
||||
|
||||
---@param src integer
|
||||
---@param msg string
|
||||
---@param type "success" | "warning" | "error"
|
||||
function Framework.Server.Notify(src, msg, type)
|
||||
TriggerClientEvent("jg-advancedgarages:client:notify", src, msg, type, 5000)
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
---@returns boolean
|
||||
function Framework.Server.IsAdmin(src)
|
||||
return IsPlayerAceAllowed(tostring(src), "command") or false
|
||||
end
|
||||
|
||||
function Framework.Server.PayIntoSocietyFund(jobName, money)
|
||||
local usingNewQBBanking = GetResourceState("qb-banking") == "started" and tonumber(string.sub(GetResourceMetadata("qb-banking", "version", 0), 1, 3)) >= 2
|
||||
|
||||
if (Config.Banking == "auto" and GetResourceState("Renewed-Banking") == "started") or Config.Banking == "Renewed-Banking" then
|
||||
exports['Renewed-Banking']:addAccountMoney(jobName, money)
|
||||
elseif (Config.Banking == "auto" and GetResourceState("okokBanking") == "started") or Config.Banking == "okokBanking" then
|
||||
exports['okokBanking']:AddMoney(jobName, money)
|
||||
elseif (Config.Banking == "auto" and GetResourceState("fd_banking") == "started") or Config.banking == "fd_banking" then
|
||||
exports.fd_banking:AddMoney(jobName, money)
|
||||
elseif (Config.Banking == "auto" and (Config.Framework == "QBCore" or Config.Framework == "Qbox")) then
|
||||
if usingNewQBBanking then
|
||||
exports["qb-banking"]:AddMoney(jobName, money)
|
||||
else
|
||||
exports["qb-management"]:AddMoney(jobName, money)
|
||||
end
|
||||
elseif Config.Banking == "qb-banking" then
|
||||
exports["qb-banking"]:AddMoney(jobName, money)
|
||||
elseif Config.Banking == "qb-management" then
|
||||
exports["qb-management"]:AddMoney(jobName, money)
|
||||
elseif (Config.Banking == "auto" and Config.Framework == "ESX") or Config.Banking == "esx_addonaccount" then
|
||||
TriggerEvent("esx_society:getSociety", jobName, function(society)
|
||||
TriggerEvent("esx_addonaccount:getSharedAccount", society.account, function(account)
|
||||
account.addMoney(money)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- Player Functions
|
||||
--
|
||||
|
||||
---@param src integer
|
||||
function Framework.Server.GetPlayer(src)
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Functions.GetPlayer(src)
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return exports.qbx_core:GetPlayer(src)
|
||||
elseif Config.Framework == "ESX" then
|
||||
return ESX.GetPlayerFromId(src)
|
||||
end
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
function Framework.Server.GetPlayerInfo(src)
|
||||
local player = Framework.Server.GetPlayer(src)
|
||||
if not player then return false end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return {
|
||||
name = player.PlayerData.charinfo.firstname .. " " .. player.PlayerData.charinfo.lastname
|
||||
}
|
||||
elseif Config.Framework == "ESX" then
|
||||
return {
|
||||
name = player.getName()
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
---@return {name:string,label:string,grade:number} | false
|
||||
function Framework.Server.GetPlayerJob(src)
|
||||
local player = Framework.Server.GetPlayer(src)
|
||||
if not player then return false end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
if not player.PlayerData then return false end
|
||||
|
||||
return {
|
||||
name = player.PlayerData.job.name,
|
||||
label = player.PlayerData.job.label,
|
||||
grade = player.PlayerData.job.grade?.level or 0,
|
||||
}
|
||||
elseif Config.Framework == "ESX" then
|
||||
return {
|
||||
name = player.job.name,
|
||||
label = player.job.label,
|
||||
grade = player.job.grade
|
||||
}
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
---@return {name:string,label:string,grade:number} | false
|
||||
function Framework.Server.GetPlayerGang(src)
|
||||
if (Config.Gangs == "auto" and GetResourceState("rcore_gangs") == "started") or Config.Gangs == "rcore_gangs" then
|
||||
local gang = exports.rcore_gangs:GetPlayerGang(src)
|
||||
if not gang then return {} end
|
||||
|
||||
return {
|
||||
name = gang.name,
|
||||
label = gang.name,
|
||||
grade = 0 -- rcore_gangs' grade system are only strings
|
||||
}
|
||||
elseif (Config.Gangs == "auto" and GetResourceState("qb-gangs") == "started") or Config.Gangs == "qb-gangs" or Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
|
||||
local player = Framework.Server.GetPlayer(src)
|
||||
if not player then return false end
|
||||
|
||||
return {
|
||||
name = player.PlayerData.gang.name,
|
||||
label = player.PlayerData.gang.label,
|
||||
grade = player.PlayerData.gang.grade.level
|
||||
}
|
||||
elseif Config.Framework == "ESX" then
|
||||
-- To implement gangs in ESX, enable Config.GangEnableCustomESXIntegration & then add the necessary exports here.
|
||||
-- It must return the same data structure as QB/X above, with { name, label, grade }
|
||||
-- Heads up, you must also add the exports to cl-functions.lua -> Framework.Client.GetPlayerGang
|
||||
error("ESX does not natively support gangs.");
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
function Framework.Server.GetPlayerIdentifier(src)
|
||||
local player = Framework.Server.GetPlayer(src)
|
||||
if not player then return false end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return player.PlayerData.citizenid
|
||||
elseif Config.Framework == "ESX" then
|
||||
return player.getIdentifier()
|
||||
end
|
||||
end
|
||||
|
||||
---@param identifier string
|
||||
function Framework.Server.GetSrcFromIdentifier(identifier)
|
||||
if Config.Framework == "QBCore" then
|
||||
local player = QBCore.Functions.GetPlayerByCitizenId(identifier)
|
||||
if not player then return false end
|
||||
return player.PlayerData.source
|
||||
elseif Config.Framework == "Qbox" then
|
||||
local player = exports.qbx_core:GetPlayerByCitizenId(identifier)
|
||||
if not player then return false end
|
||||
return player.PlayerData.source
|
||||
elseif Config.Framework == "ESX" then
|
||||
local xPlayer = ESX.GetPlayerFromIdentifier(identifier)
|
||||
if not xPlayer then return false end
|
||||
return xPlayer.source
|
||||
end
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
---@param type "cash" | "bank" | "money"
|
||||
function Framework.Server.GetPlayerBalance(src, type)
|
||||
local player = Framework.Server.GetPlayer(src)
|
||||
if not player then return 0 end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return player.PlayerData.money[type]
|
||||
elseif Config.Framework == "ESX" then
|
||||
if type == "cash" then type = "money" end
|
||||
|
||||
for i, acc in pairs(player.getAccounts()) do
|
||||
if acc.name == type then
|
||||
return acc.money
|
||||
end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
---@param src integer
|
||||
---@param amount number
|
||||
---@param account "cash" | "bank" | "money"
|
||||
---@return boolean success
|
||||
function Framework.Server.PlayerRemoveMoney(src, amount, account)
|
||||
local player = Framework.Server.GetPlayer(src)
|
||||
account = account or "bank"
|
||||
|
||||
if Framework.Server.GetPlayerBalance(src, account) < amount then
|
||||
Framework.Server.Notify(src, Locale.notEnoughMoneyError, "error")
|
||||
return false
|
||||
end
|
||||
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
player.Functions.RemoveMoney(account, round(amount, 0))
|
||||
elseif Config.Framework == "ESX" then
|
||||
if account == "cash" then account = "money" end
|
||||
player.removeAccountMoney(account, round(amount, 0))
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
---@return {id:number,identifier:string,name:string}[] players
|
||||
function Framework.Server.GetPlayers()
|
||||
local players = {}
|
||||
|
||||
for _, playerId in ipairs(GetPlayers()) do
|
||||
players[#players+1] = {
|
||||
id = tonumber(playerId),
|
||||
identifier = Framework.Server.GetPlayerIdentifier(tonumber(playerId, 10)),
|
||||
name = Framework.Server.GetPlayerInfo(tonumber(playerId, 10))?.name
|
||||
}
|
||||
end
|
||||
|
||||
return players
|
||||
end
|
||||
|
||||
---@return table | false jobs
|
||||
function Framework.Server.GetJobs()
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Shared.Jobs
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return exports.qbx_core:GetJobs()
|
||||
elseif Config.Framework == "ESX" then
|
||||
return ESX.GetJobs()
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@return table | false gangs
|
||||
function Framework.Server.GetGangs()
|
||||
if (Config.Gangs == "auto" and GetResourceState("rcore_gangs") == "started") or Config.Gangs == "rcore_gangs" then
|
||||
local gangs = MySQL.query.await("SELECT name FROM gangs")
|
||||
return gangs or {}
|
||||
elseif (Config.Gangs == "auto" and GetResourceState("qb-gangs") == "started") or Config.Gangs == "qb-gangs" then
|
||||
if Config.Framework == "QBCore" then
|
||||
return QBCore.Shared.Gangs
|
||||
elseif Config.Framework == "Qbox" then
|
||||
return exports.qbx_core:GetGangs()
|
||||
end
|
||||
elseif Config.Framework == "ESX" then
|
||||
error("ESX does not natively support gangs.");
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---@param vehicle integer
|
||||
---@return string | false plate
|
||||
function Framework.Server.GetPlate(vehicle)
|
||||
local plate = GetVehicleNumberPlateText(vehicle)
|
||||
if not plate or plate == nil or plate == "" then return false end
|
||||
|
||||
if GetResourceState("brazzers-fakeplates") == "started" then
|
||||
local originalPlate = MySQL.scalar.await("SELECT plate FROM player_vehicles WHERE fakeplate = ?", {plate})
|
||||
if originalPlate then plate = originalPlate end
|
||||
end
|
||||
|
||||
local trPlate = string.gsub(plate, "^%s*(.-)%s*$", "%1")
|
||||
return trPlate
|
||||
end
|
||||
|
||||
---@param vehicle boolean|QueryResult|unknown|{ [number]: { [string]: unknown }|{ [string]: unknown }}
|
||||
---@return string | number | false model
|
||||
function Framework.Server.GetModelColumn(vehicle)
|
||||
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
|
||||
return vehicle.vehicle or tonumber(vehicle.hash) or false
|
||||
elseif Config.Framework == "ESX" then
|
||||
if not vehicle or not vehicle.vehicle then return false end
|
||||
|
||||
if type(vehicle.vehicle) == "string" then
|
||||
if not json.decode(vehicle.vehicle) then return false end
|
||||
return json.decode(vehicle.vehicle).model
|
||||
else
|
||||
return vehicle.vehicle.model
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
--
|
||||
-- ti_fuel
|
||||
--
|
||||
|
||||
RegisterNetEvent("jg-advancedgarages:server:save-ti-fuel-type", function(plate, type)
|
||||
MySQL.query.await("ALTER TABLE " .. Framework.VehiclesTable .. " ADD COLUMN IF NOT EXISTS `ti_fuel_type` VARCHAR(100) DEFAULT '';")
|
||||
MySQL.update.await("UPDATE " .. Framework.VehiclesTable .. " SET ti_fuel_type = ? WHERE plate = ?", {type, plate});
|
||||
end)
|
||||
|
||||
lib.callback.register("jg-advancedgarages:server:get-ti-fuel-type", function(src, plate)
|
||||
MySQL.query.await("ALTER TABLE " .. Framework.VehiclesTable .. " ADD COLUMN IF NOT EXISTS `ti_fuel_type` VARCHAR(100) DEFAULT '';")
|
||||
return MySQL.scalar.await("SELECT ti_fuel_type FROM " .. Framework.VehiclesTable .. " WHERE plate = ?", {plate}) or false
|
||||
end)
|
||||
|
||||
--
|
||||
-- Brazzers-FakePlates
|
||||
--
|
||||
|
||||
if GetResourceState("brazzers-fakeplates") == "started" then
|
||||
lib.callback.register("jg-advancedgarages:server:brazzers-get-plate-from-fakeplate", function(_, fakeplate)
|
||||
local result = MySQL.scalar.await("SELECT plate FROM player_vehicles WHERE fakeplate = ?", {fakeplate})
|
||||
if result then return result end
|
||||
return false
|
||||
end)
|
||||
|
||||
lib.callback.register("jg-advancedgarages:server:brazzers-get-fakeplate-from-plate", function(_, plate)
|
||||
local result = MySQL.scalar.await("SELECT fakeplate FROM player_vehicles WHERE plate = ?", {plate})
|
||||
if result then return result end
|
||||
return false
|
||||
end)
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue