Remove cache and batch event libraries, update locales
Deleted the cache and batch event libraries from the codebase, including all related client, server, and shared files. Removed server-side particle library and associated client event handlers. Updated utility and clothing modules to remove cache dependencies. Improved utility logging and deprecated point functions with notices. Updated all locales to use a consistent 'PurchasedItem' message format and added Bulgarian (bg) translation. Bumped version to 0.13.1 in fxmanifest.
This commit is contained in:
1 parent
5fd0744ca5
commit
48f8122197
76 files changed
+488
-875
No files matched your search
+1
-1
@@ -5,7 +5,7 @@ use_experimental_fxv2_oal 'yes'
|
||||
author 'The Order of the Sacred Framework'
|
||||
name 'community_bridge'
|
||||
description 'A Universal Bridge for Our Community, created by a group of contributors with a shared vision to enhance both user and developer experiences. This bridge connects various frameworks, inventories, target systems, notification systems, and more, fostering compatibility and seamless integration.'
|
||||
version '0.13.0'
|
||||
version '0.13.1'
|
||||
|
||||
shared_scripts {
|
||||
'@ox_lib/init.lua',
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
Batch = Batch or {}
|
||||
Batch.Event = Batch.Event or {}
|
||||
Batch.Event.Queued = Batch.Event.Queued or {}
|
||||
Batch.Event.IsQueued = Batch.Event.IsQueued or false
|
||||
|
||||
local SERVER = IsDuplicityVersion()
|
||||
|
||||
-- could do a callback from client to server back to client with a time stamp. Use that timestamp to generate some random string/number and use that fo
|
||||
-- this event name. Would help by masking from exploits. Thinking about making a module out of it
|
||||
|
||||
--- This is used to batch single events together to reduce network strain
|
||||
---
|
||||
if SERVER then
|
||||
function Batch.Event.Queue(src, event, ...)
|
||||
if src == -1 then
|
||||
src = GetPlayers()
|
||||
for k, v in pairs(src) do
|
||||
local strSrc = tostring(v)
|
||||
Batch.Event.Queued[strSrc] = Batch.Event.Queued[strSrc] or {}
|
||||
table.insert(Batch.Event.Queued[strSrc], {
|
||||
src = v,
|
||||
event = event,
|
||||
args = {...}
|
||||
})
|
||||
end
|
||||
else
|
||||
local strSrc = tostring(src)
|
||||
Batch.Event.Queued[strSrc] = Batch.Event.Queued[strSrc] or {}
|
||||
table.insert(Batch.Event.Queued[strSrc], {
|
||||
src = src,
|
||||
event = event,
|
||||
args = {...}
|
||||
})
|
||||
end
|
||||
|
||||
if Batch.Event.IsQueued then return end
|
||||
Batch.Event.IsQueued = true
|
||||
SetTimeout(100, function()
|
||||
for k, v in pairs(Batch.Event.Queued) do
|
||||
TriggerClientEvent('community_bridge:client:BatchEvents', v.src, v)
|
||||
end
|
||||
Batch.Event.IsQueued = false
|
||||
Batch.Event.Queued = {}
|
||||
end)
|
||||
end
|
||||
return Batch
|
||||
else
|
||||
|
||||
Batch.Event.Fire = function(array)
|
||||
local playerSrc = PlayerId()
|
||||
for k, v in pairs(array) do
|
||||
if v.src == playerSrc then
|
||||
local event = v.event
|
||||
local args = v.args
|
||||
TriggerEvent(event, table.unpack(args))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RegisterNetEvent('community_bridge:client:BatchEvents', function(array)
|
||||
Batch.Event.Fire(array)
|
||||
end)
|
||||
|
||||
return Batch
|
||||
end
|
||||
Vendored
-43
@@ -1,43 +0,0 @@
|
||||
Cache = Require("lib/cache/shared/cache.lua")
|
||||
local PlayerPedId = PlayerPedId
|
||||
local GetVehiclePedIsIn = GetVehiclePedIsIn
|
||||
local GetVehicleMaxNumberOfPassengers = GetVehicleMaxNumberOfPassengers
|
||||
local GetPedInVehicleSeat = GetPedInVehicleSeat
|
||||
local GetSelectedPedWeapon = GetSelectedPedWeapon
|
||||
|
||||
--- Get the vehicle the player is in, if any
|
||||
---@return integer | nil
|
||||
function GetVehicle()
|
||||
local ped = PlayerPedId()
|
||||
if not ped then return end
|
||||
return GetVehiclePedIsIn(ped, false)
|
||||
end
|
||||
|
||||
--- Get the seat of the player in the vehicle if the vehicle is occupied
|
||||
---@return integer | nil
|
||||
function GetVehicleSeat()
|
||||
local vehicle = GetVehicle()
|
||||
if not vehicle then return end
|
||||
local ped = PlayerPedId()
|
||||
if not ped then return end
|
||||
for i = -1, GetVehicleMaxNumberOfPassengers(vehicle) - 1 do
|
||||
if ped == GetPedInVehicleSeat(vehicle, i) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Get the current weapon of the player
|
||||
--- @return integer | nil
|
||||
function GetWeapon()
|
||||
local ped = PlayerPedId()
|
||||
if not ped then return end -- Return unarmed hash if no ped
|
||||
return GetSelectedPedWeapon(ped)
|
||||
end
|
||||
|
||||
Cache.Create("Ped", PlayerPedId, 1000) -- Check ped every second (adjust as needed)
|
||||
Cache.Create("Vehicle", GetVehicle, 500) -- Check vehicle every 500ms
|
||||
Cache.Create("Seat", GetVehicleSeat, 500) -- Check if in vehicle every 500ms
|
||||
Cache.Create("Weapon", GetWeapon , 250) -- Check weapon every 250ms
|
||||
|
||||
return Cache
|
||||
Vendored
Whitespace-only changes.
Vendored
-276
@@ -1,276 +0,0 @@
|
||||
---@class CacheEntry
|
||||
---@field Name string
|
||||
---@field Compare fun(): any
|
||||
---@field WaitTime integer | nil
|
||||
---@field LastChecked integer|nil
|
||||
---@field OnChange fun(new:any, old:any)[]
|
||||
---@field Value any
|
||||
|
||||
---@class CacheModule
|
||||
---@field Caches table<string, CacheEntry>
|
||||
---@field LoopRunning boolean
|
||||
---@field Create fun(name:string, compare:fun():any, waitTime:integer | nil): CacheEntry
|
||||
---@field Get fun(name:string): any
|
||||
---@field OnChange fun(name:string, onChange:fun(new:any, old:any))
|
||||
---@field Remove fun(name:string)
|
||||
Cache = Cache or {} ---@type CacheModule -- <-- we use Cache as a global variable so that if we dont required it more than once
|
||||
|
||||
Table = Table or Require('lib/utility/shared/tables.lua')
|
||||
Id = Id or Require('lib/utility/shared/ids.lua')
|
||||
|
||||
local Config = Require("settings/sharedConfig.lua")
|
||||
local max = 5000
|
||||
local CreateThread = CreateThread
|
||||
local Wait = Wait
|
||||
local GetGameTimer = GetGameTimer
|
||||
|
||||
local resourceCallbacks = {} -- Add callbacks from resources
|
||||
local resourceTracker = {
|
||||
caches = {},
|
||||
callbacks = {},
|
||||
initialized = {}
|
||||
}
|
||||
|
||||
Cache.Caches = Cache.Caches or {}
|
||||
Cache.LoopRunning = Cache.LoopRunning or false
|
||||
|
||||
---@param ... any
|
||||
local function debugPrint(...)
|
||||
if Config.DebugLevel == 0 then return end
|
||||
print("^2[Cache]^0", ...)
|
||||
end
|
||||
|
||||
local function HasActiveCaches()
|
||||
for _, cache in pairs(Cache.Caches) do
|
||||
if cache.WaitTime ~= nil then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function processCacheEntry(now, cache)
|
||||
cache.LastChecked = cache.LastChecked or now
|
||||
cache.WaitTime = tonumber(cache.WaitTime) or max
|
||||
local elapsed = now - cache.LastChecked
|
||||
local remaining = cache.WaitTime - elapsed
|
||||
|
||||
if remaining <= 0 then
|
||||
local oldValue = cache.Value
|
||||
cache.Value = cache.Compare()
|
||||
if not Table.Compare(cache.Value, oldValue) and cache.OnChange then
|
||||
for i, onChange in pairs(cache.OnChange) do
|
||||
onChange(cache.Value, oldValue)
|
||||
end
|
||||
end
|
||||
cache.LastChecked = now
|
||||
remaining = cache.WaitTime
|
||||
end
|
||||
|
||||
return remaining
|
||||
end
|
||||
|
||||
local function getNextWait(now)
|
||||
local minWait = nil
|
||||
for name, cache in pairs(Cache.Caches) do
|
||||
if cache.Compare and cache.WaitTime ~= nil then
|
||||
local remaining = processCacheEntry(now, cache)
|
||||
if not minWait or remaining < minWait then
|
||||
minWait = remaining
|
||||
if minWait <= 0 then break end
|
||||
end
|
||||
end
|
||||
end
|
||||
return minWait
|
||||
end
|
||||
|
||||
local function StartLoop()
|
||||
if Cache.LoopRunning then return end
|
||||
if not HasActiveCaches() then return end
|
||||
Cache.LoopRunning = true
|
||||
CreateThread(function()
|
||||
while Cache.LoopRunning do
|
||||
local now = GetGameTimer()
|
||||
local minWait = getNextWait(now)
|
||||
if minWait then
|
||||
Wait(math.max(0, minWait))
|
||||
else
|
||||
Wait(max)
|
||||
end
|
||||
if not HasActiveCaches() then
|
||||
Cache.LoopRunning = false
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local function trackResource(resourceName, type, data)
|
||||
if not resourceName then return end
|
||||
|
||||
-- Initialize resource tracking if needed
|
||||
if not resourceTracker.initialized[resourceName] then
|
||||
resourceTracker.initialized[resourceName] = true
|
||||
resourceTracker.caches[resourceName] = resourceTracker.caches[resourceName] or {}
|
||||
resourceTracker.callbacks[resourceName] = resourceTracker.callbacks[resourceName] or {}
|
||||
|
||||
AddEventHandler('onResourceStop', function(stoppingResource)
|
||||
if stoppingResource ~= resourceName then return end
|
||||
|
||||
-- Clean up caches
|
||||
for _, cacheName in ipairs(resourceTracker.caches[resourceName] or {}) do
|
||||
if Cache.Caches[cacheName] then
|
||||
Cache.Caches[cacheName] = nil
|
||||
debugPrint(("Removed cache '%s' - resource '%s' stopped"):format(cacheName, resourceName))
|
||||
end
|
||||
end
|
||||
|
||||
-- Clean up callbacks
|
||||
for _, cb in ipairs(resourceTracker.callbacks[resourceName] or {}) do
|
||||
local targetCache = Cache.Caches[cb.cacheName]
|
||||
if targetCache then
|
||||
targetCache.OnChange[cb.index] = nil
|
||||
debugPrint(("Removed callback '%s' from cache '%s' - resource '%s' stopped"):format(cb.index, cb.cacheName, resourceName))
|
||||
end
|
||||
end
|
||||
|
||||
-- Clear tracking data
|
||||
resourceTracker.caches[resourceName] = nil
|
||||
resourceTracker.callbacks[resourceName] = nil
|
||||
resourceTracker.initialized[resourceName] = nil
|
||||
end)
|
||||
end
|
||||
|
||||
-- Track the new item
|
||||
if type == "cache" then
|
||||
table.insert(resourceTracker.caches[resourceName], data)
|
||||
elseif type == "callback" then
|
||||
table.insert(resourceTracker.callbacks[resourceName], data)
|
||||
end
|
||||
end
|
||||
|
||||
---@param name string
|
||||
---@param compare fun():any
|
||||
---@param waitTime integer | nil
|
||||
---@return CacheEntry | nil
|
||||
function Cache.Create(name, compare, waitTime)
|
||||
assert(name, "Cache name is required.")
|
||||
assert(compare, "Comparison function is required.")
|
||||
if type(waitTime) ~= "number" then
|
||||
waitTime = nil
|
||||
end
|
||||
local _name = tostring(name)
|
||||
local cache = Cache.Caches[_name]
|
||||
if cache and cache.Compare == compare then
|
||||
debugPrint(_name .. " already exists with the same comparison function.")
|
||||
return cache
|
||||
end
|
||||
local ok, result = pcall(compare)
|
||||
if not ok then
|
||||
debugPrint("Error creating cache '" .. _name .. "': " .. tostring(result))
|
||||
return nil
|
||||
end
|
||||
---@type CacheEntry
|
||||
local newCache = {
|
||||
Name = _name,
|
||||
Compare = compare,
|
||||
WaitTime = waitTime, -- can be nil
|
||||
LastChecked = nil,
|
||||
OnChange = {},
|
||||
Value = result
|
||||
}
|
||||
|
||||
-- Track the cache with its resource
|
||||
trackResource(GetInvokingResource(), "cache", _name)
|
||||
|
||||
Cache.Caches[_name] = newCache
|
||||
|
||||
debugPrint(_name .. " created with initial value: " .. tostring(result))
|
||||
for _, onChange in pairs(newCache.OnChange) do
|
||||
onChange(newCache.Value, 0)
|
||||
end
|
||||
StartLoop()
|
||||
return newCache
|
||||
end
|
||||
|
||||
---@param name string
|
||||
---@return any
|
||||
function Cache.Get(name)
|
||||
assert(name, "Cache name is required.")
|
||||
local _name = tostring(name)
|
||||
local cache = Cache.Caches[_name]
|
||||
return cache and cache.Value or nil
|
||||
end
|
||||
|
||||
--- This add a callback to the cache entry that will be called when the value changes.
|
||||
--- The callback will be called with the new value and the old value.
|
||||
--- you can call the value again to delete the callback.
|
||||
---@param name string
|
||||
---@param onChange fun(new:any, old:any)
|
||||
function Cache.OnChange(name, onChange)
|
||||
assert(name, "Cache name is required.")
|
||||
local _name = tostring(name)
|
||||
local cache = Cache.Caches[_name]
|
||||
assert(cache, "Cache with name '" .. _name .. "' does not exist.")
|
||||
|
||||
local id = Id.CreateUniqueId(Cache.Caches[_name]?.OnChange)
|
||||
-- Figure out which resource is trying to register this callback
|
||||
local invokingResource = GetInvokingResource()
|
||||
if not invokingResource then return end
|
||||
-- Add the new callback to our list
|
||||
local callbackIndex = id
|
||||
cache.OnChange[callbackIndex] = onChange
|
||||
|
||||
-- Track the callback with its resource
|
||||
trackResource(GetInvokingResource(), "callback", {
|
||||
cacheName = _name,
|
||||
index = callbackIndex
|
||||
})
|
||||
|
||||
debugPrint(("Added new OnChange callback to cache '%s' from resource '%s'"):format(_name, invokingResource))
|
||||
return callbackIndex
|
||||
end
|
||||
|
||||
function Cache.RemoveOnChange(name, id)
|
||||
assert(name, "Cache name is required.")
|
||||
local _name = tostring(name)
|
||||
local cache = Cache.Caches[_name]
|
||||
assert(cache, "Cache with name '" .. _name .. "' does not exist.")
|
||||
if cache.OnChange[id] then
|
||||
cache.OnChange[id] = nil
|
||||
debugPrint("Removed OnChange callback from cache '" .. _name .. "' with ID: " .. id)
|
||||
else
|
||||
debugPrint("No OnChange callback found with ID: " .. id .. " in cache '" .. _name .. "'")
|
||||
end
|
||||
end
|
||||
|
||||
---@param name string
|
||||
function Cache.Remove(name)
|
||||
assert(name, "Cache name is required.")
|
||||
local _name = tostring(name)
|
||||
local cache = Cache.Caches[_name]
|
||||
if cache then
|
||||
Cache.Caches[_name] = nil
|
||||
debugPrint(_name .. " removed from cache.")
|
||||
if next(Cache.Caches) == nil then
|
||||
Cache.LoopRunning = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@param name string
|
||||
---@param newValue any
|
||||
function Cache.Update(name, newValue)
|
||||
assert(name, "Cache name is required.")
|
||||
local _name = tostring(name)
|
||||
local cache = Cache.Caches[_name]
|
||||
assert(cache, "Cache with name '" .. _name .. "' does not exist.")
|
||||
local oldValue = cache.Value
|
||||
if oldValue ~= newValue then
|
||||
cache.Value = newValue
|
||||
for _, onChange in pairs(cache.OnChange) do
|
||||
onChange(newValue, oldValue)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return Cache
|
||||
@@ -50,9 +50,7 @@ if not IsDuplicityVersion() then goto client end
|
||||
|
||||
cLib.SQL = SQL or Require("lib/sql/server/sqlHandler.lua")
|
||||
cLib.Logs = Logs or Require("lib/logs/server/logs.lua")
|
||||
cLib.Cache = Cache or Require("lib/cache/shared/cache.lua")
|
||||
cLib.Marker = Marker or Require("lib/markers/server/server.lua")
|
||||
cLib.Particle = Particle or Require("lib/particles/server/particles.lua")
|
||||
cLib.Shell = Shells or Require("lib/shells/server/shells.lua")
|
||||
cLib.Entity = ServerEntity or Require("lib/entities/server/server_entity.lua")
|
||||
|
||||
@@ -69,7 +67,6 @@ cLib.PlaceableObject = ObjectPlacer or Require("lib/placers/client/placeable_obj
|
||||
cLib.Raycast = Raycast or Require("lib/raycast/client/raycast.lua")
|
||||
cLib.Point = Point or Require("lib/points/client/points.lua")
|
||||
cLib.Particle = Particle or Require("lib/particles/client/particles.lua")
|
||||
cLib.Cache = Cache or Require("lib/cache/client/cache.lua")
|
||||
cLib.Marker = Marker or Require("lib/markers/client/markers.lua")
|
||||
cLib.Anim = Anim or Require("lib/anim/client/client.lua")
|
||||
cLib.Cutscene = Cutscene or Require("lib/cutscenes/client/cutscene.lua")
|
||||
|
||||
@@ -92,32 +92,6 @@ function Particle.Stop(particle)
|
||||
Particles[tostring(particle)] = nil
|
||||
end
|
||||
|
||||
RegisterNetEvent("community_bridge:Client:Particle", function(data)
|
||||
if not data then return end
|
||||
Particle.Create(data)
|
||||
end)
|
||||
|
||||
RegisterNetEvent("community_bridge:Client:ParticleBulk", function(datas)
|
||||
if not datas then return end
|
||||
for _, data in pairs(datas) do
|
||||
Particle.Create(data)
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent("community_bridge:Client:ParticleRemove", function(id)
|
||||
local particle = Particles[id]
|
||||
if not particle then return end
|
||||
Particle.Stop(id)
|
||||
end)
|
||||
|
||||
RegisterNetEvent("community_bridge:Client:ParticleRemoveBulk", function(ids)
|
||||
for _, id in pairs(ids) do
|
||||
Particle.Stop(id)
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
|
||||
function Particle.CreateOnEntity(dict, ptfx, entity, offset, rot, scale, color, looped, loopLength)
|
||||
LoadPtfxAsset(dict)
|
||||
UseParticleFxAssetNextCall(dict)
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
---@diagnostic disable: duplicate-set-field
|
||||
|
||||
Particles = {}
|
||||
Particle = Particles or {}
|
||||
|
||||
function Particle.New(data)
|
||||
assert(data, "Particle data is nil")
|
||||
assert(data.dict, "Invalid particle data. Must contain string dict.")
|
||||
assert(data.ptfx, "Invalid particle data. Must contain string ptfx.")
|
||||
|
||||
local _id = data.id or Bridge.Ids.CreateUniqueId(Particles)
|
||||
data = {
|
||||
id = _id,
|
||||
dict = data.dict,
|
||||
ptfx = data.ptfx,
|
||||
position = data.position or vector3(0.0, 0.0, 0.0),
|
||||
rotation = data.rotation or vector3(0, 0, 0),
|
||||
size = data.size or 1.0,
|
||||
color = data.color or vector3(255, 255, 255),
|
||||
looped = data.looped or false,
|
||||
loopLength = data.loopLength or nil,
|
||||
}
|
||||
Particles[_id] = data
|
||||
return data
|
||||
end
|
||||
|
||||
function Particle.Destroy(id)
|
||||
if not id or not Particles[id] then return end
|
||||
Particles[id] = nil
|
||||
return true
|
||||
end
|
||||
|
||||
function Particle.Create(data)
|
||||
local particleData = Particle.New(data)
|
||||
if not particleData then return end
|
||||
TriggerClientEvent("community_bridge:Client:Particle", -1, particleData)
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
function Particle.Remove(id)
|
||||
if not Particle.Destroy(id) then return end
|
||||
TriggerClientEvent("community_bridge:Client:ParticleRemove", -1, id)
|
||||
end
|
||||
|
||||
function Particle.CreateBulk(datas)
|
||||
if not datas then return end
|
||||
local toClient = {}
|
||||
for k, v in pairs(datas) do
|
||||
local data = Particle.New(v)
|
||||
table.insert(toClient, data)
|
||||
end
|
||||
TriggerClientEvent("community_bridge:Client:ParticleBulk", -1, toClient)
|
||||
return toClient
|
||||
end
|
||||
|
||||
function Particle.RemoveBulk(ids)
|
||||
if not ids then return end
|
||||
local toClient = {}
|
||||
for k, v in pairs(ids) do
|
||||
local id = v
|
||||
if type(v) == "table" then
|
||||
id = v.id
|
||||
end
|
||||
Particle.Destroy(id)
|
||||
table.insert(toClient, id)
|
||||
end
|
||||
TriggerClientEvent("community_bridge:Client:ParticleRemoveBulk", -1, toClient)
|
||||
return ids
|
||||
end
|
||||
|
||||
return Particle
|
||||
@@ -40,7 +40,7 @@ end
|
||||
---@return number|nil
|
||||
function Utility.CreateProp(model, coords, heading, networked)
|
||||
local loaded, hash = ensureModelLoaded(model)
|
||||
if not loaded then return nil, print("^6 Model was unable to load "..tostring(model).." ^0") end
|
||||
if not loaded then return nil, print("^6 community_bridge model was unable to load "..tostring(model).." ^0") end
|
||||
local propEntity = CreateObject(hash, coords.x, coords.y, coords.z, networked, false, false)
|
||||
SetEntityHeading(propEntity, heading)
|
||||
SetModelAsNoLongerNeeded(hash)
|
||||
@@ -64,7 +64,7 @@ end
|
||||
---@return number|nil, table
|
||||
function Utility.CreateVehicle(model, coords, heading, networked)
|
||||
local loaded, hash = ensureModelLoaded(model)
|
||||
if not loaded then return nil, {}, print("^6 Model was unable to load "..tostring(model).." ^0") end
|
||||
if not loaded then return nil, {}, print("^6 community_bridge model was unable to load "..tostring(model).." ^0") end
|
||||
local vehicle = CreateVehicle(hash, coords.x, coords.y, coords.z, heading, networked, false)
|
||||
SetVehicleHasBeenOwnedByPlayer(vehicle, true)
|
||||
SetVehicleNeedsToBeHotwired(vehicle, false)
|
||||
@@ -82,7 +82,7 @@ end
|
||||
---@return number|nil
|
||||
function Utility.CreatePed(model, coords, heading, networked, settings)
|
||||
local loaded, hash = ensureModelLoaded(model)
|
||||
if not loaded then return nil, print("^6 Model was unable to load "..tostring(model).." ^0") end
|
||||
if not loaded then return nil, print("^6 community_bridge model was unable to load "..tostring(model).." ^0") end
|
||||
local spawnedEntity = CreatePed(0, hash, coords.x, coords.y, coords.z, heading, networked, false)
|
||||
SetModelAsNoLongerNeeded(hash)
|
||||
spawnedPeds[tostring(spawnedEntity)] = true
|
||||
@@ -174,7 +174,7 @@ end
|
||||
---@param blip number
|
||||
---@return boolean
|
||||
function Utility.RemoveBlip(blip)
|
||||
if not blipIDs[tostring(blip)] then return false, print("^6 No blip to remove with matching ID ^0") end
|
||||
if not blipIDs[tostring(blip)] then return false end
|
||||
RemoveBlip(blipIDs[tostring(blip)])
|
||||
blipIDs[tostring(blip)] = nil
|
||||
return true
|
||||
@@ -298,8 +298,6 @@ function Utility.HelpText(text, duration)
|
||||
EndTextCommandDisplayHelp(0, false, true, duration or 5000)
|
||||
end
|
||||
|
||||
local doingstuff = false
|
||||
|
||||
---Show a floating help text in the world
|
||||
---@param text string The text to show
|
||||
---@param coords table The coords to show the message at
|
||||
@@ -452,20 +450,24 @@ function Utility.GetClosestVehicle(coords, distanceScope, includePlayerVeh)
|
||||
return vehicleEntity, vehicleCoords, vehicleNetID
|
||||
end
|
||||
|
||||
-- Deprecated point functions (no changes)
|
||||
-- Deprecated point functions (no changes) 12/14/25
|
||||
function Utility.RegisterPoint(pointID, pointCoords, pointDistance, _onEnter, _onExit)
|
||||
print("^6 community_bridge ^: ^3Utility.RegisterPoint is deprecated. Please use Point.Register instead. ^0")
|
||||
return Point.Register(pointID, pointCoords, pointDistance, nil, _onEnter, _onExit)
|
||||
end
|
||||
|
||||
function Utility.GetPointById(pointID)
|
||||
print("^6 community_bridge ^: ^3Utility.GetPointById is deprecated. Please use Point.Get instead. ^0")
|
||||
return Point.Get(pointID)
|
||||
end
|
||||
|
||||
function Utility.GetActivePoints()
|
||||
print("^6 community_bridge ^: ^3Utility.GetActivePoints is deprecated. Please use Point.GetAll instead. ^0")
|
||||
return Point.GetAll()
|
||||
end
|
||||
|
||||
function Utility.RemovePoint(pointID)
|
||||
print("^6 community_bridge ^: ^3Utility.RemovePoint is deprecated. Please use Point.Remove instead. ^0")
|
||||
return Point.Remove(pointID)
|
||||
end
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Jy het nie genoeg geld om hierdie item te koop nie",
|
||||
"Input": "Hoeveelheid Invoer",
|
||||
"PurchaseAmount": "Aankoop Hoeveelheid",
|
||||
"PurchasedItem": "Jy het gekoop ",
|
||||
"PurchasedItem": "Jy het gekoop %s %s",
|
||||
"PurchaseFailed": "Aankoop het misluk, inventaris vol",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Bevestig Aankoop",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "ليس لديك ما يكفي من المال لشراء هذا العنصر",
|
||||
"Input": "إدخال الكمية",
|
||||
"PurchaseAmount": "كمية الشراء",
|
||||
"PurchasedItem": "لقد قمت بشراء ",
|
||||
"PurchasedItem": "لقد قمت بشراء %s %s",
|
||||
"PurchaseFailed": "فشل الشراء، المخزون ممتلئ",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "تأكيد الشراء",
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"Shops": {
|
||||
"NotEnoughMoney": "Нямате достатъчно пари, за да купите този артикул",
|
||||
"Input": "Въвеждане на количество",
|
||||
"PurchaseAmount": "Количество за покупка",
|
||||
"PurchasedItem": "Закупихте %s %s",
|
||||
"PurchaseFailed": "Покупката е неуспешна, инвентарът е пълен",
|
||||
"CurrencySymbol": "%s лв.",
|
||||
"Confirm": "Потвърдете покупката",
|
||||
"AreYouSure": "Сигурни ли сте, че искате да закупите %s",
|
||||
"PayByCash": "Плащане на %s в брой",
|
||||
"PayByCard": "Плащане на %s с карта",
|
||||
"CardIcon": "fa-solid fa-building-columns",
|
||||
"CashIcon": "fa-solid fa-money-bill-wave",
|
||||
"ShopIcon": "fa-solid fa-basket-shopping",
|
||||
"ShopName": "Име на магазина"
|
||||
},
|
||||
"Notifications": {
|
||||
"PlaceholderTitle": "Известие"
|
||||
},
|
||||
"clipboard": {
|
||||
"copy": "Копирано в клипборда"
|
||||
},
|
||||
"input": {
|
||||
"submit_text": "Изпрати"
|
||||
},
|
||||
"placeable_object": {
|
||||
"no_prop_defined": "Не сте дефинирали обект за поставяне",
|
||||
"cant_place_here": "Не можете да поставите този обект тук",
|
||||
"place_object_place": "[E] Поставяне \n",
|
||||
"place_object_cancel": "[X] Отказ \n",
|
||||
"place_object_scroll_up": "[Превъртане нагоре] Завъртане надясно \n",
|
||||
"place_object_scroll_down": "[Превъртане надолу] Завъртане наляво \n",
|
||||
"object_place": "[%s] Поставяне \n",
|
||||
"object_cancel": "[%s] Отказ \n",
|
||||
"object_scroll_up": "[%s] Завъртане надясно \n",
|
||||
"object_scroll_down": "[%s] Завъртане наляво \n",
|
||||
"rotate_left": "Завъртане наляво",
|
||||
"rotate_right": "Завъртане надясно",
|
||||
"rotate_clockwise": "[%s] Завъртане по часовниковата стрелка \n",
|
||||
"rotate_counter_clockwise": "[%s] Завъртане обратно на часовниковата стрелка \n",
|
||||
"depth_modifier": "[%s] Модификатор на дълбочината \n"
|
||||
},
|
||||
"target": {
|
||||
"interact": "[E] Взаимодействие",
|
||||
"title": "Опции",
|
||||
"description": "Няма описание"
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Nemáte dostatek peněz na koupi této položky",
|
||||
"Input": "Zadání množství",
|
||||
"PurchaseAmount": "Množství nákupu",
|
||||
"PurchasedItem": "Zakoupili jste ",
|
||||
"PurchasedItem": "Zakoupili jste %s %s",
|
||||
"PurchaseFailed": "Nákup se nezdařil, inventář je plný",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Potvrdit nákup",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Du har ikke nok penge til at købe denne vare",
|
||||
"Input": "Mængde input",
|
||||
"PurchaseAmount": "Købs mængde",
|
||||
"PurchasedItem": "Du har købt ",
|
||||
"PurchasedItem": "Du har købt %s %s",
|
||||
"PurchaseFailed": "Køb mislykkedes, inventar fuldt",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Bekræft køb",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Sie haben nicht genug Geld, um diesen Artikel zu kaufen",
|
||||
"Input": "Mengen-Eingabe",
|
||||
"PurchaseAmount": "Kaufmenge",
|
||||
"PurchasedItem": "Sie haben gekauft ",
|
||||
"PurchasedItem": "Sie haben gekauft %s %s",
|
||||
"PurchaseFailed": "Kauf fehlgeschlagen, Inventar voll",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Kauf bestätigen",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Δεν έχετε αρκετά χρήματα για να αγοράσετε αυτό το αντικείμενο",
|
||||
"Input": "Εισαγωγή ποσότητας",
|
||||
"PurchaseAmount": "Ποσότητα αγοράς",
|
||||
"PurchasedItem": "Αγοράσατε ",
|
||||
"PurchasedItem": "Αγοράσατε %s %s",
|
||||
"PurchaseFailed": "Η αγορά απέτυχε, το αποθέμα είναι γεμάτο",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Επιβεβαίωση αγοράς",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Ye don't have enough booty to plunder this here item",
|
||||
"Input": "Amount o' Booty",
|
||||
"PurchaseAmount": "Plunder Quantity",
|
||||
"PurchasedItem": "Ye Have Plundered ",
|
||||
"PurchasedItem": "Ye Have Plundered %s %s",
|
||||
"PurchaseFailed": "Plunder failed, yer hold be full",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Aye, Plunder!",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "You don't have enough money to buy this item",
|
||||
"Input": "Amount Input",
|
||||
"PurchaseAmount": "Purchase Quantity",
|
||||
"PurchasedItem": "You Have Purchased ",
|
||||
"PurchasedItem": "You Have Purchased %s %s",
|
||||
"PurchaseFailed": "Purchase failed, inventory full",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Confirm Purchase",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "No tienes suficiente dinero para comprar este artículo",
|
||||
"Input": "Entrada de cantidad",
|
||||
"PurchaseAmount": "Cantidad de compra",
|
||||
"PurchasedItem": "Has comprado ",
|
||||
"PurchasedItem": "Has comprado %s %s",
|
||||
"PurchaseFailed": "Compra fallida, inventario lleno",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Confirmar compra",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaaksesi tätä tuotetta",
|
||||
"Input": "Määrän syöttö",
|
||||
"PurchaseAmount": "Ostomäärä",
|
||||
"PurchasedItem": "Olet ostanut ",
|
||||
"PurchasedItem": "Olet ostanut %s %s",
|
||||
"PurchaseFailed": "Osto epäonnistui, varasto täynnä",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Vahvista osto",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Vous n'avez pas assez d'argent pour acheter cet article",
|
||||
"Input": "Saisie de quantité",
|
||||
"PurchaseAmount": "Quantité d'achat",
|
||||
"PurchasedItem": "Vous avez acheté ",
|
||||
"PurchasedItem": "Vous avez acheté %s %s",
|
||||
"PurchaseFailed": "Achat échoué, inventaire plein",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Confirmer l'achat",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "इस वस्तु को खरीदने के लिए आपके पास पर्याप्त पैसे नहीं हैं",
|
||||
"Input": "मात्रा इनपुट",
|
||||
"PurchaseAmount": "खरीदारी की मात्रा",
|
||||
"PurchasedItem": "आपने खरीदा है ",
|
||||
"PurchasedItem": "आपने खरीदा है %s %s",
|
||||
"PurchaseFailed": "खरीदारी विफल, इन्वेंटरी भरी हुई है",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "खरीदारी की पुष्टि करें",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Nemate dovoljno novca za kupnju ovog predmeta",
|
||||
"Input": "Unos količine",
|
||||
"PurchaseAmount": "Količina kupnje",
|
||||
"PurchasedItem": "Kupili ste ",
|
||||
"PurchasedItem": "Kupili ste %s %s",
|
||||
"PurchaseFailed": "Kupnja nije uspjela, inventar pun",
|
||||
"CurrencySymbol": "%s kn",
|
||||
"Confirm": "Potvrdi kupnju",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Nincs elég pénzed ennek a tételnek a megvásárlásához",
|
||||
"Input": "Mennyiség bevitel",
|
||||
"PurchaseAmount": "Vásárlási mennyiség",
|
||||
"PurchasedItem": "Megvásároltad ",
|
||||
"PurchasedItem": "Megvásároltad %s %s",
|
||||
"PurchaseFailed": "Vásárlás sikertelen, leltár tele",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Vásárlás megerősítése",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Non hai abbastanza denaro per comprare questo articolo",
|
||||
"Input": "Inserimento quantità",
|
||||
"PurchaseAmount": "Quantità di acquisto",
|
||||
"PurchasedItem": "Hai acquistato ",
|
||||
"PurchasedItem": "Hai acquistato %s %s",
|
||||
"PurchaseFailed": "Acquisto fallito, inventario pieno",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Conferma acquisto",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "このアイテムを購入するのに十分なお金がありません",
|
||||
"Input": "数量入力",
|
||||
"PurchaseAmount": "購入数量",
|
||||
"PurchasedItem": "購入しました ",
|
||||
"PurchasedItem": "購入しました %s %s",
|
||||
"PurchaseFailed": "購入に失敗しました、インベントリがいっぱいです",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "購入を確認",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "이 아이템을 구매할 돈이 부족합니다",
|
||||
"Input": "수량 입력",
|
||||
"PurchaseAmount": "구매 수량",
|
||||
"PurchasedItem": "구매했습니다 ",
|
||||
"PurchasedItem": "구매했습니다 %s %s",
|
||||
"PurchaseFailed": "구매 실패, 인벤토리가 가득 찼습니다",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "구매 확인",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Neturite pakankamai pinigų šiam daiktui nusipirkti",
|
||||
"Input": "Kiekio įvestis",
|
||||
"PurchaseAmount": "Pirkimo kiekis",
|
||||
"PurchasedItem": "Jūs nusipirkote ",
|
||||
"PurchasedItem": "Jūs nusipirkote %s %s",
|
||||
"PurchaseFailed": "Pirkimas nepavyko, inventorius pilnas",
|
||||
"CurrencySymbol": "%s €",
|
||||
"Confirm": "Patvirtinti pirkimą",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Je hebt niet genoeg geld om dit item te kopen",
|
||||
"Input": "Hoeveelheid invoer",
|
||||
"PurchaseAmount": "Aankoop hoeveelheid",
|
||||
"PurchasedItem": "Je hebt gekocht ",
|
||||
"PurchasedItem": "Je hebt gekocht %s %s",
|
||||
"PurchaseFailed": "Aankoop mislukt, inventaris vol",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Aankoop bevestigen",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Du har ikke nok penger til å kjøpe denne varen",
|
||||
"Input": "Mengde inndata",
|
||||
"PurchaseAmount": "Kjøpsmengde",
|
||||
"PurchasedItem": "Du har kjøpt ",
|
||||
"PurchasedItem": "Du har kjøpt %s %s",
|
||||
"PurchaseFailed": "Kjøp mislyktes, inventar fullt",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Bekreft kjøp",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Nie masz wystarczająco pieniędzy, aby kupić ten przedmiot",
|
||||
"Input": "Wprowadzanie ilości",
|
||||
"PurchaseAmount": "Ilość zakupu",
|
||||
"PurchasedItem": "Kupiłeś ",
|
||||
"PurchasedItem": "Kupiłeś %s %s",
|
||||
"PurchaseFailed": "Zakup nieudany, ekwipunek pełny",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Potwierdź zakup",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Você não tem dinheiro suficiente para comprar este item",
|
||||
"Input": "Entrada de quantidade",
|
||||
"PurchaseAmount": "Quantidade de compra",
|
||||
"PurchasedItem": "Você comprou ",
|
||||
"PurchasedItem": "Você comprou %s %s",
|
||||
"PurchaseFailed": "Compra falhou, inventário cheio",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Confirmar compra",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Nu ai destui bani să cumperi acest articol",
|
||||
"Input": "Introducere cantitate",
|
||||
"PurchaseAmount": "Cantitate de cumpărare",
|
||||
"PurchasedItem": "Ai cumpărat ",
|
||||
"PurchasedItem": "Ai cumpărat %s %s",
|
||||
"PurchaseFailed": "Achiziție eșuată, inventar plin",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Confirmă cumpărarea",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "У вас недостаточно денег для покупки этого предмета",
|
||||
"Input": "Ввод количества",
|
||||
"PurchaseAmount": "Количество покупки",
|
||||
"PurchasedItem": "Вы купили ",
|
||||
"PurchasedItem": "Вы купили %s %s",
|
||||
"PurchaseFailed": "Покупка не удалась, инвентарь полон",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Подтвердить покупку",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Du har inte tillräckligt med pengar för att köpa denna vara",
|
||||
"Input": "Mängd inmatning",
|
||||
"PurchaseAmount": "Inköpsmängd",
|
||||
"PurchasedItem": "Du har köpt ",
|
||||
"PurchasedItem": "Du har köpt %s %s",
|
||||
"PurchaseFailed": "Köp misslyckades, inventarium fullt",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Bekräfta köp",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "คุณไม่มีเงินเพียงพอที่จะซื้อสิ่งนี้",
|
||||
"Input": "ป้อนจำนวน",
|
||||
"PurchaseAmount": "จำนวนที่ซื้อ",
|
||||
"PurchasedItem": "คุณได้ซื้อ ",
|
||||
"PurchasedItem": "คุณได้ซื้อ %s %s",
|
||||
"PurchaseFailed": "การซื้อล้มเหลว คลังเต็ม",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "ยืนยันการซื้อ",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "Bu öğeyi satın almak için yeterli paranız yok",
|
||||
"Input": "Miktar girişi",
|
||||
"PurchaseAmount": "Satın alma miktarı",
|
||||
"PurchasedItem": "Satın aldınız ",
|
||||
"PurchasedItem": "Satın aldınız %s %s",
|
||||
"PurchaseFailed": "Satın alma başarısız, envanter dolu",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "Satın almayı onayla",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "您没有足够的钱购买此物品",
|
||||
"Input": "数量输入",
|
||||
"PurchaseAmount": "购买数量",
|
||||
"PurchasedItem": "您已购买 ",
|
||||
"PurchasedItem": "您已购买 %s %s",
|
||||
"PurchaseFailed": "购买失败,库存已满",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "确认购买",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "您沒有足夠的錢購買此物品",
|
||||
"Input": "數量輸入",
|
||||
"PurchaseAmount": "購買數量",
|
||||
"PurchasedItem": "您已購買 ",
|
||||
"PurchasedItem": "你已購買 %s %s",
|
||||
"PurchaseFailed": "購買失敗,庫存已滿",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "確認購買",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "您沒有足夠的錢購買此物品",
|
||||
"Input": "數量輸入",
|
||||
"PurchaseAmount": "購買數量",
|
||||
"PurchasedItem": "您已購買 ",
|
||||
"PurchasedItem": "你已購買 %s %s",
|
||||
"PurchaseFailed": "購買失敗,庫存已滿",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "確認購買",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"NotEnoughMoney": "您没有足够的钱购买此物品",
|
||||
"Input": "数量输入",
|
||||
"PurchaseAmount": "购买数量",
|
||||
"PurchasedItem": "您已购买 ",
|
||||
"PurchasedItem": "您已购买 %s %s",
|
||||
"PurchaseFailed": "购买失败,库存已满",
|
||||
"CurrencySymbol": "$ %s",
|
||||
"Confirm": "确认购买",
|
||||
|
||||
@@ -1,33 +1,34 @@
|
||||
---@diagnostic disable: duplicate-set-field
|
||||
Clothing = Clothing or {}
|
||||
|
||||
ClothingBackup = {}
|
||||
Callback = Callback or Require("lib/callback/shared/callback.lua")
|
||||
Ultility = Utility or Require('lib/utility/client/utility.lua')
|
||||
Cache = Cache or Require('lib/cache/shared/cache.lua')
|
||||
|
||||
|
||||
function Clothing.IsMale()
|
||||
local ped = PlayerPedId()
|
||||
if not ped then return end
|
||||
if GetEntityModel(ped) == `mp_m_freemode_01` then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local ClothingBackup = {}
|
||||
|
||||
---This will get the name of the in use resource.
|
||||
---@return string
|
||||
Clothing.GetResourceName = function()
|
||||
function Clothing.GetResourceName()
|
||||
return 'default'
|
||||
end
|
||||
|
||||
---This will open the clothing menu for a player, in the event there is not a supported menu it will print that.
|
||||
function Clothing.OpenMenu()
|
||||
print("^6 No supported clothing menu in use in community_bridge. ^0 ")
|
||||
end
|
||||
|
||||
---This will check if the player model if male/female
|
||||
---@return boolean
|
||||
function Clothing.IsMale()
|
||||
local ped = PlayerPedId()
|
||||
if not ped or not DoesEntityExist(ped) then return false end
|
||||
if GetEntityModel(ped) == `mp_m_freemode_01` then return true end
|
||||
return false
|
||||
end
|
||||
|
||||
---Get the skin data of a ped
|
||||
---@param entity number
|
||||
---@return table
|
||||
function Clothing.GetAppearance(entity)
|
||||
if not entity and not DoesEntityExist(entity) then return end
|
||||
if not entity and not DoesEntityExist(entity) then return {} end
|
||||
local model = GetEntityModel(entity)
|
||||
local skinData = { model = model, components = {}, props = {} }
|
||||
for i = 0, 11 do
|
||||
@@ -38,17 +39,10 @@ function Clothing.GetAppearance(entity)
|
||||
table.insert(skinData.props,
|
||||
{ prop_id = i, drawable = GetPedPropIndex(entity, i), texture = GetPedPropTextureIndex(entity, i) })
|
||||
end
|
||||
ClothingBackup = skinData
|
||||
return skinData
|
||||
end
|
||||
|
||||
function Clothing.CopyAppearanceToClipboard()
|
||||
local ped = PlayerPedId()
|
||||
if not ped or not DoesEntityExist(ped) then return end
|
||||
local skinData = Clothing.GetAppearance(ped)
|
||||
if not skinData then return end
|
||||
Ultility.CopyToClipboard(skinData)
|
||||
end
|
||||
|
||||
Callback.Register('community_bridge:cb:GetAppearance', function()
|
||||
local ped = PlayerPedId()
|
||||
if not ped or not DoesEntityExist(ped) then return end
|
||||
@@ -57,101 +51,45 @@ Callback.Register('community_bridge:cb:GetAppearance', function()
|
||||
end)
|
||||
|
||||
---Apply skin data to a ped
|
||||
---@param entity number
|
||||
---@param ped number
|
||||
---@param skinData table
|
||||
---@return boolean
|
||||
function Clothing.SetAppearance(entity, skinData)
|
||||
function Clothing.SetAppearance(ped, skinData)
|
||||
for k, v in pairs(skinData.components or {}) do
|
||||
if v.component_id then
|
||||
SetPedComponentVariation(entity, v.component_id, v.drawable, v.texture, 0)
|
||||
SetPedComponentVariation(ped, v.component_id, v.drawable, v.texture, 0)
|
||||
end
|
||||
end
|
||||
for k, v in pairs(skinData.props or {}) do
|
||||
if v.prop_id then
|
||||
SetPedPropIndex(entity, v.prop_id, v.drawable, v.texture, 0)
|
||||
SetPedPropIndex(ped, v.prop_id, v.drawable, v.texture, false)
|
||||
end
|
||||
end
|
||||
ClothingBackup = nil
|
||||
return true
|
||||
end
|
||||
|
||||
---This will return the peds components to the previously stored components
|
||||
---@param ped number
|
||||
---@return boolean
|
||||
Clothing.RestoreAppearance = function(entity)
|
||||
Clothing.SetAppearance(entity, ClothingBackup)
|
||||
Clothing.RestoreAppearance = function(ped)
|
||||
Clothing.SetAppearance(ped, ClothingBackup)
|
||||
return true
|
||||
end
|
||||
|
||||
Clothing.UpdateAppearanceBackup = function(data)
|
||||
ClothingBackup = data
|
||||
end
|
||||
|
||||
Clothing.RunningDebug = false
|
||||
Clothing.Cache = nil -- maybe change this to the actual cache system???!? For future not lazy me
|
||||
|
||||
Cache.Create('Clothing', function()
|
||||
local ped = Cache.Get('Ped')
|
||||
local appearance = Clothing.GetAppearance(ped)
|
||||
if Table.Compare(Clothing.Cache, appearance) then
|
||||
return false
|
||||
end
|
||||
return appearance
|
||||
end, 1000)
|
||||
|
||||
local onChange = nil
|
||||
Clothing.ToggleDebugging = function()
|
||||
if Clothing.RunningDebug then
|
||||
Clothing.RunningDebug = false
|
||||
print("Clothing Debugging Disabled")
|
||||
return Cache.RemoveOnChange('Clothing', onChange)
|
||||
end
|
||||
Clothing.RunningDebug = true
|
||||
print("Clothing Debugging Enabled")
|
||||
|
||||
if Clothing.OpenMenu then
|
||||
Clothing.OpenMenu()
|
||||
end
|
||||
|
||||
onChange = Cache.OnChange('Clothing', function(new, old)
|
||||
print("Clothing Debugging", new)
|
||||
for k, v in pairs(old.components) do
|
||||
if v.component_id then
|
||||
if new.components[k].drawable ~= v.drawable or new.components[k].texture ~= v.texture then
|
||||
print("Component ID: " ..
|
||||
v.component_id ..
|
||||
" Drawable: " .. new.components[k].drawable .. " Texture: " .. new.components[k].texture)
|
||||
end
|
||||
end
|
||||
end
|
||||
for k, v in pairs(old.props) do
|
||||
if v.prop_id then
|
||||
if new.props[k].drawable ~= v.drawable or new.props[k].texture ~= v.texture then
|
||||
print("Prop ID: " ..
|
||||
v.prop_id .. " Drawable: " .. new.props[k].drawable .. " Texture: " .. new.props[k].texture)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
RegisterNetEvent('community_bridge:client:SetAppearance', function(data)
|
||||
if source ~= 65535 then return end
|
||||
Clothing.SetAppearance(PlayerPedId(), data)
|
||||
end)
|
||||
|
||||
RegisterNetEvent('community_bridge:client:GetAppearance', function()
|
||||
if source ~= 65535 then return end
|
||||
Clothing.GetAppearance(PlayerPedId())
|
||||
end)
|
||||
|
||||
RegisterNetEvent('community_bridge:client:RestoreAppearance', function()
|
||||
if source ~= 65535 then return end
|
||||
Clothing.RestoreAppearance(PlayerPedId())
|
||||
end)
|
||||
|
||||
-- RegisterCommand("clothing:enabledebug", function(source, args, rawCommand)
|
||||
-- Clothing.ToggleDebugging()
|
||||
-- end)
|
||||
|
||||
-- RegisterCommand("clothing:copy", function(source, args, rawCommand)
|
||||
-- Clothing.CopyAppearanceToClipboard()
|
||||
-- end)
|
||||
|
||||
|
||||
return Clothing
|
||||
return Clothing
|
||||
@@ -3,23 +3,32 @@ Clothing = Clothing or {}
|
||||
Clothing.LastAppearance = Clothing.LastAppearance or {}
|
||||
Callback = Callback or Require("lib/callback/shared/callback.lua")
|
||||
|
||||
function Clothing.IsMale(src)
|
||||
local ped = GetPlayerPed(src)
|
||||
if not ped or not DoesEntityExist(ped) then return end
|
||||
return GetEntityModel(ped) == `mp_m_freemode_01`
|
||||
end
|
||||
|
||||
---This will get the name of the in use resource.
|
||||
---@return string
|
||||
Clothing.GetResourceName = function()
|
||||
return 'default'
|
||||
end
|
||||
|
||||
---This will check if the player model if male/female
|
||||
---@param src number
|
||||
---@return boolean
|
||||
function Clothing.IsMale(src)
|
||||
local ped = GetPlayerPed(src)
|
||||
if not ped or not DoesEntityExist(ped) then return false end
|
||||
return GetEntityModel(ped) == `mp_m_freemode_01`
|
||||
end
|
||||
|
||||
---Get the skin data of a player
|
||||
---@param src number
|
||||
---@return table
|
||||
function Clothing.GetAppearance(src)
|
||||
return Callback.Trigger('community_bridge:cb:GetAppearance', src)
|
||||
end
|
||||
|
||||
Clothing.SetAppearance = function(src, data)
|
||||
---Apply skin data to a player
|
||||
---@param src number
|
||||
---@param data table
|
||||
function Clothing.SetAppearance(src, data)
|
||||
local strSrc = tostring(src)
|
||||
Clothing.LastAppearance[strSrc] = Clothing.GetAppearance(src)
|
||||
TriggerClientEvent('community_bridge:client:SetAppearance', src, data)
|
||||
@@ -34,29 +43,10 @@ function Clothing.SetAppearanceExt(src, data)
|
||||
Clothing.SetAppearance(src, tbl)
|
||||
end
|
||||
|
||||
Clothing.RestoreAppearance = function(src)
|
||||
---Restore the last saved appearance of a player
|
||||
---@param src number
|
||||
function Clothing.RestoreAppearance(src)
|
||||
TriggerClientEvent('community_bridge:client:RestoreAppearance', src)
|
||||
end
|
||||
|
||||
|
||||
-- RegisterNetEvent('community_bridge:client:SetAppearance', function(data)
|
||||
-- local src = source
|
||||
-- Clothing.SetAppearance(src, data)
|
||||
-- end)
|
||||
|
||||
-- RegisterNetEvent('community_bridge:client:GetAppearance', function()
|
||||
-- local src = source
|
||||
-- Clothing.GetAppearance(src)
|
||||
-- end)
|
||||
|
||||
-- RegisterNetEvent('community_bridge:client:RestoreAppearance', function()
|
||||
-- local src = source
|
||||
-- Clothing.RestoreAppearance(src)
|
||||
-- end)
|
||||
|
||||
-- RegisterNetEvent('community_bridge:client:ReloadSkin', function()
|
||||
-- local src = source
|
||||
-- Clothing.ReloadSkin(src)
|
||||
-- end)
|
||||
|
||||
return Clothing
|
||||
return Clothing
|
||||
@@ -146,6 +146,13 @@ function Clothing.OpenMenu(src)
|
||||
TriggerClientEvent('esx_skin:openMenu', src)
|
||||
end
|
||||
|
||||
---Callback handler for retrieving a player's appearance data
|
||||
Callback.Register('community_bridge:cb:GetAppearance', function(source)
|
||||
local src = source
|
||||
return Clothing.GetAppearance(src)
|
||||
end)
|
||||
|
||||
|
||||
---Event handler for when a player loads into the server
|
||||
---Caches the player's appearance data
|
||||
AddEventHandler('community_bridge:Server:OnPlayerLoaded', function(src)
|
||||
@@ -175,10 +182,4 @@ AddEventHandler('onResourceStart', function(resource)
|
||||
Clothing.Players[strSrc] = Clothing.GetAppearance(src)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
---Callback handler for retrieving a player's appearance data
|
||||
Callback.Register('community_bridge:cb:GetAppearance', function(source)
|
||||
local src = source
|
||||
return Clothing.GetAppearance(src)
|
||||
end)
|
||||
end)
|
||||
@@ -1,11 +1,8 @@
|
||||
--[[This module is incomplete]]--
|
||||
|
||||
Dialogue = {}
|
||||
|
||||
local promises = {}
|
||||
local activeDialogue = nil
|
||||
local pendingCameraDestroy = false
|
||||
Dialogue = {}
|
||||
|
||||
local cam = nil
|
||||
local npc = nil
|
||||
|
||||
@@ -25,7 +22,7 @@ function Dialogue.Close(name)
|
||||
Wait(200) -- Small delay to allow new dialogue to open
|
||||
if pendingCameraDestroy and not activeDialogue then
|
||||
-- No new dialogue opened, safe to destroy camera
|
||||
RenderScriptCams(false, 1, 1000, 1, 0)
|
||||
RenderScriptCams(false, true, 1000, true, false)
|
||||
SetCamActive(cam, false)
|
||||
DestroyCam(cam, false)
|
||||
cam = nil
|
||||
@@ -38,7 +35,10 @@ end
|
||||
--- Open a dialogue with the player
|
||||
---@param name string
|
||||
---@param dialogue string
|
||||
---@param options table example = {{ id = string, label = string}}
|
||||
---@param characterOptions number|table entity or entity and offset/rotationOffset
|
||||
---@param dialogueOptions table
|
||||
---@param onSelected function
|
||||
---@return any
|
||||
function Dialogue.Open( name, dialogue, characterOptions, dialogueOptions, onSelected)
|
||||
assert(name, "Name is required")
|
||||
assert(dialogue, "Dialogue is required")
|
||||
@@ -53,14 +53,12 @@ function Dialogue.Open( name, dialogue, characterOptions, dialogueOptions, onSel
|
||||
pendingCameraDestroy = false
|
||||
activeDialogue = name
|
||||
|
||||
-- camera magic!
|
||||
if entity then
|
||||
Wait(500)
|
||||
local endLocation = GetOffsetFromEntityInWorldCoords(entity, offset.x, offset.y + 2.0, offset.z)
|
||||
local pedHeading = GetEntityHeading(entity)
|
||||
-- Get position in front of ped based on their heading
|
||||
local pedHeading = GetEntityHeading(entity) -- Get position in front of ped based on their heading
|
||||
|
||||
if not cam then cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", 1) end
|
||||
if not cam then cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) end
|
||||
local camAngle = (pedHeading + 180.0) % 360.0
|
||||
SetCamRot(cam, rotationOffset.x, rotationOffset.y, camAngle + rotationOffset.z, 2)
|
||||
SetCamCoord(cam, endLocation.x, endLocation.y, endLocation.z)
|
||||
@@ -75,7 +73,6 @@ function Dialogue.Open( name, dialogue, characterOptions, dialogueOptions, onSel
|
||||
})
|
||||
SetNuiFocus(true, true)
|
||||
|
||||
|
||||
local prom = promise.new()
|
||||
local wrappedFunction = function(selected)
|
||||
SetNuiFocus(false, false)
|
||||
@@ -87,7 +84,6 @@ function Dialogue.Open( name, dialogue, characterOptions, dialogueOptions, onSel
|
||||
return Citizen.Await(prom)
|
||||
end
|
||||
|
||||
|
||||
RegisterNuiCallback("dialogue:SelectOption", function(data)
|
||||
local promis = promises[data.name]
|
||||
if not promis then return end
|
||||
|
||||
@@ -19,7 +19,7 @@ end
|
||||
---@description This will get the name of the framework being used (if a supported framework).
|
||||
---@return string
|
||||
Framework.GetFrameworkName = function()
|
||||
print("This is depricated, please use Framework.GetResourceName() instead.")
|
||||
--print("This is depricated, please use Framework.GetResourceName() instead.")
|
||||
return Framework.GetResourceName()
|
||||
end
|
||||
|
||||
@@ -108,7 +108,7 @@ end
|
||||
---@return string
|
||||
---@return string
|
||||
Framework.GetPlayerJob = function()
|
||||
print("This is depricated, please use Framework.GetPlayerJobData() instead.")
|
||||
--print("This is depricated, please use Framework.GetPlayerJobData() instead.")
|
||||
local jobData = Framework.GetPlayerJobData()
|
||||
return jobData.jobName, jobData.jobLabel, jobData.gradeName, jobData.gradeRank
|
||||
end
|
||||
|
||||
@@ -13,7 +13,7 @@ local cachedItemList = nil
|
||||
--- @description This will return the name of the framework in use
|
||||
--- @return string
|
||||
Framework.GetFrameworkName = function()
|
||||
print("This is deprecated, please use Framework.GetResourceName() instead.")
|
||||
--print("This is deprecated, please use Framework.GetResourceName() instead.")
|
||||
return Framework.GetResourceName()
|
||||
end
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ end
|
||||
---@return string
|
||||
---@return string
|
||||
Framework.GetPlayerJob = function()
|
||||
print("This is depricated, please use Framework.GetPlayerJobData() instead.")
|
||||
--print("This is depricated, please use Framework.GetPlayerJobData() instead.")
|
||||
local jobData = Framework.GetPlayerJobData()
|
||||
return jobData.jobName, jobData.jobLabel, jobData.gradeName, jobData.gradeRank
|
||||
end
|
||||
|
||||
@@ -372,7 +372,7 @@ end
|
||||
---@return string | string | string | number | nil
|
||||
---@return string | string | string | number | nil
|
||||
Framework.GetPlayerJob = function(src)
|
||||
print("[Community Bridge] Warning: Framework.GetPlayerJob is deprecated, use Framework.GetPlayerJobData instead.")
|
||||
--print("[Community Bridge] Warning: Framework.GetPlayerJob is deprecated, use Framework.GetPlayerJobData instead.")
|
||||
local jobData = Framework.GetPlayerJobData(src)
|
||||
if not jobData then return end
|
||||
return jobData.jobName, jobData.jobLabel, jobData.gradeName, jobData.gradeLevel
|
||||
|
||||
@@ -107,7 +107,7 @@ end
|
||||
---@return string
|
||||
---@return string
|
||||
Framework.GetPlayerJob = function()
|
||||
print("This is depricated, please use Framework.GetPlayerJobData() instead.")
|
||||
--print("This is depricated, please use Framework.GetPlayerJobData() instead.")
|
||||
local jobData = Framework.GetPlayerJobData()
|
||||
return jobData.jobName, jobData.jobLabel, jobData.gradeName, jobData.gradeRank
|
||||
end
|
||||
|
||||
@@ -357,7 +357,7 @@ Framework.GetPlayerJob = function(src)
|
||||
local player = Framework.GetPlayer(src)
|
||||
if not player then return end
|
||||
local playerData = player.PlayerData
|
||||
print("This function is depricated, please use GetPlayerJobData instead.")
|
||||
--print("This function is depricated, please use GetPlayerJobData instead.")
|
||||
return playerData.job.name, playerData.job.label, playerData.job.grade.name, playerData.job.grade.level
|
||||
end
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ Notify.GetResourceName = function()
|
||||
return "default"
|
||||
end
|
||||
|
||||
|
||||
|
||||
---DEPRICATED: PLEASE SWITCH TO Notify.SendNotification
|
||||
---12/13/25
|
||||
---@param message string
|
||||
@@ -12,7 +14,8 @@ end
|
||||
---@param time number
|
||||
---@return nil
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
return Notify.SendNotification(nil, message, _type, time)
|
||||
time = time or 3000
|
||||
return Framework.Notify(message, nil, time)
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
|
||||
@@ -5,6 +5,10 @@ Notify.GetResourceName = function()
|
||||
return "default"
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
---DEPRICATED: PLEASE SWITCH TO Notify.SendNotification
|
||||
---12/13/25
|
||||
---@param src number
|
||||
@@ -27,7 +31,7 @@ end
|
||||
Notify.SendNotification = function(src, title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then
|
||||
title = Bridge.Language.Locale("Notifications.PlaceholderTitle")
|
||||
title = placeHolderText
|
||||
end
|
||||
TriggerClientEvent('community_bridge:Client:Notify', src, title, message, _type, time, props)
|
||||
end
|
||||
|
||||
@@ -9,6 +9,15 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
return exports['brutal_notify']:SendAlert('Notification', message, time, _type or "success", false)
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -18,7 +27,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
return exports['brutal_notify']:SendAlert(title, message, time, _type or "success", false)
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,25 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
if _type == "error" or _type == "info" then
|
||||
_type = tostring(1)
|
||||
elseif _type == "success" then
|
||||
_type = tostring(2)
|
||||
elseif _type == "warning" or _type == "warn" then
|
||||
_type = tostring(3)
|
||||
else
|
||||
_type = tostring(2) -- Default to 2 if type is not recognized
|
||||
end
|
||||
return exports['FL-Notify']:Notify("Notification", "", message, 5000, tonumber(_type), 0)
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +36,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
if _type == "error" or _type == "info" then
|
||||
_type = tostring(1)
|
||||
elseif _type == "success" then
|
||||
|
||||
@@ -9,6 +9,16 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
return exports.lation_ui:notify({ message = message, type = _type or "success", duration = time, position = 'top-right' })
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -18,7 +28,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
return exports.lation_ui:notify({ title = title, message = message, type = _type or "success", duration = time, position = 'top-right' })
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,17 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
_type = _type or "inform"
|
||||
return exports['mythic_notify']:SendAlert(_type, message, time)
|
||||
end
|
||||
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +28,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
_type = _type or "inform"
|
||||
return exports['mythic_notify']:SendAlert(_type, message, time)
|
||||
end
|
||||
|
||||
@@ -8,6 +8,16 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
return exports['okokNotify']:Alert('Notification', message, time, _type or "Success", false)
|
||||
end
|
||||
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +27,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
return exports['okokNotify']:Alert(title, message, time, _type or "Success", false)
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,16 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
return exports.ox_lib:notify({ description = message, type = _type, duration = time, position = 'top-right' })
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +27,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
return exports.ox_lib:notify({ title = title, description = message, type = _type or "success", duration = time, position = 'top-right' })
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,16 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
return exports['pNotify']:SendNotification({ text = message, type = _type, timeout = time, layout = 'centerRight' })
|
||||
end
|
||||
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +27,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
return exports['pNotify']:SendNotification({ title = title, text = message, type = _type or "success", timeout = time, layout = 'centerRight' })
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,15 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
return exports.r_notify:notify({title = 'Notification', content = message, type = _type, icon = "fas fa-check", duration = time, position = 'top-right', sound = false})
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +26,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
return exports.r_notify:notify({title = title, content = message, type = _type or "success", icon = "fas fa-check", duration = time, position = 'top-right', sound = false})
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,16 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
_type = _type or "info"
|
||||
return exports['t-notify']:Alert({ style = _type, message = message, duration = time, })
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +27,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
_type = _type or "info"
|
||||
return exports['t-notify']:Alert({ title = title, style = _type, message = message, duration = time, })
|
||||
end
|
||||
|
||||
@@ -8,6 +8,16 @@ Notify.GetResourceName = function()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locale = Language.Locale
|
||||
local placeHolderText = locale("Notifications.PlaceholderTitle")
|
||||
|
||||
Notify.SendNotify = function(message, _type, time)
|
||||
time = time or 3000
|
||||
_type = _type or "info"
|
||||
return exports.wasabi_notify:notify(_type, message, time, _type)
|
||||
end
|
||||
|
||||
---This will send a notify message of the type and time passed
|
||||
---@param title string
|
||||
---@param message string
|
||||
@@ -17,7 +27,7 @@ end
|
||||
---@return nil
|
||||
Notify.SendNotification = function(title, message, _type, time, props)
|
||||
time = time or 3000
|
||||
if not title then title = Bridge.Language.Locale("Notifications.PlaceholderTitle") end
|
||||
if not title then title = placeHolderText end
|
||||
_type = _type or "info"
|
||||
return exports.wasabi_notify:notify(_type, message, time, _type)
|
||||
end
|
||||
|
||||
@@ -4,7 +4,7 @@ Shops = Shops or {}
|
||||
local registeredShops = {}
|
||||
|
||||
local Language = Language or Require("modules/locales/shared.lua")
|
||||
local locales = Language.Locale
|
||||
local locale = Language.Locale
|
||||
|
||||
---This can open a shop for the client
|
||||
---@param src number
|
||||
@@ -51,23 +51,23 @@ Shops.CompleteCheckout = function(src, shopName, item, amount, account)
|
||||
end
|
||||
end
|
||||
if not itemData or not itemData.price then return print("community_bridge Player ID "..src.." attempted to purchase invalid item from shop: "..shopName) end
|
||||
if itemData.count and itemData.count <= 0 then return Notify.SendNotify(src, locales('Shops.NotEnoughStock'), "error", 5000) end
|
||||
if itemData.count and itemData.count <= 0 then return Notify.SendNotify(src, locale('Shops.NotEnoughStock'), "error", 5000) end
|
||||
local totalCost = tonumber(itemData.price) * amount
|
||||
local balance = Framework.GetAccountBalance(src, account)
|
||||
if not balance then return end
|
||||
if balance <= 0 then return Notify.SendNotify(src, locales('Shops.NotEnoughMoney'), "error", 5000) end
|
||||
if balance < totalCost then return Notify.SendNotify(src, locales('Shops.NotEnoughMoney'), "error", 5000) end
|
||||
if balance <= 0 then return Notify.SendNotify(src, locale('Shops.NotEnoughMoney'), "error", 5000) end
|
||||
if balance < totalCost then return Notify.SendNotify(src, locale('Shops.NotEnoughMoney'), "error", 5000) end
|
||||
|
||||
if not Framework.RemoveAccountBalance(src, account, totalCost) then return end
|
||||
|
||||
local success = Inventory.AddItem(src, itemData.name, amount)
|
||||
if not success then
|
||||
Framework.AddAccountBalance(src, account, totalCost)
|
||||
return Notify.SendNotify(src, locales('Shops.PurchaseFailed'), "error", 5000)
|
||||
return Notify.SendNotify(src, locale('Shops.PurchaseFailed'), "error", 5000)
|
||||
end
|
||||
|
||||
local itemLabel = Inventory.GetItemInfo(itemData.name).label or itemData.name
|
||||
Notify.SendNotify(src, locales('Shops.PurchasedItem', itemLabel), "success", 5000)
|
||||
Notify.SendNotify(src, locale('Shops.PurchasedItem', amount, itemLabel), "success", 5000)
|
||||
end
|
||||
|
||||
---This is an internal event to complete a checkout, complete with multiple validations. Please do not use this event directly.
|
||||
|
||||
@@ -1,42 +1,54 @@
|
||||
---@diagnostic disable: duplicate-set-field
|
||||
Skills = Skills or {}
|
||||
|
||||
XP_CACHE = {}
|
||||
local cachedXp = {}
|
||||
|
||||
-- Calculate XP required for a level using RuneScape algorithm (with caching)
|
||||
Skills.GetXPForLevel = function(level)
|
||||
function Skills.GetResourceName()
|
||||
return "default"
|
||||
end
|
||||
|
||||
---Calculate XP required for a level using RuneScape algorithm (with caching)
|
||||
---@param level number
|
||||
---@return number
|
||||
function Skills.GetXPForLevel(level)
|
||||
if not level or level < 1 then return 0 end
|
||||
if level == 1 then return 0 end -- Level 1 requires 0 XP
|
||||
|
||||
-- Check cache first
|
||||
if XP_CACHE[level] then
|
||||
return XP_CACHE[level]
|
||||
end
|
||||
if cachedXp[level] then return cachedXp[level] end
|
||||
|
||||
-- Calculate and cache
|
||||
local xp = 0
|
||||
for n = 1, level - 1 do
|
||||
xp = xp + math.floor(n + 300 * (2 ^ (n / 7)))
|
||||
end
|
||||
local result = math.floor(xp / 4)
|
||||
XP_CACHE[level] = result
|
||||
cachedXp[level] = result
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
-- Create a skill (for initialization)
|
||||
Skills.Create = function(name, maxLevel, baseXP)
|
||||
---Create a skill (for initialization)
|
||||
---@param name string
|
||||
---@param maxLevel number
|
||||
---@param baseXP number
|
||||
---@return table
|
||||
function Skills.Create(name, maxLevel, baseXP)
|
||||
if not name then return end
|
||||
Skills.All[name] = { name = name, maxLevel = maxLevel or 99, baseXP = baseXP or 50 }
|
||||
return Skills.All[name]
|
||||
end
|
||||
|
||||
Skills.GetScaledXP = function(baseXP, playerLevel)
|
||||
---Get scaled XP based on player level
|
||||
---@param baseXP number
|
||||
---@param playerLevel number
|
||||
---@return number
|
||||
function Skills.GetScaledXP(baseXP, playerLevel)
|
||||
return math.floor(baseXP * (1 + playerLevel * 0.05))
|
||||
end
|
||||
|
||||
-- Get XP required to complete the current level
|
||||
Skills.GetXPRequiredForLevel = function(level)
|
||||
---@param level number
|
||||
---@return number
|
||||
function Skills.GetXPRequiredForLevel(level)
|
||||
if not level or level < 1 then return 0 end
|
||||
if level == 1 then return 83 end -- Level 1 to 2 requires 83 XP
|
||||
return Skills.GetXPForLevel(level)
|
||||
@@ -45,7 +57,7 @@ end
|
||||
---This will get the skill level of the passed skill name. (returns 1 if not found)
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(skillName)
|
||||
function Skills.GetSkillLevel(skillName)
|
||||
if not skillName then return 0 end
|
||||
local plyrSkills = Bridge.Framework.GetPlayerMetaData("community_bridge_skills")
|
||||
if not plyrSkills or not plyrSkills[skillName] then return 1 end
|
||||
@@ -55,20 +67,11 @@ end
|
||||
---This will get the skill xp of the passed skill name. (returns 1 if not found)
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetXP = function(skillName)
|
||||
function Skills.GetXP(skillName)
|
||||
if not skillName then return 0 end
|
||||
local plyrSkills = Bridge.Framework.GetPlayerMetaData("community_bridge_skills")
|
||||
if not plyrSkills or not plyrSkills[skillName] then return 1 end
|
||||
return plyrSkills[skillName].currentXP or 1
|
||||
end
|
||||
|
||||
Skills.GetResourceName = function()
|
||||
return "default"
|
||||
end
|
||||
|
||||
-- RegisterCommand("getfishingLevel", function(source, args)
|
||||
-- local level = Skills.GetSkillLevel("fishing")
|
||||
-- print("Client Fishing Level issssssssss " .. level)
|
||||
-- end, false)
|
||||
|
||||
return Skills
|
||||
@@ -3,31 +3,39 @@ Skills = Skills or {}
|
||||
Skills.All = Skills.All or {}
|
||||
|
||||
-- XP Cache for performance
|
||||
local XP_CACHE = {}
|
||||
|
||||
local cachedXp = {}
|
||||
-- Default skill object: currentXP (0 to required), level
|
||||
local DEFAULT_SKILL = { currentXP = 0, level = 1 }
|
||||
local defaultSkills = { currentXP = 0, level = 1 }
|
||||
|
||||
function Skills.GetResourceName()
|
||||
return "default"
|
||||
end
|
||||
|
||||
-- Helper function to get or create a skill object
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@return table
|
||||
local function getOrCreateSkill(src, skillName)
|
||||
if not src or not skillName then return table.clone(DEFAULT_SKILL) end
|
||||
if not src or not skillName then return table.clone(defaultSkills) end
|
||||
|
||||
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
||||
if not playerSkills[skillName] then
|
||||
playerSkills[skillName] = table.clone(DEFAULT_SKILL)
|
||||
playerSkills[skillName] = table.clone(defaultSkills)
|
||||
end
|
||||
|
||||
return playerSkills[skillName]
|
||||
end
|
||||
|
||||
-- Calculate XP required for a level using RuneScape algorithm (with caching)
|
||||
Skills.GetXPForLevel = function(level)
|
||||
---Calculate XP required for a level using RuneScape algorithm (with caching)
|
||||
---@param level number
|
||||
---@return number
|
||||
function Skills.GetXPForLevel(level)
|
||||
if not level or level < 1 then return 0 end
|
||||
if level == 1 then return 0 end -- Level 1 requires 0 XP
|
||||
|
||||
-- Check cache first
|
||||
if XP_CACHE[level] then
|
||||
return XP_CACHE[level]
|
||||
if cachedXp[level] then
|
||||
return cachedXp[level]
|
||||
end
|
||||
|
||||
-- Calculate and cache
|
||||
@@ -36,30 +44,44 @@ Skills.GetXPForLevel = function(level)
|
||||
xp = xp + math.floor(n + 300 * (2 ^ (n / 7)))
|
||||
end
|
||||
local result = math.floor(xp / 4)
|
||||
XP_CACHE[level] = result
|
||||
cachedXp[level] = result
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
-- Create a skill (for initialization)
|
||||
Skills.Create = function(name, maxLevel, baseXP)
|
||||
if not name then return end
|
||||
---@param name string
|
||||
---@param maxLevel number
|
||||
---@param baseXP number
|
||||
---@return table
|
||||
function Skills.Create(name, maxLevel, baseXP)
|
||||
if not name then return {} end
|
||||
Skills.All[name] = { name = name, maxLevel = maxLevel or 99, baseXP = baseXP or 50 }
|
||||
return Skills.All[name]
|
||||
end
|
||||
|
||||
-- Get player's current level
|
||||
Skills.GetSkillLevel = function(src, skillName)
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@return number
|
||||
function Skills.GetSkillLevel(src, skillName)
|
||||
if not src or not skillName then return 1 end
|
||||
local skill = getOrCreateSkill(src, skillName)
|
||||
return skill.level or 1
|
||||
end
|
||||
|
||||
Skills.GetScaledXP = function(baseXP, playerLevel)
|
||||
-- returns scaled XP based on player level
|
||||
---@param baseXP number
|
||||
---@param playerLevel number
|
||||
---@return integer
|
||||
function Skills.GetScaledXP(baseXP, playerLevel)
|
||||
return math.floor(baseXP * (1 + playerLevel * 0.05))
|
||||
end
|
||||
-- Get current XP (0 to required XP for current level)
|
||||
Skills.GetXP = function(src, skillName)
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@return number
|
||||
function Skills.GetXP(src, skillName)
|
||||
if not src or not skillName then return 0 end
|
||||
local skill = getOrCreateSkill(src, skillName)
|
||||
local currentXP = skill.currentXP or 0
|
||||
@@ -67,17 +89,21 @@ Skills.GetXP = function(src, skillName)
|
||||
end
|
||||
|
||||
-- Get XP required to complete the current level
|
||||
Skills.GetXPRequiredForLevel = function(level)
|
||||
---@param level number
|
||||
---@return number
|
||||
function Skills.GetXPRequiredForLevel(level)
|
||||
if not level or level < 1 then return 0 end
|
||||
if level == 1 then return 83 end -- Level 1 to 2 requires 83 XP
|
||||
return Skills.GetXPForLevel(level)
|
||||
end
|
||||
|
||||
-- Add XP and handle level ups
|
||||
Skills.AddXP = function(src, skillName, xp)
|
||||
if not src or not skillName then
|
||||
return false
|
||||
end
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@param xp number
|
||||
---@return boolean, number, number
|
||||
function Skills.AddXP(src, skillName, xp)
|
||||
if not src or not skillName then return false, 0, 0 end
|
||||
|
||||
if not xp or xp <= 0 then
|
||||
xp = Skills.GetScaledXP(50, Skills.GetSkillLevel(src, skillName))
|
||||
@@ -86,15 +112,14 @@ Skills.AddXP = function(src, skillName, xp)
|
||||
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
||||
local skill = playerSkills[skillName]
|
||||
if not skill then
|
||||
skill = table.clone(DEFAULT_SKILL)
|
||||
skill = table.clone(defaultSkills)
|
||||
playerSkills[skillName] = skill
|
||||
end
|
||||
|
||||
local oldLevel = skill.level or 1
|
||||
local currentXP = skill.currentXP or 0
|
||||
-- Add XP
|
||||
currentXP = currentXP + xp
|
||||
|
||||
currentXP = currentXP + xp
|
||||
|
||||
local xpNeeded = Skills.GetXPRequiredForLevel(oldLevel + 1)
|
||||
if currentXP >= xpNeeded then
|
||||
@@ -112,11 +137,15 @@ Skills.AddXP = function(src, skillName, xp)
|
||||
end
|
||||
|
||||
-- Set skill level directly (resets currentXP to 0)
|
||||
Skills.SetSkillLevel = function(src, skillName, level)
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@param level number
|
||||
---@return boolean
|
||||
function Skills.SetSkillLevel(src, skillName, level)
|
||||
if not src or not skillName or not level or level < 1 then return false end
|
||||
|
||||
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
||||
local skill = playerSkills[skillName] or table.clone(DEFAULT_SKILL)
|
||||
local skill = playerSkills[skillName] or table.clone(defaultSkills)
|
||||
|
||||
level = math.min(math.max(1, level), 99)
|
||||
skill.level = level
|
||||
@@ -128,11 +157,15 @@ Skills.SetSkillLevel = function(src, skillName, level)
|
||||
end
|
||||
|
||||
-- Set current XP directly
|
||||
Skills.SetXP = function(src, skillName, xp)
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@param xp number
|
||||
---@return boolean
|
||||
function Skills.SetXP(src, skillName, xp)
|
||||
if not src or not skillName or not xp or xp < 0 then return false end
|
||||
|
||||
local playerSkills = Framework.GetPlayerMetadata(src, "community_bridge_skills") or {}
|
||||
local skill = playerSkills[skillName] or table.clone(DEFAULT_SKILL)
|
||||
local skill = playerSkills[skillName] or table.clone(defaultSkills)
|
||||
|
||||
skill.currentXP = xp
|
||||
playerSkills[skillName] = skill
|
||||
@@ -141,17 +174,4 @@ Skills.SetXP = function(src, skillName, xp)
|
||||
return true
|
||||
end
|
||||
|
||||
Skills.GetResourceName = function()
|
||||
return "default"
|
||||
end
|
||||
|
||||
-- Debug Commands
|
||||
-- RegisterCommand('clearskill', function(source, args, rawCommand)
|
||||
-- if not source or source == 0 then return end
|
||||
-- local skillName = args[1] or "fishing"
|
||||
-- Skills.SetXP(source, skillName, 0)
|
||||
-- Skills.SetSkillLevel(source, skillName, 1)
|
||||
-- print("Skill " .. skillName .. " cleared for player " .. source)
|
||||
-- end, false)
|
||||
|
||||
return Skills
|
||||
@@ -13,7 +13,7 @@ end
|
||||
---This will return the skill level of the passed skill name.
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(skillName)
|
||||
function Skills.GetSkillLevel(skillName)
|
||||
local skillData = exports.evolent_skills:getSkillLevel(skillName)
|
||||
return skillData or 0
|
||||
end
|
||||
|
||||
@@ -7,14 +7,14 @@ if (configValue == "auto" and GetResourceState(resourceName) ~= "started") or (c
|
||||
|
||||
---This will get the name of the Skills system being used.
|
||||
---@return string
|
||||
Skills.GetResourceName = function()
|
||||
function Skills.GetResourceName()
|
||||
return resourceName
|
||||
end
|
||||
---This will return the skill level of the passed skill name.
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(src, skillName)
|
||||
function Skills.GetSkillLevel(src, skillName)
|
||||
local skillData = exports.evolent_skills:getSkillLevel(src, skillName)
|
||||
return skillData or 0
|
||||
end
|
||||
@@ -24,7 +24,7 @@ end
|
||||
---@param skillName string
|
||||
---@param amount number
|
||||
---@return boolean
|
||||
Skills.AddXp = function(src, skillName, amount)
|
||||
function Skills.AddXp(src, skillName, amount)
|
||||
local skillData = exports.evolent_skills:getSkillLevel(src, skillName)
|
||||
if not skillData then return false, print("Skill not found") end
|
||||
if not Skills.All[skillName] then
|
||||
@@ -39,7 +39,7 @@ end
|
||||
---@param skillName string
|
||||
---@param amount number
|
||||
---@return boolean
|
||||
Skills.RemoveXp = function(src, skillName, amount)
|
||||
function Skills.RemoveXp(src, skillName, amount)
|
||||
local skillData = exports.evolent_skills:getSkillLevel(src, skillName)
|
||||
if not skillData then return false, print("Skill not found") end
|
||||
exports.evolent_skills:removeXp(src, skillName, amount)
|
||||
|
||||
@@ -7,14 +7,14 @@ if (configValue == "auto" and GetResourceState(resourceName) ~= "started") or (c
|
||||
|
||||
---This will return the name of the Skills system being used.
|
||||
---@return string
|
||||
Skills.GetResourceName = function()
|
||||
function Skills.GetResourceName()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
---This will return the skill level of the passed skill name.
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(skillName)
|
||||
function Skills.GetSkillLevel(skillName)
|
||||
local skillData = exports.OT_skills:getSkill(skillName)
|
||||
return skillData.level or 0
|
||||
end
|
||||
|
||||
@@ -7,7 +7,7 @@ if (configValue == "auto" and GetResourceState(resourceName) ~= "started") or (c
|
||||
|
||||
---This will return the name of the Skills system being used.
|
||||
---@return string
|
||||
Skills.GetResourceName = function()
|
||||
function Skills.GetResourceName()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
@@ -15,7 +15,7 @@ end
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(src, skillName)
|
||||
function Skills.GetSkillLevel(src, skillName)
|
||||
local skillData = exports.OT_skills:getSkill(src, skillName)
|
||||
return skillData.level or 0
|
||||
end
|
||||
@@ -25,7 +25,7 @@ end
|
||||
---@param skillName string
|
||||
---@param amount number
|
||||
---@return boolean
|
||||
Skills.AddXp = function(src, skillName, amount)
|
||||
function Skills.AddXp(src, skillName, amount)
|
||||
local skillData = exports.OT_skills:getSkill(src, skillName)
|
||||
if not skillData then return false, print("Skill not found") end
|
||||
if not Skills.All[skillName] then
|
||||
@@ -40,7 +40,7 @@ end
|
||||
---@param skillName string
|
||||
---@param amount number
|
||||
---@return boolean
|
||||
Skills.RemoveXp = function(src, skillName, amount)
|
||||
function Skills.RemoveXp(src, skillName, amount)
|
||||
local skillData = exports.OT_skills:getSkill(src, skillName)
|
||||
if not skillData then return false, print("Skill not found") end
|
||||
exports.OT_skills:removeXP(src, skillName, amount)
|
||||
|
||||
@@ -6,14 +6,14 @@ if (configValue == "auto" and GetResourceState(resourceName) ~= "started") or (c
|
||||
|
||||
---This will get the name of the Skills system being used.
|
||||
---@return string
|
||||
Skills.GetResourceName = function()
|
||||
function Skills.GetResourceName()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
---This will return the skill level of the passed skill name.
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(skillName)
|
||||
function Skills.GetSkillLevel(skillName)
|
||||
local skillData = exports.pickle_xp:GetLevel(skillName)
|
||||
return skillData or 0
|
||||
end
|
||||
|
||||
@@ -7,7 +7,7 @@ if (configValue == "auto" and GetResourceState(resourceName) ~= "started") or (c
|
||||
|
||||
---This will get the name of the Skills system being used.
|
||||
---@return string
|
||||
Skills.GetResourceName = function()
|
||||
function Skills.GetResourceName()
|
||||
return resourceName
|
||||
end
|
||||
|
||||
@@ -15,7 +15,7 @@ end
|
||||
---@param src number
|
||||
---@param skillName string
|
||||
---@return number
|
||||
Skills.GetSkillLevel = function(src, skillName)
|
||||
function Skills.GetSkillLevel(src, skillName)
|
||||
local skillData = exports.pickle_xp:GetPlayerLevel(src, skillName)
|
||||
return skillData or 0
|
||||
end
|
||||
@@ -25,15 +25,11 @@ end
|
||||
---@param skillName string
|
||||
---@param amount number
|
||||
---@return boolean
|
||||
Skills.AddXp = function(src, skillName, amount)
|
||||
function Skills.AddXp(src, skillName, amount)
|
||||
local skillData = exports.pickle_xp:GetPlayerLevel(src, skillName)
|
||||
if not skillData then return false, print("Skill not found") end
|
||||
if not Skills.All[skillName] then
|
||||
Skills.All[skillName] = Skills.Create(skillName, 99, 50)
|
||||
end
|
||||
-- if not amount or amount < 0 then
|
||||
-- amount = Skills.GetScaledXP(Skills.All[skillName].baseXP, Skills.GetSkillLevel(src, skillName))
|
||||
-- end
|
||||
if not skillData then return false, print("^6 Skill "..skillName.." not found ^0 ") end
|
||||
if not Skills.All[skillName] then Skills.All[skillName] = Skills.Create(skillName, 99, 50) end
|
||||
|
||||
exports.pickle_xp:AddPlayerXP(src, skillName, amount)
|
||||
return true
|
||||
end
|
||||
@@ -43,7 +39,7 @@ end
|
||||
---@param skillName string
|
||||
---@param amount number
|
||||
---@return boolean
|
||||
Skills.RemoveXp = function(src, skillName, amount)
|
||||
function Skills.RemoveXp(src, skillName, amount)
|
||||
local skillData = exports.pickle_xp:GetPlayerLevel(src, skillName)
|
||||
if not skillData then return false, print("Skill not found") end
|
||||
exports.pickle_xp:RemovePlayerXP(src, skillName, amount)
|
||||
|
||||
@@ -2,16 +2,21 @@
|
||||
Target = Target or {}
|
||||
Ids = Ids or Require("lib/utility/shared/ids.lua")
|
||||
|
||||
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
|
||||
local InteractIds = {}
|
||||
|
||||
Target.GetCanInteract = function(id)
|
||||
function Target.GetResourceName()
|
||||
return "default"
|
||||
end
|
||||
|
||||
function Target.GetCanInteract(id)
|
||||
return InteractIds[id]
|
||||
end
|
||||
|
||||
Target.CreateCanInteract = function(cb)
|
||||
function Target.CreateCanInteract(cb)
|
||||
if not cb then return end
|
||||
local id = Ids.CreateUniqueId(InteractIds)
|
||||
InteractIds[id] = {
|
||||
@@ -22,7 +27,7 @@ Target.CreateCanInteract = function(cb)
|
||||
return id
|
||||
end
|
||||
|
||||
Target.CanInteract = function(id, ...)
|
||||
function Target.CanInteract(id, ...)
|
||||
local interactData = InteractIds[id]
|
||||
if not interactData then return true end
|
||||
if interactData.ableToInteract == -1 then
|
||||
@@ -36,7 +41,7 @@ Target.CanInteract = function(id, ...)
|
||||
return interactData.ableToInteract > 0
|
||||
end
|
||||
|
||||
Target.FixOptions = function(options)
|
||||
function Target.FixOptions(options)
|
||||
for k, v in pairs(options) do
|
||||
local action = v.onSelect or v.action
|
||||
local select = function(entityOrData)
|
||||
@@ -57,19 +62,19 @@ Target.FixOptions = function(options)
|
||||
return options
|
||||
end
|
||||
|
||||
Target.AddGlobalPlayer = function(options)
|
||||
function Target.AddGlobalPlayer(options)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.AddGlobalVehicle = function(options)
|
||||
function Target.AddGlobalVehicle(options)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.RemoveGlobalVehicle = function(options)
|
||||
function Target.RemoveGlobalVehicle(options)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.AddLocalEntity = function(entities, _options)
|
||||
function Target.AddLocalEntity(entities, _options)
|
||||
local fixedOptions = Target.FixOptions(_options)
|
||||
if type(entities) == "string" or type(entities) == "number" then
|
||||
entities = { entities }
|
||||
@@ -117,11 +122,11 @@ Target.AddLocalEntity = function(entities, _options)
|
||||
end
|
||||
end
|
||||
|
||||
Target.AddModel = function(models, options)
|
||||
function Target.AddModel(models, options)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.AddBoxZone = function(name, coords, size, heading, options)
|
||||
function Target.AddBoxZone(name, coords, size, heading, options)
|
||||
local fixedOptions = Target.FixOptions(options)
|
||||
local id = Ids.RandomString()
|
||||
local title = Bridge.Language.Locale("target.title")
|
||||
@@ -162,24 +167,20 @@ Target.AddBoxZone = function(name, coords, size, heading, options)
|
||||
end)
|
||||
end
|
||||
|
||||
Target.RemoveGlobalPlayer = function()
|
||||
function Target.RemoveGlobalPlayer()
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.RemoveLocalEntity = function(entity)
|
||||
function Target.RemoveLocalEntity(entity)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.RemoveModel = function(model)
|
||||
function Target.RemoveModel(model)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.RemoveZone = function(name)
|
||||
function Target.RemoveZone(name)
|
||||
warnUser()
|
||||
end
|
||||
|
||||
Target.GetResourceName = function()
|
||||
return "default"
|
||||
end
|
||||
|
||||
return Target
|
||||
@@ -4,12 +4,9 @@ if GetResourceState(resourceName) == 'missing' then return end
|
||||
|
||||
Target = Target or {}
|
||||
local targetDebug = BridgeSharedConfig and BridgeSharedConfig.DebugLevel == 2 or false
|
||||
|
||||
local ox_target = exports.ox_target
|
||||
local targetZones = {}
|
||||
|
||||
Target = Target or {}
|
||||
|
||||
Target.GetResourceName = function()
|
||||
return "ox_target"
|
||||
end
|
||||
@@ -17,7 +14,7 @@ end
|
||||
---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
|
||||
Target.FixOptions = function(options)
|
||||
function Target.FixOptions(options)
|
||||
for _, v in pairs(options) do
|
||||
local action = v.onSelect or v.action
|
||||
if not action then
|
||||
@@ -50,45 +47,45 @@ end
|
||||
|
||||
---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
|
||||
Target.DisableTargeting = function(bool)
|
||||
function Target.DisableTargeting(bool)
|
||||
ox_target:disableTargeting(bool)
|
||||
end
|
||||
|
||||
---This will add target options to players.
|
||||
---@param options table
|
||||
Target.AddGlobalPlayer = function(options)
|
||||
function Target.AddGlobalPlayer(options)
|
||||
options = Target.FixOptions(options)
|
||||
ox_target:addGlobalPlayer(options)
|
||||
end
|
||||
|
||||
---This will remove target options from all players.
|
||||
Target.RemoveGlobalPlayer = function()
|
||||
function Target.RemoveGlobalPlayer()
|
||||
ox_target:removeGlobalPlayer()
|
||||
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 options table
|
||||
Target.AddGlobalPed = function(options)
|
||||
function Target.AddGlobalPed(options)
|
||||
options = Target.FixOptions(options)
|
||||
ox_target:addGlobalPed(options)
|
||||
end
|
||||
|
||||
---This will remove target options from all peds. This is useful for when you want to remove target options from all peds.
|
||||
---@param options any
|
||||
Target.RemoveGlobalPed = function(options)
|
||||
function Target.RemoveGlobalPed(options)
|
||||
ox_target:removeGlobalPed(options)
|
||||
end
|
||||
|
||||
---This will add taget options to all vehicles.
|
||||
---@param options table
|
||||
Target.AddGlobalVehicle = function(options)
|
||||
function Target.AddGlobalVehicle(options)
|
||||
options = Target.FixOptions(options)
|
||||
ox_target:addGlobalVehicle(options)
|
||||
end
|
||||
|
||||
---This will remove target options from all vehicles.
|
||||
---@param options table
|
||||
Target.RemoveGlobalVehicle = function(options)
|
||||
function Target.RemoveGlobalVehicle(options)
|
||||
local assembledLables = {}
|
||||
for k, v in pairs(options) do
|
||||
table.insert(assembledLables, v.name)
|
||||
@@ -99,7 +96,7 @@ end
|
||||
---This will generate targets on non networked entites with the passed options.
|
||||
---@param entities number | table
|
||||
---@param options table
|
||||
Target.AddLocalEntity = function(entities, options)
|
||||
function Target.AddLocalEntity(entities, options)
|
||||
options = Target.FixOptions(options)
|
||||
ox_target:addLocalEntity(entities, options)
|
||||
end
|
||||
@@ -107,14 +104,14 @@ end
|
||||
---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 entities table
|
||||
---@param optionNames string | table | nil
|
||||
Target.RemoveLocalEntity = function(entities, optionNames)
|
||||
function Target.RemoveLocalEntity(entities, optionNames)
|
||||
ox_target:removeLocalEntity(entities, optionNames)
|
||||
end
|
||||
|
||||
---This will add a networked entity to the target system.
|
||||
---@param netids table | number
|
||||
---@param options table
|
||||
Target.AddNetworkedEntity = function(netids, options)
|
||||
function Target.AddNetworkedEntity(netids, options)
|
||||
options = Target.FixOptions(options)
|
||||
ox_target:addEntity(netids, options)
|
||||
end
|
||||
@@ -122,21 +119,21 @@ end
|
||||
---This will remove a networked entity from the target system.
|
||||
---@param netids table | number
|
||||
---@param optionNames string
|
||||
Target.RemoveNetworkedEntity = function(netids, optionNames)
|
||||
function Target.RemoveNetworkedEntity(netids, optionNames)
|
||||
ox_target:removeEntity(netids, optionNames)
|
||||
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
|
||||
Target.AddModel = function(models, options)
|
||||
function Target.AddModel(models, options)
|
||||
options = Target.FixOptions(options)
|
||||
ox_target:addModel(models, options)
|
||||
end
|
||||
|
||||
---This will remove target options from all specified models.
|
||||
---@param model number
|
||||
Target.RemoveModel = function(model)
|
||||
function Target.RemoveModel(model)
|
||||
ox_target:removeModel(model)
|
||||
end
|
||||
|
||||
@@ -146,7 +143,7 @@ end
|
||||
---@param size table
|
||||
---@param heading number
|
||||
---@param options table
|
||||
Target.AddBoxZone = function(name, coords, size, heading, options, debug)
|
||||
function Target.AddBoxZone(name, coords, size, heading, options, debug)
|
||||
options = Target.FixOptions(options or {})
|
||||
if not next(options) then return end
|
||||
local target = ox_target:addBoxZone({
|
||||
@@ -165,7 +162,7 @@ end
|
||||
---@param coords table
|
||||
---@param radius number
|
||||
---@param options table
|
||||
Target.AddSphereZone = function(name, coords, radius, options, debug)
|
||||
function Target.AddSphereZone(name, coords, radius, options, debug)
|
||||
options = Target.FixOptions(options)
|
||||
local target = ox_target:addSphereZone({
|
||||
coords = coords,
|
||||
@@ -180,7 +177,7 @@ end
|
||||
|
||||
---This will remove target options from a specific zone.
|
||||
---@param name string
|
||||
Target.RemoveZone = function(name)
|
||||
function Target.RemoveZone(name)
|
||||
if not name then return end
|
||||
for _, data in pairs(targetZones) do
|
||||
if data.name == name then
|
||||
|
||||
@@ -5,18 +5,14 @@ if GetResourceState("ox_target") ~= 'missing' then return end
|
||||
|
||||
Target = Target or {}
|
||||
local targetDebug = BridgeSharedConfig and BridgeSharedConfig.DebugLevel == 2 or false
|
||||
|
||||
local targetZones = {}
|
||||
|
||||
Target = Target or {}
|
||||
|
||||
local qb_target = exports['qb-target']
|
||||
|
||||
Target.GetResourceName = function()
|
||||
function Target.GetResourceName()
|
||||
return "qb-target"
|
||||
end
|
||||
|
||||
function GetLargestDistance(data)
|
||||
local function getLargestDistance(data)
|
||||
local largestDistance = -1
|
||||
for _, v in pairs(data) do
|
||||
if v.distance and v.distance > largestDistance then
|
||||
@@ -30,7 +26,7 @@ end
|
||||
---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
|
||||
Target.FixOptions = function(options)
|
||||
function Target.FixOptions(options)
|
||||
for k, v in pairs(options) do
|
||||
local action = v.onSelect or v.action
|
||||
local select = action and function(entityOrData)
|
||||
@@ -62,55 +58,55 @@ end
|
||||
|
||||
---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
|
||||
Target.DisableTargeting = function(bool)
|
||||
function Target.DisableTargeting(bool)
|
||||
qb_target:AllowTargeting(not bool)
|
||||
end
|
||||
|
||||
---This will add target options to players.
|
||||
---@param options table
|
||||
Target.AddGlobalPlayer = function(options)
|
||||
function Target.AddGlobalPlayer(options)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddGlobalPlayer({
|
||||
options = options,
|
||||
distance = GetLargestDistance(options)
|
||||
distance = getLargestDistance(options)
|
||||
})
|
||||
end
|
||||
|
||||
---This will remove target options from all players.
|
||||
Target.RemoveGlobalPlayer = function()
|
||||
function Target.RemoveGlobalPlayer()
|
||||
qb_target:RemoveGlobalPlayer()
|
||||
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 options table
|
||||
Target.AddGlobalPed = function(options)
|
||||
function Target.AddGlobalPed(options)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddGlobalPed({
|
||||
options = options,
|
||||
distance = GetLargestDistance(options)
|
||||
distance = getLargestDistance(options)
|
||||
})
|
||||
end
|
||||
|
||||
---This will remove target options from all peds. This is useful for when you want to remove target options from all peds.
|
||||
---@param options any
|
||||
Target.RemoveGlobalPed = function(options)
|
||||
function Target.RemoveGlobalPed(options)
|
||||
qb_target:RemoveGlobalPed(options)
|
||||
end
|
||||
|
||||
---This will add taget options to all vehicles.
|
||||
---@param options table
|
||||
Target.AddGlobalVehicle = function(options)
|
||||
function Target.AddGlobalVehicle(options)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddGlobalVehicle({
|
||||
options = options,
|
||||
distance = GetLargestDistance(options)
|
||||
distance = getLargestDistance(options)
|
||||
})
|
||||
end
|
||||
|
||||
---This will add a networked entity to the target system.
|
||||
---@param netids table | number
|
||||
---@param options table
|
||||
Target.AddNetworkedEntity = function(netids, options)
|
||||
function Target.AddNetworkedEntity(netids, options)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddTargetEntity(netids, options)
|
||||
end
|
||||
@@ -118,13 +114,13 @@ end
|
||||
---This will remove a networked entity from the target system.
|
||||
---@param netids table | number
|
||||
---@param optionNames string
|
||||
Target.RemoveNetworkedEntity = function(netids, optionNames)
|
||||
function Target.RemoveNetworkedEntity(netids, optionNames)
|
||||
qb_target:RemoveTargetEntity(netids, optionNames)
|
||||
end
|
||||
|
||||
---This will remove target options from all vehicles.
|
||||
---@param options table
|
||||
Target.RemoveGlobalVehicle = function(options)
|
||||
function Target.RemoveGlobalVehicle(options)
|
||||
local assembledLables = {}
|
||||
for k, v in pairs(options) do
|
||||
table.insert(assembledLables, v.label)
|
||||
@@ -135,35 +131,35 @@ end
|
||||
---This will generate targets on non networked entites with the passed options.
|
||||
---@param entities number | table
|
||||
---@param options table
|
||||
Target.AddLocalEntity = function(entities, options)
|
||||
function Target.AddLocalEntity(entities, options)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddTargetEntity(entities, {
|
||||
options = options,
|
||||
distance = GetLargestDistance(options)
|
||||
distance = getLargestDistance(options)
|
||||
})
|
||||
end
|
||||
|
||||
---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 number | table
|
||||
---@param labels string | table | nil
|
||||
Target.RemoveLocalEntity = function(entity, labels)
|
||||
function Target.RemoveLocalEntity(entity, labels)
|
||||
qb_target:RemoveTargetEntity(entity, labels)
|
||||
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
|
||||
Target.AddModel = function(models, options, distance)
|
||||
function Target.AddModel(models, options, distance)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddTargetModel(models, {
|
||||
options = options,
|
||||
distance = GetLargestDistance(options),
|
||||
distance = getLargestDistance(options),
|
||||
})
|
||||
end
|
||||
|
||||
---This will remove target options from all specified models.
|
||||
---@param model number
|
||||
Target.RemoveModel = function(model)
|
||||
function Target.RemoveModel(model)
|
||||
qb_target:RemoveTargetModel(model)
|
||||
end
|
||||
|
||||
@@ -173,7 +169,7 @@ end
|
||||
---@param size table
|
||||
---@param heading number
|
||||
---@param options table
|
||||
Target.AddBoxZone = function(name, coords, size, heading, options, debug)
|
||||
function Target.AddBoxZone(name, coords, size, heading, options, debug)
|
||||
options = Target.FixOptions(options)
|
||||
if not next(options) then return end
|
||||
qb_target:AddBoxZone(name, coords, size.x, size.y, {
|
||||
@@ -184,7 +180,7 @@ Target.AddBoxZone = function(name, coords, size, heading, options, debug)
|
||||
maxZ = coords.z + (size.z * 0.5),
|
||||
}, {
|
||||
options = options,
|
||||
distance = GetLargestDistance(options),
|
||||
distance = getLargestDistance(options),
|
||||
})
|
||||
table.insert(targetZones, { name = name, creator = GetInvokingResource() })
|
||||
return name
|
||||
@@ -195,14 +191,14 @@ end
|
||||
---@param coords table
|
||||
---@param radius number
|
||||
---@param options table
|
||||
Target.AddSphereZone = function(name, coords, radius, options, debug)
|
||||
function Target.AddSphereZone(name, coords, radius, options, debug)
|
||||
options = Target.FixOptions(options)
|
||||
qb_target:AddCircleZone(name, coords, radius, {
|
||||
name = name,
|
||||
debugPoly = targetDebug or debug,
|
||||
}, {
|
||||
options = options,
|
||||
distance = GetLargestDistance(options),
|
||||
distance = getLargestDistance(options),
|
||||
})
|
||||
table.insert(targetZones, { name = name, creator = GetInvokingResource() })
|
||||
return name
|
||||
@@ -210,7 +206,7 @@ end
|
||||
|
||||
---This will remove target options from a specific zone.
|
||||
---@param name string
|
||||
Target.RemoveZone = function(name)
|
||||
function Target.RemoveZone(name)
|
||||
if not name then return end
|
||||
for _, data in pairs(targetZones) do
|
||||
if data.name == name then
|
||||
|
||||
@@ -3,22 +3,20 @@ local resourceName = "sleepless_interact"
|
||||
if GetResourceState(resourceName) == 'missing' then return end
|
||||
if GetResourceState("ox_target") == 'started' then return end
|
||||
|
||||
local targetDebug = false
|
||||
local function detectDebugEnabled()
|
||||
if BridgeSharedConfig.DebugLevel == 2 then targetDebug = true end
|
||||
end
|
||||
|
||||
detectDebugEnabled()
|
||||
|
||||
local targetDebug = BridgeSharedConfig and BridgeSharedConfig.DebugLevel == 2 or false
|
||||
local sleepless_interact = exports.sleepless_interact
|
||||
local targetZones = {}
|
||||
|
||||
Target = Target or {}
|
||||
|
||||
function Target.GetResourceName()
|
||||
return "sleepless_interact"
|
||||
end
|
||||
|
||||
---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
|
||||
Target.FixOptions = function(options)
|
||||
function Target.FixOptions(options)
|
||||
for k, v in pairs(options) do
|
||||
local action = v.onSelect or v.action
|
||||
local select = function(entityOrData)
|
||||
@@ -42,45 +40,45 @@ end
|
||||
|
||||
---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
|
||||
Target.DisableTargeting = function(bool) -- someone disabled this mistakenly
|
||||
function Target.DisableTargeting(bool) -- someone disabled this mistakenly
|
||||
sleepless_interact:disableInteract(bool)
|
||||
end
|
||||
|
||||
---This will add target options to players.
|
||||
---@param options table
|
||||
Target.AddGlobalPlayer = function(options)
|
||||
function Target.AddGlobalPlayer(options)
|
||||
options = Target.FixOptions(options)
|
||||
sleepless_interact:addGlobalPlayer(options)
|
||||
end
|
||||
|
||||
---This will remove target options from all players.
|
||||
Target.RemoveGlobalPlayer = function()
|
||||
function Target.RemoveGlobalPlayer()
|
||||
sleepless_interact:removeGlobalPlayer()
|
||||
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 options table
|
||||
Target.AddGlobalPed = function(options)
|
||||
function Target.AddGlobalPed(options)
|
||||
options = Target.FixOptions(options)
|
||||
sleepless_interact:addGlobalPed(options)
|
||||
end
|
||||
|
||||
---This will remove target options from all peds. This is useful for when you want to remove target options from all peds.
|
||||
---@param options any
|
||||
Target.RemoveGlobalPed = function(options)
|
||||
function Target.RemoveGlobalPed(options)
|
||||
sleepless_interact:removeGlobalPed(options)
|
||||
end
|
||||
|
||||
---This will add taget options to all vehicles.
|
||||
---@param options table
|
||||
Target.AddGlobalVehicle = function(options)
|
||||
function Target.AddGlobalVehicle(options)
|
||||
options = Target.FixOptions(options)
|
||||
sleepless_interact:addGlobalVehicle(options)
|
||||
end
|
||||
|
||||
---This will remove target options from all vehicles.
|
||||
---@param options table
|
||||
Target.RemoveGlobalVehicle = function(options)
|
||||
function Target.RemoveGlobalVehicle(options)
|
||||
local assembledLables = {}
|
||||
for k, v in pairs(options) do
|
||||
table.insert(assembledLables, v.name)
|
||||
@@ -91,7 +89,7 @@ end
|
||||
---This will add a networked entity to the target system.
|
||||
---@param netids table | number
|
||||
---@param options table
|
||||
Target.AddNetworkedEntity = function(netids, options)
|
||||
function Target.AddNetworkedEntity(netids, options)
|
||||
options = Target.FixOptions(options)
|
||||
sleepless_interact:addEntity(netids, options)
|
||||
end
|
||||
@@ -99,14 +97,14 @@ end
|
||||
---This will remove a networked entity from the target system.
|
||||
---@param netids table | number
|
||||
---@param optionNames string
|
||||
Target.RemoveNetworkedEntity = function(netids, optionNames)
|
||||
function Target.RemoveNetworkedEntity(netids, optionNames)
|
||||
sleepless_interact:removeEntity(netids, optionNames)
|
||||
end
|
||||
|
||||
---This will generate targets on non networked entites with the passed options.
|
||||
---@param entities number | table
|
||||
---@param options table
|
||||
Target.AddLocalEntity = function(entities, options)
|
||||
function Target.AddLocalEntity(entities, options)
|
||||
options = Target.FixOptions(options)
|
||||
sleepless_interact:addLocalEntity(entities, options)
|
||||
end
|
||||
@@ -114,21 +112,21 @@ end
|
||||
---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 number | table
|
||||
---@param labels string | table | nil
|
||||
Target.RemoveLocalEntity = function(entity, labels)
|
||||
function Target.RemoveLocalEntity(entity, labels)
|
||||
sleepless_interact:removeLocalEntity(entity, labels)
|
||||
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
|
||||
Target.AddModel = function(models, options)
|
||||
function Target.AddModel(models, options)
|
||||
options = Target.FixOptions(options)
|
||||
sleepless_interact:addModel(models, options)
|
||||
end
|
||||
|
||||
---This will remove target options from all specified models.
|
||||
---@param model number
|
||||
Target.RemoveModel = function(model)
|
||||
function Target.RemoveModel(model)
|
||||
sleepless_interact:removeModel(model)
|
||||
end
|
||||
|
||||
@@ -138,7 +136,7 @@ end
|
||||
---@param size table
|
||||
---@param heading number
|
||||
---@param options table
|
||||
Target.AddBoxZone = function(name, coords, size, heading, options)
|
||||
function Target.AddBoxZone(name, coords, size, heading, options)
|
||||
options = Target.FixOptions(options)
|
||||
local target = sleepless_interact:addCoords({
|
||||
coords = coords,
|
||||
@@ -153,7 +151,7 @@ end
|
||||
---@param coords table
|
||||
---@param radius number
|
||||
---@param options table
|
||||
Target.AddSphereZone = function(name, coords, radius, options, debug)
|
||||
function Target.AddSphereZone(name, coords, radius, options, debug)
|
||||
options = Target.FixOptions(options)
|
||||
local target = sleepless_interact:addSphereZone({
|
||||
coords = coords,
|
||||
@@ -168,7 +166,7 @@ end
|
||||
|
||||
---This will remove target options from a specific zone.
|
||||
---@param name string
|
||||
Target.RemoveZone = function(name)
|
||||
function Target.RemoveZone(name)
|
||||
for _, data in pairs(targetZones) do
|
||||
if data.name == name then
|
||||
sleepless_interact:removeCoords(data.id)
|
||||
@@ -188,8 +186,4 @@ AddEventHandler('onResourceStop', function(resource)
|
||||
targetZones = {}
|
||||
end)
|
||||
|
||||
Target.GetResourceName = function()
|
||||
return "sleepless_interact"
|
||||
end
|
||||
|
||||
return Target
|
||||
Reference in new issue
Block a user