186 lines
5.4 KiB
Lua
186 lines
5.4 KiB
Lua
---@diagnostic disable: duplicate-set-field
|
|
---
|
|
Target = Target or {}
|
|
|
|
local InteractIds = {}
|
|
|
|
local function warnUser()
|
|
print("Currently Only Targeting Is Supported By Community Bridge, You Are Using A Resource That Requires The Target Module To Be Used.")
|
|
end
|
|
|
|
function Target.GetResourceName()
|
|
return "default"
|
|
end
|
|
|
|
function Target.GetCanInteract(id)
|
|
return InteractIds[id]
|
|
end
|
|
|
|
function Target.CreateCanInteract(cb)
|
|
if not cb then return end
|
|
local id = lib.string.random('Aa1A', 8) -- Generate a random ID if not provided
|
|
InteractIds[id] = {
|
|
id = id,
|
|
ableToInteract = -1,
|
|
onInteract = cb
|
|
}
|
|
return id
|
|
end
|
|
|
|
function Target.CanInteract(id, ...)
|
|
local interactData = InteractIds[id]
|
|
if not interactData then return true end
|
|
if interactData.ableToInteract == -1 then
|
|
local cb = interactData.onInteract
|
|
local canInteractStatus = cb(...)
|
|
interactData.ableToInteract = canInteractStatus and 1 or 0
|
|
SetTimeout(1000, function()
|
|
interactData.ableToInteract = -1
|
|
end)
|
|
end
|
|
return interactData.ableToInteract > 0
|
|
end
|
|
|
|
function Target.FixOptions(options)
|
|
for k, v in pairs(options) do
|
|
local action = v.onSelect or v.action
|
|
local select = function(entityOrData)
|
|
if type(entityOrData) == 'table' then
|
|
return action(entityOrData.entity)
|
|
end
|
|
return action(entityOrData)
|
|
end
|
|
options[k].onSelect = select
|
|
local optionsCanInteract = v.canInteract
|
|
if optionsCanInteract then
|
|
local id = Target.CreateCanInteract(optionsCanInteract)
|
|
v.canInteract = function(...)
|
|
return Target.CanInteract(id, ...)
|
|
end
|
|
end
|
|
end
|
|
return options
|
|
end
|
|
|
|
function Target.AddGlobalPlayer(options)
|
|
warnUser()
|
|
end
|
|
|
|
function Target.AddGlobalVehicle(options)
|
|
warnUser()
|
|
end
|
|
|
|
function Target.RemoveGlobalVehicle(options)
|
|
warnUser()
|
|
end
|
|
|
|
function Target.AddLocalEntity(entities, _options)
|
|
local fixedOptions = Target.FixOptions(_options)
|
|
if type(entities) == "string" or type(entities) == "number" then
|
|
entities = { entities }
|
|
end
|
|
for _, entity in pairs(entities) do
|
|
local id = lib.string.random('Aa1A', 8) -- Generate a random ID if not provided
|
|
local title = lib.locale("target.title")
|
|
local menuData = { id = id, title = title, options = {} }
|
|
for k, v in pairs(fixedOptions) do
|
|
table.insert(menuData.options, {
|
|
title = title .. " " .. k,
|
|
description = lib.locale("target.description"),
|
|
onSelect = function(selected, secondary, args)
|
|
if v.onSelect then
|
|
v.onSelect(selected, secondary, args)
|
|
end
|
|
end
|
|
})
|
|
end
|
|
Point.Register(id, entity, 5, nil, function()
|
|
local coords = GetEntityCoords(entity)
|
|
local sleep = 3000
|
|
local test = lib.locale("target.interact")
|
|
CreateThread(function()
|
|
while DoesEntityExist(entity) do
|
|
Wait(sleep)
|
|
local distance = #(coords - GetEntityCoords(PlayerPedId()))
|
|
if distance < 2 then
|
|
sleep = 0
|
|
Utility.Draw3DHelpText(coords, test, 0.35)
|
|
if IsControlJustPressed(0, 38) then
|
|
Menu.Open(menuData, false)
|
|
end
|
|
else
|
|
sleep = 1000
|
|
end
|
|
end
|
|
end)
|
|
end,
|
|
function()
|
|
Point.Remove(id)
|
|
end, function()
|
|
--No need for this in this one
|
|
end)
|
|
end
|
|
end
|
|
|
|
function Target.AddModel(models, options)
|
|
warnUser()
|
|
end
|
|
|
|
function Target.AddBoxZone(name, coords, size, heading, options)
|
|
local fixedOptions = Target.FixOptions(options)
|
|
local id = lib.string.random('Aa1A', 8) -- Generate a random ID if not provided
|
|
local title = lib.locale("target.title")
|
|
local menuData = { id = id, title = title, options = {} }
|
|
for k, v in pairs(fixedOptions) do
|
|
table.insert(menuData.options, {
|
|
title = title .. " " .. k,
|
|
description = lib.locale("target.description"),
|
|
onSelect = function(selected, secondary, args)
|
|
if v.onSelect then
|
|
v.onSelect(selected, secondary, args)
|
|
end
|
|
end
|
|
})
|
|
end
|
|
local inZone = false
|
|
Point.Register(id, coords, 5, nil,
|
|
function()
|
|
local sleep = 3000
|
|
while inZone do
|
|
Wait(sleep)
|
|
local distance = #(coords - GetEntityCoords(PlayerPedId()))
|
|
if distance < 10 then
|
|
sleep = 0
|
|
Utility.Draw3DHelpText(coords, lib.locale("target.interact"), 0.35)
|
|
if IsControlJustPressed(0, 38) then
|
|
Menu.Open(menuData, false)
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
function()
|
|
inZone = false
|
|
Point.Remove(id)
|
|
end,
|
|
function()
|
|
--No need for this in this one
|
|
end)
|
|
end
|
|
|
|
function Target.RemoveGlobalPlayer()
|
|
warnUser()
|
|
end
|
|
|
|
function Target.RemoveLocalEntity(entity)
|
|
warnUser()
|
|
end
|
|
|
|
function Target.RemoveModel(model)
|
|
warnUser()
|
|
end
|
|
|
|
function Target.RemoveZone(name)
|
|
warnUser()
|
|
end
|
|
|
|
return Target |