From f7ef019d26626bb93299b87792abbf3e3ca43353 Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Thu, 27 Jan 2022 14:32:14 -0500 Subject: [PATCH 001/120] [Update] Missing Vehicle Properties Added proper support for missing or unfinished vehicle property saving/getting: - neons enabled/disabled - tire health - tire burst state - tire burst completely - oil level - wheel size - wheel width - headlight color - interior color - modkit 17, 19, 21, 47, 49 - livery roof - tankHealth - Set LegacyFuel on setting fuel level --- client/events.lua | 2 + client/functions.lua | 112 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 101 insertions(+), 13 deletions(-) diff --git a/client/events.lua b/client/events.lua index 82d93b4..59a5a1a 100644 --- a/client/events.lua +++ b/client/events.lua @@ -61,7 +61,9 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) end local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) + exports['LegacyFuel']:SetFuel(vehicle, 100) SetModelAsNoLongerNeeded(vehicle) + TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle)) end) diff --git a/client/functions.lua b/client/functions.lua index 87a5887..422dd38 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -364,7 +364,7 @@ end -- Vehicle -function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked) +function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked, teleportInto) local model = GetHashKey(model) local ped = PlayerPedId() if coords then @@ -387,6 +387,8 @@ function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked) SetVehicleNeedsToBeHotwired(veh, false) SetVehRadioStation(veh, 'OFF') SetModelAsNoLongerNeeded(model) + exports['LegacyFuel']:SetFuel(veh, 100) + if teleportInto then TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1) end if cb then cb(veh) end @@ -418,10 +420,9 @@ end function QBCore.Functions.GetVehicleProperties(vehicle) if DoesEntityExist(vehicle) then - local colorPrimary, colorSecondary = GetVehicleColours(vehicle) local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) - local extras = {} + local colorPrimary, colorSecondary = GetVehicleColours(vehicle) if GetIsVehiclePrimaryColourCustom(vehicle) then r, g, b = GetVehicleCustomPrimaryColour(vehicle) colorPrimary = { r, g, b } @@ -432,6 +433,7 @@ function QBCore.Functions.GetVehicleProperties(vehicle) colorSecondary = { r, g, b } end + local extras = {} for extraId = 0, 12 do if DoesExtraExist(vehicle, extraId) then local state = IsVehicleExtraTurnedOn(vehicle, extraId) == 1 @@ -439,10 +441,29 @@ function QBCore.Functions.GetVehicleProperties(vehicle) end end + local modLivery = GetVehicleMod(vehicle, 48) if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= -1 then modLivery = GetVehicleLivery(vehicle) - else - modLivery = GetVehicleMod(vehicle, 48) + end + + local neons = {} + for i = 0,3 do + neons[i] = IsVehicleNeonLightEnabled(vehicle, i) + end + + local tireHealth = {} + for i = 0,3 do + tireHealth[i] = GetVehicleWheelHealth(vehicle, i) + end + + local tireBurstState = {} + for i = 0,5 do + tireBurstState[i] = IsVehicleTyreBurst(vehicle, i, false) + end + + local tireBurstCompletely = {} + for i = 0,5 do + tireBurstCompletely[i] = IsVehicleTyreBurst(vehicle, i, true) end return { @@ -454,6 +475,7 @@ function QBCore.Functions.GetVehicleProperties(vehicle) tankHealth = QBCore.Shared.Round(GetVehiclePetrolTankHealth(vehicle), 0.1), fuelLevel = QBCore.Shared.Round(GetVehicleFuelLevel(vehicle), 0.1), dirtLevel = QBCore.Shared.Round(GetVehicleDirtLevel(vehicle), 0.1), + oilLevel = QBCore.Shared.Round(GetVehicleOilLevel(vehicle), 0.1), color1 = colorPrimary, color2 = colorSecondary, pearlescentColor = pearlescentColor, @@ -461,15 +483,17 @@ function QBCore.Functions.GetVehicleProperties(vehicle) dashboardColor = GetVehicleDashboardColour(vehicle), wheelColor = wheelColor, wheels = GetVehicleWheelType(vehicle), + wheelSize = GetVehicleWheelSize(vehicle), + wheelWidth = GetVehicleWheelWidth(vehicle), + tireHealth = tireHealth, + tireBurstState = tireBurstState, + tireBurstCompletely = tireBurstCompletely, windowTint = GetVehicleWindowTint(vehicle), xenonColor = GetVehicleXenonLightsColour(vehicle), - neonEnabled = { - IsVehicleNeonLightEnabled(vehicle, 0), - IsVehicleNeonLightEnabled(vehicle, 1), - IsVehicleNeonLightEnabled(vehicle, 2), - IsVehicleNeonLightEnabled(vehicle, 3) - }, + neonEnabled = neons, neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)), + headlightColor = GetVehicleHeadlightsColour(vehicle), + interiorColor = GetVehicleInteriorColour(vehicle), extras = extras, tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)), modSpoilers = GetVehicleMod(vehicle, 0), @@ -489,8 +513,11 @@ function QBCore.Functions.GetVehicleProperties(vehicle) modHorns = GetVehicleMod(vehicle, 14), modSuspension = GetVehicleMod(vehicle, 15), modArmor = GetVehicleMod(vehicle, 16), + modKit17 = GetVehicleMod(vehicle, 17), modTurbo = IsToggleModOn(vehicle, 18), + modKit19 = GetVehicleMod(vehicle, 19), modSmokeEnabled = IsToggleModOn(vehicle, 20), + modKit21 = GetVehicleMod(vehicle, 21), modXenon = IsToggleModOn(vehicle, 22), modFrontWheels = GetVehicleMod(vehicle, 23), modBackWheels = GetVehicleMod(vehicle, 24), @@ -518,7 +545,10 @@ function QBCore.Functions.GetVehicleProperties(vehicle) modTrimB = GetVehicleMod(vehicle, 44), modTank = GetVehicleMod(vehicle, 45), modWindows = GetVehicleMod(vehicle, 46), + modKit47 = GetVehicleMod(vehicle, 47), modLivery = modLivery, + modKit49 = GetVehicleMod(vehicle, 49), + liveryRoof = GetVehicleRoofLivery(vehicle), } else return @@ -542,12 +572,38 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.engineHealth then SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0) end + if props.tankHealth then + SetVehiclePetrolTankHealth(vehicle, props.tankHealth) + end if props.fuelLevel then SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) + exports['LegacyFuel']:SetFuel(veh, props.fuelLevel + 0.0) + end + if props.oilLevel then + SetVehicleOilLevel(vehicle, props.oilLevel) end if props.dirtLevel then SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0) end + if props.tireHealth then + for wheelIndex, health in pairs(props.tireHealth) do + SetVehicleWheelHealth(vehicle, wheelIndex, health) + end + end + if props.tireBurstState then + for wheelIndex, burstState in pairs(props.tireBurstState) do + if burstState then + SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), false, 1000.0) + end + end + end + if props.tireBurstCompletely then + for wheelIndex, burstState in pairs(props.tireBurstCompletely) do + if burstState then + SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), true, 1000.0) + end + end + end if props.color1 then if type(props.color1) == "number" then SetVehicleColours(vehicle, props.color1, colorSecondary) @@ -598,8 +654,17 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.neonColor then SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3]) end - if props.modSmokeEnabled then - ToggleVehicleMod(vehicle, 20, true) + if props.headlightColor then + SetVehicleHeadlightsColour(vehicle, props.headlightColor) + end + if props.interiorColor then + SetVehicleInteriorColour(vehicle, props.interiorColor) + end + if props.wheelSize then + SetVehicleWheelSize(vehicle, props.wheelSize) + end + if props.wheelWidth then + SetVehicleWheelWidth(vehicle, props.wheelWidth) end if props.tyreSmokeColor then SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3]) @@ -655,9 +720,21 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.modArmor then SetVehicleMod(vehicle, 16, props.modArmor, false) end + if props.modKit17 then + SetVehicleMod(vehicle, 17, props.modKit17, false) + end if props.modTurbo then ToggleVehicleMod(vehicle, 18, props.modTurbo) end + if props.modKit19 then + SetVehicleMod(vehicle, 19, props.modKit19, false) + end + if props.modSmokeEnabled then + ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled) + end + if props.modKit21 then + SetVehicleMod(vehicle, 21, props.modKit21, false) + end if props.modXenon then ToggleVehicleMod(vehicle, 22, props.modXenon) end @@ -742,10 +819,19 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.modWindows then SetVehicleMod(vehicle, 46, props.modWindows, false) end + if props.modKit47 then + SetVehicleMod(vehicle, 47, props.modKit47, false) + end if props.modLivery then SetVehicleMod(vehicle, 48, props.modLivery, false) SetVehicleLivery(vehicle, props.modLivery) end + if props.modKit49 then + SetVehicleMod(vehicle, 49, props.modKit49, false) + end + if props.liveryRoof then + SetVehicleRoofLivery(vehicle, props.liveryRoof) + end end end From 2c5253918b9da894306958da812a6cabe101226c Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Thu, 27 Jan 2022 17:58:07 -0500 Subject: [PATCH 002/120] [Update] Missing Vehicle Properties Added door state and window state. --- client/functions.lua | 46 ++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 422dd38..09a9c1b 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -466,6 +466,16 @@ function QBCore.Functions.GetVehicleProperties(vehicle) tireBurstCompletely[i] = IsVehicleTyreBurst(vehicle, i, true) end + local _windowStatus = {} + for i=0, 7 do + _windowStatus[i] = IsVehicleWindowIntact(vehicle, i) == 1 + end + + local _doorStatus = {} + for i=0, 5 do + _doorStatus[i] = IsVehicleDoorDamaged(vehicle, i) == 1 + end + return { model = GetEntityModel(vehicle), plate = QBCore.Functions.GetPlate(vehicle), @@ -489,6 +499,8 @@ function QBCore.Functions.GetVehicleProperties(vehicle) tireBurstState = tireBurstState, tireBurstCompletely = tireBurstCompletely, windowTint = GetVehicleWindowTint(vehicle), + windowStatus = _windowStatus, + doorStatus = _doorStatus, xenonColor = GetVehicleXenonLightsColour(vehicle), neonEnabled = neons, neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)), @@ -557,6 +569,16 @@ end function QBCore.Functions.SetVehicleProperties(vehicle, props) if DoesEntityExist(vehicle) then + if props.extras then + for id, enabled in pairs(props.extras) do + if enabled then + SetVehicleExtra(vehicle, tonumber(id), 0) + else + SetVehicleExtra(vehicle, tonumber(id), 1) + end + end + end + local colorPrimary, colorSecondary = GetVehicleColours(vehicle) local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) SetVehicleModKit(vehicle, 0) @@ -636,19 +658,19 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.windowTint then SetVehicleWindowTint(vehicle, props.windowTint) end - if props.neonEnabled then - SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1]) - SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2]) - SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3]) - SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4]) + if props.windowStatus then + for windowIndex, smashWindow in pairs(props.windowStatus) do + if not smashWindow then SmashVehicleWindow(vehicle, windowIndex) end + end end - if props.extras then - for id, enabled in pairs(props.extras) do - if enabled then - SetVehicleExtra(vehicle, tonumber(id), 0) - else - SetVehicleExtra(vehicle, tonumber(id), 1) - end + if props.doorStatus then + for doorIndex, breakDoor in pairs(props.doorStatus) do + if breakDoor then SetVehicleDoorBroken(vehicle, doorIndex, true) end + end + end + if props.neonEnabled then + for neonIndex, enableNeons in pairs(props.neonEnabled) do + SetVehicleNeonLightEnabled(vehicle, i, enableNeons) end end if props.neonColor then From 8ca8282f2a3b4e9c7e403daeb1b1a64dd905bcdd Mon Sep 17 00:00:00 2001 From: Scullyy <51968381+Scullyy@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:31:48 +0000 Subject: [PATCH 003/120] Prevent duplicated phone and account numbers **Describe Pull request** This will prevent the chance of duplicated phone and account numbers, although the chance is very low it's still a possibility as I have experienced this myself and this will resolve that issue. I feel like this should be implemented as these are meant to be unique for each player. **Questions (please complete the following information):** - Have you personally loaded this code into an updated qbcore project and checked all it's functionality? Yes - Does your code fit the style guidelines? Yes - Does your PR fit the contribution guidelines? Yes --- server/player.lua | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/server/player.lua b/server/player.lua index f9ed6ad..869d8af 100644 --- a/server/player.lua +++ b/server/player.lua @@ -56,9 +56,9 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.charinfo.birthdate = PlayerData.charinfo.birthdate or '00-00-0000' PlayerData.charinfo.gender = PlayerData.charinfo.gender or 0 PlayerData.charinfo.backstory = PlayerData.charinfo.backstory or 'placeholder backstory' - PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'USA' - PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or '1' .. math.random(111111111, 999999999) - PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) + PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'American' + PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or QBCore.Functions.CreatePhoneNumber() + PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or QBCore.Functions.CreateAccountNumber() -- Metadata PlayerData.metadata = PlayerData.metadata or {} PlayerData.metadata['hunger'] = PlayerData.metadata['hunger'] or 100 @@ -510,7 +510,6 @@ local playertables = { -- Add tables as needed { table = 'crypto_transactions' }, { table = 'phone_invoices' }, { table = 'phone_messages' }, - { table = 'playerskins' }, { table = 'player_boats' }, { table = 'player_contacts' }, { table = 'player_houses' }, @@ -652,6 +651,34 @@ function QBCore.Player.CreateCitizenId() return CitizenId end +function QBCore.Functions.CreateAccountNumber() + local UniqueFound = false + local AccountNumber = nil + while not UniqueFound do + AccountNumber = 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) + local query = '%' .. AccountNumber .. '%' + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) + if result == 0 then + UniqueFound = true + end + end + return AccountNumber +end + +function QBCore.Functions.CreatePhoneNumber() + local UniqueFound = false + local PhoneNumber = nil + while not UniqueFound do + PhoneNumber = math.random(100,999) .. math.random(1000000,9999999) + local query = '%' .. PhoneNumber .. '%' + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) + if result == 0 then + UniqueFound = true + end + end + return PhoneNumber +end + function QBCore.Player.CreateFingerId() local UniqueFound = false local FingerId = nil From 6379245963c3c060c6b20024266d68e3ea5146e9 Mon Sep 17 00:00:00 2001 From: Scullyy Date: Thu, 3 Feb 2022 13:44:56 +0000 Subject: [PATCH 004/120] Revert "Prevent duplicated phone and account numbers" This reverts commit 8ca8282f2a3b4e9c7e403daeb1b1a64dd905bcdd. --- server/player.lua | 35 ++++------------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/server/player.lua b/server/player.lua index 869d8af..f9ed6ad 100644 --- a/server/player.lua +++ b/server/player.lua @@ -56,9 +56,9 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.charinfo.birthdate = PlayerData.charinfo.birthdate or '00-00-0000' PlayerData.charinfo.gender = PlayerData.charinfo.gender or 0 PlayerData.charinfo.backstory = PlayerData.charinfo.backstory or 'placeholder backstory' - PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'American' - PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or QBCore.Functions.CreatePhoneNumber() - PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or QBCore.Functions.CreateAccountNumber() + PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'USA' + PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or '1' .. math.random(111111111, 999999999) + PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) -- Metadata PlayerData.metadata = PlayerData.metadata or {} PlayerData.metadata['hunger'] = PlayerData.metadata['hunger'] or 100 @@ -510,6 +510,7 @@ local playertables = { -- Add tables as needed { table = 'crypto_transactions' }, { table = 'phone_invoices' }, { table = 'phone_messages' }, + { table = 'playerskins' }, { table = 'player_boats' }, { table = 'player_contacts' }, { table = 'player_houses' }, @@ -651,34 +652,6 @@ function QBCore.Player.CreateCitizenId() return CitizenId end -function QBCore.Functions.CreateAccountNumber() - local UniqueFound = false - local AccountNumber = nil - while not UniqueFound do - AccountNumber = 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) - local query = '%' .. AccountNumber .. '%' - local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) - if result == 0 then - UniqueFound = true - end - end - return AccountNumber -end - -function QBCore.Functions.CreatePhoneNumber() - local UniqueFound = false - local PhoneNumber = nil - while not UniqueFound do - PhoneNumber = math.random(100,999) .. math.random(1000000,9999999) - local query = '%' .. PhoneNumber .. '%' - local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) - if result == 0 then - UniqueFound = true - end - end - return PhoneNumber -end - function QBCore.Player.CreateFingerId() local UniqueFound = false local FingerId = nil From ca5383f2d262d4d83908ba8fe7d6ea7dc1bc928b Mon Sep 17 00:00:00 2001 From: Scullyy Date: Thu, 3 Feb 2022 13:48:40 +0000 Subject: [PATCH 005/120] Prevent duplicated phone and account numbers Describe Pull request This will prevent the chance of duplicated phone and account numbers, although the chance is very low it's still a possibility as I have experienced this myself and this will resolve that issue. I feel like this should be implemented as these are meant to be unique for each player. Questions: - Have you personally loaded this code into an updated qbcore project and checked all it's functionality? Yes - Does your code fit the style guidelines? Yes - Does your PR fit the contribution guidelines? Yes --- server/player.lua | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/server/player.lua b/server/player.lua index f9ed6ad..6121334 100644 --- a/server/player.lua +++ b/server/player.lua @@ -57,8 +57,8 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.charinfo.gender = PlayerData.charinfo.gender or 0 PlayerData.charinfo.backstory = PlayerData.charinfo.backstory or 'placeholder backstory' PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'USA' - PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or '1' .. math.random(111111111, 999999999) - PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) + PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or QBCore.Functions.CreatePhoneNumber() + PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or QBCore.Functions.CreateAccountNumber() -- Metadata PlayerData.metadata = PlayerData.metadata or {} PlayerData.metadata['hunger'] = PlayerData.metadata['hunger'] or 100 @@ -652,6 +652,34 @@ function QBCore.Player.CreateCitizenId() return CitizenId end +function QBCore.Functions.CreateAccountNumber() + local UniqueFound = false + local AccountNumber = nil + while not UniqueFound do + AccountNumber = 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) + local query = '%' .. AccountNumber .. '%' + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) + if result == 0 then + UniqueFound = true + end + end + return AccountNumber +end + +function QBCore.Functions.CreatePhoneNumber() + local UniqueFound = false + local PhoneNumber = nil + while not UniqueFound do + PhoneNumber = math.random(100,999) .. math.random(1000000,9999999) + local query = '%' .. PhoneNumber .. '%' + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) + if result == 0 then + UniqueFound = true + end + end + return PhoneNumber +end + function QBCore.Player.CreateFingerId() local UniqueFound = false local FingerId = nil From 1baa0bf868d0a2685ecf8ad0f2666a7b00708bbd Mon Sep 17 00:00:00 2001 From: Scullyy <51968381+Scullyy@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:58:24 +0000 Subject: [PATCH 006/120] Fix personal changes for public repo --- server/player.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/player.lua b/server/player.lua index 6121334..a1efc7b 100644 --- a/server/player.lua +++ b/server/player.lua @@ -658,7 +658,7 @@ function QBCore.Functions.CreateAccountNumber() while not UniqueFound do AccountNumber = 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) local query = '%' .. AccountNumber .. '%' - local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query }) if result == 0 then UniqueFound = true end @@ -672,7 +672,7 @@ function QBCore.Functions.CreatePhoneNumber() while not UniqueFound do PhoneNumber = math.random(100,999) .. math.random(1000000,9999999) local query = '%' .. PhoneNumber .. '%' - local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE metadata LIKE ?', { query }) + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query }) if result == 0 then UniqueFound = true end From 2723d67744a3ff5a4751dcadd2de134a327cebf5 Mon Sep 17 00:00:00 2001 From: Idris Date: Sun, 13 Feb 2022 17:26:17 +1100 Subject: [PATCH 007/120] feat (drawtext): Added IdrisDose/qb-drawtext to core to hopefully slow down the usage of drawtext3d. --- client/drawtext.lua | 60 +++++++++++++++++++++ fxmanifest.lua | 4 +- html/drawtext.css | 76 +++++++++++++++++++++++++++ html/drawtext.js | 124 ++++++++++++++++++++++++++++++++++++++++++++ html/index.html | 5 ++ html/style.css | 4 ++ 6 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 client/drawtext.lua create mode 100644 html/drawtext.css create mode 100644 html/drawtext.js diff --git a/client/drawtext.lua b/client/drawtext.lua new file mode 100644 index 0000000..4ae4a37 --- /dev/null +++ b/client/drawtext.lua @@ -0,0 +1,60 @@ +local function HideText() + SendNUIMessage({ + action = 'HIDE_TEXT', + }) +end + +local function DrawText(text, position) + if (not type(position) == "string") then position = "left" end + + SendNUIMessage({ + action = 'DRAW_TEXT', + data = { + text = text, + position = position + } + }) +end + +local function ChangeText(text, position) + if (not type(position) == "string") then position = "left" end + + SendNUIMessage({ + action = 'CHANGE_TEXT', + data = { + text = text, + position = position + } + }) +end + +local function KeyPressed() + Citizen.CreateThread(function() -- Not sure if a thread is needed but why not eh? + SendNUIMessage({ + action = 'KEY_PRESSED', + }) + Wait(500) + HideText() + end) +end + +RegisterNetEvent('qb-core:client:DrawText', function(text, position) + DrawText(text, position) +end) + +RegisterNetEvent('qb-core:client:ChangeText', function(text, position) + ChangeText(text, position) +end) + +RegisterNetEvent('qb-core:client:HideText', function() + HideText() +end) + +RegisterNetEvent('qb-core:client:KeyPressed', function() + KeyPressed() +end) + +exports('DrawText', DrawText) +exports('ChangeText', ChangeText) +exports('HideText', HideText) +exports('KeyPressed', KeyPressed) \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua index f654d19..d435db9 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -20,7 +20,8 @@ client_scripts { 'client/main.lua', 'client/functions.lua', 'client/loops.lua', - 'client/events.lua' + 'client/events.lua', + 'client/drawtext.lua' } server_scripts { @@ -38,6 +39,7 @@ ui_page 'html/index.html' files { 'html/index.html', 'html/style.css', + 'html/drawtext.css', 'html/*.js' } diff --git a/html/drawtext.css b/html/drawtext.css new file mode 100644 index 0000000..3892a85 --- /dev/null +++ b/html/drawtext.css @@ -0,0 +1,76 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;500&display=swap"); +:root { + --primary-bg: rgba(23, 23, 23, 90%); + --active-bg: #dc143c; + --font-color: white; +} + +#drawtext-container { + display: none; + width: 100%; + height: 100%; + overflow: hidden; + padding: 0; + margin: 0; + font-family: "Poppins", sans-serif !important; + font-weight: 300; +} +.text { + position: absolute; + background: var(--primary-bg); + color: var(--font-color); + margin-top: 0.5rem; + padding: 0.45rem; + border-radius: 0.15rem; + box-shadow: 0rem 0rem 0.1rem 0.05rem #000000; +} + +.text.pressed { + background: var(--active-bg); +} + +.top { + left: 45vw; + top: -100px; +} +.top.show { + transition: 0.5s; + top: 10px; + opacity: 1; +} +.top.hide { + transition: 0.5s; + top: -100px; + opacity: 0; +} + +.right { + top: 50%; + right: -100px; +} +.right.show { + transition: 0.5s; + right: 10px; + opacity: 1; +} +.right.hide { + transition: 0.5s; + right: -100px; + opacity: 0; +} + +.left { + top: 50%; + left: -100px; +} + +.left.show { + transition: 0.5s; + left: 10px; + opacity: 1; +} +.left.hide { + transition: 0.5s; + left: -100px; + opacity: 0; +} \ No newline at end of file diff --git a/html/drawtext.js b/html/drawtext.js new file mode 100644 index 0000000..544b450 --- /dev/null +++ b/html/drawtext.js @@ -0,0 +1,124 @@ +let direction = null; + +const drawText = async (textData) => { + const text = document.getElementById("text"); + let {position} = textData; + switch (textData.position) { + case "left": + addClass(text, position); + direction = "left"; + break; + case "top": + addClass(text, position); + direction = "top"; + break; + case "right": + addClass(text, position); + direction = "right"; + break; + default: + addClass(text, "left"); + direction = "left"; + break; + } + + text.innerHTML = textData.text; + document.getElementById("drawtext-container").style.display = "block"; + await sleep(100); + addClass(text, "show"); +}; + +const changeText = async (textData) => { + const text = document.getElementById("text"); + let {position} = textData; + + removeClass(text, "show"); + addClass(text, "pressed"); + addClass(text, "hide"); + + await sleep(500); + removeClass(text, "left"); + removeClass(text, "right"); + removeClass(text, "top"); + removeClass(text, "bottom"); + removeClass(text, "hide"); + removeClass(text, "pressed"); + + switch (textData.position) { + case "left": + addClass(text, position); + direction = "left"; + break; + case "top": + addClass(text, position); + direction = "top"; + break; + case "right": + addClass(text, position); + direction = "right"; + break; + default: + addClass(text, "left"); + direction = "left"; + break; + } + text.innerHTML = textData.text; + + await sleep(100); + text.classList.add("show"); +}; + +const hideText = async () => { + const text = document.getElementById("text"); + removeClass(text, "show"); + addClass(text, "hide"); + + setTimeout(() => { + removeClass(text, "left"); + removeClass(text, "right"); + removeClass(text, "top"); + removeClass(text, "bottom"); + removeClass(text, "hide"); + removeClass(text, "pressed"); + document.getElementById("drawtext-container").style.display = "none"; + }, 1000); +}; + +const keyPressed = () => { + const text = document.getElementById("text"); + addClass(text, "pressed"); +}; + +window.addEventListener("message", (event) => { + const data = event.data; + const action = data.action; + const textData = data.data; + switch (action) { + case "DRAW_TEXT": + return drawText(textData); + case "CHANGE_TEXT": + return changeText(textData); + case "HIDE_TEXT": + return hideText(); + case "KEY_PRESSED": + return keyPressed(); + default: + return; + } +}); + +const sleep = (ms) => { + return new Promise((resolve) => setTimeout(resolve, ms)); +}; + +const removeClass = (element, name) => { + if (element.classList.contains(name)) { + element.classList.remove(name); + } +}; + +const addClass = (element, name) => { + if (!element.classList.contains(name)) { + element.classList.add(name); + } +}; \ No newline at end of file diff --git a/html/index.html b/html/index.html index 5abf792..3d39174 100644 --- a/html/index.html +++ b/html/index.html @@ -31,11 +31,16 @@ defer > + +
+
+
+
\ No newline at end of file diff --git a/html/style.css b/html/style.css index 80b86dc..c260cce 100644 --- a/html/style.css +++ b/html/style.css @@ -1,3 +1,7 @@ +html::-webkit-scrollbar { + display: none; +} + .success { background-color: rgba(23, 23, 23, 90%); border-radius: 10px; From ae29c94a40b6260b6135603f567a52a4983fb834 Mon Sep 17 00:00:00 2001 From: Idris Date: Sun, 13 Feb 2022 20:45:49 +1100 Subject: [PATCH 008/120] feat (Shared): Added the ability to dynamically update the shared jobs, items and gangs. --- client/events.lua | 13 ++++++++++ fxmanifest.lua | 1 + server/exports.lua | 62 ++++++++++++++++++++++++++++++++++++++++++++++ server/player.lua | 9 +++++++ 4 files changed, 85 insertions(+) create mode 100644 server/exports.lua diff --git a/client/events.lua b/client/events.lua index 82d93b4..955c14f 100644 --- a/client/events.lua +++ b/client/events.lua @@ -140,3 +140,16 @@ RegisterNetEvent('QBCore:Command:ShowMe3D', function(senderId, msg) end end) end) + +-- Listen to Shared being updated +RegisterNetEvent('QBCore:Client:OnSharedUpdate', function(tableName, key, value) + QBCore.Shared[tableName][key] = value + TriggerEvent('QBCore:Client:UpdateObject') +end) + +RegisterNetEvent('QBCore:Client:OnSharedUpdateMultiple', function(tableName, values) + for key, value in ipairs(values) do + QBCore.Shared[tableName][key] = value + end + TriggerEvent('QBCore:Client:UpdateObject') +end) \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua index f654d19..b63a753 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -30,6 +30,7 @@ server_scripts { 'server/player.lua', 'server/events.lua', 'server/commands.lua', + 'server/exports.lua', 'server/debug.lua' } diff --git a/server/exports.lua b/server/exports.lua new file mode 100644 index 0000000..69b25cc --- /dev/null +++ b/server/exports.lua @@ -0,0 +1,62 @@ +-- Single add job function which should only be used if you planning on adding a single job +local function AddJob(jobName, job) + QBCore.Shared.Jobs[jobName] = job + TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Jobs', jobName, job) + TriggerEvent('QBCore:Server:UpdateObject') +end +QBCore.Functions.AddJob = AddJob +exports('AddJob', AddJob) + +-- Multiple Add Jobs +local function AddJobs(jobs) + for key, value in pairs(jobs) do + QBCore.Shared.Jobs[key] = value + end + + TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Jobs', jobs) + TriggerEvent('QBCore:Server:UpdateObject') +end +QBCore.Functions.AddJobs = AddJobs +exports('AddJobs', AddJobs) + +-- Single add item +local function AddItem(itemName, item) + QBCore.Shared.Items[itemName] = item + TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item) + TriggerEvent('QBCore:Server:UpdateObject') +end +QBCore.Functions.AddItem = AddItem +exports('AddItem', AddItem) + +-- Multiple Add Items +local function AddItems(items) + for key, value in pairs(items) do + QBCore.Shared.Items[key] = value + end + + TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Items', items) + TriggerEvent('QBCore:Server:UpdateObject') +end +QBCore.Functions.AddItems = AddItems +exports('AddItems', AddItems) + +-- Single Add Gang +local function AddGang(gangName, gang) + QBCore.Shared.Gangs[gangName] = gang + TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Gangs', gangName, gang) + TriggerEvent('QBCore:Server:UpdateObject') +end +QBCore.Functions.AddGang = AddGang +exports('AddGang', AddGang) + +-- Multiple Add Gangs +local function AddGangs(gangs) + for key, value in pairs(gangs) do + QBCore.Shared.Gangs[key] = value + end + + TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Gangs', gangs) + TriggerEvent('QBCore:Server:UpdateObject') +end +QBCore.Functions.AddGangs = AddGangs +exports('AddGangs', AddGangs) \ No newline at end of file diff --git a/server/player.lua b/server/player.lua index f9ed6ad..e4f1820 100644 --- a/server/player.lua +++ b/server/player.lua @@ -549,6 +549,8 @@ end QBCore.Player.LoadInventory = function(PlayerData) PlayerData.items = {} local inventory = MySQL.Sync.prepare('SELECT inventory FROM players WHERE citizenid = ?', { PlayerData.citizenid }) + local missingItems = {} + if inventory then inventory = json.decode(inventory) if next(inventory) then @@ -571,11 +573,18 @@ QBCore.Player.LoadInventory = function(PlayerData) slot = item.slot, combinable = itemInfo['combinable'] } + else + missingItems[#missingItems+1] = item.name:lower() end + end end end end + + if #missingItems > 0 then + print(("%s the following items removed as they no longer exist: %s"):format(GetPlayerName(PlayerData.source), json.encode(missingItems))) + end return PlayerData end From 74f088e4517e213b7035d40680868faa1942f4b0 Mon Sep 17 00:00:00 2001 From: Idris Date: Sun, 13 Feb 2022 21:28:22 +1100 Subject: [PATCH 009/120] feat (exports): Added minor validation to the new exports. --- server/exports.lua | 107 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 102 insertions(+), 5 deletions(-) diff --git a/server/exports.lua b/server/exports.lua index 69b25cc..3b0b37f 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -1,62 +1,159 @@ -- Single add job function which should only be used if you planning on adding a single job -local function AddJob(jobName, job) +local function AddJob(jobName, job, source) + if type(jobName) ~= "string" then + print('Failed to add the item, name is not a string') + if source ~= nil and source ~= '' then + TriggerClientEvent('QBCore:Notify', source, 'Failed to add the job, name is not a string', 'error', 3000) + end + return false + end + + if QBCore.Shared.Jobs[jobName] ~= nil then + print('Failed to add the item, item already exists') + if source ~= nil and source ~= '' then + TriggerClientEvent('QBCore:Notify', source, 'Failed to add the job, job already exists', 'error', 3000) + end + return false + end + QBCore.Shared.Jobs[jobName] = job TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Jobs', jobName, job) TriggerEvent('QBCore:Server:UpdateObject') + return true end QBCore.Functions.AddJob = AddJob exports('AddJob', AddJob) -- Multiple Add Jobs local function AddJobs(jobs) + local shouldContinue = true for key, value in pairs(jobs) do + if type(key) ~= "string" then + print('Failed to add the job, name is not a string') + shouldContinue = false + goto continue + end + + if QBCore.Shared.Jobs[key] ~= nil then + print('Failed to add the job, job already exists: ' .. key) + shouldContinue = false + goto continue + end + QBCore.Shared.Jobs[key] = value + ::continue:: end + if not shouldContinue then return false end TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Jobs', jobs) TriggerEvent('QBCore:Server:UpdateObject') + return true end QBCore.Functions.AddJobs = AddJobs exports('AddJobs', AddJobs) -- Single add item -local function AddItem(itemName, item) +local function AddItem(itemName, item, source) + if type(itemName) ~= "string" then + print('Failed to add the item, name is not a string') + if source ~= nil and source ~= '' then + TriggerClientEvent('QBCore:Notify', source, 'Failed to add the item, name is not a string', 'error', 3000) + end + return false + end + if QBCore.Shared.Items[itemName] ~= nil then + print('Failed to add the item, item already exists') + if source ~= nil and source ~= '' then + TriggerClientEvent('QBCore:Notify', source, 'Failed to add the item, item already exists', 'error', 3000) + end + return false + end + QBCore.Shared.Items[itemName] = item TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item) TriggerEvent('QBCore:Server:UpdateObject') + return true end QBCore.Functions.AddItem = AddItem exports('AddItem', AddItem) -- Multiple Add Items local function AddItems(items) + local shouldContinue = true for key, value in pairs(items) do - QBCore.Shared.Items[key] = value - end + if type(key) ~= "string" then + print('Failed to add the item, name is not a string') + shouldContinue = false + goto continue + end + if QBCore.Shared.Items[key] ~= nil then + print('Failed to add the item, item already exists: ' .. key) + shouldContinue = false + goto continue + end + + QBCore.Shared.Items[key] = value + ::continue:: + end + if not shouldContinue then return false end TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Items', items) TriggerEvent('QBCore:Server:UpdateObject') + return true end QBCore.Functions.AddItems = AddItems exports('AddItems', AddItems) -- Single Add Gang -local function AddGang(gangName, gang) +local function AddGang(gangName, gang, source) + if type(gangName) ~= "string" then + print('Failed to add the gang, name is not a string') + if source ~= nil and source ~= '' then + TriggerClientEvent('QBCore:Notify', source, 'Failed to add the gang, name is not a string', 'error', 3000) + end + return false + end + if QBCore.Shared.Gangs[gangName] ~= nil then + print('Failed to add the gang, gang already exists') + if source ~= nil and source ~= '' then + TriggerClientEvent('QBCore:Notify', source, 'Failed to add the gang, gang already exists', 'error', 3000) + end + return false + end + QBCore.Shared.Gangs[gangName] = gang TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Gangs', gangName, gang) TriggerEvent('QBCore:Server:UpdateObject') + return true end QBCore.Functions.AddGang = AddGang exports('AddGang', AddGang) -- Multiple Add Gangs local function AddGangs(gangs) + local shouldContinue = true + for key, value in pairs(gangs) do + if type(key) ~= "string" then + print('Failed to add the gang, name is not a string') + shouldContinue = false + goto continue + end + + if QBCore.Shared.Gangs[key] ~= nil then + print('Failed to add the gang, gang already exists: ' .. key) + shouldContinue = false + goto continue + end + QBCore.Shared.Gangs[key] = value + ::continue:: end + if not shouldContinue then return false end TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Gangs', gangs) TriggerEvent('QBCore:Server:UpdateObject') + return true end QBCore.Functions.AddGangs = AddGangs exports('AddGangs', AddGangs) \ No newline at end of file From e7efdbd5096af3c7c3679a3ed65d7f84779cbd06 Mon Sep 17 00:00:00 2001 From: Idris Date: Sun, 13 Feb 2022 21:49:59 +1100 Subject: [PATCH 010/120] hotfix (exports): Updated the way functions return, now returns status, message and item (if applicable). --- server/exports.lua | 101 +++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 58 deletions(-) diff --git a/server/exports.lua b/server/exports.lua index 3b0b37f..41344bb 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -1,25 +1,17 @@ -- Single add job function which should only be used if you planning on adding a single job -local function AddJob(jobName, job, source) +local function AddJob(jobName, job) if type(jobName) ~= "string" then - print('Failed to add the item, name is not a string') - if source ~= nil and source ~= '' then - TriggerClientEvent('QBCore:Notify', source, 'Failed to add the job, name is not a string', 'error', 3000) - end - return false + return false, "invalid_job_name" end if QBCore.Shared.Jobs[jobName] ~= nil then - print('Failed to add the item, item already exists') - if source ~= nil and source ~= '' then - TriggerClientEvent('QBCore:Notify', source, 'Failed to add the job, job already exists', 'error', 3000) - end - return false + return false, "job_exists" end QBCore.Shared.Jobs[jobName] = job TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Jobs', jobName, job) TriggerEvent('QBCore:Server:UpdateObject') - return true + return true, "success" end QBCore.Functions.AddJob = AddJob exports('AddJob', AddJob) @@ -27,52 +19,47 @@ exports('AddJob', AddJob) -- Multiple Add Jobs local function AddJobs(jobs) local shouldContinue = true + local message = "success" + local errorItem = nil for key, value in pairs(jobs) do if type(key) ~= "string" then - print('Failed to add the job, name is not a string') + message = 'invalid_job_name' shouldContinue = false - goto continue + errorItem = jobs[key] + break end if QBCore.Shared.Jobs[key] ~= nil then - print('Failed to add the job, job already exists: ' .. key) + message = 'job_exists' shouldContinue = false - goto continue + errorItem = jobs[key] + break end QBCore.Shared.Jobs[key] = value - ::continue:: end - if not shouldContinue then return false end + if not shouldContinue then return false, message, errorItem end TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Jobs', jobs) TriggerEvent('QBCore:Server:UpdateObject') - return true + return true, message, nil end QBCore.Functions.AddJobs = AddJobs exports('AddJobs', AddJobs) -- Single add item -local function AddItem(itemName, item, source) +local function AddItem(itemName, item) if type(itemName) ~= "string" then - print('Failed to add the item, name is not a string') - if source ~= nil and source ~= '' then - TriggerClientEvent('QBCore:Notify', source, 'Failed to add the item, name is not a string', 'error', 3000) - end - return false + return false, "invalid_item_name" end if QBCore.Shared.Items[itemName] ~= nil then - print('Failed to add the item, item already exists') - if source ~= nil and source ~= '' then - TriggerClientEvent('QBCore:Notify', source, 'Failed to add the item, item already exists', 'error', 3000) - end - return false + return false, "item_exists" end QBCore.Shared.Items[itemName] = item TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Items', itemName, item) TriggerEvent('QBCore:Server:UpdateObject') - return true + return true, "success" end QBCore.Functions.AddItem = AddItem exports('AddItem', AddItem) @@ -80,26 +67,30 @@ exports('AddItem', AddItem) -- Multiple Add Items local function AddItems(items) local shouldContinue = true + local message = "success" + local errorItem = nil for key, value in pairs(items) do if type(key) ~= "string" then - print('Failed to add the item, name is not a string') + message = "invalid_item_name" shouldContinue = false - goto continue + errorItem = items[key] + break end if QBCore.Shared.Items[key] ~= nil then - print('Failed to add the item, item already exists: ' .. key) + message = "item_exists" shouldContinue = false - goto continue + errorItem = items[key] + break end QBCore.Shared.Items[key] = value - ::continue:: end - if not shouldContinue then return false end + + if not shouldContinue then return false, message, errorItem end TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Items', items) TriggerEvent('QBCore:Server:UpdateObject') - return true + return true, message, nil end QBCore.Functions.AddItems = AddItems exports('AddItems', AddItems) @@ -107,24 +98,16 @@ exports('AddItems', AddItems) -- Single Add Gang local function AddGang(gangName, gang, source) if type(gangName) ~= "string" then - print('Failed to add the gang, name is not a string') - if source ~= nil and source ~= '' then - TriggerClientEvent('QBCore:Notify', source, 'Failed to add the gang, name is not a string', 'error', 3000) - end - return false + return false, "invalid_gang_name" end if QBCore.Shared.Gangs[gangName] ~= nil then - print('Failed to add the gang, gang already exists') - if source ~= nil and source ~= '' then - TriggerClientEvent('QBCore:Notify', source, 'Failed to add the gang, gang already exists', 'error', 3000) - end - return false + return false, "gang_exists" end QBCore.Shared.Gangs[gangName] = gang TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Gangs', gangName, gang) TriggerEvent('QBCore:Server:UpdateObject') - return true + return true, "success" end QBCore.Functions.AddGang = AddGang exports('AddGang', AddGang) @@ -132,28 +115,30 @@ exports('AddGang', AddGang) -- Multiple Add Gangs local function AddGangs(gangs) local shouldContinue = true - + local message = "success" + local errorItem = nil + for key, value in pairs(gangs) do if type(key) ~= "string" then - print('Failed to add the gang, name is not a string') + message = "invalid_gang_name" shouldContinue = false - goto continue + errorItem = items[key] + break end if QBCore.Shared.Gangs[key] ~= nil then - print('Failed to add the gang, gang already exists: ' .. key) + message = "gang_exists" shouldContinue = false - goto continue + errorItem = items[key] + break end - QBCore.Shared.Gangs[key] = value - ::continue:: end - if not shouldContinue then return false end + if not shouldContinue then return false, message, errorItem end TriggerClientEvent('QBCore:Client:OnSharedUpdateMultiple', -1, 'Gangs', gangs) TriggerEvent('QBCore:Server:UpdateObject') - return true + return true, message, nil end QBCore.Functions.AddGangs = AddGangs exports('AddGangs', AddGangs) \ No newline at end of file From d7116867a3143a51e077a62eb045c004ce5c0162 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 13 Feb 2022 23:09:57 +1100 Subject: [PATCH 011/120] bump: Upped version number --- fxmanifest.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 2ac3392..9763a1b 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'cerulean' game 'gta5' description 'QB-Core' -version '1.0.0' +version '1.1.0' shared_scripts { 'shared/locale.lua', @@ -50,4 +50,4 @@ dependencies { 'connectqueue' } -lua54 'yes' \ No newline at end of file +lua54 'yes' From df64b17aa376fe2e05aea24fab10e8e9ab410b7d Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Mon, 14 Feb 2022 17:32:16 +1100 Subject: [PATCH 012/120] Update fxmanifest.lua --- fxmanifest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 9763a1b..fd60bcf 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'cerulean' game 'gta5' description 'QB-Core' -version '1.1.0' +version '1.0.1' shared_scripts { 'shared/locale.lua', From efd28061e405afb875ffe07e19a6af330400c0f1 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Tue, 15 Feb 2022 13:51:35 +1100 Subject: [PATCH 013/120] feat (server/exports): Added GetCoreVersion to return the manifest version of the core. --- server/exports.lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/exports.lua b/server/exports.lua index 41344bb..c054e1c 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -141,4 +141,14 @@ local function AddGangs(gangs) return true, message, nil end QBCore.Functions.AddGangs = AddGangs -exports('AddGangs', AddGangs) \ No newline at end of file +exports('AddGangs', AddGangs) + +local function GetCoreVersion(InvokingResource) + local resourceVersion = GetResourceMetadata(GetCurrentResourceName(), 'version') + if InvokingResource ~= nil then + print( ("%s called qbcore version check: %s"):format(InvokingResource, resourceVersion) ) + end + return resourceVersion +end +QBCore.Functions.GetCoreVersion = GetCoreVersion +exports('GetCoreVersion', GetCoreVersion) From 430d40db6ae1480bab3bd07858d55a2037e642d4 Mon Sep 17 00:00:00 2001 From: darknight2590 <87971656+darknight2590@users.noreply.github.com> Date: Wed, 16 Feb 2022 11:25:53 +0200 Subject: [PATCH 014/120] feat (player/status): Added isdead check to hunger/thirst check thread --- client/loops.lua | 4 ++-- config.lua | 9 +-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/client/loops.lua b/client/loops.lua index ad79218..970ae84 100644 --- a/client/loops.lua +++ b/client/loops.lua @@ -11,9 +11,9 @@ end) CreateThread(function() while true do Wait(QBCore.Config.StatusInterval) + local PlayerData = QBCore.Functions.GetPlayerData() if LocalPlayer.state.isLoggedIn then - if QBCore.Functions.GetPlayerData().metadata['hunger'] <= 0 or - QBCore.Functions.GetPlayerData().metadata['thirst'] <= 0 then + if (PlayerData.metadata['hunger'] <= 0 or PlayerData.metadata['thirst'] <= 0) and (not PlayerData.metadata['isdead']) then local ped = PlayerPedId() local currentHealth = GetEntityHealth(ped) SetEntityHealth(ped, currentHealth - math.random(5, 10)) diff --git a/config.lua b/config.lua index 35a025a..65c8681 100644 --- a/config.lua +++ b/config.lua @@ -17,14 +17,7 @@ QBConfig.Player.MaxInvSlots = 41 -- Max inventory slots for a player QBConfig.Player.HungerRate = 4.2 -- Rate at which hunger goes down. QBConfig.Player.ThirstRate = 3.8 -- Rate at which thirst goes down. QBConfig.Player.Bloodtypes = { - "A+", - "A-", - "B+", - "B-", - "AB+", - "AB-", - "O+", - "O-", + "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-", } QBConfig.Server = {} -- General server config From 3b61e13854233c2d32b7fae13eadadd489cb1a25 Mon Sep 17 00:00:00 2001 From: darknight2590 <87971656+darknight2590@users.noreply.github.com> Date: Thu, 17 Feb 2022 10:35:01 +0200 Subject: [PATCH 015/120] feat (html): Organised html file - Darknight2590 * Rename html/app.js to html/js/app.js * Rename html/config.js to html/js/config.js * Rename html/drawtext.js to html/js/drawtext.js * Rename html/testing.js to html/js/testing.js * Rename html/utils.js to html/js/utils.js * Rename html/style.css to html/css/style.css * Rename html/drawtext.css to html/css/drawtext.css * Update fxmanifest.lua --- fxmanifest.lua | 6 +++--- html/{ => css}/drawtext.css | 2 +- html/{ => css}/style.css | 2 +- html/{ => js}/app.js | 0 html/{ => js}/config.js | 0 html/{ => js}/drawtext.js | 2 +- html/{ => js}/testing.js | 0 html/{ => js}/utils.js | 0 8 files changed, 6 insertions(+), 6 deletions(-) rename html/{ => css}/drawtext.css (99%) rename html/{ => css}/style.css (99%) rename html/{ => js}/app.js (100%) rename html/{ => js}/config.js (100%) rename html/{ => js}/drawtext.js (99%) rename html/{ => js}/testing.js (100%) rename html/{ => js}/utils.js (100%) diff --git a/fxmanifest.lua b/fxmanifest.lua index fd60bcf..8faba61 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -39,9 +39,9 @@ ui_page 'html/index.html' files { 'html/index.html', - 'html/style.css', - 'html/drawtext.css', - 'html/*.js' + 'html/css/style.css', + 'html/css/drawtext.css', + 'html/js/*.js' } dependencies { diff --git a/html/drawtext.css b/html/css/drawtext.css similarity index 99% rename from html/drawtext.css rename to html/css/drawtext.css index 3892a85..489e967 100644 --- a/html/drawtext.css +++ b/html/css/drawtext.css @@ -73,4 +73,4 @@ transition: 0.5s; left: -100px; opacity: 0; -} \ No newline at end of file +} diff --git a/html/style.css b/html/css/style.css similarity index 99% rename from html/style.css rename to html/css/style.css index c260cce..4581314 100644 --- a/html/style.css +++ b/html/css/style.css @@ -35,4 +35,4 @@ html::-webkit-scrollbar { border-radius: 10px; box-shadow: 0rem 0rem 0.1rem 0.05rem #000000; border-left: 5px solid #f44236; -} \ No newline at end of file +} diff --git a/html/app.js b/html/js/app.js similarity index 100% rename from html/app.js rename to html/js/app.js diff --git a/html/config.js b/html/js/config.js similarity index 100% rename from html/config.js rename to html/js/config.js diff --git a/html/drawtext.js b/html/js/drawtext.js similarity index 99% rename from html/drawtext.js rename to html/js/drawtext.js index 544b450..282d522 100644 --- a/html/drawtext.js +++ b/html/js/drawtext.js @@ -121,4 +121,4 @@ const addClass = (element, name) => { if (!element.classList.contains(name)) { element.classList.add(name); } -}; \ No newline at end of file +}; diff --git a/html/testing.js b/html/js/testing.js similarity index 100% rename from html/testing.js rename to html/js/testing.js diff --git a/html/utils.js b/html/js/utils.js similarity index 100% rename from html/utils.js rename to html/js/utils.js From f742dff5dec35c8dc2119a6de119f6cc0c7e42aa Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Fri, 18 Feb 2022 18:41:54 +1100 Subject: [PATCH 016/120] fix (semvar): Version correctly bumped --- fxmanifest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 8faba61..5c6123d 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'cerulean' game 'gta5' description 'QB-Core' -version '1.0.1' +version '1.1.0' shared_scripts { 'shared/locale.lua', From 3fcbf7001640f6e5ec5895e2503d35854ac828dd Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:00:16 +0100 Subject: [PATCH 017/120] optimize(loops): use core playerdata --- client/loops.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/client/loops.lua b/client/loops.lua index 970ae84..62b0f5d 100644 --- a/client/loops.lua +++ b/client/loops.lua @@ -1,23 +1,24 @@ CreateThread(function() while true do - Wait(0) + local sleep = 0 if LocalPlayer.state.isLoggedIn then - Wait((1000 * 60) * QBCore.Config.UpdateInterval) + sleep = (1000 * 60) * QBCore.Config.UpdateInterval TriggerServerEvent('QBCore:UpdatePlayer') end + Wait(sleep) end end) CreateThread(function() while true do - Wait(QBCore.Config.StatusInterval) - local PlayerData = QBCore.Functions.GetPlayerData() if LocalPlayer.state.isLoggedIn then - if (PlayerData.metadata['hunger'] <= 0 or PlayerData.metadata['thirst'] <= 0) and (not PlayerData.metadata['isdead']) then + if (QBCore.PlayerData.metadata['hunger'] <= 0 or QBCore.PlayerData.metadata['thirst'] <= 0) and not QBCore.PlayerData.metadata['isdead'] then local ped = PlayerPedId() local currentHealth = GetEntityHealth(ped) - SetEntityHealth(ped, currentHealth - math.random(5, 10)) + local decreaseTreshold = math.random(5, 10) + SetEntityHealth(ped, currentHealth - decreaseTreshold) end end + Wait(QBCore.Config.StatusInterval) end end) From 4b107e24d776755ef50c51251691e90b495def34 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:02:18 +0100 Subject: [PATCH 018/120] style(drawtext): camelCase for locals --- client/drawtext.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/client/drawtext.lua b/client/drawtext.lua index 4ae4a37..ef669b2 100644 --- a/client/drawtext.lua +++ b/client/drawtext.lua @@ -1,11 +1,11 @@ -local function HideText() +local function hideText() SendNUIMessage({ action = 'HIDE_TEXT', }) end -local function DrawText(text, position) - if (not type(position) == "string") then position = "left" end +local function drawText(text, position) + if not type(position) == "string" then position = "left" end SendNUIMessage({ action = 'DRAW_TEXT', @@ -16,8 +16,8 @@ local function DrawText(text, position) }) end -local function ChangeText(text, position) - if (not type(position) == "string") then position = "left" end +local function changeText(text, position) + if not type(position) == "string" then position = "left" end SendNUIMessage({ action = 'CHANGE_TEXT', @@ -28,33 +28,33 @@ local function ChangeText(text, position) }) end -local function KeyPressed() - Citizen.CreateThread(function() -- Not sure if a thread is needed but why not eh? +local function keyPressed() + CreateThread(function() -- Not sure if a thread is needed but why not eh? SendNUIMessage({ action = 'KEY_PRESSED', }) Wait(500) - HideText() + hideText() end) end RegisterNetEvent('qb-core:client:DrawText', function(text, position) - DrawText(text, position) + drawText(text, position) end) RegisterNetEvent('qb-core:client:ChangeText', function(text, position) - ChangeText(text, position) + changeText(text, position) end) RegisterNetEvent('qb-core:client:HideText', function() - HideText() + hideText() end) RegisterNetEvent('qb-core:client:KeyPressed', function() - KeyPressed() + keyPressed() end) -exports('DrawText', DrawText) -exports('ChangeText', ChangeText) -exports('HideText', HideText) -exports('KeyPressed', KeyPressed) \ No newline at end of file +exports('DrawText', drawText) +exports('ChangeText', changeText) +exports('HideText', hideText) +exports('KeyPressed', keyPressed) From a5bb0c99ce74588add1be301eba1af6063436860 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:07:19 +0100 Subject: [PATCH 019/120] tweak(functions): small changes --- client/functions.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 87a5887..c28084c 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -76,19 +76,18 @@ function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, sho end function QBCore.Functions.RequestAnimDict(animDict) - if not HasAnimDictLoaded(animDict) then - RequestAnimDict(animDict) - - while not HasAnimDictLoaded(animDict) do - Wait(4) - end + if HasAnimDictLoaded(animDict) then return end + RequestAnimDict(animDict) + while not HasAnimDictLoaded(animDict) do + Wait(0) end end function QBCore.Functions.LoadModel(ModelName) + if HasModelLoaded(ModelName) then return end RequestModel(ModelName) while not HasModelLoaded(ModelName) do - Wait(100) + Wait(0) end end @@ -208,15 +207,16 @@ function QBCore.Functions.GetClosestPed(coords, ignoreList) end function QBCore.Functions.IsWearingGloves() - local armIndex = GetPedDrawableVariation(PlayerPedId(), 3) - local model = GetEntityModel(PlayerPedId()) + local ped = PlayerPedId() + local armIndex = GetPedDrawableVariation(ped, 3) + local model = GetEntityModel(ped) local retval = true if model == `mp_m_freemode_01` then - if QBCore.Shared.MaleNoGloves[armIndex] ~= nil and QBCore.Shared.MaleNoGloves[armIndex] then + if QBCore.Shared.MaleNoGloves[armIndex] then retval = false end else - if QBCore.Shared.FemaleNoGloves[armIndex] ~= nil and QBCore.Shared.FemaleNoGloves[armIndex] then + if QBCore.Shared.FemaleNoGloves[armIndex] then retval = false end end From c615159c286cc682b089cf8d5895acfac4854dfb Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:13:08 +0100 Subject: [PATCH 020/120] style(events): indentation --- client/events.lua | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/client/events.lua b/client/events.lua index 955c14f..0e7ae4b 100644 --- a/client/events.lua +++ b/client/events.lua @@ -4,10 +4,9 @@ RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() ShutdownLoadingScreenNui() LocalPlayer.state:set('isLoggedIn', true, false) - if QBConfig.Server.pvp then - SetCanAttackFriendly(PlayerPedId(), true, false) - NetworkSetFriendlyFireOption(true) - end + if not QBConfig.Server.pvp then return end + SetCanAttackFriendly(PlayerPedId(), true, false) + NetworkSetFriendlyFireOption(true) end) RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() @@ -33,17 +32,16 @@ end) RegisterNetEvent('QBCore:Command:GoToMarker', function() local ped = PlayerPedId() local blip = GetFirstBlipInfoId(8) - if DoesBlipExist(blip) then - local blipCoords = GetBlipCoords(blip) - for height = 1, 1000 do + if not DoesBlipExist(blip) then return end + local blipCoords = GetBlipCoords(blip) + for height = 1, 1000 do + SetPedCoordsKeepVehicle(ped, blipCoords.x, blipCoords.y, height + 0.0) + local foundGround, zPos = GetGroundZFor_3dCoord(blipCoords.x, blipCoords.y, height + 0.0) + if foundGround then SetPedCoordsKeepVehicle(ped, blipCoords.x, blipCoords.y, height + 0.0) - local foundGround, zPos = GetGroundZFor_3dCoord(blipCoords.x, blipCoords.y, height + 0.0) - if foundGround then - SetPedCoordsKeepVehicle(ped, blipCoords.x, blipCoords.y, height + 0.0) - break - end - Wait(0) + break end + Wait(0) end end) @@ -52,12 +50,10 @@ end) RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) local ped = PlayerPedId() local hash = GetHashKey(vehName) - if not IsModelInCdimage(hash) then - return - end + if not IsModelInCdimage(hash) then return end RequestModel(hash) while not HasModelLoaded(hash) do - Wait(10) + Wait(0) end local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) @@ -152,4 +148,4 @@ RegisterNetEvent('QBCore:Client:OnSharedUpdateMultiple', function(tableName, val QBCore.Shared[tableName][key] = value end TriggerEvent('QBCore:Client:UpdateObject') -end) \ No newline at end of file +end) From 4cca8983954b4f9e60d9bdd7cac9ad8be2f3fc6f Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:16:08 +0100 Subject: [PATCH 021/120] style(main): indentation --- server/main.lua | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/server/main.lua b/server/main.lua index ff93dfc..535dc6f 100644 --- a/server/main.lua +++ b/server/main.lua @@ -16,13 +16,12 @@ end) CreateThread(function() local result = MySQL.Sync.fetchAll('SELECT * FROM permissions', {}) - if result[1] then - for k, v in pairs(result) do - QBCore.Config.Server.PermissionList[v.license] = { - license = v.license, - permission = v.permission, - optin = true, - } - end + 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 -end) \ No newline at end of file +end) From 25007c1bf4dbbd0945551e8356489ba28a416708 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 14:34:40 +0100 Subject: [PATCH 022/120] style(server/events): indentation and ocd --- server/commands.lua | 107 +++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 62 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index d094d0b..1b42ed7 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -20,200 +20,184 @@ function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, perm end function QBCore.Commands.Refresh(source) - local src = source - local Player = QBCore.Functions.GetPlayer(src) + local Player = QBCore.Functions.GetPlayer(source) local suggestions = {} - if Player then - for command, info in pairs(QBCore.Commands.List) do - local isGod = QBCore.Functions.HasPermission(src, 'god') - local hasPerm = QBCore.Functions.HasPermission(src, QBCore.Commands.List[command].permission) - local isPrincipal = IsPlayerAceAllowed(src, 'command') - if isGod or hasPerm or isPrincipal then - suggestions[#suggestions + 1] = { - name = '/' .. command, - help = info.help, - params = info.arguments - } - end + 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 + suggestions[#suggestions + 1] = { + name = '/' .. command, + help = info.help, + params = info.arguments + } end - TriggerClientEvent('chat:addSuggestions', tonumber(source), suggestions) end + TriggerClientEvent('chat:addSuggestions', source, suggestions) end -- Teleport QBCore.Commands.Add('tp', 'TP To Player or Coords (Admin Only)', { { name = 'id/x', help = 'ID of player or X position' }, { name = 'y', help = 'Y position' }, { name = 'z', help = 'Z position' } }, false, function(source, args) - local src = source if args[1] and not args[2] and not args[3] then local target = GetPlayerPed(tonumber(args[1])) if target ~= 0 then local coords = GetEntityCoords(target) - TriggerClientEvent('QBCore:Command:TeleportToPlayer', src, coords) + TriggerClientEvent('QBCore:Command:TeleportToPlayer', source, coords) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end else if args[1] and args[2] and args[3] then local x = tonumber(args[1]) local y = tonumber(args[2]) local z = tonumber(args[3]) - if (x ~= 0) and (y ~= 0) and (z ~= 0) then - TriggerClientEvent('QBCore:Command:TeleportToCoords', src, x, y, z) + if x ~= 0 and y ~= 0 and z ~= 0 then + TriggerClientEvent('QBCore:Command:TeleportToCoords', source, x, y, z) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.wrong_format'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.wrong_format'), 'error') end else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.missing_args'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.missing_args'), 'error') end end end, 'admin') QBCore.Commands.Add('tpm', 'TP To Marker (Admin Only)', {}, false, function(source) - local src = source - TriggerClientEvent('QBCore:Command:GoToMarker', src) + TriggerClientEvent('QBCore:Command:GoToMarker', source) end, 'admin') - -QBCore.Commands.Add('togglepvp', 'Toggle PVP on the server (Admin Only)', {}, false, function(source) - local src = source +QBCore.Commands.Add('togglepvp', 'Toggle PVP on the server (Admin Only)', {}, false, function() local pvp_state = QBConfig.Server.pvp QBConfig.Server.pvp = not pvp_state TriggerClientEvent('QBCore:Client:PvpHasToggled', -1, QBConfig.Server.pvp) end, 'admin') + -- Permissions QBCore.Commands.Add('addpermission', 'Give Player Permissions (God Only)', { { name = 'id', help = 'ID of player' }, { name = 'permission', help = 'Permission level' } }, true, function(source, args) - local src = source local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) local permission = tostring(args[2]):lower() if Player then QBCore.Functions.AddPermission(Player.PlayerData.source, permission) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'god') QBCore.Commands.Add('removepermission', 'Remove Players Permissions (God Only)', { { name = 'id', help = 'ID of player' } }, true, function(source, args) - local src = source local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) if Player then QBCore.Functions.RemovePermission(Player.PlayerData.source) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'god') -- Vehicle QBCore.Commands.Add('car', 'Spawn Vehicle (Admin Only)', { { name = 'model', help = 'Model name of the vehicle' } }, true, function(source, args) - local src = source - TriggerClientEvent('QBCore:Command:SpawnVehicle', src, args[1]) + TriggerClientEvent('QBCore:Command:SpawnVehicle', source, args[1]) end, 'admin') QBCore.Commands.Add('dv', 'Delete Vehicle (Admin Only)', {}, false, function(source) - local src = source - TriggerClientEvent('QBCore:Command:DeleteVehicle', src) + TriggerClientEvent('QBCore:Command:DeleteVehicle', source) end, 'admin') -- Money QBCore.Commands.Add('givemoney', 'Give A Player Money (Admin Only)', { { name = 'id', help = 'Player ID' }, { name = 'moneytype', help = 'Type of money (cash, bank, crypto)' }, { name = 'amount', help = 'Amount of money' } }, true, function(source, args) - local src = source local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) if Player then Player.Functions.AddMoney(tostring(args[2]), tonumber(args[3])) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'admin') QBCore.Commands.Add('setmoney', 'Set Players Money Amount (Admin Only)', { { name = 'id', help = 'Player ID' }, { name = 'moneytype', help = 'Type of money (cash, bank, crypto)' }, { name = 'amount', help = 'Amount of money' } }, true, function(source, args) - local src = source local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) if Player then Player.Functions.SetMoney(tostring(args[2]), tonumber(args[3])) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'admin') -- Job QBCore.Commands.Add('job', 'Check Your Job', {}, false, function(source) - local src = source - local PlayerJob = QBCore.Functions.GetPlayer(src).PlayerData.job - TriggerClientEvent('QBCore:Notify', src, Lang:t('info.job_info', {value = PlayerJob.label, value2 = PlayerJob.grade.name, value3 = PlayerJob.onduty})) + local PlayerJob = QBCore.Functions.GetPlayer(source).PlayerData.job + TriggerClientEvent('QBCore:Notify', source, Lang:t('info.job_info', {value = PlayerJob.label, value2 = PlayerJob.grade.name, value3 = PlayerJob.onduty})) end, 'user') QBCore.Commands.Add('setjob', 'Set A Players Job (Admin Only)', { { name = 'id', help = 'Player ID' }, { name = 'job', help = 'Job name' }, { name = 'grade', help = 'Grade' } }, true, function(source, args) - local src = source local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) if Player then Player.Functions.SetJob(tostring(args[2]), tonumber(args[3])) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'admin') -- Gang QBCore.Commands.Add('gang', 'Check Your Gang', {}, false, function(source) - local src = source local PlayerGang = QBCore.Functions.GetPlayer(source).PlayerData.gang - TriggerClientEvent('QBCore:Notify', src, Lang:t('info.gang_info', {value = PlayerGang.label, value2 = PlayerGang.grade.name})) + TriggerClientEvent('QBCore:Notify', source, Lang:t('info.gang_info', {value = PlayerGang.label, value2 = PlayerGang.grade.name})) end, 'user') QBCore.Commands.Add('setgang', 'Set A Players Gang (Admin Only)', { { name = 'id', help = 'Player ID' }, { name = 'gang', help = 'Name of a gang' }, { name = 'grade', help = 'Grade' } }, true, function(source, args) - local src = source local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) if Player then Player.Functions.SetGang(tostring(args[2]), tonumber(args[3])) else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'admin') -- Inventory (should be in qb-inventory?) QBCore.Commands.Add('clearinv', 'Clear Players Inventory (Admin Only)', { { name = 'id', help = 'Player ID' } }, false, function(source, args) - local src = source - local playerId = args[1] or src + local playerId = args[1] and args[1] ~= '' or source local Player = QBCore.Functions.GetPlayer(tonumber(playerId)) if Player then Player.Functions.ClearInventory() else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_online'), 'error') + TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'admin') -- Out of Character Chat QBCore.Commands.Add('ooc', 'OOC Chat Message', {}, false, function(source, args) - local src = source local message = table.concat(args, ' ') local Players = QBCore.Functions.GetPlayers() - local Player = QBCore.Functions.GetPlayer(src) + local Player = QBCore.Functions.GetPlayer(source) + local playerCoords = GetEntityCoords(GetPlayerPed(source)) for k, v in pairs(Players) do - if v == src then + if v == source then TriggerClientEvent('chat:addMessage', v, { color = { 0, 0, 255}, multiline = true, - args = {'OOC | '.. GetPlayerName(src), message} + args = {'OOC | '.. GetPlayerName(source), message} }) - elseif #(GetEntityCoords(GetPlayerPed(src)) - GetEntityCoords(GetPlayerPed(v))) < 20.0 then + elseif #(playerCoords - GetEntityCoords(GetPlayerPed(v))) < 20.0 then TriggerClientEvent('chat:addMessage', v, { color = { 0, 0, 255}, multiline = true, - args = {'OOC | '.. GetPlayerName(src), message} + args = {'OOC | '.. GetPlayerName(source), message} }) elseif QBCore.Functions.HasPermission(v, 'admin') then if QBCore.Functions.IsOptin(v) then TriggerClientEvent('chat:addMessage', v, { color = { 0, 0, 255}, multiline = true, - args = {'Proxmity OOC | '.. GetPlayerName(src), message} + args = {'Proxmity OOC | '.. GetPlayerName(source), message} }) - TriggerEvent('qb-log:server:CreateLog', 'ooc', 'OOC', 'white', '**' .. GetPlayerName(src) .. '** (CitizenID: ' .. Player.PlayerData.citizenid .. ' | ID: ' .. src .. ') **Message:** ' .. message, false) + TriggerEvent('qb-log:server:CreateLog', 'ooc', 'OOC', 'white', '**' .. GetPlayerName(source) .. '** (CitizenID: ' .. Player.PlayerData.citizenid .. ' | ID: ' .. source .. ') **Message:** ' .. message, false) end end end @@ -222,8 +206,7 @@ end, 'user') -- Me command QBCore.Commands.Add('me', 'Show local message', {{name = 'message', help = 'Message to respond with'}}, false, function(source, args) - local src = source - local ped = GetPlayerPed(src) + local ped = GetPlayerPed(source) local pCoords = GetEntityCoords(ped) local msg = table.concat(args, ' ') if msg == '' then return end @@ -231,7 +214,7 @@ QBCore.Commands.Add('me', 'Show local message', {{name = 'message', help = 'Mess local target = GetPlayerPed(v) local tCoords = GetEntityCoords(target) if #(pCoords - tCoords) < 20 then - TriggerClientEvent('QBCore:Command:ShowMe3D', v, src, msg) + TriggerClientEvent('QBCore:Command:ShowMe3D', v, source, msg) end end end, 'user') From fd088d9dcf826396db5b00b87259cb0281ca8914 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 14:51:40 +0100 Subject: [PATCH 023/120] feat(debug): allow for more types to be sent to the debug --- server/debug.lua | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/server/debug.lua b/server/debug.lua index bcdd919..9b4b3b2 100644 --- a/server/debug.lua +++ b/server/debug.lua @@ -1,38 +1,39 @@ local function tPrint(tbl, indent) indent = indent or 0 - for k, v in pairs(tbl) do - local tblType = type(v) - local formatting = ("%s ^3%s:^0"):format(string.rep(" ", indent), k) + if type(tbl) == 'table' then + for k, v in pairs(tbl) do + local tblType = type(v) + local formatting = ("%s ^3%s:^0"):format(string.rep(" ", indent), k) - if tblType == "table" then - print(formatting) - tPrint(v, indent + 1) - elseif tblType == 'boolean' then - print(("%s^1 %s ^0"):format(formatting, v)) - elseif tblType == "function" then - print(("%s^9 %s ^0"):format(formatting, v)) - elseif tblType == 'number' then - print(("%s^5 %s ^0"):format(formatting, v)) - elseif tblType == 'string' then - print(("%s ^2'%s' ^0"):format(formatting, v)) - else - print(("%s^2 %s ^0"):format(formatting, v)) + if tblType == "table" then + print(formatting) + tPrint(v, indent + 1) + elseif tblType == 'boolean' then + print(("%s^1 %s ^0"):format(formatting, v)) + elseif tblType == "function" then + print(("%s^9 %s ^0"):format(formatting, v)) + elseif tblType == 'number' then + print(("%s^5 %s ^0"):format(formatting, v)) + elseif tblType == 'string' then + print(("%s ^2'%s' ^0"):format(formatting, v)) + else + print(("%s^2 %s ^0"):format(formatting, v)) + end end + else + print(("%s ^0%s"):format(string.rep(" ", indent), tbl)) end end -RegisterServerEvent('QBCore:DebugSomething', function(table, indent) +RegisterServerEvent('QBCore:DebugSomething', function(tbl, indent) local resource = GetInvokingResource() or "qb-core" - print(('\x1b[4m\x1b[36m[ %s : DEBUG]\x1b[0m'):format(resource)) - - tPrint(table, indent) - + tPrint(tbl, indent) print('\x1b[4m\x1b[36m[ END DEBUG ]\x1b[0m') end) -function QBCore.Debug(table, indent) - TriggerEvent('QBCore:DebugSomething', table, indent) +function QBCore.Debug(tbl, indent) + TriggerEvent('QBCore:DebugSomething', tbl, indent) end function QBCore.ShowError(resource, msg) From e61cc2632256468f8c899ae22e80277309cbf6de Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 15:21:48 +0100 Subject: [PATCH 024/120] style(server/events): indentation --- server/events.lua | 226 ++++++++++++++++++++++------------------------ 1 file changed, 106 insertions(+), 120 deletions(-) diff --git a/server/events.lua b/server/events.lua index d543ca3..4b21014 100644 --- a/server/events.lua +++ b/server/events.lua @@ -2,51 +2,47 @@ AddEventHandler('playerDropped', function() local src = source - if QBCore.Players[src] then - local Player = QBCore.Players[src] - TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Dropped', 'red', '**' .. GetPlayerName(src) .. '** (' .. Player.PlayerData.license .. ') left..') - Player.Functions.Save() - _G.Player_Buckets[Player.PlayerData.license] = nil - QBCore.Players[src] = nil - end + if not QBCore.Players[src] then return end + local Player = QBCore.Players[src] + TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Dropped', 'red', '**' .. GetPlayerName(src) .. '** (' .. Player.PlayerData.license .. ') left..') + Player.Functions.Save() + Player_Buckets[Player.PlayerData.license] = nil + QBCore.Players[src] = nil end) -AddEventHandler('chatMessage', function(source, n, message) +AddEventHandler('chatMessage', function(source, _, message) local src = source - if string.sub(message, 1, 1) == '/' then - local args = QBCore.Shared.SplitStr(message, ' ') - local command = string.gsub(args[1]:lower(), '/', '') - CancelEvent() - if QBCore.Commands.List[command] then - local Player = QBCore.Functions.GetPlayer(src) - if Player then - 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 (QBCore.Commands.List[command].argsrequired and #QBCore.Commands.List[command].arguments ~= 0 and args[#QBCore.Commands.List[command].arguments] == nil) then - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.missing_args2'), 'error') - else - QBCore.Commands.List[command].callback(src, args) - end - else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_access'), 'error') - end - end + if string.sub(message, 1, 1) ~= '/' then return end + local args = QBCore.Shared.SplitStr(message, ' ') + local command = string.gsub(args[1]:lower(), '/', '') + CancelEvent() + 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 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 + QBCore.Commands.List[command].callback(src, args) end + else + TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_access'), 'error') end end) -- Player Connecting local function OnPlayerConnecting(name, setKickReason, deferrals) - local player = source + local src = source local license - local identifiers = GetPlayerIdentifiers(player) + local identifiers = GetPlayerIdentifiers(src) deferrals.defer() - -- mandatory wait! + -- Mandatory wait Wait(0) deferrals.update(string.format('Hello %s. Validating Your Rockstar License', name)) @@ -58,12 +54,12 @@ local function OnPlayerConnecting(name, setKickReason, deferrals) end end - -- mandatory wait! + -- Mandatory wait Wait(2500) deferrals.update(string.format('Hello %s. We are checking if you are banned.', name)) - local isBanned, Reason = QBCore.Functions.IsPlayerBanned(player) + local isBanned, Reason = QBCore.Functions.IsPlayerBanned(src) local isLicenseAlreadyInUse = QBCore.Functions.IsLicenseInUse(license) Wait(2500) @@ -81,7 +77,7 @@ local function OnPlayerConnecting(name, setKickReason, deferrals) Wait(1000) TriggerEvent('connectqueue:playerConnect', name, setKickReason, deferrals) end - --Add any additional defferals you may need! + -- Add any additional defferals you may need! end AddEventHandler('playerConnecting', OnPlayerConnecting) @@ -90,8 +86,8 @@ AddEventHandler('playerConnecting', OnPlayerConnecting) RegisterNetEvent('QBCore:server:CloseServer', function(reason) local src = source - if QBCore.Functions.HasPermission(src, 'admin') or QBCore.Functions.HasPermission(src, 'god') then - local reason = reason or 'No reason specified' + if QBCore.Functions.HasPermission(src, 'admin') then + reason = reason or 'No reason specified' QBCore.Config.Server.closed = true QBCore.Config.Server.closedReason = reason else @@ -101,7 +97,7 @@ end) RegisterNetEvent('QBCore:server:OpenServer', function() local src = source - if QBCore.Functions.HasPermission(src, 'admin') or QBCore.Functions.HasPermission(src, 'god') then + if QBCore.Functions.HasPermission(src, 'admin') then QBCore.Config.Server.closed = false else QBCore.Functions.Kick(src, 'You don\'t have permissions for this..', nil, nil) @@ -122,20 +118,19 @@ end) RegisterNetEvent('QBCore:UpdatePlayer', function() local src = source local Player = QBCore.Functions.GetPlayer(src) - if Player then - local newHunger = Player.PlayerData.metadata['hunger'] - QBCore.Config.Player.HungerRate - local newThirst = Player.PlayerData.metadata['thirst'] - QBCore.Config.Player.ThirstRate - if newHunger <= 0 then - newHunger = 0 - end - if newThirst <= 0 then - newThirst = 0 - end - Player.Functions.SetMetaData('thirst', newThirst) - Player.Functions.SetMetaData('hunger', newHunger) - TriggerClientEvent('hud:client:UpdateNeeds', src, newHunger, newThirst) - Player.Functions.Save() + if not Player then return end + local newHunger = Player.PlayerData.metadata['hunger'] - QBCore.Config.Player.HungerRate + local newThirst = Player.PlayerData.metadata['thirst'] - QBCore.Config.Player.ThirstRate + if newHunger <= 0 then + newHunger = 0 end + if newThirst <= 0 then + newThirst = 0 + end + Player.Functions.SetMetaData('thirst', newThirst) + Player.Functions.SetMetaData('hunger', newHunger) + TriggerClientEvent('hud:client:UpdateNeeds', src, newHunger, newThirst) + Player.Functions.Save() end) RegisterNetEvent('QBCore:Server:SetMetaData', function(meta, data) @@ -155,6 +150,7 @@ end) RegisterNetEvent('QBCore:ToggleDuty', function() local src = source local Player = QBCore.Functions.GetPlayer(src) + if not Player then return end if Player.PlayerData.job.onduty then Player.Functions.SetJobDuty(false) TriggerClientEvent('QBCore:Notify', src, Lang:t('info.off_duty')) @@ -169,22 +165,21 @@ end) RegisterNetEvent('QBCore:Server:UseItem', function(item) local src = source - if item and item.amount > 0 then - if QBCore.Functions.CanUseItem(item.name) then - QBCore.Functions.UseItem(src, item) - end - end + if not item or item.amount <= 0 or not QBCore.Functions.CanUseItem(item.name) then return end + QBCore.Functions.UseItem(src, item) end) RegisterNetEvent('QBCore:Server:RemoveItem', function(itemName, amount, slot) local src = source local Player = QBCore.Functions.GetPlayer(src) + if not Player then return end Player.Functions.RemoveItem(itemName, amount, slot) end) RegisterNetEvent('QBCore:Server:AddItem', function(itemName, amount, slot, info) local src = source local Player = QBCore.Functions.GetPlayer(src) + if not Player then return end Player.Functions.AddItem(itemName, amount, slot, info) end) @@ -192,83 +187,74 @@ end) RegisterNetEvent('QBCore:CallCommand', function(command, args) local src = source - if QBCore.Commands.List[command] then - local Player = QBCore.Functions.GetPlayer(src) - if Player then - 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].argsrequired and #QBCore.Commands.List[command].arguments ~= 0 and args[#QBCore.Commands.List[command].arguments] == nil) then - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.missing_args2'), 'error') - else - QBCore.Commands.List[command].callback(src, args) - end - else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_access'), 'error') - end + 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].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 + QBCore.Commands.List[command].callback(src, args) end + else + TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_access'), 'error') end end) -- Has Item Callback (can also use client function - QBCore.Functions.HasItem(item)) QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, amount) - local src = source local retval = false - local Player = QBCore.Functions.GetPlayer(src) - if Player then - if type(items) == 'table' then - local count = 0 - local finalcount = 0 - for k, v in pairs(items) do - if type(k) == 'string' then - finalcount = 0 - for i, _ in pairs(items) do - if i then - finalcount = finalcount + 1 - end - end - local item = Player.Functions.GetItemByName(k) - if item then - if item.amount >= v then - count = count + 1 - if count == finalcount then - retval = true - end - end - end - else - finalcount = #items - local item = Player.Functions.GetItemByName(v) - if item then - if amount then - if item.amount >= amount then - count = count + 1 - if count == finalcount then - retval = true - end - end - else - count = count + 1 - if count == finalcount then - retval = true - end + local Player = QBCore.Functions.GetPlayer(source) + if not Player then return cb(false) end + if type(items) == 'table' then + local count = 0 + local finalcount = 0 + for k, v in pairs(items) do + if type(k) == 'string' then + finalcount = 0 + for i, _ in pairs(items) do finalcount += 1 end + local item = Player.Functions.GetItemByName(k) + if item then + if item.amount >= v then + count += 1 + if count == finalcount then + retval = true end end end + else + finalcount = #items + local item = Player.Functions.GetItemByName(v) + if item then + if amount then + if item.amount >= amount then + count += 1 + if count == finalcount then + retval = true + end + end + else + count += 1 + if count == finalcount then + retval = true + end + end + end + end + end + else + local item = Player.Functions.GetItemByName(items) + if not item then return cb(false) end + if amount then + if item.amount >= amount then + retval = true end else - local item = Player.Functions.GetItemByName(items) - if item then - if amount then - if item.amount >= amount then - retval = true - end - else - retval = true - end - end + retval = true end end cb(retval) From 38534b73f056650f176ca356a48e6587562b1731 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:09:35 +0100 Subject: [PATCH 025/120] style(server/functions): indentation --- server/functions.lua | 203 +++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 122 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index df63ca7..e1498c1 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -12,9 +12,9 @@ function QBCore.Functions.GetCoords(entity) end function QBCore.Functions.GetIdentifier(source, idtype) - local src = source - local idtype = idtype or QBConfig.IdentifierType - for _, identifier in pairs(GetPlayerIdentifiers(src)) do + idtype = idtype or QBConfig.IdentifierType + local identifiers = GetPlayerIdentifiers(source) + for _, identifier in pairs(identifiers) do if string.find(identifier, idtype) then return identifier end @@ -23,7 +23,7 @@ function QBCore.Functions.GetIdentifier(source, idtype) end function QBCore.Functions.GetSource(identifier) - for src, player in pairs(QBCore.Players) do + for src, _ in pairs(QBCore.Players) do local idens = GetPlayerIdentifiers(src) for _, id in pairs(idens) do if identifier == id then @@ -35,18 +35,16 @@ function QBCore.Functions.GetSource(identifier) end function QBCore.Functions.GetPlayer(source) - local src = source if type(src) == 'number' then - return QBCore.Players[src] + return QBCore.Players[source] else - return QBCore.Players[QBCore.Functions.GetSource(src)] + return QBCore.Players[QBCore.Functions.GetSource(source)] end end function QBCore.Functions.GetPlayerByCitizenId(citizenid) - for src, player in pairs(QBCore.Players) do - local cid = citizenid - if QBCore.Players[src].PlayerData.citizenid == cid then + for src, _ in pairs(QBCore.Players) do + if QBCore.Players[src].PlayerData.citizenid == citizenid then return QBCore.Players[src] end end @@ -54,8 +52,7 @@ function QBCore.Functions.GetPlayerByCitizenId(citizenid) end function QBCore.Functions.GetPlayerByPhone(number) - for src, player in pairs(QBCore.Players) do - local cid = citizenid + for src, _ in pairs(QBCore.Players) do if QBCore.Players[src].PlayerData.charinfo.phone == number then return QBCore.Players[src] end @@ -81,12 +78,11 @@ end 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 = count + 1 + count += 1 end end end @@ -96,11 +92,10 @@ 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.Functions.GetQBPlayers()) do + for _, Player in pairs(QBCore.Players) do if Player.PlayerData.job.name == job then if Player.PlayerData.job.onduty then - count = count + 1 + count += 1 end end end @@ -108,13 +103,13 @@ function QBCore.Functions.GetDutyCount(job) end --- Routingbucket stuff (Only touch if you know what you are doing) -_G.Player_Buckets = {} -- Bucket array containing all players that have been set to a different bucket -_G.Entity_Buckets = {} -- Bucket array containing all entities that have been set to a different bucket +Player_Buckets = {} -- Bucket array containing all players that have been set to a different bucket +Entity_Buckets = {} -- Bucket array containing all entities that have been set to a different bucket --- Returns the objects related to buckets, first returned value is the player buckets , second one is entity buckets function QBCore.Functions.GetBucketObjects() - return _G.Player_Buckets, _G.Entity_Buckets + return Player_Buckets, Entity_Buckets end @@ -123,7 +118,7 @@ function QBCore.Functions.SetPlayerBucket(player_source --[[int]],bucket --[[int if player_source and bucket then local plicense = QBCore.Functions.GetIdentifier(player_source, 'license') SetPlayerRoutingBucket(player_source, bucket) - _G.Player_Buckets[plicense] = {player_id = player_source, player_bucket = bucket} + Player_Buckets[plicense] = {player_id = player_source, player_bucket = bucket} return true else return false @@ -134,7 +129,7 @@ end function QBCore.Functions.SetEntityBucket(entity --[[int]],bucket --[[int]]) if entity and bucket then SetEntityRoutingBucket(entity, bucket) - _G.Entity_Buckets[entity] = {entity_id = entity, entity_bucket = bucket} + Entity_Buckets[entity] = {entity_id = entity, entity_bucket = bucket} return true else return false @@ -145,8 +140,8 @@ 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 _G.Player_Buckets ~= nil then - for k, v in pairs(_G.Player_Buckets) do + if Player_Buckets ~= nil then + for k, v in pairs(Player_Buckets) do if k['player_bucket'] == bucket then curr_bucket_pool[#curr_bucket_pool + 1] = k['player_id'] end @@ -161,8 +156,8 @@ end --- Will return an array of all the entities inside the current bucket (Not player entities , use GetPlayersInBucket for that) function QBCore.Functions.GetEntitiesInBucket(bucket --[[int]]) local curr_bucket_pool = {} - if _G.Entity_Buckets ~= nil then - for k, v in pairs(_G.Entity_Buckets) do + if Entity_Buckets ~= nil then + for k, v in pairs(Entity_Buckets) do if k['entity_bucket'] == bucket then curr_bucket_pool[#curr_bucket_pool + 1] = k['entity_id'] end @@ -181,9 +176,8 @@ end -- Paychecks (standalone - don't touch) -function PaycheckLoop() - local Players = QBCore.Functions.GetQBPlayers() - for _, Player in pairs(Players) do +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 @@ -216,10 +210,8 @@ function QBCore.Functions.CreateCallback(name, cb) end function QBCore.Functions.TriggerCallback(name, source, cb, ...) - local src = source - if QBCore.ServerCallbacks[name] then - QBCore.ServerCallbacks[name](src, cb, ...) - end + if not QBCore.ServerCallbacks[name] then return end + QBCore.ServerCallbacks[name](source, cb, ...) end -- Items @@ -233,14 +225,12 @@ function QBCore.Functions.CanUseItem(item) end function QBCore.Functions.UseItem(source, item) - local src = source - QBCore.UseableItems[item.name](src, item) + QBCore.UseableItems[item.name](source, item) end -- Kick Player function QBCore.Functions.Kick(source, reason, setKickReason, deferrals) - local src = source reason = '\n' .. reason .. '\n🔸 Check our Discord for further information: ' .. QBCore.Config.Server.discord if setKickReason then setKickReason(reason) @@ -250,20 +240,18 @@ function QBCore.Functions.Kick(source, reason, setKickReason, deferrals) deferrals.update(reason) Wait(2500) end - if src then - DropPlayer(src, reason) + if source then + DropPlayer(source, reason) end - local i = 0 - while (i <= 4) do - i = i + 1 + for i = 0, 4 do while true do - if src then - if (GetPlayerPing(src) >= 0) then + if source then + if GetPlayerPing(source) >= 0 then break end Wait(100) CreateThread(function() - DropPlayer(src, reason) + DropPlayer(source, reason) end) end end @@ -275,16 +263,14 @@ end -- Check if player is whitelisted (not used anywhere) function QBCore.Functions.IsWhitelisted(source) - local src = source - local plicense = QBCore.Functions.GetIdentifier(src, 'license') - local identifiers = GetPlayerIdentifiers(src) + 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 result then - for _, id in pairs(identifiers) do - if result.license == id then - return true - end + if not result then return false end + for _, id in pairs(identifiers) do + if result.license == id then + return true end end else @@ -296,107 +282,81 @@ end -- Setting & Removing Permissions function QBCore.Functions.AddPermission(source, permission) - local src = source - local Player = QBCore.Functions.GetPlayer(src) + local Player = QBCore.Functions.GetPlayer(source) local plicense = Player.PlayerData.license - if Player 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(src), - plicense, - permission:lower() - }) - - Player.Functions.UpdatePlayerData() - TriggerClientEvent('QBCore:Client:OnPermissionUpdate', src, permission) - end + 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) end function QBCore.Functions.RemovePermission(source) - local src = source - local Player = QBCore.Functions.GetPlayer(src) + local Player = QBCore.Functions.GetPlayer(source) local license = Player.PlayerData.license - if Player then - QBCore.Config.Server.PermissionList[license] = nil - MySQL.Async.execute('DELETE FROM permissions WHERE license = ?', { license }) - Player.Functions.UpdatePlayerData() - end + 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') end -- Checking for Permission Level function QBCore.Functions.HasPermission(source, permission) - local src = source - local license = QBCore.Functions.GetIdentifier(src, 'license') - local permission = tostring(permission:lower()) + permission = tostring(permission:lower()) + local license = QBCore.Functions.GetIdentifier(source, 'license') if permission == 'user' then return true else - if QBCore.Config.Server.PermissionList[license] then - if QBCore.Config.Server.PermissionList[license].license == license then - if QBCore.Config.Server.PermissionList[license].permission == permission or QBCore.Config.Server.PermissionList[license].permission == 'god' then - return true - end - end - 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 end return false end function QBCore.Functions.GetPermission(source) - local src = source - local license = QBCore.Functions.GetIdentifier(src, 'license') - if license then - if QBCore.Config.Server.PermissionList[license] then - if QBCore.Config.Server.PermissionList[license].license == license then - return QBCore.Config.Server.PermissionList[license].permission - end - end - end - return 'user' + 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 end -- Opt in or out of admin reports function QBCore.Functions.IsOptin(source) - local src = source - local license = QBCore.Functions.GetIdentifier(src, 'license') - if QBCore.Functions.HasPermission(src, 'admin') then - return QBCore.Config.Server.PermissionList[license].optin - end + 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 end function QBCore.Functions.ToggleOptin(source) - local src = source - local license = QBCore.Functions.GetIdentifier(src, 'license') - if QBCore.Functions.HasPermission(src, 'admin') then - QBCore.Config.Server.PermissionList[license].optin = not QBCore.Config.Server.PermissionList[license].optin - end + 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 end -- Check if player is banned function QBCore.Functions.IsPlayerBanned(source) - local src = source - local retval = false - local message = '' - local plicense = QBCore.Functions.GetIdentifier(src, 'license') + local plicense = QBCore.Functions.GetIdentifier(source, 'license') local result = MySQL.Sync.fetchSingle('SELECT * FROM bans WHERE license = ?', { plicense }) - if result then - if os.time() < result.expire then - retval = true - local timeTable = os.date('*t', tonumber(result.expire)) - message = 'You have been banned from the server:\n' .. result[1].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[1].id }) - end + 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[1].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[1].id }) end - return retval, message + return false end -- Check for duplicate license @@ -407,8 +367,7 @@ function QBCore.Functions.IsLicenseInUse(license) local identifiers = GetPlayerIdentifiers(player) for _, id in pairs(identifiers) do if string.find(id, 'license') then - local playerLicense = id - if playerLicense == license then + if id == license then return true end end From da676647f26ebd839dd5f1ec4a08875093a78b6f Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:09:57 +0100 Subject: [PATCH 026/120] style(server/player): indentation --- server/player.lua | 417 ++++++++++++++++++++-------------------------- 1 file changed, 184 insertions(+), 233 deletions(-) diff --git a/server/player.lua b/server/player.lua index e4f1820..d425048 100644 --- a/server/player.lua +++ b/server/player.lua @@ -6,10 +6,9 @@ QBCore.Player = {} -- Will cause major issues! function QBCore.Player.Login(source, citizenid, newData) - local src = source - if src then + if source and source ~= '' then if citizenid then - local license = QBCore.Functions.GetIdentifier(src, 'license') + local license = QBCore.Functions.GetIdentifier(source, 'license') local PlayerData = MySQL.Sync.prepare('SELECT * FROM players where citizenid = ?', { citizenid }) if PlayerData and license == PlayerData.license then PlayerData.money = json.decode(PlayerData.money) @@ -22,13 +21,13 @@ function QBCore.Player.Login(source, citizenid, newData) else PlayerData.gang = {} end - QBCore.Player.CheckPlayerData(src, PlayerData) + QBCore.Player.CheckPlayerData(source, PlayerData) else - DropPlayer(src, 'You Have Been Kicked For Exploitation') - TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'white', GetPlayerName(src) .. ' Has Been Dropped For Character Joining Exploit', false) + DropPlayer(source, 'You Have Been Kicked For Exploitation') + TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'white', GetPlayerName(source) .. ' Has Been Dropped For Character Joining Exploit', false) end else - QBCore.Player.CheckPlayerData(src, newData) + QBCore.Player.CheckPlayerData(source, newData) end return true else @@ -38,12 +37,11 @@ function QBCore.Player.Login(source, citizenid, newData) end function QBCore.Player.CheckPlayerData(source, PlayerData) - local src = source PlayerData = PlayerData or {} - PlayerData.source = src + PlayerData.source = source PlayerData.citizenid = PlayerData.citizenid or QBCore.Player.CreateCitizenId() - PlayerData.license = PlayerData.license or QBCore.Functions.GetIdentifier(src, 'license') - PlayerData.name = GetPlayerName(src) + PlayerData.license = PlayerData.license or QBCore.Functions.GetIdentifier(source, 'license') + PlayerData.name = GetPlayerName(source) PlayerData.cid = PlayerData.cid or 1 PlayerData.money = PlayerData.money or {} for moneytype, startamount in pairs(QBCore.Config.Money.MoneyTypes) do @@ -57,8 +55,8 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.charinfo.gender = PlayerData.charinfo.gender or 0 PlayerData.charinfo.backstory = PlayerData.charinfo.backstory or 'placeholder backstory' PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'USA' - PlayerData.charinfo.phone = PlayerData.charinfo.phone ~= nil and PlayerData.charinfo.phone or '1' .. math.random(111111111, 999999999) - PlayerData.charinfo.account = PlayerData.charinfo.account ~= nil and PlayerData.charinfo.account or 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) + PlayerData.charinfo.phone = PlayerData.charinfo.phone or ('1' .. math.random(111111111, 999999999)) + PlayerData.charinfo.account = PlayerData.charinfo.account or ('US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99)) -- Metadata PlayerData.metadata = PlayerData.metadata or {} PlayerData.metadata['hunger'] = PlayerData.metadata['hunger'] or 100 @@ -80,21 +78,11 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.metadata['craftingrep'] = PlayerData.metadata['craftingrep'] or 0 PlayerData.metadata['attachmentcraftingrep'] = PlayerData.metadata['attachmentcraftingrep'] or 0 PlayerData.metadata['currentapartment'] = PlayerData.metadata['currentapartment'] or nil - if PlayerData.metadata['jobrep'] ~= nil then - PlayerData.metadata['jobrep'] = { - ['tow'] = PlayerData.metadata['jobrep']['tow'] or 0, - ['trucker'] = PlayerData.metadata['jobrep']['trucker'] or 0, - ['taxi'] = PlayerData.metadata['jobrep']['taxi'] or 0, - ['hotdog'] = PlayerData.metadata['jobrep']['hotdog'] or 0, - } - else - PlayerData.metadata['jobrep'] = { - ['tow'] = 0, - ['trucker'] = 0, - ['taxi'] = 0, - ['hotdog'] = 0, - } - end + PlayerData.metadata['jobrep'] = PlayerData.metadata['jobrep'] or {} + PlayerData.metadata['jobrep']['tow'] = PlayerData.metadata['jobrep']['tow'] or 0 + PlayerData.metadata['jobrep']['trucker'] = PlayerData.metadata['jobrep']['trucker'] or 0 + PlayerData.metadata['jobrep']['taxi'] = PlayerData.metadata['jobrep']['taxi'] or 0 + PlayerData.metadata['jobrep']['hotdog'] = PlayerData.metadata['jobrep']['hotdog'] or 0 PlayerData.metadata['callsign'] = PlayerData.metadata['callsign'] or 'NO CALLSIGN' PlayerData.metadata['fingerprint'] = PlayerData.metadata['fingerprint'] or QBCore.Player.CreateFingerId() PlayerData.metadata['walletid'] = PlayerData.metadata['walletid'] or QBCore.Player.CreateWalletId() @@ -140,7 +128,6 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.gang.grade.level = PlayerData.gang.grade.level or 0 -- Other PlayerData.position = PlayerData.position or QBConfig.DefaultSpawn - PlayerData.LoggedIn = true PlayerData = QBCore.Player.LoadInventory(PlayerData) QBCore.Player.CreatePlayer(PlayerData) end @@ -148,11 +135,10 @@ end -- On player logout function QBCore.Player.Logout(source) - local src = source - TriggerClientEvent('QBCore:Client:OnPlayerUnload', src) - TriggerClientEvent('QBCore:Player:UpdatePlayerData', src) + TriggerClientEvent('QBCore:Client:OnPlayerUnload', source) + TriggerClientEvent('QBCore:Player:UpdatePlayerData', source) Wait(200) - QBCore.Players[src] = nil + QBCore.Players[source] = nil end -- Create a new character @@ -164,177 +150,152 @@ function QBCore.Player.CreatePlayer(PlayerData) self.Functions = {} self.PlayerData = PlayerData - self.Functions.UpdatePlayerData = function(dontUpdateChat) + function self.Functions.UpdatePlayerData(dontUpdateChat) TriggerClientEvent('QBCore:Player:SetPlayerData', self.PlayerData.source, self.PlayerData) if dontUpdateChat == nil then QBCore.Commands.Refresh(self.PlayerData.source) end end - self.Functions.SetJob = function(job, grade) - local job = job:lower() - local grade = tostring(grade) or '0' - - if QBCore.Shared.Jobs[job] then - self.PlayerData.job.name = job - self.PlayerData.job.label = QBCore.Shared.Jobs[job].label - self.PlayerData.job.onduty = QBCore.Shared.Jobs[job].defaultDuty - - if QBCore.Shared.Jobs[job].grades[grade] then - local jobgrade = QBCore.Shared.Jobs[job].grades[grade] - self.PlayerData.job.grade = {} - self.PlayerData.job.grade.name = jobgrade.name - self.PlayerData.job.grade.level = tonumber(grade) - self.PlayerData.job.payment = jobgrade.payment or 30 - self.PlayerData.job.isboss = jobgrade.isboss or false - else - self.PlayerData.job.grade = {} - self.PlayerData.job.grade.name = 'No Grades' - self.PlayerData.job.grade.level = 0 - self.PlayerData.job.payment = 30 - self.PlayerData.job.isboss = false - end - - self.Functions.UpdatePlayerData() - TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) - return true + function self.Functions.SetJob(job, grade) + job = job:lower() + grade = tostring(grade) or '0' + if not QBCore.Shared.Jobs[job] then return false end + self.PlayerData.job.name = job + self.PlayerData.job.label = QBCore.Shared.Jobs[job].label + self.PlayerData.job.onduty = QBCore.Shared.Jobs[job].defaultDuty + if QBCore.Shared.Jobs[job].grades[grade] then + local jobgrade = QBCore.Shared.Jobs[job].grades[grade] + self.PlayerData.job.grade = {} + self.PlayerData.job.grade.name = jobgrade.name + self.PlayerData.job.grade.level = tonumber(grade) + self.PlayerData.job.payment = jobgrade.payment or 30 + self.PlayerData.job.isboss = jobgrade.isboss or false + else + self.PlayerData.job.grade = {} + self.PlayerData.job.grade.name = 'No Grades' + self.PlayerData.job.grade.level = 0 + self.PlayerData.job.payment = 30 + self.PlayerData.job.isboss = false end - - return false + self.Functions.UpdatePlayerData() + TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) + return true end - self.Functions.SetGang = function(gang, grade) - local gang = gang:lower() - local grade = tostring(grade) or '0' - - if QBCore.Shared.Gangs[gang] then - self.PlayerData.gang.name = gang - self.PlayerData.gang.label = QBCore.Shared.Gangs[gang].label - if QBCore.Shared.Gangs[gang].grades[grade] then - local ganggrade = QBCore.Shared.Gangs[gang].grades[grade] - self.PlayerData.gang.grade = {} - self.PlayerData.gang.grade.name = ganggrade.name - self.PlayerData.gang.grade.level = tonumber(grade) - self.PlayerData.gang.isboss = ganggrade.isboss or false - else - self.PlayerData.gang.grade = {} - self.PlayerData.gang.grade.name = 'No Grades' - self.PlayerData.gang.grade.level = 0 - self.PlayerData.gang.isboss = false - end - - self.Functions.UpdatePlayerData() - TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang) - return true + function self.Functions.SetGang(gang, grade) + gang = gang:lower() + grade = tostring(grade) or '0' + if not QBCore.Shared.Gangs[gang] then return false end + self.PlayerData.gang.name = gang + self.PlayerData.gang.label = QBCore.Shared.Gangs[gang].label + if QBCore.Shared.Gangs[gang].grades[grade] then + local ganggrade = QBCore.Shared.Gangs[gang].grades[grade] + self.PlayerData.gang.grade = {} + self.PlayerData.gang.grade.name = ganggrade.name + self.PlayerData.gang.grade.level = tonumber(grade) + self.PlayerData.gang.isboss = ganggrade.isboss or false + else + self.PlayerData.gang.grade = {} + self.PlayerData.gang.grade.name = 'No Grades' + self.PlayerData.gang.grade.level = 0 + self.PlayerData.gang.isboss = false end - return false + self.Functions.UpdatePlayerData() + TriggerClientEvent('QBCore:Client:OnGangUpdate', self.PlayerData.source, self.PlayerData.gang) + return true end - self.Functions.SetJobDuty = function(onDuty) + function self.Functions.SetJobDuty(onDuty) self.PlayerData.job.onduty = onDuty self.Functions.UpdatePlayerData() end - self.Functions.SetMetaData = function(meta, val) - local meta = meta:lower() - if val ~= nil then - self.PlayerData.metadata[meta] = val - self.Functions.UpdatePlayerData() - end + function self.Functions.SetMetaData(meta, val) + meta = meta:lower() + if not meta then return end + self.PlayerData.metadata[meta] = val + self.Functions.UpdatePlayerData() end - self.Functions.AddJobReputation = function(amount) - local amount = tonumber(amount) + function self.Functions.AddJobReputation(amount) + amount = tonumber(amount) self.PlayerData.metadata['jobrep'][self.PlayerData.job.name] = self.PlayerData.metadata['jobrep'][self.PlayerData.job.name] + amount self.Functions.UpdatePlayerData() end - self.Functions.AddMoney = function(moneytype, amount, reason) + function self.Functions.AddMoney(moneytype, amount, reason) reason = reason or 'unknown' - local moneytype = moneytype:lower() - local amount = tonumber(amount) - if amount < 0 then - return + moneytype = moneytype:lower() + amount = tonumber(amount) + if amount < 0 then return end + if not self.PlayerData.money[moneytype] then return false end + self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount + self.Functions.UpdatePlayerData() + if amount > 100000 then + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype], true) + else + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype]) end - if self.PlayerData.money[moneytype] then - self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] + amount - self.Functions.UpdatePlayerData() - if amount > 100000 then - TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype], true) - else - TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'AddMoney', 'lightgreen', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') added, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype]) - end - TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, false) - return true - end - return false + TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, false) + return true end - self.Functions.RemoveMoney = function(moneytype, amount, reason) + function self.Functions.RemoveMoney(moneytype, amount, reason) reason = reason or 'unknown' - local moneytype = moneytype:lower() - local amount = tonumber(amount) - if amount < 0 then - return - end - if self.PlayerData.money[moneytype] then - for _, mtype in pairs(QBCore.Config.Money.DontAllowMinus) do - if mtype == moneytype then - if self.PlayerData.money[moneytype] - amount < 0 then - return false - end + moneytype = moneytype:lower() + amount = tonumber(amount) + if amount < 0 then return end + if not self.PlayerData.money[moneytype] then return false end + for _, mtype in pairs(QBCore.Config.Money.DontAllowMinus) do + if mtype == moneytype then + if (self.PlayerData.money[moneytype] - amount) < 0 then + return false end end - self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount - self.Functions.UpdatePlayerData() - if amount > 100000 then - TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype], true) - else - TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype]) - end - TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, true) - if moneytype == 'bank' then - TriggerClientEvent('qb-phone:client:RemoveBankMoney', self.PlayerData.source, amount) - end - return true end - return false + self.PlayerData.money[moneytype] = self.PlayerData.money[moneytype] - amount + self.Functions.UpdatePlayerData() + if amount > 100000 then + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype], true) + else + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'RemoveMoney', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') removed, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype]) + end + TriggerClientEvent('hud:client:OnMoneyChange', self.PlayerData.source, moneytype, amount, true) + if moneytype == 'bank' then + TriggerClientEvent('qb-phone:client:RemoveBankMoney', self.PlayerData.source, amount) + end + return true end - self.Functions.SetMoney = function(moneytype, amount, reason) + function self.Functions.SetMoney(moneytype, amount, reason) reason = reason or 'unknown' - local moneytype = moneytype:lower() - local amount = tonumber(amount) - if amount < 0 then - return - end - if self.PlayerData.money[moneytype] then - self.PlayerData.money[moneytype] = amount - self.Functions.UpdatePlayerData() - TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype]) - return true - end - return false + moneytype = moneytype:lower() + amount = tonumber(amount) + if amount < 0 then return false end + if not self.PlayerData.money[moneytype] then return false end + self.PlayerData.money[moneytype] = amount + self.Functions.UpdatePlayerData() + TriggerEvent('qb-log:server:CreateLog', 'playermoney', 'SetMoney', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** $' .. amount .. ' (' .. moneytype .. ') set, new ' .. moneytype .. ' balance: ' .. self.PlayerData.money[moneytype]) + return true end - self.Functions.GetMoney = function(moneytype) - if moneytype then - local moneytype = moneytype:lower() - return self.PlayerData.money[moneytype] - end - return false + function self.Functions.GetMoney(moneytype) + if not moneytype then return false end + moneytype = moneytype:lower() + return self.PlayerData.money[moneytype] end - self.Functions.AddItem = function(item, amount, slot, info) + function self.Functions.AddItem(item, amount, slot, info) local totalWeight = QBCore.Player.GetTotalWeight(self.PlayerData.items) local itemInfo = QBCore.Shared.Items[item:lower()] - if itemInfo == nil then + if not itemInfo then TriggerClientEvent('QBCore:Notify', self.PlayerData.source, Lang:t('error.item_not_exist'), 'error') return end - local amount = tonumber(amount) - local slot = tonumber(slot) or QBCore.Player.GetFirstSlotByItem(self.PlayerData.items, item) - if itemInfo['type'] == 'weapon' and info == nil then + amount = tonumber(amount) + slot = tonumber(slot) or QBCore.Player.GetFirstSlotByItem(self.PlayerData.items, item) + if itemInfo['type'] == 'weapon' and not info then info = { serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4)), } @@ -345,12 +306,12 @@ function QBCore.Player.CreatePlayer(PlayerData) self.Functions.UpdatePlayerData() TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount) return true - elseif (not itemInfo['unique'] and slot or slot and self.PlayerData.items[slot] == nil) then + elseif not itemInfo['unique'] and slot or slot and self.PlayerData.items[slot] == nil then self.PlayerData.items[slot] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = slot, combinable = itemInfo['combinable'] } self.Functions.UpdatePlayerData() TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. self.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. self.PlayerData.items[slot].amount) return true - elseif (itemInfo['unique']) or (not slot or slot == nil) or (itemInfo['type'] == 'weapon') then + elseif itemInfo['unique'] or (not slot or slot == nil) or itemInfo['type'] == 'weapon' then for i = 1, QBConfig.Player.MaxInvSlots, 1 do if self.PlayerData.items[i] == nil then self.PlayerData.items[i] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = i, combinable = itemInfo['combinable'] } @@ -366,9 +327,9 @@ function QBCore.Player.CreatePlayer(PlayerData) return false end - self.Functions.RemoveItem = function(item, amount, slot) - local amount = tonumber(amount) - local slot = tonumber(slot) + function self.Functions.RemoveItem(item, amount, slot) + amount = tonumber(amount) + slot = tonumber(slot) if slot then if self.PlayerData.items[slot].amount > amount then self.PlayerData.items[slot].amount = self.PlayerData.items[slot].amount - amount @@ -403,29 +364,26 @@ function QBCore.Player.CreatePlayer(PlayerData) return false end - self.Functions.SetInventory = function(items, dontUpdateChat) + function self.Functions.SetInventory(items, dontUpdateChat) self.PlayerData.items = items self.Functions.UpdatePlayerData(dontUpdateChat) TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'SetInventory', 'blue', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** items set: ' .. json.encode(items)) end - self.Functions.ClearInventory = function() + function self.Functions.ClearInventory() self.PlayerData.items = {} self.Functions.UpdatePlayerData() TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'ClearInventory', 'red', '**' .. GetPlayerName(self.PlayerData.source) .. ' (citizenid: ' .. self.PlayerData.citizenid .. ' | id: ' .. self.PlayerData.source .. ')** inventory cleared') end - self.Functions.GetItemByName = function(item) - local item = tostring(item):lower() + function self.Functions.GetItemByName(item) + item = tostring(item):lower() local slot = QBCore.Player.GetFirstSlotByItem(self.PlayerData.items, item) - if slot then - return self.PlayerData.items[slot] - end - return nil + return self.PlayerData.items[slot] end - self.Functions.GetItemsByName = function(item) - local item = tostring(item):lower() + function self.Functions.GetItemsByName(item) + item = tostring(item):lower() local items = {} local slots = QBCore.Player.GetSlotsByItem(self.PlayerData.items, item) for _, slot in pairs(slots) do @@ -436,12 +394,12 @@ function QBCore.Player.CreatePlayer(PlayerData) return items end - self.Functions.SetCreditCard = function(cardNumber) + function self.Functions.SetCreditCard(cardNumber) self.PlayerData.charinfo.card = cardNumber self.Functions.UpdatePlayerData() end - self.Functions.GetCardSlot = function(cardNumber, cardType) + function self.Functions.GetCardSlot(cardNumber, cardType) local item = tostring(cardType):lower() local slots = QBCore.Player.GetSlotsByItem(self.PlayerData.items, item) for _, slot in pairs(slots) do @@ -454,18 +412,19 @@ function QBCore.Player.CreatePlayer(PlayerData) return nil end - self.Functions.GetItemBySlot = function(slot) - local slot = tonumber(slot) - if self.PlayerData.items[slot] then - return self.PlayerData.items[slot] - end - return nil + function self.Functions.GetItemBySlot(slot) + slot = tonumber(slot) + return self.PlayerData.items[slot] end - self.Functions.Save = function() + function self.Functions.Save() QBCore.Player.Save(self.PlayerData.source) end + function self.Functions.Logout() + QBCore.Player.Logout(self.PlayerData.source) + end + QBCore.Players[self.PlayerData.source] = self QBCore.Player.Save(self.PlayerData.source) @@ -477,10 +436,9 @@ end -- Save player info to database (make sure citizenid is the primary key in your database) function QBCore.Player.Save(source) - local src = source - local ped = GetPlayerPed(src) + local ped = GetPlayerPed(source) local pcoords = GetEntityCoords(ped) - local PlayerData = QBCore.Players[src].PlayerData + local PlayerData = QBCore.Players[source].PlayerData if PlayerData then MySQL.Async.insert('INSERT INTO players (citizenid, cid, license, name, money, charinfo, job, gang, position, metadata) VALUES (:citizenid, :cid, :license, :name, :money, :charinfo, :job, :gang, :position, :metadata) ON DUPLICATE KEY UPDATE cid = :cid, name = :name, money = :money, charinfo = :charinfo, job = :job, gang = :gang, position = :position, metadata = :metadata', { citizenid = PlayerData.citizenid, @@ -494,7 +452,7 @@ function QBCore.Player.Save(source) position = json.encode(pcoords), metadata = json.encode(PlayerData.metadata) }) - QBCore.Player.SaveInventory(src) + QBCore.Player.SaveInventory(source) QBCore.ShowSuccess(GetCurrentResourceName(), PlayerData.name .. ' PLAYER SAVED!') else QBCore.ShowError(GetCurrentResourceName(), 'ERROR QBCORE.PLAYER.SAVE - PLAYERDATA IS EMPTY!') @@ -520,37 +478,35 @@ local playertables = { -- Add tables as needed } function QBCore.Player.DeleteCharacter(source, citizenid) - local src = source - local license = QBCore.Functions.GetIdentifier(src, 'license') + local license = QBCore.Functions.GetIdentifier(source, 'license') local result = MySQL.Sync.fetchScalar('SELECT license FROM players where citizenid = ?', { citizenid }) if license == result then local query = "DELETE FROM %s WHERE citizenid = ?" local tableCount = #playertables local queries = table.create(tableCount, 0) - for i=1, tableCount do + for i = 1, tableCount do local v = playertables[i] queries[i] = {query = query:format(v.table), values = { citizenid }} end MySQL.Async.transaction(queries, function(result) if result then - TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Character Deleted', 'red', '**' .. GetPlayerName(src) .. '** ' .. license .. ' deleted **' .. citizenid .. '**..') + TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Character Deleted', 'red', '**' .. GetPlayerName(source) .. '** ' .. license .. ' deleted **' .. citizenid .. '**..') end end) else - DropPlayer(src, 'You Have Been Kicked For Exploitation') - TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'white', GetPlayerName(src) .. ' Has Been Dropped For Character Deletion Exploit', false) + DropPlayer(source, 'You Have Been Kicked For Exploitation') + TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'white', GetPlayerName(source) .. ' Has Been Dropped For Character Deletion Exploit', false) end end -- Inventory -QBCore.Player.LoadInventory = function(PlayerData) +function QBCore.Player.LoadInventory(PlayerData) PlayerData.items = {} local inventory = MySQL.Sync.prepare('SELECT inventory FROM players WHERE citizenid = ?', { PlayerData.citizenid }) local missingItems = {} - if inventory then inventory = json.decode(inventory) if next(inventory) then @@ -588,28 +544,26 @@ QBCore.Player.LoadInventory = function(PlayerData) return PlayerData end -QBCore.Player.SaveInventory = function(source) - local src = source - if QBCore.Players[src] then - local PlayerData = QBCore.Players[src].PlayerData - local items = PlayerData.items - local ItemsJson = {} - if items and next(items) then - for slot, item in pairs(items) do - if items[slot] then - ItemsJson[#ItemsJson+1] = { - name = item.name, - amount = item.amount, - info = item.info, - type = item.type, - slot = slot, - } - end +function QBCore.Player.SaveInventory(source) + if not QBCore.Players[source] then return end + local PlayerData = QBCore.Players[source].PlayerData + local items = PlayerData.items + local ItemsJson = {} + if items and next(items) then + for slot, item in pairs(items) do + if items[slot] then + ItemsJson[#ItemsJson+1] = { + name = item.name, + amount = item.amount, + info = item.info, + type = item.type, + slot = slot, + } end - MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { json.encode(ItemsJson), PlayerData.citizenid }) - else - MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { '[]', PlayerData.citizenid }) end + MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { json.encode(ItemsJson), PlayerData.citizenid }) + else + MySQL.Async.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { '[]', PlayerData.citizenid }) end end @@ -617,32 +571,29 @@ end function QBCore.Player.GetTotalWeight(items) local weight = 0 - if items then - for slot, item in pairs(items) do - weight = weight + (item.weight * item.amount) - end + if not items then return 0 end + for _, item in pairs(items) do + weight += item.weight * item.amount end return tonumber(weight) end function QBCore.Player.GetSlotsByItem(items, itemName) local slotsFound = {} - if items then - for slot, item in pairs(items) do - if item.name:lower() == itemName:lower() then - slotsFound[#slotsFound+1] = slot - end + if not items then return slotsFound end + for slot, item in pairs(items) do + if item.name:lower() == itemName:lower() then + slotsFound[#slotsFound+1] = slot end end return slotsFound end function QBCore.Player.GetFirstSlotByItem(items, itemName) - if items then - for slot, item in pairs(items) do - if item.name:lower() == itemName:lower() then - return tonumber(slot) - end + if not items then return nil end + for slot, item in pairs(items) do + if item.name:lower() == itemName:lower() then + return tonumber(slot) end end return nil @@ -703,4 +654,4 @@ function QBCore.Player.CreateSerialNumber() return SerialNumber end -PaycheckLoop() -- This just starts the paycheck system +PaycheckInterval() -- This starts the paycheck system From f82fb1a118b072c2876a164ba4093420ccec0eff Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:12:57 +0100 Subject: [PATCH 027/120] style(server/exports): ocd --- server/exports.lua | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/server/exports.lua b/server/exports.lua index c054e1c..536f9cf 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -4,7 +4,7 @@ local function AddJob(jobName, job) return false, "invalid_job_name" end - if QBCore.Shared.Jobs[jobName] ~= nil then + if QBCore.Shared.Jobs[jobName] then return false, "job_exists" end @@ -29,7 +29,7 @@ local function AddJobs(jobs) break end - if QBCore.Shared.Jobs[key] ~= nil then + if QBCore.Shared.Jobs[key] then message = 'job_exists' shouldContinue = false errorItem = jobs[key] @@ -52,7 +52,8 @@ local function AddItem(itemName, item) if type(itemName) ~= "string" then return false, "invalid_item_name" end - if QBCore.Shared.Items[itemName] ~= nil then + + if QBCore.Shared.Items[itemName] then return false, "item_exists" end @@ -77,7 +78,7 @@ local function AddItems(items) break end - if QBCore.Shared.Items[key] ~= nil then + if QBCore.Shared.Items[key] then message = "item_exists" shouldContinue = false errorItem = items[key] @@ -96,16 +97,16 @@ QBCore.Functions.AddItems = AddItems exports('AddItems', AddItems) -- Single Add Gang -local function AddGang(gangName, gang, source) +local function AddGang(gangName, gang) if type(gangName) ~= "string" then return false, "invalid_gang_name" end - if QBCore.Shared.Gangs[gangName] ~= nil then + if QBCore.Shared.Gangs[gangName] then return false, "gang_exists" end QBCore.Shared.Gangs[gangName] = gang - TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1,'Gangs', gangName, gang) + TriggerClientEvent('QBCore:Client:OnSharedUpdate', -1, 'Gangs', gangName, gang) TriggerEvent('QBCore:Server:UpdateObject') return true, "success" end @@ -117,7 +118,6 @@ local function AddGangs(gangs) local shouldContinue = true local message = "success" local errorItem = nil - for key, value in pairs(gangs) do if type(key) ~= "string" then message = "invalid_gang_name" @@ -126,7 +126,7 @@ local function AddGangs(gangs) break end - if QBCore.Shared.Gangs[key] ~= nil then + if QBCore.Shared.Gangs[key] then message = "gang_exists" shouldContinue = false errorItem = items[key] @@ -145,9 +145,7 @@ exports('AddGangs', AddGangs) local function GetCoreVersion(InvokingResource) local resourceVersion = GetResourceMetadata(GetCurrentResourceName(), 'version') - if InvokingResource ~= nil then - print( ("%s called qbcore version check: %s"):format(InvokingResource, resourceVersion) ) - end + print(("%s called qbcore version check: %s"):format(InvokingResource or 'Unknown Resource', resourceVersion)) return resourceVersion end QBCore.Functions.GetCoreVersion = GetCoreVersion From d09db110828e483da810750f21fde0aa573b50f1 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:15:05 +0100 Subject: [PATCH 028/120] tweak(shared): prepare for globbing --- shared/main.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/main.lua b/shared/main.lua index 082a287..1e6db83 100644 --- a/shared/main.lua +++ b/shared/main.lua @@ -1,4 +1,4 @@ -QBShared = {} +QBShared = QBShared or {} local StringCharset = {} local NumberCharset = {} @@ -18,7 +18,7 @@ QBShared.RandomInt = function(length) end QBShared.SplitStr = function(str, delimiter) - local result = { } + local result = {} local from = 1 local delim_from, delim_to = string.find(str, delimiter, from) while delim_from do @@ -66,7 +66,7 @@ QBShared.SetDefaultVehicleExtras = function (vehicle, config) end for id, enabled in pairs(config) do - QBShared.ChangeVehicleExtra(vehicle, tonumber(id), true) + QBShared.ChangeVehicleExtra(vehicle, tonumber(id), type(enabled) == 'boolean' and enabled or true) end end From 81d7d1fadb4980d5bb1cce92e00fa7d752cfd41c Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:16:48 +0100 Subject: [PATCH 029/120] tweak(manifest): shared globbing and version bump --- fxmanifest.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 5c6123d..0f50bdf 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -2,18 +2,13 @@ fx_version 'cerulean' game 'gta5' description 'QB-Core' -version '1.1.0' +version '1.2.0' shared_scripts { 'shared/locale.lua', 'locale/en.lua', -- replace with desired language 'config.lua', - 'shared/main.lua', - 'shared/items.lua', - 'shared/jobs.lua', - 'shared/vehicles.lua', - 'shared/gangs.lua', - 'shared/weapons.lua' + 'shared/*.lua' } client_scripts { From ab131e2cc86e8b955f5165a2becf3c1c3a87caa7 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:17:29 +0100 Subject: [PATCH 030/120] revert(manifest): version bump --- fxmanifest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 0f50bdf..135c67b 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'cerulean' game 'gta5' description 'QB-Core' -version '1.2.0' +version '1.1.0' shared_scripts { 'shared/locale.lua', From e9a6d4acd0ef7fc7b95c76861bed24577d7785f2 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:35:10 +0100 Subject: [PATCH 031/120] fix(server/functions): getplayer variable --- server/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/functions.lua b/server/functions.lua index e1498c1..4678928 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -35,7 +35,7 @@ function QBCore.Functions.GetSource(identifier) end function QBCore.Functions.GetPlayer(source) - if type(src) == 'number' then + if type(source) == 'number' then return QBCore.Players[source] else return QBCore.Players[QBCore.Functions.GetSource(source)] From 61c709c0f067155b6357f5f92ee7a2a4cb243672 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sat, 19 Feb 2022 17:26:05 +1100 Subject: [PATCH 032/120] feat (readme): Updated readme (#538) * Update README.md * Update README.md Co-authored-by: Kakarot <57848836+GhzGarage@users.noreply.github.com> --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 1d9dfa0..b0e11be 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,18 @@ ### [Official QBCore Documentation](https://qbcore-framework.github.io/qb-docs/) +## QBCore is officially partnered with Sonoran Software! +Sonoran Software offers: +* [The most advanced, integrated CAD software](https://sonorancad.com/kakarot) +* [Complete community management software](https://sonorancms.com/kakarot) +* [In-depth radio communications simulator](https://sonoranradio.com/kakarot) +* [Premium server hosting](https://sonoranservers.com/kakarot) + +Use code `KAKAROT` for 20% off your first month at checkout! + +# Sonoran Software +![Sonoran Software Partnership](https://sonoransoftware.com/assets/images/promotional/partners/qb_banner_coupon.png) + # License QBCore Framework From 391b293e06b2e53e6a0a7d5bfed9b5b2e66afba5 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sat, 19 Feb 2022 17:27:01 +1100 Subject: [PATCH 033/120] style (drawtext): camelCase drawtext local functions. Co-Authored by @BerkieBb --- client/drawtext.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/client/drawtext.lua b/client/drawtext.lua index 4ae4a37..ef669b2 100644 --- a/client/drawtext.lua +++ b/client/drawtext.lua @@ -1,11 +1,11 @@ -local function HideText() +local function hideText() SendNUIMessage({ action = 'HIDE_TEXT', }) end -local function DrawText(text, position) - if (not type(position) == "string") then position = "left" end +local function drawText(text, position) + if not type(position) == "string" then position = "left" end SendNUIMessage({ action = 'DRAW_TEXT', @@ -16,8 +16,8 @@ local function DrawText(text, position) }) end -local function ChangeText(text, position) - if (not type(position) == "string") then position = "left" end +local function changeText(text, position) + if not type(position) == "string" then position = "left" end SendNUIMessage({ action = 'CHANGE_TEXT', @@ -28,33 +28,33 @@ local function ChangeText(text, position) }) end -local function KeyPressed() - Citizen.CreateThread(function() -- Not sure if a thread is needed but why not eh? +local function keyPressed() + CreateThread(function() -- Not sure if a thread is needed but why not eh? SendNUIMessage({ action = 'KEY_PRESSED', }) Wait(500) - HideText() + hideText() end) end RegisterNetEvent('qb-core:client:DrawText', function(text, position) - DrawText(text, position) + drawText(text, position) end) RegisterNetEvent('qb-core:client:ChangeText', function(text, position) - ChangeText(text, position) + changeText(text, position) end) RegisterNetEvent('qb-core:client:HideText', function() - HideText() + hideText() end) RegisterNetEvent('qb-core:client:KeyPressed', function() - KeyPressed() + keyPressed() end) -exports('DrawText', DrawText) -exports('ChangeText', ChangeText) -exports('HideText', HideText) -exports('KeyPressed', KeyPressed) \ No newline at end of file +exports('DrawText', drawText) +exports('ChangeText', changeText) +exports('HideText', hideText) +exports('KeyPressed', keyPressed) From 3b36f7e4e5903e0ddd2ef90df219caf34f51d27c Mon Sep 17 00:00:00 2001 From: Liam Dormon <66041893+Mojito-Fivem@users.noreply.github.com> Date: Sat, 19 Feb 2022 06:39:50 +0000 Subject: [PATCH 034/120] fix(client/functions): type checking for vectors (#430) allows for cross scrt compatibility with newer functions --- client/functions.lua | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 87a5887..fd6a967 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -62,17 +62,19 @@ function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, sho if not coords or not sprite or not display or not scale or not colour or shortRange == nil or not title then print("Blip failed to create, most likely missed a setting, debug log: ") 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.") - else - blip = AddBlipForCoord(coords) - SetBlipSprite(blip, sprite) - SetBlipDisplay(blip, display) - SetBlipScale(blip, scale) - SetBlipColour(blip, colour) - SetBlipAsShortRange(blip, shortRange) - BeginTextCommandSetBlipName("STRING") - AddTextComponentString(title) - EndTextCommandSetBlipName(blip) + return end + + coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords + blip = AddBlipForCoord(coords) + SetBlipSprite(blip, sprite) + SetBlipDisplay(blip, display) + SetBlipScale(blip, scale) + SetBlipColour(blip, colour) + SetBlipAsShortRange(blip, shortRange) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(title) + EndTextCommandSetBlipName(blip) end function QBCore.Functions.RequestAnimDict(animDict) @@ -403,6 +405,11 @@ function QBCore.Functions.GetPlate(vehicle) end function QBCore.Functions.SpawnClear(coords, radius) + if coords then + coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords + else + coords = GetEntityCoords(ped) + end local vehicles = GetGamePool('CVehicle') local closeVeh = {} for i=1, #vehicles, 1 do From 707a43d4b8363206745c647361969e7072431a8b Mon Sep 17 00:00:00 2001 From: MeMo <73984552+memojustone@users.noreply.github.com> Date: Sat, 19 Feb 2022 08:56:02 +0200 Subject: [PATCH 035/120] fix (server/functions): BanTime fix. --- server/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index df63ca7..29b48eb 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -391,9 +391,9 @@ function QBCore.Functions.IsPlayerBanned(source) if os.time() < result.expire then retval = true local timeTable = os.date('*t', tonumber(result.expire)) - message = 'You have been banned from the server:\n' .. result[1].reason .. '\nYour ban expires ' .. timeTable.day .. '/' .. timeTable.month .. '/' .. timeTable.year .. ' ' .. timeTable.hour .. ':' .. timeTable.min .. '\n' + message = '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[1].id }) + MySQL.Async.execute('DELETE FROM bans WHERE id = ?', { result.id }) end end return retval, message From 41f01f842ba3070f93009e3f1c2c5f344b8a466b Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 19 Feb 2022 12:51:13 +0100 Subject: [PATCH 036/120] tweak(core/version/getter): add if statement back for invoking resource --- server/exports.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/exports.lua b/server/exports.lua index 536f9cf..019d412 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -145,7 +145,9 @@ exports('AddGangs', AddGangs) local function GetCoreVersion(InvokingResource) local resourceVersion = GetResourceMetadata(GetCurrentResourceName(), 'version') - print(("%s called qbcore version check: %s"):format(InvokingResource or 'Unknown Resource', resourceVersion)) + if InvokingResource and InvokingResource ~= '' then + print(("%s called qbcore version check: %s"):format(InvokingResource or 'Unknown Resource', resourceVersion)) + end return resourceVersion end QBCore.Functions.GetCoreVersion = GetCoreVersion From 328fa108f80cea13d25a93accb654e31b6ce9746 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 19 Feb 2022 14:44:34 +0100 Subject: [PATCH 037/120] tweak(buckets): small improvement of bucket handler --- server/functions.lua | 60 ++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index ca45c36..d004122 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -1,4 +1,6 @@ QBCore.Functions = {} +QBCore.Player_Buckets = {} +QBCore.Entity_Buckets = {} -- Getters -- Get your player first and then trigger a function on them @@ -102,48 +104,43 @@ function QBCore.Functions.GetDutyCount(job) return count end ---- Routingbucket stuff (Only touch if you know what you are doing) -Player_Buckets = {} -- Bucket array containing all players that have been set to a different bucket -Entity_Buckets = {} -- Bucket array containing all entities that have been set to a different bucket +-- 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 +-- Returns the objects related to buckets, first returned value is the player buckets, second one is entity buckets function QBCore.Functions.GetBucketObjects() - return Player_Buckets, Entity_Buckets + return QBCore.Player_Buckets, QBCore.Entity_Buckets end - ---- Will set the provided player id / source into the provided bucket id -function QBCore.Functions.SetPlayerBucket(player_source --[[int]],bucket --[[int]]) - if player_source and bucket then - local plicense = QBCore.Functions.GetIdentifier(player_source, 'license') - SetPlayerRoutingBucket(player_source, bucket) - Player_Buckets[plicense] = {player_id = player_source, player_bucket = bucket} +-- 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]]) +-- 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) - Entity_Buckets[entity] = {entity_id = entity, entity_bucket = 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]]) +function QBCore.Functions.GetPlayersInBucket(bucket --[[ int ]]) local curr_bucket_pool = {} - if Player_Buckets ~= nil then - for k, v in pairs(Player_Buckets) do - if k['player_bucket'] == bucket then - curr_bucket_pool[#curr_bucket_pool + 1] = k['player_id'] + 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 @@ -152,14 +149,13 @@ function QBCore.Functions.GetPlayersInBucket(bucket --[[int]]) end end - ---- Will return an array of all the entities inside the current bucket (Not player entities , use GetPlayersInBucket for that) -function QBCore.Functions.GetEntitiesInBucket(bucket --[[int]]) +-- 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 Entity_Buckets ~= nil then - for k, v in pairs(Entity_Buckets) do - if k['entity_bucket'] == bucket then - curr_bucket_pool[#curr_bucket_pool + 1] = k['entity_id'] + 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 @@ -168,12 +164,6 @@ function QBCore.Functions.GetEntitiesInBucket(bucket --[[int]]) end end ---- Will return true / false wheter the mentioned player id is present in the bucket provided -function QBCore.Functions.IsPlayerInBucket(player_source --[[int]] ,bucket --[[int]]) - local curr_player_bucket = GetPlayerRoutingBucket(player_source) - return curr_player_bucket == bucket -end - -- Paychecks (standalone - don't touch) function PaycheckInterval() From e43fac35680d071cea941fe05d47324714443655 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 19 Feb 2022 14:45:09 +0100 Subject: [PATCH 038/120] fix(server/playerdrop): bucket table reference --- server/events.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/events.lua b/server/events.lua index 4b21014..6ba9f57 100644 --- a/server/events.lua +++ b/server/events.lua @@ -6,7 +6,7 @@ AddEventHandler('playerDropped', function() local Player = QBCore.Players[src] TriggerEvent('qb-log:server:CreateLog', 'joinleave', 'Dropped', 'red', '**' .. GetPlayerName(src) .. '** (' .. Player.PlayerData.license .. ') left..') Player.Functions.Save() - Player_Buckets[Player.PlayerData.license] = nil + QBCore.Player_Buckets[Player.PlayerData.license] = nil QBCore.Players[src] = nil end) From 6ed74c6392fa742a98c1a594e1f831fb921f4bc8 Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Sat, 19 Feb 2022 12:56:01 -0500 Subject: [PATCH 039/120] Remove LegacyFuel usage --- client/events.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/client/events.lua b/client/events.lua index 59a5a1a..51917d3 100644 --- a/client/events.lua +++ b/client/events.lua @@ -61,7 +61,6 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) end local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) - exports['LegacyFuel']:SetFuel(vehicle, 100) SetModelAsNoLongerNeeded(vehicle) TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle)) From 66ca5a7bb71e10ee573df83ee5e5a9973d646cef Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Sat, 19 Feb 2022 12:56:44 -0500 Subject: [PATCH 040/120] Removed Legacyfuel usage --- client/functions.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 09a9c1b..305e5c5 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -387,7 +387,7 @@ function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked, teleportI SetVehicleNeedsToBeHotwired(veh, false) SetVehRadioStation(veh, 'OFF') SetModelAsNoLongerNeeded(model) - exports['LegacyFuel']:SetFuel(veh, 100) + if teleportInto then TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1) end if cb then cb(veh) @@ -599,7 +599,6 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) end if props.fuelLevel then SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) - exports['LegacyFuel']:SetFuel(veh, props.fuelLevel + 0.0) end if props.oilLevel then SetVehicleOilLevel(vehicle, props.oilLevel) From cc43734a3c312ed022472dca7d405f3f29bda0f1 Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Sat, 19 Feb 2022 13:11:26 -0500 Subject: [PATCH 041/120] Use SetVehicleFuelLevel Native Use SetVehicleFuelLevel on QBCore.Functions.SpawnVehicle --- client/functions.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/client/functions.lua b/client/functions.lua index 305e5c5..8d15b34 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -386,6 +386,7 @@ function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked, teleportI SetNetworkIdCanMigrate(netid, true) SetVehicleNeedsToBeHotwired(veh, false) SetVehRadioStation(veh, 'OFF') + SetVehicleFuelLevel(veh, 100.0) SetModelAsNoLongerNeeded(model) if teleportInto then TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1) end From dec696a8433deecf1018160eb45652468c5801a3 Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Sat, 19 Feb 2022 13:11:28 -0500 Subject: [PATCH 042/120] Use SetVehicleFuelLevel Native Use SetVehicleFuelLevel on QBCore:Command:SpawnVehicle Event --- client/events.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/client/events.lua b/client/events.lua index 51917d3..174f9e1 100644 --- a/client/events.lua +++ b/client/events.lua @@ -61,6 +61,7 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) end local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) + SetVehicleFuelLevel(vehicle, 100.0) SetModelAsNoLongerNeeded(vehicle) TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle)) From fa99bf03394a8c7faadc7ff37ae4e964a2e98302 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Mon, 21 Feb 2022 15:00:02 +1100 Subject: [PATCH 043/120] feat (main): Pulling main into dev. (#542) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md * Update README.md * feat (locale/tr): Added turkish locale. Türkçe Karakter Yer Almakta * feat (locale/es): Added spanish. * updated spanish Sounded weird * Update es.lua * feat (locale/lv): Added latvian. I'm personally a native speaker and I can approve this is correct. * feat(qb-core/player): Added server-side event onJobUpdate (#516) Added server-side event onJobUpdate so scripts can listen on server if any player changed their job. It's safer than redirecting client event to server again. * feat (server/player): Added Job update on duty update (#519) * Trigger Job Update on Duty Update * Add server event Co-authored-by: Kakarot <57848836+GhzGarage@users.noreply.github.com> Co-authored-by: Muhammed Developer <56224780+muhammed10100@users.noreply.github.com> Co-authored-by: MonkeyWhisper <82112471+MonkeyWhisper@users.noreply.github.com> Co-authored-by: Casper <71441748+JajarGaming@users.noreply.github.com> Co-authored-by: Chaini <28576404+chainiDV@users.noreply.github.com> Co-authored-by: Brady F --- locale/es.lua | 4 +++- locale/lv.lua | 25 +++++++++++++++++++++++++ locale/tr.lua | 25 +++++++++++++++++++++++++ server/player.lua | 3 +++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 locale/lv.lua create mode 100644 locale/tr.lua diff --git a/locale/es.lua b/locale/es.lua index 9986991..0133ea0 100644 --- a/locale/es.lua +++ b/locale/es.lua @@ -2,6 +2,8 @@ local Translations = { error = { not_online = 'El jugador no está conectado!', 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!', @@ -13,7 +15,7 @@ local Translations = { info = { received_paycheck = 'Has recibido tu pago de $%{value}', job_info = 'Trabajo: %{value} | Grado: %{value2} | Estado: %{value3}', - gang_info = 'Banda: %{value} | Grado: %{value2}', + gang_info = 'Pandilla: %{value} | Grado: %{value2}', on_duty = 'Ahora estás en servicio!', off_duty = 'Ahora estás fuera de servicio!' } diff --git a/locale/lv.lua b/locale/lv.lua new file mode 100644 index 0000000..c7b4c38 --- /dev/null +++ b/locale/lv.lua @@ -0,0 +1,25 @@ +local Translations = { + error = { + not_online = 'Spēlētājs nav online', + wrong_format = 'Nepareizs formāts', + missing_args = 'Ne visi argumenti tika ievadīti (x, y, z)', + missing_args2 = 'Visiem argumentiem ir jābut aizpildītiem!', + no_access = 'Nav piekļuve šai commandai', + company_too_poor = 'Jūsu darba vedējs ir nabadzīgs', + item_not_exist = 'Šī lieta nēeksistē', + too_heavy = 'Inventārs ir pārāk pilns' + }, + success = {}, + info = { + received_paycheck = 'Jūs esat saņēmuši savu algu par $%{value}', + job_info = 'Darbs: %{value} | Pakāpe: %{value2} | Pienākums: %{value3}', + gang_info = 'Banda: %{value} | Pakāpe: %{value2}', + on_duty = 'Jūs tagad esat dienestā!', + off_duty = 'Jūs tagad esat atbrīvots no dienesta!' + } +} + +Lang = Locale:new({ + phrases = Translations, + warnOnMissing = true +}) diff --git a/locale/tr.lua b/locale/tr.lua new file mode 100644 index 0000000..b66ab2c --- /dev/null +++ b/locale/tr.lua @@ -0,0 +1,25 @@ +local Translations = { + error = { + not_online = 'Oyuncu çevrimiçi değil', + wrong_format = 'Yanlış birim', + missing_args = 'Her argüman girilmedi (x, y, z)', + missing_args2 = 'Tüm argümanlar doldurulmalıdır!', + no_access = 'Bu komuta erişim yok', + company_too_poor = 'İşvereniniz bozuk', + item_not_exist = 'Öğe mevcut değil', + too_heavy = 'Envanter çok dolu' + }, + success = {}, + info = { + received_paycheck = 'Maaş çekinizi aldınız $%{value}', + job_info = 'İş: %{value} | Seviye: %{value2} | Görev: %{value3}', + gang_info = 'Çete: %{value} | Seviye: %{value2}', + on_duty = 'Şimdi görev başındasın!', + off_duty = 'Şimdi görevden alındın!' + } +} + +Lang = Locale:new({ + phrases = Translations, + warnOnMissing = true +}) diff --git a/server/player.lua b/server/player.lua index e4f1820..e1ea1ae 100644 --- a/server/player.lua +++ b/server/player.lua @@ -196,6 +196,7 @@ function QBCore.Player.CreatePlayer(PlayerData) end self.Functions.UpdatePlayerData() + TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) return true end @@ -233,6 +234,8 @@ function QBCore.Player.CreatePlayer(PlayerData) self.Functions.SetJobDuty = function(onDuty) self.PlayerData.job.onduty = onDuty self.Functions.UpdatePlayerData() + TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) + TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) end self.Functions.SetMetaData = function(meta, val) From 2cacb7eeaf2aa602e8d16aff141721c6812142f1 Mon Sep 17 00:00:00 2001 From: SKITTLE <92496158+SKITTLE6969@users.noreply.github.com> Date: Wed, 23 Feb 2022 11:26:24 +0530 Subject: [PATCH 044/120] Update Items.lua theft and jewelry added item Diamond - Error in Pawnshop when collecting melted 10kggoldchain, item diamond missing --- shared/items.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/items.lua b/shared/items.lua index 86687c2..546a0c2 100644 --- a/shared/items.lua +++ b/shared/items.lua @@ -356,6 +356,7 @@ QBShared.Items = { -- Theft and Jewelry ['rolex'] = {['name'] = 'rolex', ['label'] = 'Golden Watch', ['weight'] = 1500, ['type'] = 'item', ['image'] = 'rolex.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'A golden watch seems like the jackpot to me!'}, ['diamond_ring'] = {['name'] = 'diamond_ring', ['label'] = 'Diamond Ring', ['weight'] = 1500, ['type'] = 'item', ['image'] = 'diamond_ring.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'A diamond ring seems like the jackpot to me!'}, + ['diamond'] = {['name'] = 'diamond', ['label'] = 'Diamond', ['weight'] = 1000, ['type'] = 'item', ['image'] = 'diamond.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'A diamond seems like the jackpot to me!'}, ['goldchain'] = {['name'] = 'goldchain', ['label'] = 'Golden Chain', ['weight'] = 1500, ['type'] = 'item', ['image'] = 'goldchain.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'A golden chain seems like the jackpot to me!'}, ['10kgoldchain'] = {['name'] = '10kgoldchain', ['label'] = '10k Gold Chain', ['weight'] = 2000, ['type'] = 'item', ['image'] = '10kgoldchain.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = '10 carat golden chain'}, ['goldbar'] = {['name'] = 'goldbar', ['label'] = 'Gold Bar', ['weight'] = 7000, ['type'] = 'item', ['image'] = 'goldbar.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Looks pretty expensive to me'}, From 1412d02db15fefd4cb1c7cf3f14743e304743494 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Wed, 23 Feb 2022 11:17:16 +0100 Subject: [PATCH 045/120] tweak(server/exports): Remove unnecessary code --- server/exports.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/exports.lua b/server/exports.lua index 019d412..eda629b 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -146,7 +146,7 @@ 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 or 'Unknown Resource', resourceVersion)) + print(("%s called qbcore version check: %s"):format(InvokingResource, resourceVersion)) end return resourceVersion end From 31888996ab8d73ad495fa2bf64ec778a4963acda Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Thu, 24 Feb 2022 21:58:49 +0100 Subject: [PATCH 046/120] feat!: ace permission system --- client/functions.lua | 2 +- config.lua | 8 ++-- fxmanifest.lua | 7 ++-- locale/es.lua | 4 +- server/commands.lua | 4 +- server/debug.lua | 2 +- server/events.lua | 10 ++--- server/exports.lua | 4 +- server/functions.lua | 81 ++++++++++++++++++++++++++----------- server/main.lua | 24 ++++++----- server/player.lua | 24 +++++++++-- shared/locale.lua | 2 +- shared/main.lua | 95 +++++++++++++++++++++++++++++++++++++++----- 13 files changed, 195 insertions(+), 72 deletions(-) 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 From c3f114b3813018389c55a9a2bbca347ff0f796c7 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Thu, 24 Feb 2022 22:13:30 +0100 Subject: [PATCH 047/120] feat(permission/playerdata): system admin permission --- config.lua | 2 +- server/player.lua | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/config.lua b/config.lua index f318c5a..f304e81 100644 --- a/config.lua +++ b/config.lua @@ -29,7 +29,7 @@ QBConfig.Server.pvp = true -- Enable or disable pvp on the server (Ability to sh QBConfig.Server.discord = "" -- Discord invite link 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.UseOldPermissionSystem = false -- Use old permissions system from the database QBConfig.Server.AllPermissions = {'god',} -- Table of permissions which have access to everything QBConfig.Notify = {} diff --git a/server/player.lua b/server/player.lua index 771e96e..a45a577 100644 --- a/server/player.lua +++ b/server/player.lua @@ -46,6 +46,9 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) 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' + if IsPlayerAceAllowed(source, 'command') and IsPlayerAceAllowed(source, 'webadmin') then -- if both are true then the person has group.admin and is a system admin + PlayerData.permission = QBCore.Config.Server.AllPermissions[1] or 'god' + end ExecuteCommand(('add_principal identifier.%s group.%s'):format(PlayerData.license, PlayerData.permission)) PlayerData.optin = PlayerData.optin or true end From 61a5da33adb02aefde16591ac0f3cdc402c0868c Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Thu, 24 Feb 2022 22:32:52 +0100 Subject: [PATCH 048/120] fix(functions/permissions): has permission check --- server/functions.lua | 2 +- server/player.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index 36c0a1c..ab6de98 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -321,7 +321,7 @@ function QBCore.Functions.HasPermission(source, permission) 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 + if QBCore.Config.Server.AllPermissions[i] == Player.PlayerData.permission then return true end end diff --git a/server/player.lua b/server/player.lua index a45a577..c596f2a 100644 --- a/server/player.lua +++ b/server/player.lua @@ -45,10 +45,10 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) 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' - if IsPlayerAceAllowed(source, 'command') and IsPlayerAceAllowed(source, 'webadmin') then -- if both are true then the person has group.admin and is a system admin + if not PlayerData.permission and IsPlayerAceAllowed(source, 'command') and IsPlayerAceAllowed(source, 'webadmin') then -- if both aces are allowed then the person has group.admin and is a system admin PlayerData.permission = QBCore.Config.Server.AllPermissions[1] or 'god' 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 From 33c6d0d414ffcb849d9ec4c5afb622550fcf2535 Mon Sep 17 00:00:00 2001 From: buntyverma69 <72088153+buntyverma69@users.noreply.github.com> Date: Sat, 26 Feb 2022 19:51:09 +0530 Subject: [PATCH 049/120] Fixed helicopters not going air depot i am trying to figure it out why helicopters not going air depot ! category names are miss matching with garages. --- shared/vehicles.lua | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/shared/vehicles.lua b/shared/vehicles.lua index c0be86a..56fa9fb 100644 --- a/shared/vehicles.lua +++ b/shared/vehicles.lua @@ -4181,13 +4181,13 @@ QBShared.Vehicles = { ['hash'] = `toro2`, ['shop'] = 'boats', }, - -- Helis + -- helicopters ['buzzard2'] = { ['name'] = 'Buzzard', ['brand'] = 'Unknown', ['model'] = 'buzzard2', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `buzzard2`, ['shop'] = 'air', }, @@ -4196,7 +4196,7 @@ QBShared.Vehicles = { ['brand'] = 'Unknown', ['model'] = 'frogger', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `frogger`, ['shop'] = 'air', }, @@ -4205,7 +4205,7 @@ QBShared.Vehicles = { ['brand'] = 'Unknown', ['model'] = 'frogger2', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `frogger2`, ['shop'] = 'air', }, @@ -4214,7 +4214,7 @@ QBShared.Vehicles = { ['brand'] = 'Unknown', ['model'] = 'maverick', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `maverick`, ['shop'] = 'air', }, @@ -4223,7 +4223,7 @@ QBShared.Vehicles = { ['brand'] = 'Buckingham', ['model'] = 'swift', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `swift`, ['shop'] = 'air', }, @@ -4232,7 +4232,7 @@ QBShared.Vehicles = { ['brand'] = 'Buckingham', ['model'] = 'swift2', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `swift2`, ['shop'] = 'air', }, @@ -4241,7 +4241,7 @@ QBShared.Vehicles = { ['brand'] = 'Unknown', ['model'] = 'seasparrow', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `seasparrow`, ['shop'] = 'air', }, @@ -4250,7 +4250,7 @@ QBShared.Vehicles = { ['brand'] = 'Unknown', ['model'] = 'seasparrow2', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `seasparrow2`, ['shop'] = 'air', }, @@ -4259,7 +4259,7 @@ QBShared.Vehicles = { ['brand'] = 'Unknown', ['model'] = 'seasparrow3', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `seasparrow3`, ['shop'] = 'air', }, @@ -4268,7 +4268,7 @@ QBShared.Vehicles = { ['brand'] = 'Buckingham', ['model'] = 'supervolito', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `supervolito`, ['shop'] = 'air', }, @@ -4277,7 +4277,7 @@ QBShared.Vehicles = { ['brand'] = 'Buckingham', ['model'] = 'supervolito2', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `supervolito2`, ['shop'] = 'air', }, @@ -4286,7 +4286,7 @@ QBShared.Vehicles = { ['brand'] = 'Buckingham', ['model'] = 'volatus', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `volatus`, ['shop'] = 'air', }, @@ -4295,7 +4295,7 @@ QBShared.Vehicles = { ['brand'] = 'Nagasaki', ['model'] = 'havok', ['price'] = 52000, - ['category'] = 'helis', + ['category'] = 'helicopters', ['hash'] = `havok`, ['shop'] = 'air', }, @@ -4417,4 +4417,4 @@ QBShared.Vehicles = { ['hash'] = `nimbus`, ['shop'] = 'air', }, -} \ No newline at end of file +} From f50136802f225ac674daddc4f9a70f51a71d64e2 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 26 Feb 2022 16:23:12 +0100 Subject: [PATCH 050/120] fix(client/events): shared update multiple not updating string keys --- client/events.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/events.lua b/client/events.lua index 0e7ae4b..d7bbdef 100644 --- a/client/events.lua +++ b/client/events.lua @@ -17,6 +17,7 @@ RegisterNetEvent('QBCore:Client:PvpHasToggled', function(pvp_state) SetCanAttackFriendly(PlayerPedId(), pvp_state, false) NetworkSetFriendlyFireOption(pvp_state) end) + -- Teleport Commands RegisterNetEvent('QBCore:Command:TeleportToPlayer', function(coords) @@ -144,7 +145,7 @@ RegisterNetEvent('QBCore:Client:OnSharedUpdate', function(tableName, key, value) end) RegisterNetEvent('QBCore:Client:OnSharedUpdateMultiple', function(tableName, values) - for key, value in ipairs(values) do + for key, value in pairs(values) do QBCore.Shared[tableName][key] = value end TriggerEvent('QBCore:Client:UpdateObject') From a116fbf1c6d6e2f8e4d0ee96d5678d5995bcdb36 Mon Sep 17 00:00:00 2001 From: buntyverma69 <72088153+buntyverma69@users.noreply.github.com> Date: Sun, 27 Feb 2022 00:50:52 +0530 Subject: [PATCH 051/120] Fixed Boats not going depot I am trying to figure it out why Boats not going to boats depot ! category names are miss matching with garages. --- shared/vehicles.lua | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/shared/vehicles.lua b/shared/vehicles.lua index c0be86a..600bc44 100644 --- a/shared/vehicles.lua +++ b/shared/vehicles.lua @@ -4018,13 +4018,13 @@ QBShared.Vehicles = { ['hash'] = `warrener2`, ['shop'] = 'pdm', }, - -- Boats + -- Boats ['squalo'] = { ['name'] = 'Squalo', ['brand'] = 'Shitzu', ['model'] = 'squalo', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `squalo`, ['shop'] = 'boats', }, @@ -4033,7 +4033,7 @@ QBShared.Vehicles = { ['brand'] = 'Dinka', ['model'] = 'marquis', ['price'] = 40000, - ['category'] = 'sail', + ['category'] = 'boats', ['hash'] = `marquis`, ['shop'] = 'boats', }, @@ -4042,7 +4042,7 @@ QBShared.Vehicles = { ['brand'] = 'Speedophile', ['model'] = 'seashark', ['price'] = 40000, - ['category'] = 'jetski', + ['category'] = 'boats', ['hash'] = `seashark`, ['shop'] = 'boats', }, @@ -4051,7 +4051,7 @@ QBShared.Vehicles = { ['brand'] = 'Speedophile', ['model'] = 'seashark2', ['price'] = 40000, - ['category'] = 'jetski', + ['category'] = 'boats', ['hash'] = `seashark2`, ['shop'] = 'boats', }, @@ -4060,7 +4060,7 @@ QBShared.Vehicles = { ['brand'] = 'Speedophile', ['model'] = 'seashark3', ['price'] = 40000, - ['category'] = 'jetski', + ['category'] = 'boats', ['hash'] = `seashark3`, ['shop'] = 'boats', }, @@ -4069,7 +4069,7 @@ QBShared.Vehicles = { ['brand'] = 'Jetmax', ['model'] = 'jetmax', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `jetmax`, ['shop'] = 'boats', }, @@ -4078,7 +4078,7 @@ QBShared.Vehicles = { ['brand'] = 'Tropic', ['model'] = 'tropic', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `tropic`, ['shop'] = 'boats', }, @@ -4087,7 +4087,7 @@ QBShared.Vehicles = { ['brand'] = 'Tropic', ['model'] = 'tropic2', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `tropic2`, ['shop'] = 'boats', }, @@ -4096,7 +4096,7 @@ QBShared.Vehicles = { ['brand'] = 'Dinghy', ['model'] = 'dinghy', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `dinghy`, ['shop'] = 'boats', }, @@ -4105,7 +4105,7 @@ QBShared.Vehicles = { ['brand'] = 'Dinghy', ['model'] = 'dinghy2', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `dinghy2`, ['shop'] = 'boats', }, @@ -4114,7 +4114,7 @@ QBShared.Vehicles = { ['brand'] = 'Dinghy', ['model'] = 'dinghy3', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `dinghy3`, ['shop'] = 'boats', }, @@ -4123,7 +4123,7 @@ QBShared.Vehicles = { ['brand'] = 'Dinghy', ['model'] = 'dinghy4', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `dinghy4`, ['shop'] = 'boats', }, @@ -4132,7 +4132,7 @@ QBShared.Vehicles = { ['brand'] = 'Suntrap', ['model'] = 'suntrap', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `suntrap`, ['shop'] = 'boats', }, @@ -4141,7 +4141,7 @@ QBShared.Vehicles = { ['brand'] = 'Pegassi', ['model'] = 'speeder', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `speeder`, ['shop'] = 'boats', }, @@ -4150,7 +4150,7 @@ QBShared.Vehicles = { ['brand'] = 'Pegassi', ['model'] = 'speeder2', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `speeder2`, ['shop'] = 'boats', }, @@ -4159,7 +4159,7 @@ QBShared.Vehicles = { ['brand'] = 'Shitzu', ['model'] = 'longfin', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `longfin`, ['shop'] = 'boats', }, @@ -4168,7 +4168,7 @@ QBShared.Vehicles = { ['brand'] = 'Lampadati', ['model'] = 'toro', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `toro`, ['shop'] = 'boats', }, @@ -4177,7 +4177,7 @@ QBShared.Vehicles = { ['brand'] = 'Lampadati', ['model'] = 'toro2', ['price'] = 40000, - ['category'] = 'speed', + ['category'] = 'boats', ['hash'] = `toro2`, ['shop'] = 'boats', }, @@ -4417,4 +4417,4 @@ QBShared.Vehicles = { ['hash'] = `nimbus`, ['shop'] = 'air', }, -} \ No newline at end of file +} From 4f3401ff7127e1404b5fdb3643850fc41e4e5e11 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Mon, 28 Feb 2022 14:26:45 +0100 Subject: [PATCH 052/120] fix(server/functions): paycheck loop --- server/functions.lua | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index ab6de98..f33e34a 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -167,30 +167,34 @@ 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') + if next(QBCore.Players) then + for _, Player in pairs(QBCore.Players) do + if Player then + 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) - 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) + SetTimeout(QBCore.Config.Money.PayCheckTimeOut * (60 * 1000), PaycheckInterval) end -- Callbacks @@ -397,4 +401,4 @@ function QBCore.Functions.IsLicenseInUse(license) end end return false -end \ No newline at end of file +end From 67b1e20a9299125272b5d8a7f57cde6512087696 Mon Sep 17 00:00:00 2001 From: wert Date: Tue, 1 Mar 2022 15:03:28 +0000 Subject: [PATCH 053/120] tweak(index.html): Fix css/js href --- html/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html/index.html b/html/index.html index 3d39174..4415f61 100644 --- a/html/index.html +++ b/html/index.html @@ -31,8 +31,8 @@ defer > - - + +
Date: Tue, 1 Mar 2022 18:54:18 +0100 Subject: [PATCH 054/120] refactor!: cleanup and some features --- client/functions.lua | 327 ++++++++++++++++++++++++++++--------------- 1 file changed, 215 insertions(+), 112 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index b1eec6e..268e13c 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -4,17 +4,12 @@ QBCore.RequestId = 0 -- Player function QBCore.Functions.GetPlayerData(cb) - if cb then - cb(QBCore.PlayerData) - else - return QBCore.PlayerData - end + if not cb then return QBCore.PlayerData end + cb(QBCore.PlayerData) end function QBCore.Functions.GetCoords(entity) - local coords = GetEntityCoords(entity, false) - local heading = GetEntityHeading(entity) - return vector4(coords.x, coords.y, coords.z, heading) + return vector4(GetEntityCoords(entity), GetEntityHeading(entity)) end function QBCore.Functions.HasItem(item) @@ -58,23 +53,37 @@ function QBCore.Functions.DrawText3D(x, y, z, text) ClearDrawOrigin() end -function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, shortRange, title) - if not coords or not sprite or not display or not scale or not colour or shortRange == nil or not title then - print("Blip failed to create, most likely missed a setting, debug log: ") - 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.") +function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, shortRange, title, alpha, friendly, bright, category, hiddenOnLegend, highDetail, rotation, cone, shrink, showHeight, showNumber, showOutline) + if not coords or (type(coords) ~= 'table' or type(coords) ~= 'vector3') then + print("Blip failed to create, the coords were not specified or was specified in the wrong format, coords must be a table or vector3, debug log: ") + print("Coords: " .. coords .. " Sprite: " .. sprite .. " Display: " .. display .. " scale: " .. scale .. " shortRange: " .. shortRange .. " Title: " .. title .. " Alpha: " .. alpha .. " Friendly: " .. friendly .. " Bright: " .. bright .. " Category: " .. category .. " Hidden On Legend: " .. hiddenOnLegend .. " High Detail: " .. highDetail .. " Rotation: " .. rotation .. " Cone: " .. cone .. " Shrink: " .. shrink .. " Show Heigt: " .. showHeight .. " Show Number: " .. showNumber .. " Show Outline: " .. showOutline) return end - coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords - blip = AddBlipForCoord(coords) - SetBlipSprite(blip, sprite) - SetBlipDisplay(blip, display) - SetBlipScale(blip, scale) - SetBlipColour(blip, colour) - SetBlipAsShortRange(blip, shortRange) - BeginTextCommandSetBlipName("STRING") - AddTextComponentString(title) - EndTextCommandSetBlipName(blip) + local blip = AddBlipForCoord(coords) + if sprite then SetBlipSprite(blip, sprite) end + if display then SetBlipDisplay(blip, display) end + if scale then SetBlipScale(blip, scale) end + if colour then SetBlipColour(blip, colour) end + if shortRange ~= nil then SetBlipAsShortRange(blip, shortRange) end + if title then + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(title) + EndTextCommandSetBlipName(blip) + end + if alpha then SetBlipAlpha(blip, alpha) end + if friendly ~= nil then SetBlipAsFriendly(blip, friendly) end + if bright ~= nil then SetBlipBright(blip, bright) end + if category then SetBlipCategory(blip, category) end -- categories can be found here: https://docs.fivem.net/natives/?_0x234CDD44D996FD9A + if hiddenOnLegend ~= nil then SetBlipHiddenOnLegend(blip, hiddenOnLegend) end + if highDetail ~= nil then SetBlipHighDetail(blip, highDetail) end + if rotation then SetBlipRotation(blip, rotation) end -- Required to be an integer + if cone ~= nil then SetBlipShowCone(blip, cone) end + if shrink ~= nil then SetBlipShrink(blip, shrink) end + if showHeight ~= nil then ShowHeightOnBlip(blip, showHeight) end + if showNumber then ShowNumberOnBlip(blip, showNumber) end + if showOutline ~= nil then ShowOutlineIndicatorOnBlip(blip, showOutline) end + return blip end function QBCore.Functions.RequestAnimDict(animDict) @@ -85,10 +94,10 @@ function QBCore.Functions.RequestAnimDict(animDict) end end -function QBCore.Functions.LoadModel(ModelName) - if HasModelLoaded(ModelName) then return end - RequestModel(ModelName) - while not HasModelLoaded(ModelName) do +function QBCore.Functions.LoadModel(model) + if HasModelLoaded(model) then return end + RequestModel(model) + while not HasModelLoaded(model) do Wait(0) end end @@ -97,25 +106,25 @@ RegisterNUICallback('getNotifyConfig', function(_, cb) cb(QBCore.Config.Notify) end) -function QBCore.Functions.Notify(text, textype, length) +function QBCore.Functions.Notify(text, texttype, length) if type(text) == "table" then local ttext = text.text or 'Placeholder' local caption = text.caption or 'Placeholder' - local ttype = textype or 'primary' - local length = length or 5000 + texttype = texttype or 'primary' + length = length or 5000 SendNUIMessage({ action = 'notify', - type = ttype, + type = textype, length = length, text = ttext, caption = caption }) else - local ttype = textype or 'primary' - local length = length or 5000 + texttype = texttype or 'primary' + length = length or 5000 SendNUIMessage({ action = 'notify', - type = ttype, + type = texttype, length = length, text = text }) @@ -160,17 +169,19 @@ end function QBCore.Functions.GetVehicles() return GetGamePool('CVehicle') end + function QBCore.Functions.GetObjects() return GetGamePool('CObject') end + function QBCore.Functions.GetPlayers() return GetActivePlayers() end function QBCore.Functions.GetPeds(ignoreList) local pedPool = GetGamePool('CPed') - local ignoreList = ignoreList or {} local peds = {} + ignoreList = ignoreList or {} for i = 1, #pedPool, 1 do local found = false for j = 1, #ignoreList, 1 do @@ -212,17 +223,16 @@ function QBCore.Functions.IsWearingGloves() local ped = PlayerPedId() local armIndex = GetPedDrawableVariation(ped, 3) local model = GetEntityModel(ped) - local retval = true if model == `mp_m_freemode_01` then if QBCore.Shared.MaleNoGloves[armIndex] then - retval = false + return false end else if QBCore.Shared.FemaleNoGloves[armIndex] then - retval = false + return false end end - return retval + return true end function QBCore.Functions.GetClosestPlayer(coords) @@ -250,14 +260,14 @@ function QBCore.Functions.GetClosestPlayer(coords) end function QBCore.Functions.GetPlayersFromCoords(coords, distance) - local players = QBCore.Functions.GetPlayers() + local players = GetActivePlayers() local ped = PlayerPedId() if coords then coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords else coords = GetEntityCoords(ped) end - local distance = distance or 5 + distance = distance or 5 local closePlayers = {} for _, player in pairs(players) do local target = GetPlayerPed(player) @@ -315,83 +325,68 @@ end function QBCore.Functions.GetClosestBone(entity, list) local playerCoords, bone, coords, distance = GetEntityCoords(PlayerPedId()) - for _, element in pairs(list) do local boneCoords = GetWorldPositionOfEntityBone(entity, element.id or element) local boneDistance = #(playerCoords - boneCoords) - if not coords then bone, coords, distance = element, boneCoords, boneDistance elseif distance > boneDistance then bone, coords, distance = element, boneCoords, boneDistance end end - if not bone then bone = {id = GetEntityBoneIndexByName(entity, "bodyshell"), type = "remains", name = "bodyshell"} coords = GetWorldPositionOfEntityBone(entity, bone.id) distance = #(coords - playerCoords) end - return bone, coords, distance end -function QBCore.Functions.GetBoneDistance(entity, Type, Bone) +function QBCore.Functions.GetBoneDistance(entity, boneType, boneIndex) local bone - - if Type == 1 then - bone = GetPedBoneIndex(entity, Bone) + if boneType == 1 then + bone = GetPedBoneIndex(entity, boneIndex) else - bone = GetEntityBoneIndexByName(entity, Bone) + bone = GetEntityBoneIndexByName(entity, boneIndex) end - local boneCoords = GetWorldPositionOfEntityBone(entity, bone) local playerCoords = GetEntityCoords(PlayerPedId()) - return #(boneCoords - playerCoords) end -function QBCore.Functions.AttachProp(ped, model, boneId, x, y, z, xR, yR, zR, Vertex) - local modelHash = GetHashKey(model) +function QBCore.Functions.AttachProp(ped, model, boneId, x, y, z, xR, yR, zR, vertex) + local modelHash = type(model) == 'string' and GetHashKey(model) or model local bone = GetPedBoneIndex(ped, boneId) - RequestModel(modelHash) - while not HasModelLoaded(modelHash) do - Wait(0) - end + QBCore.Functions.LoadModel(modelHash) local prop = CreateObject(modelHash, 1.0, 1.0, 1.0, 1, 1, 0) - AttachEntityToEntity(prop, ped, bone, x, y, z, xR, yR, zR, 1, 1, 0, 1, not Vertex and 2 or 0, 1) + AttachEntityToEntity(prop, ped, bone, x, y, z, xR, yR, zR, 1, 1, 0, 1, not vertex and 2 or 0, 1) SetModelAsNoLongerNeeded(modelHash) return prop end -- Vehicle -function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked) - local model = GetHashKey(model) +function QBCore.Functions.SpawnVehicle(model, cb, coords, isnetworked, teleportInto) local ped = PlayerPedId() + model = type(model) == 'string' and GetHashKey(model) or model + if not IsModelInCdimage(model) then return end if coords then coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords else coords = GetEntityCoords(ped) end - local isnetworked = isnetworked or true - if not IsModelInCdimage(model) then - return - end - RequestModel(model) - while not HasModelLoaded(model) do - Citizen.Wait(10) - end + isnetworked = isnetworked or true + QBCore.Functions.LoadModel(model) local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, isnetworked, false) local netid = NetworkGetNetworkIdFromEntity(veh) SetVehicleHasBeenOwnedByPlayer(veh, true) SetNetworkIdCanMigrate(netid, true) SetVehicleNeedsToBeHotwired(veh, false) SetVehRadioStation(veh, 'OFF') + SetVehicleFuelLevel(veh, 100.0) SetModelAsNoLongerNeeded(model) - if cb then - cb(veh) - end + if teleportInto then TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1) end + if cb then cb(veh) end end function QBCore.Functions.DeleteVehicle(vehicle) @@ -412,7 +407,7 @@ function QBCore.Functions.SpawnClear(coords, radius) end local vehicles = GetGamePool('CVehicle') local closeVeh = {} - for i=1, #vehicles, 1 do + for i = 1, #vehicles, 1 do local vehicleCoords = GetEntityCoords(vehicles[i]) local distance = #(vehicleCoords - coords) if distance <= radius then @@ -425,20 +420,20 @@ end function QBCore.Functions.GetVehicleProperties(vehicle) if DoesEntityExist(vehicle) then - local colorPrimary, colorSecondary = GetVehicleColours(vehicle) local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) - local extras = {} + local colorPrimary, colorSecondary = GetVehicleColours(vehicle) if GetIsVehiclePrimaryColourCustom(vehicle) then r, g, b = GetVehicleCustomPrimaryColour(vehicle) - colorPrimary = { r, g, b } + colorPrimary = {r, g, b} end if GetIsVehicleSecondaryColourCustom(vehicle) then r, g, b = GetVehicleCustomSecondaryColour(vehicle) - colorSecondary = { r, g, b } + colorSecondary = {r, g, b} end + local extras = {} for extraId = 0, 12 do if DoesExtraExist(vehicle, extraId) then local state = IsVehicleExtraTurnedOn(vehicle, extraId) == 1 @@ -446,10 +441,39 @@ function QBCore.Functions.GetVehicleProperties(vehicle) end end + local modLivery = GetVehicleMod(vehicle, 48) if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= -1 then modLivery = GetVehicleLivery(vehicle) - else - modLivery = GetVehicleMod(vehicle, 48) + end + + local neons = {} + for i = 0, 3 do + neons[i] = IsVehicleNeonLightEnabled(vehicle, i) + end + + local tireHealth = {} + for i = 0, 3 do + tireHealth[i] = GetVehicleWheelHealth(vehicle, i) + end + + local tireBurstState = {} + for i = 0, 5 do + tireBurstState[i] = IsVehicleTyreBurst(vehicle, i, false) + end + + local tireBurstCompletely = {} + for i = 0, 5 do + tireBurstCompletely[i] = IsVehicleTyreBurst(vehicle, i, true) + end + + local windowStatus = {} + for i = 0, 7 do + windowStatus[i] = IsVehicleWindowIntact(vehicle, i) == 1 + end + + local doorStatus = {} + for i = 0, 5 do + doorStatus[i] = IsVehicleDoorDamaged(vehicle, i) == 1 end return { @@ -461,22 +485,26 @@ function QBCore.Functions.GetVehicleProperties(vehicle) tankHealth = QBCore.Shared.Round(GetVehiclePetrolTankHealth(vehicle), 0.1), fuelLevel = QBCore.Shared.Round(GetVehicleFuelLevel(vehicle), 0.1), dirtLevel = QBCore.Shared.Round(GetVehicleDirtLevel(vehicle), 0.1), + oilLevel = QBCore.Shared.Round(GetVehicleOilLevel(vehicle), 0.1), color1 = colorPrimary, color2 = colorSecondary, pearlescentColor = pearlescentColor, - interiorColor = GetVehicleInteriorColor(vehicle), dashboardColor = GetVehicleDashboardColour(vehicle), wheelColor = wheelColor, wheels = GetVehicleWheelType(vehicle), + wheelSize = GetVehicleWheelSize(vehicle), + wheelWidth = GetVehicleWheelWidth(vehicle), + tireHealth = tireHealth, + tireBurstState = tireBurstState, + tireBurstCompletely = tireBurstCompletely, windowTint = GetVehicleWindowTint(vehicle), + windowStatus = windowStatus, + doorStatus = doorStatus, xenonColor = GetVehicleXenonLightsColour(vehicle), - neonEnabled = { - IsVehicleNeonLightEnabled(vehicle, 0), - IsVehicleNeonLightEnabled(vehicle, 1), - IsVehicleNeonLightEnabled(vehicle, 2), - IsVehicleNeonLightEnabled(vehicle, 3) - }, + neonEnabled = neons, neonColor = table.pack(GetVehicleNeonLightsColour(vehicle)), + headlightColor = GetVehicleHeadlightsColour(vehicle), + interiorColor = GetVehicleInteriorColour(vehicle), extras = extras, tyreSmokeColor = table.pack(GetVehicleTyreSmokeColor(vehicle)), modSpoilers = GetVehicleMod(vehicle, 0), @@ -496,8 +524,11 @@ function QBCore.Functions.GetVehicleProperties(vehicle) modHorns = GetVehicleMod(vehicle, 14), modSuspension = GetVehicleMod(vehicle, 15), modArmor = GetVehicleMod(vehicle, 16), + modKit17 = GetVehicleMod(vehicle, 17), modTurbo = IsToggleModOn(vehicle, 18), + modKit19 = GetVehicleMod(vehicle, 19), modSmokeEnabled = IsToggleModOn(vehicle, 20), + modKit21 = GetVehicleMod(vehicle, 21), modXenon = IsToggleModOn(vehicle, 22), modFrontWheels = GetVehicleMod(vehicle, 23), modBackWheels = GetVehicleMod(vehicle, 24), @@ -525,7 +556,10 @@ function QBCore.Functions.GetVehicleProperties(vehicle) modTrimB = GetVehicleMod(vehicle, 44), modTank = GetVehicleMod(vehicle, 45), modWindows = GetVehicleMod(vehicle, 46), + modKit47 = GetVehicleMod(vehicle, 47), modLivery = modLivery, + modKit49 = GetVehicleMod(vehicle, 49), + liveryRoof = GetVehicleRoofLivery(vehicle), } else return @@ -534,6 +568,16 @@ end function QBCore.Functions.SetVehicleProperties(vehicle, props) if DoesEntityExist(vehicle) then + if props.extras then + for id, enabled in pairs(props.extras) do + if enabled then + SetVehicleExtra(vehicle, tonumber(id), 0) + else + SetVehicleExtra(vehicle, tonumber(id), 1) + end + end + end + local colorPrimary, colorSecondary = GetVehicleColours(vehicle) local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle) SetVehicleModKit(vehicle, 0) @@ -549,12 +593,18 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.engineHealth then SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0) end + if props.tankHealth then + SetVehiclePetrolTankHealth(vehicle, props.tankHealth) + end if props.fuelLevel then SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) end if props.dirtLevel then SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0) end + if props.oilLevel then + SetVehicleOilLevel(vehicle, props.oilLevel) + end if props.color1 then if type(props.color1) == "number" then SetVehicleColours(vehicle, props.color1, colorSecondary) @@ -584,29 +634,59 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.wheels then SetVehicleWheelType(vehicle, props.wheels) end + if props.tireHealth then + for wheelIndex, health in pairs(props.tireHealth) do + SetVehicleWheelHealth(vehicle, wheelIndex, health) + end + end + if props.tireBurstState then + for wheelIndex, burstState in pairs(props.tireBurstState) do + if burstState then + SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), false, 1000.0) + end + end + end + if props.tireBurstCompletely then + for wheelIndex, burstState in pairs(props.tireBurstCompletely) do + if burstState then + SetVehicleTyreBurst(vehicle, tonumber(wheelIndex), true, 1000.0) + end + end + end if props.windowTint then SetVehicleWindowTint(vehicle, props.windowTint) end - if props.neonEnabled then - SetVehicleNeonLightEnabled(vehicle, 0, props.neonEnabled[1]) - SetVehicleNeonLightEnabled(vehicle, 1, props.neonEnabled[2]) - SetVehicleNeonLightEnabled(vehicle, 2, props.neonEnabled[3]) - SetVehicleNeonLightEnabled(vehicle, 3, props.neonEnabled[4]) + if props.windowStatus then + for windowIndex, smashWindow in pairs(props.windowStatus) do + if not smashWindow then SmashVehicleWindow(vehicle, windowIndex) end + end end - if props.extras then - for id, enabled in pairs(props.extras) do - if enabled then - SetVehicleExtra(vehicle, tonumber(id), 0) - else - SetVehicleExtra(vehicle, tonumber(id), 1) + if props.doorStatus then + for doorIndex, breakDoor in pairs(props.doorStatus) do + if breakDoor then + SetVehicleDoorBroken(vehicle, doorIndex, true) end end end + if props.neonEnabled then + for neonIndex, enableNeons in pairs(props.neonEnabled) do + SetVehicleNeonLightEnabled(vehicle, neonIndex, enableNeons) + end + end if props.neonColor then SetVehicleNeonLightsColour(vehicle, props.neonColor[1], props.neonColor[2], props.neonColor[3]) end - if props.modSmokeEnabled then - ToggleVehicleMod(vehicle, 20, true) + if props.headlightColor then + SetVehicleHeadlightsColour(vehicle, props.headlightColor) + end + if props.interiorColor then + SetVehicleInteriorColour(vehicle, props.interiorColor) + end + if props.wheelSize then + SetVehicleWheelSize(vehicle, props.wheelSize) + end + if props.wheelWidth then + SetVehicleWheelWidth(vehicle, props.wheelWidth) end if props.tyreSmokeColor then SetVehicleTyreSmokeColor(vehicle, props.tyreSmokeColor[1], props.tyreSmokeColor[2], props.tyreSmokeColor[3]) @@ -662,9 +742,21 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.modArmor then SetVehicleMod(vehicle, 16, props.modArmor, false) end + if props.modKit17 then + SetVehicleMod(vehicle, 17, props.modKit17, false) + end if props.modTurbo then ToggleVehicleMod(vehicle, 18, props.modTurbo) end + if props.modKit19 then + SetVehicleMod(vehicle, 19, props.modKit19, false) + end + if props.modSmokeEnabled then + ToggleVehicleMod(vehicle, 20, props.modSmokeEnabled) + end + if props.modKit21 then + SetVehicleMod(vehicle, 21, props.modKit21, false) + end if props.modXenon then ToggleVehicleMod(vehicle, 22, props.modXenon) end @@ -749,26 +841,39 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.modWindows then SetVehicleMod(vehicle, 46, props.modWindows, false) end + if props.modKit47 then + SetVehicleMod(vehicle, 47, props.modKit47, false) + end if props.modLivery then SetVehicleMod(vehicle, 48, props.modLivery, false) SetVehicleLivery(vehicle, props.modLivery) end + if props.modKit49 then + SetVehicleMod(vehicle, 49, props.modKit49, false) + end + if props.liveryRoof then + SetVehicleRoofLivery(vehicle, props.liveryRoof) + end end end function QBCore.Functions.LoadParticleDictionary(dictionary) - if not HasNamedPtfxAssetLoaded(dictionary) then - RequestNamedPtfxAsset(dictionary) - while not HasNamedPtfxAssetLoaded(dictionary) do - Wait(0) - end + if HasNamedPtfxAssetLoaded(dictionary) then return end + RequestNamedPtfxAsset(dictionary) + while not HasNamedPtfxAssetLoaded(dictionary) do + Wait(0) end end -function QBCore.Functions.StartParticleAtCoord(Dict, ptName, looped, coords, rot, scale, alpha, color, duration) - QBCore.Functions.LoadParticleDictionary(Dict) - UseParticleFxAssetNextCall(Dict) - SetPtfxAssetNextCall(Dict) +function QBCore.Functions.StartParticleAtCoord(dict, ptName, looped, coords, rot, scale, alpha, color, duration) + if coords then + coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords + else + coords = GetEntityCoords(ped) + end + QBCore.Functions.LoadParticleDictionary(dict) + UseParticleFxAssetNextCall(dict) + SetPtfxAssetNextCall(dict) local particleHandle if looped then particleHandle = StartParticleFxLoopedAtCoord(ptName, coords.x, coords.y, coords.z, rot.x, rot.y, rot.z, scale or 1.0) @@ -787,13 +892,12 @@ function QBCore.Functions.StartParticleAtCoord(Dict, ptName, looped, coords, rot end StartParticleFxNonLoopedAtCoord(ptName, coords.x, coords.y, coords.z, rot.x, rot.y, rot.z, scale or 1.0) end - return particleHandle end -function QBCore.Functions.StartParticleOnEntity(Dict, ptName, looped, entity, bone, offset, rot, scale, alpha, color, evolution, duration) - QBCore.Functions.LoadParticleDictionary(Dict) - UseParticleFxAssetNextCall(Dict) +function QBCore.Functions.StartParticleOnEntity(dict, ptName, looped, entity, bone, offset, rot, scale, alpha, color, evolution, duration) + QBCore.Functions.LoadParticleDictionary(dict) + UseParticleFxAssetNextCall(dict) local particleHandle, boneID if bone and GetEntityType(entity) == 1 then boneID = GetPedBoneIndex(entity, bone) @@ -828,6 +932,5 @@ function QBCore.Functions.StartParticleOnEntity(Dict, ptName, looped, entity, bo StartParticleFxNonLoopedOnEntity(ptName, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, scale) end end - return particleHandle end From 2f0c82d5f9779b54669005d6767b11754cddd285 Mon Sep 17 00:00:00 2001 From: jnccloud <58707473+jnccloud@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:19:41 -0500 Subject: [PATCH 055/120] Update HTML to reflect new location of assets --- html/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/html/index.html b/html/index.html index 3d39174..a229080 100644 --- a/html/index.html +++ b/html/index.html @@ -19,7 +19,7 @@ type="text/css" /> - - - + + +
- \ No newline at end of file + From 3cc48b076719fbfaf5c9412d051686d0eb383405 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 19:40:05 +0100 Subject: [PATCH 056/120] feat(server/functions): make isWhitelisted usable --- server/functions.lua | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index f33e34a..a462c06 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -225,7 +225,7 @@ 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 + reason = '\n' .. reason .. '\n🔸 Check our Discord for further information: ' .. QBCore.Config.Server.Discord if setKickReason then setKickReason(reason) end @@ -254,22 +254,11 @@ function QBCore.Functions.Kick(source, reason, setKickReason, deferrals) end) end --- Check if player is whitelisted (not used anywhere) +-- Check if player is whitelisted, kept like this for backwards compatibility or future plans 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 + if not QBCore.Config.Server.Whitelist then return true end + if QBCore.Functions.HasPermission(source, QBConfig.Server.WhitelistPermission) then return true end return false end From 20635c389df8b2555a4985dd1110b73fe328e799 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 19:41:05 +0100 Subject: [PATCH 057/120] feat(server/events): closed server check, whitelist functionality and optional connectqueue config --- server/events.lua | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/server/events.lua b/server/events.lua index 7f19e82..a010344 100644 --- a/server/events.lua +++ b/server/events.lua @@ -34,7 +34,7 @@ end) -- Player Connecting -local function OnPlayerConnecting(name, setKickReason, deferrals) +local function onPlayerConnecting(name, setKickReason, deferrals) local src = source local license local identifiers = GetPlayerIdentifiers(src) @@ -43,6 +43,10 @@ local function OnPlayerConnecting(name, setKickReason, deferrals) -- Mandatory wait Wait(0) + if QBCore.Config.Server.Closed then + deferrals.done(QBCore.Config.Server.ClosedReason) + end + deferrals.update(string.format('Hello %s. Validating Your Rockstar License', name)) for _, v in pairs(identifiers) do @@ -55,10 +59,11 @@ local function OnPlayerConnecting(name, setKickReason, deferrals) -- Mandatory wait Wait(2500) - deferrals.update(string.format('Hello %s. We are checking if you are banned.', name)) + deferrals.update(string.format('Hello %s. We are checking your allowance.', name)) local isBanned, Reason = QBCore.Functions.IsPlayerBanned(src) local isLicenseAlreadyInUse = QBCore.Functions.IsLicenseInUse(license) + local isWhitelist, whitelisted = QBCore.Config.Server.Whitelist, QBCore.Functions.IsWhitelisted(src) Wait(2500) @@ -68,35 +73,39 @@ local function OnPlayerConnecting(name, setKickReason, deferrals) deferrals.done('No Valid Rockstar License Found') elseif isBanned then deferrals.done(Reason) - elseif isLicenseAlreadyInUse and QBCore.Config.Server.checkDuplicateLicense then + elseif isLicenseAlreadyInUse and QBCore.Config.Server.CheckDuplicateLicense then deferrals.done('Duplicate Rockstar License Found') + elseif isWhitelist and not whitelisted then + deferrals.done('You\'re not whitelisted for this server') else deferrals.done() - Wait(1000) - TriggerEvent('connectqueue:playerConnect', name, setKickReason, deferrals) + if QBCore.Config.Server.UseConnectQueue then + Wait(1000) + TriggerEvent('connectqueue:playerConnect', name, setKickReason, deferrals) + end end -- Add any additional defferals you may need! end -AddEventHandler('playerConnecting', OnPlayerConnecting) +AddEventHandler('playerConnecting', onPlayerConnecting) -- Open & Close Server (prevents players from joining) -RegisterNetEvent('QBCore:server:CloseServer', function(reason) +RegisterNetEvent('QBCore:Server:CloseServer', function(reason) local src = source if QBCore.Functions.HasPermission(src, 'admin') then reason = reason or 'No reason specified' - QBCore.Config.Server.closed = true - QBCore.Config.Server.closedReason = reason + QBCore.Config.Server.Closed = true + QBCore.Config.Server.ClosedReason = reason else QBCore.Functions.Kick(src, 'You don\'t have permissions for this..', nil, nil) end end) -RegisterNetEvent('QBCore:server:OpenServer', function() +RegisterNetEvent('QBCore:Server:OpenServer', function() local src = source if QBCore.Functions.HasPermission(src, 'admin') then - QBCore.Config.Server.closed = false + QBCore.Config.Server.Closed = false else QBCore.Functions.Kick(src, 'You don\'t have permissions for this..', nil, nil) end @@ -254,4 +263,4 @@ QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, am end end cb(retval) -end) \ No newline at end of file +end) From d57218594fac36c8cacc8f5dc7f677e5b3cc5628 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 19:41:37 +0100 Subject: [PATCH 058/120] feat(config): whitelist config and connectqueue config --- config.lua | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/config.lua b/config.lua index f304e81..f18ac41 100644 --- a/config.lua +++ b/config.lua @@ -3,11 +3,11 @@ QBConfig = {} QBConfig.MaxPlayers = GetConvarInt('sv_maxclients', 48) -- Gets max players from config file, default 48 QBConfig.DefaultSpawn = vector4(-1035.71, -2731.87, 12.86, 0.0) QBConfig.UpdateInterval = 5 -- how often to update player data in minutes -QBConfig.StatusInterval = 5000 -- how often to check hunger/thirst status in ms +QBConfig.StatusInterval = 5000 -- how often to check hunger/thirst status in milliseconds QBConfig.Money = {} -QBConfig.Money.MoneyTypes = { ['cash'] = 500, ['bank'] = 5000, ['crypto'] = 0 } -- ['type']=startamount - Add or remove money types for your server (for ex. ['blackmoney']=0), remember once added it will not be removed from the database! -QBConfig.Money.DontAllowMinus = { 'cash', 'crypto' } -- Money that is not allowed going in minus +QBConfig.Money.MoneyTypes = {['cash'] = 500, ['bank'] = 5000, ['crypto'] = 0} -- ['type'] = startamount - Add or remove money types for your server (for ex. ['blackmoney'] = 0), remember once added it will not be removed from the database! +QBConfig.Money.DontAllowMinus = {'cash', 'crypto'} -- Money that is not allowed going in minus QBConfig.Money.PayCheckTimeOut = 10 -- The time in minutes that it will give the paycheck QBConfig.Money.PayCheckSociety = false -- If true paycheck will come from the society account that the player is employed at, requires qb-bossmenu @@ -21,16 +21,20 @@ QBConfig.Player.Bloodtypes = { } QBConfig.Server = {} -- General server config -QBConfig.Server.closed = false -- Set server closed (no one can join except people with ace permission 'qbadmin.join') -QBConfig.Server.closedReason = "Server Closed" -- Reason message to display when people can't join the server -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.UseConnectQueue = true -- Use connectqueue as a queue for your server +QBConfig.Server.Closed = false -- Set server closed (no one can join except people with ace permission 'qbadmin.join') +QBConfig.Server.ClosedReason = "Server Closed" -- Reason message to display when people can't join the server +QBConfig.Server.Uptime = 0 -- Time the server has been up. +QBConfig.Server.Whitelist = false -- Enable or disable whitelist on the server +QBConfig.Server.WhitelistPermission = 'admin' -- Permission that's able to enter the server when the whitelist is on +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 for old permission system QBConfig.Server.UseOldPermissionSystem = false -- Use old permissions system from the database -QBConfig.Server.AllPermissions = {'god',} -- Table of permissions which have access to everything +QBConfig.Server.AllPermissions = { -- Table of permissions which have access to everything for the new permissions system + 'god', +} QBConfig.Notify = {} @@ -64,4 +68,4 @@ QBConfig.Notify.VariantDefinitions = { classes = 'ambulance', icon = 'fas fa-ambulance' } -} \ No newline at end of file +} From c8fd9a590dafc0f85adf7482ac1c3a3166d0d76a Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 19:42:03 +0100 Subject: [PATCH 059/120] feat: removed connectqueue as a dependency --- fxmanifest.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 1db83ae..d5b4970 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -40,8 +40,7 @@ files { dependencies { 'oxmysql', - 'progressbar', - 'connectqueue' + 'progressbar' } -lua54 'yes' \ No newline at end of file +lua54 'yes' From 1319c57009a2992824a14e4247b652e454a7de0e Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 19:43:16 +0100 Subject: [PATCH 060/120] chore(client/events): pvp naming --- client/events.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/events.lua b/client/events.lua index d7bbdef..a2b13a0 100644 --- a/client/events.lua +++ b/client/events.lua @@ -4,7 +4,7 @@ RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() ShutdownLoadingScreenNui() LocalPlayer.state:set('isLoggedIn', true, false) - if not QBConfig.Server.pvp then return end + if not QBConfig.Server.PVP then return end SetCanAttackFriendly(PlayerPedId(), true, false) NetworkSetFriendlyFireOption(true) end) @@ -17,7 +17,6 @@ RegisterNetEvent('QBCore:Client:PvpHasToggled', function(pvp_state) SetCanAttackFriendly(PlayerPedId(), pvp_state, false) NetworkSetFriendlyFireOption(pvp_state) end) - -- Teleport Commands RegisterNetEvent('QBCore:Command:TeleportToPlayer', function(coords) @@ -58,6 +57,7 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) end local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) + SetVehicleFuelLevel(vehicle, 100.0) SetModelAsNoLongerNeeded(vehicle) TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle)) end) From 99f5bdb2353ca3b1f31281a0de916819f5e258e5 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 19:43:50 +0100 Subject: [PATCH 061/120] feat(server/commands): open and close server commands --- server/commands.lua | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index 7b43904..ea11e04 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -68,9 +68,8 @@ QBCore.Commands.Add('tpm', 'TP To Marker (Admin Only)', {}, false, function(sour end, 'admin') QBCore.Commands.Add('togglepvp', 'Toggle PVP on the server (Admin Only)', {}, false, function() - local pvp_state = QBConfig.Server.pvp - QBConfig.Server.pvp = not pvp_state - TriggerClientEvent('QBCore:Client:PvpHasToggled', -1, QBConfig.Server.pvp) + QBConfig.Server.PVP = not QBConfig.Server.PVP + TriggerClientEvent('QBCore:Client:PvpHasToggled', -1, QBConfig.Server.PVP) end, 'admin') -- Permissions @@ -94,6 +93,34 @@ QBCore.Commands.Add('removepermission', 'Remove Players Permissions (God Only)', end end, 'god') +-- Open & Close Server + +QBCore.Commands.Add('openserver', 'Open the server for everyone (Admin Only)', {}, false, function(source) + if not QBCore.Config.Server.Closed then + TriggerClientEvent('QBCore:Notfy', source, 'The server is already open', 'error') + return + end + if QBCore.Functions.HasPermission(source, 'admin') then + QBCore.Config.Server.Closed = false + else + QBCore.Functions.Kick(source, 'You don\'t have permissions for this..', nil, nil) + end +end, 'admin') + +QBCore.Commands.Add('closeserver', 'Close the server for people without permissions (Admin Only)', { { name = 'reason', help = 'Reason for closing it (optional)' } }, false, function(source, args) + if QBCore.Config.Server.Closed then + TriggerClientEvent('QBCore:Notfy', source, 'The server is already closed', 'error') + return + end + if QBCore.Functions.HasPermission(source, 'admin') then + reason = args[1] or 'No reason specified' + QBCore.Config.Server.Closed = true + QBCore.Config.Server.ClosedReason = reason + else + QBCore.Functions.Kick(source, 'You don\'t have permissions for this..', nil, nil) + end +end, 'admin') + -- Vehicle QBCore.Commands.Add('car', 'Spawn Vehicle (Admin Only)', { { name = 'model', help = 'Model name of the vehicle' } }, true, function(source, args) From 32d32e78fc5de399001d4137829ce8e3e334a259 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:25:14 +0100 Subject: [PATCH 062/120] fix(server/events): add kickall --- server/events.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/events.lua b/server/events.lua index a010344..5a99f61 100644 --- a/server/events.lua +++ b/server/events.lua @@ -97,6 +97,11 @@ RegisterNetEvent('QBCore:Server:CloseServer', function(reason) reason = reason or 'No reason specified' QBCore.Config.Server.Closed = true QBCore.Config.Server.ClosedReason = reason + for k in pairs(QBCore.Players) do + if not QBCore.Functions.HasPermission(k, QBCore.Config.Server.WhitelistPermission) then + QBCore.Functions.Kick(k, reason, nil, nil) + end + end else QBCore.Functions.Kick(src, 'You don\'t have permissions for this..', nil, nil) end From 5dd1f78af5a83ff6a47de7e987201d48a2d468c4 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:25:35 +0100 Subject: [PATCH 063/120] fix(server/commands): add kickall --- server/commands.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/commands.lua b/server/commands.lua index ea11e04..b69a522 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -116,6 +116,11 @@ QBCore.Commands.Add('closeserver', 'Close the server for people without permissi reason = args[1] or 'No reason specified' QBCore.Config.Server.Closed = true QBCore.Config.Server.ClosedReason = reason + for k in pairs(QBCore.Players) do + if not QBCore.Functions.HasPermission(k, QBCore.Config.Server.WhitelistPermission) then + QBCore.Functions.Kick(k, reason, nil, nil) + end + end else QBCore.Functions.Kick(source, 'You don\'t have permissions for this..', nil, nil) end From 64b5ec4885cf322c0821e8427fe1df0f95bc5424 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:41:55 +0100 Subject: [PATCH 064/120] fix(client/functions): blip creation --- client/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 42ae99a..67d41ca 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -54,7 +54,7 @@ function QBCore.Functions.DrawText3D(x, y, z, text) end function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, shortRange, title, alpha, friendly, bright, category, hiddenOnLegend, highDetail, rotation, cone, shrink, showHeight, showNumber, showOutline) - if not coords or (type(coords) ~= 'table' or type(coords) ~= 'vector3') then + if not coords or (type(coords) ~= 'table' and type(coords) ~= 'vector3') then print("Blip failed to create, the coords were not specified or was specified in the wrong format, coords must be a table or vector3, debug log: ") print("Coords: " .. coords .. " Sprite: " .. sprite .. " Display: " .. display .. " scale: " .. scale .. " shortRange: " .. shortRange .. " Title: " .. title .. " Alpha: " .. alpha .. " Friendly: " .. friendly .. " Bright: " .. bright .. " Category: " .. category .. " Hidden On Legend: " .. hiddenOnLegend .. " High Detail: " .. highDetail .. " Rotation: " .. rotation .. " Cone: " .. cone .. " Shrink: " .. shrink .. " Show Heigt: " .. showHeight .. " Show Number: " .. showNumber .. " Show Outline: " .. showOutline) return @@ -936,4 +936,4 @@ function QBCore.Functions.StartParticleOnEntity(dict, ptName, looped, entity, bo end end return particleHandle -end \ No newline at end of file +end From cc0ed416532b4fee895eb3ef8327f8f9d20ec1ec Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:50:21 +0100 Subject: [PATCH 065/120] fix(client/functions): blip creation log and dubble if statement --- client/functions.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/functions.lua b/client/functions.lua index 67d41ca..fb96ee9 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -56,7 +56,7 @@ end function QBCore.Functions.CreateBlip(coords, sprite, display, scale, colour, shortRange, title, alpha, friendly, bright, category, hiddenOnLegend, highDetail, rotation, cone, shrink, showHeight, showNumber, showOutline) if not coords or (type(coords) ~= 'table' and type(coords) ~= 'vector3') then print("Blip failed to create, the coords were not specified or was specified in the wrong format, coords must be a table or vector3, debug log: ") - print("Coords: " .. coords .. " Sprite: " .. sprite .. " Display: " .. display .. " scale: " .. scale .. " shortRange: " .. shortRange .. " Title: " .. title .. " Alpha: " .. alpha .. " Friendly: " .. friendly .. " Bright: " .. bright .. " Category: " .. category .. " Hidden On Legend: " .. hiddenOnLegend .. " High Detail: " .. highDetail .. " Rotation: " .. rotation .. " Cone: " .. cone .. " Shrink: " .. shrink .. " Show Heigt: " .. showHeight .. " Show Number: " .. showNumber .. " Show Outline: " .. showOutline) + print(("Coords: %s Sprite: %s Display: %s scale: %s shortRange: %s Title: %s Alpha: %s Friendly: %s Bright: %s Category: %s Hidden On Legend: %s High Detail: %s Rotation: %s Cone: %s Shrink: %s Show Heigt: %s Show Number: %s Show Outline: %s"):format(coords, sprite, display, scale, colour, shortRange, title, alpha, friendly, bright, category, hiddenOnLegend, highDetail, rotation, cone, shrink, showHeight, showNumber, showOutline)) return end coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords @@ -599,9 +599,6 @@ function QBCore.Functions.SetVehicleProperties(vehicle, props) if props.fuelLevel then SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) end - if props.oilLevel then - SetVehicleOilLevel(vehicle, props.oilLevel) - end if props.dirtLevel then SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0) end From 3da18e61ea9b578fdbc4e50117a40cd6cf365e52 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 20:50:40 +0100 Subject: [PATCH 066/120] chore(client/functions): remove unused variable --- client/functions.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/client/functions.lua b/client/functions.lua index fb96ee9..535737f 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -1,5 +1,4 @@ QBCore.Functions = {} -QBCore.RequestId = 0 -- Player From 815ff542ac92eeb9ba6a9919ae10fcc64a2ce423 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Tue, 1 Mar 2022 21:10:38 +0100 Subject: [PATCH 067/120] fix(client/functions): notify text type --- client/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/functions.lua b/client/functions.lua index 535737f..19f99ba 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -113,7 +113,7 @@ function QBCore.Functions.Notify(text, texttype, length) length = length or 5000 SendNUIMessage({ action = 'notify', - type = textype, + type = texttype, length = length, text = ttext, caption = caption From e9e0cffd67153e24bd0def93669df6e66b63ff64 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 6 Mar 2022 21:11:19 +1100 Subject: [PATCH 068/120] Create auto_assign.yml --- .github/auto_assign.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/auto_assign.yml diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml new file mode 100644 index 0000000..60f6e88 --- /dev/null +++ b/.github/auto_assign.yml @@ -0,0 +1,19 @@ +# Set to true to add reviewers to pull requests +addReviewers: true + +# Set to true to add assignees to pull requests +addAssignees: false + +# A list of reviewers to be added to pull requests (GitHub user name) +reviewers: + - IdrisDose + - reviewerB + - reviewerC + +# A list of keywords to be skipped the process that add reviewers if pull requests include it +skipKeywords: + - wip + +# A number of reviewers added to the pull request +# Set 0 to add all the reviewers (default: 0) +numberOfReviewers: 0 From deee263c4ae3abc140a4e87f203f6933aa7b4254 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 6 Mar 2022 21:16:36 +1100 Subject: [PATCH 069/120] Update auto_assign.yml --- .github/auto_assign.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 60f6e88..dba7f55 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -7,9 +7,7 @@ addAssignees: false # A list of reviewers to be added to pull requests (GitHub user name) reviewers: - IdrisDose - - reviewerB - - reviewerC - + # A list of keywords to be skipped the process that add reviewers if pull requests include it skipKeywords: - wip From de27d316fb013275ecd03f89dd9247936a618471 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 6 Mar 2022 21:25:34 +1100 Subject: [PATCH 070/120] Update auto_assign.yml --- .github/auto_assign.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index dba7f55..674c250 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -2,7 +2,7 @@ addReviewers: true # Set to true to add assignees to pull requests -addAssignees: false +addAssignees: author # A list of reviewers to be added to pull requests (GitHub user name) reviewers: From 44a5bd4ab74f3e393116148191a179445e96622e Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 6 Mar 2022 21:34:34 +1100 Subject: [PATCH 071/120] Update auto_assign.yml --- .github/auto_assign.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 674c250..dc85570 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -7,6 +7,7 @@ addAssignees: author # A list of reviewers to be added to pull requests (GitHub user name) reviewers: - IdrisDose + - @qb-core/maintenance # A list of keywords to be skipped the process that add reviewers if pull requests include it skipKeywords: From 40f16a836e04b9aff8c975f92d176e1e3a36f43c Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 6 Mar 2022 21:35:33 +1100 Subject: [PATCH 072/120] Update auto_assign.yml --- .github/auto_assign.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index dc85570..56dec88 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -7,7 +7,7 @@ addAssignees: author # A list of reviewers to be added to pull requests (GitHub user name) reviewers: - IdrisDose - - @qb-core/maintenance + - qbcore-framework/maintenance # A list of keywords to be skipped the process that add reviewers if pull requests include it skipKeywords: From 423e959f3847716a63b0324f63a29f386bf19919 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 6 Mar 2022 21:36:23 +1100 Subject: [PATCH 073/120] Update Number 10? --- .github/auto_assign.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 56dec88..5838509 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -7,7 +7,7 @@ addAssignees: author # A list of reviewers to be added to pull requests (GitHub user name) reviewers: - IdrisDose - - qbcore-framework/maintenance + - /maintenance # A list of keywords to be skipped the process that add reviewers if pull requests include it skipKeywords: From d57c592ee3daeaadb2b64d7ee2ef4635a2c176de Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Mon, 7 Mar 2022 18:58:54 +0100 Subject: [PATCH 074/120] fix(server/main): database permission getter --- server/main.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index 39a10af..d6f3fad 100644 --- a/server/main.lua +++ b/server/main.lua @@ -17,12 +17,12 @@ end) CreateThread(function() if QBCore.Config.Server.UseOldPermissionSystem then local result = MySQL.Sync.fetchAll('SELECT * FROM permissions', {}) - if not result[1] then return end + if not result then return end for k, v in pairs(result) do QBCore.Config.Server.PermissionList[v.license] = { license = v.license, permission = v.permission, - optin = true, + optin = true } end else @@ -30,4 +30,4 @@ CreateThread(function() ExecuteCommand(('add_principal group.%s group.admin'):format(QBCore.Config.Server.AllPermissions[i])) end end -end) \ No newline at end of file +end) From 8d9a970aa12e968b9f240db1d27554e8e3a874d9 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Mon, 7 Mar 2022 18:59:21 +0100 Subject: [PATCH 075/120] fix(server/functions): old permission check --- server/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/functions.lua b/server/functions.lua index a462c06..2e89a2c 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -308,7 +308,7 @@ function QBCore.Functions.HasPermission(source, permission) 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 + if QBCore.Config.Server.PermissionList[license].permission ~= permission and QBCore.Config.Server.PermissionList[license].permission ~= 'god' then return false end return true else local Player = QBCore.Functions.GetPlayer(source) From 4cf4030ad3e48df721a824e2c7f20c9ecbb7cfad Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 12 Mar 2022 12:26:42 +0100 Subject: [PATCH 076/120] fix(client/functions): undefined variable Co-authored-by: ItsANoBrainer --- client/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/functions.lua b/client/functions.lua index 19f99ba..d4abdd8 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -868,7 +868,7 @@ function QBCore.Functions.StartParticleAtCoord(dict, ptName, looped, coords, rot if coords then coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords else - coords = GetEntityCoords(ped) + coords = GetEntityCoords(PlayerPedId()) end QBCore.Functions.LoadParticleDictionary(dict) UseParticleFxAssetNextCall(dict) From 2e75bdbdb5a011b4451c7a8cf4708d661df244f3 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 12 Mar 2022 12:30:13 +0100 Subject: [PATCH 077/120] fix(server/exports): wrong variable Co-authored-by: ItsANoBrainer --- server/exports.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/exports.lua b/server/exports.lua index 1c43cfc..e4c8fa7 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -129,7 +129,7 @@ local function AddGangs(gangs) if QBCore.Shared.Gangs[key] then message = "gang_exists" shouldContinue = false - errorItem = items[key] + errorItem = gangs[key] break end QBCore.Shared.Gangs[key] = value From a063eca8f0f9b1eff2e233cf3d8c62720083af81 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 12 Mar 2022 12:54:29 +0100 Subject: [PATCH 078/120] Prevent duplicated phone and account numbers [Scully] --- server/player.lua | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/server/player.lua b/server/player.lua index c596f2a..820f361 100644 --- a/server/player.lua +++ b/server/player.lua @@ -64,8 +64,8 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.charinfo.gender = PlayerData.charinfo.gender or 0 PlayerData.charinfo.backstory = PlayerData.charinfo.backstory or 'placeholder backstory' PlayerData.charinfo.nationality = PlayerData.charinfo.nationality or 'USA' - PlayerData.charinfo.phone = PlayerData.charinfo.phone or ('1' .. math.random(111111111, 999999999)) - PlayerData.charinfo.account = PlayerData.charinfo.account or ('US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99)) + PlayerData.charinfo.phone = PlayerData.charinfo.phone or QBCore.Functions.CreatePhoneNumber() + PlayerData.charinfo.account = PlayerData.charinfo.account or QBCore.Functions.CreateAccountNumber() -- Metadata PlayerData.metadata = PlayerData.metadata or {} PlayerData.metadata['hunger'] = PlayerData.metadata['hunger'] or 100 @@ -636,6 +636,34 @@ function QBCore.Player.CreateCitizenId() return CitizenId end +function QBCore.Functions.CreateAccountNumber() + local UniqueFound = false + local AccountNumber = nil + while not UniqueFound do + AccountNumber = 'US0' .. math.random(1, 9) .. 'QBCore' .. math.random(1111, 9999) .. math.random(1111, 9999) .. math.random(11, 99) + local query = '%' .. AccountNumber .. '%' + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query }) + if result == 0 then + UniqueFound = true + end + end + return AccountNumber +end + +function QBCore.Functions.CreatePhoneNumber() + local UniqueFound = false + local PhoneNumber = nil + while not UniqueFound do + PhoneNumber = math.random(100,999) .. math.random(1000000,9999999) + local query = '%' .. PhoneNumber .. '%' + local result = MySQL.Sync.prepare('SELECT COUNT(*) as count FROM players WHERE charinfo LIKE ?', { query }) + if result == 0 then + UniqueFound = true + end + end + return PhoneNumber +end + function QBCore.Player.CreateFingerId() local UniqueFound = false local FingerId = nil @@ -678,4 +706,4 @@ function QBCore.Player.CreateSerialNumber() return SerialNumber end -PaycheckInterval() -- This starts the paycheck system \ No newline at end of file +PaycheckInterval() -- This starts the paycheck system From db11f3d9ccc4fa2feb58019384ad2505fe0f9f8f Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sun, 13 Mar 2022 20:43:26 +0100 Subject: [PATCH 079/120] fix(server/exports): wrong variable --- server/exports.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/exports.lua b/server/exports.lua index e4c8fa7..2cfed5a 100644 --- a/server/exports.lua +++ b/server/exports.lua @@ -122,7 +122,7 @@ local function AddGangs(gangs) if type(key) ~= "string" then message = "invalid_gang_name" shouldContinue = false - errorItem = items[key] + errorItem = gangs[key] break end @@ -151,4 +151,4 @@ local function GetCoreVersion(InvokingResource) return resourceVersion end QBCore.Functions.GetCoreVersion = GetCoreVersion -exports('GetCoreVersion', GetCoreVersion) \ No newline at end of file +exports('GetCoreVersion', GetCoreVersion) From e63d9f744db3dd240fc715049faff943269892ed Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sun, 13 Mar 2022 20:44:17 +0100 Subject: [PATCH 080/120] fix(client/functions): undefined variable --- client/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/functions.lua b/client/functions.lua index d4abdd8..16e1430 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -402,7 +402,7 @@ function QBCore.Functions.SpawnClear(coords, radius) if coords then coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords else - coords = GetEntityCoords(ped) + coords = GetEntityCoords(PlayerPedId()) end local vehicles = GetGamePool('CVehicle') local closeVeh = {} From 440b4eb01c2a6c6bcbe6dd4542bb31fa077877e3 Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Sun, 13 Mar 2022 16:13:32 -0400 Subject: [PATCH 081/120] [Hotfix] Missing Job/Gang found - If a job or gang isnt found in shared, it will error out and character can not spawn --- server/player.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/player.lua b/server/player.lua index 820f361..9f35ff4 100644 --- a/server/player.lua +++ b/server/player.lua @@ -116,6 +116,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) InstalledApps = {}, } -- Job + if not QBCore.Shared.Jobs[PlayerData.job.name] then PlayerData.job = nil end PlayerData.job = PlayerData.job or {} PlayerData.job.name = PlayerData.job.name or 'unemployed' PlayerData.job.label = PlayerData.job.label or 'Civilian' @@ -128,6 +129,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.job.grade.name = PlayerData.job.grade.name or 'Freelancer' PlayerData.job.grade.level = PlayerData.job.grade.level or 0 -- Gang + if not QBCore.Shared.Gangs[PlayerData.gang.name] then PlayerData.gang = nil end PlayerData.gang = PlayerData.gang or {} PlayerData.gang.name = PlayerData.gang.name or 'none' PlayerData.gang.label = PlayerData.gang.label or 'No Gang Affiliaton' From 93a95e268b2adf442eb202a4e08c962302fcc12b Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sun, 13 Mar 2022 21:18:05 +0100 Subject: [PATCH 082/120] tweak(server/player): ping when player was banned Co-authored-by: ItsANoBrainer --- server/player.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/player.lua b/server/player.lua index 9f35ff4..1055bb6 100644 --- a/server/player.lua +++ b/server/player.lua @@ -523,7 +523,7 @@ function QBCore.Player.DeleteCharacter(source, citizenid) end) else DropPlayer(source, 'You Have Been Kicked For Exploitation') - TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'white', GetPlayerName(source) .. ' Has Been Dropped For Character Deletion Exploit', false) + TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'Anti-Cheat', 'white', GetPlayerName(source) .. ' Has Been Dropped For Character Deletion Exploit', true) end end From 8efd4266a584a4f8c11f90bda7f5f429a9d922eb Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sun, 13 Mar 2022 21:42:23 +0100 Subject: [PATCH 083/120] fix(client/functions): error when progressbar is not started --- client/functions.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/client/functions.lua b/client/functions.lua index 16e1430..dac7ab0 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -140,6 +140,7 @@ function QBCore.Functions.TriggerCallback(name, cb, ...) end function QBCore.Functions.Progressbar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel) + if GetResourceState('progressbar') ~= 'started' then error('progressbar needs to be started in order for QBCore.Functions.Progressbar to work') end exports['progressbar']:Progress({ name = name:lower(), duration = duration, From 05e740c963f308a8ed2b8667341f75ee5509051a Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sun, 13 Mar 2022 21:43:09 +0100 Subject: [PATCH 084/120] tweak(manifest): remove progressbar dependency --- fxmanifest.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index d5b4970..8cfc69d 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -38,9 +38,6 @@ files { 'html/js/*.js' } -dependencies { - 'oxmysql', - 'progressbar' -} +dependency 'oxmysql' lua54 'yes' From 17fc6544e55ecf578c0c6d8e75d16883574adb99 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Tue, 15 Mar 2022 09:57:38 +1100 Subject: [PATCH 085/120] Revert "feat (server/player): Added Job update on duty update (#519)" This reverts commit f58478b61f856ca5b53f08d679d0ea05847380b7. --- server/player.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/player.lua b/server/player.lua index d46f7ed..3c54fca 100644 --- a/server/player.lua +++ b/server/player.lua @@ -234,8 +234,6 @@ function QBCore.Player.CreatePlayer(PlayerData) self.Functions.SetJobDuty = function(onDuty) self.PlayerData.job.onduty = onDuty self.Functions.UpdatePlayerData() - TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) - TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) end self.Functions.SetMetaData = function(meta, val) From 73300a2edf9a0daff3cef4af7e0362be69b9aef5 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Mon, 14 Mar 2022 23:59:28 +0100 Subject: [PATCH 086/120] Revert "feat (server/player): Added Job update on duty update" - IdrisDose --- server/player.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/player.lua b/server/player.lua index 1055bb6..7cc79e1 100644 --- a/server/player.lua +++ b/server/player.lua @@ -232,8 +232,6 @@ function QBCore.Player.CreatePlayer(PlayerData) function self.Functions.SetJobDuty(onDuty) self.PlayerData.job.onduty = onDuty self.Functions.UpdatePlayerData() - TriggerEvent('QBCore:Server:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) - TriggerClientEvent('QBCore:Client:OnJobUpdate', self.PlayerData.source, self.PlayerData.job) end function self.Functions.SetMetaData(meta, val) From 27085c918f5d23e259270826f976c31c77522f1d Mon Sep 17 00:00:00 2001 From: yonatannn <47007936+Yonatannn@users.noreply.github.com> Date: Wed, 16 Mar 2022 10:11:12 +0200 Subject: [PATCH 087/120] Create he.lua Hebrew Lang --- locale/he.lua | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 locale/he.lua diff --git a/locale/he.lua b/locale/he.lua new file mode 100644 index 0000000..5a983b2 --- /dev/null +++ b/locale/he.lua @@ -0,0 +1,25 @@ +local Translations = { + error = { + not_online = 'שחקן לא מחובר', + wrong_format = 'פורמט שגוי', + missing_args = 'יש לכתוב את הפקודה לפי מה שכתוב (x, y, z)', + missing_args2 = 'יש למלא את כל המידע המבוקש', + no_access = 'אין לך גישה לפקודה זו', + company_too_poor = 'העסק שלך שבור', + item_not_exist = 'אייטם לא נמצא', + too_heavy = 'אינבנטורי מלא' + }, + success = {}, + info = { + received_paycheck = '$%{value} קיבלת משבורת על סך', + job_info = '%{value3} :בתפקיד | %{value2} :דרגה | %{value} :עבודה', + gang_info = '%{value2} :דרגה | %{value} :גאנג', + on_duty = 'אתה בתפקיד כעת', + off_duty = 'ירדת מתפקיד כעת' + } +} + +Lang = Locale:new({ + phrases = Translations, + warnOnMissing = true +}) From 2d9349da926427d6cdc6be4f622b969717dedd21 Mon Sep 17 00:00:00 2001 From: Crashys <99598990+crashys@users.noreply.github.com> Date: Wed, 16 Mar 2022 12:08:44 +0100 Subject: [PATCH 088/120] Update pt.lua One word missed translation on line 16 "grade". --- locale/pt.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/pt.lua b/locale/pt.lua index 0abca34..0fc86a7 100644 --- a/locale/pt.lua +++ b/locale/pt.lua @@ -13,7 +13,7 @@ local Translations = { info = { received_paycheck = 'Recebeste o pagamento de %{value}€', job_info = 'Emprego: %{value} | Grau: %{value2} | Serviço: %{value3}', - gang_info = 'Gang: %{value} | Grade: %{value2}', + gang_info = 'Gang: %{value} | Grau: %{value2}', on_duty = 'Agora estás de serviço!', off_duty = 'Agora estás fora de serviço!' } From ae231817fbe25cb36cc4562f4e21662ba35ddc09 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Fri, 18 Mar 2022 10:31:58 +1100 Subject: [PATCH 089/120] Update auto_assign.yml --- .github/auto_assign.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 5838509..a4a8078 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -6,7 +6,6 @@ addAssignees: author # A list of reviewers to be added to pull requests (GitHub user name) reviewers: - - IdrisDose - /maintenance # A list of keywords to be skipped the process that add reviewers if pull requests include it From b5de979b794fe52425d080ea3955aa41bdde6db4 Mon Sep 17 00:00:00 2001 From: BerkieBb <82737367+BerkieBb@users.noreply.github.com> Date: Sat, 19 Mar 2022 11:16:10 +0100 Subject: [PATCH 090/120] fix(server/player): error on character creation --- server/player.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/player.lua b/server/player.lua index 7cc79e1..fabb9f4 100644 --- a/server/player.lua +++ b/server/player.lua @@ -116,7 +116,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) InstalledApps = {}, } -- Job - if not QBCore.Shared.Jobs[PlayerData.job.name] then PlayerData.job = nil end + if PlayerData.job and PlayerData.job.name and not QBCore.Shared.Jobs[PlayerData.job.name] then PlayerData.job = nil end PlayerData.job = PlayerData.job or {} PlayerData.job.name = PlayerData.job.name or 'unemployed' PlayerData.job.label = PlayerData.job.label or 'Civilian' @@ -129,7 +129,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.job.grade.name = PlayerData.job.grade.name or 'Freelancer' PlayerData.job.grade.level = PlayerData.job.grade.level or 0 -- Gang - if not QBCore.Shared.Gangs[PlayerData.gang.name] then PlayerData.gang = nil end + if PlayerData.gang and PlayerData.gang.name and not QBCore.Shared.Gangs[PlayerData.gang.name] then PlayerData.gang = nil end PlayerData.gang = PlayerData.gang or {} PlayerData.gang.name = PlayerData.gang.name or 'none' PlayerData.gang.label = PlayerData.gang.label or 'No Gang Affiliaton' From 99af63c83c6dce29f7eeba6eaefd8e27b79688a1 Mon Sep 17 00:00:00 2001 From: El Vod Kaa <44878760+elvodkaa@users.noreply.github.com> Date: Sat, 19 Mar 2022 14:45:24 +0100 Subject: [PATCH 091/120] Update ar.lua --- locale/ar.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/ar.lua b/locale/ar.lua index 75e01f8..11b32af 100644 --- a/locale/ar.lua +++ b/locale/ar.lua @@ -1,21 +1,21 @@ local Translations = { error = { - not_online = 'اللاعب غير متواجد', + not_online = 'اللاعب غير متصل', wrong_format = 'التنسيق غير صحيح', - missing_args = 'لم يتم ادخل جميع الحقول تاكد من وضع (x, y, z)', - missing_args2 = 'يجب ملأ جميع الحقول اللازمة!', + missing_args = '(x, y, z) لم يتم ادخل جميع المعلومات', + missing_args2 = 'يجب ملأ جميع الحقول اللازمة', no_access = 'لا يمكن الوصول إلى هذا الأمر', - company_too_poor = 'رئيس العمل الخاص بك لا يملك اموال كافية', - item_not_exist = 'لا يوجد هذا العنصر', - too_heavy = 'المحفظة ممتلئة' + company_too_poor = 'مسؤول الوظيفة لا يمكلك مال كاف-ي', + item_not_exist = 'عنصر غير موجود', + too_heavy = 'لا يوجد مساحة في جقيبتك' }, success = {}, info = { - received_paycheck = 'لقد استملت راتبك الشهري $%{value}', - job_info = 'الوظيفة: %{value} | الرتبة: %{value2} | الخدمة: %{value3}', - gang_info = 'العصابة: %{value} | الرتبة: %{value2}', - on_duty = 'انت الان خارج الخدمة!', - off_duty = 'انت الان في الخدمة!' + received_paycheck = '$%{value} لقد استملت راتبك الشهري', + job_info = '%{value} | %{value2} | %{value3}', + gang_info = '%{value} | %{value2}', + on_duty = 'انت الان خارج الخدمة', + off_duty = 'انت الان في الخدمة' } } From 98c907b9ed28f97ed07d4fe09dfbb18344cc11cc Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Wed, 23 Mar 2022 14:21:30 +1100 Subject: [PATCH 092/120] chore (typo): QBCore:Notfy -> QBCore:Notify --- server/commands.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index b69a522..a8fffbe 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -97,7 +97,7 @@ end, 'god') QBCore.Commands.Add('openserver', 'Open the server for everyone (Admin Only)', {}, false, function(source) if not QBCore.Config.Server.Closed then - TriggerClientEvent('QBCore:Notfy', source, 'The server is already open', 'error') + TriggerClientEvent('QBCore:Notify', source, 'The server is already open', 'error') return end if QBCore.Functions.HasPermission(source, 'admin') then @@ -109,7 +109,7 @@ end, 'admin') QBCore.Commands.Add('closeserver', 'Close the server for people without permissions (Admin Only)', { { name = 'reason', help = 'Reason for closing it (optional)' } }, false, function(source, args) if QBCore.Config.Server.Closed then - TriggerClientEvent('QBCore:Notfy', source, 'The server is already closed', 'error') + TriggerClientEvent('QBCore:Notify', source, 'The server is already closed', 'error') return end if QBCore.Functions.HasPermission(source, 'admin') then From de28c3c9dbd470451cc3241beb7dc5a05821c763 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Tue, 22 Mar 2022 22:48:36 -0500 Subject: [PATCH 093/120] Update commands.lua --- server/commands.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/server/commands.lua b/server/commands.lua index a8fffbe..7a68187 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -240,6 +240,7 @@ QBCore.Commands.Add('me', 'Show local message', {{name = 'message', help = 'Mess local pCoords = GetEntityCoords(ped) local msg = table.concat(args, ' ') if msg == '' then return end + if string.match(msg, "<") then TriggerClientEvent('QBCore:Notify', source, Lang:t('error.wrong_format'), 'error') return end for k,v in pairs(QBCore.Functions.GetPlayers()) do local target = GetPlayerPed(v) local tCoords = GetEntityCoords(target) From 9c818ecd02c9924a4c48c17a5ae1037c479b9703 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Tue, 22 Mar 2022 22:52:27 -0500 Subject: [PATCH 094/120] Update natives --- client/events.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/events.lua b/client/events.lua index 9a465bf..537513a 100644 --- a/client/events.lua +++ b/client/events.lua @@ -120,9 +120,9 @@ local function Draw3DText(coords, str) SetTextProportional(1) SetTextOutline() SetTextCentre(1) - SetTextEntry("STRING") - AddTextComponentString(str) - DrawText(worldX, worldY) + BeginTextCommandDisplayText("STRING") + AddTextComponentSubstringPlayerName(str) + EndTextCommandDisplayText(worldX, worldY) end end From 52ac1b3b330585e065cbc9ed86eb0fdbd07871d3 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Tue, 22 Mar 2022 22:59:53 -0500 Subject: [PATCH 095/120] Pull #550 --- client/events.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/events.lua b/client/events.lua index 537513a..43df4cf 100644 --- a/client/events.lua +++ b/client/events.lua @@ -58,8 +58,7 @@ RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) SetVehicleFuelLevel(vehicle, 100.0) - SetModelAsNoLongerNeeded(vehicle) - + SetModelAsNoLongerNeeded(hash) TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(vehicle)) end) From d0ea8571e3f97ec8af5d2492e68247032d43e424 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Tue, 22 Mar 2022 23:03:49 -0500 Subject: [PATCH 096/120] Pull #521 --- client/functions.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/functions.lua b/client/functions.lua index dac7ab0..a929b5a 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -93,6 +93,14 @@ function QBCore.Functions.RequestAnimDict(animDict) end end +function QBCore.Functions.PlayAnim(animDict, animName, upperbodyOnly, duration) + local flags = upperbodyOnly == true and 16 or 0 + local runTime = duration ~= nil and duration or -1 + QBCore.Functions.RequestAnimDict(animDict) + TaskPlayAnim(PlayerPedId(), animDict, animName, 8.0, 1.0, runTime, flags, 0.0, false, false, true) + RemoveAnimDict(animDict) +end + function QBCore.Functions.LoadModel(model) if HasModelLoaded(model) then return end RequestModel(model) From 9ca5196c2486fc72a45e890d767eb5704e8c4017 Mon Sep 17 00:00:00 2001 From: FekyDEV <71899549+FekyDEV@users.noreply.github.com> Date: Thu, 24 Mar 2022 17:32:47 +0100 Subject: [PATCH 097/120] Deletes the vehicle if the user is already in it --- client/events.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/events.lua b/client/events.lua index 43df4cf..ff48269 100644 --- a/client/events.lua +++ b/client/events.lua @@ -50,11 +50,17 @@ end) RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) local ped = PlayerPedId() local hash = GetHashKey(vehName) + local veh = GetVehiclePedIsUsing(ped) if not IsModelInCdimage(hash) then return end RequestModel(hash) while not HasModelLoaded(hash) do Wait(0) end + + if IsPedInAnyVehicle(ped) then + DeleteVehicle(veh) + end + local vehicle = CreateVehicle(hash, GetEntityCoords(ped), GetEntityHeading(ped), true, false) TaskWarpPedIntoVehicle(ped, vehicle, -1) SetVehicleFuelLevel(vehicle, 100.0) From 1dfdb46105109de58963b64a99087146c83c7215 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Fri, 25 Mar 2022 21:35:37 +1100 Subject: [PATCH 098/120] fix (Zap): Fixed user not getting god perms when using Zap Hosting. --- server/player.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/player.lua b/server/player.lua index fabb9f4..1d133be 100644 --- a/server/player.lua +++ b/server/player.lua @@ -45,7 +45,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) 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 - if not PlayerData.permission and IsPlayerAceAllowed(source, 'command') and IsPlayerAceAllowed(source, 'webadmin') then -- if both aces are allowed then the person has group.admin and is a system admin + if not PlayerData.permission and IsPlayerAceAllowed(source, 'command') then -- if both aces are allowed then the person has group.admin and is a system admin PlayerData.permission = QBCore.Config.Server.AllPermissions[1] or 'god' end PlayerData.permission = PlayerData.permission or 'user' From 3bb10236542ab46934cf1e06ae428abed9a351d5 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Mon, 28 Mar 2022 01:24:40 -0500 Subject: [PATCH 099/120] WIP permission system --- config.lua | 6 +--- server/commands.lua | 34 ++++++++++------------ server/events.lua | 26 ++--------------- server/functions.lua | 69 +++++++++----------------------------------- server/main.lua | 22 +------------- server/player.lua | 20 ------------- 6 files changed, 34 insertions(+), 143 deletions(-) diff --git a/config.lua b/config.lua index f18ac41..43de9d5 100644 --- a/config.lua +++ b/config.lua @@ -30,11 +30,7 @@ QBConfig.Server.WhitelistPermission = 'admin' -- Permission that's able to enter 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 for old permission system -QBConfig.Server.UseOldPermissionSystem = false -- Use old permissions system from the database -QBConfig.Server.AllPermissions = { -- Table of permissions which have access to everything for the new permissions system - 'god', -} +QBConfig.Server.Permissions = {'god', 'admin', 'mod'} -- Add as many groups as you want here after creating them in your server.cfg QBConfig.Notify = {} diff --git a/server/commands.lua b/server/commands.lua index 7a68187..877236c 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -4,14 +4,10 @@ QBCore.Commands.List = {} -- Register & Refresh Commands function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, permission) - if type(permission) == 'string' then - permission = permission:lower() - else - permission = 'user' - end - QBCore.Commands.List[name:lower()] = { + RegisterCommand(name, callback, permission) + CommandList[name:lower()] = { name = name:lower(), - permission = permission, + permission = tostring(permission:lower()), help = help, arguments = arguments, argsrequired = argsrequired, @@ -20,20 +16,22 @@ function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, perm end function QBCore.Commands.Refresh(source) - local Player = QBCore.Functions.GetPlayer(source) + local src = source + local Player = GetPlayer(src) local suggestions = {} - if not Player then return end - for command, info in pairs(QBCore.Commands.List) do - local hasPerm = QBCore.Functions.HasPermission(source, QBCore.Commands.List[command].permission) - if hasPerm then - suggestions[#suggestions + 1] = { - name = '/' .. command, - help = info.help, - params = info.arguments - } + if Player then + for command, info in pairs(CommandList) do + local hasPerm = IsPlayerAceAllowed(tostring(src), info.permission) + if hasPerm then + suggestions[#suggestions + 1] = { + name = '/' .. command, + help = info.help, + params = info.arguments + } + end end + TriggerClientEvent('chat:addSuggestions', tonumber(src), suggestions) end - TriggerClientEvent('chat:addSuggestions', source, suggestions) end -- Teleport diff --git a/server/events.lua b/server/events.lua index 5a99f61..84bb425 100644 --- a/server/events.lua +++ b/server/events.lua @@ -10,28 +10,6 @@ AddEventHandler('playerDropped', function() QBCore.Players[src] = nil end) -AddEventHandler('chatMessage', function(source, _, message) - local src = source - if string.sub(message, 1, 1) ~= '/' then return end - local args = QBCore.Shared.SplitStr(message, ' ') - local command = string.gsub(args[1]:lower(), '/', '') - CancelEvent() - if not QBCore.Commands.List[command] then return end - local Player = QBCore.Functions.GetPlayer(src) - if not Player then return end - local hasPerm = QBCore.Functions.HasPermission(src, QBCore.Commands.List[command].permission) - table.remove(args, 1) - 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 - QBCore.Commands.List[command].callback(src, args) - end - else - TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_access'), 'error') - end -end) - -- Player Connecting local function onPlayerConnecting(name, setKickReason, deferrals) @@ -44,7 +22,9 @@ local function onPlayerConnecting(name, setKickReason, deferrals) Wait(0) if QBCore.Config.Server.Closed then - deferrals.done(QBCore.Config.Server.ClosedReason) + if not IsPlayerAceAllowed(src, 'qbadmin.join') then + deferrals.done(QBCore.Config.Server.ClosedReason) + end end deferrals.update(string.format('Hello %s. Validating Your Rockstar License', name)) diff --git a/server/functions.lua b/server/functions.lua index 2e89a2c..5802a27 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -265,76 +265,33 @@ 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) + local license = QBCore.Functions.GetIdentifier(source, 'license') + if QBConfig.Server.Permissions[permission] then + ExecuteCommand(('add_principal identifier.%s group.%s'):format(license, permission)) + QBCore.Commands.Refresh(source) else - Player.Functions.SetPermission(permission) + TriggerClientEvent('QBCore:Notify', source, 'Invalid permission level', 'error') 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') + local license = QBCore.Functions.GetIdentifier(source, 'license') + for k,v in pairs(QBConfig.Server.Permissions) do + if IsPlayerAceAllowed(source, v) then + ExecuteCommand(('remove_principal identifier.%s group.%s'):format(license, v)) + QBCore.Commands.Refresh(source) + end 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 and 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 + local src = source + if IsPlayerAceAllowed(tostring(src), tostring(permission:lower())) then return true 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) diff --git a/server/main.lua b/server/main.lua index d6f3fad..41c0c43 100644 --- a/server/main.lua +++ b/server/main.lua @@ -10,24 +10,4 @@ end) -- To use this export in a script instead of manifest method -- Just put this line of code below at the very top of the script --- local QBCore = exports['qb-core']:GetCoreObject() - --- Get permissions on server start - -CreateThread(function() - if QBCore.Config.Server.UseOldPermissionSystem then - local result = MySQL.Sync.fetchAll('SELECT * FROM permissions', {}) - if not result 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) +-- local QBCore = exports['qb-core']:GetCoreObject() \ No newline at end of file diff --git a/server/player.lua b/server/player.lua index 1d133be..b706e67 100644 --- a/server/player.lua +++ b/server/player.lua @@ -43,15 +43,6 @@ 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 - if not PlayerData.permission and IsPlayerAceAllowed(source, 'command') then -- if both aces are allowed then the person has group.admin and is a system admin - PlayerData.permission = QBCore.Config.Server.AllPermissions[1] or 'god' - 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 @@ -168,17 +159,6 @@ function QBCore.Player.CreatePlayer(PlayerData) 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' From 581e7572a0fd140cb1e537bae102a56c6662a00d Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Mon, 28 Mar 2022 01:26:25 -0500 Subject: [PATCH 100/120] Remove optin (look into chat channels) --- server/functions.lua | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index 5802a27..fb0cfa4 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -294,28 +294,28 @@ 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.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 +-- 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 From 52dc610c6c97f21fdd1090850bd34332ba05195e Mon Sep 17 00:00:00 2001 From: ItsANoBrainer Date: Mon, 28 Mar 2022 20:28:01 -0400 Subject: [PATCH 101/120] [Fix] Livery Mod Saving - Fixed bug where livery mod would not save if it was set to default --- client/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/functions.lua b/client/functions.lua index a929b5a..c11c1ab 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -450,7 +450,7 @@ function QBCore.Functions.GetVehicleProperties(vehicle) end local modLivery = GetVehicleMod(vehicle, 48) - if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= -1 then + if GetVehicleMod(vehicle, 48) == -1 and GetVehicleLivery(vehicle) ~= 0 then modLivery = GetVehicleLivery(vehicle) end From 997e19a9dad9ba476eb16ed0c447c6858c82addf Mon Sep 17 00:00:00 2001 From: Molicheu <64894726+Molicheu@users.noreply.github.com> Date: Mon, 28 Mar 2022 22:36:38 -0400 Subject: [PATCH 102/120] Rename qb-bossmenu to qb-management --- server/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/functions.lua b/server/functions.lua index 2e89a2c..b5e21be 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -173,13 +173,13 @@ function PaycheckInterval() 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) + local account = exports['qb-management']: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) + TriggerEvent('qb-management:server:removeAccountMoney', Player.PlayerData.job.name, payment) TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment})) end else From cc44840df40c220a552fac49ebbd1e7e52915dc5 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Mon, 28 Mar 2022 21:37:53 -0500 Subject: [PATCH 103/120] GetPermission function --- server/functions.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/server/functions.lua b/server/functions.lua index fb0cfa4..fcad125 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -292,6 +292,16 @@ function QBCore.Functions.HasPermission(source, permission) return false end +function QBCore.Functions.GetPermission(source) + local src = source + for k,v in pairs (QBConfig.Server.Permissions) do + if IsPlayerAceAllowed(src, 'group.'..v) then + return v + end + end + return 'user' +end + -- Opt in or out of admin reports -- function QBCore.Functions.IsOptin(source) From 94476fee2e3fa31b322f07526160d64fcc1c3ca9 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Mon, 28 Mar 2022 22:00:56 -0500 Subject: [PATCH 104/120] old compat --- server/commands.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index 877236c..376c9a9 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -4,8 +4,9 @@ QBCore.Commands.List = {} -- Register & Refresh Commands function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, permission) + if not permission then permission = 'user' end RegisterCommand(name, callback, permission) - CommandList[name:lower()] = { + QBCore.Commands.List[name:lower()] = { name = name:lower(), permission = tostring(permission:lower()), help = help, @@ -20,7 +21,7 @@ function QBCore.Commands.Refresh(source) local Player = GetPlayer(src) local suggestions = {} if Player then - for command, info in pairs(CommandList) do + for command, info in pairs(QBCore.Commands.List) do local hasPerm = IsPlayerAceAllowed(tostring(src), info.permission) if hasPerm then suggestions[#suggestions + 1] = { From e730b015453c7777f77147f0c6e050a399e0c574 Mon Sep 17 00:00:00 2001 From: TRClassic <82931913+trclassic92@users.noreply.github.com> Date: Tue, 29 Mar 2022 00:13:51 -0400 Subject: [PATCH 105/120] Loading issue wasn't loading the shared files in order --- fxmanifest.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 8cfc69d..a38fc67 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -5,9 +5,15 @@ description 'QB-Core' version '1.1.0' shared_scripts { - 'shared/*.lua', 'config.lua', - 'locale/en.lua' -- replace with desired language + 'locale/en.lua', -- replace with desired language + 'shared/main.lua', + 'shared/items.lua', + 'shared/jobs.lua', + 'shared/vehicles.lua', + 'shared/gangs.lua', + 'shared/weapons.lua' +} } client_scripts { From 814adb0a23b9c8375123ee8e1f365d3b053eb5ed Mon Sep 17 00:00:00 2001 From: TRClassic <82931913+trclassic92@users.noreply.github.com> Date: Tue, 29 Mar 2022 00:15:25 -0400 Subject: [PATCH 106/120] Update fxmanifest.lua --- fxmanifest.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index a38fc67..12983b2 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -14,7 +14,6 @@ shared_scripts { 'shared/gangs.lua', 'shared/weapons.lua' } -} client_scripts { 'client/main.lua', From 48a73aff83ada6ea9f81668607a7784d70f8b483 Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Tue, 29 Mar 2022 19:32:56 +1100 Subject: [PATCH 107/120] Update fxmanifest.lua --- fxmanifest.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/fxmanifest.lua b/fxmanifest.lua index 12983b2..21a8fde 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -6,6 +6,7 @@ version '1.1.0' shared_scripts { 'config.lua', + 'shared/locale.lua', 'locale/en.lua', -- replace with desired language 'shared/main.lua', 'shared/items.lua', From a528a0b1272eb13dbc77449e1e5b70d8276a54d5 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Tue, 29 Mar 2022 22:12:00 -0500 Subject: [PATCH 108/120] More updates --- server/commands.lua | 28 ++++++++++++++++++++++------ server/functions.lua | 44 +++++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index 376c9a9..c32d5fd 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -1,11 +1,21 @@ QBCore.Commands = {} QBCore.Commands.List = {} +QBCore.Commands.IgnoreList = { -- Ignore old perm levels while keeping backwards compatibility + ['god'] = true, -- We don't need to create an ace because group.admin allows all commands + ['admin'] = true, -- We don't need to create an ace because group.admin allows all commands + ['user'] = true, -- We don't need to create an ace because builtin.everyone +} -- Register & Refresh Commands function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, permission) - if not permission then permission = 'user' end - RegisterCommand(name, callback, permission) + local restricted = true -- Default to restricted for all commands + if not permission then permission = 'user' end -- some commands don't pass permission level + if permission == 'user' then restricted = false end -- allow all users to use command + RegisterCommand(name, callback, restricted) -- Register command within fivem + if not QBCore.Commands.IgnoreList[permission] then -- only create aces for extra perm levels + ExecuteCommand(('add_ace group.%s command.%s allow'):format(permission, name)) + end QBCore.Commands.List[name:lower()] = { name = name:lower(), permission = tostring(permission:lower()), @@ -18,20 +28,22 @@ end function QBCore.Commands.Refresh(source) local src = source - local Player = GetPlayer(src) + local Player = QBCore.Functions.GetPlayer(src) local suggestions = {} if Player then for command, info in pairs(QBCore.Commands.List) do - local hasPerm = IsPlayerAceAllowed(tostring(src), info.permission) + local hasPerm = IsPlayerAceAllowed(tostring(src), 'command.'..command) if hasPerm then suggestions[#suggestions + 1] = { name = '/' .. command, help = info.help, params = info.arguments } + else + TriggerClientEvent('chat:removeSuggestion', src, '/'..command) end end - TriggerClientEvent('chat:addSuggestions', tonumber(src), suggestions) + TriggerClientEvent('chat:addSuggestions', src, suggestions) end end @@ -77,7 +89,11 @@ QBCore.Commands.Add('addpermission', 'Give Player Permissions (God Only)', { { n local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) local permission = tostring(args[2]):lower() if Player then - QBCore.Functions.AddPermission(Player.PlayerData.source, permission) + if QBCore.Config.Server.Permissions[permission] then + QBCore.Functions.AddPermission(Player.PlayerData.source, permission) + else + TriggerClientEvent('QBCore:Notify', source, 'Invalid permission level', 'error') + end else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end diff --git a/server/functions.lua b/server/functions.lua index fcad125..b9e30db 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -14,7 +14,6 @@ function QBCore.Functions.GetCoords(entity) 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 @@ -258,28 +257,37 @@ end function QBCore.Functions.IsWhitelisted(source) if not QBCore.Config.Server.Whitelist then return true end - if QBCore.Functions.HasPermission(source, QBConfig.Server.WhitelistPermission) then return true end + if QBCore.Functions.HasPermission(source, QBCore.Config.Server.WhitelistPermission) then return true end return false end -- Setting & Removing Permissions function QBCore.Functions.AddPermission(source, permission) - local license = QBCore.Functions.GetIdentifier(source, 'license') - if QBConfig.Server.Permissions[permission] then - ExecuteCommand(('add_principal identifier.%s group.%s'):format(license, permission)) - QBCore.Commands.Refresh(source) - else - TriggerClientEvent('QBCore:Notify', source, 'Invalid permission level', 'error') + local src = source + local license = QBCore.Functions.GetIdentifier(src, 'license') + for k,v in pairs(QBCore.Config.Server.Permissions) do + if permission == v then + ExecuteCommand(('add_principal identifier.%s group.%s'):format(license, permission)) + QBCore.Commands.Refresh(src) + end end end -function QBCore.Functions.RemovePermission(source) - local license = QBCore.Functions.GetIdentifier(source, 'license') - for k,v in pairs(QBConfig.Server.Permissions) do - if IsPlayerAceAllowed(source, v) then - ExecuteCommand(('remove_principal identifier.%s group.%s'):format(license, v)) - QBCore.Commands.Refresh(source) +function QBCore.Functions.RemovePermission(source, permission) + local src = source + local license = QBCore.Functions.GetIdentifier(src, 'license') + if permission then + if IsPlayerAceAllowed(src, permission) then + ExecuteCommand(('remove_principal identifier.%s group.%s'):format(license, permission)) + QBCore.Commands.Refresh(src) + end + else + for k,v in pairs(QBCore.Config.Server.Permissions) do + if IsPlayerAceAllowed(src, v) then + ExecuteCommand(('remove_principal identifier.%s group.%s'):format(license, v)) + QBCore.Commands.Refresh(src) + end end end end @@ -288,14 +296,16 @@ end function QBCore.Functions.HasPermission(source, permission) local src = source - if IsPlayerAceAllowed(tostring(src), tostring(permission:lower())) then return true end + local group = ('group.%s'):format(permission) + if IsPlayerAceAllowed(tostring(src), group) then return true end return false end function QBCore.Functions.GetPermission(source) local src = source - for k,v in pairs (QBConfig.Server.Permissions) do - if IsPlayerAceAllowed(src, 'group.'..v) then + for k,v in pairs (QBCore.Config.Server.Permissions) do + local group = ('group.%s'):format(v) + if IsPlayerAceAllowed(src, group) then return v end end From f5e22066fb79eb86383f29313fcc46adbdfff5a5 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Tue, 29 Mar 2022 22:33:26 -0500 Subject: [PATCH 109/120] More changes --- server/commands.lua | 11 ++++------- server/functions.lua | 7 ++++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index c32d5fd..254468f 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -89,11 +89,7 @@ QBCore.Commands.Add('addpermission', 'Give Player Permissions (God Only)', { { n local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) local permission = tostring(args[2]):lower() if Player then - if QBCore.Config.Server.Permissions[permission] then - QBCore.Functions.AddPermission(Player.PlayerData.source, permission) - else - TriggerClientEvent('QBCore:Notify', source, 'Invalid permission level', 'error') - end + QBCore.Functions.AddPermission(Player.PlayerData.source, permission) else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end @@ -101,8 +97,9 @@ end, 'god') QBCore.Commands.Add('removepermission', 'Remove Players Permissions (God Only)', { { name = 'id', help = 'ID of player' } }, true, function(source, args) local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) + local permission = tostring(args[2]):lower() if Player then - QBCore.Functions.RemovePermission(Player.PlayerData.source) + QBCore.Functions.RemovePermission(Player.PlayerData.source, permission) else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end @@ -128,7 +125,7 @@ QBCore.Commands.Add('closeserver', 'Close the server for people without permissi return end if QBCore.Functions.HasPermission(source, 'admin') then - reason = args[1] or 'No reason specified' + local reason = args[1] or 'No reason specified' QBCore.Config.Server.Closed = true QBCore.Config.Server.ClosedReason = reason for k in pairs(QBCore.Players) do diff --git a/server/functions.lua b/server/functions.lua index b9e30db..cf21e7c 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -301,15 +301,16 @@ function QBCore.Functions.HasPermission(source, permission) return false end -function QBCore.Functions.GetPermission(source) +function QBCore.Functions.GetPermissions(source) local src = source + local perms = {} for k,v in pairs (QBCore.Config.Server.Permissions) do local group = ('group.%s'):format(v) if IsPlayerAceAllowed(src, group) then - return v + perms[v] = true end end - return 'user' + return perms end -- Opt in or out of admin reports From 46a2aae5ce673f90ab022b94265f5e03cd607502 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Wed, 30 Mar 2022 00:45:31 -0500 Subject: [PATCH 110/120] More changes --- config.lua | 2 +- server/commands.lua | 8 +++++++- server/functions.lua | 14 ++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/config.lua b/config.lua index 43de9d5..9681f22 100644 --- a/config.lua +++ b/config.lua @@ -30,7 +30,7 @@ QBConfig.Server.WhitelistPermission = 'admin' -- Permission that's able to enter 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.Permissions = {'god', 'admin', 'mod'} -- Add as many groups as you want here after creating them in your server.cfg +QBConfig.Server.Permissions = {'admin', 'mod'} -- Add as many groups as you want here after creating them in your server.cfg QBConfig.Notify = {} diff --git a/server/commands.lua b/server/commands.lua index 254468f..144eb2b 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -3,9 +3,15 @@ QBCore.Commands.List = {} QBCore.Commands.IgnoreList = { -- Ignore old perm levels while keeping backwards compatibility ['god'] = true, -- We don't need to create an ace because group.admin allows all commands ['admin'] = true, -- We don't need to create an ace because group.admin allows all commands - ['user'] = true, -- We don't need to create an ace because builtin.everyone + ['user'] = true -- We don't need to create an ace because builtin.everyone } +CreateThread(function() -- Add rank name to ace + for k,v in pairs(QBConfig.Server.Permissions) do + ExecuteCommand(('add_ace group.%s %s allow'):format(v, v)) + end +end) + -- Register & Refresh Commands function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, permission) diff --git a/server/functions.lua b/server/functions.lua index cf21e7c..7971c37 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -266,12 +266,8 @@ end function QBCore.Functions.AddPermission(source, permission) local src = source local license = QBCore.Functions.GetIdentifier(src, 'license') - for k,v in pairs(QBCore.Config.Server.Permissions) do - if permission == v then - ExecuteCommand(('add_principal identifier.%s group.%s'):format(license, permission)) - QBCore.Commands.Refresh(src) - end - end + ExecuteCommand(('add_principal identifier.%s group.%s'):format(license, permission)) + QBCore.Commands.Refresh(src) end function QBCore.Functions.RemovePermission(source, permission) @@ -296,8 +292,7 @@ end function QBCore.Functions.HasPermission(source, permission) local src = source - local group = ('group.%s'):format(permission) - if IsPlayerAceAllowed(tostring(src), group) then return true end + if IsPlayerAceAllowed(src, permission) then return true end return false end @@ -305,8 +300,7 @@ function QBCore.Functions.GetPermissions(source) local src = source local perms = {} for k,v in pairs (QBCore.Config.Server.Permissions) do - local group = ('group.%s'):format(v) - if IsPlayerAceAllowed(src, group) then + if IsPlayerAceAllowed(src, v) then perms[v] = true end end From dd6c6c4a09c7afacbb9810465186c350f00a6d57 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Wed, 30 Mar 2022 01:04:59 -0500 Subject: [PATCH 111/120] More changes --- config.lua | 2 +- server/commands.lua | 3 +-- server/functions.lua | 34 +++++++++++++--------------------- server/player.lua | 1 + 4 files changed, 16 insertions(+), 24 deletions(-) diff --git a/config.lua b/config.lua index 9681f22..43de9d5 100644 --- a/config.lua +++ b/config.lua @@ -30,7 +30,7 @@ QBConfig.Server.WhitelistPermission = 'admin' -- Permission that's able to enter 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.Permissions = {'admin', 'mod'} -- Add as many groups as you want here after creating them in your server.cfg +QBConfig.Server.Permissions = {'god', 'admin', 'mod'} -- Add as many groups as you want here after creating them in your server.cfg QBConfig.Notify = {} diff --git a/server/commands.lua b/server/commands.lua index 144eb2b..667e7cb 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -1,8 +1,7 @@ QBCore.Commands = {} QBCore.Commands.List = {} QBCore.Commands.IgnoreList = { -- Ignore old perm levels while keeping backwards compatibility - ['god'] = true, -- We don't need to create an ace because group.admin allows all commands - ['admin'] = true, -- We don't need to create an ace because group.admin allows all commands + ['god'] = true, -- We don't need to create an ace because group.god allows all commands ['user'] = true -- We don't need to create an ace because builtin.everyone } diff --git a/server/functions.lua b/server/functions.lua index 7971c37..2311b3d 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -309,28 +309,20 @@ 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.IsOptin(source) + local license = QBCore.Functions.GetIdentifier(source, 'license') + if not license or not QBCore.Functions.HasPermission(source, 'admin') then return false end + local Player = QBCore.Functions.GetPlayer(source) + return Player.PlayerData.optin +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 +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 + local Player = QBCore.Functions.GetPlayer(source) + Player.PlayerData.optin = not Player.PlayerData.optin + Player.Functions.SetMetaData('optin', Player.PlayerData.optin) +end -- Check if player is banned diff --git a/server/player.lua b/server/player.lua index b706e67..542cf15 100644 --- a/server/player.lua +++ b/server/player.lua @@ -44,6 +44,7 @@ function QBCore.Player.CheckPlayerData(source, PlayerData) PlayerData.name = GetPlayerName(source) PlayerData.cid = PlayerData.cid or 1 PlayerData.money = PlayerData.money or {} + PlayerData.optin = PlayerData.optin or true for moneytype, startamount in pairs(QBCore.Config.Money.MoneyTypes) do PlayerData.money[moneytype] = PlayerData.money[moneytype] or startamount end From eb34e652041658761f094a7763edf1e8b1b79346 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Wed, 30 Mar 2022 01:20:11 -0500 Subject: [PATCH 112/120] More changes --- server/commands.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/commands.lua b/server/commands.lua index 667e7cb..631e072 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -9,6 +9,7 @@ CreateThread(function() -- Add rank name to ace for k,v in pairs(QBConfig.Server.Permissions) do ExecuteCommand(('add_ace group.%s %s allow'):format(v, v)) end + ExecuteCommand('add_ace group.god command allow') end) -- Register & Refresh Commands @@ -100,7 +101,7 @@ QBCore.Commands.Add('addpermission', 'Give Player Permissions (God Only)', { { n end end, 'god') -QBCore.Commands.Add('removepermission', 'Remove Players Permissions (God Only)', { { name = 'id', help = 'ID of player' } }, true, function(source, args) +QBCore.Commands.Add('removepermission', 'Remove Players Permissions (God Only)', { { name = 'id', help = 'ID of player' }, { name = 'permission', help = 'Permission level' } }, true, function(source, args) local Player = QBCore.Functions.GetPlayer(tonumber(args[1])) local permission = tostring(args[2]):lower() if Player then From 2d6159345b39514683e980ab62296a9a9ccfe935 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Wed, 30 Mar 2022 01:31:36 -0500 Subject: [PATCH 113/120] Remove --- server/commands.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/server/commands.lua b/server/commands.lua index 631e072..7fadb88 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -9,7 +9,6 @@ CreateThread(function() -- Add rank name to ace for k,v in pairs(QBConfig.Server.Permissions) do ExecuteCommand(('add_ace group.%s %s allow'):format(v, v)) end - ExecuteCommand('add_ace group.god command allow') end) -- Register & Refresh Commands From b04eb3f43af5c06ff94d13543e096e055abdfe51 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Wed, 30 Mar 2022 17:05:07 -0500 Subject: [PATCH 114/120] Update to qbcore. --- server/commands.lua | 8 ++++---- server/functions.lua | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index 7fadb88..457277d 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -1,13 +1,13 @@ QBCore.Commands = {} QBCore.Commands.List = {} QBCore.Commands.IgnoreList = { -- Ignore old perm levels while keeping backwards compatibility - ['god'] = true, -- We don't need to create an ace because group.god allows all commands + ['god'] = true, -- We don't need to create an ace because god is allowed all commands ['user'] = true -- We don't need to create an ace because builtin.everyone } -CreateThread(function() -- Add rank name to ace +CreateThread(function() -- Add ace to node for perm checking for k,v in pairs(QBConfig.Server.Permissions) do - ExecuteCommand(('add_ace group.%s %s allow'):format(v, v)) + ExecuteCommand(('add_ace qbcore.%s %s allow'):format(v, v)) end end) @@ -19,7 +19,7 @@ function QBCore.Commands.Add(name, help, arguments, argsrequired, callback, perm if permission == 'user' then restricted = false end -- allow all users to use command RegisterCommand(name, callback, restricted) -- Register command within fivem if not QBCore.Commands.IgnoreList[permission] then -- only create aces for extra perm levels - ExecuteCommand(('add_ace group.%s command.%s allow'):format(permission, name)) + ExecuteCommand(('add_ace qbcore.%s command.%s allow'):format(permission, name)) end QBCore.Commands.List[name:lower()] = { name = name:lower(), diff --git a/server/functions.lua b/server/functions.lua index 2311b3d..8b0bce6 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -266,7 +266,7 @@ end function QBCore.Functions.AddPermission(source, permission) local src = source local license = QBCore.Functions.GetIdentifier(src, 'license') - ExecuteCommand(('add_principal identifier.%s group.%s'):format(license, permission)) + ExecuteCommand(('add_principal identifier.%s qbcore.%s'):format(license, permission)) QBCore.Commands.Refresh(src) end @@ -275,13 +275,13 @@ function QBCore.Functions.RemovePermission(source, permission) local license = QBCore.Functions.GetIdentifier(src, 'license') if permission then if IsPlayerAceAllowed(src, permission) then - ExecuteCommand(('remove_principal identifier.%s group.%s'):format(license, permission)) + ExecuteCommand(('remove_principal identifier.%s qbcore.%s'):format(license, permission)) QBCore.Commands.Refresh(src) end else for k,v in pairs(QBCore.Config.Server.Permissions) do if IsPlayerAceAllowed(src, v) then - ExecuteCommand(('remove_principal identifier.%s group.%s'):format(license, v)) + ExecuteCommand(('remove_principal identifier.%s qbcore.%s'):format(license, v)) QBCore.Commands.Refresh(src) end end From ccbc6b216dd905fdb5f10fdf7cb7bdde9938bd03 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Wed, 30 Mar 2022 17:25:20 -0500 Subject: [PATCH 115/120] Remove job check --- server/events.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/events.lua b/server/events.lua index 84bb425..c48160e 100644 --- a/server/events.lua +++ b/server/events.lua @@ -183,7 +183,7 @@ RegisterNetEvent('QBCore:CallCommand', function(command, args) local Player = QBCore.Functions.GetPlayer(src) if not Player then return end local hasPerm = QBCore.Functions.HasPermission(src, QBCore.Commands.List[command].permission) - if (QBCore.Commands.List[command].permission == Player.PlayerData.job.name) or hasPerm 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 From cddbd0184c60427e874ca7c7f69e8da314a3a6f6 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Wed, 30 Mar 2022 23:02:44 -0500 Subject: [PATCH 116/120] Accidental s --- server/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/functions.lua b/server/functions.lua index 4644acc..bae2f85 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -296,7 +296,7 @@ function QBCore.Functions.HasPermission(source, permission) return false end -function QBCore.Functions.GetPermissions(source) +function QBCore.Functions.GetPermission(source) local src = source local perms = {} for k,v in pairs (QBCore.Config.Server.Permissions) do From aab215334f0b82a2fa5b5901dcde53ddfdf57d8e Mon Sep 17 00:00:00 2001 From: Idris Date: Sat, 2 Apr 2022 18:51:47 +1100 Subject: [PATCH 117/120] feat: Added ChatEvent handler to server/events.lua --- server/events.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server/events.lua b/server/events.lua index c48160e..502ac1f 100644 --- a/server/events.lua +++ b/server/events.lua @@ -1,5 +1,16 @@ -- Event Handler +AddEventHandler('chatMessage', function(source, _, message) + local src = source + if string.sub(message, 1, 1) ~= '/' then return end + local args = QBCore.Shared.SplitStr(message, ' ') + local command = string.gsub(args[1]:lower(), '/', '') + CancelEvent() + if not QBCore.Commands.List[command] then return end + table.remove(args, 1) + QBCore.Commands.List[command].callback(src, args) +end) + AddEventHandler('playerDropped', function() local src = source if not QBCore.Players[src] then return end From 3f703a2950689ff63988b01a60a6a81a35d37128 Mon Sep 17 00:00:00 2001 From: Kakarot Date: Sat, 2 Apr 2022 16:01:06 -0500 Subject: [PATCH 118/120] Event to export --- server/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/functions.lua b/server/functions.lua index bae2f85..95b302d 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -178,7 +178,7 @@ function PaycheckInterval() TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('error.company_too_poor'), 'error') else Player.Functions.AddMoney('bank', payment) - TriggerEvent('qb-management:server:removeAccountMoney', Player.PlayerData.job.name, payment) + exports['qb-management']:RemoveMoney(Player.PlayerData.job.name, payment) TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, Lang:t('info.received_paycheck', {value = payment})) end else From d2c51ae93d3fb2d2f7a96e734df39afed0b1452a Mon Sep 17 00:00:00 2001 From: Idris Dev Date: Sun, 3 Apr 2022 14:08:09 +1000 Subject: [PATCH 119/120] fix: Fixed maintenance not being tagged for review --- .github/auto_assign.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index a4a8078..65be3a5 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -6,7 +6,7 @@ addAssignees: author # A list of reviewers to be added to pull requests (GitHub user name) reviewers: - - /maintenance + - qbcore-framework/maintenance # A list of keywords to be skipped the process that add reviewers if pull requests include it skipKeywords: From 429966cdd7cf44d5a5fa7b279d1f74cc1f1c2d90 Mon Sep 17 00:00:00 2001 From: Idris Date: Tue, 5 Apr 2022 13:57:16 +1000 Subject: [PATCH 120/120] chore: removed bloated chatMessage code. --- server/events.lua | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/server/events.lua b/server/events.lua index 502ac1f..745a4fa 100644 --- a/server/events.lua +++ b/server/events.lua @@ -1,14 +1,10 @@ -- Event Handler AddEventHandler('chatMessage', function(source, _, message) - local src = source - if string.sub(message, 1, 1) ~= '/' then return end - local args = QBCore.Shared.SplitStr(message, ' ') - local command = string.gsub(args[1]:lower(), '/', '') - CancelEvent() - if not QBCore.Commands.List[command] then return end - table.remove(args, 1) - QBCore.Commands.List[command].callback(src, args) + if string.sub(message, 1, 1) == '/' then + CancelEvent() + return + end end) AddEventHandler('playerDropped', function()