Compare commits

..

25 Commits

Author SHA1 Message Date
Jim Shield
4d04682b33 Version Bump
`2.0.11` - `2.0.12`
2025-05-18 22:34:08 +01:00
Jim Shield
cb38d275d1 People were asking how to remove a print
I kept getting people asking how to remove prints because it "was filling up their f8 menu and looked like errors"

So I've made the "success" coreloader prints to be debugmode only.
2025-05-18 16:32:29 +01:00
Jim Shield
84cfe1c97d Fix stash stash opening for some inventories
Mainly older inventories may have had issues with custom stash sizes when opening them

This should fix compatibility with changing slots and max weight with them on trigger
2025-05-18 16:31:30 +01:00
Jim Shield
47b01df621 Remove coords from openGrabBox 2025-05-17 20:38:21 +01:00
Jim Shield
7e073b16ec Update starter.lua 2025-05-17 20:23:32 +01:00
Jim Shield
ab4298fa2d Change coreloader prints to a debugPrint 2025-05-17 19:19:15 +01:00
Jim Shield
7997ea45b7 change "Shared Load Detected" to a debugPrint 2025-05-17 19:16:24 +01:00
Jim Shield
7aa9d90d0d Improve ESX Job cache builder
When collecting Jobs from the server it tries it's best to determine which role is the "Boss"

It checks first of the Job Grade label containing the word "Boss"

If it can't find it, it then uses the highest number grade and adds `.isBoss = true` to it
2025-05-17 16:48:23 +01:00
Jim Shield
520758b355 Version Bump
`2.0.10` - `2.0.11`
2025-05-15 20:20:47 +01:00
Jim Shield
e4e9ef0fb2 add openGrabBox event for items like murderbag 2025-05-15 20:02:39 +01:00
Jim Shield
ada724069b Revert qs-inv server inv grab
Found the real issue that was causing the scripts to not think you had items, basically reverting this change as i didn't like having it in the first place
2025-05-15 19:59:51 +01:00
Jim Shield
9198068a19 Adjust hasItem function for QS-Inv
Apparently qs-inv reports two variables on the item data for how you have
`count` and `amount`
while other inventories appear to only have one of those

I'm assuming for compatibility sake

Apparently the `count` is updated differently, and `hasItem()` was checking for this first

I've swapped round the checks and appears to work better
2025-05-15 19:55:14 +01:00
Jim Shield
263d5160aa Add delay for checking for inventory items on qb
Custom inventories apparently load items separately/later into qbshared

so the script starts thinking there is definitely 0 items but its checking too early, this forces it to wait until its available to continue
2025-05-15 15:31:41 +01:00
Jim Shield
65137207ae add fallback for hasItem if no inventory is found 2025-05-14 23:38:34 +01:00
Jim Shield
3bd9935346 Skip item for sellmenu if item isn't in shared
Adds an item check before creating the sellmenu as to avoid errors
2025-05-14 23:36:46 +01:00
Jim Shield
23e2488cd1 fix typo for qs-inv callback for inventory 2025-05-14 16:09:02 +01:00
Jim Shield
e9bbdd4ce0 Version Bump
`2.0.09` - `2.0.10`
2025-05-13 22:02:37 +01:00
Jim Shield
f5a7ec9291 fix inventory exploit trigger blocking crafting
The inventory exploit check when crafting never released crafting so you couldn't craft again until reconnecting or script restart
2025-05-13 21:57:19 +01:00
Jim Shield
d80ea38a39 Fix sell menu throwing errors on openning
It was checking the wrong table name for amounts and getting `nil`
2025-05-13 21:56:18 +01:00
Jim Shield
e64912622b Testing a fix with QS-INV item checks
So..from what I can gather, QS-Inv doesn't seem to be updating the client cache of the players inventory correctly

This is all speculation, I can't check this myself

When `hasItem()` is used, its essentially reading from the client's cache.
This seemingly is only updated when there is a new item in a slot, **not** when the amount of an item in that slot changes

The only way to circumvent this is a workaround to the players inventory from the server side using a callback. This is painful to do because it can increase server load when checking multiples of items
2025-05-13 17:57:27 +01:00
Jim Shield
04b25e2c06 create waitForSharedLoad() function
This my attempt to aid ESX loading, essentially my scripts server side now need to be locked behind `onResourceStart()` because of ESX

Loading ESX into my scripts was delaying half of it and breaking the other half

