Compare commits

...

50 Commits

Author SHA1 Message Date
McKlean
949363c76a Merge pull request #70 from ChrisNewmanDev/main
Added Wasabi Banking
2026-03-03 23:36:42 +00:00
Chris Newman
d21f4b22b5 Added Wasabi Banking
Added Wasabi Banking to societybank.lua
2026-02-18 14:56:51 +02:00
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
Jim Shield
8594ba12ec Version Bump
`2.1.06` - `2.1.07`
2025-10-10 13:27:29 +01:00
Jim Shield
9f914bd497 Fix embedded store handling 2025-10-10 02:55:16 +01:00
Jim Shield
ad47836232 All grabbox to recieve slot and maxweight 2025-10-10 01:41:52 +01:00
Jim Shield
ae4637f9c4 Fix OrigenInv getPlayerInv() func calling OX_Inv 2025-10-10 00:40:35 +01:00
Jim Shield
a13284d0e0 Add support for 17mov progressbars 2025-10-09 20:12:05 +01:00
Jim Shield
98f8944a79 Add codem option for billing 2025-10-09 20:05:15 +01:00
Jim Shield
13b0f796ff createPropTarget also makes the prop 2025-10-09 20:04:54 +01:00
Jim Shield
b282d3393f make the auto check for minZ and maxZ more lenient 2025-10-09 17:55:54 +01:00
Jim Shield
180cc7b2a2 Add new createPropTarget() function
This is intended to help create automated prop based targets

Using the coordinates and specified prop models dimensions to create a correctly sized box target.

```lua
createPropTarget({
	name,
	target.prop.coords,
	target.prop.model,
}, options, 2.0)
```
2025-10-08 22:53:36 +01:00
Jim Shield
beb67b79a5 Auto adjust boxes with poorly set minZ and maxZ
Automatically adjusts box targets for custom locations that have been set wrong

if minZ is too high, adjust it
if maxZ is too low, adjust it

and warn the client that the target has to be adjusted.

Solves people opening tickets because they half edited a location without reading my docs
2025-10-07 21:07:31 +01:00
oosayeroo
8d48b0d692 Merge branch 'jimathy:main' into main 2025-10-07 15:23:02 +01:00
Jim Shield
c359bc4342 Support embedded shops in other scripts 2025-10-07 13:54:31 +01:00
oosayeroo
40ca0eb04d Merge branch 'jimathy:main' into main 2025-10-06 15:37:57 +01:00
Jim Shield
2404fff002 Version Bump
`2.1.05` - `2.1.06`
2025-10-06 02:33:37 +01:00
Jim Shield
03ca409bf3 Fix AnimSet loading for effects 2025-10-06 02:28:30 +01:00
Jim Shield
9a78b057dd Create alcohol.lua
Starting a "alcohol/drug" file to handle alcohol effects between scripts using exports to keep the "amount drunk/used" synchronized between scripts that use jim_bridge
2025-10-06 02:15:19 +01:00
Jim Shield
45f390c177 Update playerfunctions.lua 2025-10-04 22:10:39 +01:00
Jim Shield
803c612cbb Change stress to take away instead of increase 2025-10-04 19:12:50 +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
18 changed files with 726 additions and 117 deletions

22
.gitattributes vendored
View File

