Compare commits

...

25 Commits

Author SHA1 Message Date
Jim Shield
f9b97b7505 Version bump 2.0.05 2025-05-04 16:24:55 +01:00
Jim Shield
489da64c5e add a new warning for token auth 2025-05-04 15:40:20 +01:00
Jim Shield
07c35cd917 workaround for ox_inventory returning a bool
I think, if ox_inventory checks a stash that doesn't exist yet, it returns a boolean or `nil`

This checks for that and instead returns a table to hopefully stop the scripts from breaking
2025-05-04 15:21:02 +01:00
Jim Shield
3f72a21d75 Update bigMessageInstance.lua 2025-05-03 20:28:13 +01:00
Jim Shield
4ad6170a49 Fix ox_target items variable
Completely overlooked that ox_target item variable is `items` not `item`

changes
```lua
                item = opts[i].item or nil,
```
to:
```lua
                items = opts[i].item or nil,
```
2025-05-03 00:11:28 +01:00
Jim Shield
18df0817b1 Make version checks a bit more obvious
Adds more obvious prints if the current version is outdated

(and also repeats it every 20 minutes)
2025-05-02 22:22:47 +01:00
Jim Shield
0eca7ae29e Fix CodeM item slot check for metadata function
The slot data for CodeM apparently returns as a string, this fixes it trying to compare a string to a number

```lua
            if v.name == item and v.slot <= lowestSlot then
```
to
```lua
            if v.name == item and tonumber(v.slot) <= lowestSlot then
```
2025-05-02 22:20:26 +01:00
Jim Shield
6a5913230f Add better fallbacks for if no metadata table is found
```lua
                durability = v.info.durability
```
to:
```lua
                durability = v.info and v.info.durability or nil
```
2025-05-02 22:16:51 +01:00
Jim Shield
b7a284e051 Fix new duty sync
This should have been placed in a `onPlayerLoaded()` but it was checking at script start for player info before that info was able to be grabbed
2025-05-02 12:29:02 +01:00
Jim Shield
0accdda2dd version bump
`2.0.04`
2025-05-02 11:36:54 +01:00
Jim Shield
37b855d7a7 Better syncing of onDuty variable
Added a check to the script start to get the current players duty (helpful if yours saves the duty through restarts)

Also added core specific triggers for job/duty changes to help keep these in sync
2025-05-02 11:20:09 +01:00
Jim Shield
7432dd5118 revert qbinv dectetion
Wasn't playing as well as I thought it would..
2025-05-01 20:05:00 +01:00
Jim Shield
59ff34c9cc Add exploit protection for :Crafting:GetItem
I unfortunately forgot to add this before when adding the extra exploit protection. Now demands an auth token before allowing crafting results to help reduce exploiters calling it externally
2025-05-01 18:07:39 +01:00
Jim Shield
b81ada265b Better support for RedM's RSG Core
Nothing public uses this yet, but its very similar to QBCore which makes it very for me to support

Nothing special to note, just improves the integration for future ventures into RedM
2025-05-01 17:49:37 +01:00
Jim Shield
65c9c6c586 Add automated check for QBInv version
Currently if you still have the old qb-inventory or a css edit it would require you to manually edit the starter.lua
```lua
QBInvNew = true
```

I'm testing a change to grab the version and return true of false if its above `2.0.0` (200)
```lua
local qbInvVer = GetResourceMetadata(Exports.QBInv, 'version', nil):gsub("%.", "")
QBInvNew = tonumber(qbInvVer) >= 200
```
If this causes issue's I'll revert this
2025-05-01 17:08:21 +01:00
Jim Shield
278cbb4d34 fix discord bot yml 2025-05-01 13:36:44 +01:00
Jim Shield
381c19e701 add gitbot yml 2025-05-01 00:20:35 +01:00
Jim Shield
fc2ebefc9e fix CodeM server side inventory info grab 2025-04-30 17:54:04 +01:00
Jim Shield
423b75e7d9 Tgiann Inv support added 2025-04-30 17:53:26 +01:00
Jim Shield
e984a437df attempt to fix shops for QS-Inv 2025-04-30 16:54:33 +01:00
Jim Shield
0818dae0df change qs-inv metadata call to info 2025-04-30 13:21:39 +01:00
Jim Shield
771a2a3217 fix quasar crafting stash item removal 2025-04-29 23:26:10 +01:00
Jim Shield
04b3f87b32 change CodeM metadata check to info 2025-04-29 19:55:30 +01:00
Jim Shield
6c3d0ffc5e change CodeM client inv check to getUserInventory() 2025-04-29 19:55:09 +01:00
Jim Shield
3f093ce934 fix QS-Inv registerStash function 2025-04-29 17:43:37 +01:00
20 changed files with 393 additions and 87 deletions

17
.github/workflows/notify-discord.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: Discord Commit Notifier
on:
push:
branches:
- '*' # triggers on all branches
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Discord Commits
uses: Sniddl/discord-commits@v1.6
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
template: "avatar-with-link"
include-extras: true

View File