This function forcibly waits until everythings loaded and then continues

This shouldn't affect other frameworks loading ability

My tests so far have been a success with it
2025-05-12 22:59:31 +01:00
Jim Shield
51473bf0b8 Version Bump
`2.0.08` - `2.0.09`
2025-05-12 13:52:14 +01:00
Jim Shield
921b973f81 Try and fix ESX loading
So information and request for help.

The issue here is that my scripts require Job and Vehicle information when the script starts, to do a debug check if the job exists for the location.

ESX doesn't share this with the client for some reason, so this requires me to request it from the server side at script ensure.

This is causing issues because it delays loading of the rest of `jim_bridge` while it slowly requests `ESX.GetJobs()` table from server side

This is delayed even more when the script is placed towards the top of the server load order and it needs to load other things like MLO's

As its trying to load this the rest of the script carries on loading with missing information.

So it loads the script thinking there are 0 jobs and breaks it.

If anyone knows of a better way of doing this then please help.
The only partial solution is to start my scripts last in the server load order
2025-05-12 13:51:32 +01:00
Jim Shield
42d08ccf4c Tidy up the stashRemoveItem function 2025-05-12 13:44:37 +01:00
Jim Shield
68412d8006 Enforce numbers when changing stats
if the value ends up being `nil` this *should* force it to 0

Also added a check for if it can actually give `randomReward` before trying to
2025-05-11 14:16:02 +01:00
13 changed files with 178 additions and 94 deletions

View File

@@ -1,6 +1,6 @@
name "Jim_Bridge" name "Jim_Bridge"
author "Jimathy" author "Jimathy"
version "2.0.08" version "2.0.12"
description "Framework Bridge By Jimathy" description "Framework Bridge By Jimathy"
fx_version "cerulean" fx_version "cerulean"
rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.' rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.'

View File

@@ -50,7 +50,13 @@ function onPlayerLoaded(func, onStart)
AddEventHandler('QBCore:Client:OnPlayerLoaded', tempFunc) AddEventHandler('QBCore:Client:OnPlayerLoaded', tempFunc)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
onPlayerFramework = ESXExport onPlayerFramework = ESXExport
AddEventHandler('esx:playerLoaded', tempFunc) AddEventHandler('esx:playerLoaded', function()
if waitForSharedLoad() then
if isStarted(ESXExport) then Wait(11000) end
tempFunc()
end
end
)
elseif isStarted(OXCoreExport) then elseif isStarted(OXCoreExport) then
onPlayerFramework = OXCoreExport onPlayerFramework = OXCoreExport
AddEventHandler('ox:playerLoaded', tempFunc) AddEventHandler('ox:playerLoaded', tempFunc)
@@ -103,8 +109,12 @@ function onResourceStart(func, thisScript)
debugPrint("^6Bridge^7: ^2Registering ^3onResourceStart^7()") debugPrint("^6Bridge^7: ^2Registering ^3onResourceStart^7()")
AddEventHandler('onResourceStart', function(resourceName) AddEventHandler('onResourceStart', function(resourceName)
if getScript() == resourceName and (thisScript or true) then if getScript() == resourceName and (thisScript or true) then
if waitForSharedLoad() then
debugPrint("^6Bridge^7: ^2Shared Load Detected^7.")
if isStarted(ESXExport) then Wait(10000) end
func() func()
end end
end
end) end)
end end
@@ -175,3 +185,25 @@ function waitForLogin()
return true return true
end end
end end
function waitForSharedLoad()
local timeout = 100000 -- 10 seconds in milliseconds
local startTime = GetGameTimer()
local loaded = true
while ((not Jobs or not next(Jobs)) and (not Items or not next(Items)) and (not Vehicles or not next(Vehicles))) and (GetGameTimer() - startTime) < timeout do
print((GetGameTimer() - startTime) < timeout)
Wait(1000)
debugPrint("Waiting for Jobs, Items, and Vehicles to be loaded")
if Jobs and Items and Vehicles then
print("^6Bridge^7: ^2Jobs, Items, and Vehicles Loaded^7.")
loaded = true
break
end
end
if not loaded then
print("^4Error^7: ^2Timeout reached while waiting for shared load^7.")
return false
else
return true
end
end

View File