@@ -1,12 +1,16 @@
# VCS / CI noise
.gitattributes export-ignore
.gitignore export-ignore
.github/** export-ignore
.gitmodules export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/.gitmodules export-ignore
/.github export-ignore
# Dev tooling/config
.vscode/** export-ignore
*.code-workspace export-ignore
.editorconfig export-ignore
.eslintrc* export-ignore
.prettier* export-ignore
/.vscode export-ignore
*.code-workspace export-ignore
/.editorconfig export-ignore
/.eslintrc* 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"
author "Jimathy"
version "2.1.05"
version "2.1.09"
description "Framework Bridge By Jimathy"
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.'
@@ -11,7 +11,11 @@ files {
'starter.lua',
'shared/*.lua',
'shared/make/*.lua',
'shared/auth/*.lua',
'shared/make/*.lua',
'shared/modules/*.lua',
'shared/scaleforms/*.lua',
'shared/wrappers/*.lua',
}
-- Version checker

View File

@@ -137,21 +137,31 @@ function distExploitCheck(table, src)
return false
end
local maxDist = 10.0
local nearestDist = 999999.0
local nearestCoords = nil
local ped = src and GetPlayerPed(src) or PlayerPedId()
local srcCoords = GetEntityCoords(ped)
local allow = false
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
else
allow = false
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")
return false
end
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
end

View File

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

View File

@@ -7,7 +7,10 @@ function AlienEffect()
Wait(math.random(5000, 8000))
local Ped = PlayerPedId()
local animDict = "MOVE_M@DRUNK@VERYDRUNK"
loadAnimDict(animDict)
RequestAnimSet(animDict)
while not HasAnimSetLoaded(animDict) do
Wait(100)
end
SetPedCanRagdoll(Ped, true)
ShakeGameplayCam('DRUNK_SHAKE', 2.80)
SetTimecycleModifier("Drunk")

View File

@@ -638,6 +638,8 @@ function lookEnt(entity)
debugPrint("^6Bridge^7: ^2Turning Player to^7: '^6"..formatCoord(entity).."^7'")
Wait(1500)
end
-- Make players head face the coord for 5 seconds
TaskLookAtCoord(ped, entity.x, entity.y, entity.z, 5000, 1, 1)
else
if DoesEntityExist(entity) then
local entCoords = GetEntityCoords(entity)
@@ -646,6 +648,9 @@ function lookEnt(entity)
debugPrint("^6Bridge^7: ^2Turning Player to^7: '^6"..entity.."^7' - '"..formatCoord(entCoords).."^7'")
Wait(1500)
end
-- Make players head face the coord for 5 seconds
TaskLookAtEntity(ped, entity, 5000, 1, 1)
end
end
end
@@ -956,4 +961,18 @@ end
function GetEntityForwardVector(entity)
local heading = math.rad(GetEntityHeading(entity) + 90)
return vec3(math.cos(heading), math.sin(heading), 0.0)
end
function adjustMinMaxZ(coord, table)
local table = table
local adMinZ, adMaxZ = false, false
if table.minZ > (coord.z + 0.1) then
adMinZ = true
table.minZ = (coord.z - 1.05)
end
if table.maxZ < (coord.z - 0.1) then
adMinZ = true
table.maxZ = (coord.z + 0.80)
end
return table.minZ, table.maxZ, adMinZ, adMaxZ
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 ""),
isRequired = opts[i].isRequired,
name = opts[i].name,
default = opts[i].default,
options = opts[i].options,
}
end

View File

@@ -103,6 +103,10 @@ local InvFunc = {
-- Add fallback if ox can't find the stash and returns a boolean
return type(stash) == "table" and stash.items or {}
end,
stashEditMetadata =
function(stash, slot, metadata)
exports[OXInv]:SetMetadata(stash, slot, metadata)
end,
stashAddItem =
function(stashItems, stashName, items)
@@ -207,6 +211,13 @@ local InvFunc = {
function(stashName)
return exports[CoreInv]:getInventory(stashName)
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 =
function(stashItems, stashName, items)
--
@@ -272,15 +283,15 @@ local InvFunc = {
function(src)
local grabInv = nil
if src then
grabInv = exports[OXInv]:GetInventoryItems(src)
grabInv = exports[OrigenInv]:GetInventoryItems(src)
else
grabInv = exports[OXInv]:GetPlayerItems()
grabInv = exports[OrigenInv]:GetInventory()
end
return grabInv
end,
invImg =
function(item)
return "nui://"..OrigenInv.."/html/img/"..(Items[item].image or "")
return "nui://"..OrigenInv.."/html/images/"..(Items[item].image or "")
end,
openShop =
function(name, label, items)
@@ -306,6 +317,10 @@ local InvFunc = {
function(stashName)
return exports[OrigenInv]:getInventory(stashName)
end,
stashEditMetadata =
function(stash, slot, metadata)
exports[OrigenInv]:setMetadata(stash, slot, metadata)
end,
stashAddItem =
function(stashItems, stashName, items)
--
@@ -416,6 +431,10 @@ local InvFunc = {
function(stashName)
return exports[CodeMInv]:GetStashItems(stashName)
end,
stashEditMetadata =
function(stash, slot, metadata)
end,
stashAddItem =
function(stashItems, stashName, items)
--
@@ -529,6 +548,10 @@ local InvFunc = {
function(stashName)
return exports[TgiannInv]:GetSecondaryInventoryItems("stash", stashName)
end,
stashEditMetadata =
function(stash, slot, metadata)
end,
stashAddItem =
function(stashItems, stashName, items)
--
@@ -692,6 +715,10 @@ local InvFunc = {
return result and json.decode(result) or {}
end
end,
stashEditMetadata =
function(stash, slot, metadata)
end,
stashAddItem =
function(stashItems, stashName, items)
--
@@ -880,6 +907,23 @@ local InvFunc = {
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 =
function(stashItems, stashName, items)
--
@@ -1377,7 +1421,6 @@ function getPlayerInv(src)
grabInv = triggerCallback(getScript()..":GetESXInv")
end
end
--jsonPrint(grabInv)
end
if grabInv == nil then
@@ -1613,6 +1656,10 @@ RegisterNetEvent(getScript()..":server:toggleItem", function(give, item, amount,
local invName = ""
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
dupeWarn(src, item, amount)
@@ -1760,6 +1807,7 @@ function getItemMetadata(item, slot, src)
if chosenSlot then
for k, v in pairs(itemcheck) do
v.slot = tonumber(v.slot)
if v.name == item and v.slot == chosenSlot then
lowestSlot = v.slot
metadata = itemcheck[k].info or itemcheck[k].metadata or {}
@@ -1768,6 +1816,7 @@ function getItemMetadata(item, slot, src)
end
else
for k, v in pairs(itemcheck) do
v.slot = tonumber(v.slot)
if v.name == item then
if v.slot <= lowestSlot then
lowestSlot = v.slot
@@ -2247,6 +2296,16 @@ function openStash(data)
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.
-- Messy but not much else I can do about it.
RegisterNetEvent(getScript()..":server:openServerStash", function(data)
@@ -2316,7 +2375,7 @@ function getStash(stashName)
if isStarted(inv.invName) then
debugPrint("^6Bridge^7: ^2Retrieving ^3"..inv.invName.." ^2Stash^7:", stashName)
stashItems = inv.getStash(stashName)
break
goto skip
end
end
@@ -2332,7 +2391,7 @@ function getStash(stashName)
end
end
::skip::
if stashItems then
for _, item in pairs(stashItems) do
local itemInfo = Items[item.name:lower()]
@@ -2356,7 +2415,6 @@ function getStash(stashName)
end
debugPrint("^6Bridge^7: ^3GetStashItems^7: ^2Stash information for '^6"..stashName.."^7' retrieved")
end
--jsonPrint(items)
return items
end
@@ -2548,7 +2606,7 @@ if isServer() then
end)
end
RegisterNetEvent(getScript()..":openGrabBox", function(data)
RegisterNetEvent(getScript()..":openGrabBox", function(data, stashData)
local Ped = PlayerPedId()
local id = data.metadata and data.metadata.id or data.info and data.info.id or ""
@@ -2559,7 +2617,9 @@ RegisterNetEvent(getScript()..":openGrabBox", function(data)
openStash({
stash = id,
coords = GetEntityCoords(Ped)
coords = GetEntityCoords(Ped),
maxWeight = stashData and stashData.maxWeight or 100000,
slots = stashData and stashData.slots or 5,
})
end)
@@ -2781,7 +2841,6 @@ end
--- })
--- ```
function openShop(data)
--jsonPrint(data)
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
-- If shop has registered coords, limit players from being too far away from it when opening
@@ -2790,6 +2849,7 @@ function openShop(data)
print("^3Warning^7: ^2This isn't a registered store^1, refusing call^7")
return
end
if not distExploitCheck(exploitCheck) then
return
end
@@ -2799,6 +2859,27 @@ function openShop(data)
lookEnt(data.coords)
return
end
if not data.items.items[1] then
local shopMenu = {}
for k, v in pairs(data.items.items) do
local clonedTable = cloneTable(data)
local itemsTable = v.items or v.Items
shopMenu[#shopMenu+1] = {
header = v.header or k,
txt = countTable(itemsTable).." Products",
onSelect = function()
--clonedTable.originShop = data.shop
clonedTable.shop = data.shop.."_"..k
clonedTable.label = data.items.label.." - "..(v.header or k)
clonedTable.slots = #itemsTable
clonedTable.items.items = itemsTable
openShop(clonedTable)
end,
}
end
return openMenu(shopMenu, { header = data.items.label, canClose = true, })
end
for i = 1, #InvFunc do
local inv = InvFunc[i]
@@ -2823,7 +2904,7 @@ RegisterNetEvent(getScript()..':server:openServerShop', function(shopName)
-- If shop has registered coords, limit players from being too far away from it when opening
if not shopExploitCheck[shopName] then
print("^3Warning^7: ^1Source^7: ^3"..src.." ^1Tried to open a shop^7: ^2This isn't a registered store^1, refusing call^7")
print("^3Warning^7: ^1Source^7: ^3"..src.." ^1Tried to open a shop ^7'"..shopName.."' ^2This isn't a registered store^7, ^1refusing call^7")
return
end
if not distExploitCheck(shopExploitCheck[shopName], src) then
@@ -2865,8 +2946,18 @@ function registerShop(name, label, items, society, coords)
for i = 1, #InvFunc do
local inv = InvFunc[i]
if isStarted(inv.invName) then
inv.registerShop(name, label, items, society)
debugPrint("^6Bridge^7: ^2Registering ^5"..inv.invName.." ^3Store^7:", name, "^4Label^7: "..label, coords and "- ^4Coord^7: "..formatCoord(coords) or "NO COORD SET")
if not items[1] then
for k, v in pairs(items) do
inv.registerShop(name.."_"..k, label.." - "..(v.header or k), v.items, society)
shopExploitCheck[name.."_"..k] = shopExploitCheck[name.."_"..k] or {}
shopExploitCheck[name.."_"..k][#shopExploitCheck[name.."_"..k]+1] = coords
debugPrint("^6Bridge^7: ^2Registering ^5"..inv.invName.." ^3Store^7:", name.."_"..k, "^4Label^7: "..label.." - "..(v.header or k), coords and "- ^4Coord^7: "..formatCoord(coords) or "NO COORD SET")
end
else
inv.registerShop(name, label, items, society)
debugPrint("^6Bridge^7: ^2Registering ^5"..inv.invName.." ^3Store^7:", name, "^4Label^7: "..label, coords and "- ^4Coord^7: "..formatCoord(coords) or "NO COORD SET")
end
break
end
end

View File

@@ -19,7 +19,7 @@ local camCache = {}
-- ```
function createTempCam(ent, coords)
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 and not coords then
@@ -171,7 +171,7 @@ function stopTempCam(renderTime)
clearLoadLocation()
Wait(renderTime or 0)
Wait(renderTime or 500)
for i = 1, #camCache do
DestroyCam(camCache[i], true)
end

View File

@@ -206,6 +206,52 @@ local progressFunc = {
exports.jim_bridge:stopProgressBar()
end,
},
["17mov"] = {
start =
function(data)
if exports["17mov_Hud"]:StartProgress({
duration = debugMode and 1000 or data.time,
label = data.label,
useWhileDead = data.dead or false,
canCancel = data.cancel or true,
controlDisables = {
disableMovement = data.disableMovement or false,
disableCarMovement = data.disableMovement or false,
disableMouse = data.mouse or false,
disableCombat = data.combat or true,
},
animation = {
animDict = data.dict,
anim = data.anim,
flags = (data.flag == 8 and 32 or data.flag) or nil,
task = data.task,
},
prop = data.prop and {
model = data.prop.model,
bone = data.prop.bone or 0,
coords = data.prop.pos or vec3(0, 0, 0),
rotation = data.prop.rot or vec3(0, 0, 0),
} or nil,
propTwo = data.propTwo and {
model = data.propTwo.model,
bone = data.propTwo.bone or 0,
coords = data.propTwo.pos or vec3(0, 0, 0),
rotation = data.propTwo.rot or vec3(0, 0, 0),
} or nil,
}, nil, nil) then
return true
else
return false
end
end,
stop =
function()
exports["17mov_Hud"]:StopProgress()
end,
},
}
--- Displays a progress bar using the configured progress bar system.

View File

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

View File

@@ -111,7 +111,10 @@ local notifyFunc = {
--- triggerNotify("Alert", "You have been warned for misconduct.", "error", playerId)
--- ```
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
notifyFunc[Config.System.Notify].server(title, message, type, src)

View File

@@ -32,7 +32,7 @@ local hungerThirstFunc = {
setStress =
function(src, stress)
local Player = Core.Functions.GetPlayer(src)
local newStress = Player.PlayerData.metadata.stress + stress
local newStress = Player.PlayerData.metadata.stress - stress
newStress = (newStress >= 100.0 and 100.0)or (newStress <= 0 and 0) or newStress
Player.Functions.SetMetaData('stress', newStress)
TriggerClientEvent('hud:client:UpdateStress', src, newStress)
@@ -59,7 +59,7 @@ local hungerThirstFunc = {
setStress =
function(src, stress)
local Player = Core.Functions.GetPlayer(src)
local newStress = Player.PlayerData.metadata.stress + stress
local newStress = Player.PlayerData.metadata.stress - stress
newStress = (newStress >= 100.0 and 100.0)or (newStress <= 0 and 0) or newStress
Player.Functions.SetMetaData('stress', newStress)
TriggerClientEvent('hud:client:UpdateStress', src, newStress)
@@ -86,7 +86,7 @@ local hungerThirstFunc = {
setStress =
function(src, stress)
local Player = Core.Functions.GetPlayer(src)
local newStress = Player.PlayerData.metadata.stress + stress
local newStress = Player.PlayerData.metadata.stress - stress
newStress = (newStress >= 100.0 and 100.0) or (newStress <= 0 and 0) or newStress
Player.Functions.SetMetaData('stress', newStress)
TriggerClientEvent('hud:client:UpdateStress', src, newStress)
@@ -187,10 +187,10 @@ end)
--- Server event handler for setting player needs (thirst or hunger).
---
--- @event
--- @param type string "thirst" or "hunger".
--- @param needType string "thirst" or "hunger".
--- @param amount number New value to set.
RegisterNetEvent(getScript()..":server:setNeed", function(needType, amount)
print("^1Deprecated function ':server:setNeed' called, please update your scripts^7")
print("^1Deprecated function ':server:setNeed' called, please update the scripts that use it^7")
-- local src = source
-- if needType == "thirst" then
-- setThirst(src, amount)
@@ -217,6 +217,14 @@ local billPlayerFunc = {
function(data)
TriggerEvent("okokBilling:ToggleCreateInvoice")
end,
codem =
function(data)
TriggerEvent("codem-billing:client:OpenMenu")
end,
tgg =
function(data)
exports["tgg-billing"]:OpenBillingMenu()
end,
}
--- BillPlayer
@@ -384,41 +392,6 @@ end
--- ```
function ConsumeSuccess(itemName, type, data)
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
-------------------------------------------------------------
@@ -431,19 +404,26 @@ local hasGroupFunc = {
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job
if jobinfo and jobinfo.name == group then
local jobInfo, gangInfo = nil, nil
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
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then
duty = jobInfo.onduty
if grade and not (grade <= jobInfo.grade.level) then
hasJobFlag = false
end
return hasJobFlag, duty
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
if grade and not (grade <= ganginfo.grade.level) then
if grade and not (grade <= gangInfo.grade.level) then
hasJobFlag = false
end
return hasJobFlag, duty
@@ -457,21 +437,29 @@ local hasGroupFunc = {
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job
if jobinfo and jobinfo.name == group then
local jobInfo, gangInfo = nil, nil
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
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then
duty = jobInfo.onduty
if grade and not (grade <= jobInfo.grade.level) then
hasJobFlag = false
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
if grade and not (grade <= ganginfo.grade.level) then
if grade and not (grade <= gangInfo.grade.level) then
hasJobFlag = false
end
end
::skip::
return hasJobFlag, duty
end,
},
@@ -500,9 +488,8 @@ local hasGroupFunc = {
hasGroup =
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local info = playerInfo.job
local info = playerInfo and playerInfo.job
while not info do
info = GetPlayer(src).job
Wait(100)
@@ -510,7 +497,6 @@ local hasGroupFunc = {
if info.name == group then
hasJobFlag = true
end
return hasJobFlag, duty
end,
},
@@ -520,18 +506,25 @@ local hasGroupFunc = {
function(group, grade, src)
local hasJobFlag, duty = false, true
local playerInfo = GetPlayer(src)
local jobinfo = playerInfo.job or playerInfo.PlayerData.job
if jobinfo and jobinfo.name == group then
local jobInfo, gangInfo = nil, nil
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
duty = jobinfo.onduty
if grade and not (grade <= jobinfo.grade.level) then
duty = jobInfo.onduty
if grade and not (grade <= jobInfo.grade.level) then
hasJobFlag = false
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
if grade and not (grade <= ganginfo.grade.level) then
if grade and not (grade <= gangInfo.grade.level) then
hasJobFlag = false
end
end
@@ -585,6 +578,7 @@ local getPlayerFunc = {
local Player = {}
local info = ESX.GetPlayerFromId(src)
if not info then return {} end
Player = {
name = info.getName(),
cash = info.getMoney(),
@@ -601,6 +595,8 @@ local getPlayerFunc = {
onDuty = info.job.onDuty,
--account = info.charinfo.account,
citizenId = info.identifier,
hunger = Player(src).state.hunger or 0,
thirst = Player(src).state.thirst or 0,
}
return Player
end,
@@ -616,6 +612,7 @@ local getPlayerFunc = {
if v.name == "money" then cash = v.money end
if v.name == "bank" then bank = v.money end
end
Player = {
firstname = info.firstName,
lastname = info.lastName,
@@ -631,7 +628,9 @@ local getPlayerFunc = {
--account = info.charinfo.account,
citizenId = info.identifier,
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
end,
@@ -715,6 +714,8 @@ local getPlayerFunc = {
isDead = info.PlayerData.metadata["isdead"],
isDown = info.PlayerData.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.PlayerData.metadata["hunger"],
thirst = info.PlayerData.metadata["thirst"],
}
return Player
end,
@@ -743,6 +744,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
return Player
end,
@@ -774,6 +777,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
end
return Player
@@ -805,6 +810,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
return Player
end,
@@ -836,6 +843,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
end
return Player
@@ -867,6 +876,8 @@ local getPlayerFunc = {
isDead = info.metadata["isdead"],
isDown = info.metadata["inlaststand"],
charInfo = info.charinfo,
hunger = info.metadata["hunger"],
thirst = info.metadata["thirst"],
}
return Player
end,
@@ -968,6 +979,12 @@ local wardrobeFunc = {
TriggerEvent("illenium-appearance:client:openOutfitMenu")
end,
},
{
name = "rcore_clothing",
openWardrobe = function()
TriggerEvent('rcore_clothing:openChangingRoom')
end,
}
}
--- Opens the clothing customization menu
@@ -980,4 +997,5 @@ function openClothing()
break
end
end
end
end

View File

@@ -192,6 +192,21 @@ local societyFunc = {
end,
},
{ bankName = "wasabi_banking",
getAccount =
function(society)
return exports['wasabi_banking']:GetAccountBalance(society, 'society')
end,
chargeSociety =
function(society, amount)
exports['wasabi_banking']:RemoveMoney('society', society, amount)
end,
fundSociety =
function(society, amount)
exports['wasabi_banking']:AddMoney('society', society, amount)
end,
},
}
@@ -263,4 +278,14 @@ function fundSociety(society, amount)
end
print("^1Error^7: ^3FundSociety^7: ^2No supported banking script found")
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

@@ -252,7 +252,7 @@ function createEntityTarget(entity, opts, dist)
-- Store the target entity for later cleanup.
targetEntities[#targetEntities + 1] = entity
-- if force target off, use jim_bridge buiilt in target functions
-- if force target off, use jim_bridge built in target functions
if Config.System.DontUseTarget then
exports.jim_bridge:createEntityTarget(entity, opts, dist)
debugPrint("^6Bridge^7: ^2Creating new ^3Entity ^2target with ^6jim_bridge ^2for entity ^7"..entity)
@@ -324,8 +324,7 @@ end
---}, 2.0)
---```
function createBoxTarget(data, opts, dist)
-- if force target off, use jim_bridge buiilt in target functions
-- if force target off, use jim_bridge built in target functions
if Config.System.DontUseTarget then
debugPrint("^6Bridge^7: ^2Creating new ^3Box ^2target with ^6jim_bridge ^7"..data[1])
return exports.jim_bridge:createZoneTarget(data, opts, dist)
@@ -336,6 +335,13 @@ function createBoxTarget(data, opts, dist)
local script = targetFunc[i]
if isStarted(script.targetName) then
debugPrint("^6Bridge^7: ^2Creating new ^3Box ^2target with ^6"..script.targetName.." ^7"..data[1])
if data[5].minZ or data[5].maxZ then
local adMinZ, adMaxZ
data[5].minZ, data[5].maxZ, adMinZ, adMaxZ = adjustMinMaxZ(data[2], { minZ = data[5].minZ, maxZ = data[5].maxZ })
if adMinZ or adMaxZ then
print("^5Debug^7: ^2Auto adjusted ^7'^4"..data[1].."^7' ^2minZ and maxZ because ^1they weren't set correctly ^2remove or fix them for this target")
end
end
local target = script.boxTarget(data, opts, dist)
boxTargets[#boxTargets + 1] = target
return target
@@ -344,6 +350,50 @@ function createBoxTarget(data, opts, dist)
return nil
end
function createPropTarget(data, opts, dist)
-- Audo create a location based on a coord and a prop models dimensions
local width, depth, _ = GetPropDimensions(data[3])
local min, max = GetModelDimensions(data[3])
local coordAdjustment = data[2] - vec4(0, 0, 1.03, 0)
local newData = {
[1] = data[1],
[2] = coordAdjustment.xyz,
[3] = width + 0.1,
[4] = depth + 0.1,
[5] = {
name = data[1],
heading = coordAdjustment.w - 90.0,
debugPoly = debugMode,
minZ = coordAdjustment.z + (min.z) - 0.1,
maxZ = coordAdjustment.z + (max.z) + 0.1,
}
}
if data[3] then -- If spawning a prop, make entity target instead (ignores depth and width stuff)
makeDistProp({ prop = data[3], coords = data[2] }, true, false)
end
-- if force target off, use jim_bridge built in target functions
if Config.System.DontUseTarget then
debugPrint("^6Bridge^7: ^2Creating new ^3Box ^2target with ^6jim_bridge ^7"..data[1])
return exports.jim_bridge:createZoneTarget(newData, opts, dist)
end
-- Check for target script and use that
for i = 1, #targetFunc do
local script = targetFunc[i]
if isStarted(script.targetName) then
debugPrint("^6Bridge^7: ^2Creating new ^3Box ^2target with ^6"..script.targetName.." ^7"..data[1])
local target = script.boxTarget(newData, opts, dist)
boxTargets[#boxTargets + 1] = target
return target
end
end
return nil
end
-------------------------------------------------------------
-- Circle Zone Target Creation
-------------------------------------------------------------
@@ -382,7 +432,7 @@ end
--- ```
function createCircleTarget(data, opts, dist)
-- if force target off, use jim_bridge buiilt in target functions
-- if force target off, use jim_bridge built in target functions
if Config.System.DontUseTarget then
debugPrint("^6Bridge^7: ^2Creating new ^3Sphere ^2target with ^6jim_bridge ^7"..data[1])
return exports.jim_bridge:createZoneTarget(data, opts, dist)
@@ -429,7 +479,7 @@ end
---```
function createModelTarget(models, opts, dist)
-- if force target off, use jim_bridge buiilt in target functions
-- if force target off, use jim_bridge built in target functions
if Config.System.DontUseTarget then
debugPrint("^6Bridge^7: ^2Creating new ^3Model ^2target with ^6jim_bridge^7")
return exports.jim_bridge:createModelTarget(models, opts, dist)

View File

@@ -33,15 +33,51 @@ Exports = {
}
-- Required variables
debugMode = Config.System.Debug
debugMode = false
QBInvNew = true
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 ]]--
-- Check server convars for hard set defaults, otherwise it uses per script configurations
if Config and Config.System then
debugMode = Config.System.Debug
if Config.System.Debug then
if GetConvar("jim_DisableDebug", "false") == "true" then
debugMode = false
@@ -50,7 +86,6 @@ if Config and Config.System then
Config.System.EventDebug = false
end
end
Config.System.Menu = GetConvar("jim_menuScript", Config.System.Menu)
Config.System.Notify = GetConvar("jim_notifyScript", Config.System.Notify or "gta")
Config.System.ProgressBar = GetConvar("jim_progressBarScript", Config.System.ProgressBar or "gta")

289
ui_modules/alcohol.lua Normal file
View File

@@ -0,0 +1,289 @@
local alcoholCount = 0
local drugCount = 0
local purgeTimer = 300000
local minDrugCount = 3
local maxDrugCount = 7
local minAlcoholCount = 2
local midAlcoholCount = 4
local maxAlcoholCount = 7
local alcoholEffectData = {
levels = {
["min"] = {
effect = "DrugsMichaelAliensFightIn",
movement = "move_m@drunk@slightlydrunk",
camShake = 0.5,
canStumble = false,
},
["mid"] = {
effect = "DrugsMichaelAliensFightIn",
movement = "move_m@drunk@moderatedrunk",
canRagdoll = true,
camShake = 0.5,
canStumble = true,
stumbleChance = 0.8,
drunkDriving = true,
},
["max"] = {
effect = "DrugsMichaelAliensFightIn",
movement = "move_m@drunk@verydrunk",
canRagdoll = true,
camShake = 2.8,
canStumble = true,
stumbleChance = 0.6,
drunkDriving = true,
},
},
}
local drugEffectData = {
levels = {
["min"] = {
--effect = "SwitchHUDTrevorIn",
--movement = "move_m@drunk@slightlydrunk",
},
["max"] = {
effect = "SwitchHUDTrevorIn",
movement = "move_m@drunk@slightlydrunk",
camShake = 0.2,
},
}
}
-- Alcohol Thread
function addAlocholCount(count, canOD)
alcoholCount = alcoholCount + count
--print("Alcohol count increased, current amount:", alcoholCount)
CreateThread(function()
runAlcoholThread()
end)
if alcoholCount >= maxAlcoholCount then
-- max
startAlcoholEffect(alcoholEffectData.levels["max"], "max")
if canOD then
SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) - math.random(10, 15))
end
elseif alcoholCount < maxAlcoholCount and alcoholCount >= midAlcoholCount then
-- mid
startAlcoholEffect(alcoholEffectData.levels["mid"], "mid")
TriggerEvent("evidence:client:SetStatus", "heavyalcohol", 200)
if canOD then
SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) - math.random(5, 10))
end
elseif alcoholCount >= 1 then
-- min
TriggerEvent("evidence:client:SetStatus", "alcohol", 200)
startAlcoholEffect(alcoholEffectData.levels["min"], "min")
end
end
function getAlcoholCount()
return alcoholCount
end
function removeAlcoholCount(count)
alcoholCount = alcoholCount - count
if alcoholCount < minAlcoholCount then
clearCurrentAlcoholEffect()
end
--print("Alcohol count decreased, current amount:", alcoholCount)
end
local alcoholThreadRun = false
function runAlcoholThread()
if alcoholThreadRun == true then
return
else
alcoholThreadRun = true
end
--print("Alcohol Thread triggered")
while alcoholCount > 0 do
Wait(purgeTimer)
removeAlcoholCount(1)
if alcoholCount <= 0 then
clearCurrentAlcoholEffect()
alcoholThreadRun = false
break
end
end
end
exports("getAlcoholCount",getAlcoholCount)
exports("addAlocholCount", addAlocholCount)
exports("removeAlcoholCount", removeAlcoholCount)
-- EFFECT Management
local currentAlcoholEffect = ""
local alcoholEffect = ""
function clearCurrentAlcoholEffect()
local Ped = PlayerPedId()
if alcoholEffect ~= "" then
AnimpostfxStop(alcoholEffect)
ResetPedMovementClipset(Ped, 0.0)
ClearTimecycleModifier()
ResetScenarioTypesEnabled()
SetPedIsDrunk(Ped, false)
SetPedMotionBlur(Ped, false)
end
currentAlcoholEffect = ""
alcoholEffect = ""
end
function startAlcoholEffect(data, level)
local Ped = PlayerPedId()
if currentAlcoholEffect == level then
return
else
clearCurrentAlcoholEffect()
currentAlcoholEffect = level
end
-- Start effect using sent data
if alcoholEffect ~= data.effect then
alcoholEffect = data.effect
AnimpostfxPlay(data.effect, 0, true)
if data.movement then
RequestAnimSet(data.movement)
while not HasAnimSetLoaded(data.movement) do
Wait(100)
end
SetPedMovementClipset(Ped, data.movement, 3.0)
end
SetPedCanRagdoll(Ped, true)
if data.camShake then
ShakeGameplayCam("DRUNK_SHAKE", data.camShake)
end
SetTimecycleModifier("Drunk")
SetPedMotionBlur(Ped, true)
SetPedIsDrunk(Ped, true)
if data.drivingEffect or data.canStumble then
CreateThread(function()
local effectCheck = level
local lastStumbleTime = GetGameTimer() + 1200
local lastDriveTime = GetGameTimer() + 6000
while effectCheck == currentAlcoholEffect do
if data.camStumble and GetGameTimer() > lastStumbleTime and math.random() > (data.stumbleChance or 0.8) then
lastStumbleTime = GetGameTimer() + 1200
SetPedToRagdoll(Ped, 5000, 5000, 0, true, true, false)
end
if data.driving and GetGameTimer() > lastDriveTime then
local inVeh, veh, seat = GetSeatPedIsIn()
if inVeh then
lastDriveTime = GetGameTimer() + 6000
if seat == -1 then
if math.random() < 0.62 then
StartVehicleHorn(veh, 1000, "NORMAL", false)
end
end
end
end
Wait(1000)
end
--print("Effect loop broken")
end)
end
end
end
-- Helper
function GetSeatPedIsIn()
local inVeh, veh, seat = false, 0, 0
local veh = GetVehiclePedIsIn(PlayerPedId(), false)
if veh ~= 0 then
if GetPedInVehicleSeat(veh, -1) == PlayerPedId() then
inVeh = true
seat = -1
end
end
return inVeh, veh, seat
end
-- Drug thread
function addDrugCount(count, canOD)
drugCount = drugCount + count
--print("Drug count increased, current amount:", drugCount)
if drugCount >= minDrugCount and drugCount <= maxDrugCount then
startDrugEffect(drugEffectData.levels["min"], "min")
elseif drugCount > maxDrugCount then
if canOD then
SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) - math.random(10, 15))
end
startDrugEffect(drugEffectData.levels["max"], "max")
end
end
function getDrugCount()
return drugCount
end
function removeDrugCount(count)
--print("Drug count decreased, current amount:", drugCount)
drugCount = drugCount - count
end
local drugThreadRun = false
function runDrugThread()
if drugThreadRun == true then
return
else
drugThreadRun = true
end
--print("Drug Thread triggered")
while drugCount > 0 do
Wait(purgeTimer)
removeDrugCount(1)
if drugCount <= 0 then
drugThreadRun = false
break
end
end
end
exports("getDrugCount", getDrugCount)
exports("addDrugCount", addDrugCount)
exports("removeDrugCount", removeDrugCount)
-- EFFECT Management
local currentDrugEffect = ""
local drugEffect = ""
function startDrugEffect(data, level)
local Ped = PlayerPedId()
if currentDrugEffect == level then
return
else
clearCurrentAlcoholEffect()
currentDrugEffect = level
end
-- Start effect using sent data
if drugEffect ~= data.effect then
drugEffect = data.effect
AnimpostfxPlay(data.effect, 0, true)
if data.movement then
RequestAnimSet(data.movement)
while not HasAnimSetLoaded(data.movement) do
Wait(100)
end
SetPedMovementClipset(Ped, data.movement, 3.0)
end
SetPedCanRagdoll(Ped, true)
if data.camShake then
ShakeGameplayCam("DRUNK_SHAKE", data.camShake)
end
SetTimecycleModifier("Drunk")
SetPedMotionBlur(Ped, true)
SetPedIsDrunk(Ped, true)
end
end

View File

@@ -1,7 +1,14 @@
2.1.05
2.1.09
- Fix "true/false" print from built-in gta progressbars
- Revert Crafting system to previous style (I was too quick to do this)
- Fix singleprogress multiplying crafting recipes
- Add 100 wait for stopCam to reduce slow movement
- Add support for rcore_clothing in openClothing() - Thanks desypher
- Add hunger and thirst calls to getPlayer() - Thanks oosayeroo
- Add support for tgg-billing - Thanks GhostInLowGear
- Fix hasJob() checking players who haven't logged in yet
- Add exploit possibility for removeItem with minus numbers
- 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