@@ -1,4 +1,4 @@
function parseVersion(version) local function parseVersion(version)
local parts = {} local parts = {}
for num in version:gmatch("%d+") do for num in version:gmatch("%d+") do
table.insert(parts, tonumber(num)) table.insert(parts, tonumber(num))
@@ -6,7 +6,7 @@ function parseVersion(version)
return parts return parts
end end
function compareVersions(current, newest) local function compareVersions(current, newest)
local currentParts = parseVersion(current) local currentParts = parseVersion(current)
local newestParts = parseVersion(newest) local newestParts = parseVersion(newest)
for i = 1, math.max(#currentParts, #newestParts) do for i = 1, math.max(#currentParts, #newestParts) do
@@ -35,7 +35,14 @@ function CheckBridgeVersion()
if compareResult == 0 then if compareResult == 0 then
print("^7'^3jim_bridge^7' - ^2You are running the latest version^7. ^7(^3"..currentVersionRaw.."^7)") print("^7'^3jim_bridge^7' - ^2You are running the latest version^7. ^7(^3"..currentVersionRaw.."^7)")
elseif compareResult < 0 then elseif compareResult < 0 then
-- Made the check a bit more obvious
print("^1----------------------------------------------------------------------^7")
print("^7'^3jim_bridge^7' - ^1You are running an outdated version^7! ^7(^3"..currentVersionRaw.."^7 → ^3"..newestVersionRaw.."^7)") print("^7'^3jim_bridge^7' - ^1You are running an outdated version^7! ^7(^3"..currentVersionRaw.."^7 → ^3"..newestVersionRaw.."^7)")
print("^1----------------------------------------------------------------------^7")
SetTimeout(1200000, function()
-- Do a naughty repeat message every 20 minutes until the the script is updated
CheckBridgeVersion()
end)
else else
print("^7'^3jim_bridge^7' - ^5You are running a newer version ^7(^3"..currentVersionRaw.."^7 ← ^3"..newestVersionRaw.."^7)") print("^7'^3jim_bridge^7' - ^5You are running a newer version ^7(^3"..currentVersionRaw.."^7 ← ^3"..newestVersionRaw.."^7)")
end end

View File

@@ -1,6 +1,6 @@
name "Jim_Bridge" name "Jim_Bridge"
author "Jimathy" author "Jimathy"
version "2.0.02" version "2.0.05"
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

@@ -51,7 +51,13 @@ function CheckVersion()
if compareResult == 0 then if compareResult == 0 then
print("^7'^3"..script.."^7' - ^2You are running the latest version^7. (^3"..currentVersionRaw.."^7)") print("^7'^3"..script.."^7' - ^2You are running the latest version^7. (^3"..currentVersionRaw.."^7)")
elseif compareResult < 0 then elseif compareResult < 0 then
print("^1----------------------------------------------------------------------^7")
print("^7'^3"..script.."^7' - ^1You are currently running an outdated version^7! (^3"..currentVersionRaw.."^7 → ^3"..fallbackVersionRaw.."^7)") print("^7'^3"..script.."^7' - ^1You are currently running an outdated version^7! (^3"..currentVersionRaw.."^7 → ^3"..fallbackVersionRaw.."^7)")
print("^1----------------------------------------------------------------------^7")
SetTimeout(1200000, function()
-- Do a naughty repeat message every 20 minutes until the the script is updated
CheckVersion()
end)
else else
print("^7'^3"..script.."^7' - ^5You are running a newer version ^7(^3"..currentVersionRaw.."^7 ← ^3"..fallbackVersionRaw.."^7)") print("^7'^3"..script.."^7' - ^5You are running a newer version ^7(^3"..currentVersionRaw.."^7 ← ^3"..fallbackVersionRaw.."^7)")
end end
@@ -63,7 +69,13 @@ function CheckVersion()
if compareResult == 0 then if compareResult == 0 then
print("^7'^3"..script.."^7' - ^2You are running the latest version^7. (^3"..currentVersionRaw.."^7)") print("^7'^3"..script.."^7' - ^2You are running the latest version^7. (^3"..currentVersionRaw.."^7)")
elseif compareResult < 0 then elseif compareResult < 0 then
print("^1----------------------------------------------------------------------^7")
print("^7'^3"..script.."^7' - ^1You are currently running an outdated version^7! (^3"..currentVersionRaw.."^7 → ^3"..newestVersionRaw.."^7)") print("^7'^3"..script.."^7' - ^1You are currently running an outdated version^7! (^3"..currentVersionRaw.."^7 → ^3"..newestVersionRaw.."^7)")
print("^1----------------------------------------------------------------------^7")
SetTimeout(1200000, function()
-- Do a naughty repeat message every 20 minutes until the the script is updated
CheckVersion()
end)
else else
print("^7'^3"..script.."^7' - ^5You are running a newer version ^7(^3"..currentVersionRaw.."^7 ← ^3"..newestVersionRaw.."^7)") print("^7'^3"..script.."^7' - ^5You are running a newer version ^7(^3"..currentVersionRaw.."^7 ← ^3"..newestVersionRaw.."^7)")
end end

View File

@@ -27,14 +27,15 @@ OXLibExport, QBXExport, QBExport, ESXExport, OXCoreExport =
Exports.ESXExport or "", Exports.ESXExport or "",
Exports.OXCoreExport or "" Exports.OXCoreExport or ""
OXInv, QBInv, PSInv, QSInv, CoreInv, CodeMInv, OrigenInv = OXInv, QBInv, PSInv, QSInv, CoreInv, CodeMInv, OrigenInv, TgiannInv =
Exports.OXInv or "", Exports.OXInv or "",
Exports.QBInv or "", Exports.QBInv or "",
Exports.PSInv or "", Exports.PSInv or "",
Exports.QSInv or "", Exports.QSInv or "",
Exports.CoreInv or "", Exports.CoreInv or "",
Exports.CodeMInv or "", Exports.CodeMInv or "",
Exports.OrigenInv or "" Exports.OrigenInv or "",
Exports.TgiannInv or ""
RSGExport, RSGInv = RSGExport, RSGInv =
Exports.RSGExport or "", Exports.RSGExport or "",
@@ -119,12 +120,10 @@ elseif isStarted(RSGExport) then
itemResource = RSGExport itemResource = RSGExport
Core = Core or exports[RSGExport]:GetCoreObject() Core = Core or exports[RSGExport]:GetCoreObject()
Items = Core and Core.Shared.Items or nil Items = Core and Core.Shared.Items or nil
if isStarted(RSGExport) and not isStarted(QBXExport) then RegisterNetEvent('RSGCore:Client:UpdateObject', function()
RegisterNetEvent('QBCore:Client:UpdateObject', function() Core = Core or exports[RSGExport]:GetCoreObject()
Core = Core or exports[RSGExport]:GetCoreObject() Items = Core and Core.Shared.Items or nil
Items = Core and Core.Shared.Items or nil end)
end)
end
end end
@@ -189,12 +188,10 @@ elseif isStarted(ESXExport) then
elseif isStarted(RSGExport) then elseif isStarted(RSGExport) then
Core = Core or exports[RSGExport]:GetCoreObject() Core = Core or exports[RSGExport]:GetCoreObject()
Vehicles = Core and Core.Shared.Vehicles Vehicles = Core and Core.Shared.Vehicles
if isStarted(RSGExport) then RegisterNetEvent('RSGCore:Client:UpdateObject', function()
RegisterNetEvent('RSGExport:Client:UpdateObject', function() Core = Core or exports[RSGExport]:GetCoreObject()
Core = Core or exports[RSGExport]:GetCoreObject() Vehicles = Core and Core.Shared.Vehicles
Vehicles = Core and Core.Shared.Vehicles end)
end)
end
vehResource = RSGExport vehResource = RSGExport
end end
if vehResource == nil then if vehResource == nil then
@@ -275,12 +272,10 @@ elseif isStarted(RSGExport) then
jobResource = RSGExport jobResource = RSGExport
Core = Core or exports[RSGExport]:GetCoreObject() Core = Core or exports[RSGExport]:GetCoreObject()
Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs
if isStarted(RSGExport) and not isStarted(QBXExport) then RegisterNetEvent('RSGCore:Client:UpdateObject', function()
RegisterNetEvent('QBCore:Client:UpdateObject', function() Core = exports[RSGExport]:GetCoreObject()
Core = exports[RSGExport]:GetCoreObject() Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs
Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs end)
end)
end
end end
if jobResource == nil then if jobResource == nil then

View File

@@ -371,8 +371,10 @@ function makeItem(data)
anim = anim, anim = anim,
flag = 49, flag = 49,
icon = data.item, icon = data.item,
request = true,
}) then }) then
TriggerServerEvent(getScript()..":Crafting:GetItem", data.item, data.craft, data.stashName, metadata) TriggerServerEvent(getScript()..":Crafting:GetItem", data.item, data.craft, data.stashName, metadata, currentToken)
currentToken = nil -- clear client cached token
CreateThread(function() CreateThread(function()
if data.craft["hasCrafted"] ~= nil then if data.craft["hasCrafted"] ~= nil then
debugPrint("hasCrafted Found, marking '"..data.item.."' as crafted for player") debugPrint("hasCrafted Found, marking '"..data.item.."' as crafted for player")
@@ -431,8 +433,28 @@ end
--- @param stashName string|table The stash name(s) to remove ingredients from. --- @param stashName string|table The stash name(s) to remove ingredients from.
--- @param metadata table (optional) Metadata for the crafted item. --- @param metadata table (optional) Metadata for the crafted item.
--- @usage --- @usage
RegisterNetEvent(getScript()..":Crafting:GetItem", function(ItemMake, craftable, stashName, metadata) RegisterNetEvent(getScript()..":Crafting:GetItem", function(ItemMake, craftable, stashName, metadata, token)
local src = source local src = source
debugPrint(GetInvokingResource())
if GetInvokingResource() and GetInvokingResource() ~= getScript() and GetInvokingResource() ~= "qb-core" then
debugPrint("^1Error^7: ^1Possible exploit^7, ^1vital function was called from an external resource^7")
return
end
if token == nil then
debugPrint("^1Auth^7: ^1No token recieved^7")
dupeWarn(src, item, "Auth: Player "..src.." attempted to spawn "..item.." without an auth token")
else
if token ~= validTokens[src] then
debugPrint("^1Auth^7: ^1Tokens don't match! ^7", token, validTokens[src])
dupeWarn(src, item, "Auth: "..src.." attempted to trigger server only events with an incorrect auth token")
else
debugPrint("^1Auth^7: ^2Client and Server Auth tokens match^7!", token, validTokens[src])
validTokens[src] = nil
end
end
local hasItems, hasTable = hasItem(ItemMake, 1, src) local hasItems, hasTable = hasItem(ItemMake, 1, src)
if stashName then if stashName then
local itemRemove = {} local itemRemove = {}

View File

@@ -120,9 +120,17 @@ function getPlayerInv(src)
elseif isStarted(CodeMInv) then elseif isStarted(CodeMInv) then
foundInv = CodeMInv foundInv = CodeMInv
if src then if src then
grabInv = exports[CodeMInv]:GetInventory(src) grabInv = exports[CodeMInv]:GetInventory(getPlayer(src).citizenId, src)
else else
grabInv = exports[CodeMInv]:GetClientPlayerInventory() grabInv = exports[CodeMInv]:getUserInventory()
end
elseif isStarted(TgiannInv) then
foundInv = TgiannInv
if src then
grabInv = exports[TgiannInv]:GetPlayerItems(src)
else
grabInv = exports[TgiannInv]:GetPlayerItems()
end end
elseif isStarted(QBInv) then elseif isStarted(QBInv) then

View File

@@ -31,15 +31,22 @@ validTokens = {}
--- ``` --- ```
function createUseableItem(item, funct) function createUseableItem(item, funct)
if isStarted(ESXExport) then if isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^7es_extended", item) debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^7es_extended^7", item)
while not ESX do Wait(0) end while not ESX do Wait(0) end
ESX.RegisterUsableItem(item, funct) ESX.RegisterUsableItem(item, funct)
elseif isStarted(QBExport) and not isStarted(QBXExport) then elseif isStarted(QBExport) and not isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^7qb-core", item) debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^7qb-core^7", item)
Core.Functions.CreateUseableItem(item, funct) Core.Functions.CreateUseableItem(item, funct)
elseif isStarted(QBXExport) then elseif isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^7qbx_core", item) debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^7qbx_core^7", item)
exports[QBXExport]:CreateUseableItem(item, funct) exports[QBXExport]:CreateUseableItem(item, funct)
elseif isStarted(RSGExport) then
debugPrint("^6Bridge^7: ^2Registering item as ^3Usable^2 with ^1rsg-core^7", item)
Core.Functions.CreateUseableItem(item, funct)
else else
print("^4ERROR^7: No supported framework detected for registering usable item: ^3"..item.."^7") print("^4ERROR^7: No supported framework detected for registering usable item: ^3"..item.."^7")
end end
@@ -64,18 +71,28 @@ function invImg(item)
if item ~= "" and Items[item] then if item ~= "" and Items[item] then
if isStarted(OXInv) then if isStarted(OXInv) then
imgLink = "nui://"..OXInv.."/web/images/"..(Items[item].image or "") imgLink = "nui://"..OXInv.."/web/images/"..(Items[item].image or "")
elseif isStarted(QSInv) then elseif isStarted(QSInv) then
imgLink = "nui://"..QSInv.."/html/images/"..(Items[item].image or "") imgLink = "nui://"..QSInv.."/html/images/"..(Items[item].image or "")
elseif isStarted(CoreInv) then elseif isStarted(CoreInv) then
imgLink = "nui://"..CoreInv.."/html/img/"..(Items[item].image or "") imgLink = "nui://"..CoreInv.."/html/img/"..(Items[item].image or "")
elseif isStarted(CodeMInv) then elseif isStarted(CodeMInv) then
imgLink = "nui://"..CodeMInv.."/html/itemimages/"..(Items[item].image or "") imgLink = "nui://"..CodeMInv.."/html/itemimages/"..(Items[item].image or "")
elseif isStarted(OrigenInv) then elseif isStarted(OrigenInv) then
imgLink = "nui://"..OrigenInv.."/html/img/"..(Items[item].image or "") imgLink = "nui://"..OrigenInv.."/html/img/"..(Items[item].image or "")
elseif isStarted(QBInv) then elseif isStarted(QBInv) then
imgLink = "nui://"..QBInv.."/html/images/"..(Items[item].image or "") imgLink = "nui://"..QBInv.."/html/images/"..(Items[item].image or "")
elseif isStarted(TgiannInv) then
imgLink = "nui://inventory_images/images/"..(Items[item].image or "")
elseif isStarted(RSGInv) then elseif isStarted(RSGInv) then
imgLink = "nui://"..RSGInv.."/html/images/"..(Items[item].image or "") imgLink = "nui://"..RSGInv.."/html/images/"..(Items[item].image or "")
else else
print("^4ERROR^7: ^2No Inventory detected for invImg - Check starter.lua") print("^4ERROR^7: ^2No Inventory detected for invImg - Check starter.lua")
end end
@@ -219,6 +236,9 @@ RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount,
elseif isStarted(CodeMInv) then invName = CodeMInv elseif isStarted(CodeMInv) then invName = CodeMInv
exports[CodeMInv]:RemoveItem(src, item, remamount) exports[CodeMInv]:RemoveItem(src, item, remamount)
elseif isStarted(TgiannInv) then invName = TgiannInv
exports[TgiannInv]:RemoveItem(src, item, remamount)
elseif isStarted(QBInv) then invName = QBInv elseif isStarted(QBInv) then invName = QBInv
while remamount > 0 do while remamount > 0 do
if Core.Functions.GetPlayer(src).Functions.RemoveItem(item, 1, slot) then if Core.Functions.GetPlayer(src).Functions.RemoveItem(item, 1, slot) then
@@ -296,6 +316,9 @@ RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount,
elseif isStarted(OrigenInv) then invName = OrigenInv elseif isStarted(OrigenInv) then invName = OrigenInv
exports[OrigenInv]:addItem(src, item, amountToAdd, info, slot) exports[OrigenInv]:addItem(src, item, amountToAdd, info, slot)
elseif isStarted(TgiannInv) then invName = TgiannInv
exports[TgiannInv]:AddItem(src, item, amountToAdd, slot, info)
elseif isStarted(QBInv) then invName = QBInv elseif isStarted(QBInv) then invName = QBInv
if Core.Functions.GetPlayer(src).Functions.AddItem(item, amountToAdd, nil, info) then if Core.Functions.GetPlayer(src).Functions.AddItem(item, amountToAdd, nil, info) then
TriggerClientEvent((isStarted(QBInv) and QBInvNew and "qb-" or "").."inventory:client:ItemBox", src, Items[item], "add", amountToAdd) TriggerClientEvent((isStarted(QBInv) and QBInvNew and "qb-" or "").."inventory:client:ItemBox", src, Items[item], "add", amountToAdd)
@@ -349,7 +372,7 @@ end)
--- ``` --- ```
function dupeWarn(src, item, amount) function dupeWarn(src, item, amount)
local name = getPlayer(src).name local name = getPlayer(src).name
print("^5DupeWarn^7: "..name.." (^1"..tostring(src).."^7) ^2Tried to remove item '^3"..item.."^7' but it wasn't there") print("^5DupeWarn^7: "..name.." (^1"..tostring(src).."^7) ^2Tried to remove item '^3"..item.."^7'^2 but it wasn't there^7")
if not debugMode then if not debugMode then
DropPlayer(src, name.."("..tostring(src)..") Kicked for suspected duplicating items: "..item) DropPlayer(src, name.."("..tostring(src)..") Kicked for suspected duplicating items: "..item)
end end
@@ -410,7 +433,7 @@ function getDurability(item)
if v.name == item then if v.name == item then
if v.slot <= lowestSlot then if v.slot <= lowestSlot then
lowestSlot = v.slot lowestSlot = v.slot
durability = itemcheck[k].info.durability durability = itemcheck[k].info and itemcheck[k].info.durability or nil
end end
end end
end end
@@ -422,7 +445,7 @@ function getDurability(item)
if v.slot <= lowestSlot then if v.slot <= lowestSlot then
debugPrint(v.slot, itemcheck[k].metadata.durability) debugPrint(v.slot, itemcheck[k].metadata.durability)
lowestSlot = v.slot lowestSlot = v.slot
durability = v.metadata.durability durability = v.metadata and v.metadata.durability or nil
end end
end end
end end
@@ -432,7 +455,7 @@ function getDurability(item)
for _, v in pairs(itemcheck) do for _, v in pairs(itemcheck) do
if v.name == item and v.slot <= lowestSlot then if v.name == item and v.slot <= lowestSlot then
lowestSlot = v.slot lowestSlot = v.slot
durability = v.metadata.durability durability = v.info and v.info.durability or nil
end end
end end
end end
@@ -442,7 +465,7 @@ function getDurability(item)
for _, v in pairs(itemcheck) do for _, v in pairs(itemcheck) do
if v.name == item and v.slot <= lowestSlot then if v.name == item and v.slot <= lowestSlot then
lowestSlot = v.slot lowestSlot = v.slot
durability = v.metadata.durability durability = v.metadata and v.metadata.durability or nil
end end
end end
end end
@@ -450,9 +473,9 @@ function getDurability(item)
if isStarted(CodeMInv) then if isStarted(CodeMInv) then
local itemcheck = exports[CodeMInv]:GetClientPlayerInventory() local itemcheck = exports[CodeMInv]:GetClientPlayerInventory()
for _, v in pairs(itemcheck) do for _, v in pairs(itemcheck) do
if v.name == item and v.slot <= lowestSlot then if v.name == item and tonumber(v.slot) <= lowestSlot then
lowestSlot = v.slot lowestSlot = tonumber(v.slot)
durability = v.metadata.durability durability = v.info and v.info.durability or nil
end end
end end
end end
@@ -462,7 +485,17 @@ function getDurability(item)
for _, v in pairs(itemcheck) do for _, v in pairs(itemcheck) do
if v.name == item and v.slot <= lowestSlot then if v.name == item and v.slot <= lowestSlot then
lowestSlot = v.slot lowestSlot = v.slot
durability = v.metadata.durability 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 end
end end
@@ -524,6 +557,9 @@ RegisterNetEvent(getScript()..":server:setMetaData", function(data)
elseif isStarted(OrigenInv) then elseif isStarted(OrigenInv) then
exports[OrigenInv]:setMetadata(src, data.slot, data.metadata) exports[OrigenInv]:setMetadata(src, data.slot, data.metadata)
elseif isStarted(TgiannInv) then
exports[TgiannInv]:UpdateItemMetadata(src, data.item, data.slot, data.metadata)
end end
end) end)
@@ -633,6 +669,11 @@ function canCarry(itemTable, src)
resultTable[k] = exports[OrigenInv]:canCarryItem(src, k, v) resultTable[k] = exports[OrigenInv]:canCarryItem(src, k, v)
end end
elseif isStarted(TgiannInv) then
for k, v in pairs(itemTable) do
resultTable[k] = exports[TgiannInv]:CanCarryItem(source, k, v)
end
elseif isStarted(QBInv) then elseif isStarted(QBInv) then
for k, v in pairs(itemTable) do for k, v in pairs(itemTable) do
resultTable[k] = exports[QBInv]:CanAddItem(src, k, v) resultTable[k] = exports[QBInv]:CanAddItem(src, k, v)

