4 Commits

Author SHA1 Message Date
github-actions
855e1e4a36 chore: bump version to v3.32.0 2025-11-03 15:39:46 +00:00
PotatoFarmer441
a2f6b9a9e9 fix(progress): prop replication overload (#58) 2025-11-03 16:35:39 +01:00
RuksH4n
13a24baee4 fix(table_matches): remove leftover strict shape check from df7a6b9 (#50)
- The previous fix (commit df7a6b9) mistakenly left in a table.type
  / #t1 == #t2 check that breaks equality for {} and {x=nil}.
- This removes that leftover check, restoring the intended deep
  equality semantics.

Signed-off-by: RuksH4n <77233680+rukshanchamindu@users.noreply.github.com>
2025-09-13 12:47:16 +02:00
RuksH4n
df7a6b9c21 fix(table): restore expected behavior in table_matches (#49)
- The refactor in [Commit 4c460e0](4c460e0bd9) introduced stricter type checks (using table.type and array length comparison), which caused empty tables and tables with nil values to be considered unequal. 
- This commit removes the strict shape checks and restores the original deep equality semantics, ensuring {} == {x=nil}.

Signed-off-by: RuksH4n <77233680+rukshanchamindu@users.noreply.github.com>
2025-09-10 14:17:44 +02:00
5 changed files with 46 additions and 22 deletions

View File

@@ -6,7 +6,7 @@ rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aw
name 'ox_lib' name 'ox_lib'
author 'Overextended' author 'Overextended'
version '3.31.4' version '3.32.0'
license 'LGPL-3.0-or-later' license 'LGPL-3.0-or-later'
repository 'https://github.com/communityox/ox_lib' repository 'https://github.com/communityox/ox_lib'
description 'A library of shared functions to utilise in other resources.' description 'A library of shared functions to utilise in other resources.'

View File

@@ -47,13 +47,10 @@ end
---@return boolean ---@return boolean
---Compares if two values are equal, iterating over tables and matching both keys and values. ---Compares if two values are equal, iterating over tables and matching both keys and values.
local function table_matches(t1, t2) local function table_matches(t1, t2)
local tabletype1 = table.type(t1) local type1, type2 = type(t1), type(t2)
if not tabletype1 then return t1 == t2 end if type1 ~= type2 then return false end
if type1 ~= 'table' and type2 ~= 'table' then return t1 == t2 end
if tabletype1 ~= table.type(t2) or (tabletype1 == 'array' and #t1 ~= #t2) then
return false
end
for k, v1 in pairs(t1) do for k, v1 in pairs(t1) do
local v2 = t2[k] local v2 = t2[k]

View File

@@ -1,7 +1,7 @@
{ {
"name": "@communityox/ox_lib", "name": "@communityox/ox_lib",
"author": "Overextended", "author": "Overextended",
"version": "3.31.4", "version": "3.32.0",
"description": "JS/TS wrapper for ox_lib exports", "description": "JS/TS wrapper for ox_lib exports",
"main": "./shared/index.js", "main": "./shared/index.js",
"types": "./shared/index.d.ts", "types": "./shared/index.d.ts",

View File

@@ -11,6 +11,7 @@ local DisableControlAction = DisableControlAction
local DisablePlayerFiring = DisablePlayerFiring local DisablePlayerFiring = DisablePlayerFiring
local playerState = LocalPlayer.state local playerState = LocalPlayer.state
local createdProps = {} local createdProps = {}
local maxProps = GetConvarInt('ox:progressPropLimit', 2)
---@class ProgressPropProps ---@class ProgressPropProps
---@field model string ---@field model string
@@ -34,13 +35,16 @@ local createdProps = {}
---@field disable? { move?: boolean, sprint?: boolean, car?: boolean, combat?: boolean, mouse?: boolean } ---@field disable? { move?: boolean, sprint?: boolean, car?: boolean, combat?: boolean, mouse?: boolean }
local function createProp(ped, prop) local function createProp(ped, prop)
lib.requestModel(prop.model) local ok, result = pcall(lib.requestModel, prop.model)
if not ok then return lib.print.error(result) end
local coords = GetEntityCoords(ped) local coords = GetEntityCoords(ped)
local object = CreateObject(prop.model, coords.x, coords.y, coords.z, false, false, false) local object = CreateObject(result, coords.x, coords.y, coords.z, false, false, false)
AttachEntityToEntity(object, ped, GetPedBoneIndex(ped, prop.bone or 60309), prop.pos.x, prop.pos.y, prop.pos.z, prop.rot.x, prop.rot.y, prop.rot.z, true, AttachEntityToEntity(object, ped, GetPedBoneIndex(ped, prop.bone or 60309), prop.pos.x, prop.pos.y, prop.pos.z, prop.rot.x, prop.rot.y, prop.rot.z, true,
true, false, true, prop.rotOrder or 0, true) true, false, true, prop.rotOrder or 0, true)
SetModelAsNoLongerNeeded(prop.model) SetModelAsNoLongerNeeded(result)
return object return object
end end
@@ -90,7 +94,7 @@ local function startProgress(data)
end end
if data.prop then if data.prop then
playerState:set('lib:progressProps', data.prop, true) TriggerServerEvent('ox_lib:progressProps', data.prop)
end end
local disable = data.disable local disable = data.disable
@@ -137,7 +141,7 @@ local function startProgress(data)
end end
if data.prop then if data.prop then
playerState:set('lib:progressProps', nil, true) TriggerServerEvent('ox_lib:progressProps', nil)
end end
if anim then if anim then
@@ -225,14 +229,18 @@ end
local function deleteProgressProps(serverId) local function deleteProgressProps(serverId)
local playerProps = createdProps[serverId] local playerProps = createdProps[serverId]
if not playerProps then return end if not playerProps then return end
createdProps[serverId] = nil
for i = 1, #playerProps do for i = 1, #playerProps do
local prop = playerProps[i] local prop = playerProps[i]
if DoesEntityExist(prop) then if DoesEntityExist(prop) then
DeleteEntity(prop) DeleteEntity(prop)
end end
end end
createdProps[serverId] = nil
end end
RegisterNetEvent('onPlayerDropped', function(serverId) RegisterNetEvent('onPlayerDropped', function(serverId)
@@ -248,22 +256,29 @@ AddStateBagChangeHandler('lib:progressProps', nil, function(bagName, key, value,
local ped = GetPlayerPed(ply) local ped = GetPlayerPed(ply)
local serverId = GetPlayerServerId(ply) local serverId = GetPlayerServerId(ply)
if not value then if not value or createdProps[serverId] then
return deleteProgressProps(serverId) return deleteProgressProps(serverId)
end end
createdProps[serverId] = {} local playerProps = {}
local playerProps = createdProps[serverId]
if value.model then if value.model then
playerProps[#playerProps + 1] = createProp(ped, value) local prop = createProp(ped, value)
else
for i = 1, #value do
local prop = value[i]
if prop then if prop then
playerProps[#playerProps + 1] = createProp(ped, prop) playerProps[#playerProps + 1] = createProp(ped, value)
end
else
local propCount = math.min(maxProps, #value)
for i = 1, propCount do
local prop = createProp(ped, value[i])
if prop then
playerProps[#playerProps + 1] = prop
end end
end end
end end
createdProps[serverId] = playerProps
end) end)

View File

@@ -0,0 +1,12 @@
local maxProps = GetConvarInt('ox:progressPropLimit', 2)
---@param props ProgressPropProps | ProgressPropProps[] | nil
RegisterNetEvent('ox_lib:progressProps', function(props)
if type(props) == 'table' then
props = #props > maxProps and { table.unpack(props, 1, maxProps) } or props
else
props = nil
end
Player(source).state:set('lib:progressProps', props, true)
end)