From f913089d368681c1dcafe81e59129d60ae830904 Mon Sep 17 00:00:00 2001 From: JericoFX Date: Mon, 5 May 2025 19:24:17 -0300 Subject: [PATCH] add Client State Bag --- lib/init.lua | 4 +-- lib/statebags/client/client.lua | 48 +++++++++++++++++++++++++++++++++ lib/statebags/server/server.lua | 0 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 lib/statebags/client/client.lua create mode 100644 lib/statebags/server/server.lua diff --git a/lib/init.lua b/lib/init.lua index 7d8cc5a..3d3df81 100644 --- a/lib/init.lua +++ b/lib/init.lua @@ -73,5 +73,5 @@ cLib.Particle = Particle or Require("lib/particles/client/particles.lua") cLib.Cache = Cache or Require("lib/cache/client/cache.lua") cLib.ClientEntity = ClientEntity or Require("lib/entities/client/client_entity.lua") cLib.ClientEntityActions = ClientEntityActions or Require("lib/entities/client/client_entity_actions.lua") - -return cLib \ No newline at end of file +cLib.ClientStateBag = ClientStateBag or Require("lib/statebags/client/client.lua") +return cLib diff --git a/lib/statebags/client/client.lua b/lib/statebags/client/client.lua new file mode 100644 index 0000000..0668718 --- /dev/null +++ b/lib/statebags/client/client.lua @@ -0,0 +1,48 @@ +ClientStateBag = {} + +---Gets an entity from a statebag name +---@param entityId string The entity ID or statebag name +---@return number|nil entity The entity handle or nil if not found +local function getStateBagEntity(entityId) + local _entity = GetEntityFromStateBagName(entityId) + return _entity +end + +local function getPlayerFromStateBagName(stateBagName) + return getPlayerFromStateBagName(stateBagName) +end + +---Adds a handler for entity statebag changes +---@param keyName string The statebag key to watch for changes +---@param entityId string|nil The specific entity ID to watch, or nil for all entities +---@param callback function The callback function to handle changes (function(entityId, key, value, lastValue, replicated)) +---@return number handler The handler ID +function ClientStateBag.AddEntityChangeHandler(keyName, entityId, callback) + return AddStateBagChangeHandler(keyName, entityId or nil, function(bagName, key, value, lastValue, replicated) + local entity = getStateBagEntity(bagName) + if not DoesEntityExist(entity) then return end + if entity then + return callback(entity, key, value, lastValue, replicated) + end + end) +end + +---Adds a handler for player statebag changes +---@param keyName string The statebag key to watch for changes +---@param filter boolean|nil If true, only watch for changes from the current player +---@param callback function The callback function to handle changes (function(playerId, key, value, lastValue, replicated)) +---@return number handler The handler ID +function ClientStateBag.AddPlayerChangeHandler(keyName, filter, callback) + return AddStateBagChangeHandler(keyName, filter and GetPlayerServerId(PlayerId()) or nil, + function(bagName, key, value, lastValue, replicated) + local actualPlayerId = getPlayerFromStateBagName(bagName) + if DoesEntityExist(actualPlayerId) and (not actualPlayerId == PlayerPedId()) then -- you cant have a statebag value if you are not the player + return false + end + if actualPlayerId and actualPlayerId ~= 0 then + return callback(tonumber(actualPlayerId), key, value, lastValue, replicated) + end + end) +end + +return ClientStateBag diff --git a/lib/statebags/server/server.lua b/lib/statebags/server/server.lua new file mode 100644 index 0000000..e69de29