View File

@@ -12,8 +12,16 @@
------------------------------------------------------------- -------------------------------------------------------------
-- Global Duty Status -- Global Duty Status
------------------------------------------------------------- -------------------------------------------------------------
-- This attempts to sync up with the players framework onDuty variable
-- This stops the script getting confused when one is false and one is true
onDuty = false onDuty = false
if not isServer() then
onPlayerLoaded(function()
onDuty = getPlayer().onDuty
end, true)
end
------------------------------------------------------------- -------------------------------------------------------------
-- Boss Role Detection -- Boss Role Detection
------------------------------------------------------------- -------------------------------------------------------------
@@ -92,9 +100,14 @@ end
--- toggleDuty() -- Player receives a notification of their new duty status. --- toggleDuty() -- Player receives a notification of their new duty status.
--- ``` --- ```
function toggleDuty() function toggleDuty()
onDuty = not onDuty
if isStarted(QBExport) or isStarted(QBXExport) then if isStarted(QBExport) or isStarted(QBXExport) then
TriggerServerEvent("QBCore:ToggleDuty") TriggerServerEvent("QBCore:ToggleDuty")
Wait(100)
onDuty = getPlayer().onDuty
elseif isStarted(RSGExport) then
TriggerServerEvent("RSGCore:ToggleDuty")
Wait(100)
onDuty = getPlayer().onDuty
else else
if onDuty then if onDuty then
triggerNotify(nil, "Now on duty", "success") triggerNotify(nil, "Now on duty", "success")
@@ -104,6 +117,15 @@ function toggleDuty()
end end
end end
-- Framework specific functions to keep duty status synced
RegisterNetEvent("QBCore:Client:OnJobUpdate", function(JobInfo) onDuty = JobInfo.onduty end)
RegisterNetEvent("QBCore:Client:SetDuty", function(duty) onDuty = duty end)
RegisterNetEvent("qbx_core:client:onJobUpdate", function(JobInfo) onDuty = JobInfo.onduty end)
RegisterNetEvent("RSGCore:Client:OnJobUpdate", function(JobInfo) onDuty = JobInfo.onduty end)
RegisterNetEvent("RSGCore:Client:SetDuty", function(duty) onDuty = duty end)
------------------------------------------------------------- -------------------------------------------------------------
-- Interaction Functions -- Interaction Functions
------------------------------------------------------------- -------------------------------------------------------------