@@ -87,6 +87,12 @@ elseif isStarted(QBExport) then
itemResource = QBExport itemResource = QBExport
Core = Core or exports[QBExport]:GetCoreObject() Core = Core or exports[QBExport]:GetCoreObject()
Items = Core and Core.Shared.Items or nil Items = Core and Core.Shared.Items or nil
CreateThread(function()
while not Items or not next(Items) do
Items = exports[QBExport]:GetCoreObject().Shared.Items
Wait(1000)
end
end)
if isStarted(QBExport) and not isStarted(QBXExport) then if isStarted(QBExport) and not isStarted(QBXExport) then
RegisterNetEvent('QBCore:Client:UpdateObject', function() RegisterNetEvent('QBCore:Client:UpdateObject', function()
Core = Core or exports[QBExport]:GetCoreObject() Core = Core or exports[QBExport]:GetCoreObject()
@@ -189,10 +195,8 @@ end
if vehResource == nil then if vehResource == nil then
print("^4ERROR^7: ^2No Vehicle info detected ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No Vehicle info detected ^7- ^2Check ^3starter^1.^2lua^7")
else else
CreateThread(function()
while not Vehicles do Wait(1000) end while not Vehicles do Wait(1000) end
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..vehResource) debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..vehResource)
end)
end end
------------------------------------------------------------- -------------------------------------------------------------
@@ -240,24 +244,52 @@ elseif isStarted(QBExport) then
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
jobResource = ESXExport jobResource = ESXExport
if isServer() then if isServer() then
Jobs = ESX.GetJobs() -- If server, create callback to get jobs
for k, v in pairs(Jobs) do createCallback(getScript()..":getESXJobs", function(source)
local count = countTable(Jobs[k].grades) - 1
Jobs[k].grades[tostring(count)].isBoss = true
end
Gangs = Jobs
end
CreateThread(function()
if isServer() then
createCallback(getScript()..":getJobs", function(source)
return Jobs return Jobs
end) end)
-- Populate jobs table with ESX.GetJobs()
Jobs = ESX.GetJobs()
--jsonPrint(Jobs)
--If retreived jobs is empty, wait for ESX to load
while countTable(Jobs) == 0 do
Jobs = ESX.GetJobs()
Wait(100)
end end
if not isServer() then -- Organise into a table the script can use
Jobs = triggerCallback(getScript()..":getJobs") for Role, Grades in pairs(Jobs) do
-- Check for "Boss" in name of grades
for grade, info in pairs(Grades.grades) do
--print(grade)
--jsonPrint(info)
if info.label then
--print(info)
if info.label:find("boss") or info.label:find("Boss") then
--print("Found Boss label for:", Grades.label)
Jobs[Role].grades[grade].isBoss = true
goto continue
end
end
end
-- If no roles with "boss" in the name, revert to max grade
-- Count grades
local count = countTable(Grades.grades)
Jobs[Role].grades[tostring(count-1)].isBoss = true
--print(Grades.label.." Grade: "..count.." is Boss")
::continue::
end
-- ESX Default doesn't have gangs, so copy jobs to gangs
Gangs = Jobs
end
-- If client side, trigger callback to get jobs
if not isServer() then
Jobs = triggerCallback(getScript()..":getESXJobs")
Gangs = Jobs Gangs = Jobs
end end
end)
elseif isStarted(RSGExport) then elseif isStarted(RSGExport) then
jobResource = RSGExport jobResource = RSGExport
@@ -272,7 +304,7 @@ end
if jobResource == nil then if jobResource == nil then
print("^4ERROR^7: ^2No Vehicle info detected ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No Vehicle info detected ^7- ^2Check ^3starter^1.^2lua^7")
else else
while not Jobs do Wait(100) end while not Jobs do Wait(1000) end
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Jobs).." ^3Jobs^2 from ^7"..jobResource) debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Jobs).." ^3Jobs^2 from ^7"..jobResource)
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Gangs).." ^3Gangs^2 from ^7"..jobResource) debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Gangs).." ^3Gangs^2 from ^7"..jobResource)
end end

View File

