(Beta) Fixes for multiframework support

This commit is contained in:
Jim Shield
2025-03-01 12:58:43 +00:00
committed by GitHub
parent f9812a689e
commit 8eb98bff29
39 changed files with 7372 additions and 7188 deletions

View File

@@ -50,6 +50,17 @@ function onPlayerLoaded(func, onStart)
end
end
--trying to add unload functions for when players switch ped
function onPlayerUnload(func)
AddEventHandler('QBCore:Client:OnPlayerUnload', function()
func()
end)
AddEventHandler('ox:playerLogout', function()
func()
end)
end
--- Executes a function when the resource starts.
---
--- This function wraps the `onResourceStart` event, allowing you to execute code when the resource starts.

View File

@@ -27,7 +27,8 @@ local itemResource, jobResource, vehResource = "", "", ""
-- Load item lists --
-- Complies the items from ox_inventory, qb-core or esx into 'Items' and loads them in a layout similar to qb-core's Shared items.lua --
-- For example this makes it so instead of QBCore.Shared.Items[item], you can load 'Item[item]' in the script --
if isStarted(OXInv) then itemResource = OXInv
if isStarted(OXInv) then
itemResource = OXInv
Items = exports[OXInv]:Items()
for k, v in pairs(Items) do
if v.client and v.client.image then
@@ -39,7 +40,8 @@ if isStarted(OXInv) then itemResource = OXInv
Items[k].thirst = v.client and v.client.thirst or nil
end
elseif isStarted(QBExport) then itemResource = QBExport
elseif isStarted(QBExport) then
itemResource = QBExport
Core = Core or exports[QBExport]:GetCoreObject()
Items = Core and Core.Shared.Items or nil
if isStarted(QBExport) and not isStarted(QBXExport) then
@@ -49,16 +51,41 @@ elseif isStarted(QBExport) then itemResource = QBExport
end)
end
elseif isStarted(ESXExport) then itemResource = ESXExport
elseif isStarted(ESXExport) then
itemResource = ESXExport
ESX = exports[ESXExport]:getSharedObject()
Items = ESX and ESX.Items or nil
--Items = ESX and ESX.Items or nil
while ESX == nil do
print("Waiting for ESX")
Wait(0)
end
if isServer() then
Items = ESX.GetItems()
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7" .. itemResource)
end
CreateThread(function()
while not ESX do Wait(0) end
if isServer() then
createCallback(getScript()..":getItems", function(source)
return Items
end)
end
if not isServer() then
Items = triggerCallback(getScript()..":getItems")
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7" .. itemResource)
end
end)
end
-- If it fails to load items, then it will print the error below --
-- If it loads them and debug is on, print how many items and where from --
if not Items then
print("^4ERROR^7: ^2No Core Items detected ^7- ^2Check ^3exports^1.^2lua^7")
else
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7" .. itemResource)
if not isStarted(ESXExport) then
if not Items then
print("^4ERROR^7: ^2No Core Items detected ^7- ^2Check ^3exports^1.^2lua^7")
else
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7" .. itemResource)
end
end
-- Load Vehicles --

View File

@@ -358,6 +358,24 @@ function DrawText3D(coord, text, highlight)
ClearDrawOrigin()
end
-- readd missing function for drawtext
function GetLineCountAndMaxLength(text)
local lineCount = 0
local maxLength = 0
for line in text:gmatch("[^\n]+") do
lineCount = lineCount + 1
local lineLength = string.len(line)
if lineLength > maxLength then
maxLength = lineLength
end
end
-- If there are no newline characters (or text is empty), treat it as a single line.
if lineCount == 0 then
lineCount = 1
end
return lineCount, maxLength
end
--- Displays a help message on the screen.
---
--- @param text string The text to display as a help message.

View File

