Compare commits

...

32 Commits

Author SHA1 Message Date
Jim Shield
e84a9f1c60 Version Bump
`2.1.08` - `2.1.09`
2025-11-10 17:07:58 +00:00
Jim Shield
12c6648767 Merge pull request #64 from rukshanchamindu/patch-1 2025-11-10 17:00:52 +00:00
RuksH4n
9a57f852b1 fix: replace boolean logic with math.max for tempCarryTable aggregation
Replaced the old `and/or` logic in the recipe ingredient loop with `math.max`
to ensure tempCarryTable[k] always stores numeric values instead of booleans.
This prevents "attempt to compare boolean with number" errors during crafting
data aggregation.
2025-11-07 21:59:18 +05:30
Jim Shield
61aae4fa92 Change esx get status to statebag check 2025-11-03 22:37:55 +00:00
Jim Shield
606ad1d124 Update notify.lua 2025-11-02 22:43:02 +00:00
Jim Shield
d2bf1c01bf Force slot to number
For inventories that report slot number as a string, this forces it to a number
2025-11-01 22:48:18 +00:00
Jim Shield
8f31c740bc Update cameras.lua 2025-10-29 03:05:10 +00:00
Jim Shield
f9b9de0b57 Make distExploitCheck() more verbose
When accessing a shop or stash will now attempt to print the nearest coordinates it can find and how far the player is from it

This is more a debugging thing
2025-10-27 21:39:13 +00:00
Jim Shield
6f0949da21 Fix crafting allowing movement with progressBar 2025-10-26 21:28:14 +00:00
Jim Shield
27a0e147fb Add exploit check for removing items
Add a check for if a person is attempting to trigger remove minus of an item (possibly trying to give them selves items)

this will stop it in its tracks and warn the server console what happened
2025-10-24 21:40:26 +01:00
Jim Shield
960f73ad6d Actual working checks for hasJob()
`goto skip` is weird.
2025-10-24 14:25:17 +01:00
Jim Shield
18ecc1429e as nil value check for hasJob() function
Should now properly check if the player hasn't got `playerData` from loading in fully and just return that they don't have the requested job
2025-10-24 13:23:05 +01:00
Jim Shield
a9403e5513 Fix qbox getPlayer hunger and thirst calls 2025-10-23 13:19:04 +01:00
Jim Shield
9ec7bddfe6 Merge pull request #61 from GhostInLowGear/GhostInLowGear-patch-1 2025-10-22 16:40:03 +01:00
Jim Shield
d46aa8c2cb Merge pull request #60 from oosayeroo/main 2025-10-22 16:38:57 +01:00
Jim Shield
0793554855 Merge pull request #59 from desypher/rcore_clothing_support 2025-10-22 16:36:49 +01:00
GhostInLowGear
9efc3c94cd Update playerfunctions.lua
Add tgg billing
2025-10-22 11:34:06 -04:00
Jim Shield
7e320bcb99 Version Bump
`2.1.07` - `2.1.08`
2025-10-21 16:09:33 +01:00
oosayeroo
9c66499fab Merge branch 'jimathy:main' into main 2025-10-21 11:14:30 +01:00
Jim Shield
54f96f7e77 When using lookEnt() also face players head 2025-10-20 20:10:02 +01:00
Jim Shield
dffed24fb3 Add callback to get society balance in client side 2025-10-18 23:12:38 +01:00
Jim Shield
aae2bd5021 Fix debugMode never being set after last change 2025-10-18 12:16:05 +01:00
oosayeroo
258a510452 add hunger + thirst to getPlayer
- added for esx, qb, qbox, rsg
2025-10-14 14:06:16 +01:00
oosayeroo
2ac3843fb2 Merge branch 'jimathy:main' into main 2025-10-14 09:33:15 +01:00
Jim Shield
732b07c957 Create check for broken/missing config file 2025-10-14 03:51:22 +01:00
Jim Shield
8e8010f837 Start adding stashEditMetadata()
Need help with this one

`ox_inv` provides an easy function for this but most inventories don't seem to support editing specific items in a stash

`qb-inv` currently you need to forcibly edit the sql

