Compare commits

...

4 Commits

Author SHA1 Message Date
Jim Shield
63bcb86ac1 ESX Fallback functions are very basic.
There aren't many native functions for what the script can do, if anyone has any better ideas

- go to `itemcontrol.lua`
- search `ESX` and tell me what could be done better/right
2025-10-04 01:31:14 +01:00
Jim Shield
0bc3c0f9b4 Update itemcontrol.lua 2025-10-03 17:44:29 +01:00
Jim Shield
672dd7684b Fix ESX authtoken callback saying possible exploit 2025-10-03 13:51:15 +01:00
Jim Shield
c040390d1f Start working on inventory fallback functions
NEEDS TESTING

A lot of ESX stuff not done yet
2025-10-03 12:22:05 +01:00
2 changed files with 190 additions and 16 deletions

View File

@@ -7,14 +7,22 @@ AuthEvent = nil
currentToken = nil currentToken = nil
if isServer() then if isServer() then
local excludeRes = {
[Exports.QBExport] = true,
[Exports.ESXExport] = true,
[Exports.VorpExport] = true,
}
local AuthEvent = getScript()..":"..keyGen()..keyGen()..keyGen()..keyGen()..":"..keyGen()..keyGen()..keyGen()..keyGen() local AuthEvent = getScript()..":"..keyGen()..keyGen()..keyGen()..keyGen()..":"..keyGen()..keyGen()..keyGen()..keyGen()
validTokens = validTokens or {} validTokens = validTokens or {}
createCallback(AuthEvent, function(source) createCallback(AuthEvent, function(source)
local src = source local src = source
local token = keyGen()..keyGen()..keyGen()..keyGen() -- Use a secure random generator here local token = keyGen()..keyGen()..keyGen()..keyGen() -- Use a secure random generator here
--debugPrint(GetInvokingResource()) local invokingRes = GetInvokingResource()
if GetInvokingResource() and GetInvokingResource() ~= getScript() and GetInvokingResource() ~= Exports.QBExport and GetInvokingResource() ~= Exports.VorpExport then
debugPrint(invokingRes)
if invokingRes and invokingRes ~= getScript() and not excludeRes[invokingRes] then
debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital function was called from an external resource^7") debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital function was called from an external resource^7")
return "" return ""
end end
@@ -47,9 +55,9 @@ if isServer() then
createCallback(getScript()..":callback:GetAuthEvent", function(source) createCallback(getScript()..":callback:GetAuthEvent", function(source)
local src = source local src = source
--debugPrint(GetInvokingResource()) local invokingRes = GetInvokingResource()
if GetInvokingResource() and GetInvokingResource() ~= getScript() and GetInvokingResource() ~= Exports.QBExport and GetInvokingResource() ~= Exports.VorpExport then if invokingRes and invokingRes ~= getScript() and not excludeRes[invokingRes] then
debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital callback was called from an external resource^7") debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital callback was called from an external resource^7")
return "" return ""
end end

View File

@@ -1147,7 +1147,7 @@ local InvFunc = {
function(itemTable, src) function(itemTable, src)
local resultTable = {} local resultTable = {}
for k, v in pairs(itemTable) do for k, v in pairs(itemTable) do
resultTable[k] = exports[OXInv]:CanCarryItem(src, k, v) resultTable[k] = exports[RSGInv]:CanCarryItem(src, k, v)
end end
return resultTable return resultTable
end, end,
@@ -1301,6 +1301,32 @@ function hasItem(items, amount, src)
end end
end end
end end
-- Fallback to default hasItem function
if not hasTable or not next(hasTable) then
if isStarted(ESXExport) then
for item, amt in pairs(items) do
local count = 0
for itemName, amount in pairs(grabInv) do
if itemName and itemName == item then
count += (amount or 1)
end
end
hasTable[item] = { hasItem = count >= amt, count = count }
end
else
for item, amt in pairs(items) do
local count = 0
for _, itemData in pairs(grabInv) do
if itemData and itemData.name == item then
count += (itemData.amount or itemData.count or 1)
end
end
hasTable[item] = { hasItem = count >= amt, count = count }
end
end
end
for _, v in pairs(hasTable) do for _, v in pairs(hasTable) do
if not v.hasItem then if not v.hasItem then
return false, hasTable return false, hasTable
@@ -1334,12 +1360,41 @@ function getPlayerInv(src)
break break
end end
end end
if foundInv == "" then
-- Fallback to framework functions
if not grabInv then
if isStarted(QBExport) then
if src then
grabInv = Core.Functions.GetPlayer(src).PlayerData.items
else
grabInv = Core.Functions.GetPlayerData().items
end
elseif isStarted(ESXExport) then
if src then
local xPlayer = ESX.GetPlayerFromId(src)
grabInv = xPlayer and xPlayer.getInventory() or {}
else
grabInv = triggerCallback(getScript()..":GetESXInv")
end
end
--jsonPrint(grabInv)
end
if grabInv == nil then
print("^4ERROR^7: ^2No Supported Inventory detected ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No Supported Inventory detected ^7- ^2Check ^3starter^1.^2lua^7")
end end
return grabInv, foundInv return grabInv, foundInv
end end
if isServer() then
createCallback(getScript()..":GetESXInv", function(source)
local src = source
local xPlayer = ESX.GetPlayerFromId(src)
local inv = xPlayer.getInventory()
return xPlayer.getInventory(src)
end)
end
function isInventoryOpen() function isInventoryOpen()
return IsNuiFocused() return IsNuiFocused()
@@ -1423,6 +1478,17 @@ function createUseableItem(item, funct)
return return
end end
end end
-- Fallback to framework functiosn
if isStarted(QBExport) then
debugPrint("^6Bridge^7: ^2Registering ^3UsableItem^2 with ^4"..QBExport.."^7:", item)
Core.Functions.CreateUseableItem(item, funct)
elseif isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^2Registering ^3UsableItem^2 with ^4"..ESXExport.."^7:", item)
while not ESX do Wait(0) end
ESX.RegisterUsableItem(item, funct)
end
debugPrint("^4ERROR^7: No supported framework detected for registering usable item: ^3"..item.."^7") debugPrint("^4ERROR^7: No supported framework detected for registering usable item: ^3"..item.."^7")
else else
print("^1ERROR^7: ^1Tried to make item usable but it didn't exist^7: "..item) print("^1ERROR^7: ^1Tried to make item usable but it didn't exist^7: "..item)
@@ -1448,7 +1514,7 @@ end
--- addItem("health_potion", 2, { quality = "high" }) --- addItem("health_potion", 2, { quality = "high" })
--- ``` --- ```
function addItem(item, amount, info, src) function addItem(item, amount, info, src)
if not Items[item] then if not doesItemExist(item) then
print("^6Bridge^7: ^1Error^7 - ^2Tried to give ^7'^3"..item.."^7'^2 but it doesn't exist") print("^6Bridge^7: ^1Error^7 - ^2Tried to give ^7'^3"..item.."^7'^2 but it doesn't exist")
return return
end end
@@ -1477,7 +1543,7 @@ end
--- removeItem("health_potion", 1) --- removeItem("health_potion", 1)
--- ``` --- ```
function removeItem(item, amount, src, slot) function removeItem(item, amount, src, slot)
if not Items[item] then if not doesItemExist(item) then
print("^6Bridge^7: ^1Error^7 - ^2Tried to remove ^7'^3"..item.."^7'^2 but it doesn't exist") print("^6Bridge^7: ^1Error^7 - ^2Tried to remove ^7'^3"..item.."^7'^2 but it doesn't exist")
return return
end end
@@ -1513,14 +1579,21 @@ end
RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount, newsrc, info, slot, token) RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount, newsrc, info, slot, token)
local excludeRes = {
[QBExport] = true,
[ESXExport] = true,
[VorpExport] = true,
}
local invokingRes = GetInvokingResource()
--debugPrint(GetInvokingResource()) --debugPrint(GetInvokingResource())
if GetInvokingResource() and GetInvokingResource() ~= getScript() and GetInvokingResource() ~= "qb-core" then if invokingRes and invokingRes ~= getScript() and not excludeRes[invokingRes] then
debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital function was called from an external resource^7") debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital function was called from an external resource^7")
return return
end end
if not Items[item] then if not doesItemExist(item) then
print("^6Bridge^7: ^1Error^7 - ^2Tried to "..(tostring(give) == "true" and "add" or "remove").." '^3"..item.."^7' but it doesn't exist") print("^1Error^7 - ^2Tried to "..(tostring(give) == "true" and "add" or "remove").." '^3"..item.."^7' but it doesn't exist")
return return
end end
@@ -1725,9 +1798,22 @@ RegisterNetEvent(getScript()..":server:setItemMetaData", function(data, src)
local inv = InvFunc[i] local inv = InvFunc[i]
if isStarted(inv.invName) then if isStarted(inv.invName) then
inv.setItemMetadata(data, src) inv.setItemMetadata(data, src)
break return
end end
end end
-- Fallback functions
if isStarted(QBExport) or isStarted(QBXExport) then -- if qbcore or qbxcore, just use core functions
local Player = Core.Functions.GetPlayer(src)
Player.PlayerData.items[data.slot].info = data.metadata
if data.metadata.durability then
Player.PlayerData.items[data.slot].description = "HP : "..data.metadata.durability
end
Player.Functions.SetInventory(Player.PlayerData.items)
elseif ESX and isStarted(ESXExport) then -- if esx then use core functions
--?
end
end) end)
------------------------------------------------------------- -------------------------------------------------------------
@@ -1804,6 +1890,22 @@ function canCarry(itemTable, src)
return inv.canCarry(itemTable, src) return inv.canCarry(itemTable, src)
end end
end end
-- Fallback to default canCarry function
local items = getPlayerInv(src)
local totalWeight = 0
if not items then return false end
for _, item in pairs(items) do
totalWeight += (item.weight * item.amount)
end
for k, v in pairs(itemTable) do
local itemInfo = Items[k]
if not itemInfo then
resultTable[k] = true
else
resultTable[k] = (totalWeight + (itemInfo.weight * v)) <= InventoryWeight
end
end
return resultTable return resultTable
end end
@@ -1855,6 +1957,11 @@ function getMaxInvWeight()
break break
end end
end end
-- Fallback function
if weight == 0 then
weight = InventoryWeight
end
return weight return weight
end end
@@ -1877,6 +1984,19 @@ function getCurrentInvWeight(src)
end end
end end
-- fallback function
if weight == 0 then
local itemcheck = getPlayerInv(src)
if isStarted(ESXExport) then
for _, amount in pairs(itemcheck) do
weight += (amount or 0)
end
else
for _, v in pairs(itemcheck) do
weight += ((v.weight * (v.amount or v.count)) or 0)
end
end
end
return weight return weight
end end
@@ -2185,7 +2305,6 @@ end
--- local items = getStash("playerStash") --- local items = getStash("playerStash")
--- ``` --- ```
function getStash(stashName) function getStash(stashName)
local stashResource = ""
if stashName == "" or type(stashName) ~= "string" then if stashName == "" or type(stashName) ~= "string" then
print("^6Bridge^7: ^2Stash name was not a string ^3"..stashName.."^7(^3"..type(stashName).."^7)") print("^6Bridge^7: ^2Stash name was not a string ^3"..stashName.."^7(^3"..type(stashName).."^7)")
return {} return {}
@@ -2201,6 +2320,19 @@ function getStash(stashName)
end end
end end
-- Fallback to sql checks if no supported inventory found
if not stashItems or not next(stashItems) then
if isStarted(QBExport) or isStarted(QBXExport) then
local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', { stashName })
if result then
stashItems = json.decode(result)
end
elseif ESX and isStarted(ESXExport) then -- if esx then use core functions
--?
end
end
if stashItems then if stashItems then
for _, item in pairs(stashItems) do for _, item in pairs(stashItems) do
local itemInfo = Items[item.name:lower()] local itemInfo = Items[item.name:lower()]
@@ -2224,7 +2356,7 @@ function getStash(stashName)
end end
debugPrint("^6Bridge^7: ^3GetStashItems^7: ^2Stash information for '^6"..stashName.."^7' retrieved") debugPrint("^6Bridge^7: ^3GetStashItems^7: ^2Stash information for '^6"..stashName.."^7' retrieved")
end end
jsonPrint(items) --jsonPrint(items)
return items return items
end end
@@ -2261,10 +2393,37 @@ function stashRemoveItem(stashItems, stashName, items)
end end
end end
-- Fallback to core functions
if isStarted(QBExport) then
local stashItems = getStash(stashName[1])
for k, v in pairs(items) do
for l in pairs(stashItems) do
if stashItems[l].name == k then
if (stashItems[l].amount - v) <= 0 then
stashItems[l] = nil
else
debugPrint("^6Bridge^7: ^2Removing ^3"..PSInv.." ^2Stash item^7:", k, v)
stashItems[l].amount -= v
end
end
end
end
debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QBCORE^2 stash ^7'^6"..stashName[1].."^7'")
MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashName[1],
['items'] = json.encode(stashItems)
})
elseif isStarted(ESXExport) then
--?
end
print("^4ERROR^7: ^2No supported Inventory detected ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No supported Inventory detected ^7- ^2Check ^3starter^1.^2lua^7")
end end
RegisterNetEvent(getScript()..":server:stashRemoveItem", stashRemoveItem) RegisterNetEvent(getScript()..":server:stashRemoveItem", stashRemoveItem)
function stashAddItem(stashItems, stashName, items)
-- wip
end
------------------------------------------------------------- -------------------------------------------------------------
-- Stash Item Availability Check -- Stash Item Availability Check
------------------------------------------------------------- -------------------------------------------------------------
@@ -2394,7 +2553,7 @@ RegisterNetEvent(getScript()..":openGrabBox", function(data)
local id = data.metadata and data.metadata.id or data.info and data.info.id or "" local id = data.metadata and data.metadata.id or data.info and data.info.id or ""
if isStarted(OXInv) then if isStarted(OXInv) then
-- this SHOLD be handled within ox_inventory if set up right
return return
end end
@@ -2646,10 +2805,17 @@ function openShop(data)
if isStarted(inv.invName) then if isStarted(inv.invName) then
inv.openShop(data.shop, data.items.label, data.items) inv.openShop(data.shop, data.items.label, data.items)
lookEnt(data.coords) lookEnt(data.coords)
break return
end end
end end
if isStarted(QBExport) then
TriggerServerEvent(getScript()..':server:openServerShop', data.shop)
TriggerServerEvent("inventory:server:OpenInventory", "shop", data.items.label, data.items)
elseif isStarted(ESXExport) then
--?
end
end end
RegisterNetEvent(getScript()..':server:openServerShop', function(shopName) RegisterNetEvent(getScript()..':server:openServerShop', function(shopName)