diff --git a/client/events.lua b/client/events.lua index b4f91d0..60fae33 100644 --- a/client/events.lua +++ b/client/events.lua @@ -117,19 +117,6 @@ RegisterNetEvent('QBCore:Command:GoToMarker', function() end) -- Vehicle Commands -RegisterNetEvent('QBCore:Client:VehicleInfo', function(info) - local plate = QBCore.Functions.GetPlate(info.vehicle) - local data = { - vehicle = NetToVeh(info.netid), - seat = info.seat, - name = info.modelName, - plate = plate, - driver = GetPedInVehicleSeat(info.vehicle, -1), - inseat = GetPedInVehicleSeat(info.vehicle, info.seat), - haskeys = exports['qb-vehiclekeys']:HasKeys(plate) - } - TriggerEvent('QBCore:Client:'..info.event..'Vehicle', data) -end) RegisterNetEvent('QBCore:Command:SpawnVehicle', function(vehName) local ped = PlayerPedId() @@ -171,6 +158,27 @@ RegisterNetEvent('QBCore:Command:DeleteVehicle', function() end end) +RegisterNetEvent('QBCore:Client:VehicleInfo', function(info) + local plate = QBCore.Functions.GetPlate(info.vehicle) + local hasKeys = true + + if GetResourceState('qb-vehiclekeys') == 'started' then + hasKeys = exports['qb-vehiclekeys']:HasKeys() + end + + local data = { + vehicle = info.vehicle, + seat = info.seat, + name = info.modelName, + plate = plate, + driver = GetPedInVehicleSeat(info.vehicle, -1), + inseat = GetPedInVehicleSeat(info.vehicle, info.seat), + haskeys = hasKeys + } + + TriggerEvent('QBCore:Client:'..info.event..'Vehicle', data) +end) + -- Other stuff RegisterNetEvent('QBCore:Player:SetPlayerData', function(val) diff --git a/fxmanifest.lua b/fxmanifest.lua index 1b2f859..55e59bf 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.2.2' shared_scripts { 'config.lua', diff --git a/locale/pt.lua b/locale/pt.lua index 8cbfebf..b181e52 100644 --- a/locale/pt.lua +++ b/locale/pt.lua @@ -7,18 +7,118 @@ local Translations = { no_access = 'Não tens acesso a este comando', company_too_poor = 'A tua empresa está falida', item_not_exist = 'O item não existe', - too_heavy = 'Inventário cheio' + too_heavy = 'Inventário cheio', + location_not_exist = 'Localização não existe', + duplicate_license = 'Licença Rockstar duplicada', + no_valid_license = 'Licença Rockstar não encontrada', + not_whitelisted = 'Não estás na whitelist deste servidor', + server_already_open = 'O Servidor já se encontra aberto', + server_already_closed = 'O Servidor já se encontra fechado', + no_permission = 'Não tem permissões para isto', + no_waypoint = 'Não colocou nenhum waypoint', + tp_error = 'Erro ao teleportar', + connecting_database_error = 'Um erro na base de dados ocorreu enquanto se conecatava ao servidor. (SQL Server Ligado?)', + connecting_database_timeout = 'Falhou a ligação à base de dados. (SQL server Ligado?)', + }, + success = { + server_opened = 'O Servidor abriu', + server_closed = 'O Servidor fechou', + teleported_waypoint = 'Teleportado para o waypoint.', }, - success = {}, info = { received_paycheck = 'Recebeste o pagamento de %{value}€', job_info = 'Emprego: %{value} | Grau: %{value2} | Serviço: %{value3}', gang_info = 'Gang: %{value} | Grau: %{value2}', on_duty = 'Agora estás de serviço!', - off_duty = 'Agora estás fora de serviço!' - } + off_duty = 'Agora estás fora de serviço!', + checking_ban = 'Olá %s. Estamos a verificar se estás banido.', + join_server = 'Bem vindo %s ao {Server Name}.', + checking_whitelisted = 'Bem vindo %s. Estamos a verificiar se estás na whitelist.', + exploit_banned = 'Foste banidos por cheats. Para mais informações visita o nosso discord: %{discord}', + exploit_dropped = 'Foste kickado por cheats!', + }, + command = { + tp = { + help = 'TP para jogador ou coordenadas (Apenas Admin)', + params = { + x = { name = 'id/x', help = 'ID do jogador ou posição X'}, + y = { name = 'y', help = 'Posição Y'}, + z = { name = 'z', help = 'Posição Z'}, + }, + }, + tpm = { help = 'TP para Marcador (Apenas Admin)' }, + togglepvp = { help = 'Ligar /Desligar PVP no servidor (Apenas Admin)' }, + addpermission = { + help = 'Dar Permissões a jogador (Apenas God)', + params = { + id = { name = 'id', help = 'ID do jogador' }, + permission = { name = 'permission', help = 'Nivel de permissão' }, + }, + }, + removepermission = { + help = 'Remover permissão de jogador (Apenas God)', + params = { + id = { name = 'id', help = 'ID do jogador' }, + permission = { name = 'permission', help = 'Nivel de permissão' }, + }, + }, + openserver = { help = 'Abrir o Servidor para todos (Apenas Admin)' }, + closeserver = { + help = 'Fechar o servidor para todos excepto Admins (Apenas Admin)', + params = { + reason = { name = 'reason', help = 'Razão para fechar(opcional)' }, + }, + }, + car = { + help = 'Spawnar Veículo (Apenas Admin)', + params = { + model = { name = 'model', help = 'Modelo do veículo' }, + }, + }, + dv = { help = 'Apagar Veículo (Apenas Admin)' }, + givemoney = { + help = 'Dar dinheiro a jogador (Apenas Admin)', + params = { + id = { name = 'id', help = 'ID do jogador' }, + moneytype = { name = 'moneytype', help = 'Tipo (cash, bank, crypto)' }, + amount = { name = 'amount', help = 'Quantidade de dinheiro' }, + }, + }, + setmoney = { + help = 'Definir a quantia de dinheiro do jogador (Apenas Admin)', + params = { + id = { name = 'id', help = 'ID do jogador' }, + moneytype = { name = 'moneytype', help = 'Tipo(cash, bank, crypto)' }, + amount = { name = 'amount', help = 'Quantidade de dinheiro' }, + }, + }, + job = { help = 'Ver o teu trabalho' }, + setjob = { + help = 'Definir o trabalho de 1 jogador (Apenas Admin)', + params = { + id = { name = 'id', help = 'ID do jogador' }, + job = { name = 'job', help = 'Nome do trabalho' }, + grade = { name = 'grade', help = 'Nivel do trabalho' }, + }, + }, + gang = { help = 'Ver o teu Gang' }, + setgang = { + help = 'Definir o Gang de um jogador (Apenas Admin)', + params = { + id = { name = 'id', help = 'ID do jogador' }, + gang = { name = 'gang', help = 'Nome do Gang' }, + grade = { name = 'grade', help = 'Nível/ Posição no Gang' }, + }, + }, + ooc = { help = 'Mensagem Chat em OOC' }, + me = { + help = 'Mostrar Mensagem local', + params = { + message = { name = 'message', help = 'Menssagem a enviar' } + }, + }, + }, } - if GetConvar('qb_locale', 'en') == 'pt' then Lang = Locale:new({ phrases = Translations, diff --git a/server/events.lua b/server/events.lua index 6bd9e22..2722bdd 100644 --- a/server/events.lua +++ b/server/events.lua @@ -168,19 +168,6 @@ RegisterNetEvent('QBCore:UpdatePlayer', function() Player.Functions.Save() end) -RegisterNetEvent('QBCore:Server:SetMetaData', function(meta, data) - local src = source - local Player = QBCore.Functions.GetPlayer(src) - if not Player then return end - if meta == 'hunger' or meta == 'thirst' then - if data > 100 then - data = 100 - end - end - Player.Functions.SetMetaData(meta, data) - TriggerClientEvent('hud:client:UpdateNeeds', src, Player.PlayerData.metadata['hunger'], Player.PlayerData.metadata['thirst']) -end) - RegisterNetEvent('QBCore:ToggleDuty', function() local src = source local Player = QBCore.Functions.GetPlayer(src) @@ -198,25 +185,23 @@ end) -- BaseEvents -- Vehicles -RegisterServerEvent('baseevents:enteringVehicle', function(veh,seat,modelName,netid) +RegisterServerEvent('baseevents:enteringVehicle', function(veh,seat,modelName) local src = source local data = { vehicle = veh, seat = seat, name = modelName, - netid = netid, event = 'Entering' } TriggerClientEvent('QBCore:Client:VehicleInfo', src, data) end) -RegisterServerEvent('baseevents:enteredVehicle', function(veh,seat,modelName,netid) +RegisterServerEvent('baseevents:enteredVehicle', function(veh,seat,modelName) local src = source local data = { vehicle = veh, seat = seat, name = modelName, - netid = netid, event = 'Entered' } TriggerClientEvent('QBCore:Client:VehicleInfo', src, data) @@ -227,13 +212,12 @@ RegisterServerEvent('baseevents:enteringAborted', function() TriggerClientEvent('QBCore:Client:AbortVehicleEntering', src) end) -RegisterServerEvent('baseevents:leftVehicle', function(veh,seat,modelName,netid) +RegisterServerEvent('baseevents:leftVehicle', function(veh,seat,modelName) local src = source local data = { vehicle = veh, seat = seat, name = modelName, - netid = netid, event = 'Left' } TriggerClientEvent('QBCore:Client:VehicleInfo', src, data) diff --git a/server/functions.lua b/server/functions.lua index c472b68..54218f0 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -414,3 +414,16 @@ end function QBCore.Functions.Notify(source, text, type, length) TriggerClientEvent('QBCore:Notify', source, text, type, length) end + +--- SQL Pattern Matching +function QBCore.Functions.PrepForSQL(source,data,pattern) + data = tostring(data) + local src = source + local player = QBCore.Functions.GetPlayer(src) + local result = string.match(data, pattern) + if not result or string.len(result) ~= string.len(data) then + TriggerEvent('qb-log:server:CreateLog', 'anticheat', 'SQL Exploit Attempted', 'red', string.format('%s attempted to exploit SQL!', player.PlayerData.license)) + return false + end + return true +end \ No newline at end of file diff --git a/shared/jobs.lua b/shared/jobs.lua index 9f6615d..67c813d 100644 --- a/shared/jobs.lua +++ b/shared/jobs.lua @@ -1,5 +1,8 @@ QBShared = QBShared or {} QBShared.ForceJobDefaultDutyAtLogin = true -- true: Force duty state to jobdefaultDuty | false: set duty state from database last saved +QBShared.QBJobsStatus = false -- true: integrate qb-jobs into the whole of qb-core | false: treat qb-jobs as an add-on resource. +QBShared.Jobs = {} -- All of below has been migrated into qb-jobs +if QBShared.QBJobsStatus then return end QBShared.Jobs = { ['unemployed'] = { label = 'Civilian', @@ -125,7 +128,7 @@ QBShared.Jobs = { }, }, }, - ['bus'] = { + ['bus'] = { label = 'Bus', defaultDuty = true, offDutyPay = false, diff --git a/shared/locale.lua b/shared/locale.lua index ce7b2f5..34fa835 100644 --- a/shared/locale.lua +++ b/shared/locale.lua @@ -30,10 +30,10 @@ end --- Constructor function for a new Locale class instance --- @param opts table - Constructor opts param --- @return Locale -function Locale:new(opts) - setmetatable(self, Locale) +function Locale.new(_, opts) + local self = setmetatable({}, Locale) - self.fallback = opts.fallbackLang and Locale.new({}, { + self.fallback = opts.fallbackLang and Locale:new({ warnOnMissing = false, phrases = opts.fallbackLang.phrases, }) or false @@ -142,4 +142,4 @@ function Locale:delete(phraseTarget, prefix) end end end -end +end \ No newline at end of file diff --git a/shared/locations.lua b/shared/locations.lua index 7c97fed..1317991 100644 --- a/shared/locations.lua +++ b/shared/locations.lua @@ -10,33 +10,25 @@ QBShared.Locations = { ['pizzaria'] = vector4(790.4561, -758.4601, 26.7424, 270.2329), ['catcafe'] = vector4(-580.8388, -1072.7872, 22.3296, 359.0078), ['carmeet'] = vector4(958.8237, -1699.6659, 29.5574, 71.2731), - ['davispd'] = vector4(382.5791, -1591.1827, 29.2828, 145.0991), ['popsdiner'] = vector4(1595.9753, 6448.6421, 25.3170, 28.3026), - ['davisfirestation'] = vector4(216.7576, -1638.3801, 29.5151, 137.8174), ['harmony'] = vector4(1183.0693, 2648.5313, 37.8363, 194.0603), ['haters'] = vector4(-1117.1525, -1439.4297, 5.1075, 103.4411), ['hayes'] = vector4(-1435.7040, -445.7360, 35.5964, 220.1762), ['pdm'] = vector4(-48.2113, -1105.4769, 27.2634, 339.5899), ['bennys'] = vector4(-47.5289, -1042.6086, 28.3532, 247.9748), - ['impound'] = vector4(-190.5874, -1156.1343, 23.0482, 158.9385), ['lamesaauto'] = vector4(720.4776, -1092.1934, 22.2866, 310.1469), - ['lamesapd'] = vector4(824.3735, -1290.0670, 28.2364, 266.1293), ['lostmc'] = vector4(982.6339, -104.7095, 74.8488, 30.8738), ['pillbox'] = vector4(298.1153, -584.2825, 43.2609, 252.7553), - ['mrpd'] = vector4(432.0686, -981.6853, 30.7119, 267.3501), ['mirrorparkhouse1'] = vector4(945.9535, -652.9119, 58.0228, 90.5541), ['pacificbank'] = vector4(229.9529, 214.3890, 105.5561, 294.6791), ['paletoliquor'] = vector4(-154.2287, 6328.8682, 31.5665, 133.1992), - ['paletopd'] = vector4(-436.0935, 6015.2026, 31.4892, 132.9752), ['paletogasstation'] = vector4(120.2420, 6625.4722, 31.9580, 36.5687), ['pinkcage'] = vector4(323.9055, -203.2524, 54.0866, 186.8505), ['ponsonbys1'] = vector4(-165.2497, -304.3988, 38.07126, 0.0), ['ponsonbys2'] = vector4(-1448.1, -236.8420, 48.15098, 0.0), ['ponsonbys3'] = vector4(-709.8120, -150.6267, 35.75312, 0.0), - ['prison'] = vector4(1847.1284, 2586.0696, 45.6726, 91.7828), ['rangerstation'] = vector4(387.3204, 790.1508, 187.6927, 4.7656), ['recordastudio'] = vector4(473.3006, -109.4360, 62.7418, 350.8488), - ['sandypd'] = vector4(1839.7510, 3667.9907, 33.8787, 29.1744), ['suburban1'] = vector4(124.9756, -217.6290, 55.81879, 0.0), ['suburban2'] = vector4(617.4776, 2757.4810, 43.34935, 0.0), ['suburban3'] = vector4(-1195.8690, -773.5746, 18.58485, 0.0), @@ -51,8 +43,5 @@ QBShared.Locations = { -- Unclejust ['digitalden'] = vector4(-656.28, -849.92, 24.51, 167.42), ['ifruitstore1'] = vector4(-646.78, -288.17, 35.49, 297.73), - ['ifruitstore2'] = vector4(-778.7451, -598.2717, 30.2772, 181.0197), - ['taxijob'] = vector4(908.7, -166.45, 74.13, 54.88), - ['vineyard'] = vector4(-1892.29, 2038.47, 140.86, 339.23), - ['weazelnews'] = vector4(-604.82, -933.22, 23.86, 292.3), + ['ifruitstore2'] = vector4(-778.7451, -598.2717, 30.2772, 181.0197) } \ No newline at end of file diff --git a/shared/vehicles.lua b/shared/vehicles.lua index 32f9dbf..476cac4 100644 --- a/shared/vehicles.lua +++ b/shared/vehicles.lua @@ -1,17 +1,16 @@ QBShared = QBShared or {} -QBShared.VehicleHashes = {} QBShared.Vehicles = { --- Compacts - ['asbo'] = { - ['name'] = 'Asbo', - ['brand'] = 'Maxwell', - ['model'] = 'asbo', - ['price'] = 4000, - ['category'] = 'compacts', - ['categoryLabel'] = 'Compacts', - ['hash'] = `asbo`, - ['shop'] = {'pdm'}, + ['asbo'] = { -- This has to match the spawn code of the vehicle + ['name'] = 'Asbo', -- This is the display of the vehicle + ['brand'] = 'Maxwell', -- This is the vehicle's brand (Ford, Chevrolet, BMW, Mercedes, etc) + ['model'] = 'asbo', -- This must match the spawn code of the vehicle + ['price'] = 4000, -- The price that the vehicle sells for + ['category'] = 'compacts', -- This must match "VehicleClass" in vehicles.meta for the vehicle and must also exist in https://docs.fivem.net/natives/?_0x29439776AAA00A62 + ['categoryLabel'] = 'Compacts', -- Customize for your Vehicle Shop headings (can even include spaces) + ['hash'] = `asbo`, -- This has to match the spawn code of the vehicle and must be surrounded by backticks. Example of a Backtick: ` + ['shop'] = 'pdm', -- Can be a single shop or multiple shops. For multiple shops for example {'shopname1','shopname2','shopname3'} }, ['blista'] = { ['name'] = 'Blista', @@ -104,7 +103,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['issi5'] = { --DLC - ['name'] = 'Issi Arena', + ['name'] = 'Issi Future Shock', ['brand'] = 'Weeny', ['model'] = 'issi5', ['price'] = 80000, @@ -114,7 +113,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['issi6'] = { --DLC - ['name'] = 'Issi Arena', + ['name'] = 'Issi Nightmare', ['brand'] = 'Weeny', ['model'] = 'issi6', ['price'] = 80000, @@ -236,7 +235,7 @@ QBShared.Vehicles = { }, ['oracle'] = { ['name'] = 'Oracle', - ['brand'] = 'Ubermacht', + ['brand'] = 'Übermacht', ['model'] = 'oracle', ['price'] = 22000, ['category'] = 'sedans', @@ -346,11 +345,11 @@ QBShared.Vehicles = { }, ['zeno'] = { --DLC +set sv_enforceGameBuild 2545 ['name'] = 'Zeno', - ['brand'] = 'Overflod', + ['brand'] = 'Överflöd', ['model'] = 'zeno', ['price'] = 1350000, - ['category'] = 'coupes', - ['categoryLabel'] = 'Coupes', + ['category'] = 'super', + ['categoryLabel'] = 'Super', ['hash'] = `zeno`, ['shop'] = 'pdm', }, @@ -396,7 +395,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['tribike'] = { - ['name'] = 'Tri Bike', + ['name'] = 'Whippet Race Bike', ['brand'] = 'Bike', ['model'] = 'tribike', ['price'] = 500, @@ -406,7 +405,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['tribike2'] = { - ['name'] = 'Tri Bike 2', + ['name'] = 'Endurex Race Bike', ['brand'] = 'Bike', ['model'] = 'tribike2', ['price'] = 700, @@ -416,7 +415,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['tribike3'] = { - ['name'] = 'Tri Bike 3', + ['name'] = 'Tri-Cycles Race Bike', ['brand'] = 'Bike', ['model'] = 'tribike3', ['price'] = 520, @@ -547,8 +546,8 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['deathbike'] = { --DLC - ['name'] = 'deathbike', - ['brand'] = 'deathbike', + ['name'] = 'Deathbike Apocalypse', + ['brand'] = 'Deathbike', ['model'] = 'deathbike', ['price'] = 30000, ['category'] = 'motorcycles', @@ -557,8 +556,8 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['deathbike2'] = { --DLC - ['name'] = 'deathbike2', - ['brand'] = 'deathbike', + ['name'] = 'Deathbike Future Shock', + ['brand'] = 'Deathbike', ['model'] = 'deathbike2', ['price'] = 30000, ['category'] = 'motorcycles', @@ -567,8 +566,8 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['deathbike3'] = { --DLC - ['name'] = 'deathbike3', - ['brand'] = 'deathbike', + ['name'] = 'Deathbike Nightmare', + ['brand'] = 'Deathbike', ['model'] = 'deathbike3', ['price'] = 30000, ['category'] = 'motorcycles', @@ -837,7 +836,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['shotaro'] = { - ['name'] = 'Shotaro Concept', + ['name'] = 'Shotaro', ['brand'] = 'Nagasaki', ['model'] = 'shotaro', ['price'] = 320000, @@ -937,7 +936,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['manchez2'] = { - ['name'] = 'Manchez', + ['name'] = 'Manchez Scout', ['brand'] = 'Maibatsu', ['model'] = 'manchez2', ['price'] = 14000, @@ -1118,7 +1117,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['dukes2'] = { - ['name'] = 'Dukes Nightrider', + ['name'] = 'Duke O\'Death', ['brand'] = 'Imponte', ['model'] = 'dukes2', ['price'] = 60000, @@ -1258,7 +1257,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['impaler'] = { --DLC - ['name'] = 'impaler', + ['name'] = 'Impaler', ['brand'] = 'Vapid', ['model'] = 'impaler', ['price'] = 95000, @@ -1268,7 +1267,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['impaler2'] = { --DLC - ['name'] = 'impaler2', + ['name'] = 'Impaler Arena', ['brand'] = 'Vapid', ['model'] = 'impaler2', ['price'] = 95000, @@ -1278,7 +1277,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['impaler3'] = { --DLC - ['name'] = 'impaler3', + ['name'] = 'Impaler Future Shock', ['brand'] = 'Vapid', ['model'] = 'impaler3', ['price'] = 95000, @@ -1288,7 +1287,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['impaler4'] = { --DLC - ['name'] = 'impaler4', + ['name'] = 'Impaler Nightmare', ['brand'] = 'Vapid', ['model'] = 'impaler4', ['price'] = 95000, @@ -1298,7 +1297,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['imperator'] = { --DLC - ['name'] = 'imperator', + ['name'] = 'Imperator Arena', ['brand'] = 'Vapid', ['model'] = 'imperator', ['price'] = 95000, @@ -1308,7 +1307,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['imperator2'] = { --DLC - ['name'] = 'imperator2', + ['name'] = 'imperator Future Shock', ['brand'] = 'Vapid', ['model'] = 'imperator2', ['price'] = 95000, @@ -1318,7 +1317,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['imperator3'] = { --DLC - ['name'] = 'imperator3', + ['name'] = 'Imperator Nightmare', ['brand'] = 'Vapid', ['model'] = 'imperator3', ['price'] = 95000, @@ -1328,7 +1327,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['lurcher'] = { - ['name'] = 'Gauntlet Classic Custom', + ['name'] = 'Lurcher', ['brand'] = 'Bravado', ['model'] = 'lurcher', ['price'] = 21000, @@ -1398,7 +1397,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['ratloader2'] = { - ['name'] = 'ratloader2', + ['name'] = 'Ratloader', ['brand'] = 'Ratloader2', ['model'] = 'ratloader2', ['price'] = 20000, @@ -1428,7 +1427,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['sabregt'] = { - ['name'] = 'Sabre Turbo', + ['name'] = 'Sabre GT Turbo', ['brand'] = 'Declasse', ['model'] = 'sabregt', ['price'] = 23000, @@ -1438,7 +1437,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['sabregt2'] = { - ['name'] = 'Sabre GT', + ['name'] = 'Sabre GT Turbo Custom', ['brand'] = 'Declasse', ['model'] = 'sabregt2', ['price'] = 26500, @@ -1558,7 +1557,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['virgo3'] = { - ['name'] = 'Virgo Custom Classic', + ['name'] = 'Virgo Classic', ['brand'] = 'Dundreary', ['model'] = 'virgo3', ['price'] = 21000, @@ -1820,7 +1819,7 @@ QBShared.Vehicles = { }, ['rebel2'] = { ['name'] = 'Rebel', - ['brand'] = 'Annis', + ['brand'] = 'Vapid', ['model'] = 'rebel2', ['price'] = 20000, ['category'] = 'offroad', @@ -1839,8 +1838,8 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['sandking'] = { - ['name'] = 'Sandking', - ['brand'] = 'Annis', + ['name'] = 'Sandking XL', + ['brand'] = 'Vapid', ['price'] = 25000, ['category'] = 'offroad', ['categoryLabel'] = 'Off Road', @@ -1850,7 +1849,7 @@ QBShared.Vehicles = { }, ['sandking2'] = { ['name'] = 'Sandking SWB', - ['brand'] = 'Annis', + ['brand'] = 'Vapid', ['price'] = 38000, ['category'] = 'offroad', ['categoryLabel'] = 'Off Road', @@ -1860,7 +1859,7 @@ QBShared.Vehicles = { }, ['trophytruck'] = { ['name'] = 'Trophy Truck', - ['brand'] = 'Annis', + ['brand'] = 'Vapid', ['price'] = 60000, ['category'] = 'offroad', ['categoryLabel'] = 'Off Road', @@ -1869,8 +1868,8 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['trophytruck2'] = { - ['name'] = 'Trophy Truck Limited', - ['brand'] = 'Annis', + ['name'] = 'Desert Raid', + ['brand'] = 'Vapid', ['price'] = 80000, ['category'] = 'offroad', ['categoryLabel'] = 'Off Road', @@ -1920,7 +1919,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['baller2'] = { - ['name'] = 'Baller', + ['name'] = 'Baller II', ['brand'] = 'Gallivanter', ['model'] = 'baller2', ['price'] = 15000, @@ -1990,7 +1989,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['cavalcade2'] = { - ['name'] = 'Cavalcade', + ['name'] = 'Cavalcade II', ['brand'] = 'Albany', ['model'] = 'cavalcade2', ['price'] = 16500, @@ -2020,7 +2019,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['dubsta2'] = { - ['name'] = 'Dubsta Luxuary', + ['name'] = 'Dubsta Luxury', ['brand'] = 'Benefactor', ['model'] = 'dubsta2', ['price'] = 19500, @@ -2129,6 +2128,16 @@ QBShared.Vehicles = { ['hash'] = `patriot`, ['shop'] = 'pdm', }, + ['patriot2'] = { + ['name'] = 'Patriot Stretch', + ['brand'] = 'Mammoth', + ['model'] = 'patriot2', + ['price'] = 21000, + ['category'] = 'suvs', + ['categoryLabel'] = 'SUVs', + ['hash'] = `patriot2`, + ['shop'] = 'pdm', + }, ['radi'] = { ['name'] = 'Radius', ['brand'] = 'Vapid', @@ -2291,7 +2300,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['glendale2'] = { - ['name'] = 'Glendale', + ['name'] = 'Glendale Custom', ['brand'] = 'Benefactor', ['model'] = 'glendale2', ['price'] = 12000, @@ -2481,8 +2490,8 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['astron'] = { --DLC +set sv_enforceGameBuild 2545 - ['name'] = 'Pfister', - ['brand'] = 'Astron', + ['name'] = 'Astron', + ['brand'] = 'Pfister', ['model'] = 'astron', ['price'] = 150000, ['category'] = 'sedans', @@ -2531,12 +2540,12 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['patriot3'] = { --DLC +set sv_enforceGameBuild 2545 - ['name'] = 'Patriot', + ['name'] = 'Patriot Military', ['brand'] = 'Mil-Spec', ['model'] = 'patriot3', ['price'] = 270000, - ['category'] = 'sedans', - ['categoryLabel'] = 'Sedans', + ['category'] = 'suvs', + ['categoryLabel'] = 'SUVs', ['hash'] = `patriot3`, ['shop'] = 'pdm', }, @@ -2793,7 +2802,7 @@ QBShared.Vehicles = { }, ['imorgon'] = { ['name'] = 'Imorgon', - ['brand'] = 'Overflod', + ['brand'] = 'Överflöd', ['model'] = 'imorgon', ['price'] = 120000, ['category'] = 'sports', @@ -3053,7 +3062,7 @@ QBShared.Vehicles = { }, ['revolter'] = { ['name'] = 'Revolter', - ['brand'] = 'Ubermacht', + ['brand'] = 'Übermacht', ['model'] = 'revolter', ['price'] = 95000, ['category'] = 'sports', @@ -3332,7 +3341,7 @@ QBShared.Vehicles = { ['shop'] = 'luxury', }, ['vectre'] = { --DLC +set sv_enforceGameBuild 2372 - ['name'] = 'Emperor Vectre', + ['name'] = 'Vectre', ['brand'] = 'Emperor', ['model'] = 'vectre', ['price'] = 80000, @@ -3343,7 +3352,7 @@ QBShared.Vehicles = { }, ['cypher'] = { --DLC +set sv_enforceGameBuild 2372 ['name'] = 'Cypher', - ['brand'] = 'Ubermacht', + ['brand'] = 'Übermacht', ['model'] = 'cypher', ['price'] = 155000, ['category'] = 'sports', @@ -3603,7 +3612,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['rapidgt3'] = { - ['name'] = 'Rapid GT', + ['name'] = 'Rapid GT Classic', ['brand'] = 'Dewbauchee', ['model'] = 'rapidgt3', ['price'] = 90000, @@ -3703,7 +3712,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['tornado2'] = { - ['name'] = 'Tornado Gang', + ['name'] = 'Tornado Convertible', ['brand'] = 'Declasse', ['model'] = 'tornado2', ['price'] = 22000, @@ -3934,7 +3943,7 @@ QBShared.Vehicles = { ['shop'] = 'luxury', }, ['italigtb2'] = { - ['name'] = 'Itali GTB', + ['name'] = 'Itali GTB Custom', ['brand'] = 'Progen', ['model'] = 'italigtb2', ['price'] = 250000, @@ -4405,7 +4414,7 @@ QBShared.Vehicles = { ['shop'] = 'pdm', }, ['youga4'] = { --DLC +set sv_enforceGameBuild 2545 - ['name'] = 'Youga', + ['name'] = 'Youga Custom', ['brand'] = 'Bravado', ['model'] = 'youga4', ['price'] = 85000, @@ -4477,7 +4486,7 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['seashark2'] = { - ['name'] = 'Seashark', + ['name'] = 'Seashark Lifeguard', ['brand'] = 'Speedophile', ['model'] = 'seashark2', ['price'] = 40000, @@ -4487,7 +4496,7 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['seashark3'] = { - ['name'] = 'Seashark', + ['name'] = 'Seashark Yacht', ['brand'] = 'Speedophile', ['model'] = 'seashark3', ['price'] = 40000, @@ -4497,8 +4506,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['jetmax'] = { - ['name'] = 'Shitzu', - ['brand'] = 'Jetmax', + ['name'] = 'Jetmax', + ['brand'] = 'Shitzu', ['model'] = 'jetmax', ['price'] = 40000, ['category'] = 'boats', @@ -4507,8 +4516,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['tropic'] = { - ['name'] = 'Shitzu', - ['brand'] = 'Tropic', + ['name'] = 'Tropic', + ['brand'] = 'Shitzu', ['model'] = 'tropic', ['price'] = 40000, ['category'] = 'boats', @@ -4517,8 +4526,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['tropic2'] = { - ['name'] = 'Shitzu', - ['brand'] = 'Tropic', + ['name'] = 'Tropic Yacht', + ['brand'] = 'Shitzu', ['model'] = 'tropic2', ['price'] = 40000, ['category'] = 'boats', @@ -4527,8 +4536,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['dinghy'] = { - ['name'] = 'Nagasaki', - ['brand'] = 'Dinghy', + ['name'] = 'Dinghy 2-Seater', + ['brand'] = 'Nagasaki', ['model'] = 'dinghy', ['price'] = 40000, ['category'] = 'boats', @@ -4537,8 +4546,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['dinghy2'] = { - ['name'] = 'Nagasaki', - ['brand'] = 'Dinghy', + ['name'] = 'Dinghy 4-Seater', + ['brand'] = 'Nagasaki', ['model'] = 'dinghy2', ['price'] = 40000, ['category'] = 'boats', @@ -4547,8 +4556,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['dinghy3'] = { - ['name'] = 'Nagasaki', - ['brand'] = 'Dinghy', + ['name'] = 'Dinghy (Heist)', + ['brand'] = 'Nagasaki', ['model'] = 'dinghy3', ['price'] = 40000, ['category'] = 'boats', @@ -4557,8 +4566,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['dinghy4'] = { - ['name'] = 'Nagasaki', - ['brand'] = 'Dinghy', + ['name'] = 'Dinghy Yacht', + ['brand'] = 'Nagasaki', ['model'] = 'dinghy4', ['price'] = 40000, ['category'] = 'boats', @@ -4567,8 +4576,8 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['suntrap'] = { - ['name'] = 'Shitzu', - ['brand'] = 'Suntrap', + ['name'] = 'Suntrap', + ['brand'] = 'Shitzu', ['model'] = 'suntrap', ['price'] = 40000, ['category'] = 'boats', @@ -4587,7 +4596,7 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['speeder2'] = { - ['name'] = 'Speeder', + ['name'] = 'Speeder Yacht', ['brand'] = 'Pegassi', ['model'] = 'speeder2', ['price'] = 40000, @@ -4617,7 +4626,7 @@ QBShared.Vehicles = { ['shop'] = 'boats', }, ['toro2'] = { - ['name'] = 'Toro', + ['name'] = 'Toro Yacht', ['brand'] = 'Lampadati', ['model'] = 'toro2', ['price'] = 40000, @@ -4648,7 +4657,7 @@ QBShared.Vehicles = { ['shop'] = 'air', }, ['frogger2'] = { - ['name'] = 'Frogger', + ['name'] = 'Frogger (Trevor Philips Enterprises)', ['brand'] = 'Unknown', ['model'] = 'frogger2', ['price'] = 52000, @@ -4678,7 +4687,7 @@ QBShared.Vehicles = { ['shop'] = 'air', }, ['swift2'] = { - ['name'] = 'Swift', + ['name'] = 'Swift Deluxe', ['brand'] = 'Buckingham', ['model'] = 'swift2', ['price'] = 52000, @@ -4708,7 +4717,7 @@ QBShared.Vehicles = { ['shop'] = 'air', }, ['seasparrow3'] = { - ['name'] = 'Sparrow', + ['name'] = 'Sparrow (Prop)', ['brand'] = 'Unknown', ['model'] = 'seasparrow3', ['price'] = 52000, @@ -4819,7 +4828,7 @@ QBShared.Vehicles = { ['shop'] = 'air', }, ['velum2'] = { - ['name'] = 'Velum', + ['name'] = 'Velum 5-Seater', ['brand'] = 'Unknown', ['model'] = 'velum2', ['price'] = 45000, @@ -4980,8 +4989,8 @@ QBShared.Vehicles = { }, ['rhinehart'] = { ['name'] = 'Rhinehart', - ['brand'] = 'Ubermacht', - ['model'] = 'rhinehart ', + ['brand'] = 'Übermacht', + ['model'] = 'rhinehart', ['price'] = 105000, ['category'] = 'sedans', ['categoryLabel'] = 'Sedans', @@ -5000,7 +5009,7 @@ QBShared.Vehicles = { }, ['sentinel4'] = { ['name'] = 'Sentinel Classic Widebody', - ['brand'] = 'Ubermacht', + ['brand'] = 'Übermacht', ['model'] = 'sentinel4', ['price'] = 140000, ['category'] = 'sports', @@ -5075,7 +5084,7 @@ QBShared.Vehicles = { ['price'] = 100000, ['category'] = 'commercial', ["categoryLabel"] = 'Commercial', - ['hash'] = `Hauler`, + ['hash'] = `hauler`, ['shop'] = 'truck', }, ['packer'] = { @@ -5089,7 +5098,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['stockade'] = { - ['name'] = 'stockade', + ['name'] = 'Stockade', ['brand'] = 'Brute', ['model'] = 'stockade', ['price'] = 100000, @@ -5099,7 +5108,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['biff'] = { - ['name'] = 'biff', + ['name'] = 'Biff', ['brand'] = 'Brute', ['model'] = 'biff', ['price'] = 100000, @@ -5115,7 +5124,7 @@ QBShared.Vehicles = { ['price'] = 100000, ['category'] = 'commercial', ["categoryLabel"] = 'Commercial', - ['hash'] = `Phantom`, + ['hash'] = `phantom`, ['shop'] = 'truck', }, ['phantom3'] = { @@ -5125,7 +5134,7 @@ QBShared.Vehicles = { ['price'] = 110000, ['category'] = 'commercial', ["categoryLabel"] = 'Commercial', - ['hash'] = `Phantom Custom`, + ['hash'] = `phantom3`, ['shop'] = 'truck', }, ['benson'] = { @@ -5199,7 +5208,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['boxville'] = { - ['name'] = 'Boxville', + ['name'] = 'Boxville LSDWP', ['brand'] = 'Brute', ['model'] = 'boxville', ['price'] = 45000, @@ -5209,7 +5218,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['boxville2'] = { - ['name'] = 'Boxville2', + ['name'] = 'Boxville Go Postal', ['brand'] = 'Brute', ['model'] = 'boxville2', ['price'] = 45000, @@ -5219,7 +5228,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['boxville3'] = { - ['name'] = 'Boxville3', + ['name'] = 'Boxville Humane Labs', ['brand'] = 'Brute', ['model'] = 'boxville3', ['price'] = 45000, @@ -5229,7 +5238,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['boxville4'] = { - ['name'] = 'Boxville4', + ['name'] = 'Boxville Post OP', ['brand'] = 'Brute', ['model'] = 'boxville4', ['price'] = 45000, @@ -5245,7 +5254,7 @@ QBShared.Vehicles = { ['price'] = 45000, ['category'] = 'vans', ["categoryLabel"] = 'Vans', - ['hash'] = `boxville4`, + ['hash'] = `boxville5`, ['shop'] = 'truck', }, ['pony'] = { @@ -5259,7 +5268,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['pony2'] = { - ['name'] = 'Pony 2', + ['name'] = 'Pony (Smoke on the water)', ['brand'] = 'Brute', ['model'] = 'pony2', ['price'] = 45000, @@ -5309,7 +5318,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['dump'] = { - ['name'] = 'HVY Dump Truck (Off Road)', + ['name'] = 'Dump Truck (Off Road)', ['brand'] = 'HVY', ['model'] = 'dump', ['price'] = 30000, @@ -5349,7 +5358,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['mixer2'] = { - ['name'] = 'Mixer2', + ['name'] = 'Cement Mixer 2', ['brand'] = 'HVY', ['model'] = 'mixer2', ['price'] = 30000, @@ -5359,7 +5368,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['rubble'] = { - ['name'] = 'Jobuilt Dump Truck (Street Legal)', + ['name'] = 'Dump Truck (Street Legal)', ['brand'] = 'Jobuilt', ['model'] = 'rubble', ['price'] = 30000, @@ -5369,7 +5378,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['tiptruck'] = { - ['name'] = 'Brute Dump Truck (Street Legal)', + ['name'] = 'Dump Truck (Street Legal)', ['brand'] = 'Brute', ['model'] = 'tiptruck', ['price'] = 30000, @@ -5379,7 +5388,7 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, ['tiptruck2'] = { - ['name'] = 'MTL Dump Truck (Street Legal)', + ['name'] = 'Dump Truck (Street Legal)', ['brand'] = 'MTL', ['model'] = 'tiptruck2', ['price'] = 30000, @@ -5389,7 +5398,3 @@ QBShared.Vehicles = { ['shop'] = 'truck', }, } - -for _, v in pairs(QBShared.Vehicles) do - QBShared.VehicleHashes[v.hash] = v -end