others I'm I'm not too sure about yet
2025-10-13 12:33:04 +01:00
desypher
696b469309 Added support for rcore_clothing in wardrobe
I have tested this on my local, feel free to merge it if you're happy to add support for rcore_clothing!
2025-10-12 01:15:30 +02:00
Jim Shield
e05815cfbd Fix getStash forcing fallback functions to run 2025-10-11 17:23:26 +01:00
oosayeroo
8d48b0d692 Merge branch 'jimathy:main' into main 2025-10-07 15:23:02 +01:00
oosayeroo
40ca0eb04d Merge branch 'jimathy:main' into main 2025-10-06 15:37:57 +01:00
oosayeroo
f53f29a4b2 Merge branch 'jimathy:main' into main 2025-10-03 13:42:13 +01:00
oosayeroo
2cf80881e4 Input.lua : allow default in oxlib "number" type 2025-09-25 02:17:48 +01:00
14 changed files with 252 additions and 99 deletions

22
.gitattributes vendored
View File

@@ -1,12 +1,16 @@
# VCS / CI noise # VCS / CI noise
.gitattributes export-ignore /.gitattributes export-ignore
.gitignore export-ignore /.gitignore export-ignore
.github/** export-ignore /.gitmodules export-ignore
.gitmodules export-ignore /.github export-ignore
# Dev tooling/config # Dev tooling/config
.vscode/** export-ignore /.vscode export-ignore
*.code-workspace export-ignore *.code-workspace export-ignore
.editorconfig export-ignore /.editorconfig export-ignore
.eslintrc* export-ignore /.eslintrc* export-ignore
.prettier* export-ignore /.prettier* export-ignore
# Omit release-only helpers
/server/restaurantchecker.lua export-ignore
/server/installitems.lua export-ignore

View File

@@ -1,6 +1,6 @@
name "Jim_Bridge" name "Jim_Bridge"
author "Jimathy" author "Jimathy"
version "2.1.07" version "2.1.09"
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.'
@@ -11,7 +11,11 @@ files {
'starter.lua', 'starter.lua',
'shared/*.lua', 'shared/*.lua',
'shared/make/*.lua', 'shared/make/*.lua',
'shared/auth/*.lua',
'shared/make/*.lua',
'shared/modules/*.lua',
'shared/scaleforms/*.lua', 'shared/scaleforms/*.lua',
'shared/wrappers/*.lua',
} }
-- Version checker -- Version checker

View File

@@ -137,21 +137,31 @@ function distExploitCheck(table, src)
return false return false
end end
local maxDist = 10.0
local nearestDist = 999999.0
local nearestCoords = nil
local ped = src and GetPlayerPed(src) or PlayerPedId() local ped = src and GetPlayerPed(src) or PlayerPedId()
local srcCoords = GetEntityCoords(ped) local srcCoords = GetEntityCoords(ped)
local allow = false
for i = 1, #table do for i = 1, #table do
if #(table[i].xy - srcCoords.xy) <= 10 then
local dist2d = #(table[i].xy - srcCoords.xy)
-- Track the nearestDist
if dist2d < nearestDist then
nearestDist = dist2d
nearestCoords = table[i]
end
if dist2d <= maxDist then
debugPrint("^1Found location^7: ^3"..nearestDist.." ^7away from player - "..formatCoord(nearestCoords))
return true return true
else
allow = false
end end
end end
if not allow then print(src and ("^1Src ^3"..src.." ") or "", "^1Tried to open a registered shop/stash from over the distance limit^7")
print(src and ("^1Src ^3"..src.." ") or "", "^1Tried to open a registered shop/stash from over the distance limit^7") print("^1Nearest Possible Location^7: ^3"..nearestDist.." ^7away from player - "..formatCoord(nearestCoords))
return false return false
end
end end

View File

@@ -121,7 +121,7 @@ function craftingMenu(data)
for k, v in pairs(Recipes[i]) do for k, v in pairs(Recipes[i]) do
if not excludeKeys[k] then if not excludeKeys[k] then
if not Recipes[i].amount then Recipes[i].amount = 1 end if not Recipes[i].amount then Recipes[i].amount = 1 end
tempCarryTable[k] = tempCarryTable[k] and (tempCarryTable[k] < Recipes[i].amount) or Recipes[i].amount tempCarryTable[k] = math.max(tempCarryTable[k] or 0, Recipes[i].amount)
end end
end end
end end
@@ -420,7 +420,7 @@ function makeItem(origData)
for k, v in pairs(data.craft[data.item]) do for k, v in pairs(data.craft[data.item]) do
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")
stopCam(0) stopCam(100)
ClearPedTasks(Ped) ClearPedTasks(Ped)
if canReturn then craftingMenu(origData) end if canReturn then craftingMenu(origData) end
CraftLock = false CraftLock = false
@@ -434,6 +434,7 @@ function makeItem(origData)
anim = "putdown_low", anim = "putdown_low",
flag = 49, flag = 49,
icon = k, icon = k,
disableMovement = true,
}) then }) then
TriggerEvent((isStarted(QBInv) and QBInvNew and "qb-" or "")..'inventory:client:ItemBox', Items[k], "use", v) TriggerEvent((isStarted(QBInv) and QBInvNew and "qb-" or "")..'inventory:client:ItemBox', Items[k], "use", v)
else else
@@ -455,6 +456,7 @@ function makeItem(origData)
anim = anim, anim = anim,
flag = 49, flag = 49,
icon = data.item, icon = data.item,
disableMovement = true,
request = true, request = true,
}) then }) then
TriggerServerEvent(getScript()..":Crafting:GetItem", data.item, data.craft, data.stashName, metadata, currentToken) TriggerServerEvent(getScript()..":Crafting:GetItem", data.item, data.craft, data.stashName, metadata, currentToken)
@@ -487,6 +489,7 @@ function makeItem(origData)
anim = anim, anim = anim,
flag = 49, flag = 49,
icon = data.item, icon = data.item,
disableMovement = true,
request = true, request = true,
}) then }) then
data.craft.amount *= craftAmount data.craft.amount *= craftAmount
@@ -524,7 +527,7 @@ function makeItem(origData)
end end
--Wait(500) --Wait(500)
stopCam(0) stopCam(100)
CraftLock = false CraftLock = false
if canReturn then craftingMenu(origData) end if canReturn then craftingMenu(origData) end
ClearPedTasks(Ped) ClearPedTasks(Ped)
@@ -593,4 +596,5 @@ RegisterNetEvent(getScript()..":Crafting:GetItem", function(ItemMake, craftable,
-- Optionally, add experience here: -- Optionally, add experience here:
-- for example: -- for example:
-- if isStarted("core_skills") then exports["core_skills"]:AddExperience(src, 2) end -- if isStarted("core_skills") then exports["core_skills"]:AddExperience(src, 2) end
end) end)

View File

@@ -638,6 +638,8 @@ function lookEnt(entity)
debugPrint("^6Bridge^7: ^2Turning Player to^7: '^6"..formatCoord(entity).."^7'") debugPrint("^6Bridge^7: ^2Turning Player to^7: '^6"..formatCoord(entity).."^7'")
Wait(1500) Wait(1500)
end end
-- Make players head face the coord for 5 seconds
TaskLookAtCoord(ped, entity.x, entity.y, entity.z, 5000, 1, 1)
else else
if DoesEntityExist(entity) then if DoesEntityExist(entity) then
local entCoords = GetEntityCoords(entity) local entCoords = GetEntityCoords(entity)
@@ -646,6 +648,9 @@ function lookEnt(entity)
debugPrint("^6Bridge^7: ^2Turning Player to^7: '^6"..entity.."^7' - '"..formatCoord(entCoords).."^7'") debugPrint("^6Bridge^7: ^2Turning Player to^7: '^6"..entity.."^7' - '"..formatCoord(entCoords).."^7'")
Wait(1500) Wait(1500)
end end
-- Make players head face the coord for 5 seconds
TaskLookAtEntity(ped, entity, 5000, 1, 1)
end end
end end
end end

View File

@@ -64,6 +64,7 @@ function createInput(title, opts)
label = (opts[i].label or opts[i].text)..(opts[i].txt and " - "..opts[i].txt or ""), label = (opts[i].label or opts[i].text)..(opts[i].txt and " - "..opts[i].txt or ""),
isRequired = opts[i].isRequired, isRequired = opts[i].isRequired,
name = opts[i].name, name = opts[i].name,
default = opts[i].default,
options = opts[i].options, options = opts[i].options,
} }
end end

View File

@@ -103,6 +103,10 @@ local InvFunc = {
-- Add fallback if ox can't find the stash and returns a boolean -- Add fallback if ox can't find the stash and returns a boolean
return type(stash) == "table" and stash.items or {} return type(stash) == "table" and stash.items or {}
end, end,
stashEditMetadata =
function(stash, slot, metadata)
exports[OXInv]:SetMetadata(stash, slot, metadata)
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
@@ -207,6 +211,13 @@ local InvFunc = {
function(stashName) function(stashName)
return exports[CoreInv]:getInventory(stashName) return exports[CoreInv]:getInventory(stashName)
end, end,
stashEditMetadata =
function(stash, slot, metadata)
local itemData = exports[CoreInv]:getItemBySlot(stash, slot) or {}
if itemData then
exports[CoreInv]:setItem(stash, itemData.item, itemData.count, metadata)
end
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
-- --
@@ -306,6 +317,10 @@ local InvFunc = {
function(stashName) function(stashName)
return exports[OrigenInv]:getInventory(stashName) return exports[OrigenInv]:getInventory(stashName)
end, end,
stashEditMetadata =
function(stash, slot, metadata)
exports[OrigenInv]:setMetadata(stash, slot, metadata)
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
-- --
@@ -416,6 +431,10 @@ local InvFunc = {
function(stashName) function(stashName)
return exports[CodeMInv]:GetStashItems(stashName) return exports[CodeMInv]:GetStashItems(stashName)
end, end,
stashEditMetadata =
function(stash, slot, metadata)
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
-- --
@@ -529,6 +548,10 @@ local InvFunc = {
function(stashName) function(stashName)
return exports[TgiannInv]:GetSecondaryInventoryItems("stash", stashName) return exports[TgiannInv]:GetSecondaryInventoryItems("stash", stashName)
end, end,
stashEditMetadata =
function(stash, slot, metadata)
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
-- --
@@ -692,6 +715,10 @@ local InvFunc = {
return result and json.decode(result) or {} return result and json.decode(result) or {}
end end
end, end,
stashEditMetadata =
function(stash, slot, metadata)
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
-- --
@@ -880,6 +907,23 @@ local InvFunc = {
end end
end end
end, end,
stashEditMetadata =
function(stash, slot, metadata)
local stashData = getStash(stash)
for i = 1, #stashData do
if stashData[i].slot == slot then
print("found slot")
stashData[i].info = metadata
end
jsonPrint(stashData[i])
end
debugPrint("^6Bridge^7: ^3stashEditMetadata^7: ^2Saving ^3QB^2 stash '^6"..stash.."^7'")
MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stash,
['items'] = json.encode(stashData)
})
end,
stashAddItem = stashAddItem =
function(stashItems, stashName, items) function(stashItems, stashName, items)
-- --
@@ -1612,6 +1656,10 @@ RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount,
local invName = "" local invName = ""
if give == 0 or give == false then if give == 0 or give == false then
if remamount < 0 then
print("^1Error^7: ^7src - ^1Client tried to remove a minus number of item ^7- "..item)
return
end
if not hasItem(item, amount or 1, src) then if not hasItem(item, amount or 1, src) then
dupeWarn(src, item, amount) dupeWarn(src, item, amount)
@@ -1759,6 +1807,7 @@ function getItemMetadata(item, slot, src)
if chosenSlot then if chosenSlot then
for k, v in pairs(itemcheck) do for k, v in pairs(itemcheck) do
v.slot = tonumber(v.slot)
if v.name == item and v.slot == chosenSlot then if v.name == item and v.slot == chosenSlot then
lowestSlot = v.slot lowestSlot = v.slot
metadata = itemcheck[k].info or itemcheck[k].metadata or {} metadata = itemcheck[k].info or itemcheck[k].metadata or {}
@@ -1767,6 +1816,7 @@ function getItemMetadata(item, slot, src)
end end
else else
for k, v in pairs(itemcheck) do for k, v in pairs(itemcheck) do
v.slot = tonumber(v.slot)
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
@@ -2246,6 +2296,16 @@ function openStash(data)
end end
function stashEditMetadata(stash, slot, metadata)
for i = 1, #InvFunc do
local inv = InvFunc[i]
if isStarted(inv.invName) then
inv.stashEditMetadata(stash, slot, metadata)
return
end
end
end
-- Wrapper function for opening stash from the server. -- Wrapper function for opening stash from the server.
-- Messy but not much else I can do about it. -- Messy but not much else I can do about it.
RegisterNetEvent(getScript()..":server:openServerStash", function(data) RegisterNetEvent(getScript()..":server:openServerStash", function(data)
@@ -2315,7 +2375,7 @@ function getStash(stashName)
if isStarted(inv.invName) then if isStarted(inv.invName) then
debugPrint("^6Bridge^7: ^2Retrieving ^3"..inv.invName.." ^2Stash^7:", stashName) debugPrint("^6Bridge^7: ^2Retrieving ^3"..inv.invName.." ^2Stash^7:", stashName)
stashItems = inv.getStash(stashName) stashItems = inv.getStash(stashName)
break goto skip
end end
end end
@@ -2331,7 +2391,7 @@ function getStash(stashName)
end end
end end
::skip::
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()]

View File

@@ -19,7 +19,7 @@ local camCache = {}
-- ``` -- ```
function createTempCam(ent, coords) function createTempCam(ent, coords)
local camID = nil local camID = nil
if Config.Crafting?.craftCam or Config.System.enableCam then if (Config.Crafting and Config.Crafting.craftCam) or Config.System.enableCam then
-- if not ent or coords are provided, make a basic camera to control later -- if not ent or coords are provided, make a basic camera to control later
if not ent and not coords then if not ent and not coords then
@@ -171,7 +171,7 @@ function stopTempCam(renderTime)
clearLoadLocation() clearLoadLocation()
Wait(renderTime or 0) Wait(renderTime or 500)
for i = 1, #camCache do for i = 1, #camCache do
DestroyCam(camCache[i], true) DestroyCam(camCache[i], true)
end end

View File

@@ -122,7 +122,7 @@ function GetPlayer(source)
return framework.GetPlayer(source) return framework.GetPlayer(source)
end end
end end
return nil return {}
end end
------------------------------------------------------------- -------------------------------------------------------------

View File

@@ -111,7 +111,10 @@ local notifyFunc = {
--- triggerNotify("Alert", "You have been warned for misconduct.", "error", playerId) --- triggerNotify("Alert", "You have been warned for misconduct.", "error", playerId)
--- ``` --- ```
function triggerNotify(title, message, type, src) function triggerNotify(title, message, type, src)
if not Config.System?.Notify then debugPrint("Notify triggered but not set up") return end if not Config or not Config.System or not Config.System.Notify then
print("Notify triggered but not set up")
return
end
if src then if src then
notifyFunc[Config.System.Notify].server(title, message, type, src) notifyFunc[Config.System.Notify].server(title, message, type, src)

View File

@@ -221,6 +221,10 @@ local billPlayerFunc = {
function(data) function(data)
TriggerEvent("codem-billing:client:OpenMenu") TriggerEvent("codem-billing:client:OpenMenu")
end, end,
tgg =
function(data)
exports["tgg-billing"]:OpenBillingMenu()
end,
} }
--- BillPlayer --- BillPlayer
@@ -388,41 +392,6 @@ end
--- ``` --- ```
function ConsumeSuccess(itemName, type, data) function ConsumeSuccess(itemName, type, data)
print("^1Deprecated function 'ConsumeSuccess' called, please update your scripts^7") print("^1Deprecated function 'ConsumeSuccess' called, please update your scripts^7")
--local hunger = data and data.hunger or Items[itemName].hunger
--local thirst = data and data.thirst or Items[itemName].thirst
--
--ExecuteCommand("e c")
--removeItem(itemName, 1)
--
--if isStarted(ESXExport) then
-- if hunger then
-- TriggerServerEvent(getScript()..":server:setNeed", "hunger", tonumber(hunger) * 10000)
-- end
-- if thirst then
-- TriggerServerEvent(getScript()..":server:setNeed", "thirst", tonumber(thirst) * 10000)
-- end
--else
-- if hunger then
-- TriggerServerEvent(getScript()..":server:setNeed", "hunger", Core.Functions.GetPlayerData().metadata["hunger"] + tonumber(hunger))
-- end
-- if thirst then
-- TriggerServerEvent(getScript()..":server:setNeed", "thirst", Core.Functions.GetPlayerData().metadata["thirst"] + tonumber(thirst))
-- end
--end
--
--if type == "alcohol" then
-- alcoholCount = (alcoholCount or 0) + 1
-- if alcoholCount > 1 and alcoholCount < 4 then
-- TriggerEvent("evidence:client:SetStatus", "alcohol", 200)
-- elseif alcoholCount >= 4 then
-- TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200)
-- AlienEffect()
-- end
--end
--
--if Config.Reward then
-- getRandomReward(itemName)
--end
end end
------------------------------------------------------------- -------------------------------------------------------------
@@ -435,19 +404,26 @@ local hasGroupFunc = {
function(group, grade, src) function(group, grade, src)
local hasJobFlag, duty = false, true local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src) local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job local jobInfo, gangInfo = nil, nil
if jobinfo and jobinfo.name == group then if next(playerInfo) then
jobInfo = playerInfo.job
gangInfo = playerInfo.gang
if playerInfo.PlayerData then
jobInfo = playerInfo.PlayerData.job
gangInfo = playerInfo.PlayerData.gang
end
end
if jobInfo and jobInfo.name == group then
hasJobFlag = true hasJobFlag = true
duty = jobinfo.onduty duty = jobInfo.onduty
if grade and not (grade <= jobinfo.grade.level) then if grade and not (grade <= jobInfo.grade.level) then
hasJobFlag = false hasJobFlag = false
end end
return hasJobFlag, duty return hasJobFlag, duty
end end
local ganginfo = playerInfo.gang or playerInfo.PlayerData.gang if gangInfo and gangInfo.name == group then
if ganginfo and ganginfo.name == group then
hasJobFlag = true hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then if grade and not (grade <= gangInfo.grade.level) then
hasJobFlag = false hasJobFlag = false
end end
return hasJobFlag, duty return hasJobFlag, duty
@@ -461,21 +437,29 @@ local hasGroupFunc = {
function(group, grade, src) function(group, grade, src)
local hasJobFlag, duty = false, true local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src) local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job local jobInfo, gangInfo = nil, nil
if jobinfo and jobinfo.name == group then if next(playerInfo) then
jobInfo = playerInfo.job
gangInfo = playerInfo.gang
if playerInfo.PlayerData then
jobInfo = playerInfo.PlayerData.job
gangInfo = playerInfo.PlayerData.gang
end
end
if jobInfo and jobInfo.name == group then
hasJobFlag = true hasJobFlag = true
duty = jobinfo.onduty duty = jobInfo.onduty
if grade and not (grade <= jobinfo.grade.level) then if grade and not (grade <= jobInfo.grade.level) then
hasJobFlag = false hasJobFlag = false
end end
end end
local ganginfo = playerInfo.gang or playerInfo.PlayerData.gang if gangInfo and gangInfo.name == group then
if ganginfo and ganginfo.name == group then
hasJobFlag = true hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then if grade and not (grade <= gangInfo.grade.level) then
hasJobFlag = false hasJobFlag = false
end end
end end
::skip::
return hasJobFlag, duty return hasJobFlag, duty
end, end,
}, },
@@ -504,9 +488,8 @@ local hasGroupFunc = {
hasGroup = hasGroup =
function(group, grade, src) function(group, grade, src)
local hasJobFlag, duty = false, true local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src) local playerInfo = GetPlayer(src)
local info = playerInfo.job local info = playerInfo and playerInfo.job
while not info do while not info do
info = GetPlayer(src).job info = GetPlayer(src).job
Wait(100) Wait(100)
@@ -514,7 +497,6 @@ local hasGroupFunc = {
if info.name == group then if info.name == group then
hasJobFlag = true hasJobFlag = true
end end
return hasJobFlag, duty return hasJobFlag, duty
end, end,
}, },
@@ -524,18 +506,25 @@ local hasGroupFunc = {
function(group, grade, src) function(group, grade, src)
local hasJobFlag, duty = false, true local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src) local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job local jobInfo, gangInfo = nil, nil
if jobinfo and jobinfo.name == group then if next(playerInfo) then
jobInfo = playerInfo.job
gangInfo = playerInfo.gang
if playerInfo.PlayerData then
jobInfo = playerInfo.PlayerData.job
gangInfo = playerInfo.PlayerData.gang
end
end
if jobInfo and jobInfo.name == group then
hasJobFlag = true hasJobFlag = true
duty = jobinfo.onduty duty = jobInfo.onduty
if grade and not (grade <= jobinfo.grade.level) then if grade and not (grade <= jobInfo.grade.level) then
hasJobFlag = false hasJobFlag = false
end end
end end
local ganginfo = playerInfo.gang or playerInfo.PlayerData.gang if gangInfo and gangInfo.name == group then
if ganginfo and ganginfo.name == group then
hasJobFlag = true hasJobFlag = true
if grade and not (grade <= ganginfo.grade.level) then if grade and not (grade <= gangInfo.grade.level) then
hasJobFlag = false hasJobFlag = false
end end
end end
@@ -589,6 +578,7 @@ local getPlayerFunc = {
local Player = {} local Player = {}
local info = ESX.GetPlayerFromId(src) local info = ESX.GetPlayerFromId(src)
if not info then return {} end if not info then return {} end
Player = { Player = {
name = info.getName(), name = info.getName(),
cash = info.getMoney(), cash = info.getMoney(),
@@ -605,6 +595,8 @@ local getPlayerFunc = {
onDuty = info.job.onDuty, onDuty = info.job.onDuty,
--account = info.charinfo.account, --account = info.charinfo.account,
citizenId = info.identifier, citizenId = info.identifier,
hunger = Player(src).state.hunger or 0,
thirst = Player(src).state.thirst or 0,
} }
return Player return Player
end, end,
@@ -620,6 +612,7 @@ local getPlayerFunc = {
if v.name == "money" then cash = v.money end if v.name == "money" then cash = v.money end
if v.name == "bank" then bank = v.money end if v.name == "bank" then bank = v.money end
end end
Player = { Player = {
firstname = info.firstName, firstname = info.firstName,
lastname = info.lastName, lastname = info.lastName,
@@ -635,7 +628,9 @@ local getPlayerFunc = {
--account = info.charinfo.account, --account = info.charinfo.account,
citizenId = info.identifier, citizenId = info.identifier,
isDead = IsEntityDead(PlayerPedId()), isDead = IsEntityDead(PlayerPedId()),
isDown = IsPedDeadOrDying(PlayerPedId(), true) isDown = IsPedDeadOrDying(PlayerPedId(), true),
hunger = LocalPlayer.state.hunger or 0,
thirst = LocalPlayer.state.thirst or 0,
} }
return Player return Player
end, end,
@@ -719,6 +714,8 @@ local getPlayerFunc = {
isDead = info.PlayerData.metadata["isdead"], isDead = info.PlayerData.metadata["isdead"],
isDown = info.PlayerData.metadata["inlaststand"], isDown = info.PlayerData.metadata["inlaststand"],
charInfo = info.charinfo, charInfo = info.charinfo,
hunger = info.PlayerData.metadata["hunger"],
thirst = info.PlayerData.metadata["thirst"],
} }
return Player return Player
end, end,
@@ -747,6 +744,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"], isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"], isDown = info.metadata["inlaststand"],
charInfo = info.charinfo, charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
} }
return Player return Player
end, end,
@@ -778,6 +777,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"], isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"], isDown = info.metadata["inlaststand"],
charInfo = info.charinfo, charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
} }
end end
return Player return Player
@@ -809,6 +810,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"], isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"], isDown = info.metadata["inlaststand"],
charInfo = info.charinfo, charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
} }
return Player return Player
end, end,
@@ -840,6 +843,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"], isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"], isDown = info.metadata["inlaststand"],
charInfo = info.charinfo, charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
} }
end end
return Player return Player
@@ -871,6 +876,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"], isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"], isDown = info.metadata["inlaststand"],
charInfo = info.charinfo, charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
} }
return Player return Player
end, end,
@@ -972,6 +979,12 @@ local wardrobeFunc = {
TriggerEvent("illenium-appearance:client:openOutfitMenu") TriggerEvent("illenium-appearance:client:openOutfitMenu")
end, end,
}, },
{
name = "rcore_clothing",
openWardrobe = function()
TriggerEvent('rcore_clothing:openChangingRoom')
end,
}
} }
--- Opens the clothing customization menu --- Opens the clothing customization menu
@@ -984,4 +997,5 @@ function openClothing()
break break
end end
end end
end end

View File

@@ -264,3 +264,13 @@ function fundSociety(society, amount)
print("^1Error^7: ^3FundSociety^7: ^2No supported banking script found") print("^1Error^7: ^3FundSociety^7: ^2No supported banking script found")
end end
if isServer() then
createCallback(getScript()..":server:getAccount", function(source, society)
if society then
local getMoney = getSocietyAccount(society)
return getMoney
end
return 0
end)
end

View File

@@ -33,15 +33,51 @@ Exports = {
} }
-- Required variables -- Required variables
debugMode = Config.System.Debug debugMode = false
QBInvNew = true QBInvNew = true
InventoryWeight = 120000 InventoryWeight = 120000
-- Corruptted transfer file Checks -- Not Ready Yet ⚠️
--CreateThread(function()
-- local res = GetCurrentResourceName()
-- local ok, val = pcall(function()
-- return exports[res]:ping_encrypted()
-- end)
--
-- if not ok or val ~= "ok" then
-- print("\n^6===============================================================================")
-- print(("\n^1Corruption Warning^7: ^1[^7%s^1] Encrypted files failed to initialize.^7\n"):format(res))
-- print("^3Common causes^7:")
-- print(" • Possible corrupt files")
-- print(" • Damaged or partial upload (FTP/zip/unzip issue).")
-- print(" • Outdated artifact version\n")
-- print("^2How To Fix^7:")
-- print(" • Update your server artifact version")
-- print(" • Re-download asset from Keymaster")
-- print(" • Use WinSCP to upload")
-- print(" • Avoid editing any encrypted files")
-- print(" • Restart the server")
-- print("\n^6===============================================================================^7\n")
-- end
--end)
-- Missing/Broken Config file check
if not Config or not Config.System then
print("\n^6=================================================================================")
print("^6=================================================================================\n")
print(" ^1ERROR^7: jim_bridge ^1can't find the ^7Config^1 table in ^7"..GetCurrentResourceName())
print(" ^1It is either missing, or there is an error inside it stopping it from loading^7\n")
print("^6=================================================================================")
print("^6=================================================================================^7\n")
end
-- [[ Server.Cfg Convar Check ]]-- -- [[ Server.Cfg Convar Check ]]--
-- Check server convars for hard set defaults, otherwise it uses per script configurations -- 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
debugMode = Config.System.Debug
if Config.System.Debug then if Config.System.Debug then
if GetConvar("jim_DisableDebug", "false") == "true" then if GetConvar("jim_DisableDebug", "false") == "true" then
debugMode = false debugMode = false
@@ -50,7 +86,6 @@ if Config and Config.System then
Config.System.EventDebug = false Config.System.EventDebug = false
end end
end end
Config.System.Menu = GetConvar("jim_menuScript", Config.System.Menu) Config.System.Menu = GetConvar("jim_menuScript", Config.System.Menu)
Config.System.Notify = GetConvar("jim_notifyScript", Config.System.Notify or "gta") Config.System.Notify = GetConvar("jim_notifyScript", Config.System.Notify or "gta")
Config.System.ProgressBar = GetConvar("jim_progressBarScript", Config.System.ProgressBar or "gta") Config.System.ProgressBar = GetConvar("jim_progressBarScript", Config.System.ProgressBar or "gta")

View File

@@ -1,11 +1,14 @@
2.1.07 2.1.09
- Support for new embeded shop recipes - Add 100 wait for stopCam to reduce slow movement
- Add checks for targets set with minZ and maxZ set too high or low - Add support for rcore_clothing in openClothing() - Thanks desypher
- New target function `createPropTarget()` which creates a box target based on a prop model - Add hunger and thirst calls to getPlayer() - Thanks oosayeroo
- Add CodeM as option for billing - Add support for tgg-billing - Thanks GhostInLowGear
- Add 17Mov progressbar support - Fix hasJob() checking players who haven't logged in yet
- Fix OrigenInv calling OX_Inv to get player inventory - Add exploit possibility for removeItem with minus numbers
- Allow "Grab Boxes" to have custom slots and weight - Fix movement being allowed when crafting
- Make distExploitCheck() more verbose
- CodeM slot fix, force to number (because numbers are apparently strings)
- ESX change to check statebag for hunger and thirst info
https://github.com/jimathy/jim_bridge/releases/latest https://github.com/jimathy/jim_bridge/releases/latest