View File

@@ -23,15 +23,23 @@ function GetPlayer(source)
if isStarted(QBExport) then if isStarted(QBExport) then
debugPrint("^6Bridge^7: ^3GetPlayer^7() QBExport") debugPrint("^6Bridge^7: ^3GetPlayer^7() QBExport")
return exports[QBExport]:GetCoreObject().Functions.GetPlayer(source) return exports[QBExport]:GetCoreObject().Functions.GetPlayer(source)
elseif isStarted(QBXExport) then elseif isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^3GetPlayer^7() QBOXExport") debugPrint("^6Bridge^7: ^3GetPlayer^7() QBOXExport")
return exports[QBXExport]:GetCoreObject().Functions.GetPlayer(source) return exports[QBXExport]:GetCoreObject().Functions.GetPlayer(source)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^3GetPlayer^7() ESXExport") debugPrint("^6Bridge^7: ^3GetPlayer^7() ESXExport")
return ESX.GetPlayerFromId(source) return ESX.GetPlayerFromId(source)
elseif isStarted(OXCoreExport) then elseif isStarted(OXCoreExport) then
debugPrint("^6Bridge^7: ^3GetPlayer^7() OXCoreExport") debugPrint("^6Bridge^7: ^3GetPlayer^7() OXCoreExport")
return exports[OXCoreExport]:GetPlayer(source) return exports[OXCoreExport]:GetPlayer(source)
elseif isStarted(RSGExport) then
debugPrint("^6Bridge^7: ^3GetPlayer^7() RSGExport")
return exports[RSGExport]:GetCoreObject().Functions.GetPlayer(source)
end end
return nil return nil
end end
@@ -58,14 +66,21 @@ function GetMetadata(player, key)
return triggerCallback(getScript()..":server:GetMetadata", key) return triggerCallback(getScript()..":server:GetMetadata", key)
else else
if isStarted(QBExport) or isStarted(QBXExport) then if isStarted(QBExport) or isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^3GetMetadata^7() QBExport or QBXExport", key) debugPrint("^6Bridge^7: ^3GetMetadata^7() QBExport/QBXExport", key)
return player.PlayerData.metadata[key] return player.PlayerData.metadata[key]
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^3GetMetadata^7() ESXExport", key) debugPrint("^6Bridge^7: ^3GetMetadata^7() ESXExport", key)
return player.getMeta(key) return player.getMeta(key)
elseif isStarted(OXCoreExport) then elseif isStarted(OXCoreExport) then
debugPrint("^6Bridge^7: ^3GetMetadata^7() OXCoreExport", key) debugPrint("^6Bridge^7: ^3GetMetadata^7() OXCoreExport", key)
return player.get(key) return player.get(key)
elseif isStarted(RSGExport) then
debugPrint("^6Bridge^7: ^3GetMetadata^7() RSGExport", key)
return player.PlayerData.metadata[key]
end end
end end
return nil return nil
@@ -112,12 +127,19 @@ function SetMetadata(player, key, value)
if isStarted(QBExport) or isStarted(QBXExport) then if isStarted(QBExport) or isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^3SetMetadata^7() using QBExport/QBXExport") debugPrint("^6Bridge^7: ^3SetMetadata^7() using QBExport/QBXExport")
player.Functions.SetMetaData(key, value) player.Functions.SetMetaData(key, value)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^3SetMetadata^7() using ESXExport") debugPrint("^6Bridge^7: ^3SetMetadata^7() using ESXExport")
player.setMeta(key, value) player.setMeta(key, value)
elseif isStarted(OXCoreExport) then elseif isStarted(OXCoreExport) then
debugPrint("^6Bridge^7: ^3SetMetadata^7() using OXCoreExport") debugPrint("^6Bridge^7: ^3SetMetadata^7() using OXCoreExport")
player.set(key, value) player.set(key, value)
elseif isStarted(RSGExport) then
debugPrint("^6Bridge^7: ^3SetMetadata^7() using RSGExport")
player.Functions.SetMetaData(key, value)
end end
end end