@@ -353,8 +353,8 @@ function makeItem(data)
Wait(200) Wait(200)
end end
if isInventoryOpen() then if isInventoryOpen() then
print("^1Error^7: ^2Inventory is open, you tried to break things") --print("^1Error^7: ^2Inventory is open, you tried to break things")
crafted, crafting = false, false crafted, crafting, CraftLock = false, false, false
return return
end end
if crafted then if crafted then
@@ -368,8 +368,9 @@ function makeItem(data)
PlaySoundFromEntity(s.soundId, s.audioName, PlayerPedId(), s.audioRef, true, 0) PlaySoundFromEntity(s.soundId, s.audioName, PlayerPedId(), s.audioRef, true, 0)
end end
if isInventoryOpen() then if isInventoryOpen() then
print("^1Error^7: ^2Inventory is open, you tried to break things") --print("^1Error^7: ^2Inventory is open, you tried to break things")
crafted, crafting = false, false crafted, crafting = false, false
crafted, crafting, CraftLock = false, false, false
return return
end end
if crafting and progressBar({ if crafting and progressBar({
@@ -462,7 +463,9 @@ RegisterNetEvent(getScript()..":Crafting:GetItem", function(ItemMake, craftable,
stashItems = getStash(name) stashItems = getStash(name)
for k, v in pairs(craftable[ItemMake] or {}) do for k, v in pairs(craftable[ItemMake] or {}) do
for _, b in pairs(stashItems or {}) do for _, b in pairs(stashItems or {}) do
if k == b.name then itemRemove[k] = v end if k == b.name then
itemRemove[k] = v
end
end end
end end
end end
@@ -470,7 +473,9 @@ RegisterNetEvent(getScript()..":Crafting:GetItem", function(ItemMake, craftable,
stashItems = getStash(stashName) stashItems = getStash(stashName)
for k, v in pairs(craftable[ItemMake] or {}) do for k, v in pairs(craftable[ItemMake] or {}) do
for _, b in pairs(stashItems or {}) do for _, b in pairs(stashItems or {}) do
if k == b.name then itemRemove[k] = v end if k == b.name then
itemRemove[k] = v
end
end end
end end
end end

View File

@@ -262,7 +262,7 @@ end
--- ``` --- ```
function countTable(tbl) function countTable(tbl)
local i = 0 local i = 0
for _ in pairs(tbl) do i = i + 1 end for _ in pairs(tbl) do i += 1 end
return i return i
end end

View File

@@ -50,8 +50,9 @@ function hasItem(items, amount, src)
local count = 0 local count = 0
for _, itemData in pairs(grabInv) do for _, itemData in pairs(grabInv) do
jsonPrint(itemData)
if itemData and itemData.name == item then if itemData and itemData.name == item then
count += (itemData.count or itemData.amount or 1) count += (itemData.amount or itemData.count or 1)
end end
end end
foundInv = foundInv:gsub("%-", "^7-^6"):gsub("%_", "^7_^6") foundInv = foundInv:gsub("%-", "^7-^6"):gsub("%_", "^7_^6")
@@ -67,6 +68,9 @@ function hasItem(items, amount, src)
end end
return true, hasTable return true, hasTable
end end
-- if can't find inventory, return false
print("^1Error^7: ^1Can't find players inventory for some reason")
return false, {}
end end
--- Retrieves a player's inventory based on the active inventory system. --- Retrieves a player's inventory based on the active inventory system.
@@ -171,7 +175,6 @@ function getPlayerInv(src)
return grabInv, foundInv return grabInv, foundInv
end end
function isInventoryOpen() function isInventoryOpen()
if isStarted(OXInv) then if isStarted(OXInv) then
return LocalPlayer.state.invBusy return LocalPlayer.state.invBusy

View File

@@ -252,6 +252,7 @@ RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount,
else else
local amountToAdd = amount or 1 local amountToAdd = amount or 1
if isStarted(OXInv) then invName = OXInv if isStarted(OXInv) then invName = OXInv
jsonPrint(info)
exports[OXInv]:AddItem(src, item, amountToAdd, info, slot) exports[OXInv]:AddItem(src, item, amountToAdd, info, slot)
elseif isStarted(QSInv) then invName = QSInv elseif isStarted(QSInv) then invName = QSInv

View File

@@ -46,7 +46,7 @@ function makeBossRoles(role)
local data = (Jobs and Jobs[role]) or (Gangs and Gangs[role]) local data = (Jobs and Jobs[role]) or (Gangs and Gangs[role])
if data then if data then
for grade, info in pairs(data.grades) do for grade, info in pairs(data.grades) do
if info.isboss or info.bankAuth then if info.isboss or info.bankAuth or info.isBoss then
boss[role] = boss[role] and math.min(boss[role], tonumber(grade)) or tonumber(grade) boss[role] = boss[role] and math.min(boss[role], tonumber(grade)) or tonumber(grade)
end end
end end

View File

@@ -301,17 +301,17 @@ function ConsumeSuccess(itemName, type, data)
if isStarted(ESXExport) then if isStarted(ESXExport) then
if hunger then if hunger then
TriggerServerEvent(getScript()..":server:setNeed", "hunger", hunger * 10000) TriggerServerEvent(getScript()..":server:setNeed", "hunger", tonumber(hunger) * 10000)
end end
if thirst then if thirst then
TriggerServerEvent(getScript()..":server:setNeed", "thirst", thirst * 10000) TriggerServerEvent(getScript()..":server:setNeed", "thirst", tonumber(thirst) * 10000)
end end
else else
if hunger then if hunger then
TriggerServerEvent(getScript()..":server:setNeed", "hunger", Core.Functions.GetPlayerData().metadata["hunger"] + hunger) TriggerServerEvent(getScript()..":server:setNeed", "hunger", Core.Functions.GetPlayerData().metadata["hunger"] + tonumber(hunger))
end end
if thirst then if thirst then
TriggerServerEvent(getScript()..":server:setNeed", "thirst", Core.Functions.GetPlayerData().metadata["thirst"] + thirst) TriggerServerEvent(getScript()..":server:setNeed", "thirst", Core.Functions.GetPlayerData().metadata["thirst"] + tonumber(thirst))
end end
end end
@@ -325,7 +325,9 @@ function ConsumeSuccess(itemName, type, data)
end end
end end
if Config.Reward then
getRandomReward(itemName) getRandomReward(itemName)
end
end end
------------------------------------------------------------- -------------------------------------------------------------

View File

@@ -30,6 +30,7 @@ function sellMenu(data)
for k, v in pairs(data.sellTable.Items) do itemList[k] = 1 end for k, v in pairs(data.sellTable.Items) do itemList[k] = 1 end
local _, hasTable = hasItem(itemList) local _, hasTable = hasItem(itemList)
for k, v in pairsByKeys(data.sellTable.Items) do for k, v in pairsByKeys(data.sellTable.Items) do
if Items[k] then
Menu[#Menu + 1] = { Menu[#Menu + 1] = {
isMenuHeader = not hasTable[k].hasItem, isMenuHeader = not hasTable[k].hasItem,
icon = invImg(k), icon = invImg(k),
@@ -40,6 +41,7 @@ function sellMenu(data)
end, end,
} }
end end
end
else else
for k, v in pairsByKeys(data.sellTable) do for k, v in pairsByKeys(data.sellTable) do
if type(v) == "table" then if type(v) == "table" then
@@ -48,7 +50,9 @@ function sellMenu(data)
header = k, header = k,
txt = "Amount of items: "..countTable(v.Items), txt = "Amount of items: "..countTable(v.Items),
onSelect = function() onSelect = function()
v.onBack = function() sellMenu(origData) end v.onBack = function()
sellMenu(origData)
end
v.sellTable = data.sellTable[k] v.sellTable = data.sellTable[k]
sellMenu(v) sellMenu(v)
end, end,
@@ -57,8 +61,8 @@ function sellMenu(data)
end end
end end
openMenu(Menu, { openMenu(Menu, {
header = data.sellTable.Header or "Amount of items: "..countTable(data.sellTable.Items), header = data.sellTable.Header or "Amount of items: "..countTable(data.sellTable.Items or data.sellTable),
headertxt = data.sellTable.Header and "Amount of items: "..countTable(data.sellTable.Items) or "", headertxt = data.sellTable.Header and "Amount of items: "..countTable(data.sellTable.Items or data.sellTable),
canClose = true, canClose = true,
onBack = data.onBack, onBack = data.onBack,
}) })
@@ -105,12 +109,14 @@ function sellAnim(data)
TriggerServerEvent(getScript().."Sellitems", data) TriggerServerEvent(getScript().."Sellitems", data)
lookEnt(data.ped) lookEnt(data.ped)
local dict = "mp_common" local dict = "mp_common"
playAnim(dict, "givetake2_a", 0.3, 2) playAnim(dict, "givetake2_a", 0.3, 48)
playAnim(dict, "givetake2_b", 0.3, 2, data.ped) playAnim(dict, "givetake2_b", 0.3, 48, data.ped)
Wait(2000) Wait(2000)
StopAnimTask(PlayerPedId(), dict, "givetake2_a", 0.5) StopAnimTask(PlayerPedId(), dict, "givetake2_a", 0.5)
StopAnimTask(data.ped, dict, "givetake2_b", 0.5) StopAnimTask(data.ped, dict, "givetake2_b", 0.5)
if data.onBack then data.onBack() end if data.onBack then
data.onBack()
end
end end
--- Server event handler for processing item sales. --- Server event handler for processing item sales.

View File

@@ -161,7 +161,10 @@ function openStash(data)
}) })
else else
TriggerEvent("inventory:client:SetCurrentStash", data.stash) TriggerEvent("inventory:client:SetCurrentStash", data.stash)
TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash, data.stashOptions) TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash, {
slots = data.slots or 50,
maxWeight = data.maxWeight or 600000
})
end end
elseif isStarted(PSInv) then elseif isStarted(PSInv) then
@@ -174,7 +177,10 @@ function openStash(data)
}) })
else else
TriggerEvent("inventory:client:SetCurrentStash", data.stash) TriggerEvent("inventory:client:SetCurrentStash", data.stash)
TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash, data.stashOptions) TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash, {
slots = data.slots or 50,
maxWeight = data.maxWeight or 600000
})
end end
elseif isStarted(RSGInv) then elseif isStarted(RSGInv) then
@@ -188,7 +194,10 @@ function openStash(data)
else else
--Fallback to these commands --Fallback to these commands
TriggerEvent("inventory:client:SetCurrentStash", data.stash) TriggerEvent("inventory:client:SetCurrentStash", data.stash)
TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash, data.stashOptions) TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash, {
slots = data.slots or 50,
maxWeight = data.maxWeight or 600000
})
end end
lookEnt(data.coords) lookEnt(data.coords)
@@ -332,9 +341,9 @@ function stashRemoveItem(stashItems, stashName, items)
if type(stashName) ~= "table" then if type(stashName) ~= "table" then
stashName = { stashName } stashName = { stashName }
end end
if isStarted(OXInv) then if isStarted(OXInv) then
for k, v in pairs(items) do for k, v in pairs(items) do
if type(stashName) == "table" then
for _, name in pairs(stashName) do for _, name in pairs(stashName) do
local success = exports[OXInv]:RemoveItem(name, k, v) local success = exports[OXInv]:RemoveItem(name, k, v)
if success then if success then
@@ -342,24 +351,12 @@ function stashRemoveItem(stashItems, stashName, items)
break break
end end
end end
else
exports[OXInv]:RemoveItem(stashName, k, v)
end
end end
elseif isStarted(QSInv) then elseif isStarted(QSInv) then
for k, v in pairs(items) do for k, v in pairs(items) do
for l in pairs(stashItems) do exports[QSInv]:RemoveItemIntoStash(stashName[1], k, v)
if stashItems[l].name == k then
if (stashItems[l].amount - v) <= 0 then
debugPrint("^6Bridge^7: ^2None of this item left in stash ^3Stash^7", k, v)
stashItems[l] = nil
else
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QSInv, k, v) debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QSInv, k, v)
exports[QSInv]:RemoveItemIntoStash(stashName[1], k, v, l)
end
end
end
end end
elseif isStarted(CoreInv) then elseif isStarted(CoreInv) then
@@ -393,7 +390,7 @@ function stashRemoveItem(stashItems, stashName, items)
elseif isStarted(TgiannInv) then elseif isStarted(TgiannInv) then
for k, v in pairs(items) do for k, v in pairs(items) do
local itemData = exports["tgiann-inventory"]:GetItemByNameFromSecondaryInventory("stash", stashName[1], k) local itemData = exports[TgiannInv]:GetItemByNameFromSecondaryInventory("stash", stashName[1], k)
exports[TgiannInv]:RemoveItemFromSecondaryInventory("stash", stashName[1], k, v, itemData.slot, nil) exports[TgiannInv]:RemoveItemFromSecondaryInventory("stash", stashName[1], k, v, itemData.slot, nil)
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..TgiannInv, k, v) debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..TgiannInv, k, v)
end end
@@ -404,11 +401,6 @@ function stashRemoveItem(stashItems, stashName, items)
exports[QBInv]:RemoveItem(stashName[1], k, v, false, 'crafting') exports[QBInv]:RemoveItem(stashName[1], k, v, false, 'crafting')
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QBInv, k, v) debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QBInv, k, v)
end end
debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName[1].."^7'")
MySQL.Async.insert('INSERT INTO inventories (identifier, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashName[1],
['items'] = json.encode(stashItems)
})
else else
for k, v in pairs(items) do for k, v in pairs(items) do
for l in pairs(stashItems) do for l in pairs(stashItems) do
@@ -423,14 +415,13 @@ function stashRemoveItem(stashItems, stashName, items)
end end
end end
end end
debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash '^6"..stashName.."^7'") debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash '^6"..stashName[1].."^7'")
MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', { MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashName, ['stash'] = stashName[1],
['items'] = json.encode(stashItems) ['items'] = json.encode(stashItems)
}) })
end end
elseif isStarted(PSInv) then elseif isStarted(PSInv) then
for k, v in pairs(items) do for k, v in pairs(items) do
for l in pairs(stashItems) do for l in pairs(stashItems) do
@@ -445,9 +436,9 @@ function stashRemoveItem(stashItems, stashName, items)
end end
end end
end end
debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName.."^7'") debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3PS^2 stash ^7'^6"..stashName[1].."^7'")
MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', { MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashName, ['stash'] = stashName[1],
['items'] = json.encode(stashItems) ['items'] = json.encode(stashItems)
}) })
@@ -456,11 +447,6 @@ function stashRemoveItem(stashItems, stashName, items)
exports[RSGInv]:RemoveItem(stashName[1], k, v, false, 'crafting') exports[RSGInv]:RemoveItem(stashName[1], k, v, false, 'crafting')
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..RSGInv, k, v) debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..RSGInv, k, v)
end end
debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName[1].."^7'")
MySQL.Async.insert('INSERT INTO inventories (identifier, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashName[1],
['items'] = json.encode(stashItems)
})
else else
print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No Inventory detected ^7- ^2Check ^3starter^1.^2lua^7")
end end
@@ -588,3 +574,18 @@ if isServer() then
registerStash(name, label, slots, weight, owner, coords) registerStash(name, label, slots, weight, owner, coords)
end) end)
end end
RegisterNetEvent(getScript()..":openGrabBox", function(data)
if isStarted(OXInv) then
return
end
local id = ""
if data.metadata then
id = data.metadata.id
elseif data.info then
id = data.info.id
end
openStash({
stash = id,
})
end)

