local function exportHandler(exportName, func) AddEventHandler(('__cfx_export_qb-target_%s'):format(exportName), function(setCB) setCB(func) end) end ---@param options table ---@return table local function convert(options) local distance = options.distance options = options.options for _, v in pairs(options) do v.onSelect = v.action v.distance = v.distance or distance v.name = v.name or v.label v.items = v.item v.groups = v.job local groupType = type(v.groups) if groupType == 'nil' then v.groups = {} groupType = 'table' end if groupType == 'string' then local val = v.gang if type(v.gang) == 'table' then if table.type(v.gang) ~= 'array' then val = {} for k in pairs(v.gang) do val[#val + 1] = k end end end if val then v.groups = {v.groups, type(val) == 'table' and table.unpack(val) or val} end val = v.citizenid if type(v.citizenid) == 'table' then if table.type(v.citizenid) ~= 'array' then val = {} for k in pairs(v.citizenid) do val[#val+1] = k end end end if val then v.groups = {v.groups, type(val) == 'table' and table.unpack(val) or val} end elseif groupType == 'table' then local val = {} if table.type(v.groups) ~= 'array' then for k in pairs(v.groups) do val[#val + 1] = k end v.groups = val val = nil end val = v.gang if type(v.gang) == 'table' then if table.type(v.gang) ~= 'array' then val = {} for k in pairs(v.gang) do val[#val + 1] = k end end end if val then v.groups = {table.unpack(v.groups), type(val) == 'table' and table.unpack(val) or val} end val = v.citizenid if type(v.citizenid) == 'table' then if table.type(v.citizenid) ~= 'array' then val = {} for k in pairs(v.citizenid) do val[#val+1] = k end end end if val then v.groups = {table.unpack(v.groups), type(val) == 'table' and table.unpack(val) or val} end end if type(v.groups) == 'table' and table.type(v.groups) == 'empty' then v.groups = nil end if v.event and v.type and v.type ~= 'client' then if v.type == 'server' then v.serverEvent = v.event elseif v.type == 'command' then v.command = v.event end v.event = nil v.type = nil end v.action = nil v.job = nil v.gang = nil v.citizenid = nil v.item = nil v.qtarget = true end return options end exportHandler('AddBoxZone', function(name, center, length, width, options, targetoptions) local z = center.z if not options.useZ then z = z + math.abs(options.maxZ - options.minZ) / 2 center = vec3(center.x, center.y, z) end return lib.zones.box({ name = name, coords = center, size = vec3(width, length, (options.useZ or not options.maxZ) and center.z or math.abs(options.maxZ - options.minZ)), debug = options.debugPoly, rotation = options.heading, options = convert(targetoptions), resource = GetInvokingResource(), }).id end) exportHandler('AddPolyZone', function(name, points, options, targetoptions) local newPoints = table.create(#points, 0) local thickness = math.abs(options.maxZ - options.minZ) for i = 1, #points do local point = points[i] newPoints[i] = vec3(point.x, point.y, options.maxZ - (thickness / 2)) end return lib.zones.poly({ name = name, points = newPoints, thickness = thickness, debug = options.debugPoly, options = convert(targetoptions), resource = GetInvokingResource(), }).id end) exportHandler('AddCircleZone', function(name, center, radius, options, targetoptions) return lib.zones.sphere({ name = name, coords = center, radius = radius, debug = options.debugPoly, options = convert(targetoptions), resource = GetInvokingResource(), }).id end) exportHandler('RemoveZone', function(id) if Zones then if type(id) == 'string' then for _, v in pairs(Zones) do if v.name == id then v:remove() end end end if Zones[id] then Zones[id]:remove() end end end) exportHandler('AddTargetBone', function(bones, options) if type(bones) ~= 'table' then bones = { bones } end options = convert(options) for _, v in pairs(options) do v.bones = bones end exports.ox_target:addGlobalVehicle(options) end) exportHandler('AddTargetEntity', function(entities, options) if type(entities) ~= 'table' then entities = { entities } end options = convert(options) for i = 1, #entities do local entity = entities[i] if NetworkGetEntityIsNetworked(entity) then target.addEntity(NetworkGetNetworkIdFromEntity(entity), options) else target.addLocalEntity(entity, options) end end end) exportHandler('RemoveTargetEntity', function(entities, labels) if type(entities) ~= 'table' then entities = { entities } end for i = 1, #entities do local entity = entities[i] if NetworkGetEntityIsNetworked(entity) then target.removeEntity(NetworkGetNetworkIdFromEntity(entity), labels) else target.removeLocalEntity(entity, labels) end end end) exportHandler('AddTargetModel', function(models, options) target.addModel(models, convert(options)) end) exportHandler('RemoveTargetModel', function(models, labels) target.removeModel(models, labels) end) exportHandler('AddGlobalPed', function(options) target.addGlobalPed(convert(options)) end) exportHandler('RemoveGlobalPed', function(labels) target.removeGlobalPed(labels) end) exportHandler('AddGlobalVehicle', function(options) target.addGlobalVehicle(convert(options)) end) exportHandler('RemoveGlobalVehicle', function(labels) target.removeGlobalVehicle(labels) end) exportHandler('AddGlobalObject', function(options) target.addGlobalObject(convert(options)) end) exportHandler('RemoveGlobalObject', function(labels) target.removeGlobalObject(labels) end) exportHandler('AddGlobalPlayer', function(options) target.addGlobalPlayer(convert(options)) end) exportHandler('RemoveGlobalPlayer', function(labels) target.removeGlobalPlayer(labels) end)