@@ -56,7 +56,7 @@ function createInput(title, opts)
if opts[i].type == "number" then
options[i] = {
type = "number",
label = opts[i].text..(opts[i].txt and " - "..opts[i].txt or ""),
label = (opts[i].label or opts[i].text)..(opts[i].txt and " - "..opts[i].txt or ""),
isRequired = opts[i].isRequired,
name = opts[i].name,
options = opts[i].options,
@@ -85,14 +85,10 @@ function createInput(title, opts)
end
dialog = exports[OXLibExport]:inputDialog(title, options)
return dialog
end
if Config.System.Menu == "qb" then
elseif Config.System.Menu == "qb" then
dialog = exports['qb-input']:ShowInput({ header = title, submitText = "Accept", inputs = opts })
return dialog
end
if Config.System.Menu == "gta" then
elseif Config.System.Menu == "gta" then
WarMenu.CreateMenu(tostring(opts),
title,
" ",
@@ -152,5 +148,44 @@ function createInput(title, opts)
end
Wait(0)
end
elseif Config.System.Menu == "esx" then -- horrible input dialog, not even worth using, get OX
local results = {}
for i, opt in ipairs(opts) do
local prompt = opt.text or opt.label or "Enter value"
-- For radio/select types, append available options in the prompt.
if (opt.type == "radio" or opt.type == "select") and opt.options then
local choices = ""
for j, choice in ipairs(opt.options) do
choices = choices .. choice.text .. " (" .. tostring(choice.value) .. ")"
if j < #opt.options then choices = choices .. ", " end
end
prompt = prompt .. " [" .. choices .. "]"
elseif opt.type == "number" then
prompt = prompt .. " (number between " .. (opt.min or 0) .. " and " .. (opt.max or 100) .. ")"
end
local value = nil
ESX.UI.Menu.Open('dialog', getScript(), 'input_' .. i, {
title = prompt
}, function(data, menu)
value = data.value
menu.close()
end, function(data, menu)
menu.close()
end)
-- Wait until the player submits a value.
while value == nil do
Wait(0)
end
-- Convert to a number if needed.
if opt.type == "number" then
value = tonumber(value)
end
results[opt.name or i] = value
end
return results
end
end

View File

@@ -475,6 +475,18 @@ function getPlayer(source)
name = info.getName(),
cash = info.getMoney(),
bank = info.getAccount("bank").money,
firstname = info.variables.firstName,
lastname = info.variables.lastName,
source = info.source,
job = info.job.name,
--jobBoss = info.job.isboss,
--gang = info.gang.name,
--gangBoss = info.gang.isboss,
onDuty = info.job.onDuty,
--account = info.charinfo.account,
--citizenId = info.citizenid,
}
elseif isStarted(OXCoreExport) then
@@ -492,9 +504,19 @@ function getPlayer(source)
elseif isStarted(QBXExport) then
local info = exports[QBXExport]:GetPlayer(src)
Player = {
firstname = info.PlayerData.charinfo.firstname,
lastname = info.PlayerData.charinfo.lastname,
name = info.PlayerData.charinfo.firstname.." "..info.PlayerData.charinfo.lastname,
cash = exports[OXInv]:Search(src, 'count', "money"),
bank = info.Functions.GetMoney("bank"),
source = info.PlayerData.source,
job = info.PlayerData.job.name,
jobBoss = info.PlayerData.job.isboss,
gang = info.PlayerData.gang.name,
gangBoss = info.PlayerData.gang.isboss,
onDuty = info.PlayerData.job.onduty,
account = info.PlayerData.charinfo.account,
citizenId = info.PlayerData.citizenid,
}
elseif isStarted(QBExport) and not isStarted(QBXExport) then
@@ -541,13 +563,26 @@ function getPlayer(source)
else
if isStarted(ESXExport) and ESX ~= nil then
local info = ESX.GetPlayerData()
--jsonPrint(info)
local cash, bank = 0, 0
for k, v in pairs(ESX.GetPlayerData().accounts) do
if v.name == "money" then cash = v.money end
if v.name == "bank" then bank = v.money end
end
Player = {
name = ('%s %s'):format(info.firstName, info.lastName),
firstname = info.firstName,
lastname = info.lastName,
source = GetPlayerServerId(PlayerId()),
job = info.job.name,
--jobBoss = info.job.isboss,
--gang = info.gang.name,
--gangBoss = info.gang.isboss,
onDuty = info.job.onDuty,
--account = info.charinfo.account,
--citizenId = info.citizenid,
name = info.firstName.." "..info.lastName,
cash = cash,
bank = bank,
}

View File

@@ -45,7 +45,7 @@ local targetEntities = {}
function createEntityTarget(entity, opts, dist)
targetEntities[#targetEntities + 1] = entity
local entityCoords = GetEntityCoords(entity)
if Config.System.DontUseTarget then
if Config.System.DontUseTarget or (not isStarted(OXTargetExport) and not isStarted(QBTargetExport)) then
debugPrint("^6Bridge^7: ^2Creating new ^3Entity^2 target with ^6DrawText ^7"..entity)
local existingTarget = nil
for key, target in pairs(TextTargets) do
@@ -138,7 +138,7 @@ local boxTargets = {}
--- }, 1.5)
--- ```
function createBoxTarget(data, opts, dist)
if Config.System.DontUseTarget then
if Config.System.DontUseTarget or (not isStarted(OXTargetExport) and not isStarted(QBTargetExport)) then
debugPrint("^6Bridge^7: ^2Creating new ^3Box^2 target with ^6DrawText ^7"..data[1])
local existingTarget = nil
for key, target in pairs(TextTargets) do
@@ -304,6 +304,59 @@ function createCircleTarget(data, opts, dist)
end
end
local targetEntities = {}
--- Creates a target for an entity with specified options and interaction distance.
---
--- This function supports different targeting systems (OX Target, QB Target, or custom DrawText3D targets)
--- based on the server configuration. It translates qb-target style options into the appropriate format
--- for the detected targeting system.
---
---@param entity number The entity ID to create a target for.
---@param opts table A table of option configurations for the target.
--- - **icon** (`string`): The icon to display for the option.
--- - **label** (`string`): The label text for the option.
--- - **item** (`string|nil`): (Optional) The item associated with the option.
--- - **job** (`string|nil`): (Optional) The job required to interact with the option.
--- - **gang** (`string|nil`): (Optional) The gang required to interact with the option.
--- - **action** (`function|nil`): (Optional) The function to execute when the option is selected.
---@param dist number The interaction distance for the target.
---
---@usage
--- ```lua
--- createEntityTarget(entityId, {
--- { icon = "fas fa-car", label = "Open Vehicle", action = openVehicle },
--- { icon = "fas fa-lock", label = "Lock Vehicle", action = lockVehicle }
--- }, 2.5)
--- ```
function createModelTarget(models, opts, dist)
if Config.System.DontUseTarget or (not isStarted(OXTargetExport) and not isStarted(QBTargetExport)) then
--
elseif isStarted(OXTargetExport) then
debugPrint("^6Bridge^7: ^2Creating new ^3Model^2 target with ^6"..OXTargetExport)
local options = {}
for i = 1, #opts do
options[i] = {
icon = opts[i].icon,
label = opts[i].label,
item = opts[i].item or nil,
groups = opts[i].job or opts[i].gang,
onSelect = opts[i].action,
canInteract = function(_, distance)
return distance < dist and true or false
end
}
end
exports[OXTargetExport]:addModel(models, options)
elseif isStarted(QBTargetExport) then
debugPrint("^6Bridge^7: ^2Creating new ^3Entity^2 target with ^6"..QBTargetExport)
local options = { options = opts, distance = dist }
exports[QBTargetExport]:AddTargetModel(models, options)
end
end
-- Simple function to remove an entity target created within the script --
--- Removes a previously created entity target.
---
@@ -316,7 +369,7 @@ end
function removeEntityTarget(entity)
if isStarted(QBTargetExport) then exports[QBTargetExport]:RemoveTargetEntity(entity) end
if isStarted(OXTargetExport) then exports[OXTargetExport]:removeLocalEntity(entity, nil) end
if Config.System.DontUseTarget then TextTargets[entity] = nil end
if (Config.System.DontUseTarget or (not isStarted(OXTargetExport) and not isStarted(QBTargetExport))) then TextTargets[entity] = nil end
end
-- Simple function to remove circle or box targets in the script --
@@ -334,11 +387,11 @@ end
function removeZoneTarget(target)
if isStarted(QBTargetExport) then exports[QBTargetExport]:RemoveZone(target) end
if isStarted(OXTargetExport) then exports[OXTargetExport]:removeZone(target, true) end
if Config.System.DontUseTarget then TextTargets[target] = nil end
if (Config.System.DontUseTarget or (not isStarted(OXTargetExport) and not isStarted(QBTargetExport))) then TextTargets[target] = nil end
end
-- If no target script is found, default to DrawText3D targets -- * experimental *
if Config.System.DontUseTarget and not isServer() then
if (Config.System.DontUseTarget or (not isStarted(OXTargetExport) and not isStarted(QBTargetExport))) and not isServer() then
CreateThread(function()
while true do
local pedCoords = GetEntityCoords(PlayerPedId())

View File

@@ -172,6 +172,11 @@ function registerCommand(command, options)
elseif isStarted(QBExport) and not isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7 "..QBExport, command)
Core.Commands.Add(command, options[1], options[2], options[3], options[4], options[5] and options[5] or nil)
elseif isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7 ESX Legacy", command)
ESX.RegisterCommand(command, options[5] or 'admin', function(xPlayer, args, showError)
options[4](xPlayer.source, args, showError)
end, false, { help = options[1] })
end
end