View File

@@ -86,12 +86,14 @@ for Type, ScriptTable in pairs(filesToLoad) do
files = { files } files = { files }
end end
for _, file in pairs(files) do for _, file in pairs(files) do
--print("^5CoreLoader^7: '"..k.."/"..file.."' ^2into ^7'"..GetCurrentResourceName().."' ...") --print("^5CoreLoader^7: '"..scriptName.."/"..file.."' ^2into ^7'"..GetCurrentResourceName().."' ...")
local fileLoader = assert(load(LoadResourceFile(scriptName, (file)), ('@@'..scriptName..'/'..file))) local fileLoader = assert(load(LoadResourceFile(scriptName, (file)), ('@@'..scriptName..'/'..file)))
fileLoader() fileLoader()
if debugMode then
print("^5CoreLoader^7: ^2loaded ^1Core ^2file^7: ^3"..scriptName.."^7/^3"..(file):gsub("/", "^7/^3"):gsub("%.lua", "^7.lua").." ^2into ^7'"..GetCurrentResourceName().."'") print("^5CoreLoader^7: ^2loaded ^1Core ^2file^7: ^3"..scriptName.."^7/^3"..(file):gsub("/", "^7/^3"):gsub("%.lua", "^7.lua").." ^2into ^7'"..GetCurrentResourceName().."'")
end end
end end
end
-- if script is in server, but not started warn the user -- if script is in server, but not started warn the user
if state == "uninitialized" or state == "stopped" then if state == "uninitialized" or state == "stopped" then
@@ -118,7 +120,7 @@ for _, v in pairs({ -- This is a specific load order
'_eventDebug.lua', '_eventDebug.lua',
'callback.lua', 'callback.lua',
'coreloader.lua', -- needs to be second to load all core related stuff before everything else 'coreloader.lua',
'duifunctions.lua', 'duifunctions.lua',

View File

@@ -1 +1 @@
2.0.08 2.0.12