QBCore.Functions = {} QBCore.Player_Buckets = {} QBCore.Entity_Buckets = {} -- Getters -- Get your player first and then trigger a function on them -- ex: local player = QBCore.Functions.GetPlayer(source) -- ex: local example = player.Functions.functionname(parameter) function QBCore.Functions.GetCoords(entity) local coords = GetEntityCoords(entity, false) local heading = GetEntityHeading(entity) return vector4(coords.x, coords.y, coords.z, heading) end function QBCore.Functions.GetIdentifier(source, idtype) idtype = idtype or QBConfig.IdentifierType local identifiers = GetPlayerIdentifiers(source) for _, identifier in pairs(identifiers) do if string.find(identifier, idtype) then return identifier end end return nil end function QBCore.Functions.GetSource(identifier) for src, _ in pairs(QBCore.Players) do local idens = GetPlayerIdentifiers(src) for _, id in pairs(idens) do if identifier == id then return src end end end return 0 end function QBCore.Functions.GetPlayer(source) if type(source) == 'number' then return QBCore.Players[source] else return QBCore.Players[QBCore.Functions.GetSource(source)] end end function QBCore.Functions.GetPlayerByCitizenId(citizenid) for src, _ in pairs(QBCore.Players) do if QBCore.Players[src].PlayerData.citizenid == citizenid then return QBCore.Players[src] end end return nil end function QBCore.Functions.GetPlayerByPhone(number) for src, _ in pairs(QBCore.Players) do if QBCore.Players[src].PlayerData.charinfo.phone == number then return QBCore.Players[src] end end return nil end function QBCore.Functions.GetPlayers() local sources = {} for k, v in pairs(QBCore.Players) do sources[#sources+1] = k end return sources end -- Will return an array of QB Player class instances -- unlike the GetPlayers() wrapper which only returns IDs function QBCore.Functions.GetQBPlayers() return QBCore.Players end --- Gets a list of all on duty players of a specified job and the number function QBCore.Functions.GetPlayersOnDuty(job) local players = {} local count = 0 for src, Player in pairs(QBCore.Players) do if Player.PlayerData.job.name == job then if Player.PlayerData.job.onduty then players[#players + 1] = src count += 1 end end end return players, count end -- Returns only the amount of players on duty for the specified job function QBCore.Functions.GetDutyCount(job) local count = 0 for _, Player in pairs(QBCore.Players) do if Player.PlayerData.job.name == job then if Player.PlayerData.job.onduty then count += 1 end end end return count end -- Routing buckets (Only touch if you know what you are doing) -- Returns the objects related to buckets, first returned value is the player buckets, second one is entity buckets function QBCore.Functions.GetBucketObjects() return QBCore.Player_Buckets, QBCore.Entity_Buckets end -- Will set the provided player id / source into the provided bucket id function QBCore.Functions.SetPlayerBucket(source --[[ int ]], bucket --[[ int ]]) if source and bucket then local plicense = QBCore.Functions.GetIdentifier(source, 'license') SetPlayerRoutingBucket(source, bucket) QBCore.Player_Buckets[plicense] = {id = source, bucket = bucket} return true else return false end end -- Will set any entity into the provided bucket, for example peds / vehicles / props / etc. function QBCore.Functions.SetEntityBucket(entity --[[ int ]], bucket --[[ int ]]) if entity and bucket then SetEntityRoutingBucket(entity, bucket) QBCore.Entity_Buckets[entity] = {id = entity, bucket = bucket} return true else return false end end -- Will return an array of all the player ids inside the current bucket function QBCore.Functions.GetPlayersInBucket(bucket --[[ int ]]) local curr_bucket_pool = {} if QBCore.Player_Buckets and next(QBCore.Player_Buckets) then for k, v in pairs(QBCore.Player_Buckets) do if v.bucket == bucket then curr_bucket_pool[#curr_bucket_pool + 1] = v.id end end return curr_bucket_pool else return false end end -- Will return an array of all the entities inside the current bucket (not for player entities, use GetPlayersInBucket for that) function QBCore.Functions.GetEntitiesInBucket(bucket --[[ int ]]) local curr_bucket_pool = {} if QBCore.Entity_Buckets and next(QBCore.Entity_Buckets) then for k, v in pairs(QBCore.Entity_Buckets) do if v.bucket == bucket then curr_bucket_pool[#curr_bucket_pool + 1] = v.id end end return curr_bucket_pool else return false end end -- Paychecks (standalone - don't touch) function PaycheckInterval() for _, Player in pairs(QBCore.Players) do local payment = Player.PlayerData.job.payment if Player.PlayerData.job and payment > 0 and (QBShared.Jobs[Player.PlayerData.job.name].offDutyPay or Player.PlayerData.job.onduty) then if QBCore.Config.Money.PayCheckSociety then local account = exports['qb-bossmenu']:GetAccount(Player.PlayerData.job.name) if account ~= 0 then -- Checks if player is employed by a society if account < payment then -- Checks if company has enough money to pay society TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('error.company_too_poor'), 'error') else Player.Functions.AddMoney('bank', payment) TriggerEvent('qb-bossmenu:server:removeAccountMoney', Player.PlayerData.job.name, payment) TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment})) end else Player.Functions.AddMoney('bank', payment) TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment})) end else Player.Functions.AddMoney('bank', payment) TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment})) end end end SetTimeout(QBCore.Config.Money.PayCheckTimeOut * (60 * 1000), PaycheckLoop) end -- Callbacks function QBCore.Functions.CreateCallback(name, cb) QBCore.ServerCallbacks[name] = cb end function QBCore.Functions.TriggerCallback(name, source, cb, ...) if not QBCore.ServerCallbacks[name] then return end QBCore.ServerCallbacks[name](source, cb, ...) end -- Items function QBCore.Functions.CreateUseableItem(item, cb) QBCore.UseableItems[item] = cb end function QBCore.Functions.CanUseItem(item) return QBCore.UseableItems[item] end function QBCore.Functions.UseItem(source, item) QBCore.UseableItems[item.name](source, item) end -- Kick Player function QBCore.Functions.Kick(source, reason, setKickReason, deferrals) reason = '\n' .. reason .. '\n🔸 Check our Discord for further information: ' .. QBCore.Config.Server.discord if setKickReason then setKickReason(reason) end CreateThread(function() if deferrals then deferrals.update(reason) Wait(2500) end if source then DropPlayer(source, reason) end for i = 0, 4 do while true do if source then if GetPlayerPing(source) >= 0 then break end Wait(100) CreateThread(function() DropPlayer(source, reason) end) end end Wait(5000) end end) end -- Check if player is whitelisted (not used anywhere) function QBCore.Functions.IsWhitelisted(source) local plicense = QBCore.Functions.GetIdentifier(source, 'license') local identifiers = GetPlayerIdentifiers(source) if QBCore.Config.Server.whitelist then local result = MySQL.Sync.fetchSingle('SELECT * FROM whitelist WHERE license = ?', { plicense }) if not result then return false end for _, id in pairs(identifiers) do if result.license == id then return true end end else return true end return false end -- Setting & Removing Permissions function QBCore.Functions.AddPermission(source, permission) local Player = QBCore.Functions.GetPlayer(source) local plicense = Player.PlayerData.license if not Player then return end if QBCore.Config.Server.UseOldPermissionSystem then QBCore.Config.Server.PermissionList[plicense] = { license = plicense, permission = permission:lower(), } MySQL.Async.execute('DELETE FROM permissions WHERE license = ?', { plicense }) MySQL.Async.insert('INSERT INTO permissions (name, license, permission) VALUES (?, ?, ?)', { GetPlayerName(source), plicense, permission:lower() }) Player.Functions.UpdatePlayerData() TriggerClientEvent('QBCore:Client:OnPermissionUpdate', source, permission) else Player.Functions.SetPermission(permission) end end function QBCore.Functions.RemovePermission(source) local Player = QBCore.Functions.GetPlayer(source) local license = Player.PlayerData.license if not Player then return end if QBCore.Config.Server.UseOldPermissionSystem then QBCore.Config.Server.PermissionList[license] = nil MySQL.Async.execute('DELETE FROM permissions WHERE license = ?', { license }) Player.Functions.UpdatePlayerData() TriggerClientEvent('QBCore:Client:OnPermissionUpdate', source, 'user') else Player.Functions.SetPermission('user') end end -- Checking for Permission Level function QBCore.Functions.HasPermission(source, permission) permission = tostring(permission:lower()) local license = QBCore.Functions.GetIdentifier(source, 'license') if QBCore.Config.Server.UseOldPermissionSystem then if permission == 'user' then return true end if not QBCore.Config.Server.PermissionList[license] or QBCore.Config.Server.PermissionList[license].license ~= license then return false end if QBCore.Config.Server.PermissionList[license].permission ~= permission or QBCore.Config.Server.PermissionList[license].permission ~= 'god' then return false end return true else local Player = QBCore.Functions.GetPlayer(source) if next(QBCore.Config.Server.AllPermissions) then for i = 1, #QBCore.Config.Server.AllPermissions do if QBCore.Config.Server.AllPermissions[i] == Player.PlayerData.permission then return true end end end return Player.PlayerData.permission == permission end return false end function QBCore.Functions.GetPermission(source) local license = QBCore.Functions.GetIdentifier(source, 'license') if QBCore.Config.Server.UseOldPermissionSystem then if not license or not QBCore.Config.Server.PermissionList[license] or QBCore.Config.Server.PermissionList[license].license ~= license then return 'user' end return QBCore.Config.Server.PermissionList[license].permission else local Player = QBCore.Functions.GetPlayer(source) return Player.PlayerData.permission end end -- Opt in or out of admin reports function QBCore.Functions.IsOptin(source) local license = QBCore.Functions.GetIdentifier(source, 'license') if not license or not QBCore.Functions.HasPermission(source, 'admin') then return false end if QBCore.Config.Server.UseOldPermissionSystem then return QBCore.Config.Server.PermissionList[license].optin else local Player = QBCore.Functions.GetPlayer(source) return Player.PlayerData.optin end end function QBCore.Functions.ToggleOptin(source) local license = QBCore.Functions.GetIdentifier(source, 'license') if not license or not QBCore.Functions.HasPermission(source, 'admin') then return end if QBCore.Config.Server.UseOldPermissionSystem then QBCore.Config.Server.PermissionList[license].optin = not QBCore.Config.Server.PermissionList[license].optin else local Player = QBCore.Functions.GetPlayer(source) Player.PlayerData.optin = not Player.PlayerData.optin Player.Functions.SetMetaData('optin', Player.PlayerData.optin) end end -- Check if player is banned function QBCore.Functions.IsPlayerBanned(source) local plicense = QBCore.Functions.GetIdentifier(source, 'license') local result = MySQL.Sync.fetchSingle('SELECT * FROM bans WHERE license = ?', { plicense }) if not result then return false end if os.time() < result.expire then local timeTable = os.date('*t', tonumber(result.expire)) return true, 'You have been banned from the server:\n' .. result.reason .. '\nYour ban expires ' .. timeTable.day .. '/' .. timeTable.month .. '/' .. timeTable.year .. ' ' .. timeTable.hour .. ':' .. timeTable.min .. '\n' else MySQL.Async.execute('DELETE FROM bans WHERE id = ?', { result.id }) end return false end -- Check for duplicate license function QBCore.Functions.IsLicenseInUse(license) local players = GetPlayers() for _, player in pairs(players) do local identifiers = GetPlayerIdentifiers(player) for _, id in pairs(identifiers) do if string.find(id, 'license') then if id == license then return true end end end end return false end