View File

@@ -78,6 +78,11 @@ function sendPhoneMail(data)
TriggerServerEvent(getScript()..":jpr:SendMail", mailData) TriggerServerEvent(getScript()..":jpr:SendMail", mailData)
end, end,
}, },
{ name = "ef-phone",
send = function(mailData)
TriggerServerEvent('qb-phone:server:sendNewMail', mailData)
end,
},
} }
local activePhone = nil local activePhone = nil

View File

@@ -111,10 +111,16 @@ end)
function setThirst(src, thirst) function setThirst(src, thirst)
if isStarted(ESXExport) then if isStarted(ESXExport) then
TriggerClientEvent('esx_status:add', src, 'thirst', thirst) TriggerClientEvent('esx_status:add', src, 'thirst', thirst)
elseif isStarted(QBExport) or isStarted(QBXExport) then elseif isStarted(QBExport) or isStarted(QBXExport) then
local Player = Core.Functions.GetPlayer(src) local Player = Core.Functions.GetPlayer(src)
Player.Functions.SetMetaData('thirst', thirst) Player.Functions.SetMetaData('thirst', thirst)
TriggerClientEvent("hud:client:UpdateNeeds", src, thirst, Player.PlayerData.metadata.thirst) TriggerClientEvent("hud:client:UpdateNeeds", src, thirst, Player.PlayerData.metadata.thirst)
elseif isStarted(RSGExport) then
local Player = Core.Functions.GetPlayer(src)
Player.Functions.SetMetaData('thirst', thirst)
TriggerClientEvent("hud:client:UpdateNeeds", src, thirst, Player.PlayerData.metadata.thirst)
end end
end end
@@ -130,10 +136,16 @@ end
function setHunger(src, hunger) function setHunger(src, hunger)
if isStarted(ESXExport) then if isStarted(ESXExport) then
TriggerClientEvent('esx_status:add', src, 'hunger', hunger) TriggerClientEvent('esx_status:add', src, 'hunger', hunger)
elseif isStarted(QBExport) or isStarted(QBXExport) then elseif isStarted(QBExport) or isStarted(QBXExport) then
local Player = Core.Functions.GetPlayer(src) local Player = Core.Functions.GetPlayer(src)
Player.Functions.SetMetaData('hunger', hunger) Player.Functions.SetMetaData('hunger', hunger)
TriggerClientEvent("hud:client:UpdateNeeds", src, hunger, Player.PlayerData.metadata.hunger) TriggerClientEvent("hud:client:UpdateNeeds", src, hunger, Player.PlayerData.metadata.hunger)
elseif isStarted(RSGExport) then
local Player = Core.Functions.GetPlayer(src)
Player.Functions.SetMetaData('hunger', hunger)
TriggerClientEvent("hud:client:UpdateNeeds", src, hunger, Player.PlayerData.metadata.hunger)
end end
end end
@@ -161,20 +173,31 @@ function chargePlayer(cost, moneyType, newsrc)
if moneyType == "cash" then if moneyType == "cash" then
if isStarted(OXInv) then fundResource = OXInv if isStarted(OXInv) then fundResource = OXInv
exports[OXInv]:RemoveItem(src, "money", cost) exports[OXInv]:RemoveItem(src, "money", cost)
elseif isStarted(QBExport) or isStarted(QBXExport) then elseif isStarted(QBExport) or isStarted(QBXExport) then
fundResource = QBExport fundResource = QBExport
Core.Functions.GetPlayer(src).Functions.RemoveMoney("cash", cost) Core.Functions.GetPlayer(src).Functions.RemoveMoney("cash", cost)
elseif isStarted(RSGExport) then elseif isStarted(RSGExport) then
fundResource = QBExport fundResource = RSGExport
Core.Functions.GetPlayer(src).Functions.RemoveMoney("cash", cost) Core.Functions.GetPlayer(src).Functions.RemoveMoney("cash", cost)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
fundResource = ESXExport fundResource = ESXExport
ESX.GetPlayerFromId(src).removeMoney(cost, "") ESX.GetPlayerFromId(src).removeMoney(cost, "")
end end
elseif moneyType == "bank" then elseif moneyType == "bank" then
if isStarted(QBExport) or isStarted(QBXExport) then fundResource = QBExport if isStarted(QBExport) or isStarted(QBXExport) then
fundResource = QBExport
Core.Functions.GetPlayer(src).Functions.RemoveMoney("bank", cost) Core.Functions.GetPlayer(src).Functions.RemoveMoney("bank", cost)
elseif isStarted(ESXExport) then fundResource = ESXExport
elseif isStarted(RSGExport) then
fundResource = RSGExport
Core.Functions.GetPlayer(src).Functions.RemoveMoney("bank", cost)
elseif isStarted(ESXExport) then
fundResource = ESXExport
ESX.GetPlayerFromId(src).removeMoney(cost, "") ESX.GetPlayerFromId(src).removeMoney(cost, "")
end end
end end
@@ -212,17 +235,29 @@ function fundPlayer(fund, moneyType, newsrc)
if isStarted(OXInv) then if isStarted(OXInv) then
fundResource = OXInv fundResource = OXInv
exports[OXInv]:AddItem(src, "money", fund) exports[OXInv]:AddItem(src, "money", fund)
elseif isStarted(QBExport) or isStarted(QBXExport) then elseif isStarted(QBExport) or isStarted(QBXExport) then
fundResource = QBExport fundResource = QBExport
Core.Functions.GetPlayer(src).Functions.AddMoney("cash", fund) Core.Functions.GetPlayer(src).Functions.AddMoney("cash", fund)
elseif isStarted(RSGExport) then
fundResource = RSGExport
Core.Functions.GetPlayer(src).Functions.AddMoney("cash", fund)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
fundResource = ESXExport fundResource = ESXExport
PlayESX.GetPlayerFromId(src).addMoney(fund, "") ESX.GetPlayerFromId(src).addMoney(fund, "")
end end
elseif moneyType == "bank" then elseif moneyType == "bank" then
if isStarted(QBExport) or isStarted(QBXExport) then if isStarted(QBExport) or isStarted(QBXExport) then
fundResource = QBExport fundResource = QBExport
Core.Functions.GetPlayer(src).Functions.AddMoney("bank", fund) Core.Functions.GetPlayer(src).Functions.AddMoney("bank", fund)
elseif isStarted(RSGExport) then
fundResource = RSGExport
Core.Functions.GetPlayer(src).Functions.AddMoney("bank", fund)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
fundResource = ESXExport fundResource = ESXExport
ESX.GetPlayerFromId(src).addMoney(fund, "") ESX.GetPlayerFromId(src).addMoney(fund, "")
@@ -380,6 +415,35 @@ function hasJob(job, source, grade)
if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end
end end
end end
elseif isStarted(RSGExport) then
if Core.Functions.GetPlayer then
local player = Core.Functions.GetPlayer(src)
if not player then print("Player not found for src: "..src) end
local jobinfo = player.PlayerData.job
if jobinfo.name == job then
hasJobFlag = true
duty = player.PlayerData.job.onduty
if grade and not (grade <= jobinfo.grade.level) then hasJobFlag = false end
end
local ganginfo = player.PlayerData.gang
if ganginfo.name == job then
hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end
end
else
local jobinfo = exports[RSGExport]:GetPlayer(src).PlayerData.job
if jobinfo.name == job then
hasJobFlag = true
duty = exports[RSGExport]:GetPlayer(src).PlayerData.job.onduty
if grade and not (grade <= jobinfo.grade.level) then hasJobFlag = false end
end
local ganginfo = exports[RSGExport]:GetPlayer(src).PlayerData.gang
if ganginfo.name == job then
hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end
end
end
else else
print("^4ERROR^7: ^2No Core detected for hasJob ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No Core detected for hasJob ^7- ^2Check ^3starter^1.^2lua^7")
end end
@@ -425,6 +489,22 @@ function hasJob(job, source, grade)
hasJobFlag = true hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end
end end
elseif isStarted(RSGExport) then
local info = nil
Core.Functions.GetPlayerData(function(PlayerData) info = PlayerData end)
local jobinfo = info.job
if jobinfo.name == job then
hasJobFlag = true
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then hasJobFlag = false end
end
local ganginfo = info.gang
if ganginfo.name == job then
hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then hasJobFlag = false end
end
else else
print("^4ERROR^7: ^2No Core detected for hasJob() ^7- ^2Check ^3starter^1.^2lua^7") print("^4ERROR^7: ^2No Core detected for hasJob() ^7- ^2Check ^3starter^1.^2lua^7")
end end

