mirror of
https://github.com/jimathy/jim_bridge.git
synced 2026-08-17 05:56:02 +01:00
Inital Commit and Release
This commit is contained in:
28
README.md
28
README.md
@@ -1,2 +1,26 @@
|
||||
# jim_bridge
|
||||
Framework bridge script
|
||||
# Jim_Bridge
|
||||
|
||||
This script is intended to be used with my all my scripts (soon)
|
||||
|
||||
It was started due to wanting to bring the same features from some scripts into others with minimal work and multiple updates
|
||||
- Having certain functions in one place(this script) makes it easier to update, enchance and fix things
|
||||
- This brings the possibility of branching to mutliple frameworks as I've added some already:
|
||||
- `"qb-core"`
|
||||
- `"qbx-core"`
|
||||
- `"ox_core"`
|
||||
- `"es_extended"` (requires ox_lib and ox_inventory)
|
||||
|
||||
All the next updates of my scripts will use this script and be added as a dependancy
|
||||
|
||||
------
|
||||
|
||||
It was a tough decision to put it up on github instead of tebex and encrypted
|
||||
|
||||
But I want this script to grow with help of others who know more about other cores
|
||||
|
||||
---
|
||||
|
||||
The installation of this script is simple
|
||||
- it just needs to start before any script that requires it
|
||||
- it can start before core scripts if you want
|
||||
- for `qb-core` I personally place this script in `resources > [standalone]`
|
||||
501
crafting.lua
Normal file
501
crafting.lua
Normal file
@@ -0,0 +1,501 @@
|
||||
if GetResourceState(OXLibExport):find("start") then
|
||||
createCallback(GetCurrentResourceName()..':server:GetStashItems', function(source, stashName) local stash = getStash(stashName) return stash end)
|
||||
else
|
||||
createCallback(GetCurrentResourceName()..':server:GetStashItems', function(source, cb, stashName) local stash = getStash(stashName) cb(stash) end)
|
||||
end
|
||||
|
||||
local timeout = 0
|
||||
local timing = false
|
||||
local stashItems = {}
|
||||
function GetStashTimeout(stashName, stop)
|
||||
if stop then stashItems = {} timing = false timeout = 0 return end
|
||||
if stashItems[1] then return true else
|
||||
if timeout <= 0 then
|
||||
stashItems = triggerCallback(GetCurrentResourceName()..':server:GetStashItems', stashName)
|
||||
timeout = 15000
|
||||
if not timing then
|
||||
CreateThread(function()
|
||||
timing = true
|
||||
while timeout > 0 do timeout -= 1000 Wait(1000) end
|
||||
timing = false stashItems = {} timeout = 0
|
||||
end)
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local CraftLock = false
|
||||
function craftingMenu(data)
|
||||
if CraftLock then return end
|
||||
if data.stashName and not GetStashTimeout(data.stashName) then
|
||||
--triggerNotify(nil, "Chacking", "success")
|
||||
end
|
||||
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
||||
local Menu = {}
|
||||
local Recipes = data.craftable.Recipes
|
||||
for i = 1, #Recipes do
|
||||
for k, v in pairs(Recipes[i]) do
|
||||
if k ~= "amount" and k ~= "job" and k ~= "gang" then
|
||||
if Recipes[i].job then hasjob = false
|
||||
for l, b in pairs(data.craftable[i]["job"]) do
|
||||
hasjob = hasJob(l)
|
||||
end
|
||||
end
|
||||
local setheader, settext = "", ""
|
||||
local text = ""
|
||||
local disable = false
|
||||
local checktable = {}
|
||||
if Recipes[i].job and hasjob == false then else
|
||||
for l, b in pairs(Recipes[i][tostring(k)]) do
|
||||
if not Items[l] then print("^3Error^7: ^2Script can't find ingredient item in Shared Items - ^1"..l.."^7") return end
|
||||
settext = settext..(settext ~= "" and br or "")..Items[l].label..(b > 1 and " x"..b or "")
|
||||
if data.stashName then checktable[l] = stashhasItem(stashItems, l, b)
|
||||
else checktable[l] = hasItem(l, b) end
|
||||
Wait(0)
|
||||
end
|
||||
for _, v in pairs(checktable) do
|
||||
if not v then
|
||||
disable = true
|
||||
break
|
||||
end
|
||||
end
|
||||
setheader = Items[tostring(k)].label..(Recipes[i]["amount"] > 1 and " x"..Recipes[i]["amount"] or "")..(not disable and " ✔️" or "")
|
||||
Menu[#Menu + 1] = {
|
||||
isMenuHeader = disable,
|
||||
icon = invImg(tostring(k)),
|
||||
header = setheader, txt = settext,
|
||||
onSelect = function()
|
||||
local transdata = { item = k, craft = data.craftable.Recipes[i], craftable = data.craftable, coords = data.coords, stashName = data.stashName, onBack = data.onBack }
|
||||
if Config.Crafting.MultiCraft then
|
||||
multiCraft(transdata)
|
||||
else
|
||||
makeItem(transdata)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
openMenu(Menu, { header = data.craftable.Header, onBack = data.onBack or nil, canClose = true, onExit = function() end, })
|
||||
lookEnt(data.coords)
|
||||
end
|
||||
|
||||
function multiCraft(data) local Menu = {}
|
||||
local success = Config.Crafting.MultiCraftAmounts
|
||||
if data.stashName and not GetStashTimeout(data.stashName) then
|
||||
--triggerNotify(nil, "Refreshing stashinfo", "success")
|
||||
end
|
||||
Menu[#Menu+1] = {
|
||||
isMenuHeader = true,
|
||||
icon = invImg(data.item),
|
||||
header = Items[data.item].label,
|
||||
}
|
||||
for k in pairsByKeys(success) do
|
||||
local settext = ""
|
||||
for l, b in pairs(data.craft[data.item]) do
|
||||
if data.stashName then
|
||||
success[k] = stashhasItem(stashItems, l, (b * k))
|
||||
else
|
||||
success[k] = hasItem(l, (b * k))
|
||||
end
|
||||
settext = settext..(settext ~= "" and br or "")..Items[l].label..(b*k > 1 and "- x"..b*k or "")
|
||||
Wait(0)
|
||||
end
|
||||
Menu[#Menu + 1] = {
|
||||
isMenuHeader = not success[k],
|
||||
header = "Craft - x"..k * data.craft.amount,
|
||||
txt = settext,
|
||||
onSelect = function ()
|
||||
makeItem({item = data.item, craft = data.craft, craftable = data.craftable, amount = k, coords = data.coords, stashName = data.stashName, onBack = data.onBack })
|
||||
end,
|
||||
}
|
||||
end
|
||||
openMenu(Menu, { header = data.craftable.Header, onBack = function() craftingMenu(data) end, })
|
||||
end
|
||||
|
||||
function makeItem(data)
|
||||
if not CraftLock then CraftLock = true else return end
|
||||
local bartime, bartext, animDict, anim = nil, nil, nil, nil
|
||||
if data.craftable.progressBar then
|
||||
bartime = data.craftable.progressBar.time
|
||||
bartext = data.craftable.progressBar.label
|
||||
else
|
||||
bartime = 5000
|
||||
bartext = Loc[Config.Lan].progressbar["progress_make"]
|
||||
end
|
||||
animDict = data.craftable.Anims.animDict or "amb@prop_human_parking_meter@male@idle_a"
|
||||
anim = data.craftable.Anims.anim or "idle_a"
|
||||
|
||||
local amount = (data.amount and data.amount ~= 1) and data.amount or 1
|
||||
|
||||
local crafted = true
|
||||
local crafting = true
|
||||
|
||||
local cam = createTempCam(PlayerPedId(), data.coords)
|
||||
startTempCam(cam)
|
||||
|
||||
for i = 1, amount do
|
||||
for _, v in pairs(data.craft) do
|
||||
if type(v) == "table" then
|
||||
for l, b in pairs(v) do
|
||||
if crafting and progressBar({
|
||||
label = "Using "..b.." "..Items[l].label,
|
||||
time = 1000,
|
||||
cancel = true,
|
||||
dict = 'pickup_object',
|
||||
anim = "putdown_low",
|
||||
flag = 48,
|
||||
icon = l,
|
||||
}) then
|
||||
--TriggerEvent('inventory:client:ItemBox', Items[l], "use", b) -- Show item box for each item
|
||||
else
|
||||
crafted = false
|
||||
crafting = false
|
||||
break
|
||||
end
|
||||
Wait(200)
|
||||
end
|
||||
if crafted then
|
||||
if crafting and progressBar({
|
||||
label = bartext..Items[data.item].label,
|
||||
time = bartime,
|
||||
cancel = true,
|
||||
dict = animDict,
|
||||
anim = anim,
|
||||
flag = 8,
|
||||
icon = data.item,
|
||||
}) then
|
||||
TriggerServerEvent(GetCurrentResourceName()..":Crafting:GetItem", data.item, data.craft, data.stashName)
|
||||
else
|
||||
crafting = false
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Wait(500)
|
||||
end
|
||||
stopTempCam()
|
||||
CraftLock = false
|
||||
lockInv(false)
|
||||
craftingMenu(data)
|
||||
ClearPedTasks(PlayerPedId())
|
||||
end
|
||||
|
||||
RegisterNetEvent(GetCurrentResourceName()..":Crafting:GetItem", function(ItemMake, craftable, stashName)
|
||||
local src = source
|
||||
local amount = 1
|
||||
if stashName then
|
||||
local stashItems = getStash(stashName)
|
||||
if craftable["amount"] then amount = craftable["amount"] end
|
||||
local itemRemove = {}
|
||||
for k, v in pairs(craftable[ItemMake]) do
|
||||
for l, b in pairs(stashItems) do
|
||||
if k == b.name then
|
||||
itemRemove[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
stashRemoveItem(stashItems, stashName, itemRemove)
|
||||
else
|
||||
if craftable then
|
||||
if craftable["amount"] then amount = craftable["amount"] end
|
||||
for k, v in pairs(craftable[ItemMake]) do
|
||||
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", false, tostring(k), v, src)
|
||||
end
|
||||
end
|
||||
end
|
||||
TriggerEvent(GetCurrentResourceName()..":server:toggleItem", true, ItemMake, amount, src)
|
||||
end)
|
||||
|
||||
--[[SHOPS]]--
|
||||
function openShop(data)
|
||||
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
exports[OXInv]:openInventory('shop', { type = data.shop })
|
||||
else
|
||||
TriggerServerEvent(Config.JimShops and "jim-shops:ShopOpen" or "inventory:server:OpenInventory", "shop", data.shop, data.items)
|
||||
end
|
||||
lookEnt(data.coords)
|
||||
end
|
||||
|
||||
-- Client & Server side
|
||||
function hasItem(items, amount, src) local amount, count = amount and amount or 1, 0
|
||||
if src then
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
local item = exports[OXInv]:GetItem(src, items)
|
||||
local amount = (amount or 1)
|
||||
if item.count >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..item.count.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
|
||||
elseif GetResourceState(QSInv):find("start") then
|
||||
for _, itemData in pairs(exports[QSInv]:GetInventory(src)) do
|
||||
if itemData and (itemData.name == items) then
|
||||
--if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
|
||||
elseif GetResourceState(CoreInv):find("start") then
|
||||
local item = exports[CoreInv]:getItems('primary-'..src, items)
|
||||
|
||||
if item.amount >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..item.amount.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
local success = exports["codem-inventory"]:CheckItemValid(src, items, amount)
|
||||
if success then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
end
|
||||
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
for _, itemData in pairs(exports[CodeMInv]:GetUserInventory(src)) do
|
||||
if itemData and (itemData.name == items) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
|
||||
else
|
||||
for _, itemData in pairs(Core.Functions.GetPlayer(src).PlayerData.items) do
|
||||
if itemData and (itemData.name == items) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
end
|
||||
else
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
local count = tonumber(exports[OXInv]:Search('count', items))
|
||||
local amount = (amount or 1)
|
||||
if count >= amount then if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items)) end return true
|
||||
else if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end return false end
|
||||
|
||||
elseif GetResourceState(QSInv):find("start") then
|
||||
for _, itemData in pairs(exports[QSInv]:GetInventory()) do
|
||||
if itemData and (itemData.name == items) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
|
||||
elseif GetResourceState(CoreInv):find("start") then
|
||||
for _, itemData in pairs(exports[CoreInv]:getInventory('primary-'..GetPlayerServerId(PlayerPedId()))) do
|
||||
if itemData and (itemData.name == items) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
else
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7") end
|
||||
return false
|
||||
end
|
||||
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
local success = exports[CodeMInv]:CheckItemValid(items, amount)
|
||||
if success then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..amount.." "..tostring(items)) end
|
||||
return true
|
||||
end
|
||||
|
||||
elseif GetResourceState(QBInv):find("start") then
|
||||
--if tonumber(GetResourceMetadata(QBInv, 'version')) <= 1.2 then
|
||||
-- return exports[QBInv]:HasItem(items, amount)
|
||||
--else
|
||||
for _, itemData in pairs(Core.Functions.GetPlayerData().items) do
|
||||
if itemData and (itemData.name == items) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3HasItem^7: ^2Item^7: '^3"..tostring(items).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)") end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3HasItem^7: ^5FOUND^7 ^3"..count.."^7/^3"..amount.." "..tostring(items))
|
||||
end
|
||||
return true
|
||||
else
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3HasItem^7: ^2"..tostring(items).." ^1NOT FOUND^7")
|
||||
end
|
||||
return false
|
||||
end
|
||||
-- end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Stash Items
|
||||
function openStash(data)
|
||||
if (data.job or data.gang) and not jobCheck(data.job or data.gang) then return end
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
exports[OXInv]:openInventory('stash', data.stash)
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
exports[CodeMInv]:OpenStash(data.stash, 400000, 100)
|
||||
else
|
||||
TriggerEvent("inventory:client:SetCurrentStash", data.stash)
|
||||
TriggerServerEvent("inventory:server:OpenInventory", "stash", data.stash)
|
||||
end
|
||||
lookEnt(data.coords)
|
||||
end
|
||||
|
||||
function getStash(stashName)
|
||||
local stashItems, items = {}, {}
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7ox_inventory") end
|
||||
stashItems = exports[OXInv]:Inventory(stashName).items
|
||||
elseif GetResourceState(QSInv):find("start") then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7qs-inventory") end
|
||||
stashItems = exports[QSInv]:GetStashItems(stashName)
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7qs-inventory") end
|
||||
stashItems = exports[CodeMInv]:GetInventoryItems('Stash', stashName)
|
||||
elseif GetResourceState(QBInv):find("start") then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Retrieving ^3Stash^2 with ^7qb-inventory") end
|
||||
local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', { stashName })
|
||||
if result then stashItems = json.decode(result) end
|
||||
end
|
||||
if stashItems then
|
||||
for _, item in pairs(stashItems) do
|
||||
local itemInfo = Items[item.name:lower()]
|
||||
if itemInfo then
|
||||
items[item.slot] = {
|
||||
name = itemInfo["name"],
|
||||
amount = tonumber(item.amount) or tonumber(item.count),
|
||||
info = item.info ~= nil and item.info or "",
|
||||
label = itemInfo["label"],
|
||||
description = itemInfo["description"] ~= nil and itemInfo["description"] or "",
|
||||
weight = itemInfo["weight"],
|
||||
type = itemInfo["type"],
|
||||
unique = itemInfo["unique"],
|
||||
useable = itemInfo["useable"],
|
||||
image = itemInfo["image"],
|
||||
slot = item.slot,
|
||||
}
|
||||
end
|
||||
end
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3GetStashItems^7: ^2Stash information for ^7'^6"..stashName.."^7' ^2retrieved^7") end
|
||||
end
|
||||
return items
|
||||
end
|
||||
|
||||
function stashRemoveItem(stashItems, stashName, items) local amount = amount and amount or 1
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
for k, v in pairs(items) do
|
||||
exports[OXInv]:RemoveItem(stashName, k, v)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..OXInv, k, v) end
|
||||
end
|
||||
elseif GetResourceState(QSInv):find("start") then
|
||||
for k, v in pairs(items) do
|
||||
exports[QSInv]:RemoveItemIntoStash(stashName, k, v)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QSInv, k, v) end
|
||||
end
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
for k, v in pairs(items) do
|
||||
for l in pairs(stashItems) do
|
||||
if stashItems[l].name == k then
|
||||
if (stashItems[l].amount - v) <= 0 then
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^2None of this item left in stash ^3Stash^7", k, v)
|
||||
end
|
||||
stashItems[l] = nil
|
||||
else
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..CodeMInv, k, v)
|
||||
end
|
||||
stashItems[l].amount -= v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName.."^7'")
|
||||
end
|
||||
else
|
||||
for k, v in pairs(items) do
|
||||
for l in pairs(stashItems) do
|
||||
if stashItems[l].name == k then
|
||||
if (stashItems[l].amount - v) <= 0 then
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^2None of this item left in stash ^3Stash^7", k, v)
|
||||
end
|
||||
stashItems[l] = nil
|
||||
else
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^2Removing item from ^3Stash^2 with ^7"..QBInv, k, v)
|
||||
end
|
||||
stashItems[l].amount -= v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3saveStash^7: ^2Saving ^3QB^2 stash ^7'^6"..stashName.."^7'")
|
||||
end
|
||||
MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', { ['stash'] = stashName, ['items'] = json.encode(stashItems) })
|
||||
end
|
||||
end
|
||||
RegisterNetEvent(GetCurrentResourceName()..":server:stashRemoveItem", stashRemoveItem)
|
||||
|
||||
function stashhasItem(stashItems, item, amount) local amount, count = amount and amount or 1, 0
|
||||
for k, itemData in pairs(stashItems) do
|
||||
if itemData and (itemData.name == item) then
|
||||
--if Config.System.Debug then
|
||||
-- print("^6Bridge^7: ^3stashHasItem^7: ^2Item^7: '^3"..tostring(item).."^7' ^2Slot^7: ^3"..itemData.slot.." ^7x(^3"..tostring(itemData.amount).."^7)")
|
||||
--end
|
||||
count += (itemData.amount or 1)
|
||||
end
|
||||
end
|
||||
if count >= amount then
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3stashHasItem^7: ^2Items ^3"..item.." ^5FOUND^7 x^3"..count.."^7/^3"..amount.."^7") end
|
||||
return
|
||||
true
|
||||
else
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3stashHasItem^7: ^2Items ^1NOT FOUND^7 "..json.encode(item)) end
|
||||
return false
|
||||
end
|
||||
end
|
||||
19
exports.lua
Normal file
19
exports.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
Exports = {
|
||||
QBExport = "qb-core",
|
||||
QBXExport = "qbx_core",
|
||||
ESXExport = "es_extended",
|
||||
OXCoreExport = "ox_core",
|
||||
|
||||
OXInv = "ox_inventory",
|
||||
QBInv = "qb-inventory",
|
||||
QSInv = "qs-inventory",
|
||||
CoreInv = "core-inventory",
|
||||
CodeMInv = "codem-inventory",
|
||||
|
||||
OXLibExport = "ox_lib",
|
||||
|
||||
QBMenuExport = "qb-menu",
|
||||
|
||||
QBTargetExport = "qb-target",
|
||||
OXTargetExport = "ox_target"
|
||||
}
|
||||
784
functions.lua
Normal file
784
functions.lua
Normal file
@@ -0,0 +1,784 @@
|
||||
onDuty = false
|
||||
function jobCheck(job)
|
||||
canDo = true
|
||||
if not hasJob(job) or not onDuty then
|
||||
triggerNotify(nil, Loc[Config.Lan].error["not_clockedin"])
|
||||
canDo = false
|
||||
end
|
||||
return canDo
|
||||
end
|
||||
|
||||
local time = 100
|
||||
function loadModel(model)
|
||||
if not HasModelLoaded(model) then if Config.System.Debug then print("^6Bridge^7: ^2Loading Model^7: '^6"..model.."^7'") end
|
||||
while not HasModelLoaded(model) do if time > 0 then time = time - 1 RequestModel(model)
|
||||
else time = 1000 print("^6Bridge^7: ^3LoadModel^7: ^2Timed out loading model ^7'^6"..model.."^7'") break end
|
||||
Wait(10) end
|
||||
end
|
||||
end
|
||||
function unloadModel(model) if Config.System.Debug then print("^6Bridge^7: ^2Removing Model^7: '^6"..model.."^7'") end SetModelAsNoLongerNeeded(model) end
|
||||
function loadAnimDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Loading Anim Dictionary^7: '^6"..dict.."^7'") end while not HasAnimDictLoaded(dict) do RequestAnimDict(dict) Wait(5) end end
|
||||
function unloadAnimDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Removing Anim Dictionary^7: '^6"..dict.."^7'") end RemoveAnimDict(dict) end
|
||||
function loadPtfxDict(dict) if Config.System.Debug then if not HasNamedPtfxAssetLoaded(dict) then print("^6Bridge^7: ^2Loading Ptfx Dictionary^7: '^6"..dict.."^7'") end end while not HasNamedPtfxAssetLoaded(dict) do RequestNamedPtfxAsset(dict) Wait(5) end end
|
||||
function unloadPtfxDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Removing Ptfx Dictionary^7: '^6"..dict.."^7'") end RemoveNamedPtfxAsset(dict) end
|
||||
function loadTextureDict(dict) if Config.System.Debug then print("^6Bridge^7: ^2Loading Texture Dictionary^7: '^6"..dict.."^7'") end while not HasStreamedTextureDictLoaded(dict) do RequestNamedPtfxAsset(dict) Wait(5) end end
|
||||
|
||||
function countTable(table) local i = 0 for keys in pairs(table) do i += 1 end return i end
|
||||
|
||||
function pairsByKeys(t) local a = {} for n in pairs(t) do a[#a+1] = n end table.sort(a) local i = 0 local iter = function() i += 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end
|
||||
|
||||
function playAnim(animDict, animName, duration, flag, ped)
|
||||
loadAnimDict(animDict)
|
||||
TaskPlayAnim(ped and ped or PlayerPedId(), animDict, animName, 1.0, -1.0, duration or 30000, flag or 50, 1, false, false, false)
|
||||
end
|
||||
|
||||
function stopAnim(animDict, animName)
|
||||
StopAnimTask(PlayerPedId(), animName, animDict)
|
||||
unloadAnimDict(animDict)
|
||||
end
|
||||
|
||||
function makeVeh(model, coords)
|
||||
loadModel(model)
|
||||
local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, false)
|
||||
SetVehicleHasBeenOwnedByPlayer(veh, true)
|
||||
SetNetworkIdCanMigrate(NetworkGetNetworkIdFromEntity(veh), true)
|
||||
Wait(100)
|
||||
SetVehicleNeedsToBeHotwired(veh, false)
|
||||
SetVehRadioStation(veh, 'OFF')
|
||||
SetVehicleFuelLevel(veh, 100.0)
|
||||
SetVehicleModKit(veh, 0)
|
||||
SetVehicleOnGroundProperly(veh)
|
||||
if Config.System.Debug then
|
||||
local coords = { string.format("%.2f", coords.x), string.format("%.2f", coords.y), string.format("%.2f", coords.z), (string.format("%.2f", coords.w or 0.0)) }
|
||||
print("^6Bridge^7: ^1Veh ^2Created^7: '^6"..veh.."^7' | ^2Hash^7: ^7'^6"..(model).."^7' | ^2Coord^7: ^5vec4^7(^6"..(coords[1]).."^7, ^6"..(coords[2]).."^7, ^6"..(coords[3]).."^7, ^6"..(coords[4]).."^7)")
|
||||
end
|
||||
unloadModel(model)
|
||||
return veh
|
||||
end
|
||||
|
||||
local Peds = {}
|
||||
local Props = {}
|
||||
function makePed(model, coords, freeze, collision, scenario, anim, synced)
|
||||
loadModel(model)
|
||||
local ped = CreatePed(0, model, coords.x, coords.y, coords.z-1.03, coords.w, synced and synced or true, false)
|
||||
SetEntityInvincible(ped, true)
|
||||
SetBlockingOfNonTemporaryEvents(ped, true)
|
||||
FreezeEntityPosition(ped, freeze and freeze or true)
|
||||
|
||||
if collision then SetEntityNoCollisionEntity(ped, PlayerPedId(), false) end
|
||||
if scenario then TaskStartScenarioInPlace(ped, scenario, 0, true) end
|
||||
if anim then
|
||||
loadAnimDict(anim[1])
|
||||
TaskPlayAnim(ped, anim[1], anim[2], 0.5, 1.0, -1, 1, 0.2, 0, 0, 0)
|
||||
end
|
||||
if Config.System.Debug then
|
||||
local coords = { string.format("%.2f", coords.x), string.format("%.2f", coords.y), string.format("%.2f", coords.z), (string.format("%.2f", coords.w or 0.0)) }
|
||||
print("^6Bridge^7: ^1Ped ^2Created^7: '^6"..ped.."^7' | ^2Hash^7: ^7'^6"..(model).."^7' | ^2Coord^7: ^5vec4^7(^6"..(coords[1]).."^7, ^6"..(coords[2]).."^7, ^6"..(coords[3]).."^7, ^6"..(coords[4]).."^7)")
|
||||
end
|
||||
unloadModel(model)
|
||||
Peds[#Peds+1] = ped
|
||||
return ped
|
||||
end
|
||||
|
||||
function makeProp(data, freeze, synced)
|
||||
loadModel(data.prop)
|
||||
local prop = CreateObject(data.prop, data.coords.x, data.coords.y, data.coords.z-1.03, synced or false, synced or false, false)
|
||||
SetEntityHeading(prop, data.coords.w + 180.0)
|
||||
FreezeEntityPosition(prop, freeze and freeze or 0)
|
||||
if Config.System.Debug then
|
||||
local coords = { string.format("%.2f", data.coords.x), string.format("%.2f", data.coords.y), string.format("%.2f", data.coords.z), (string.format("%.2f", data.coords.w or 0.0)) }
|
||||
print("^6Bridge^7: ^1Prop ^2Created^7: '^6"..prop.."^7' | ^2Hash^7: ^7'^6"..(data.prop).."^7' | ^2Coord^7: ^5vec4^7(^6"..(coords[1]).."^7, ^6"..(coords[2]).."^7, ^6"..(coords[3]).."^7, ^6"..(coords[4]).."^7)")
|
||||
end
|
||||
unloadModel(data.prop)
|
||||
Props[#Props+1] = prop
|
||||
return prop
|
||||
end
|
||||
|
||||
AddEventHandler('onResourceStop', function(r)
|
||||
if r ~= GetCurrentResourceName() then return end
|
||||
stopSpinner()
|
||||
for i = 1, #Peds do DeletePed(Peds[i]) end
|
||||
for i = 1, #Props do destroyProp(Props[i]) end
|
||||
end)
|
||||
|
||||
function instantLookEnt(ent, ent2)
|
||||
local p1 = GetEntityCoords(ent, true)
|
||||
local p2 = GetEntityCoords(ent2, true)
|
||||
|
||||
local dx = p2.x - p1.x
|
||||
local dy = p2.y - p1.y
|
||||
|
||||
local heading = GetHeadingFromVector_2d(dx, dy)
|
||||
SetEntityHeading( ent, heading )
|
||||
end
|
||||
|
||||
function lookEnt(entity) local ped = PlayerPedId()
|
||||
if entity then
|
||||
if type(entity) == "vector3" or type(entity) == "vector4" then
|
||||
if not IsPedHeadingTowardsPosition(ped, entity.xyz, 30.0) then
|
||||
TaskTurnPedToFaceCoord(ped, entity.xyz, 1500)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Turning Player to^7: '^6"..json.encode(entity).."^7'") end
|
||||
Wait(1500)
|
||||
end
|
||||
else
|
||||
if DoesEntityExist(entity) then
|
||||
if not IsPedHeadingTowardsPosition(ped, GetEntityCoords(entity), 30.0) then
|
||||
TaskTurnPedToFaceCoord(ped, GetEntityCoords(entity), 1500)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Turning Player to^7: '^6"..entity.."^7'") end
|
||||
Wait(1500)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function destroyProp(entity)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^2Destroying Prop^7: '^6"..entity.."^7'") end
|
||||
if IsEntityAttachedToEntity(entity, PlayerPedId()) then
|
||||
SetEntityAsMissionEntity(entity)
|
||||
DetachEntity(entity, true, true)
|
||||
end
|
||||
DeleteObject(entity)
|
||||
end
|
||||
|
||||
function pushVehicle(entity)
|
||||
SetVehicleModKit(entity, 0)
|
||||
if entity ~= 0 and DoesEntityExist(entity) then
|
||||
if not NetworkHasControlOfEntity(entity) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3pushVehicle^7: ^2Requesting network control of vehicle^7.") end
|
||||
NetworkRequestControlOfEntity(entity)
|
||||
local timeout = 2000
|
||||
while timeout > 0 and not NetworkHasControlOfEntity(entity) do
|
||||
Wait(100)
|
||||
timeout = timeout - 100
|
||||
end
|
||||
if NetworkHasControlOfEntity(entity) and Config.System.Debug then print("^6Bridge^7: ^3pushVehicle^7: ^2Network has control of entity^7.") end
|
||||
end
|
||||
if not IsEntityAMissionEntity(entity) then
|
||||
if Config.System.Debug then print("^6Bridge^7: ^3pushVehicle^7: ^2Setting vehicle as a ^7'^2mission^7' &2entity^7.") end
|
||||
SetEntityAsMissionEntity(entity, true, true)
|
||||
local timeout = 2000
|
||||
while timeout > 0 and not IsEntityAMissionEntity(entity) do
|
||||
Wait(100)
|
||||
timeout = timeout - 100
|
||||
end
|
||||
if IsEntityAMissionEntity(entity) and Config.System.Debug then print("^6Bridge^7: ^3pushVehicle^7: ^2Vehicle is a ^7'^2mission^7'^2 entity^7.") end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function makeBlip(data)
|
||||
local blip = AddBlipForCoord(data.coords)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipSprite(blip, data.sprite or 106)
|
||||
SetBlipColour(blip, data.col or 5)
|
||||
SetBlipScale(blip, data.scale or 0.7)
|
||||
SetBlipDisplay(blip, (data.disp or 6))
|
||||
if data.category then SetBlipCategory(blip, data.category) end
|
||||
BeginTextCommandSetBlipName('STRING')
|
||||
AddTextComponentString(tostring(data.name))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^6Blip ^2created for location^7: '^6"..data.name.."^7'") end
|
||||
return blip
|
||||
end
|
||||
|
||||
function makeEntityBlip(data)
|
||||
AddBlipForEntity(data.entity)
|
||||
local blip = GetBlipFromEntity(data.entity)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipSprite(blip, data.sprite or 106)
|
||||
SetBlipColour(blip, data.col or 5)
|
||||
SetBlipScale(blip, data.scale or 0.7)
|
||||
SetBlipDisplay(blip, (data.disp or 6))
|
||||
if data.category then SetBlipCategory(blip, data.category) end
|
||||
BeginTextCommandSetBlipName('STRING')
|
||||
AddTextComponentString(tostring(data.name))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
if Config.System.Debug then print("^6Bridge^7: ^6Blip ^2created for Entity^7: '^6"..data.name.."^7'") end
|
||||
return blip
|
||||
end
|
||||
|
||||
function lockInv(toggle)
|
||||
FreezeEntityPosition(PlayerPedId(), toggle)
|
||||
LocalPlayer.state:set("inv_busy", toggle, true)
|
||||
TriggerEvent('inventory:client:busy:status', toggle)
|
||||
TriggerEvent('canUseInventoryAndHotbar:toggle', not toggle)
|
||||
end
|
||||
|
||||
function createTempCam(ent, coords)
|
||||
local cam = nil
|
||||
if Config.Crafting.craftCam then
|
||||
if Config.System.Debug then
|
||||
triggerNotify(nil, "ModCam Created", "success")
|
||||
end
|
||||
local camCoords = GetOffsetFromEntityInWorldCoords(ent, 1.2, -0.3, 0.8)
|
||||
--local pedCoords = GetEntityCoords(PlayerPedId())
|
||||
cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", camCoords.x, camCoords.y, camCoords.z+0.5, 1.0, 0.0, 0.0, 60.00, false, 0)
|
||||
PointCamAtCoord(cam, coords)
|
||||
end
|
||||
return cam
|
||||
end
|
||||
|
||||
function keyGen()
|
||||
local charset = {
|
||||
"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m",
|
||||
"Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M",
|
||||
"1","2","3","4","5","6","7","8","9","0"
|
||||
}
|
||||
local GeneratedID = ""
|
||||
for i = 1, 3 do GeneratedID = GeneratedID..charset[math.random(1, #charset)] end
|
||||
return GeneratedID
|
||||
end
|
||||
|
||||
function startTempCam(cam)
|
||||
if Config.Crafting.craftCam then
|
||||
SetCamActive(cam, true)
|
||||
RenderScriptCams(true, true, 1000, true, true)
|
||||
end
|
||||
end
|
||||
function stopTempCam()
|
||||
if Config.Crafting.craftCam then
|
||||
CreateThread(function()
|
||||
Wait(1000)
|
||||
RenderScriptCams(false, true, 500, true, true)
|
||||
DestroyAllCams()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
local inProgress = false
|
||||
function progressBar(data)
|
||||
local result = nil
|
||||
if data.cam then
|
||||
startTempCam(data.cam)
|
||||
end
|
||||
if Config.System.ProgressBar == "ox" then
|
||||
if exports[OXLibExport]:progressBar({
|
||||
duration = Config.System.Debug and 1000 or data.time,
|
||||
label = data.label,
|
||||
useWhileDead = data.dead and data.dead or false,
|
||||
canCancel = data.cancel and data.cancel or true,
|
||||
anim = {
|
||||
dict = data.dict,
|
||||
clip = data.anim,
|
||||
flag = (data.flag == 8 and 32 or data.flag) or nil,
|
||||
scenario = data.task
|
||||
},
|
||||
disable = {
|
||||
combat = true
|
||||
},
|
||||
}) then
|
||||
result = true
|
||||
lockInv(false)
|
||||
if data.cam then stopTempCam(data.cam) end
|
||||
else
|
||||
result = false
|
||||
lockInv(false)
|
||||
if data.cam then stopTempCam(data.cam) end
|
||||
end
|
||||
elseif Config.System.ProgressBar == "qb" then
|
||||
Core.Functions.Progressbar("mechbar",
|
||||
data.label,
|
||||
Config.System.Debug and 1000 or data.time,
|
||||
data.dead and data.dead or false,
|
||||
data.cancel or true,
|
||||
{ disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true, },
|
||||
{ animDict = data.dict, anim = data.anim, flags = data.flag and data.flag or 32, task = data.task }, {}, {},
|
||||
function()
|
||||
result = true
|
||||
lockInv(false)
|
||||
if data.cam then
|
||||
stopTempCam(data.cam)
|
||||
end
|
||||
end, function()
|
||||
result = false
|
||||
lockInv(false)
|
||||
if data.cam then
|
||||
stopTempCam(data.cam)
|
||||
end
|
||||
end, data.icon)
|
||||
elseif Config.System.ProgressBar == "gta" then
|
||||
|
||||
--local wait, inProgress = (Config.System.Debug and 1000 or data.time), true
|
||||
local wait = data.time
|
||||
inProgress = true
|
||||
if not (data.dead and data.dead or false) then
|
||||
lockInv(true)
|
||||
displaySpinner(data.label)
|
||||
local ped = PlayerPedId()
|
||||
if data.dict then
|
||||
playAnim(data.dict, data.anim, -1, (data.flag == 8 and 32 or data.flag) or nil)
|
||||
end
|
||||
if data.task then
|
||||
TaskStartScenarioInPlace(ped, data.task, -1, true)
|
||||
end
|
||||
while inProgress and wait > 0 do wait -= 15
|
||||
local waitTimer = 0
|
||||
DisablePlayerFiring(ped, true)
|
||||
DisableControlAction(0, 25, true)
|
||||
DisableControlAction(0, 21, true)
|
||||
DisableControlAction(0, 30, true)
|
||||
DisableControlAction(0, 31, true)
|
||||
DisableControlAction(0, 36, true)
|
||||
if data.cam ~= nil then
|
||||
DisableControlAction(0, 1, true)
|
||||
DisableControlAction(0, 2, true)
|
||||
DisableControlAction(0, 106, true)
|
||||
end
|
||||
if data.cancel then
|
||||
if IsControlJustReleased(0, 202) or IsControlJustReleased(0, 77) then
|
||||
inProgress = false
|
||||
waitTimer = 1500
|
||||
displaySpinner(Loc[Config.Lan].error["cancel"])
|
||||
end
|
||||
end
|
||||
Wait(waitTimer)
|
||||
end
|
||||
inProgress = false
|
||||
if data.cam then stopTempCam(data.cam) end
|
||||
if data.dict then stopAnim(data.dict, data.anim, ped) end
|
||||
ClearPedTasks(ped)
|
||||
end
|
||||
lockInv(false)
|
||||
stopSpinner()
|
||||
result = (wait <= 0)
|
||||
end
|
||||
while result == nil do Wait(10) end
|
||||
return result
|
||||
end
|
||||
|
||||
function displaySpinner(text)
|
||||
BeginTextCommandBusyspinnerOn('STRING')
|
||||
AddTextComponentSubstringPlayerName(text)
|
||||
EndTextCommandBusyspinnerOn(4)
|
||||
end
|
||||
|
||||
function stopSpinner() if not IsDuplicityVersion() then BusyspinnerOff() end end
|
||||
|
||||
function stopPropgressBar()
|
||||
if Config.System.ProgressBar == "ox" then
|
||||
exports[OXLibExport]:cancelProgress()
|
||||
elseif Config.System.ProgressBar == "qb" then
|
||||
TriggerEvent("progressbar:client:cancel")
|
||||
elseif Config.System.ProgressBar == "gta" then
|
||||
inProgress = false
|
||||
BusyspinnerOff()
|
||||
end
|
||||
end
|
||||
|
||||
-- [[ OTHER ]] --
|
||||
function washHands(data)
|
||||
lookEnt(data.coords)
|
||||
local cam = createTempCam(PlayerPedId(), data.coords)
|
||||
if progressBar({
|
||||
label = Loc[Config.Lan].progressbar["progress_washing"],
|
||||
time = 5000,
|
||||
cancel = true,
|
||||
dict = "mp_arresting",
|
||||
anim = "a_uncuff",
|
||||
flag = 32,
|
||||
icon = "fas fa-hand-holding-droplet",
|
||||
cam = cam
|
||||
}) then
|
||||
triggerNotify(nil, Loc[Config.Lan].success["washed_hands"], "success")
|
||||
else
|
||||
triggerNotify(nil, Loc[Config.Lan].error["cancel"], 'error')
|
||||
end
|
||||
ClearPedTasks(PlayerPedId())
|
||||
end
|
||||
|
||||
function useToilet(data)
|
||||
if data.urinal then
|
||||
if progressBar({
|
||||
label = "Using Urinal",
|
||||
time = 5000,
|
||||
cancel = true,
|
||||
dict = "misscarsteal2peeing",
|
||||
anim = "peeing_loop",
|
||||
flag = 32
|
||||
}) then
|
||||
TriggerServerEvent(GetCurrentResourceName().."server:Urinal")else
|
||||
lockInv(false)
|
||||
triggerNotify(nil, Loc[Config.Lan].error["cancelled"], 'error')
|
||||
end
|
||||
else
|
||||
TaskStartScenarioAtPosition(PlayerPedId(), "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER", data.sitcoords.x, data.sitcoords.y, data.sitcoords.z, data.sitcoords[4], 0, 1, true)
|
||||
if progressBar({
|
||||
label = "Using Toilet",
|
||||
time = 10000,
|
||||
cancel = true
|
||||
}) then
|
||||
TriggerServerEvent(GetCurrentResourceName().."server:Urinal")
|
||||
ClearPedTasks(PlayerPedId())
|
||||
else
|
||||
lockInv(false)
|
||||
triggerNotify(nil, Loc[Config.Lan].error["cancelled"], 'error')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RegisterNetEvent(GetCurrentResourceName()..":server:Urinal", function()
|
||||
local src = source
|
||||
local Player = getPlayer(src)
|
||||
local thirstamt = math.random(10,30)
|
||||
local thirst = Player.thirst - thirstamt
|
||||
setThirst(src, getPlayer(src).thirst - thirst)
|
||||
end)
|
||||
|
||||
RegisterNetEvent(GetCurrentResourceName()..":server:setNeed", function(type, amount) local src = source
|
||||
if type == "thirst" then
|
||||
setThirst(src, amount)
|
||||
elseif type == "thirst" then
|
||||
setHunger(src, amount)
|
||||
end
|
||||
end)
|
||||
|
||||
function setThirst(src, thirst)
|
||||
if GetResourceState(ESXExport):find("start") then
|
||||
TriggerClientEvent('esx_status:add', src, 'thirst', thirst)
|
||||
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
Player.Functions.SetMetaData('thirst', thirst)
|
||||
TriggerClientEvent("hud:client:UpdateNeeds", src, thirst, Player.PlayerData.metadata.thirst)
|
||||
end
|
||||
end
|
||||
|
||||
function setHunger(src, hunger)
|
||||
if GetResourceState(ESXExport):find("start") then
|
||||
TriggerClientEvent('esx_status:add', src, 'hunger', hunger)
|
||||
elseif GetResourceState(QBExport):find("start") or GetResourceState(QBXExport):find("start") then
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
Player.Functions.SetMetaData('hunger', hunger)
|
||||
TriggerClientEvent("hud:client:UpdateNeeds", src, hunger, Player.PlayerData.metadata.hunger)
|
||||
end
|
||||
end
|
||||
|
||||
function useDoor(data)
|
||||
DoScreenFadeOut(500)
|
||||
while not IsScreenFadedOut() do Wait(10) end
|
||||
SetEntityCoords(PlayerPedId(), data.telecoords.xyz, 0, 0, 0, false)
|
||||
SetEntityHeading(PlayerPedId(), data.telecoords.w)
|
||||
DoScreenFadeIn(1000)
|
||||
Wait(100)
|
||||
end
|
||||
|
||||
-- [[CONSUME]] --
|
||||
function ConsumeSuccess(itemName, type)
|
||||
ExecuteCommand("e c")
|
||||
toggleItem(false, itemName, 1)
|
||||
if GetResourceState(ESXEport):find("start") then
|
||||
if Items[itemName].hunger then
|
||||
TriggerServerEvent(GetCurrentResourceName()..":server:setNeed", "hunger", Items[itemName].hunger * 10000)
|
||||
end
|
||||
if Items[itemName].thirst then
|
||||
TriggerServerEvent(GetCurrentResourceName()..":server:setNeed", "thirst", Items[itemName].thirst * 10000)
|
||||
end
|
||||
else
|
||||
if Items[itemName].hunger then
|
||||
TriggerServerEvent(GetCurrentResourceName()..":server:setNeed", "hunger", Core.Functions.GetPlayerData().metadata["hunger"] + Items[itemName].hunger)
|
||||
end
|
||||
if Items[itemName].thirst then
|
||||
TriggerServerEvent(GetCurrentResourceName()..":server:setNeed", "thirst", Core.Functions.GetPlayerData().metadata["thirst"] + Items[itemName].thirst)
|
||||
end
|
||||
end
|
||||
if type == "alcohol" then alcoholCount += 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.RewardItem == itemName then toggleItem(true, Config.RewardPool[math.random(1, #Config.RewardPool)], 1) end
|
||||
end
|
||||
|
||||
function addItem(item, amount, info)
|
||||
TriggerServerEvent(GetCurrentResourceName()..":server:toggleItem", true, item, amount)
|
||||
end
|
||||
|
||||
function removeItem(item, amount)
|
||||
TriggerServerEvent(GetCurrentResourceName()..":server:toggleItem", false, item, amount)
|
||||
end
|
||||
|
||||
RegisterNetEvent(GetCurrentResourceName()..":server:toggleItem", function(give, item, amount, newsrc)
|
||||
local src = newsrc or source
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^3toggleItem ^2triggered^7: ^6"..(tostring(give) == "true" and "addItem" or "removeItem").."^7 - ['^8"..tostring(item).."^7'] x"..(tostring(amount) or "1"))
|
||||
end
|
||||
local remamount = (amount and amount or 1)
|
||||
if item == nil then return end
|
||||
if give == 0 or give == false then
|
||||
if hasItem(item, amount and amount or 1, src) then -- check if you still have the item
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
local success = exports[OXInv]:RemoveItem(src, item, (amount and amount or 1), nil)
|
||||
elseif GetResourceState(QSInv):find("start") then
|
||||
local success = exports[QSInv]:RemoveItem(src, item, amount)
|
||||
elseif GetResourceState(CoreInv):find("start") then
|
||||
local success = exports[CoreInv]:removeItemExact('primary-'..src, item, amount)
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
local success = exports[CodeMInv]:RemoveItem(src, item, amount)
|
||||
elseif GetResourceState(QBInv):find("start") then
|
||||
while remamount > 0 do
|
||||
if Core.Functions.GetPlayer(src).Functions.RemoveItem(item, 1) then end
|
||||
remamount -= 1
|
||||
end
|
||||
if Config.Crafting.showItemBox then
|
||||
TriggerClientEvent('inventory:client:ItemBox', src, Items[item], "remove", (amount and amount or 1))
|
||||
end
|
||||
end
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^1Removing ^2from Player^7(^2"..src.."^7) '^6"..Items[item].label.."^7(^2x^6"..((amount and amount or "1")).."^7)'")
|
||||
end
|
||||
else
|
||||
dupeWarn(src, item) -- if not boot the player
|
||||
end
|
||||
else
|
||||
local amount = amount and amount or 1
|
||||
if GetResourceState(OXInv):find("start") then
|
||||
local success = exports[OXInv]:AddItem(src, item, amount or 1, nil)
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^4Giving ^2Player^7(^2"..src.."^7) '^6"..Items[item].label.."^7(^2x^6"..((amount and amount or "1")).."^7) ^1OX^7'")
|
||||
end
|
||||
elseif GetResourceState(QSInv):find("start") then
|
||||
local success = exports[QSInv]:AddItem(src, item, amount)
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^4Giving ^2Player^7(^2"..src.."^7) '^6"..Items[item].label.."^7(^2x^6"..((amount and amount or "1")).."^7) ^1QS^7'")
|
||||
end
|
||||
elseif GetResourceState(CoreInv):find("start") then
|
||||
local success = exports[CoreInv]:addItem('primary-'..src, item, amount)
|
||||
if Config.System.Debug then
|
||||
print("^6Bridge^7: ^4Giving ^2Player^7(^2"..src.."^7) '^6"..Items[item].label.."^7(^2x^6"..((amount and amount or "1")).."^7) ^1Core^7'")
|
||||
end
|
||||
elseif GetResourceState(CodeMInv):find("start") then
|
||||
local success = exports[CodeMInv]:AddItem(src, item, amount)
|
||||
elseif GetResourceState(QBInv):find("start") then
|
||||
if Core.Functions.GetPlayer(src).Functions.AddItem(item, amount or 1) then
|
||||
--if Config.Crafting.showItemBox then
|
||||
TriggerClientEvent("inventory:client:ItemBox", src, Items[item], "add", amount and amount or 1)
|
||||
--end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
--Item Exploit protection
|
||||
function dupeWarn(src, item)
|
||||
print("^5DupeWarn^7: (^1"..tostring(src).."^7) ^2Tried to remove item ^7('^3"..item.."^7')^2 but it wasn't there^7")
|
||||
if Config.System.Debug == false then
|
||||
DropPlayer(src, src.." ^1Kicked for attempting to duplicate items")
|
||||
end
|
||||
print("^5DupeWarn:^7: (^1"..tostring(src).."^7) ^2Dropped from server for item duplicating^7")
|
||||
end
|
||||
|
||||
|
||||
function toggleDuty()
|
||||
if GetResourceState(QBExport):find("start") then
|
||||
TriggerServerEvent("QBCore:ToggleDuty")
|
||||
else
|
||||
onDuty = not onDuty
|
||||
if onDuty then
|
||||
triggerNotify(nil, "Now on duty", "success")
|
||||
else
|
||||
triggerNotify(nil, "Now off duty", "success")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function CheckVersion()
|
||||
if IsDuplicityVersion() then
|
||||
PerformHttpRequest('https://raw.githubusercontent.com/jimathy/UpdateVersions/master/'..GetCurrentResourceName()..'.txt', function(err, newestVersion, headers)
|
||||
if not newestVersion then print("Currently unable to run a version check.") return end
|
||||
local currentVersion = "^3"..GetResourceMetadata(GetCurrentResourceName(), 'version'):gsub("%.", "^7.^3").."^7"
|
||||
newestVersion = "^3"..newestVersion:sub(1, -2):gsub("%.", "^7.^3").."^7"
|
||||
print("^6Version Check^7: ^2Running^7: "..currentVersion.." ^2Latest^7: "..newestVersion)
|
||||
print(newestVersion == currentVersion and '^6You are running the latest version.^7 ('..currentVersion..')' or "^1You are currently running an outdated version^7, ^1please update^7!")
|
||||
end)
|
||||
end
|
||||
end
|
||||
CheckVersion()
|
||||
|
||||
--Screen Effects
|
||||
local alienEffect = false
|
||||
function AlienEffect()
|
||||
if alienEffect then return else alienEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3AlienEffect^7() ^2activated") end
|
||||
AnimpostfxPlay("DrugsMichaelAliensFightIn", 3.0, 0)
|
||||
Wait(math.random(5000, 8000))
|
||||
local Ped = PlayerPedId()
|
||||
local animDict = "MOVE_M@DRUNK@VERYDRUNK"
|
||||
loadAnimDict(animDict)
|
||||
SetPedCanRagdoll(Ped, true)
|
||||
ShakeGameplayCam('DRUNK_SHAKE', 2.80)
|
||||
SetTimecycleModifier("Drunk")
|
||||
SetPedMovementClipset(Ped, animDict, 1)
|
||||
SetPedMotionBlur(Ped, true)
|
||||
SetPedIsDrunk(Ped, true)
|
||||
Wait(1500)
|
||||
SetPedToRagdoll(Ped, 5000, 1000, 1, 0, 0, 0)
|
||||
Wait(13500)
|
||||
SetPedToRagdoll(Ped, 5000, 1000, 1, 0, 0, 0)
|
||||
Wait(120500)
|
||||
ClearTimecycleModifier()
|
||||
ResetScenarioTypesEnabled()
|
||||
ResetPedMovementClipset(Ped, 0)
|
||||
SetPedIsDrunk(Ped, false)
|
||||
SetPedMotionBlur(Ped, false)
|
||||
AnimpostfxStopAll()
|
||||
ShakeGameplayCam('DRUNK_SHAKE', 0.0)
|
||||
AnimpostfxPlay("DrugsMichaelAliensFight", 3.0, 0)
|
||||
Wait(math.random(45000, 60000))
|
||||
AnimpostfxPlay("DrugsMichaelAliensFightOut", 3.0, 0)
|
||||
AnimpostfxStop("DrugsMichaelAliensFightIn")
|
||||
AnimpostfxStop("DrugsMichaelAliensFight")
|
||||
AnimpostfxStop("DrugsMichaelAliensFightOut")
|
||||
alienEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3AlienEffect^7() ^2stopped") end
|
||||
end
|
||||
local weedEffect = false
|
||||
function WeedEffect()
|
||||
if weedEffect then return else weedEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3WeedEffect^7() ^2activated") end
|
||||
AnimpostfxPlay("DrugsMichaelAliensFightIn", 3.0, 0)
|
||||
Wait(math.random(3000, 20000))
|
||||
AnimpostfxPlay("DrugsMichaelAliensFight", 3.0, 0)
|
||||
Wait(math.random(15000, 20000))
|
||||
AnimpostfxPlay("DrugsMichaelAliensFightOut", 3.0, 0)
|
||||
AnimpostfxStop("DrugsMichaelAliensFightIn")
|
||||
AnimpostfxStop("DrugsMichaelAliensFight")
|
||||
AnimpostfxStop("DrugsMichaelAliensFightOut")
|
||||
weedEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3WeedEffect^7() ^2stopped") end
|
||||
end
|
||||
local trevorEffect = false
|
||||
function TrevorEffect()
|
||||
if trevorEffect then return else trevorEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3TrevorEffect^7() ^2activated") end
|
||||
AnimpostfxPlay("DrugsTrevorClownsFightIn", 3.0, 0)
|
||||
Wait(3000)
|
||||
AnimpostfxPlay("DrugsTrevorClownsFight", 3.0, 0)
|
||||
Wait(30000)
|
||||
AnimpostfxPlay("DrugsTrevorClownsFightOut", 3.0, 0)
|
||||
AnimpostfxStop("DrugsTrevorClownsFight")
|
||||
AnimpostfxStop("DrugsTrevorClownsFightIn")
|
||||
AnimpostfxStop("DrugsTrevorClownsFightOut")
|
||||
trevorEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3TrevorEffect^7() ^2stopped") end
|
||||
end
|
||||
local turboEffect = false
|
||||
function TurboEffect()
|
||||
if turboEffect then return else turboEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3TurboEffect^7() ^2activated") end
|
||||
AnimpostfxPlay('RaceTurbo', 0, true)
|
||||
SetTimecycleModifier('rply_motionblur')
|
||||
ShakeGameplayCam('SKY_DIVING_SHAKE', 0.25)
|
||||
Wait(30000)
|
||||
StopGameplayCamShaking(true)
|
||||
SetTransitionTimecycleModifier('default', 0.35)
|
||||
Wait(1000)
|
||||
ClearTimecycleModifier()
|
||||
AnimpostfxStop('RaceTurbo')
|
||||
turboEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3TurboEffect^7() ^2stopped") end
|
||||
end
|
||||
local rampageEffect = false
|
||||
function RampageEffect()
|
||||
if rampageEffect then return else rampageEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3RampageEffect^7() ^2activated") end
|
||||
AnimpostfxPlay('Rampage', 0, true)
|
||||
SetTimecycleModifier('rply_motionblur')
|
||||
ShakeGameplayCam('SKY_DIVING_SHAKE', 0.25)
|
||||
Wait(30000)
|
||||
StopGameplayCamShaking(true)
|
||||
SetTransitionTimecycleModifier('default', 0.35)
|
||||
Wait(1000)
|
||||
ClearTimecycleModifier()
|
||||
AnimpostfxStop('Rampage')
|
||||
rampageEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3RampageEffect^7() ^2stopped") end
|
||||
end
|
||||
local focusEffect = false
|
||||
function FocusEffect()
|
||||
if focusEffect then return else focusEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3FocusEffect^7() ^2activated") end
|
||||
Wait(1000)
|
||||
AnimpostfxPlay('FocusIn', 0, true)
|
||||
Wait(30000)
|
||||
AnimpostfxStop('FocusIn')
|
||||
focusEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3FocusEffect^7() ^2stopped") end
|
||||
end
|
||||
local NightVisionEffect = false
|
||||
function NightVisionEffect()
|
||||
if NightVisionEffect then return else NightVisionEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2activated") end
|
||||
SetNightvision(true)
|
||||
Wait(math.random(3000, 4000)) -- FEEL FREE TO CHANGE THIS
|
||||
SetNightvision(false)
|
||||
SetSeethrough(false)
|
||||
NightVisionEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3NightVisionEffect^7() ^2stopped") end
|
||||
end
|
||||
local thermalEffect = false
|
||||
function ThermalEffect()
|
||||
if thermalEffect then return else thermalEffect = true end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3ThermalEffect^7() ^2activated") end
|
||||
SetNightvision(true)
|
||||
SetSeethrough(true)
|
||||
Wait(math.random(2000, 3000)) -- FEEL FREE TO CHANGE THIS
|
||||
SetNightvision(false)
|
||||
SetSeethrough(false)
|
||||
thermalEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3ThermalEffect^7() ^2stopped") end
|
||||
end
|
||||
|
||||
--Built-in Buff effects
|
||||
local healEffect = false
|
||||
function HealEffect(data)
|
||||
if healEffect then return end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3HealEffect^7() ^2activated") end
|
||||
healEffect = true
|
||||
local count = (data[1] / 1000)
|
||||
while count > 0 do
|
||||
Wait(1000)
|
||||
count -= 1
|
||||
SetEntityHealth(PlayerPedId(), GetEntityHealth(PlayerPedId()) + data[2])
|
||||
end
|
||||
healEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3HealEffect^7() ^2stopped") end
|
||||
end
|
||||
|
||||
local staminaEffect = false
|
||||
function StaminaEffect(data)
|
||||
if staminaEffect then return end
|
||||
if Config.System.Debug then print("^5Debug^7: ^3StaminaEffect^7() ^2activated") end
|
||||
staminaEffect = true
|
||||
local startStamina = (data[1] / 1000)
|
||||
SetRunSprintMultiplierForPlayer(PlayerId(), 1.49)
|
||||
while startStamina > 0 do
|
||||
Wait(1000)
|
||||
if math.random(5, 100) < 10 then RestorePlayerStamina(PlayerId(), data[2]) end
|
||||
startStamina -= 1
|
||||
if math.random(5, 100) < 51 then end
|
||||
end
|
||||
startStamina = 0
|
||||
SetRunSprintMultiplierForPlayer(PlayerId(), 1.0)
|
||||
staminaEffect = false
|
||||
if Config.System.Debug then print("^5Debug^7: ^3StaminaEffect^7() ^2stopped") end
|
||||
end
|
||||
|
||||
function StopEffects() -- Used to clear up any effects stuck on screen
|
||||
if Config.System.Debug then print("^5Debug^7: ^2All screen effects stopped") end
|
||||
ShakeGameplayCam('DRUNK_SHAKE', 0.0)
|
||||
SetPedToRagdoll(PlayerPedId(), 5000, 1000, 1, 0, 0, 0)
|
||||
ClearTimecycleModifier()
|
||||
ResetScenarioTypesEnabled()
|
||||
ResetPedMovementClipset(PlayerPedId(), 0)
|
||||
SetPedIsDrunk(PlayerPedId(), false)
|
||||
SetPedMotionBlur(PlayerPedId(), false)
|
||||
SetNightvision(false)
|
||||
SetSeethrough(false)
|
||||
AnimpostfxStop("DrugsMichaelAliensFightIn")
|
||||
AnimpostfxStop("DrugsMichaelAliensFight")
|
||||
AnimpostfxStop("DrugsMichaelAliensFightOut")
|
||||
AnimpostfxStop("DrugsTrevorClownsFight")
|
||||
AnimpostfxStop("DrugsTrevorClownsFightIn")
|
||||
AnimpostfxStop("DrugsTrevorClownsFightOut")
|
||||
AnimpostfxStop('RaceTurbo')
|
||||
AnimpostfxStop('FocusIn')
|
||||
AnimpostfxStop('Rampage')
|
||||
end
|
||||
14
fxmanifest.lua
Normal file
14
fxmanifest.lua
Normal file
@@ -0,0 +1,14 @@
|
||||
name "Jim_Bridge"
|
||||
author "Jimathy"
|
||||
version "help"
|
||||
description "Framework Bridge By Jimathy"
|
||||
fx_version "cerulean"
|
||||
game "gta5"
|
||||
lua54 'yes'
|
||||
|
||||
files {
|
||||
'exports.lua',
|
||||
'functions.lua',
|
||||
'wrapper.lua',
|
||||
'crafting.lua',
|
||||
}
|
||||
1009
wrapper.lua
Normal file
1009
wrapper.lua
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user