module 'shared/debug' module 'shared/resource' module 'shared/table' module 'shared/player' QBCore = nil Version = resource.version(Bridge.FrameworkName) IsExport, QBCore = pcall(function() return exports[Bridge.FrameworkName]:GetCoreObject() end) if not IsExport then TriggerEvent(Bridge.FrameworkEvent, function(obj) QBCore = obj end) end Bridge.Debug('Framework', 'QBCore', Version) RegisterNetEvent(Bridge.FrameworkPrefix .. ':Server:UpdateObject', function() if source ~= '' then return end QBCore = exports[Bridge.FrameworkName]:GetCoreObject() for k, v in pairs(QBCore.Shared.Items) do local item = {} if not v.name then v.name = k end item.name = v.name item.label = v.label item.description = v.description item.stack = not v.unique and true item.weight = v.weight or 0 item.close = v.shouldClose == nil and true or v.shouldClose item.type = v.type Framework.Items[v.name] = item end end) RegisterNetEvent(Bridge.FrameworkPrefix .. ':Server:OnPlayerLoaded', function() pcall(Framework.OnPlayerLoaded, source) end) RegisterNetEvent(Bridge.FrameworkPrefix .. ':Server:OnPlayerUnload', function() pcall(Framework.OnPlayerUnload, source) end) AddEventHandler('playerDropped', function() local src = source TriggerClientEvent(Bridge.FrameworkPrefix .. ':Client:OnPlayerUnload', src) pcall(Framework.OnPlayerUnload, src) end) RegisterNetEvent(Bridge.FrameworkPrefix .. ':Server:OnJobUpdate', function() pcall(Framework.OnJobUpdate, source) end) RegisterNetEvent(Bridge.FrameworkPrefix .. ':Server:SetDuty', function() pcall(Framework.OnJobDutyUpdate, source) end) RegisterNetEvent(Bridge.FrameworkPrefix .. ':Server:OnGangUpdate', function() pcall(Framework.OnGangUpdate, source) end) Framework.CreateCallback = function(name, cb) QBCore.Functions.CreateCallback(name, cb) end Framework.TriggerCallback = function(source, name, cb, ...) QBCore.Functions.TriggerClientCallback(name, source, cb, ...) end Framework.CreateUseableItem = function(name, cb) QBCore.Functions.CreateUseableItem(name, function(source, data) cb(source, data.name, { weight = data.weight, count = data.amount or data.count, slot = data.slot, name = data.name, metadata = data.info or data.metadata or {}, label = data.label }) end) end Framework.GetPlayer = function(source) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player then return nil end ---@class PlayerServer local self = table.deepclone(Framework.Player) self.source = Player.PlayerData.source self.Identifier = Player.PlayerData.citizenid self.Name = Player.PlayerData.name self.Firstname = Player.PlayerData.charinfo.firstname self.Lastname = Player.PlayerData.charinfo.lastname self.DateOfBirth = Player.PlayerData.charinfo.birthdate or '00-00-0000' self.Gender = (Player.PlayerData.charinfo.gender == 0 and 'm' or 'f') self.Job.Name = (Player.PlayerData.job.type == "leo" and "police" or Player.PlayerData.job.name) self.Job.Label = Player.PlayerData.job.label self.Job.Duty = Player.PlayerData.job.onduty self.Job.Boss = Player.PlayerData.job.isboss self.Job.Grade.Name = Player.PlayerData.job.grade.name self.Job.Grade.Level = Player.PlayerData.job.grade.level self.Gang.Name = Player.PlayerData.gang.name self.Gang.Label = Player.PlayerData.gang.label self.Gang.Boss = Player.PlayerData.gang.isboss self.Gang.Grade.Name = Player.PlayerData.gang.grade.name self.Gang.Grade.Level = Player.PlayerData.gang.grade.level self.Metadata = Player.PlayerData.metadata self.SetJob = function(job, grade) return Player.Functions.SetJob(job, grade) end self.SetGang = function(gang, grade) return Player.Functions.SetGang(gang, grade) end self.AddMoney = function(type, amount) return Player.Functions.AddMoney(type, amount) end self.RemoveMoney = function(type, amount) return Player.Functions.RemoveMoney(type, amount) end self.GetMoney = function(type) return Player.Functions.GetMoney(type) end self.GetStatus = function(key) return Framework.Round(Player.PlayerData.metadata[key], 0) end self.SetStatus = function(key, value) Player.Functions.SetMetaData(key, value) end self.GetMetaData = function(key) if not key then return Player.PlayerData.metadata end return Player.Functions.GetMetaData(key) end self.SetMetaData = function(key, value) Player.Functions.SetMetaData(key, value) end self.HasLicense = function(name) return Player.PlayerData.metadata['licences'][name] or false end self.GetLicenses = function() return Player.PlayerData.metadata['licences'] end self.AddLicense = function(name) local licences = Player.PlayerData.metadata['licences'] licences[name] = true Player.Functions.SetMetaData("licences", licences) end self.RemoveLicense = function(name) local licences = Player.PlayerData.metadata['licences'] if licences[name] then licences[name] = false Player.Functions.SetMetaData("licences", licences) end end return self end Framework.GetPlayerByIdentifier = function(identifier) return Framework.GetPlayer(QBCore.Functions.GetPlayerByCitizenId(identifier)?.PlayerData?.source) end Framework.DoesJobExist = function(job, grade) grade = tostring(grade) if job and grade then if QBCore.Shared.Jobs[job] and QBCore.Shared.Jobs[job].grades[grade] then return true else return false end end return false end Framework.DoesGangExist = function(gang, grade) grade = tostring(grade) if gang and grade then if QBCore.Shared.Gangs[gang] and QBCore.Shared.Gangs[gang].grades[grade] then return true else return false end end return false end Framework.RegisterSociety = function(name, type) if not resource.missing('qb-banking') then return end if type ~= 'job' and type ~= 'gang' then error('Society Type Must Be Job Or Gang', 0) return end if type == 'job' then type = 'boss' end local management_funds = Database.scalar('SELECT `job_name` FROM `management_funds` WHERE `job_name` = ?', { name }) if not management_funds then Database.insert('INSERT INTO `management_funds` (`job_name`, `amount`, `type`) VALUES (?, ?, ?)', { name, 0, type }) end end Framework.SocietyGetMoney = function(name, type) if type ~= 'job' and type ~= 'gang' then error('Society Type Must Be Job Or Gang', 0) return 0 end IsQBBanking, QBBanking = pcall(function() return exports['qb-banking']:GetAccountBalance(name) end) if IsQBBanking then return QBBanking end if type == "job" then return exports['qb-management']:GetAccount(name) elseif type == "gang" then return exports['qb-management']:GetGangAccount(name) end return 0 end Framework.SocietyAddMoney = function(name, type, amount) if type ~= 'job' and type ~= 'gang' then error('Society Type Must Be Job Or Gang', 0) return false end if amount < 0 or amount == 0 then return false end IsQBBanking, QBBanking = pcall(function() return exports['qb-banking']:AddMoney(name, amount) end) if IsQBBanking then return QBBanking end if type == "job" then exports['qb-management']:AddMoney(name, amount) return true elseif type == "gang" then exports['qb-management']:AddGangMoney(name, amount) return true end return false end Framework.SocietyRemoveMoney = function(name, type, amount) if type ~= 'job' and type ~= 'gang' then error('Society Type Must Be Job Or Gang', 0) return false end IsQBBanking, QBBanking = pcall(function() return exports['qb-banking']:RemoveMoney(name, amount) end) if IsQBBanking then return QBBanking end if type == "job" then return exports['qb-management']:RemoveMoney(name, amount) elseif type == "gang" then return exports['qb-management']:RemoveGangMoney(name, amount) end return false end Framework.Notify = function(source, message, type, length) if type == "info" then type = 'primary' end TriggerClientEvent(Bridge.FrameworkPrefix .. ':Notify', source, message, type, length) end Framework.IsPlayerDead = function(source) local Player = QBCore.Functions.GetPlayer(source) return (Player.PlayerData.metadata['isdead'] or Player.PlayerData.metadata['inlaststand']) end Framework.HasPermission = function(source, permission) if type(permission) == "string" then return QBCore.Functions.HasPermission(source, permission) elseif type(permission) == "table" then for _, perm in pairs(permission) do if QBCore.Functions.HasPermission(source, perm) then return true end end end return false end