2025-03-04 22:28:34 -05:00
local resourceName = "qb-target"
local configValue = BridgeClientConfig.TargetSystem
if ( configValue == "auto" and GetResourceState ( resourceName ) ~= "started" ) or ( configValue ~= "auto" and configValue ~= resourceName ) then return end
2025-03-03 19:09:06 -05:00
if GetResourceState ( 'ox_target' ) == 'started' then return end -- this is for older versions of ox that supported the backwards compatability. As its depricated we dont want to touch that.
2025-01-08 06:33:31 -05:00
local targetDebug = false
local function detectDebugEnabled ()
2025-04-14 12:18:44 +01:00
if BridgeSharedConfig.DebugLevel == 2 then
2025-01-08 06:33:31 -05:00
targetDebug = true
end
end
detectDebugEnabled ()
local targetZones = {}
2025-02-24 11:07:52 -05:00
Target = Target or {}
2025-04-08 19:27:34 -04:00
local qb_target = exports [ 'qb-target' ]
2025-01-08 06:33:31 -05:00
2025-04-08 19:27:34 -04:00
---This is an internal function that is used to fix the options passed to fit alternative target systems, for example qb-ox or ox-qb etc.
---@param options table
---@return table
2025-02-05 17:42:50 -06:00
Target.FixOptions = function ( options )
2025-01-08 06:33:31 -05:00
for k , v in pairs ( options ) do
2025-02-05 17:42:50 -06:00
local action = v.onSelect or v.action
local select = function ( entityOrData )
if type ( entityOrData ) == 'table' then
return action ( entityOrData.entity )
end
2025-04-08 19:27:34 -04:00
return action ( entityOrData )
2025-02-05 17:42:50 -06:00
end
2025-02-07 22:38:15 -06:00
options [ k ]. action = select
2025-02-26 12:55:16 -06:00
options [ k ]. job = v.job or v.groups
2025-01-08 06:33:31 -05:00
end
2025-02-05 17:42:50 -06:00
return options
end
2025-04-08 19:27:34 -04:00
---This will toggle the targeting system on or off. This is useful for when you want to disable the targeting system for a specific player entirely.
---@param bool boolean
2025-03-10 01:38:37 -04:00
Target.DisableTargeting = function ( bool )
2025-04-08 19:27:34 -04:00
qb_target : AllowTargeting ( not bool )
2025-03-10 01:38:37 -04:00
end
2025-04-08 19:27:34 -04:00
---This will add target options to players.
---@param options table
2025-02-05 17:42:50 -06:00
Target.AddGlobalPlayer = function ( options )
options = Target.FixOptions ( options )
2025-04-08 19:27:34 -04:00
qb_target : AddGlobalPlayer ({
2025-01-25 17:59:19 -05:00
options = options ,
distance = options.distance or 1.5
})
end
2025-04-08 19:27:34 -04:00
---This will remove target options from all players.
Target.RemoveGlobalPlayer = function ()
qb_target : RemoveGlobalPlayer ()
end
2025-01-25 17:59:19 -05:00
2025-04-08 19:27:34 -04:00
---This will add taget options to all vehicles.
---@param options table
2025-01-25 17:59:19 -05:00
Target.AddGlobalVehicle = function ( options )
2025-02-05 17:42:50 -06:00
options = Target.FixOptions ( options )
2025-04-08 19:27:34 -04:00
qb_target : AddGlobalVehicle ({
2025-01-08 06:33:31 -05:00
options = options ,
distance = options.distance or 1.5
})
end
2025-04-08 19:27:34 -04:00
---This will remove target options from all vehicles.
---@param options table
2025-02-20 14:50:27 -05:00
Target.RemoveGlobalVehicle = function ( options )
local assembledLables = {}
for k , v in pairs ( options ) do
table.insert ( assembledLables , v.label )
end
2025-04-08 19:27:34 -04:00
qb_target : RemoveGlobalVehicle ( assembledLables )
2025-02-20 14:50:27 -05:00
end
2025-04-08 19:27:34 -04:00
---This will generate targets on non networked entites with the passed options.
---@param entities number | table
---@param options table
2025-01-08 06:33:31 -05:00
Target.AddLocalEntity = function ( entities , options )
2025-02-05 17:42:50 -06:00
options = Target.FixOptions ( options )
2025-04-08 19:27:34 -04:00
qb_target : AddTargetEntity ( entities , {
2025-01-08 06:33:31 -05:00
options = options ,
distance = options.distance or 1.5
})
end
2025-04-08 19:27:34 -04:00
---This will remove the target options from a local entity. This is useful for when you want to remove target options from a specific entity.
---@param entity any
Target.RemoveLocalEntity = function ( entity )
qb_target : RemoveTargetEntity ( entity )
end
---This will add target options to all specified models. This is useful for when you want to add target options to all models of a specific type.
---@param models number | table
---@param options table
2025-01-08 06:33:31 -05:00
Target.AddModel = function ( models , options )
2025-02-05 17:42:50 -06:00
options = Target.FixOptions ( options )
2025-04-08 19:27:34 -04:00
qb_target : AddTargetModel ( models , {
2025-01-08 06:33:31 -05:00
options = options ,
distance = options.distance or 1.5 ,
})
end
2025-04-08 19:27:34 -04:00
---This will remove target options from all specified models.
---@param model number
Target.RemoveModel = function ( model )
qb_target : RemoveTargetModel ( model )
end
---This will add a box zone to the target system. This is useful for when you want to add target options to a specific area.
---@param name string
---@param coords table
---@param size table
---@param heading number
---@param options table
2025-01-08 06:33:31 -05:00
Target.AddBoxZone = function ( name , coords , size , heading , options )
2025-02-05 17:42:50 -06:00
options = Target.FixOptions ( options )
2025-04-08 19:27:34 -04:00
qb_target : AddBoxZone ( name , coords , size.x , size.y , {
2025-01-08 06:33:31 -05:00
name = name ,
debugPoly = targetDebug ,
heading = heading ,
minZ = coords.z - ( size.x * 0.5 ),
maxZ = coords.z + ( size.x * 0.5 ),
}, {
options = options ,
distance = options.distance or 1.5 ,
})
table.insert ( targetZones , { name = name , creator = GetInvokingResource () })
end
2025-04-08 19:27:34 -04:00
---This will add a circle zone to the target system. This is useful for when you want to add target options to a specific area.
---@param name string
---@param coords table
---@param radius number
---@param options table
2025-04-05 20:58:13 +13:00
Target.AddSphereZone = function ( name , coords , radius , options )
options = Target.FixOptions ( options )
2025-04-08 19:27:34 -04:00
qb_target : AddCircleZone ( name , coords , radius , {
2025-04-05 20:58:13 +13:00
name = name ,
debugPoly = targetDebug ,
}, {
options = options ,
distance = options.distance or 1.5 ,
})
table.insert ( targetZones , { name = name , creator = GetInvokingResource () })
end
2025-04-08 19:27:34 -04:00
---This will remove target options from a specific zone.
---@param name string
2025-01-08 06:33:31 -05:00
Target.RemoveZone = function ( name )
2025-04-08 19:27:34 -04:00
if not name then return end
2025-01-08 06:33:31 -05:00
for _ , data in pairs ( targetZones ) do
if data.name == name then
2025-04-08 19:27:34 -04:00
qb_target : RemoveZone ( name )
2025-01-08 06:33:31 -05:00
table.remove ( targetZones , _ )
break
end
end
end
AddEventHandler ( 'onResourceStop' , function ( resource )
2025-04-08 19:27:34 -04:00
if resource ~= GetCurrentResourceName () then return end
for _ , target in pairs ( targetZones ) do
if target.creator == resource then
qb_target : RemoveZone ( target.name )
2025-01-08 06:33:31 -05:00
end
end
2025-04-08 19:27:34 -04:00
targetZones = {}
2025-01-08 06:33:31 -05:00
end )