diff --git a/client/functions.lua b/client/functions.lua index a9a4ef0..b1eec6e 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -64,7 +64,7 @@ function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, sho print("Coords: " .. coords .. " Sprite: " .. sprite .. " Display: " .. display .. " scale: " .. scale .. " shortRange: " .. shortRange .. " Title: " .. title .. " if you're attempting to use a blip without a title, use an empty string.") return end - + coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords blip = AddBlipForCoord(coords) SetBlipSprite(blip, sprite) diff --git a/config.lua b/config.lua index 65c8681..f318c5a 100644 --- a/config.lua +++ b/config.lua @@ -27,8 +27,10 @@ QBConfig.Server.uptime = 0 -- Time the server has been up. QBConfig.Server.whitelist = false -- Enable or disable whitelist on the server QBConfig.Server.pvp = true -- Enable or disable pvp on the server (Ability to shoot other players) QBConfig.Server.discord = "" -- Discord invite link -QBConfig.Server.checkDuplicateLicense = true -- check for duplicate rockstar license on join -QBConfig.Server.PermissionList = {} -- permission list +QBConfig.Server.checkDuplicateLicense = true -- Check for duplicate rockstar license on join +QBConfig.Server.PermissionList = {} -- Permission list for old permission system +QBConfig.Server.UseOldPermissionSystem = true -- Use old permissions system from the database +QBConfig.Server.AllPermissions = {'god',} -- Table of permissions which have access to everything QBConfig.Notify = {} @@ -62,4 +64,4 @@ QBConfig.Notify.VariantDefinitions = { classes = 'ambulance', icon = 'fas fa-ambulance' } -} +} \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua index 135c67b..1db83ae 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -5,10 +5,9 @@ description 'QB-Core' version '1.1.0' shared_scripts { - 'shared/locale.lua', - 'locale/en.lua', -- replace with desired language + 'shared/*.lua', 'config.lua', - 'shared/*.lua' + 'locale/en.lua' -- replace with desired language } client_scripts { @@ -45,4 +44,4 @@ dependencies { 'connectqueue' } -lua54 'yes' +lua54 'yes' \ No newline at end of file diff --git a/locale/es.lua b/locale/es.lua index 0133ea0..7e3ffdb 100644 --- a/locale/es.lua +++ b/locale/es.lua @@ -4,8 +4,6 @@ local Translations = { wrong_format = 'Formato incorrecto!', missing_args = 'No todos los argumentos estan presente! (x, y, z)', missing_args2 = 'Todos los argumentos tienen que estar presente!', - missing_args = 'No todos los argumentos estan presentes! (x, y, z)', - missing_args2 = 'Todos los argumentos deben estar presentes!', no_access = 'No tienes acceso a este comando!', company_too_poor = 'Tu empresa está en bancarrota. No hay dinero suficiente.', item_not_exist = 'El objeto no existe en el sistema.', @@ -24,4 +22,4 @@ local Translations = { Lang = Locale:new({ phrases = Translations, warnOnMissing = true -}) +}) \ No newline at end of file diff --git a/server/commands.lua b/server/commands.lua index 1b42ed7..7b43904 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -24,10 +24,8 @@ function QBCore.Commands.Refresh(source) local suggestions = {} if not Player then return end for command, info in pairs(QBCore.Commands.List) do - local isGod = QBCore.Functions.HasPermission(source, 'god') local hasPerm = QBCore.Functions.HasPermission(source, QBCore.Commands.List[command].permission) - local isPrincipal = IsPlayerAceAllowed(source, 'command') - if isGod or hasPerm or isPrincipal then + if hasPerm then suggestions[#suggestions + 1] = { name = '/' .. command, help = info.help, diff --git a/server/debug.lua b/server/debug.lua index 9b4b3b2..7a8a9cf 100644 --- a/server/debug.lua +++ b/server/debug.lua @@ -42,4 +42,4 @@ end function QBCore.ShowSuccess(resource, msg) print('\x1b[32m['..resource..':LOG]\x1b[0m '..msg) -end +end \ No newline at end of file diff --git a/server/events.lua b/server/events.lua index 6ba9f57..7f19e82 100644 --- a/server/events.lua +++ b/server/events.lua @@ -19,11 +19,9 @@ AddEventHandler('chatMessage', function(source, _, message) if not QBCore.Commands.List[command] then return end local Player = QBCore.Functions.GetPlayer(src) if not Player then return end - local isGod = QBCore.Functions.HasPermission(src, 'god') local hasPerm = QBCore.Functions.HasPermission(src, QBCore.Commands.List[command].permission) - local isPrincipal = IsPlayerAceAllowed(src, 'command') table.remove(args, 1) - if isGod or hasPerm or isPrincipal then + if hasPerm then if QBCore.Commands.List[command].argsrequired and #QBCore.Commands.List[command].arguments ~= 0 and not args[#QBCore.Commands.List[command].arguments] then TriggerClientEvent('QBCore:Notify', src, Lang:t('error.missing_args2'), 'error') else @@ -190,10 +188,8 @@ RegisterNetEvent('QBCore:CallCommand', function(command, args) if not QBCore.Commands.List[command] then return end local Player = QBCore.Functions.GetPlayer(src) if not Player then return end - local isGod = QBCore.Functions.HasPermission(src, 'god') local hasPerm = QBCore.Functions.HasPermission(src, QBCore.Commands.List[command].permission) - local isPrincipal = IsPlayerAceAllowed(src, 'command') - if (QBCore.Commands.List[command].permission == Player.PlayerData.job.name) or isGod or hasPerm or isPrincipal then + if (QBCore.Commands.List[command].permission == Player.PlayerData.job.name) or hasPerm then if QBCore.Commands.List[command].argsrequired and #QBCore.Commands.List[command].arguments ~= 0 and not args[#QBCore.Commands.List[command].arguments] then TriggerClientEvent('QBCore:Notify', src, Lang:t('error.missing_args2'), 'error') else @@ -258,4 +254,4 @@ QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, am end end cb(retval) -end) +end) \ No newline at end of file diff --git a/server/exports.lua b/server/exports.lua index eda629b..1c43cfc 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -146,9 +146,9 @@ exports('AddGangs', AddGangs) local function GetCoreVersion(InvokingResource) local resourceVersion = GetResourceMetadata(GetCurrentResourceName(), 'version') if InvokingResource and InvokingResource ~= '' then - print(("%s called qbcore version check: %s"):format(InvokingResource, resourceVersion)) + print(("%s called qbcore version check: %s"):format(InvokingResource or 'Unknown Resource', resourceVersion)) end return resourceVersion end QBCore.Functions.GetCoreVersion = GetCoreVersion -exports('GetCoreVersion', GetCoreVersion) +exports('GetCoreVersion', GetCoreVersion) \ No newline at end of file diff --git a/server/functions.lua b/server/functions.lua index d004122..36c0a1c 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -275,28 +275,36 @@ function QBCore.Functions.AddPermission(source, permission) local Player = QBCore.Functions.GetPlayer(source) local plicense = Player.PlayerData.license if not Player then return end - 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) + 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 - QBCore.Config.Server.PermissionList[license] = nil - MySQL.Async.execute('DELETE FROM permissions WHERE license = ?', { license }) - Player.Functions.UpdatePlayerData() - TriggerClientEvent('QBCore:Client:OnPermissionUpdate', source, 'user') + 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 @@ -304,20 +312,34 @@ end function QBCore.Functions.HasPermission(source, permission) permission = tostring(permission:lower()) local license = QBCore.Functions.GetIdentifier(source, 'license') - if permission == 'user' then - return true - else + 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] == 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 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 + 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 @@ -325,13 +347,24 @@ end 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 - return QBCore.Config.Server.PermissionList[license].optin + 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 - QBCore.Config.Server.PermissionList[license].optin = not QBCore.Config.Server.PermissionList[license].optin + 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 @@ -364,4 +397,4 @@ function QBCore.Functions.IsLicenseInUse(license) end end return false -end +end \ No newline at end of file diff --git a/server/main.lua b/server/main.lua index 535dc6f..39a10af 100644 --- a/server/main.lua +++ b/server/main.lua @@ -15,13 +15,19 @@ end) -- Get permissions on server start CreateThread(function() - local result = MySQL.Sync.fetchAll('SELECT * FROM permissions', {}) - if not result[1] then return end - for k, v in pairs(result) do - QBCore.Config.Server.PermissionList[v.license] = { - license = v.license, - permission = v.permission, - optin = true, - } + if QBCore.Config.Server.UseOldPermissionSystem then + local result = MySQL.Sync.fetchAll('SELECT * FROM permissions', {}) + if not result[1] then return end + for k, v in pairs(result) do + QBCore.Config.Server.PermissionList[v.license] = { + license = v.license, + permission = v.permission, + optin = true, + } + end + else + for i = 1, #QBCore.Config.Server.AllPermissions do + ExecuteCommand(('add_principal group.%s group.admin'):format(QBCore.Config.Server.AllPermissions[i])) + end end -end) +end) \ No newline at end of file diff --git a/server/player.lua b/server/player.lua index 41567a2..771e96e 100644 --- a/server/player.lua +++ b/server/player.lua @@ -43,6 +43,12 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.license = PlayerData.license or QBCore.Functions.GetIdentifier(source, 'license') PlayerData.name = GetPlayerName(source) PlayerData.cid = PlayerData.cid or 1 + if not QBCore.Config.Server.UseOldPermissionSystem then + if PlayerData.permission then ExecuteCommand(('remove_principal identifier.%s group.%s'):format(PlayerData.license, PlayerData.permission)) end + PlayerData.permission = PlayerData.permission or 'user' + ExecuteCommand(('add_principal identifier.%s group.%s'):format(PlayerData.license, PlayerData.permission)) + PlayerData.optin = PlayerData.optin or true + end PlayerData.money = PlayerData.money or {} for moneytype, startamount in pairs(QBCore.Config.Money.MoneyTypes) do PlayerData.money[moneytype] = PlayerData.money[moneytype] or startamount @@ -152,11 +158,22 @@ function QBCore.Player.CreatePlayer(PlayerData) function self.Functions.UpdatePlayerData(dontUpdateChat) TriggerClientEvent('QBCore:Player:SetPlayerData', self.PlayerData.source, self.PlayerData) - if dontUpdateChat == nil then + if not dontUpdateChat then QBCore.Commands.Refresh(self.PlayerData.source) end end + if not QBCore.Config.Server.UseOldPermissionSystem then + function self.Functions.SetPermission(permission) + permission = permission:lower() + ExecuteCommand(('remove_principal identifier.%s group.%s'):format(self.PlayerData.license, self.PlayerData.permission)) + ExecuteCommand(('add_principal identifier.%s group.%s'):format(self.PlayerData.license, permission)) + self.PlayerData.permission = permission + self.Functions.UpdatePlayerData() + TriggerClientEvent('QBCore:Client:OnPermissionUpdate', self.PlayerData.source, permission) + end + end + function self.Functions.SetJob(job, grade) job = job:lower() grade = tostring(grade) or '0' @@ -215,13 +232,14 @@ function QBCore.Player.CreatePlayer(PlayerData) end function self.Functions.SetMetaData(meta, val) - meta = meta:lower() if not meta then return end + meta = meta:lower() self.PlayerData.metadata[meta] = val self.Functions.UpdatePlayerData() end function self.Functions.AddJobReputation(amount) + if not amount then return end amount = tonumber(amount) self.PlayerData.metadata['jobrep'][self.PlayerData.job.name] = self.PlayerData.metadata['jobrep'][self.PlayerData.job.name] + amount self.Functions.UpdatePlayerData() @@ -657,4 +675,4 @@ function QBCore.Player.CreateSerialNumber() return SerialNumber end -PaycheckInterval() -- This starts the paycheck system +PaycheckInterval() -- This starts the paycheck system \ No newline at end of file diff --git a/shared/locale.lua b/shared/locale.lua index 20a5ddc..eb7e462 100644 --- a/shared/locale.lua +++ b/shared/locale.lua @@ -135,4 +135,4 @@ function Locale:delete(phraseTarget, prefix) end end end -end +end \ No newline at end of file diff --git a/shared/main.lua b/shared/main.lua index 1e6db83..cace3c0 100644 --- a/shared/main.lua +++ b/shared/main.lua @@ -7,17 +7,17 @@ for i = 48, 57 do NumberCharset[#NumberCharset+1] = string.char(i) end for i = 65, 90 do StringCharset[#StringCharset+1] = string.char(i) end for i = 97, 122 do StringCharset[#StringCharset+1] = string.char(i) end -QBShared.RandomStr = function(length) +function QBShared.RandomStr(length) if length <= 0 then return '' end return QBShared.RandomStr(length - 1) .. StringCharset[math.random(1, #StringCharset)] end -QBShared.RandomInt = function(length) +function QBShared.RandomInt(length) if length <= 0 then return '' end return QBShared.RandomInt(length - 1) .. NumberCharset[math.random(1, #NumberCharset)] end -QBShared.SplitStr = function(str, delimiter) +function QBShared.SplitStr(str, delimiter) local result = {} local from = 1 local delim_from, delim_to = string.find(str, delimiter, from) @@ -30,18 +30,18 @@ QBShared.SplitStr = function(str, delimiter) return result end -QBShared.Trim = function(value) +function QBShared.Trim(value) if not value then return nil end return (string.gsub(value, '^%s*(.-)%s*$', '%1')) end -QBShared.Round = function(value, numDecimalPlaces) +function QBShared.Round(value, numDecimalPlaces) if not numDecimalPlaces then return math.floor(value + 0.5) end local power = 10 ^ numDecimalPlaces return math.floor((value * power) + 0.5) / (power) end -QBShared.ChangeVehicleExtra = function (vehicle, extra, enable) +function QBShared.ChangeVehicleExtra(vehicle, extra, enable) if DoesExtraExist(vehicle, extra) then if enable then SetVehicleExtra(vehicle, extra, false) @@ -57,9 +57,9 @@ QBShared.ChangeVehicleExtra = function (vehicle, extra, enable) end end -QBShared.SetDefaultVehicleExtras = function (vehicle, config) +function QBShared.SetDefaultVehicleExtras(vehicle, config) -- Clear Extras - for i=1,20 do + for i = 1,20 do if DoesExtraExist(vehicle, i) then SetVehicleExtra(vehicle, i, 1) end @@ -77,9 +77,82 @@ QBShared.StarterItems = { } QBShared.MaleNoGloves = { - [0] = true, [1] = true, [2] = true, [3] = true, [4] = true, [5] = true, [6] = true, [7] = true, [8] = true, [9] = true, [10] = true, [11] = true, [12] = true, [13] = true, [14] = true, [15] = true, [18] = true, [26] = true, [52] = true, [53] = true, [54] = true, [55] = true, [56] = true, [57] = true, [58] = true, [59] = true, [60] = true, [61] = true, [62] = true, [112] = true, [113] = true, [114] = true, [118] = true, [125] = true, [132] = true + [0] = true, + [1] = true, + [2] = true, + [3] = true, + [4] = true, + [5] = true, + [6] = true, + [7] = true, + [8] = true, + [9] = true, + [10] = true, + [11] = true, + [12] = true, + [13] = true, + [14] = true, + [15] = true, + [18] = true, + [26] = true, + [52] = true, + [53] = true, + [54] = true, + [55] = true, + [56] = true, + [57] = true, + [58] = true, + [59] = true, + [60] = true, + [61] = true, + [62] = true, + [112] = true, + [113] = true, + [114] = true, + [118] = true, + [125] = true, + [132] = true } QBShared.FemaleNoGloves = { - [0] = true, [1] = true, [2] = true, [3] = true, [4] = true, [5] = true, [6] = true, [7] = true, [8] = true, [9] = true, [10] = true, [11] = true, [12] = true, [13] = true, [14] = true, [15] = true, [19] = true, [59] = true, [60] = true, [61] = true, [62] = true, [63] = true, [64] = true, [65] = true, [66] = true, [67] = true, [68] = true, [69] = true, [70] = true, [71] = true, [129] = true, [130] = true, [131] = true, [135] = true, [142] = true, [149] = true, [153] = true, [157] = true, [161] = true, [165] = true -} + [0] = true, + [1] = true, + [2] = true, + [3] = true, + [4] = true, + [5] = true, + [6] = true, + [7] = true, + [8] = true, + [9] = true, + [10] = true, + [11] = true, + [12] = true, + [13] = true, + [14] = true, + [15] = true, + [19] = true, + [59] = true, + [60] = true, + [61] = true, + [62] = true, + [63] = true, + [64] = true, + [65] = true, + [66] = true, + [67] = true, + [68] = true, + [69] = true, + [70] = true, + [71] = true, + [129] = true, + [130] = true, + [131] = true, + [135] = true, + [142] = true, + [149] = true, + [153] = true, + [157] = true, + [161] = true, + [165] = true +} \ No newline at end of file