View File

@@ -149,8 +149,8 @@ function BigMessage:ShowColoredShard(msg, desc, textColor, bgColor, duration, ma
BeginScaleformMovieMethod(self.scaleform, "SHOW_SHARD_CENTERED_MP_MESSAGE") BeginScaleformMovieMethod(self.scaleform, "SHOW_SHARD_CENTERED_MP_MESSAGE")
ScaleformMovieMethodAddParamPlayerNameString(msg) ScaleformMovieMethodAddParamPlayerNameString(msg)
ScaleformMovieMethodAddParamPlayerNameString(desc) ScaleformMovieMethodAddParamPlayerNameString(desc)
ScaleformMovieMethodAddParamInt(bgColor)
ScaleformMovieMethodAddParamInt(textColor) ScaleformMovieMethodAddParamInt(textColor)
ScaleformMovieMethodAddParamInt(bgColor)
EndScaleformMovieMethod() EndScaleformMovieMethod()
self.duration = duration self.duration = duration

View File

@@ -148,6 +148,7 @@ end)
--- }) --- })
--- ``` --- ```
function openShop(data) function openShop(data)
jsonPrint(data)
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
if Config.General.JimShops then if Config.General.JimShops then
@@ -156,24 +157,34 @@ function openShop(data)
elseif isStarted(OXInv) then elseif isStarted(OXInv) then
exports[OXInv]:openInventory('shop', { type = data.shop }) exports[OXInv]:openInventory('shop', { type = data.shop })
elseif isStarted(QSInv) or isStarted(CodeMInv) then
TriggerServerEvent("inventory:server:OpenInventory", "shop", data.items.label, data.items)
elseif isStarted(TgiannInv) then
TriggerServerEvent(getScript()..':server:OpenShopTgiann', data.shop)
elseif isStarted(QBInv) then elseif isStarted(QBInv) then
if QBInvNew then if QBInvNew then
TriggerServerEvent(getScript()..':server:OpenShopNewQB', data.shop) TriggerServerEvent(getScript()..':server:OpenShopNewQB', data.shop)
else else
TriggerServerEvent("inventory:server:OpenInventory", "shop", data.items.label, data.items) TriggerServerEvent("inventory:server:OpenInventory", "shop", data.items.label, data.items)
end end
elseif isStarted(RSGInv) then elseif isStarted(RSGInv) then
TriggerServerEvent(getScript()..':server:OpenShopNewRSG', data.shop) TriggerServerEvent(getScript()..':server:OpenShopRSG', data.shop)
end end
lookEnt(data.coords) lookEnt(data.coords)
end end
--- Server event handler for opening a shop using the new QB inventory system.
RegisterNetEvent(getScript()..':server:OpenShopNewQB', function(data) RegisterNetEvent(getScript()..':server:OpenShopNewQB', function(data)
exports[QBInv]:OpenShop(source, data) exports[QBInv]:OpenShop(source, data)
end) end)
RegisterNetEvent(getScript()..':server:OpenShopNewRSG', function(data) RegisterNetEvent(getScript()..':server:OpenShopTgiann', function(data)
exports[TgiannInv]:OpenShop(source, data)
end)
RegisterNetEvent(getScript()..':server:OpenShopRSG', function(data)
exports[RSGInv]:OpenShop(source, data) exports[RSGInv]:OpenShop(source, data)
end) end)
@@ -196,6 +207,11 @@ function registerShop(name, label, items, society)
inventory = items, inventory = items,
society = society, society = society,
}) })
elseif isStarted(TgiannInv) then
debugPrint("^6Bridge^7: ^2Registering ^3Tgiann ^2Store^7:", name, label)
exports[TgiannInv]:RegisterShop(name, items)
elseif isStarted(QBInv) and QBInvNew then elseif isStarted(QBInv) and QBInvNew then
debugPrint("^6Bridge^7: ^2Registering ^3QB ^2Store^7:", name, label) debugPrint("^6Bridge^7: ^2Registering ^3QB ^2Store^7:", name, label)
exports[QBInv]:CreateShop({ exports[QBInv]:CreateShop({

View File

@@ -151,6 +151,14 @@ function openStash(data)
elseif isStarted(OrigenInv) then elseif isStarted(OrigenInv) then
exports[OrigenInv]:openInventory('stash', data.stash, { label = data.label }) exports[OrigenInv]:openInventory('stash', data.stash, { label = data.label })
elseif isStarted(TgiannInv) then
TriggerServerEvent(getScript()..':server:OpenStashTgiann', {
stashName = data.stash,
label = data.label,
maxweight = data.maxWeight or 600000,
slots = data.slots or 40
})
elseif isStarted(QBInv) then elseif isStarted(QBInv) then
if QBInvNew then if QBInvNew then
TriggerServerEvent(getScript()..':server:OpenStashQB', { TriggerServerEvent(getScript()..':server:OpenStashQB', {
@@ -181,7 +189,10 @@ function openStash(data)
lookEnt(data.coords) lookEnt(data.coords)
end end
-- Register an event for opening QB stashes. RegisterNetEvent(getScript()..':server:OpenStashTgiann', function(data)
exports[TgiannInv]:OpenInventory(source, 'stash', data.stashName, data)
end)
RegisterNetEvent(getScript()..':server:OpenStashQB', function(data) RegisterNetEvent(getScript()..':server:OpenStashQB', function(data)
exports[QBInv]:OpenInventory(source, data.stashName, data) exports[QBInv]:OpenInventory(source, data.stashName, data)
end) end)
@@ -216,7 +227,9 @@ function getStash(stashName)
local stashItems, items = {}, {} local stashItems, items = {}, {}
if isStarted(OXInv) then if isStarted(OXInv) then
stashResource = OXInv stashResource = OXInv
stashItems = exports[OXInv]:Inventory(stashName).items local stash = exports[OXInv]:Inventory(stashName)
-- Add fallback if ox can't find the stash and returns a boolean
stashItems = type(stash) == "table" and stash.items or {}
elseif isStarted(QSInv) then elseif isStarted(QSInv) then
stashResource = QSInv stashResource = QSInv
@@ -234,6 +247,10 @@ function getStash(stashName)
stashResource = OrigenInv stashResource = OrigenInv
stashItems = exports[OrigenInv]:getInventory(stashName) stashItems = exports[OrigenInv]:getInventory(stashName)
elseif isStarted(TgiannInv) then
stashResource = TgiannInv
stashItems = exports[TgiannInv]:GetSecondaryInventoryItems("stash", stashName)
elseif isStarted(PSInv) then elseif isStarted(PSInv) then
stashResource = PSInv stashResource = PSInv
local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', { stashName }) local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', { stashName })
@@ -322,7 +339,7 @@ function stashRemoveItem(stashItems, stashName, items)
stashItems[l] = nil stashItems[l] = nil
else else
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)
exports[QSInv]:RemoveItemIntoStash(stashName, k, v, l) exports[QSInv]:RemoveItemIntoStash(stashName[1], k, v, l)
end end
end end
end end
@@ -330,7 +347,7 @@ function stashRemoveItem(stashItems, stashName, items)
elseif isStarted(CoreInv) then elseif isStarted(CoreInv) then
for k, v in pairs(items) do for k, v in pairs(items) do
exports[CoreInv]:removeItemExact(stashName, k, v) exports[CoreInv]:removeItemExact(stashName[1], k, v)
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..CoreInv, k, v) debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..CoreInv, k, v)
end end
@@ -348,14 +365,22 @@ function stashRemoveItem(stashItems, stashName, items)
end end
end end
end end
exports[CodeMInv]:UpdateStash(stashName, stashItems) exports[CodeMInv]:UpdateStash(stashName[1], stashItems)
debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3CodeM^2 stash ^7'^6"..stashName.."^7'") debugPrint("^6Bridge^7: ^3saveStash^7: ^2Saving ^3CodeM^2 stash ^7'^6"..stashName.."^7'")
elseif isStarted(OrigenInv) then elseif isStarted(OrigenInv) then
for k, v in pairs(items) do for k, v in pairs(items) do
exports[OrigenInv]:RemoveFromStash(stashName, k, v) exports[OrigenInv]:RemoveFromStash(stashName[1], k, v)
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..OrigenInv, k, v) debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..OrigenInv, k, v)
end end
elseif isStarted(TgiannInv) then
for k, v in pairs(items) do
local itemData = exports["tgiann-inventory"]:GetItemByNameFromSecondaryInventory("stash", stashName[1], k)
exports[TgiannInv]:RemoveItemFromSecondaryInventory("stash", stashName[1], k, v, itemData.slot, nil)
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..TgiannInv, k, v)
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
@@ -408,6 +433,16 @@ function stashRemoveItem(stashItems, stashName, items)
}) })
end end
elseif isStarted(RSGInv) then
for k, v in pairs(items) do
exports[RSGInv]:RemoveItem(stashName[1], k, v, false, 'crafting')
debugPrint("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..RSGInv, k, v)
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
@@ -432,7 +467,7 @@ RegisterNetEvent(getScript()..":server:stashRemoveItem", stashRemoveItem)
--- local hasAll, details = stashhasItem(currentStashItems, { iron = 2, wood = 5 }) --- local hasAll, details = stashhasItem(currentStashItems, { iron = 2, wood = 5 })
--- ``` --- ```
function stashhasItem(stashItems, items, amount) function stashhasItem(stashItems, items, amount)
local invs = { OXInv, QSInv, CoreInv, CodeMInv, OrigenInv, QBInv, PSInv } local invs = { OXInv, QSInv, CoreInv, CodeMInv, OrigenInv, TgiannInv, QBInv, PSInv, RSGInv }
local foundInv = "" local foundInv = ""
for _, inv in ipairs(invs) do for _, inv in ipairs(invs) do
if isStarted(inv) then if isStarted(inv) then

View File

@@ -121,7 +121,7 @@ function createEntityTarget(entity, opts, dist)
options[i] = { options[i] = {
icon = opts[i].icon, icon = opts[i].icon,
label = opts[i].label, label = opts[i].label,
item = opts[i].item or nil, items = opts[i].item or nil,
groups = opts[i].job or opts[i].gang, groups = opts[i].job or opts[i].gang,
onSelect = opts[i].action, onSelect = opts[i].action,
distance = dist, distance = dist,
@@ -230,7 +230,7 @@ function createBoxTarget(data, opts, dist)
options[i] = { options[i] = {
icon = opts[i].icon, icon = opts[i].icon,
label = opts[i].label, label = opts[i].label,
item = opts[i].item or nil, items = opts[i].item or nil,
groups = opts[i].job or opts[i].gang, groups = opts[i].job or opts[i].gang,
onSelect = opts[i].onSelect or opts[i].action, onSelect = opts[i].onSelect or opts[i].action,
distance = dist, distance = dist,
@@ -336,7 +336,7 @@ function createCircleTarget(data, opts, dist)
options[i] = { options[i] = {
icon = opts[i].icon, icon = opts[i].icon,
label = opts[i].label, label = opts[i].label,
item = opts[i].item or nil, items = opts[i].item or nil,
groups = opts[i].job or opts[i].gang, groups = opts[i].job or opts[i].gang,
onSelect = opts[i].onSelect or opts[i].action, onSelect = opts[i].onSelect or opts[i].action,
distance = dist, distance = dist,
@@ -418,7 +418,7 @@ function createModelTarget(models, opts, dist)
options[i] = { options[i] = {
icon = opts[i].icon, icon = opts[i].icon,
label = opts[i].label, label = opts[i].label,
item = opts[i].item or nil, items = opts[i].item or nil,
groups = opts[i].job or opts[i].gang, groups = opts[i].job or opts[i].gang,
onSelect = opts[i].action, onSelect = opts[i].action,
distance = dist, distance = dist,

View File

@@ -108,6 +108,7 @@ function getVehicleProperties(vehicle)
if isStarted(QBExport) and not isStarted(QBXExport) then if isStarted(QBExport) and not isStarted(QBXExport) then
properties = Core.Functions.GetVehicleProperties(vehicle) properties = Core.Functions.GetVehicleProperties(vehicle)
debugPrint("^6Bridge^7: ^2Getting Vehicle Properties ^7[^6"..QBExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..properties.model.."^7] - [^3"..properties.plate.."^7]") debugPrint("^6Bridge^7: ^2Getting Vehicle Properties ^7[^6"..QBExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..properties.model.."^7] - [^3"..properties.plate.."^7]")
elseif isStarted(OXLibExport) then elseif isStarted(OXLibExport) then
properties = lib.getVehicleProperties(vehicle) properties = lib.getVehicleProperties(vehicle)
debugPrint("^6Bridge^7: ^2Getting Vehicle Properties ^7[^6"..OXLibExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..properties.model.."^7] - [^3"..properties.plate.."^7]") debugPrint("^6Bridge^7: ^2Getting Vehicle Properties ^7[^6"..OXLibExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..properties.model.."^7] - [^3"..properties.plate.."^7]")
@@ -134,6 +135,7 @@ function setVehicleProperties(vehicle, props)
if isStarted(QBExport) and not isStarted(QBXExport) then if isStarted(QBExport) and not isStarted(QBXExport) then
Core.Functions.SetVehicleProperties(vehicle, props) Core.Functions.SetVehicleProperties(vehicle, props)
debugPrint("^6Bridge^7: ^2Setting Vehicle Properties ^7[^6"..QBExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..props.model.."^7] - [^3"..props.plate.."^7]") debugPrint("^6Bridge^7: ^2Setting Vehicle Properties ^7[^6"..QBExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..props.model.."^7] - [^3"..props.plate.."^7]")
elseif isStarted(OXLibExport) then elseif isStarted(OXLibExport) then
lib.setVehicleProperties(vehicle, props, false) lib.setVehicleProperties(vehicle, props, false)
debugPrint("^6Bridge^7: ^2Setting Vehicle Properties ^7[^6"..OXLibExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..props.model.."^7] - [^3"..props.plate.."^7]") debugPrint("^6Bridge^7: ^2Setting Vehicle Properties ^7[^6"..OXLibExport.."^7] - [^3"..vehicle.."^7] - [^3"..GetEntityModel(vehicle).."^7/^3"..props.model.."^7] - [^3"..props.plate.."^7]")

View File

@@ -21,17 +21,25 @@
--- }) --- })
--- ``` --- ```
function registerCommand(command, options) function registerCommand(command, options)
if isStarted(OXLibExport) then if isStarted(OXLibExport) then
debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..OXLibExport, command) debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..OXLibExport, command)
lib.addCommand(command, { help = options[1], restricted = options[5] and "group."..options[5] or nil }, options[4]) lib.addCommand(command, { help = options[1], restricted = options[5] and "group."..options[5] or nil }, options[4])
elseif isStarted(QBExport) and not isStarted(QBXExport) then elseif isStarted(QBExport) and not isStarted(QBXExport) then
debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..QBExport, command) debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..QBExport, command)
Core.Commands.Add(command, options[1], options[2], options[3], options[4], options[5] or nil) Core.Commands.Add(command, options[1], options[2], options[3], options[4], options[5] or nil)
elseif isStarted(RSGExport) then
debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7"..RSGExport, command)
Core.Commands.Add(command, options[1], options[2], options[3], options[4], options[5] or nil)
elseif isStarted(ESXExport) then elseif isStarted(ESXExport) then
debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7ESX Legacy", command) debugPrint("^6Bridge^7: ^2Registering ^3Command^2 with ^7ESX Legacy", command)
ESX.RegisterCommand(command, options[5] or 'admin', function(xPlayer, args, showError) ESX.RegisterCommand(command, options[5] or 'admin', function(xPlayer, args, showError)
options[4](xPlayer.source, args, showError) options[4](xPlayer.source, args, showError)
end, false, { help = options[1] }) end, false, { help = options[1] })
end end
end end
@@ -59,9 +67,10 @@ function registerStash(name, label, slots, weight, owner, coords)
if isStarted(OXInv) then if isStarted(OXInv) then
debugPrint("^6Bridge^7: ^2Registering ^3OX ^2Stash^7:", name, label, owner or nil) debugPrint("^6Bridge^7: ^2Registering ^3OX ^2Stash^7:", name, label, owner or nil)
exports[OXInv]:RegisterStash(name, label, slots or 50, weight or 4000000, owner or nil) exports[OXInv]:RegisterStash(name, label, slots or 50, weight or 4000000, owner or nil)
elseif isStarted(QSInv) then elseif isStarted(QSInv) then
debugPrint("^6Bridge^7: ^2Registering ^3QS ^2Stash^7:", name, label) debugPrint("^6Bridge^7: ^2Registering ^3QS ^2Stash^7:", name, label)
exports[QSInv]:RegisterStash(nil, name, slots or 50, weight or 4000000) exports[QSInv]:RegisterStash(name, label, slots or 50, weight or 4000000)
--elseif isStarted(CoreInv) then --elseif isStarted(CoreInv) then
-- debugPrint("^6Bridge^7: ^2Registering ^3CoreInv ^2Stash^7:", name, label) -- debugPrint("^6Bridge^7: ^2Registering ^3CoreInv ^2Stash^7:", name, label)
@@ -70,6 +79,11 @@ function registerStash(name, label, slots, weight, owner, coords)
elseif isStarted(OrigenInv) then elseif isStarted(OrigenInv) then
debugPrint("^6Bridge^7: ^2Registering ^3OrigenInv ^2Stash^7:", name, label) debugPrint("^6Bridge^7: ^2Registering ^3OrigenInv ^2Stash^7:", name, label)
exports["origen_inventory"]:registerStash(name, label, slots or 50, weight or 4000000) exports["origen_inventory"]:registerStash(name, label, slots or 50, weight or 4000000)
elseif isStarted(TgiannInv) then
debugPrint("^6Bridge^7: ^2Registering ^3TgiannInv ^2Stash^7:", name, label)
exports[TgiannInv]:RegisterStash(name, label, slots or 50, weight or 4000000)
end end
end end
@@ -86,13 +100,15 @@ if isServer() then
--- @param coords table|nil (Optional) Stash coordinates. --- @param coords table|nil (Optional) Stash coordinates.
--- @usage --- @usage
--- ```lua --- ```lua
--- TriggerEvent(getScript()..":server:makeOXStash", name, label, slots, weight, owner, coords) --- TriggerEvent(getScript()..":server:makeOXStash", name, label, slots, weight, owner, coords, token)
--- ``` --- ```
RegisterNetEvent(getScript()..":server:makeOXStash", function(name, label, slots, weight, owner, coords, token) RegisterNetEvent(getScript()..":server:makeOXStash", function(name, label, slots, weight, owner, coords, token)
local src = source or nil local src = source or nil
if src then if src then
debugPrint("^1Auth^7: ^2Auth token received^7, ^2checking against server cache^7..") debugPrint("^1Auth^7: ^2Auth token received^7, ^2checking against server cache^7..")
if token ~= validTokens[src] then if token == nil then
debugPrint("^1Auth^7: ^1Token not received^7")
elseif token ~= validTokens[src] then
debugPrint("^1Auth^7: ^1Tokens don't match! ^7", token, validTokens[src]) debugPrint("^1Auth^7: ^1Tokens don't match! ^7", token, validTokens[src])
else else
debugPrint("^1Auth^7: ^2Client and Server Auth tokens match^7!", token, validTokens[src]) debugPrint("^1Auth^7: ^2Client and Server Auth tokens match^7!", token, validTokens[src])

View File

@@ -13,6 +13,7 @@ Exports = {
CoreInv = "core_inventory", CoreInv = "core_inventory",
CodeMInv = "codem-inventory", CodeMInv = "codem-inventory",
OrigenInv = "origen_inventory", OrigenInv = "origen_inventory",
TgiannInv = "tgiann-inventory",
OXLibExport = "ox_lib", OXLibExport = "ox_lib",
@@ -29,7 +30,12 @@ Exports = {
-- Required variables -- Required variables
debugMode = Config.System.Debug debugMode = Config.System.Debug
-- Check server convars for hard set defaults QBInvNew = true
InventoryWeight = 120000
-- [[ Server.Cfg Convar Check ]]--
-- Check server convars for hard set defaults, otherwise it uses per script configurations
if Config and Config.System then if Config and Config.System then
if Config.System.Debug then if Config.System.Debug then
if GetConvar("jim_DisableDebug", "false") == "true" then if GetConvar("jim_DisableDebug", "false") == "true" then
@@ -51,28 +57,28 @@ if Config and Config.System then
end end
end end
QBInvNew = true
InventoryWeight = 120000
-- Testing loading the core files here instead of in fxmanifests -- Testing loading the core files here instead of in fxmanifests
--for k, v in pairs({ -- This is a specific load order -- Forcefully loads the files and quietly, compared to fxmanifest complaining if they don't exist
-- [Exports.OXLibExport] = "init.lua", -- This may be better button would require more refinement maybe
-- [Exports.OXCoreExport] = "lib/init.lua", --[[
-- [Exports.ESXExport] = "imports.lua", for k, v in pairs({ -- This is a specific load order
-- [Exports.QBXExport] = "modules/playerdata.lua", [Exports.OXLibExport] = "init.lua",
--}) do [Exports.OXCoreExport] = "lib/init.lua",
-- if GetResourceState(k) == "started" then [Exports.ESXExport] = "imports.lua",
-- print("^5Loading^7: '"..k.."/"..v.."' ^2into ^7'"..GetCurrentResourceName().."' ...") [Exports.QBXExport] = "modules/playerdata.lua",
-- local fileLoader = assert(load(LoadResourceFile(k, (v)), ('@@'..k..'/'..v))) }) do
-- fileLoader() if GetResourceState(k) == "started" then
-- print("^2Success^7: ^2loaded ^1Core ^2file^7: ^3"..k.."^7/^3"..(v):gsub("/", "^7/^3"):gsub("%.lua", "^7.lua").."^7") print("^5Loading^7: '"..k.."/"..v.."' ^2into ^7'"..GetCurrentResourceName().."' ...")
-- else local fileLoader = assert(load(LoadResourceFile(k, (v)), ('@@'..k..'/'..v)))
-- if debugMode then fileLoader()
-- print("^3Warning^7: ^3"..k.." ^2not found^7, ^2skipping") print("^2Success^7: ^2loaded ^1Core ^2file^7: ^3"..k.."^7/^3"..(v):gsub("/", "^7/^3"):gsub("%.lua", "^7.lua").."^7")
-- end else
-- end if debugMode then
--end print("^3Warning^7: ^3"..k.." ^2not found^7, ^2skipping")
end
end
end
]]
-- Load files here into the invoking script -- Load files here into the invoking script
for _, v in pairs({ -- This is a specific load order for _, v in pairs({ -- This is a specific load order

View File

@@ -1 +1 @@
2.0.02 2.0.05