diff --git a/documentation/main_functions/metahandlers.md b/documentation/main_functions/metahandlers.md index 3c71fa9..5ec786f 100644 --- a/documentation/main_functions/metahandlers.md +++ b/documentation/main_functions/metahandlers.md @@ -21,12 +21,12 @@ This module provides access and control over player metadata, which is useful fo print("Player stress level:", stress) ``` -- **SetMetadata(player, key, value)** +- **setPlayerMetadata(player, key, value)** ⚠️ Server side only - Updates or assigns a value to a specific metadata key for a player. - The function updates the player's metadata using the active core export. - **Example:** ```lua - SetMetadata(player, "stress", 0) + setPlayerMetadata(player, "stress", 0) ``` \ No newline at end of file diff --git a/shared/crafting.lua b/shared/crafting.lua index 3e0dd48..958cacc 100644 --- a/shared/crafting.lua +++ b/shared/crafting.lua @@ -411,11 +411,11 @@ function makeItem(data) -- handle metadata and experience in a single go if data.craft["hasCrafted"] ~= nil then data.craftable.craftedItems[data.item] = true - triggerCallback(getScript()..":server:SetMetadata", "craftedItems", data.craftable.craftedItems) + triggerCallback(getScript()..":server:setPlayerMetadata", "craftedItems", data.craftable.craftedItems) end if data.craft["exp"] ~= nil then craftingLevel += data.craft["exp"].give * craftAmount - triggerCallback(getScript()..":server:SetMetadata", "craftingLevel", craftingLevel) + triggerCallback(getScript()..":server:setPlayerMetadata", "craftingLevel", craftingLevel) end if data.craftable.Recipes[1].oneUse == true then removeItem("craftrecipe", 1, nil, data.craftable.Recipes[1].slot) @@ -448,11 +448,11 @@ function makeItem(data) currentToken = nil if data.craft["hasCrafted"] ~= nil then data.craftable.craftedItems[data.item] = true - triggerCallback(getScript()..":server:SetMetadata", "craftedItems", data.craftable.craftedItems) + triggerCallback(getScript()..":server:setPlayerMetadata", "craftedItems", data.craftable.craftedItems) end if data.craft["exp"] ~= nil then craftingLevel += data.craft["exp"].give - triggerCallback(getScript()..":server:SetMetadata", "craftingLevel", craftingLevel) + triggerCallback(getScript()..":server:setPlayerMetadata", "craftingLevel", craftingLevel) end if data.craftable.Recipes[1].oneUse == true then removeItem("craftrecipe", 1, nil, data.craftable.Recipes[1].slot) diff --git a/shared/itemcontrol.lua b/shared/itemcontrol.lua index 936b249..203fe5b 100644 --- a/shared/itemcontrol.lua +++ b/shared/itemcontrol.lua @@ -385,121 +385,51 @@ function breakTool(data) -- WIP local breakId = GetSoundId() PlaySoundFromEntity(breakId, "Drill_Pin_Break", PlayerPedId(), "DLC_HEIST_FLEECA_SOUNDSET", 1, 0) else - TriggerServerEvent(getScript()..":server:setMetaData", { item = data.item, slot = slot, metadata = { durability = durability } }) + TriggerServerEvent(getScript()..":server:setItemMetaData", { item = data.item, slot = slot, metadata = { durability = durability } }) end end ---- Retrieves the durability and slot number of an item in a player's inventory. ---- ---- Searches through the player's inventory for the specified item. ---- ---- @param item string The item name. ---- @return number|nil number The durability, or nil if not found. ---- @return number|nil number The slot number, or nil if not found. ---- ---- @usage ---- ```lua ---- local durability, slot = getDurability("drill") ---- if durability then ---- print("Durability:", durability) ---- print("Slot:", slot) ---- end ---- ``` -function getDurability(item) +--- local metadata = getItemMetadata("item", 1, 1) +--- print(json.encode(metadata)) + + +function getItemMetadata(item, slot, src) local lowestSlot = 100 - local durability = nil - if isStarted(QBInv) or isStarted(PSInv) or isStarted(RSGInv) or isStarted(JPRInv) then - local itemcheck = Core.Functions.GetPlayerData().items + local chosenSlot = slot + local metadata = {} + + local itemcheck = getPlayerInv(src) + + if chosenSlot then + for k, v in pairs(itemcheck) do + if v.name == item and v.slot == chosenSlot then + lowestSlot = v.slot + metadata = itemcheck[k].info or itemcheck[k].metadata or {} + debugPrint("^6Bridge^7: ^2Found metadata for item ^3"..item.." ^2in slot ^3"..lowestSlot.."^7") + end + end + else for k, v in pairs(itemcheck) do if v.name == item then if v.slot <= lowestSlot then lowestSlot = v.slot - durability = itemcheck[k].info and itemcheck[k].info.durability or nil + metadata = itemcheck[k].info or itemcheck[k].metadata or {} end end end end + return metadata, lowestSlot +end - if isStarted(OXInv) then - local itemcheck = exports[OXInv]:Search('slots', item) - for k, v in pairs(itemcheck) do - if v.slot <= lowestSlot then - debugPrint(v.slot, itemcheck[k].metadata.durability) - lowestSlot = v.slot - durability = v.metadata and v.metadata.durability or nil - end - end +function getDurability(item, slot, src) + local metadata, slot = getItemMetadata(item, slot, src) + local durability = nil + + if next(metadata) then + durability = metadata.durability or nil end - if isStarted(QSInv) then - local itemcheck = exports[QSInv]:getUserInventory() - for _, v in pairs(itemcheck) do - if v.name == item and v.slot <= lowestSlot then - lowestSlot = v.slot - durability = v.info and v.info.durability or nil - end - end - end - - if isStarted(CoreInv) then - local itemcheck = exports[CoreInv]:getInventory() - for _, v in pairs(itemcheck) do - if v.name == item and v.slot <= lowestSlot then - lowestSlot = v.slot - durability = v.metadata and v.metadata.durability or nil - end - end - end - - if isStarted(CodeMInv) then - local itemcheck = exports[CodeMInv]:GetClientPlayerInventory() - for _, v in pairs(itemcheck) do - if v.name == item and tonumber(v.slot) <= lowestSlot then - lowestSlot = tonumber(v.slot) - durability = v.info and v.info.durability or nil - end - end - end - - if isStarted(OrigenInv) then - local itemcheck = exports[OrigenInv]:getPlayerInventory() - for _, v in pairs(itemcheck) do - if v.name == item and v.slot <= lowestSlot then - lowestSlot = v.slot - durability = v.metadata and v.metadata.durability or nil - end - end - end - - if isStarted(TgiannInv) then - local itemcheck = exports[TgiannInv]:GetPlayerItems() - for _, v in pairs(itemcheck) do - if v.name == item and v.slot <= lowestSlot then - lowestSlot = v.slot - durability = v.metadata and v.metadata.durability or nil - end - end - end - - -- For ESX default inventory (es_extended) - if ESX and isStarted(ESXExport) then - local xPlayer = ESX.GetPlayerData() or {} - if xPlayer.inventory then - for _, v in ipairs(xPlayer.inventory) do - if v.name == item then - -- Optionally use a slot field if available; otherwise, use the index - if v.slot and v.slot <= lowestSlot then - lowestSlot = v.slot - end - if v.metadata and v.metadata.durability then - durability = v.metadata.durability - end - end - end - end - end - - return durability, lowestSlot + return durability, slot end --- Server event handler to set metadata for an item. @@ -513,9 +443,9 @@ end --- --- @usage --- ```lua ---- TriggerServerEvent("script:server:setMetaData", { item = "drill", slot = 5, metadata = { durability = 80 } }) +--- TriggerServerEvent("script:server:setItemMetaData", { item = "drill", slot = 5, metadata = { durability = 80 } }) --- ``` -RegisterNetEvent(getScript()..":server:setMetaData", function(data, src) +RegisterNetEvent(getScript()..":server:setItemMetaData", function(data, src) local src = src or source if isStarted(QBInv) or isStarted(PSInv) or isStarted(RSGInv) or isStarted(JPRInv) then --debugPrint(src, data.item, 1, data.slot) diff --git a/shared/metaHandlers.lua b/shared/metaHandlers.lua index 9d6160f..515d248 100644 --- a/shared/metaHandlers.lua +++ b/shared/metaHandlers.lua @@ -58,9 +58,9 @@ end --- --- @usage --- ```lua ---- local myMeta = GetMetadata(player, "myKey") +--- local myMeta = getPlayerMetadata(player, "myKey") --- ``` -function GetMetadata(player, key) +function getPlayerMetadata(player, key) if not player then debugPrint("^6Bridge^7: ^3GetMetadata^7() calling server: "..key) return triggerCallback(getScript()..":server:GetMetadata", key) @@ -98,11 +98,11 @@ createCallback(getScript()..":server:GetMetadata", function(source, key) if type(key) == "table" then local Metadata = {} for _, k in ipairs(key) do - Metadata[k] = GetMetadata(player, k) + Metadata[k] = getPlayerMetadata(player, k) end return Metadata elseif type(key) == "string" then - return GetMetadata(player, key) + return getPlayerMetadata(player, key) end end) @@ -120,9 +120,9 @@ end) --- --- @usage --- ```lua ---- SetMetadata(player, "myKey", "newValue") +--- setPlayerMetadata(player, "myKey", "newValue") --- ``` -function SetMetadata(player, key, value) +function setPlayerMetadata(player, key, value) debugPrint("^6Bridge^7: ^3SetMetadata^7() setting metadata for key: "..key) if isStarted(QBExport) or isStarted(QBXExport) then debugPrint("^6Bridge^7: ^3SetMetadata^7() using QBExport/QBXExport") @@ -144,14 +144,14 @@ function SetMetadata(player, key, value) end -- Register a server callback for setting metadata. -createCallback(getScript()..":server:SetMetadata", function(source, key, value) +createCallback(getScript()..":server:setPlayerMetadata", function(source, key, value) debugPrint("SetMetadata callback triggered for source:", source, "key:", key, "value:", value) local player = GetPlayer(source) --[[if not player then print("Error setting metadata: player not found for source "..tostring(source)) return false end]] - SetMetadata(player, key, value) + setPlayerMetadata(player, key, value) print("Metadata set successfully.", key) return true end) \ No newline at end of file