This commit is contained in:
Nordi98 2025-06-13 01:45:14 +02:00
commit 692d8f01cd
37 changed files with 2571 additions and 0 deletions

Binary file not shown.

View file

@ -0,0 +1,42 @@
{
"Lua.diagnostics.globals": [
"openCatalogue",
"lib",
"cache",
"testVehicle",
"locale",
"buyVehicle",
"createBlip",
"loadModel",
"createSphereZoneTarget",
"createEntityTarget",
"managementMenu",
"notify",
"hideTextUI",
"spawnVehicle",
"qbx",
"createShowroomVehicle",
"getPlayerJob",
"QBX",
"isPlayerJobBoss",
"openMenu",
"generatePlate",
"getPlayersFromCoords",
"openDashboard",
"MySQL",
"addAccountMoney",
"removeAccountMoney",
"getAccountMoney",
"createLog",
"addVehicleToGarage",
"vehicle",
"description",
"removeVehicleKeys",
"createDealerships",
"spawnObj",
"currentImportData"
],
"Lua.diagnostics.disable": [
"param-type-mismatch"
]
}

View file

@ -0,0 +1,201 @@
---@param coords vector
---@param sprite integer
---@param display integer
---@param scale number
---@param color integer
---@param label string
---@return integer
createBlip = function(coords, sprite, display, scale, color, label)
local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
SetBlipSprite(blip, sprite)
SetBlipDisplay(blip, display)
SetBlipAsShortRange(blip, true)
SetBlipScale(blip, scale)
SetBlipColour(blip, color)
BeginTextCommandSetBlipName("STRING")
AddTextComponentSubstringPlayerName(label)
EndTextCommandSetBlipName(blip)
return blip
end
---@param model string
loadModel = function(model)
local time = 1000
if not HasModelLoaded(model) then
while not HasModelLoaded(model) do
if time > 0 then time = time - 1 RequestModel(model) else time = 1000 break end Wait(10)
end
end
end
---@param coords vector
---@param radius number
---@param options table
---@param distance number
---@param name string
---@return unknown
createSphereZoneTarget = function(coords, radius, options, distance, name)
if Config.target == 'ox_target' then
return exports.ox_target:addSphereZone({ debug = Config.debug, coords = coords, radius = radius, options = options })
elseif Config.target == 'interact' then
return exports.interact:AddInteraction({ coords = vec3(coords.x, coords.y, coords.z), distance = 1.0, interactDst = 1.0, id = name, name = name, options = options })
else
-- Here we use Box Zone cause qb-target Sphere Zone does not exists and the Circle Zone is the big shit ever made
return exports[Config.target]:AddBoxZone(name, coords, radius, radius, { debugPoly = Config.debug, name = name, minZ = coords.z-radius, maxZ = coords.z+radius }, { options = options, distance = distance })
end
end
---@param entity integer
---@param options table
---@param distance number
---@param name string
---@return unknown
createEntityTarget = function(entity, options, distance, name)
if Config.target == 'ox_target' then
return exports.ox_target:addLocalEntity(entity, options)
elseif Config.target == 'interact' then
return exports.interact:AddLocalEntityInteraction({ entity = entity, name = name, id = name, distance = 1.0, interactDst = 1.0, options = options })
else
return exports[Config.target]:AddTargetEntity(entity, { name = name, options = options, distance = distance })
end
end
managementMenu = function()
if Config.framework == 'qb' then
TriggerEvent('qb-bossmenu:client:OpenMenu')
elseif Config.framework == 'qbx' then
exports.qbx_management:OpenBossMenu('job')
elseif Config.framework == 'esx' then
TriggerEvent('esx_society:openBossMenu', getPlayerJob(), false, {wash = false})
end
end
---@param message string
---@param type string
notify = function(message, type)
lib.notify({ description = message, type = type })
end
hideTextUI = function()
exports.mt_lib:hideTextUI()
end
---@param model any
---@param coords vector
---@param plate string | nil
---@return any
spawnVehicle = function(model, coords, plate)
coords = vec4(coords.x, coords.y, coords.z, coords.w or GetEntityHeading(cache.ped))
model = type(model) == 'string' and joaat(model) or model
if not IsModelInCdimage(model) then return end
loadModel(model)
local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, false)
local netid = NetworkGetNetworkIdFromEntity(veh)
SetVehicleHasBeenOwnedByPlayer(veh, true)
SetNetworkIdCanMigrate(netid, true)
SetVehicleNeedsToBeHotwired(veh, false)
SetVehRadioStation(veh, 'OFF')
SetVehicleFuelLevel(veh, 100.0)
SetVehicleNumberPlateText(veh, plate or 'PDM')
SetModelAsNoLongerNeeded(model)
local plate = Config.framework == 'qbx' and qbx.getVehiclePlate(veh) or GetVehicleNumberPlateText(veh)
if Config.keys == 'qs-vehiclekeys' then
exports['qs-vehiclekeys']:GiveKeys(plate, GetDisplayNameFromVehicleModel(GetEntityModel(veh)), true)
elseif Config.keys == 'mk_vehiclekeys' then
exports[Config.keys]:AddKey(veh)
elseif Config.keys == 'Renewed-Vehiclekeys' then
exports['Renewed-Vehiclekeys']:addKey(plate)
elseif Config.keys == 'MrNewbVehicleKeys' then
exports.MrNewbVehicleKeys:GiveKeys(veh)
else
TriggerEvent("vehiclekeys:client:SetOwner", plate)
end
return veh
end
---@param model string
---@param coords vector
---@param color integer
---@return integer
createShowroomVehicle = function(model, coords, color)
loadModel(model)
Wait(100)
local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, false, false)
Wait(500)
SetModelAsNoLongerNeeded(model)
SetEntityInvincible(veh, true)
SetVehicleDirtLevel(veh, 0.0)
SetVehicleDoorsLocked(veh, 3)
SetVehicleNumberPlateText(veh, 'PDM')
SetVehicleColours(veh, color, color)
SetVehicleExtraColours(veh, color, 0)
return veh
end
getPlayerJob = function()
if Config.framework == 'qb' then
local PlayerData = Config.core.Functions.GetPlayerData()
return PlayerData.job.name
elseif Config.framework == 'qbx' then
return QBX.PlayerData.job.name
elseif Config.framework == 'esx' then
return lib.callback.await('mt_dealerships:server:getPlayerJobESX', false)
end
end
isPlayerJobBoss = function()
if Config.framework == 'qb' then
local PlayerData = Config.core.Functions.GetPlayerData()
return PlayerData.job.isboss
elseif Config.framework == 'qbx' then
return QBX.PlayerData.job.isboss
elseif Config.framework == 'esx' then
return lib.callback.await('mt_dealerships:server:getPlayerJobIsBossESX', false)
end
end
---@param menu table
openMenu = function(menu)
lib.registerContext(menu)
lib.showContext(menu.id)
end
---@return string
generatePlate = function()
local plate = ""
local chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for i = 1, 8 do
local randIndex = math.random(1, #chars)
plate = plate..chars:sub(randIndex, randIndex)
end
return plate
end
---@param coords vector
---@param distance number
---@return table
getPlayersFromCoords = function(coords, distance)
coords = type(coords) == 'table' and vec3(coords.x, coords.y, coords.z) or coords or GetEntityCoords(cache.ped)
local players = lib.getNearbyPlayers(coords, distance or 5, true)
for i = 1, #players do players[i] = players[i].id end
return players
end
---@param veh integer
removeVehicleKeys = function(veh)
if Config.keys == 'Renewed-Vehiclekeys' then
local plate = Config.framework == 'qbx' and qbx.getVehiclePlate(veh) or GetVehicleNumberPlateText(veh)
exports['Renewed-Vehiclekeys']:removeKey(plate)
end
end
---@param modelHash string
---@param coords vector
spawnObj = function(modelHash, coords)
loadModel(modelHash)
Wait(100)
local obj = CreateObject(modelHash, coords.x, coords.y, coords.z, false, false, false)
Wait(100)
SetEntityHeading(obj, coords.w)
PlaceObjectOnGroundProperly(obj)
end

View file

@ -0,0 +1,29 @@
Config = Config or {}
-- For more info check: https://mt-scripts-documentations.gitbook.io/mt-script-documentation/
Config.debug = false -- if true it'll print some debug on F8/console and active all zones debug
Config.framework = 'qbx' -- qb, qbx, esx (need to change the export on the Config.core)
Config.core = exports['qb-core']:GetCoreObject() -- Your core export (for qb is exports['qb-core']:GetCoreObject()) (for esx is exports.es_extended:getSharedObject()) (for qbx you can just delete this line and add '@qbx_core/modules/playerdata.lua', to the fxmanifest.lua client_scripts)
Config.target = 'ox_target' -- ox_target, qb-target, interact, ...
Config.banking = 'Renewed-Banking' -- qb-banking, Renewed-Banking, (can change at server/functions.lua) ...
Config.keys = 'qbx_vehiclekeys' -- qb-vehiclekeys, qbx_vehiclekeys, mk_vehiclekeys, qs-vehiclekeys
Config.locale = 'en'
Config.useTabletAnimation = true
Config.mInsurance = {
enable = true, -- Enable use m-Insurance?
inventory = "qb", -- "qb" or "ox" | If you use esx leave this "ox"
}
Config.webhooks = {
vehicleImported = '',
vehicleBought = '',
adminCommand = ''
}
Config.commands = {
addStock = { command = 'addstock', restricted = 'group.admin' },
removeStock = { command = 'removestock', restricted = 'group.admin' },
}

View file

@ -0,0 +1,636 @@
Config.vehicles = Config.vehicles or {}
local vehicles = { -- Vehicle list, credits to qb-core!
{
model = '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
price = 4000, -- The price that the vehicle sells for
category = 'compacts', -- Category of the vehilce, stick with GetVehicleClass() options https://docs.fivem.net/natives/?_0x29439776AAA00A62
shop = { 'cardealer', 'fmpdm', 'laryscars' }, -- Can be a single shop or multiple shops. For multiple shops for example {'shopname1','shopname2','shopname3'}
class = 'C', -- This is the vehicle class, can be D, C, B, A, S or X (optional)
seats = 2, -- Number of seats (optional)
weight = 50, -- Vehicle trunk weight or total weight includin glove box (optional)
},
{ model = 'blista', name = 'Blista', brand = 'Dinka', price = 13000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 2, weight = 50 },
{ model = 'brioso', name = 'Brioso R/A', brand = 'Grotti', price = 20000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 2, weight = 50 },
{ model = 'club', name = 'Club', brand = 'BF', price = 8000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 2, weight = 50 },
{ model = 'dilettante', name = 'Dilettante', brand = 'Karin', price = 9000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 2, weight = 50 },
{ model = 'dilettante2', name = 'Dilettante Patrol', brand = 'Karin', price = 12000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 2, weight = 50 },
{ model = 'kanjo', name = 'Blista Kanjo', brand = 'Dinka', price = 12000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 2, weight = 50 },
{ model = 'issi2', name = 'Issi', brand = 'Weeny', price = 7000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 2, weight = 50 },
{ model = 'issi3', name = 'Issi Classic', brand = 'Weeny', price = 5000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 2, weight = 50 },
{ model = 'panto', name = 'Panto', brand = 'Benefactor', price = 3200, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 2, weight = 50 },
{ model = 'prairie', name = 'Prairie', brand = 'Bollokan', price = 30000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 2, weight = 50 },
{ model = 'rhapsody', name = 'Rhapsody', brand = 'Declasse', price = 10000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 2, weight = 50 },
{ model = 'brioso2', name = 'Brioso 300', brand = 'Grotti', price = 12000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 2, weight = 50 },
{ model = 'weevil', name = 'Weevil', brand = 'BF', price = 9000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 2, weight = 50 },
{ model = 'issi7', name = 'Issi Sport', brand = 'Weeny', price = 100000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'S', seats = 2, weight = 50 },
{ model = 'blista2', name = 'Blista Compact', brand = 'Dinka', price = 18950, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 2, weight = 50 },
{ model = 'blista3', name = 'Blista Go Go Monkey', brand = 'Dinka', price = 15000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 2, weight = 50 },
{ model = 'brioso3', name = 'Brioso 300 Widebody', brand = 'Grotti', price = 125000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 2, weight = 50 },
{ model = 'boor', name = 'Boor', brand = 'Karin', price = 23000, category = 'compacts', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 2, weight = 50 },
-- Sedans (1)
{ model = 'asea', name = 'Asea', brand = 'Declasse', price = 2500, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'asterope', name = 'Asterope', brand = 'Karin', price = 11000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'cog55', name = 'Cognoscenti 55', brand = 'Enus', price = 22000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'cognoscenti', name = 'Cognoscenti', brand = 'Enus', price = 22500, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'emperor', name = 'Emperor', brand = 'Albany', price = 4250, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'fugitive', name = 'Fugitive', brand = 'Cheval', price = 20000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'glendale', name = 'Glendale', brand = 'Benefactor', price = 3400, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'glendale2', name = 'Glendale Custom', brand = 'Benefactor', price = 12000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'ingot', name = 'Ingot', brand = 'Vulcar', price = 4999, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 4, weight = 50 },
{ model = 'intruder', name = 'Intruder', brand = 'Karin', price = 11250, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'premier', name = 'Premier', brand = 'Declasse', price = 12000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'primo', name = 'Primo', brand = 'Albany', price = 5000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 4, weight = 50 },
{ model = 'primo2', name = 'Primo Custom', brand = 'Albany', price = 14500, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'regina', name = 'Regina', brand = 'Dundreary', price = 7000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 4, weight = 50 },
{ model = 'stafford', name = 'Stafford', brand = 'Enus', price = 30000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'stanier', name = 'Stanier', brand = 'Vapid', price = 19000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'stratum', name = 'Stratum', brand = 'Zirconium', price = 15000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 4, weight = 50 },
{ model = 'stretch', name = 'Stretch', brand = 'Dundreary', price = 19000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'superd', name = 'Super Diamond', brand = 'Enus', price = 17000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'surge', name = 'Surge', brand = 'Cheval', price = 20000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'tailgater', name = 'Tailgater', brand = 'Obey', price = 22000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'warrener', name = 'Warrener', brand = 'Vulcar', price = 4000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'D', seats = 4, weight = 50 },
{ model = 'washington', name = 'Washington', brand = 'Albany', price = 7000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'tailgater2', name = 'Tailgater S', brand = 'Obey', price = 51000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'cinquemila', name = 'Lampadati', brand = 'Cinquemila', price = 125000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'iwagen', name = 'Obey', brand = 'I-Wagen', price = 225000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'astron', name = 'Astron', brand = 'Pfister', price = 150000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'baller7', name = 'Baller ST', brand = 'Gallivanter', price = 145000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'comet7', name = 'Comet', brand = 'S2 Cabrio', price = 25000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 2, weight = 50 },
{ model = 'deity', name = 'Deity', brand = 'Enus', price = 505000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'jubilee', name = 'Jubilee', brand = 'Enus', price = 485000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'oracle', name = 'Oracle', brand = 'Übermacht', price = 22000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'C', seats = 4, weight = 50 },
{ model = 'schafter2', name = 'Schafter', brand = 'Benefactor', price = 16000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 4, weight = 50 },
{ model = 'warrener2', name = 'Warrener HKR', brand = 'Vulcar', price = 30000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'B', seats = 2, weight = 50 },
{ model = 'rhinehart', name = 'Rhinehart', brand = 'Übermacht', price = 105000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'eudora', name = 'Eudora', brand = 'Willard', price = 17000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
{ model = 'asterope2', name = 'Asterope GZ', brand = 'Karin', price = 459000, category = 'sedans', shop = { 'cardealer', 'fmpdm', 'laryscars' }, class = 'A', seats = 4, weight = 50 },
-- SUV (2)
{ model = 'baller', name = 'Baller', brand = 'Gallivanter', price = 22000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'baller2', name = 'Baller II', brand = 'Gallivanter', price = 15000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'baller3', name = 'Baller LE', brand = 'Gallivanter', price = 15000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'baller4', name = 'Baller LE LWB', brand = 'Gallivanter', price = 29000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'baller5', name = 'Baller LE (Armored)', brand = 'Gallivanter', price = 78000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'baller6', name = 'Baller LE LWB (Armored)', brand = 'Gallivanter', price = 82000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bjxl', name = 'BeeJay XL', brand = 'Karin', price = 19000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cavalcade', name = 'Cavalcade', brand = 'Albany', price = 14000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cavalcade2', name = 'Cavalcade II', brand = 'Albany', price = 16500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'contender', name = 'Contender', brand = 'Vapid', price = 35000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dubsta', name = 'Dubsta', brand = 'Benefactor', price = 19000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dubsta2', name = 'Dubsta Luxury', brand = 'Benefactor', price = 19500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fq2', name = 'FQ2', brand = 'Fathom', price = 18500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'granger', name = 'Granger', brand = 'Declasse', price = 22000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gresley', name = 'Gresley', brand = 'Bravado', price = 25000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'habanero', name = 'Habanero', brand = 'Emperor', price = 20000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'huntley', name = 'Huntley S', brand = 'Enus', price = 24500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'landstalker', name = 'Landstalker', brand = 'Dundreary', price = 12000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'landstalker2', name = 'Landstalker XL', brand = 'Dundreary', price = 26000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'novak', name = 'Novak', brand = 'Lampadati', price = 70000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'patriot', name = 'Patriot', brand = 'Mammoth', price = 21000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'patriot2', name = 'Patriot Stretch', brand = 'Mammoth', price = 21000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'radi', name = 'Radius', brand = 'Vapid', price = 18000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rebla', name = 'Rebla GTS', brand = 'Übermacht', price = 21000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rocoto', name = 'Rocoto', brand = 'Obey', price = 13000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'seminole', name = 'Seminole', brand = 'Canis', price = 20000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'seminole2', name = 'Seminole Frontier', brand = 'Canis', price = 13000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'serrano', name = 'Serrano', brand = 'Benefactor', price = 48000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'toros', name = 'Toros', brand = 'Pegassi', price = 65000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'xls', name = 'XLS', brand = 'Benefactor', price = 17000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'granger2', name = 'Granger 3600LX', brand = 'Declasse', price = 221000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'patriot3', name = 'Patriot Military', brand = 'Mil-Spec', price = 270000, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'aleutian', name = 'Aleutian', brand = 'Vapid', price = 183500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'baller8', name = 'Baller ST-D', brand = 'Gallivanter', price = 171500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cavalcade3', name = 'Cavalcade XL', brand = 'Albany', price = 166500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dorado', name = 'Dorado', brand = 'Bravado', price = 137500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vivanite', name = 'Vivanite', brand = 'Karin', price = 160500, category = 'suvs', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Coupes (3)
{ model = 'cogcabrio', name = 'Cognoscenti Cabrio', brand = 'Enus', price = 30000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'exemplar', name = 'Exemplar', brand = 'Dewbauchee', price = 40000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'f620', name = 'F620', brand = 'Ocelot', price = 32500, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'felon', name = 'Felon', brand = 'Lampadati', price = 31000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'felon2', name = 'Felon GT', brand = 'Lampadati', price = 37000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jackal', name = 'Jackal', brand = 'Ocelot', price = 19000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'oracle2', name = 'Oracle XS', brand = 'Übermacht', price = 28000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sentinel', name = 'Sentinel', brand = 'Übermacht', price = 30000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sentinel2', name = 'Sentinel XS', brand = 'Übermacht', price = 33000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'windsor', name = 'Windsor', brand = 'Enus', price = 27000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'windsor2', name = 'Windsor Drop', brand = 'Enus', price = 34000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zion', name = 'Zion', brand = 'Übermacht', price = 22000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zion2', name = 'Zion Cabrio', brand = 'Übermacht', price = 28000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'previon', name = 'Previon', brand = 'Karin', price = 149000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'champion', name = 'Champion', brand = 'Dewbauchee', price = 205000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'futo', name = 'Futo', brand = 'Karin', price = 17500, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sentinel3', name = 'Sentinel Classic', brand = 'Übermacht', price = 70000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'kanjosj', name = 'Kanjo SJ', brand = 'Dinka', price = 143000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'postlude', name = 'Postlude', brand = 'Dinka', price = 90000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tahoma', name = 'Tahoma Coupe', brand = 'Declasse', price = 12000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'broadway', name = 'Broadway', brand = 'Classique', price = 20000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fr36', name = 'FR36', brand = 'Fathom', price = 161000, category = 'coupes', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Muscle (4)
{ model = 'blade', name = 'Blade', brand = 'Vapid', price = 23500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'buccaneer', name = 'Buccaneer', brand = 'Albany', price = 22500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'buccaneer2', name = 'Buccaneer Rider', brand = 'Albany', price = 24500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'chino', name = 'Chino', brand = 'Vapid', price = 5000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'chino2', name = 'Chino Luxe', brand = 'Vapid', price = 8000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'clique', name = 'Clique', brand = 'Vapid', price = 20000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'coquette3', name = 'Coquette BlackFin', brand = 'Invetero', price = 180000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'deviant', name = 'Deviant', brand = 'Schyster', price = 70000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator', name = 'Dominator', brand = 'Vapid', price = 62500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator2', name = 'Pißwasser Dominator', brand = 'Vapid', price = 50000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator3', name = 'Dominator GTX', brand = 'Vapid', price = 70000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator4', name = 'Dominator Arena', brand = 'Vapid', price = 200000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator7', name = 'Dominator ASP', brand = 'Vapid', price = 110000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator8', name = 'Dominator GTT', brand = 'Vapid', price = 80000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dukes', name = 'Dukes', brand = 'Imponte', price = 23500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dukes2', name = 'Duke O\'Death', brand = 'Imponte', price = 60000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dukes3', name = 'Beater Dukes', brand = 'Imponte', price = 45000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'faction', name = 'Faction', brand = 'Willard', price = 17000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'faction2', name = 'Faction Rider', brand = 'Willard', price = 19000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'faction3', name = 'Faction Custom Donk', brand = 'Willard', price = 35000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ellie', name = 'Ellie', brand = 'Vapid', price = 42250, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gauntlet', name = 'Gauntlet', brand = 'Bravado', price = 28500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gauntlet2', name = 'Redwood Gauntlet', brand = 'Bravado', price = 70000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gauntlet3', name = 'Classic Gauntlet', brand = 'Bravado', price = 75000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gauntlet4', name = 'Gauntlet Hellfire', brand = 'Bravado', price = 80000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gauntlet5', name = 'Gauntlet Classic Custom', brand = 'Bravado', price = 120000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hermes', name = 'Hermes', brand = 'Albany', price = 535000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hotknife', name = 'Hotknife', brand = 'Vapid', price = 90000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hustler', name = 'Hustler', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'impaler', name = 'Impaler', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'impaler2', name = 'Impaler Arena', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'impaler3', name = 'Impaler Future Shock', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'impaler4', name = 'Impaler Nightmare', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'imperator', name = 'Imperator Arena', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'imperator2', name = 'imperator Future Shock', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'imperator3', name = 'Imperator Nightmare', brand = 'Vapid', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'lurcher', name = 'Lurcher', brand = 'Bravado', price = 21000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'nightshade', name = 'Nightshade', brand = 'Imponte', price = 70000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'phoenix', name = 'Phoenix', brand = 'Imponte', price = 65000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'picador', name = 'Picador', brand = 'Cheval', price = 20000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ratloader2', name = 'Ratloader', brand = 'Ratloader2', price = 20000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ruiner', name = 'Ruiner', brand = 'Imponte', price = 29000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ruiner2', name = 'Ruiner 2000', brand = 'Imponte', price = 50000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sabregt', name = 'Sabre GT Turbo', brand = 'Declasse', price = 23000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sabregt2', name = 'Sabre GT Turbo Custom', brand = 'Declasse', price = 26500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'slamvan', name = 'Slam Van', brand = 'Vapid', price = 30000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'slamvan2', name = 'Lost Slam Van', brand = 'Vapid', price = 90000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'slamvan3', name = 'Slam Van Custom', brand = 'Vapid', price = 17000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stalion', name = 'Stallion', brand = 'Declasse', price = 33000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stalion2', name = 'Stallion Burgershot', brand = 'Declasse', price = 40000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tampa', name = 'Tampa', brand = 'Declasse', price = 24500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tulip', name = 'Tulip', brand = 'Declasse', price = 80000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vamos', name = 'Vamos', brand = 'Declasse', price = 30000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vigero', name = 'Vigero', brand = 'Declasse', price = 39500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'virgo', name = 'Virgo', brand = 'Albany', price = 22000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'virgo2', name = 'Virgo Custom Classic', brand = 'Dundreary', price = 21000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'virgo3', name = 'Virgo Classic', brand = 'Dundreary', price = 21000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'voodoo', name = 'Voodoo', brand = 'Declasse', price = 13000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'yosemite', name = 'Yosemite', brand = 'Declasse', price = 19500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'yosemite2', name = 'Yosemite Drift', brand = 'Declasse', price = 55000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'buffalo4', name = 'Buffalo STX', brand = 'Bravado', price = 345000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'manana', name = 'Manana', brand = 'Albany', price = 12800, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'manana2', name = 'Manana Custom', brand = 'Albany', price = 24000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tampa2', name = 'Drift Tampa', brand = 'Declasse', price = 80000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ruiner4', name = 'Ruiner ZZ-8', brand = 'Imponte', price = 85000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vigero2', name = 'Vigero ZX', brand = 'Declasse', price = 105000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'weevil2', name = 'Weevil Custom', brand = 'BF', price = 95000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'buffalo5', name = 'Buffalo EVX', brand = 'Bravado', price = 214000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tulip2', name = 'Tulip M-100', brand = 'Declasse', price = 80000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'clique2', name = 'Clique Wagon', brand = 'Vapid', price = 102500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'brigham', name = 'Brigham', brand = 'Albany', price = 149900, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'greenwood', name = 'Greenwood', brand = 'Bravado', price = 105000, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dominator9', name = 'Dominator GT', brand = 'Vapid', price = 219500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'impaler6', name = 'Impaler LX', brand = 'Declasse', price = 146500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vigero3', name = 'Vigero ZX Convertible', brand = 'Declasse', price = 229500, category = 'muscle', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Sports Classic (5)
{ model = 'ardent', name = 'Ardent', brand = 'Ocelot', price = 30000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'btype', name = 'Roosevelt', brand = 'Albany', price = 75000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'btype2', name = 'Franken Stange', brand = 'Albany', price = 87000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'btype3', name = 'Roosevelt Valor', brand = 'Albany', price = 63000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'casco', name = 'Casco', brand = 'Lampadati', price = 100000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'deluxo', name = 'Deluxo', brand = 'Imponte', price = 55000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dynasty', name = 'Dynasty', brand = 'Weeny', price = 25000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fagaloa', name = 'Fagaloa', brand = 'Vulcar', price = 13000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'feltzer3', name = 'Stirling GT', brand = 'Benefactor', price = 115000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gt500', name = 'GT500', brand = 'Grotti', price = 130000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'infernus2', name = 'Infernus Classic', brand = 'Pegassi', price = 245000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jb700', name = 'JB 700', brand = 'Dewbauchee', price = 240000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jb7002', name = 'JB 700W', brand = 'Dewbauchee', price = 40000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mamba', name = 'Mamba', brand = 'Declasse', price = 140000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'michelli', name = 'Michelli GT', brand = 'Lampadati', price = 30000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'monroe', name = 'Monroe', brand = 'Pegassi', price = 115000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'nebula', name = 'Nebula', brand = 'Vulcar', price = 22000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'peyote', name = 'Peyote', brand = 'Vapid', price = 23500, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'peyote3', name = 'Peyote Custom', brand = 'Vapid', price = 48000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pigalle', name = 'Pigalle', brand = 'Lampadati', price = 92000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rapidgt3', name = 'Rapid GT Classic', brand = 'Dewbauchee', price = 90000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'retinue', name = 'Retinue', brand = 'Vapid', price = 32000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'retinue2', name = 'Retinue MKII', brand = 'Vapid', price = 38000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'savestra', name = 'Savestra', brand = 'Annis', price = 67000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stinger', name = 'Stinger', brand = 'Grotti', price = 39500, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stingergt', name = 'Stinger GT', brand = 'Grotti', price = 70000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stromberg', name = 'Stromberg', brand = 'Ocelot', price = 80000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'swinger', name = 'Swinger', brand = 'Ocelot', price = 221000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'torero', name = 'Torero', brand = 'Pegassi', price = 84000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tornado', name = 'Tornado', brand = 'Declasse', price = 21000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tornado2', name = 'Tornado Convertible', brand = 'Declasse', price = 22000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tornado5', name = 'Tornado Custom', brand = 'Declasse', price = 22000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'turismo2', name = 'Turismo Classic', brand = 'Grotti', price = 170000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'viseris', name = 'Viseris', brand = 'Lampadati', price = 210000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'z190', name = '190Z', brand = 'Karin', price = 78000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ztype', name = 'Z-Type', brand = 'Truffade', price = 270000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zion3', name = 'Zion Classic', brand = 'Übermacht', price = 45000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cheburek', name = 'Cheburek', brand = 'Rune', price = 7000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'toreador', name = 'Toreador', brand = 'Pegassi', price = 50000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'peyote2', name = 'Peyote Gasser', brand = 'Vapid', price = 40000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'coquette2', name = 'Coquette Classic', brand = 'Invetero', price = 165000, category = 'classics', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Sports (6)
{ model = 'alpha', name = 'Alpha', brand = 'Albany', price = 53000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'banshee', name = 'Banshee', brand = 'Bravado', price = 56000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bestiagts', name = 'Bestia GTS', brand = 'Grotti', price = 37000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'buffalo', name = 'Buffalo', brand = 'Bravado', price = 18750, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'buffalo2', name = 'Buffalo S', brand = 'Bravado', price = 24500, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'carbonizzare', name = 'Carbonizzare', brand = 'Grotti', price = 155000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'comet2', name = 'Comet', brand = 'Pfister', price = 130000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'comet3', name = 'Comet Retro Custom', brand = 'Pfister', price = 175000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'comet4', name = 'Comet Safari', brand = 'Pfister', price = 110000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'comet5', name = 'Comet SR', brand = 'Pfister', price = 155000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'coquette', name = 'Coquette', brand = 'Invetero', price = 145000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'coquette4', name = 'Coquette D10', brand = 'Invetero', price = 220000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'drafter', name = '8F Drafter', brand = 'Obey', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'elegy', name = 'Elegy Retro Custom', brand = 'Annis', price = 145000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'elegy2', name = 'Elegy RH8', brand = 'Annis', price = 150000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'feltzer2', name = 'Feltzer', brand = 'Benefactor', price = 97000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'flashgt', name = 'Flash GT', brand = 'Vapid', price = 48000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'furoregt', name = 'Furore GT', brand = 'Lampadati', price = 78000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gb200', name = 'GB 200', brand = 'Vapid', price = 140000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'komoda', name = 'Komoda', brand = 'Lampadati', price = 55000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'imorgon', name = 'Imorgon', brand = 'Överflöd', price = 120000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'italigto', name = 'Itali GTO', brand = 'Progen', price = 260000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jugular', name = 'Jugular', brand = 'Ocelot', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jester', name = 'Jester', brand = 'Dinka', price = 132250, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jester2', name = 'Jester Racecar', brand = 'Dinka', price = 210000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jester3', name = 'Jester Classic', brand = 'Dinka', price = 85000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'khamelion', name = 'Khamelion', brand = 'Hijak', price = 90000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'kuruma', name = 'Kuruma', brand = 'Karin', price = 72000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'kuruma2', name = 'kuruma2', brand = 'Karin2', price = 72000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'locust', name = 'Locust', brand = 'Ocelot', price = 200000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'lynx', name = 'Lynx', brand = 'Ocelot', price = 150000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'massacro', name = 'Massacro', brand = 'Dewbauchee', price = 110000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'massacro2', name = 'Massacro Racecar', brand = 'Dewbauchee', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'neo', name = 'Neo', brand = 'Vysser', price = 230000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'neon', name = 'Neon', brand = 'Pfister', price = 220000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ninef', name = '9F', brand = 'Obey', price = 95000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ninef2', name = '9F Cabrio', brand = 'Obey', price = 105000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'omnis', name = 'Omnis', brand = 'Wow', price = 90000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'paragon', name = 'Paragon', brand = 'Enus', price = 60000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pariah', name = 'Pariah', brand = 'Ocelot', price = 90000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'penumbra', name = 'Penumbra', brand = 'Maibatsu', price = 22000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'penumbra2', name = 'Penumbra FF', brand = 'Maibatsu', price = 30000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rapidgt', name = 'Rapid GT', brand = 'Dewbauchee', price = 86000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rapidgt2', name = 'Rapid GT Convertible', brand = 'Dewbauchee', price = 92000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'raptor', name = 'Raptor', brand = 'BF', price = 90000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'revolter', name = 'Revolter', brand = 'Übermacht', price = 95000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ruston', name = 'Ruston', brand = 'Hijak', price = 130000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'schafter3', name = 'Schafter V12', brand = 'Benefactor', price = 35000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'schafter4', name = 'Schafter LWB', brand = 'Benefactor', price = 21000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'schlagen', name = 'Schlagen GT', brand = 'Benefactor', price = 160000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'schwarzer', name = 'Schwartzer', brand = 'Benefactor', price = 47000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'seven70', name = 'Seven-70', brand = 'Dewbauchee', price = 140000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'specter', name = 'Specter', brand = 'Dewbauchee', price = 160000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'streiter', name = 'Streiter', brand = 'Benefactor', price = 40000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sugoi', name = 'Sugoi', brand = 'Dinka', price = 85000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sultan', name = 'Sultan', brand = 'Karin', price = 50000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sultan2', name = 'Sultan Custom', brand = 'Karin', price = 55000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'surano', name = 'Surano', brand = 'Benefactor', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tropos', name = 'Tropos Rallye', brand = 'Lampadati', price = 65000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'verlierer2', name = 'Verlierer', brand = 'Bravado', price = 90500, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vstr', name = 'V-STR', brand = 'Albany', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'italirsx', name = 'Itali RSX', brand = 'Progen', price = 260000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zr350', name = 'ZR350', brand = 'Annis', price = 38000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'calico', name = 'Calico GTF', brand = 'Karin', price = 39000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'futo2', name = 'Futo GTX', brand = 'Karin', price = 39000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'euros', name = 'Euros', brand = 'Annis', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'jester4', name = 'Jester RR', brand = 'Dinka', price = 240000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'remus', name = 'Remus', brand = 'Annis', price = 48000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'comet6', name = 'Comet S2', brand = 'Pfister', price = 230000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'growler', name = 'Growler', brand = 'Pfister', price = 205000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vectre', name = 'Vectre', brand = 'Emperor', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cypher', name = 'Cypher', brand = 'Übermacht', price = 155000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sultan3', name = 'Sultan Classic Custom', brand = 'Karin', price = 56000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rt3000', name = 'RT3000', brand = 'Dinka', price = 65000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sultanrs', name = 'Sultan RS', brand = 'Karin', price = 76500, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'visione', name = 'Visione', brand = 'Grotti', price = 750000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cheetah2', name = 'Cheetah Classic', brand = 'Grotti', price = 195000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stingertt', name = 'Itali GTO Stinger TT', brand = 'Maibatsu', price = 238000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'omnisegt', name = 'Omnis e-GT', brand = 'Obey', price = 185000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sentinel4', name = 'Sentinel Classic Widebody', brand = 'Übermacht', price = 140000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sm722', name = 'SM722', brand = 'Benefactor', price = 125000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tenf', name = '10F', brand = 'Obey', price = 185000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tenf2', name = '10F Widebody', brand = 'Obey', price = 215000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'everon2', name = 'Everon Hotring', brand = 'Karin', price = 80000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'issi8', name = 'Issi Rally', brand = 'Weeny', price = 10000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'corsita', name = 'Corsita', brand = 'Lampadati', price = 90000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gauntlet6', name = 'Hotring Hellfire', brand = 'Bravado', price = 181000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'coureur', name = 'La Coureuse', brand = 'Penaud', price = 199000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'r300', name = '300R', brand = 'Annis', price = 56000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'panthere', name = 'Panthere', brand = 'Toundra', price = 55000, category = 'sports', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Super (7)
{ model = 'adder', name = 'Adder', brand = 'Truffade', price = 280000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'autarch', name = 'Autarch', brand = 'Överflöd', price = 224000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'banshee2', name = 'Banshee 900R', brand = 'Bravado', price = 120000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bullet', name = 'Bullet', brand = 'Vapid', price = 120000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cheetah', name = 'Cheetah', brand = 'Grotti', price = 214000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cyclone', name = 'Cyclone', brand = 'Coil', price = 300000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'entity2', name = 'Entity XXR', brand = 'Överflöd', price = 164000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'entityxf', name = 'Entity XF', brand = 'Överflöd', price = 180000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'emerus', name = 'Emerus', brand = 'Progen', price = 220000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fmj', name = 'FMJ', brand = 'Vapid', price = 125000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'furia', name = 'Furia', brand = 'Grotti', price = 230000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gp1', name = 'GP1', brand = 'Progen', price = 110000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'infernus', name = 'Infernus', brand = 'Pegassi', price = 235000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'italigtb', name = 'Itali GTB', brand = 'Progen', price = 170000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'italigtb2', name = 'Itali GTB Custom', brand = 'Progen', price = 250000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'krieger', name = 'Krieger', brand = 'Benefactor', price = 222000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'le7b', name = 'RE-7B', brand = 'Annis', price = 260000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'nero', name = 'Nero', brand = 'Truffade', price = 200000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'nero2', name = 'Nero Custom', brand = 'Truffade', price = 260000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'osiris', name = 'Osiris', brand = 'Pegassi', price = 220000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'penetrator', name = 'Penetrator', brand = 'Ocelot', price = 130000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pfister811', name = '811', brand = 'Pfister', price = 220000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'prototipo', name = 'X80 Proto', brand = 'Grotti', price = 235000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'reaper', name = 'Reaper', brand = 'Pegassi', price = 100000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 's80', name = 'S80RR', brand = 'Annis', price = 205000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sc1', name = 'SC1', brand = 'Übermacht', price = 90000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sheava', name = 'ETR1', brand = 'Emperor', price = 220000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 't20', name = 'T20', brand = 'Progen', price = 1650000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'taipan', name = 'Taipan', brand = 'Cheval', price = 1850000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tempesta', name = 'Tempesta', brand = 'Pegassi', price = 120000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tezeract', name = 'Tezeract', brand = 'Pegassi', price = 220000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'thrax', name = 'Thrax', brand = 'Truffade', price = 180000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tigon', name = 'Tigon', brand = 'Lampadati', price = 240000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'turismor', name = 'Turismo R', brand = 'Grotti', price = 140000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tyrant', name = 'Tyrant', brand = 'Överflöd', price = 2100000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tyrus', name = 'Tyrus', brand = 'Progen', price = 230000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vacca', name = 'Vacca', brand = 'Pegassi', price = 105000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vagner', name = 'Vagner', brand = 'Dewbauchee', price = 1660000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'voltic', name = 'Voltic', brand = 'Coil', price = 120000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'voltic2', name = 'Rocket Voltic', brand = 'Coil', price = 9830400, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'xa21', name = 'XA-21', brand = 'Ocelot', price = 180000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zentorno', name = 'Zentorno', brand = 'Pegassi', price = 340000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zorrusso', name = 'Zorrusso', brand = 'Pegassi', price = 277000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ignus', name = 'Ignus', brand = 'Pegassi', price = 1120000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zeno', name = 'Zeno', brand = 'Överflöd', price = 1350000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'deveste', name = 'Deveste', brand = 'Principe', price = 234000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'lm87', name = 'LM87', brand = 'Benefactor', price = 155000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'torero2', name = 'Torero XO', brand = 'Pegassi', price = 245000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'entity3', name = 'Entity MT', brand = 'Overflod', price = 200000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'virtue', name = 'Virtue', brand = 'Ocelot', price = 72000, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'turismo3', name = 'Turismo Omaggio', brand = 'Grotti', price = 284500, category = 'super', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Motorcycles (8)
{ model = 'akuma', name = 'Akuma', brand = 'Dinka', price = 55000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'avarus', name = 'Avarus', brand = 'LCC', price = 20000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bagger', name = 'Bagger', brand = 'WMC', price = 13500, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bati', name = 'Bati 801', brand = 'Pegassi', price = 24000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bati2', name = 'Bati 801RR', brand = 'Pegassi', price = 19000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bf400', name = 'BF400', brand = 'Nagasaki', price = 22000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'carbonrs', name = 'Carbon RS', brand = 'Nagasaki', price = 22000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'chimera', name = 'Chimera', brand = 'Nagasaki', price = 21000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cliffhanger', name = 'Cliffhanger', brand = 'Western', price = 28500, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'daemon', name = 'Daemon', brand = 'WMC', price = 14000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'daemon2', name = 'Daemon Custom', brand = 'Western', price = 23000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'defiler', name = 'Defiler', brand = 'Shitzu', price = 30000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'deathbike', name = 'Deathbike Apocalypse', brand = 'Deathbike', price = 30000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'deathbike2', name = 'Deathbike Future Shock', brand = 'Deathbike', price = 30000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'deathbike3', name = 'Deathbike Nightmare', brand = 'Deathbike', price = 30000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'diablous', name = 'Diablous', brand = 'Principe', price = 30000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'diablous2', name = 'Diablous Custom', brand = 'Principe', price = 38000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'double', name = 'Double-T', brand = 'Dinka', price = 28000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'enduro', name = 'Enduro', brand = 'Dinka', price = 5500, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'esskey', name = 'Esskey', brand = 'Pegassi', price = 12000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'faggio', name = 'Faggio Sport', brand = 'Pegassi', price = 2000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'faggio2', name = 'Faggio', brand = 'Pegassi', price = 1900, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'faggio3', name = 'Faggio Mod', brand = 'Pegassi', price = 2500, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fcr', name = 'FCR 1000', brand = 'Pegassi', price = 5000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fcr2', name = 'FCR 1000 Custom', brand = 'Pegassi', price = 19000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gargoyle', name = 'Gargoyle', brand = 'Western', price = 32000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hakuchou', name = 'Hakuchou', brand = 'Shitzu', price = 17000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hakuchou2', name = 'Hakuchou Drag', brand = 'Shitzu', price = 45000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hexer', name = 'Hexer', brand = 'LCC', price = 16000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'innovation', name = 'Innovation', brand = 'LLC', price = 33500, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'lectro', name = 'Lectro', brand = 'Principe', price = 28000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'manchez', name = 'Manchez', brand = 'Maibatsu', price = 8300, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'nemesis', name = 'Nemesis', brand = 'Principe', price = 20000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'nightblade', name = 'Nightblade', brand = 'WMC', price = 23000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'oppressor', name = 'Oppressor', brand = 'Pegassi', price = 9999999, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pcj', name = 'PCJ-600', brand = 'Shitzu', price = 15000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ratbike', name = 'Rat Bike', brand = 'Western', price = 3000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ruffian', name = 'Ruffian', brand = 'Pegassi', price = 25000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sanchez', name = 'Sanchez Livery', brand = 'Maibatsu', price = 5300, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sanchez2', name = 'Sanchez', brand = 'Maibatsu', price = 5300, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sanctus', name = 'Sanctus', brand = 'LCC', price = 35000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'shotaro', name = 'Shotaro', brand = 'Nagasaki', price = 320000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sovereign', name = 'Sovereign', brand = 'WMC', price = 8000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stryder', name = 'Stryder', brand = 'Nagasaki', price = 50000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'thrust', name = 'Thrust', brand = 'Dinka', price = 22000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vader', name = 'Vader', brand = 'Shitzu', price = 7200, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vindicator', name = 'Vindicator', brand = 'Dinka', price = 19000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vortex', name = 'Vortex', brand = 'Pegassi', price = 31000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'wolfsbane', name = 'Wolfsbane', brand = 'Western', price = 14000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zombiea', name = 'Zombie Bobber', brand = 'Western', price = 28000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'zombieb', name = 'Zombie Chopper', brand = 'Western', price = 27000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'manchez2', name = 'Manchez Scout', brand = 'Maibatsu', price = 14000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'shinobi', name = 'Shinobi', brand = 'Nagasaki', price = 25000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'reever', name = 'Reever', brand = 'Western', price = 25000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'manchez3', name = 'Manchez Scout Classic', brand = 'Maibatsu', price = 15000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'powersurge', name = 'Powersurge', brand = 'Western', price = 7000, category = 'motorcycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Off-Road (9)
{ model = 'bfinjection', name = 'Bf Injection', brand = 'Annis', price = 9000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bifta', name = 'Bifta', brand = 'Annis', price = 15500, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'blazer', name = 'Blazer', brand = 'Annis', price = 7500, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'blazer2', name = 'Blazer Lifeguard', brand = 'Nagasaki', price = 7000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'blazer3', name = 'Blazer Hot Rod', brand = 'Nagasaki', price = 7000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'blazer4', name = 'Blazer Sport', brand = 'Annis', price = 9250, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'blazer5', name = 'Blazer Aqua', brand = 'Nagasaki', price = 40000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'brawler', name = 'Brawler', brand = 'Annis', price = 40000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'caracara', name = 'Caracara', brand = 'Vapid', price = 60000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'caracara2', name = 'Caracara 4x4', brand = 'Vapid', price = 80000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dubsta3', name = 'Dubsta 6x6', brand = 'Annis', price = 34000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dune', name = 'Dune Buggy', brand = 'Annis', price = 14000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'everon', name = 'Everon', brand = 'Karin', price = 60000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'freecrawler', name = 'Freecrawler', brand = 'Canis', price = 24000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hellion', name = 'Hellion', brand = 'Annis', price = 38000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'kalahari', name = 'Kalahari', brand = 'Canis', price = 14000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'kamacho', name = 'Kamacho', brand = 'Canis', price = 50000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mesa3', name = 'Mesa Merryweather', brand = 'Canis', price = 400000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'outlaw', name = 'Outlaw', brand = 'Nagasaki', price = 15000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rancherxl', name = 'Rancher XL', brand = 'Declasse', price = 24000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rebel2', name = 'Rebel', brand = 'Vapid', price = 20000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'riata', name = 'Riata', brand = 'Vapid', price = 380000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sandking', name = 'Sandking XL', brand = 'Vapid', price = 25000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sandking2', name = 'Sandking SWB', brand = 'Vapid', price = 38000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'trophytruck', name = 'Trophy Truck', brand = 'Vapid', price = 60000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'trophytruck2', name = 'Desert Raid', brand = 'Vapid', price = 80000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'vagrant', name = 'Vagrant', brand = 'Maxwell', price = 50000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'verus', name = 'Verus', brand = 'Dinka', price = 20000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'winky', name = 'Winky', brand = 'Vapid', price = 10000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'yosemite3', name = 'Yosemite Rancher', brand = 'Declasse', price = 425000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mesa', name = 'Mesa', brand = 'Canis', price = 12000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ratel', name = 'Ratel', brand = 'Vapid', price = 199000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'l35', name = 'Walton L35', brand = 'Declasse', price = 167000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'monstrociti', name = 'MonstroCiti', brand = 'Maibatsu', price = 48000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'draugur', name = 'Draugur', brand = 'Declasse', price = 99000, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'terminus', name = 'Terminus', brand = 'Canis', price = 187750, category = 'offroad', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Industrial (10)
{ model = 'guardian', name = 'Guardian', brand = 'Vapid', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mixer2', name = 'Mixer II', brand = 'HVY', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tiptruck2', name = 'Tipper II', brand = 'Brute', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tiptruck', name = 'Tipper', brand = 'Brute', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rubble', name = 'Rubble', brand = 'Jobuilt', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mixer', name = 'Mixer', brand = 'HVY', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'flatbed', name = 'Flatbed Truck', brand = 'MTL', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'dump', name = 'Dump Truck', brand = 'HVY', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bulldozer', name = 'Dozer', brand = 'HVY', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'handler', name = 'Dock Handler', brand = 'HVY', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cutter', name = 'Cutter', brand = 'HVY', price = 30000, category = 'industrial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Utility (11)
{ model = 'slamtruck', name = 'Slam Truck', brand = 'Vapid', price = 100000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'caddy3', name = 'Caddy (Bunker)', brand = 'Nagasaki', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'caddy2', name = 'Caddy (Civilian)', brand = 'Nagasaki', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'caddy3', name = 'Caddy (Golf)', brand = 'Nagasaki', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'utillitruck', name = 'Utility Truck (Cherry Picker)', brand = 'Brute', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'utillitruck2', name = 'Utility Truck (Van)', brand = 'Brute', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'utillitruck3', name = 'Utility Truck (Contender)', brand = 'Vapid', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tractor', name = 'Tractor', brand = 'Stanley', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tractor2', name = 'Fieldmaster', brand = 'Stanley', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tractor3', name = 'Fieldmaster', brand = 'Stanley', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'towtruck', name = 'Tow Truck (Large)', brand = 'Vapid', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'towtruck2', name = 'Tow Truck (Small)', brand = 'Vapid', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'scrap', name = 'Scrap Truck', brand = 'Vapid', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'sadler', name = 'Sadler', brand = 'Vapid', price = 20000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'ripley', name = 'Ripley', brand = 'HVY', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mower', name = 'Lawn Mower', brand = 'Jacksheepe', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'forklift', name = 'Forklift', brand = 'HVY', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'docktug', name = 'Docktug', brand = 'HVY', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'airtug', name = 'Airtug', brand = 'HVY', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'trailers5', name = 'Trailer (Christmas)', brand = 'Unknown', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tvtrailer2', name = 'Trailer (TV)', brand = 'Unknown', price = 30000, category = 'utility', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Vans (12)
{ model = 'bison', name = 'Bison', brand = 'Bravado', price = 18000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bobcatxl', name = 'Bobcat XL Open', brand = 'Vapid', price = 13500, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'burrito3', name = 'Burrito', brand = 'Declasse', price = 4000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'gburrito2', name = 'Burrito Custom', brand = 'Declasse', price = 11500, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rumpo', name = 'Rumpo', brand = 'Bravado', price = 9000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'journey', name = 'Journey', brand = 'Zirconium', price = 6500, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'minivan', name = 'Minivan', brand = 'Vapid', price = 7000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'minivan2', name = 'Minivan Custom', brand = 'Vapid', price = 10000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'paradise', name = 'Paradise', brand = 'Bravado', price = 9000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rumpo3', name = 'Rumpo Custom', brand = 'Bravado', price = 19500, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'speedo', name = 'Speedo', brand = 'Vapid', price = 10000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'speedo4', name = 'Speedo Custom', brand = 'Vapid', price = 15000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'surfer', name = 'Surfer', brand = 'BF', price = 9000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'youga3', name = 'Youga Classic 4x4', brand = 'Bravado', price = 15000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'youga', name = 'Youga', brand = 'Bravado', price = 8000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'youga2', name = 'Youga Classic', brand = 'Bravado', price = 14500, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'youga4', name = 'Youga Custom', brand = 'Bravado', price = 85000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'moonbeam', name = 'Moonbeam', brand = 'Declasse', price = 13000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'moonbeam2', name = 'Moonbeam Custom', brand = 'Declasse', price = 15000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'boxville', name = 'Boxville LSDWP', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'boxville2', name = 'Boxville Go Postal', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'boxville3', name = 'Boxville Humane Labs', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'boxville4', name = 'Boxville Post OP', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'boxville5', name = 'Armored Boxville', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pony', name = 'Pony', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pony2', name = 'Pony (Smoke on the water)', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'journey2', name = 'Journey II', brand = 'Zirconium', price = 7000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'surfer3', name = 'Surfer Custom', brand = 'BF', price = 15000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'speedo5', name = 'Speedo Custom', brand = 'Vapid', price = 238000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mule2', name = 'Mule', brand = 'Maibatsu', price = 40000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mule3', name = 'Mule', brand = 'Maibatsu', price = 40000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'taco', name = 'Taco Truck', brand = 'Brute', price = 45000, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'boxville6', name = 'Boxville (LSDS)', brand = 'Brute', price = 47500, category = 'vans', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Cycles (13)
{ model = 'bmx', name = 'BMX', brand = 'Bike', price = 160, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cruiser', name = 'Cruiser', brand = 'Bike', price = 510, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'fixter', name = 'Fixter', brand = 'Bike', price = 225, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'scorcher', name = 'Scorcher', brand = 'Bike', price = 280, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tribike', name = 'Whippet Race Bike', brand = 'Bike', price = 500, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tribike2', name = 'Endurex Race Bike', brand = 'Bike', price = 700, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tribike3', name = 'Tri-Cycles Race Bike', brand = 'Bike', price = 520, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'inductor', name = 'Inductor', brand = 'Coil', price = 5000, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'inductor2', name = 'Junk Energy Inductor', brand = 'Coil', price = 5000, category = 'cycles', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Service (17)
{ model = 'brickade', name = 'Brickade', brand = 'MTL', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'brickade2', name = 'Brickade 6x6', brand = 'MTL', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pbus2', name = 'Festival Bus', brand = 'Unknown', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'wastelander', name = 'Wastelander', brand = 'MTL', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rallytruck', name = 'Dune', brand = 'MTL', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'metrotrain', name = 'Metro Train', brand = 'Unknown', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'freight', name = 'Freight Train', brand = 'Unknown', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'cablecar', name = 'Cable Car', brand = 'Unknown', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'trash', name = 'Trashmaster', brand = 'JoBuilt', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'trash2', name = 'Trashmaster', brand = 'JoBuilt', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'tourbus', name = 'Tour Bus', brand = 'Brute', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'taxi', name = 'Taxi', brand = 'Vapid', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'rentalbus', name = 'Rental Shuttle Bus', brand = 'Brute', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'coach', name = 'Dashound', brand = 'Brute', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'bus', name = 'Bus', brand = 'Brute', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'airbus', name = 'Airport Bus', brand = 'Brute', price = 100000, category = 'service', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Commercial (20)
{ model = 'cerberus', name = 'Apocalypse Cerberus', brand = 'MTL', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pounder2', name = 'Pounder Custom', brand = 'MTL', price = 55000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mule4', name = 'Mule Custom', brand = 'Maibatsu', price = 40000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'phantom3', name = 'Phantom Custom', brand = 'Jobuilt', price = 110000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hauler2', name = 'Hauler Custom', brand = 'Jobuilt', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'phantom2', name = 'Phantom Wedge', brand = 'Jobuilt', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mule5', name = 'Mule (Heist)', brand = 'Maibatsu', price = 40000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'stockade', name = 'Stockade', brand = 'Brute', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'pounder', name = 'Pounder', brand = 'MTL', price = 55000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'phantom', name = 'Phantom', brand = 'Jobuilt', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'packer', name = 'Packer', brand = 'MTL', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'mule', name = 'Mule', brand = 'Maibatsu', price = 40000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'hauler', name = 'Hauler', brand = 'Jobuilt', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'biff', name = 'Biff', brand = 'Brute', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'benson', name = 'Benson', brand = 'Vapid', price = 55000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'benson2', name = 'Benson (Cluckin Bell)', brand = 'Vapid', price = 55000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'phantom4', name = 'Phantom (Christmas)', brand = 'Vapid', price = 100000, category = 'commercial', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
-- Open Wheel (22)
{ model = 'openwheel2', name = 'DR1', brand = 'Declasse', price = 100000, category = 'openwheel', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'openwheel1', name = 'BR8', brand = 'Benefactor', price = 100000, category = 'openwheel', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'formula2', name = 'R88', brand = 'Ocelot', price = 100000, category = 'openwheel', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
{ model = 'formula', name = 'PR4', brand = 'Progen', price = 100000, category = 'openwheel', shop = { 'cardealer', 'fmpdm', 'laryscars' } },
}
for i = 1, #vehicles do
Config.vehicles[vehicles[i].model] = {
spawncode = vehicles[i].model,
name = vehicles[i].name,
brand = vehicles[i].brand,
model = vehicles[i].model,
price = vehicles[i].price,
category = vehicles[i].category,
shop = vehicles[i].shop,
class = vehicles[i].class or nil,
seats = vehicles[i].seats or nil,
weight = vehicles[i].weight or nil,
}
end

View file

@ -0,0 +1,34 @@
-- If you already have the old dealerships SQL don't need to run this
CREATE TABLE `dealership_stock` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`model` MEDIUMTEXT,
`stock` INT(10) DEFAULT 0,
`job` MEDIUMTEXT,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `id` (`id`) USING BTREE
);
CREATE TABLE `dealership_sells` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`description` LONGTEXT,
`job` MEDIUMTEXT,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `id` (`id`) USING BTREE
);
CREATE TABLE `dealership_imports` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`description` LONGTEXT,
`job` MEDIUMTEXT,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `id` (`id`) USING BTREE
);
CREATE TABLE `dealership_showroom` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`vehicleID` LONGTEXT,
`vehicle` MEDIUMTEXT,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `id` (`id`) USING BTREE
);

View file

@ -0,0 +1,41 @@
Config.dealerships = Config.dealerships or {}
Config.dealerships.fmpdm = { -- Dealership ID, NEEDS TO BE THE SAME AS THE JOB!!!
enabled = true, -- true or false to enable or disable the dealership
label = 'Premium Deluxe Motorsports', -- Dealership label
logo = 'https://i.ibb.co/nkBN3bs/logo.png', -- Dealership logo that'll show on UI
job = false, -- Dealership job or false to not player owned dealerships, NEEDS TO BE THE SAME AS THE ID!!!
lockCatalogueJob = false, -- can be false for everyone to open the catalogue or a job if you want to lock it to some job
currency = 'bank', -- bank, cash or money to ESX (Also to QBCore you can choose other currency like crypto and etc)
testDriveRoutingBucket = true, -- Set this to false if you don't want the test drive to be inside of a Routing Bucket
allowChangeVehicle = true, -- If true players will be able to change the vehicles on the catalogue witout job
testDriveTime = 50, -- Test drive time in seconds
testDriveSpawn = vec4(-805.46, -237.29, 37.12, 206.87), -- Test drive spawn coords
buySpawn = vec4(-796.82, -219.97, 37.26, 120.47), -- Vehicle buy spawn coords
blip = { enabled = true, coords = vec3(-795.15, -238.44, 37.08), sprite = 523, color = 3, scale = 0.6, display = 4 }, -- Dealership map blip
catalogues = { -- The catalogues to the players see the vehicle and emplooyes change the vehicle on showrrom
{ coords = vec3(-792.55, -227.65, 37.4), radius = 0.4 },
{ coords = vec3(-788.9, -225.45, 37.4), radius = 0.4 },
{ coords = vec3(-781.35, -238.1, 37.35), radius = 0.4 },
{ coords = vec3(-785.85, -240.35, 37.35), radius = 0.4 },
},
categories = { -- The categories that will show on the catalogue and dashboard (need to add the shop with the job name to the vehicles.lua too on the shops field otherwise it'll not show the vehicles!!)
{ label = 'Compacts', id = 'compacts' },
{ label = 'Sedans', id = 'sedans' },
{ label = 'SUVs', id = 'suvs' },
{ label = 'Coupes', id = 'coupes' },
{ label = 'Muscle', id = 'muscle' },
{ label = 'Sports Classics', id = 'classics' },
{ label = 'Sports', id = 'sports' },
{ label = 'Super', id = 'super' },
{ label = 'Motorcycles', id = 'motorcycles' },
{ label = 'OffRoad', id = 'offroad' },
{ label = 'Industrial', id = 'industrial' },
{ label = 'Utility', id = 'utility' },
{ label = 'Vans', id = 'vans' },
{ label = 'Cycles', id = 'cycles' },
{ label = 'Service', id = 'service' },
{ label = 'Commercial', id = 'commercial' },
{ label = 'Open Wheel', id = 'openwheel' },
}
}

View file

@ -0,0 +1,54 @@
Config.dealerships = Config.dealerships or {}
Config.dealerships.laryscars = { -- Dealership ID, NEEDS TO BE THE SAME AS THE JOB!!!
enabled = true, -- true or false to enable or disable the dealership
label = "Lary's Cars", -- Dealership label
logo = 'https://i.ibb.co/nkBN3bs/logo.png', -- Dealership logo that'll show on UI
job = 'laryscars', -- Dealership job or false to not player owned dealerships, NEEDS TO BE THE SAME AS THE ID!!!
lockCatalogueJob = false, -- can be false for everyone to open the catalogue or a job if you want to lock it to some job
currency = 'cash', -- bank, cash or money to ESX (Also to QBCore you can choose other currency like crypto and etc)
useStock = true, -- When using job = false this will be ignored
allowBuyCatalogue = true, -- If true players will be able to buy the vehicles on the catalogue
allowChangeVehicle = true, -- If true players will be able to change the vehicles on the catalogue witout job
needsMission = true, -- Set to false or true to disable/disable the needing of going pick up the car
testDriveRoutingBucket = true, -- Set this to false if you don't want the test drive to be inside of a Routing Bucket
testDriveTime = 50, -- Test drive time in seconds
testDriveSpawn = vec4(1223.21, 2688.7, 37.56, 108.43), -- Test drive spawn coords
truck = 'packer', -- The truck used on importation
trailer = 'tr4', -- The trailer used on importation
truckSpawn = vec4(1245.86, 2667.8, 37.55, 357.46), -- Importation truck spawn coords
buySpawn = vec4(1210.15, 2719.98, 38.01, 178.31), -- Vehicle buy spawn coords
comissions = { buyPercentage = 50, sellComission = 10 }, -- The dealership commisions (buyPercentage is the percentage of vehicle price that the dealership will buy it and the sellComission is the comission that the employee will earn on selling vehicles to players)
blip = { enabled = true, coords = vec3(1223.71, 2722.84, 38.01), sprite = 523, color = 3, scale = 0.6, display = 4 }, -- Dealership map blip
dashboards = { -- Dealership dashboards to import vehicles and see transations and etc
{ coords = vec3(1225.45, 2739.45, 38.25), radius = 0.5, includeBossMenu = true },
},
catalogues = { -- The catalogues to the players see the vehicle and emplooyes change the vehicle on showrrom
{ coords = vec3(1216.1, 2735.45, 38.15), radius = 0.25, vehicleCoords = vec4(1215.17, 2732.47, 37.1, 358.38), vehicle = 'premier', vehicleColor = 54 },
{ coords = vec3(1218.8, 2735.45, 38.15), radius = 0.25, vehicleCoords = vec4(1218.77, 2732.35, 37.1, 3.14), vehicle = 'mesa', vehicleColor = 0 },
{ coords = vec3(1229.35, 2735.4, 38.1), radius = 0.25, vehicleCoords = vec4(1229.48, 2733.08, 37.1, 356.21), vehicle = 'vacca', vehicleColor = 73 },
{ coords = vec3(1232.95, 2735.5, 38.15), radius = 0.25, vehicleCoords = vec4(1233.06, 2732.51, 38.1, 0.95), vehicle = 'cavalcade', vehicleColor = 4 },
},
categories = { -- The categories that will show on the catalogue and dashboard (need to add the shop with the job name to the vehicles.lua too on the shops field otherwise it'll not show the vehicles!!)
{ label = 'Compacts', id = 'compacts' },
{ label = 'Sedans', id = 'sedans' },
{ label = 'SUVs', id = 'suvs' },
{ label = 'Coupes', id = 'coupes' },
{ label = 'Muscle', id = 'muscle' },
{ label = 'Sports Classics', id = 'classics' },
{ label = 'Sports', id = 'sports' },
{ label = 'Super', id = 'super' },
{ label = 'Motorcycles', id = 'motorcycles' },
{ label = 'OffRoad', id = 'offroad' },
{ label = 'Industrial', id = 'industrial' },
{ label = 'Utility', id = 'utility' },
{ label = 'Vans', id = 'vans' },
{ label = 'Cycles', id = 'cycles' },
{ label = 'Service', id = 'service' },
{ label = 'Commercial', id = 'commercial' },
{ label = 'Open Wheel', id = 'openwheel' },
},
pickups = {
vec4(1201.35, -3187.03, 5.98, 175.35)
}
}

View file

@ -0,0 +1,54 @@
Config.dealerships = Config.dealerships or {}
Config.dealerships.cardealer = { -- Dealership ID, NEEDS TO BE THE SAME AS THE JOB!!!
enabled = true, -- true or false to enable or disable the dealership
label = 'Premium Deluxe Motorsports', -- Dealership label
logo = 'https://i.ibb.co/nkBN3bs/logo.png', -- Dealership logo that'll show on UI
job = false, -- Dealership job or false to not player owned dealerships, NEEDS TO BE THE SAME AS THE ID!!!
lockCatalogueJob = 'police', -- can be false for everyone to open the catalogue or a job if you want to lock it to some job
currency = 'cash', -- bank, cash or money to ESX (Also to QBCore you can choose other currency like crypto and etc)
useStock = true, -- When using job = false this will be ignored
allowBuyCatalogue = true, -- If true players will be able to buy the vehicles on the catalogue
allowChangeVehicle = true, -- If true players will be able to change the vehicles on the catalogue witout job
needsMission = true, -- Set to false or true to disable/disable the needing of going pick up the car
testDriveRoutingBucket = true, -- Set this to false if you don't want the test drive to be inside of a Routing Bucket
testDriveTime = 50, -- Test drive time in seconds
testDriveSpawn = vec4(-69.48, -1105.88, 26.07, 73.5), -- Test drive spawn coords
truck = 'packer', -- The truck used on importation
trailer = 'tr4', -- The trailer used on importation
truckSpawn = vec4(-58.46, -1072.99, 27.23, 70.0), -- Importation truck spawn coords
buySpawn = vec4(-17.59, -1107.66, 26.65, 161.25), -- Vehicle buy spawn coords
comissions = { buyPercentage = 50, sellComission = 10 }, -- The dealership commisions (buyPercentage is the percentage of vehicle price that the dealership will buy it and the sellComission is the comission that the employee will earn on selling vehicles to players)
blip = { enabled = true, coords = vec3(-58.01, -1097.08, 26.44), sprite = 523, color = 3, scale = 0.6, display = 4 }, -- Dealership map blip
dashboards = { -- Dealership dashboards to import vehicles and see transations and etc
{ coords = vec3(-45.9, -1090.5, 26.4), radius = 0.5, includeBossMenu = true },
},
catalogues = { -- The catalogues to the players see the vehicle and emplooyes change the vehicle on showrrom
{ coords = vec3(-46.7, -1094.6, 26.6), radius = 0.3, vehicleCoords = vec4(-47.34, -1097.28, 25.46, 299.48), vehicle = 'premier', vehicleColor = 54 },
{ coords = vec3(-42.1, -1096.2, 26.6), radius = 0.3, vehicleCoords = vec4(-42.82, -1098.86, 25.46, 301.18), vehicle = 'mesa', vehicleColor = 0 },
{ coords = vec3(-37.2, -1098.0, 26.6), radius = 0.3, vehicleCoords = vec4(-38.15, -1100.60, 25.46, 296.99), vehicle = 'vacca', vehicleColor = 73 },
{ coords = vec3(-33.0, -1099.5, 26.6), radius = 0.3, vehicleCoords = vec4(-33.69, -1102.26, 25.46, 297.53), vehicle = 'cavalcade', vehicleColor = 4 },
},
categories = { -- The categories that will show on the catalogue and dashboard (need to add the shop with the job name to the vehicles.lua too on the shops field otherwise it'll not show the vehicles!!)
{ label = 'Compacts', id = 'compacts' },
{ label = 'Sedans', id = 'sedans' },
{ label = 'SUVs', id = 'suvs' },
{ label = 'Coupes', id = 'coupes' },
{ label = 'Muscle', id = 'muscle' },
{ label = 'Sports Classics', id = 'classics' },
{ label = 'Sports', id = 'sports' },
{ label = 'Super', id = 'super' },
{ label = 'Motorcycles', id = 'motorcycles' },
{ label = 'OffRoad', id = 'offroad' },
{ label = 'Industrial', id = 'industrial' },
{ label = 'Utility', id = 'utility' },
{ label = 'Vans', id = 'vans' },
{ label = 'Cycles', id = 'cycles' },
{ label = 'Service', id = 'service' },
{ label = 'Commercial', id = 'commercial' },
{ label = 'Open Wheel', id = 'openwheel' },
},
pickups = {
vec4(1201.35, -3187.03, 5.98, 175.35)
}
}

View file

@ -0,0 +1,41 @@
fx_version 'cerulean'
description 'FiveM Dealership script'
author 'Marttins | MT Scripts'
lua54 'yes'
game 'gta5'
shared_scripts {
'@ox_lib/init.lua',
'configs/*',
'dealerships/*',
}
client_scripts {
'@qbx_core/modules/lib.lua',
'@qbx_core/modules/playerdata.lua',
'client/**/*',
}
server_scripts {
'@oxmysql/lib/MySQL.lua',
'server/**/*',
}
ui_page 'web/build/index.html'
files {
'locales/*',
'web/build/index.html',
'web/build/**/*',
'web/assets/**/*',
'vehiclesImages/*',
}
escrow_ignore {
'server/functions.lua',
'server/callbacks.lua',
'client/functions.lua',
'configs/*.lua',
'dealerships/*.lua'
}
dependency '/assetpacks'

View file

@ -0,0 +1,94 @@
{
"target_dashboard": "Dashboard",
"target_dashboard_icon": "fas fa-laptop",
"target_management": "Boss menu",
"target_management_icon": "fas fa-user-tie",
"target_catalogue": "Catalogue",
"target_catalogue_icon": "fas fa-laptop",
"target_vehicle_info": "%s %s - %s$",
"target_vehicle_info_icon": "fas fa-info",
"target_test_drive": "Test Drive",
"target_test_drive_icon": "fas fa-car",
"target_buy_vehicle": "Buy vehicle",
"target_buy_vehicle_icon": "fas fa-dollar-sign",
"timer_testdrive_time": "Remaining time",
"textui_pess_cancel_test_drive": "Cancel test drive",
"textui_press_deliver_vehicle": "Finish importation",
"notify_cant_spawn_trailer": "All the pickup locations are occupied!!",
"notify_cant_spawn_truck": "Truck truck spawn location is occupied!!",
"notify_no_money": "The company does not have enoght money!!",
"notify_pick_delivery": "Get into the truck outside and go to the GPS location and pick the vehicle trailer!",
"notify_finish_delivery": "Now go to the GPS location and finish the importatio!",
"notify_stock_added": "Stock added!",
"notify_vehicle_bought": "Vehicle bought!",
"notify_no_money_player": "You don't have that money!",
"noitfy_no_id": "No ID provided!",
"notify_missing_fields": "You need to fill all the needed fields!",
"notify_no_nearby": "No players neaby you!",
"notify_vehicle_no_stock": "This vehicle does not have stock!",
"notify_stock_removed": "Stock removed!",
"notify_vehicle_sold": "Vehicle sold! You earned %s$",
"blip_vehicle": "Pickup vehicle",
"blip_vehicle_finish": "Delivery vehicle",
"logs_vehicle_imported_title": "Vehicle Imported",
"logs_vehicle_imported_message": "Player **%s (%s)** imported the vehicle **%s** for **%s** having a new stock of **%s** at the **%s** dealership company",
"logs_vehicle_bought_title": "Vehicle Bought",
"logs_vehicle_bought_message": "Player **%s (%s)** bought the vehicle **%s** for **%s$** at **%s** dealership",
"logs_add_stock_command_title": "Add stock command",
"logs_add_stock_command_message": "Player **%s (%s)** added stock for the vehicle **%s** having a new stock of **%s** at the **%s** dealership company",
"ui_all": "All",
"ui_stocked": "Stocked",
"ui_search": "Search",
"ui_vehicle_info_title": "Vehicle Information",
"ui_price": "Price",
"ui_category": "Category",
"ui_stock": "Stock",
"ui_class": "Class",
"ui_weight": "Trunk weight",
"ui_seats": "Seats",
"ui_confirm_buy_vehicle_title": "Confirm Purchase",
"ui_confirm_buy_vehicle_message": "You're sure you want to buy this vehicle?",
"ui_cancel": "Cancel",
"ui_confirm": "Confirm",
"ui_buy": "Buy",
"ui_test_drive": "Test Drive",
"ui_dealership_sells_title": "Dealership Sells",
"ui_dealership_importations_title": "Dealership Importations",
"ui_date": "Date",
"ui_employee": "Employee",
"ui_customer": "Customer",
"ui_plate": "Plate",
"ui_model": "Model",
"ui_sells": "Sells",
"ui_importations": "Importations",
"ui_confirm_sell_title": "Confirm vehicle sell",
"ui_player_id": "Player",
"ui_sell": "Sell",
"ui_cancel_stock": "Cancel stock",
"ui_confirm_importation_title": "Confirm importation",
"ui_confirm_importation_message": "You're sure you want to import this vehicle?",
"ui_add_stock": "Add stock",
"ui_date_format": "%d/%m/%Y - %X",
"ui_change_vehicle": "Change",
"command_add_stock_help": "Add dealership vehicle stock",
"command_add_stock_vehicle_name": "vehicle",
"command_add_stock_vehicle_help": "Vehicle spawn name",
"command_add_stock_amount_name": "amount",
"command_add_stock_amount_help": "Amount of stock to add",
"command_add_stock_dealership_name": "dealership",
"command_add_stock_dealership_help": "Job of the dealership to add stock",
"command_remove_stock_help": "Remove dealership vehicle stock",
"command_remove_stock_vehicle_name": "vehicle",
"command_remove_stock_vehicle_help": "Vehicle spawn name",
"command_remove_stock_amount_name": "amount",
"command_remove_stock_amount_help": "Amount of stock to remove",
"command_remove_stock_dealership_name": "dealership",
"command_remove_stock_dealership_help": "Job of the dealership to remove stock"
}

View file

@ -0,0 +1,90 @@
{
"target_dashboard": "Dashboard",
"target_dashboard_icon": "fas fa-laptop",
"target_management": "Menu do chefe",
"target_management_icon": "fas fa-user-tie",
"target_catalogue": "Catálogo",
"target_catalogue_icon": "fas fa-laptop",
"target_vehicle_info": "%s %s - %s$",
"target_vehicle_info_icon": "fas fa-info",
"target_test_drive": "Test Drive",
"target_test_drive_icon": "fas fa-car",
"target_buy_vehicle": "Comprar veículo",
"target_buy_vehicle_icon": "fas fa-dollar-sign",
"timer_testdrive_time": "Tempo restante",
"textui_pess_cancel_test_drive": "Cancelar test drive",
"textui_press_deliver_vehicle": "Terminar importação",
"notify_cant_spawn_trailer": "Todas as localizações da pickup estão ocupadas!",
"notify_cant_spawn_truck": "A localização para spawn do camião está ocupada!",
"notify_no_money": "A empresa não tem dinheiro suficiente!",
"notify_pick_delivery": "Entra no camião, vai até à localização indicada e vai buscar o reboque!",
"notify_finish_delivery": "Agora vai até à localização do GPS e termina a importação!",
"notify_stock_added": "Stock adicionado!",
"notify_vehicle_bought": "Veículo comprado!",
"notify_no_money_player": "Não tens dinheiro suficiente!",
"noitfy_no_id": "A tua identificação não foi verificada!",
"notify_missing_fields": "Precisas preencher todos os campos!",
"notify_vehicle_no_stock": "Este veiculo não tem stock!",
"notify_stock_removed": "Stock removido!",
"blip_vehicle": "veículo pickup",
"blip_vehicle_finish": "veículo de entrega",
"logs_vehicle_imported_title": "Veículo importado",
"logs_vehicle_imported_message": "Jogador **%s (%s)** importou o veículo **%s** para **%s** tendo um novo stock de **%s** no **%s** importador",
"logs_vehicle_bought_title": "Ve+iculo adquirido",
"logs_vehicle_bought_message": "Jogador **%s (%s)** comprou um novo veículo **%s** para **%s$** em **%s** importador",
"ui_all": "Tudo",
"ui_stocked": "Em stock",
"ui_search": "Pesquisar",
"ui_vehicle_info_title": "Informação de veículo",
"ui_price": "Preço",
"ui_category": "Categoria",
"ui_stock": "Stock",
"ui_class": "Classe",
"ui_weight": "Capacidade da mala",
"ui_seats": "Lugares",
"ui_confirm_buy_vehicle_title": "Confirmar compra",
"ui_confirm_buy_vehicle_message": "Tens a certeza que queres adquirir este veículo?",
"ui_cancel": "Cancelar",
"ui_confirm": "Confirmar",
"ui_buy": "Comprar",
"ui_test_drive": "Test Drive",
"ui_dealership_sells_title": "Vendas",
"ui_dealership_importations_title": "Importações",
"ui_date": "Data",
"ui_employee": "Funcionário",
"ui_customer": "Cliente",
"ui_plate": "Matrícula",
"ui_model": "Modelo",
"ui_sells": "Vendas",
"ui_importations": "Importações",
"ui_confirm_sell_title": "Confirmar venda do veículo",
"ui_player_id": "ID do jogador",
"ui_sell": "Vender",
"ui_cancel_stock": "Cancelar stock",
"ui_confirm_importation_title": "Confirmar importação",
"ui_confirm_importation_message": "Tens a certeza que queres importar este veículo?",
"ui_add_stock": "Adicionar stock",
"ui_date_format": "%d/%m/%Y - %X",
"ui_change_vehicle": "Trocar",
"command_add_stock_help": "Adicionar stock a um veiculo de um stand",
"command_add_stock_vehicle_name": "veiculo",
"command_add_stock_vehicle_help": "Nome de spawn do veiculo",
"command_add_stock_amount_name": "quantia",
"command_add_stock_amount_help": "Quantia de stock a adicionar",
"command_add_stock_dealership_name": "stand",
"command_add_stock_dealership_help": "Job do stand a adicionar stock",
"command_remove_stock_help": "Remover stock de veiculo de um stand",
"command_remove_stock_vehicle_name": "veiculo",
"command_remove_stock_vehicle_help": "Nome de spawn do veiculo",
"command_remove_stock_amount_name": "quantia",
"command_remove_stock_amount_help": "Quantia de stock a remover",
"command_remove_stock_dealership_name": "stand",
"command_remove_stock_dealership_help": "Job do stand a remover stock"
}

View file

@ -0,0 +1,15 @@
if Config.framework == 'esx' then
lib.callback.register('mt_dealerships:server:getPlayerJobESX', function(source)
local src = source
local Player = Config.core.GetPlayerFromId(src)
if not Player then return end
return Player.getJob().name
end)
lib.callback.register('mt_dealerships:server:getPlayerJobIsBossESX', function(source)
local src = source
local Player = Config.core.GetPlayerFromId(src)
if not Player then return end
return (Player.getJob().grade_name == 'boss')
end)
end

View file

@ -0,0 +1,107 @@
---@param account string
---@param amount integer
addAccountMoney = function(account, amount)
if Config.banking == 'Renewed-Banking' then
exports['Renewed-Banking']:addAccountMoney(account, amount)
elseif Config.banking == 'esx_addonaccount' then
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_'..account, function(account)
account.addMoney(amount)
end)
else
exports[Config.banking]:AddMoney(account, amount)
end
end
---@param account string
---@param amount integer
removeAccountMoney = function(account, amount)
if Config.banking == 'Renewed-Banking' then
exports['Renewed-Banking']:removeAccountMoney(account, amount)
elseif Config.banking == 'esx_addonaccount' then
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_'..account, function(account)
account.removeMoney(amount)
end)
else
exports[Config.banking]:RemoveMoney(account, amount)
end
end
---@param account string
---@return number
getAccountMoney = function(account)
local value = 0
if Config.banking == 'Renewed-Banking' then
value = exports['Renewed-Banking']:getAccountMoney(account)
elseif Config.banking == 'esx_addonaccount' then
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_'..account, function(account)
value = account.money
end)
elseif Config.banking == 'qb-management' then
value = exports[Config.banking]:GetMoney(account)
else
value = exports[Config.banking]:GetAccountBalance(account)
end
return value
end
---@param webhook string
---@param title string
---@param message string
---@param image string
createLog = function(webhook, title, message, image)
PerformHttpRequest(webhook, function(err, text, headers) end, 'POST', json.encode({
embeds = {
{
title = title,
author = {
name = "MT Scripts - Dealerships",
icon_url = 'https://cdn.discordapp.com/attachments/1014907105733517442/1141400655450361916/Logo_PNG_8K.png?ex=66292c32&is=6616b732&hm=7f280578a3f1186b3778c2e828032df28d8f0b21debf468f126e0f5cb099e3d8&',
url = 'https://mt-scripts.tebex.io/',
},
color = '000000255',
description = message,
image = { url = image or '' },
footer = { text = 'mt-scripts.tebex.io' },
}
}
}), { ['Content-Type'] = 'application/json' })
end
---@param PlayerData table
---@param model string
---@param mods table
---@param plate string
---@param dealership table
addVehicleToGarage = function(PlayerData, model, mods, plate, dealership)
local src = source
if Config.framework == 'qb' or Config.framework == 'qbx' then
MySQL.insert('INSERT INTO `player_vehicles` (license, citizenid, vehicle, hash, mods, plate) VALUES (?, ?, ?, ?, ?, ?)', { PlayerData.license, PlayerData.citizenid, model, GetHashKey(model), json.encode(mods), plate })
if Config.mInsurance.enable then
local info = {}
info.name = PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname
info.plate = plate
info.model = model
if Config.mInsurance.inventory == "qb" then
local Player = Config.core.Functions.GetPlayer(src)
Player.Functions.AddItem('car_registration', 1, false, info)
elseif Config.mInsurance.inventory == "ox" then
local metadata = { description = 'Name: '..PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname..' \nPlate: '..plate..' \nModel: '..model }
exports.ox_inventory:AddItem(src, 'car_registration', 1, metadata)
end
end
elseif Config.framework == 'esx' then
MySQL.insert('INSERT INTO `owned_vehicles` (owner, plate, vehicle) VALUES (?, ?, ?)', { PlayerData.identifier, plate, json.encode({model = joaat(model), plate = plate}) })
if Config.mInsurance.enable then
local xPlayer = Config.core.GetPlayerFromId(src)
local name = xPlayer.getName()
local metadata = { description = 'Name: '..PlayerData.charinfo.firstname .. " " .. PlayerData.charinfo.lastname..' \nPlate: '..plate..' \nModel: '..model }
exports.ox_inventory:AddItem(src, 'car_registration', 1, metadata)
MySQL.insert('INSERT INTO m_insurance_registration (plate, model, registration, identifier) VALUES (?, ?, ?, ?)', {plate, vehicle, 1, PlayerData.license})
end
end
end

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/src/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NUI React Boilerplate</title>
<script type="module" crossorigin src="./assets/index-yg9jBeC4.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>

Binary file not shown.

View file

@ -0,0 +1,172 @@
print'Pug Sling 2.1.3'
CreateThread(function()
local InVehicle
while true do
Wait(100)
local entering = GetVehiclePedIsTryingToEnter(PlayerPedId())
if entering ~= 0 then
TriggerEvent("Pug:ReloadGuns:sling", true)
Wait(2000)
end
if IsPedInAnyVehicle(PlayerPedId()) then
if not InVehicle then
InVehicle = true
TriggerEvent("Pug:ReloadGuns:sling", true)
Wait(2000)
end
else
InVehicle = false
end
end
end)
if not Config.UseOldSlingScript then
RegisterNetEvent('Pug:ReloadGuns:sling', function(bool)
ResetAllWeaponsOnBack(bool)
for _, v in pairs(GetGamePool('CObject')) do
if IsEntityAttachedToEntity(PlayerPedId(), v) then
SetEntityAsMissionEntity(v, true, true)
DeleteObject(v)
DeleteEntity(v)
end
end
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded')
AddEventHandler('QBCore:Client:OnPlayerLoaded', function()
Wait(3000)
TriggerEvent("Pug:client:RegisterAllBackWeapons")
end)
RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function()
Wait(3000)
TriggerEvent("Pug:client:RegisterAllBackWeapons")
end)
-- Change this to your notification script if needed
function SlingNotify(msg, type, length)
if Framework == "ESX" then
FWork.ShowNotification(msg)
elseif Framework == "QBCore" then
FWork.Functions.Notify(msg, type, length)
end
end
-- INVENTORY HAS ITEM CHECK
function CheckHasWeapon(Weapon)
if GetResourceState("qs-inventory") == 'started' then
local count = exports['qs-inventory']:Search(Weapon)
if count > 0 then
return true
else
return false
end
elseif GetResourceState("qb-inventory") == 'started' then
return exports['qb-inventory']:HasItem(Weapon)
elseif GetResourceState("ps-inventory") == 'started' then
return exports['ps-inventory']:HasItem(Weapon)
elseif GetResourceState("ox_inventory") == 'started' then
local count = exports.ox_inventory:GetItemCount(Weapon)
if count > 0 then
return true
else
return false
end
elseif GetResourceState("core_inventory") == 'started' then
if Framework == "QBCore" then
local citizenid = FWork.Functions.GetPlayerData().citizenid
local Primary = exports['core_inventory']:getItems('primary-' .. citizenid, Weapon)
local Secondry = exports['core_inventory']:getItems('secondry-' .. citizenid, Weapon)
if Primary > 0 or Secondry > 0 then
return true
else
return false
end
else
return false
end
elseif Framework == "QBCore" then
local FinalValue = false
local items = FWork.Functions.GetPlayerData().items
for _, v in pairs(items) do
if v.name ~= nil then
if tostring(v.name) == tostring(Weapon) then
FinalValue = true
end
end
end
return FinalValue
end
end
local function CheckJobVerified()
local PlayerJob = Config.FrameworkFunctions.GetPlayer().PlayerData.job.name
for _,v in pairs(Config.RackCapableJobs) do
if tostring(v) == tostring(PlayerJob) then
return true
end
end
return false
end
RegisterCommand(Config.WeaponRackCommand, function()
if CheckJobVerified() then
--IS IN VEHICLE
if IsPedInAnyVehicle(PlayerPedId()) then
local veh = GetVehiclePedIsUsing(PlayerPedId())
local plate = GetVehicleNumberPlateText(veh)
--IS EMERGENCY VEHICLE
if GetVehicleClass(veh) == 18 then
if Framework == "ESX" then
if GetResourceState("qb-inventory") == 'started' or GetResourceState("ps-inventory") == 'started' then
TriggerEvent("inventory:client:SetCurrentStash", "Rack".. plate)
TriggerServerEvent("inventory:server:OpenInventory", "stash", "Rack" .. plate, {
maxweight = Config.RackMaxWeight,
slots = Config.RackSlots,
})
elseif GetResourceState("qs-inventory") == 'started' then
exports['qs-inventory']:RegisterStash("Rack".. plate, Config.RackSlots, Config.RackMaxWeight)
elseif GetResourceState("ox_inventory") == 'started' then
TriggerServerEvent("Pug:server:SlingOpenOxInvRack", "Rack".. plate, Config.RackSlots, Config.RackMaxWeight)
exports.ox_inventory:openInventory('stash', "Rack".. plate)
end
else
FWork.Functions.Progressbar("reaching_rack", "Reaching for rack", 4000, false, true, {
disableMovement = false,
disableCarMovement = false,
disableMouse = false,
disableCombat = true,
}, {
animDict = "move_m@intimidation@cop@unarmed",
anim = "idle",
flags = 49,
}, {}, {}, function()
if GetResourceState("qb-inventory") == 'started' or GetResourceState("ps-inventory") == 'started' then
TriggerEvent("inventory:client:SetCurrentStash", "Rack".. plate)
TriggerServerEvent("inventory:server:OpenInventory", "stash", "Rack" .. plate, {
maxweight = Config.RackMaxWeight,
slots = Config.RackSlots,
})
elseif GetResourceState("qs-inventory") == 'started' then
exports['qs-inventory']:RegisterStash("Rack".. plate, Config.RackSlots, Config.RackMaxWeight)
elseif GetResourceState("ox_inventory") == 'started' then
TriggerServerEvent("Pug:server:SlingOpenOxInvRack", "Rack".. plate, Config.RackSlots, Config.RackMaxWeight)
exports.ox_inventory:openInventory('stash', "Rack".. plate)
end
end, function() -- Cancel
SlingNotify("Canceled", "error", 4500)
end)
end
else
SlingNotify(Config.LangT.EmergencyServiceVehicle, "error")
end
else
SlingNotify(Config.LangT.MustBeInVehicle, "error")
end
else
SlingNotify(Config.LangT.NotPolice, "error")
end
end)
end

View file

@ -0,0 +1,300 @@
Config = {}
Config.UseOldSlingScript = false -- MAKKE THIS TRUE IF YOU WANT TO USE THE OLD VERSION OF THE SCRIPT. VIDEO FOUND HERE: https://youtu.be/Pf-B03cmFtQ
if not Config.UseOldSlingScript then
---------- [Framework] ----------
-- (DONT TOUCH THIS UNLESS YOU HAVE A CUSTOM FRAMEWORK)
if GetResourceState('es_extended') == 'started' then
Framework = "ESX" -- (ESX) or (QBCore)
elseif GetResourceState('qb-core') == 'started' then
Framework = "QBCore" -- (ESX) or (QBCore)
end
if Framework == "QBCore" then
Config.CoreName = "qb-core" -- your core name
FWork = exports[Config.CoreName]:GetCoreObject()
elseif Framework == "ESX" then
Config.CoreName = "es_extended" -- your core name
FWork = exports[Config.CoreName]:getSharedObject()
end
------------------------------
---------- [INTAGERS] ----------
Config.LoopSpeed = 500 -- How fast the loop to check weapons runs. Lower numbers are lest optimized.
Config.RackMaxWeight = 45000 -- Rack stash weight capacity.
Config.RackSlots = 2 -- Rack stash amount of item slots available.
Config.WeaponLimit = 10 -- Ammount of weapons/items that will show up on the player when they have the item or weapon
Config.AmountOfTimesToCheckIfTheModelIsLoaded = 10 -- This value adjust the amount of times to check to see if a modle is loaded. The check runs every 100 milliseconds
------------------------------
---------- [STRINGS] ----------
Config.WeaponRackCommand = "rack" -- /rack command to rack weapons into any service vehicles
Config.WeaponSettingCommand = "setweapon" -- (GLOBAL POSITION FOR EVERYONE) /setweapon command to begin editing where the weapons/items should sit on the player
Config.PersonalWeponSettingsCommand = "weaponposition" -- (PLAYERS PERSONAL POSITION THAT THEY SET HOW THEY LIKE) You can remove this command from the server.lua
------------------------------
---------- [TABLES] ----------
Config.RackCapableJobs = { -- Jobs that can do the /rack command
"leo",
"police",
"sheriff",
}
------------------------------
Config.LangT = {
DeleteFromConfig = "DELETE FROM CONFIG",
Change = "CHANGE ",
ToggleWeapons = "ALL WEAPONS ON/OFF",
RotateZ = "ROTATE Z",
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
In = "In",
Out = "Out",
Rotate = "ROTATE",
MustBeInVehicle = "You must be in a vehicle",
NotPolice = "You are not a police Officer",
EmergencyServiceVehicle = "Must be in a emergency service vehicle!",
}
-- THE ATTACHMENTS WORK BUT SOME SERVERS HAD CRASHING ISSUES WHEN THEY WERE UNHASHED. YOU CAN UNHASH THEM BUT IF YOU CRASH THEN HASH THEM BACK OUT.
Config.WeaponsOnBack = {-- THE ATTACHMENTS WORK BUT SOME SERVERS HAD CRASHING ISSUES WHEN THEY WERE UNHASHED. YOU CAN UNHASH THEM BUT IF YOU CRASH THEN HASH THEM BACK OUT.
-- Pistols
["weapon_pistol"] = { model = "w_pi_pistol" },
-- Assault Rifles
["weapon_carbinerifle"] = { -- THE ATTACHMENTS WORK BUT SOME SERVERS HAD CRASHING ISSUES WHEN THEY WERE UNHASHED. YOU CAN UNHASH THEM BUT IF YOU CRASH THEN HASH THEM BACK OUT.
model = "w_ar_carbinerifle",
-- Attachments = {
-- ["COMPONENT_CARBINERIFLE_CLIP_01"] = {Base = 'WAPClip',Component = "W_AR_CARBINERIFLE_MAG1"},
-- ["COMPONENT_CARBINERIFLE_CLIP_02"] = {Base = 'WAPClip',Component = "W_AR_CARBINERIFLE_MAG2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr',Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_MEDIUM"] = {Base = 'WAPScop',Component = "W_AT_SCOPE_MEDIUM"},
-- ["COMPONENT_AT_AR_SUPP"] = {Base = 'WAPSupp', Component = "W_AT_AR_SUPP"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip',Component = "W_AT_AR_AFGRIP"},
-- }
},
["weapon_compactrifle"] = {
model = "w_ar_assaultrifle_smg",
-- Attachments = {
-- ["COMPONENT_COMPACTRIFLE_CLIP_01"] = {Base = 'WAPClip', Component = "w_ar_assaultrifle_smg_mag1"},
-- ["COMPONENT_COMPACTRIFLE_CLIP_02"] = {Base = 'WAPClip', Component = "w_ar_assaultrifle_smg_mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_MACRO"] = {Base = 'WAPScop', Component = "w_at_scope_macro"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "W_AT_AR_AFGRIP"},
-- }
},
["weapon_carbinerifle_mk2"] = {
model = "w_ar_carbineriflemk2",
-- Attachments = {
-- ["COMPONENT_CARBINERIFLE_MK2_CLIP_01"] = {Base = 'WAPClip', Component = "w_ar_carbineriflemk2_mag1"},
-- ["COMPONENT_CARBINERIFLE_MK2_CLIP_02"] = {Base = 'WAPClip', Component = "w_ar_carbineriflemk2_mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SIGHTS"] = {Base = 'WAPScop', Component = "w_at_sights_1"},
-- ["COMPONENT_AT_AR_SUPP"] = {Base = 'WAPSupp', Component = "W_AT_AR_SUPP"},
-- ["COMPONENT_AT_MUZZLE_01"] = {Base = 'WAPSupp', Component = "w_at_muzzle_1"},
-- ["COMPONENT_AT_AR_AFGRIP_02"] = {Base = 'WAPGrip', Component = "w_at_afgrip_2"},
-- ["COMPONENT_CARBINERIFLE_MK2_CAMO"] = {Base = 'Cosmetic', Component = "w_at_cr_camo1"},
-- }
},
["weapon_assaultrifle"] = {
model = "w_ar_assaultrifle",
-- Attachments = {
-- ["COMPONENT_ASSAULTRIFLE_CLIP_01"] = {Base = 'WAPClip', Component = "w_ar_assaultrifle_mag1"},
-- ["COMPONENT_ASSAULTRIFLE_CLIP_02"] = {Base = 'WAPClip', Component = "w_ar_assaultrifle_mag2"},
-- ["COMPONENT_ASSAULTRIFLE_CLIP_03"] = {Base = 'WAPClip', Component = "w_ar_assaultrifle_boxmag"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_MACRO"] = {Base = 'WAPScop', Component = "w_at_scope_macro"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "W_AT_AR_AFGRIP"},
-- }
},
["weapon_specialcarbine"] = {
model = "w_ar_specialcarbine",
-- Attachments = {
-- ["COMPONENT_SPECIALCARBINE_CLIP_01"] = {Base = 'WAPClip', Component = "w_ar_specialcarbine_mag1"},
-- ["COMPONENT_SPECIALCARBINE_CLIP_02"] = {Base = 'WAPClip', Component = "w_ar_specialcarbine_mag2"},
-- ["COMPONENT_SPECIALCARBINE_CLIP_03"] = {Base = 'WAPClip', Component = "w_ar_specialcarbine_boxmag"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_MEDIUM"] = {Base = 'WAPScop', Component = "w_at_scope_medium"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "W_AT_AR_AFGRIP"},
-- ["COMPONENT_SPECIALCARBINE_VARMOD_LOWRIDER"] = {Base = 'Cosmetic', Component = "w_ar_specialcarbine_luxe"},
-- }
},
["weapon_bullpuprifle"] = {
model = "w_ar_bullpuprifle",
-- Attachments = {
-- ["COMPONENT_BULLPUPRIFLE_CLIP_01"] = {Base = 'WAPClip', Component = "w_ar_bullpuprifle_mag1"},
-- ["COMPONENT_BULLPUPRIFLE_CLIP_02"] = {Base = 'WAPClip', Component = "w_ar_bullpuprifle_mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_SMALL"] = {Base = 'WAPScop', Component = "w_at_scope_small"},
-- ["COMPONENT_AT_AR_SUPP"] = {Base = 'WAPSupp', Component = "w_at_ar_supp"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "W_AT_AR_AFGRIP"},
-- }
},
["weapon_advancedrifle"] = {
model = "w_ar_advancedrifle",
-- Attachments = {
-- ["COMPONENT_ADVANCEDRIFLE_CLIP_01"] = {Base = 'WAPClip', Component = "w_ar_advancedrifle_mag1"},
-- ["COMPONENT_ADVANCEDRIFLE_CLIP_02"] = {Base = 'WAPClip', Component = "w_ar_advancedrifle_mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_SMALL"] = {Base = 'WAPScop', Component = "w_at_scope_small"},
-- ["COMPONENT_AT_AR_SUPP"] = {Base = 'WAPSupp', Component = "w_at_ar_supp"},
-- }
},
-- Sub Machine Guns
["weapon_microsmg"] = {
model = "w_sb_microsmg",
-- Attachments = {
-- ["COMPONENT_MICROSMG_CLIP_01"] = {Base = 'WAPClip', Component = "w_sb_microsmg_mag1"},
-- ["COMPONENT_MICROSMG_CLIP_02"] = {Base = 'WAPClip', Component = "w_sb_microsmg_mag2"},
-- ["COMPONENT_AT_PI_FLSH"] = {Base = 'WAPFlshLasr', Component = "w_at_pi_flsh"},
-- ["COMPONENT_AT_SCOPE_MACRO"] = {Base = 'WAPScop', Component = "w_at_scope_macro"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- }
},
["weapon_assaultsmg"] = {
model = "w_sb_assaultsmg",
-- Attachments = {
-- ["COMPONENT_ASSAULTSMG_CLIP_01"] = {Base = 'WAPClip', Component = "W_SB_ASSAULTSMG_Mag1"},
-- ["COMPONENT_ASSAULTSMG_CLIP_02"] = {Base = 'WAPClip', Component = "W_SB_ASSAULTSMG_Mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_MACRO"] = {Base = 'WAPScop', Component = "w_at_scope_macro"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- }
},
["weapon_smg"] = {
model = "w_sb_smg",
-- Attachments = {
-- ["COMPONENT_SMG_CLIP_01"] = {Base = 'WAPClip', Component = "w_sb_smg_mag1"},
-- ["COMPONENT_SMG_CLIP_02"] = {Base = 'WAPClip', Component = "w_sb_smg_mag2"},
-- ["COMPONENT_SMG_CLIP_03"] = {Base = 'WAPClip', Component = "w_sb_smg_boxmag"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SCOPE_MACRO_02"] = {Base = 'WAPScop_2', Component = "w_at_scope_macro_2"},
-- ["COMPONENT_AT_PI_SUPP"] = {Base = 'WAPSupp', Component = "w_at_pi_supp"},
-- }
},
["weapon_smg_mk2"] = {
model = "w_sb_smgmk2",
-- Attachments = {
-- ["COMPONENT_SMG_MK2_CLIP_01"] = {Base = 'WAPClip', Component = "w_sb_smgmk2_mag1"},
-- ["COMPONENT_SMG_MK2_CLIP_02"] = {Base = 'WAPClip', Component = "w_sb_smgmk2_mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SIGHTS"] = {Base = 'WAPScop', Component = "w_at_sights_1"},
-- ["COMPONENT_AT_SCOPE_SMALL"] = {Base = 'WAPScop', Component = "w_at_scope_small"},
-- ["COMPONENT_AT_AR_AFGRIP_02"] = {Base = 'WAPGrip', Component = "w_at_afgrip_2"},
-- }
},
["weapon_gusenberg"] = {
model = "w_sb_gusenberg",
-- Attachments = {
-- ["COMPONENT_GUSENBERG_CLIP_01"] = {Base = 'WAPClip', Component = "w_sb_gusenberg_mag1"},
-- ["COMPONENT_GUSENBERG_CLIP_02"] = {Base = 'WAPClip', Component = "w_sb_gusenberg_mag2"},
-- }
},
-- Sniper Rifles
["weapon_musket"] = { model = "w_ar_musket" },
["weapon_sniperrifle"] = {
model = "w_sr_sniperrifle",
-- Attachments = {
-- ["COMPONENT_SNIPERRIFLE_CLIP_01"] = {Base = 'WAPClip', Component = "w_sr_sniperrifle_mag1"},
-- ["COMPONENT_AT_SCOPE_LARGE"] = {Base = 'WAPScop', Component = "w_at_scope_large"},
-- ["COMPONENT_AT_SCOPE_MAX"] = {Base = 'WAPScop', Component = "w_at_scope_max"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- }
},
-- Shotguns
["weapon_sawnoffshotgun"] = { model = "w_sg_sawnoff" },
["weapon_assaultshotgun"] = {
model = "w_sg_assaultshotgun",
-- Attachments = {
-- ["COMPONENT_ASSAULTSHOTGUN_CLIP_01"] = {Base = 'WAPClip', Component = "w_sg_assaultshotgun_mag1"},
-- ["COMPONENT_ASSAULTSHOTGUN_CLIP_02"] = {Base = 'WAPClip', Component = "w_sg_assaultshotgun_mag2"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_AR_SUPP"] = {Base = 'WAPSupp', Component = "w_at_ar_supp"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "w_at_ar_afgrip"},
-- }
},
["weapon_bullpupshotgun"] = {
model = "w_sg_bullpupshotgun",
-- Attachments = {
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "w_at_ar_afgrip"},
-- }
},
["weapon_pumpshotgun"] = {
model = "w_sg_pumpshotgun",
-- Attachments = {
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_SR_SUPP"] = {Base = 'WAPSupp', Component = "W_AT_AR_SUPP"},
-- }
},
["weapon_heavyshotgun"] = {
model = "w_sg_heavyshotgun",
-- Attachments = {
-- ["COMPONENT_HEAVYSHOTGUN_CLIP_01"] = {Base = 'WAPClip', Component = "w_sg_heavyshotgun_mag1"},
-- ["COMPONENT_HEAVYSHOTGUN_CLIP_02"] = {Base = 'WAPClip', Component = "w_sg_heavyshotgun_mag2"},
-- ["COMPONENT_HEAVYSHOTGUN_CLIP_03"] = {Base = 'WAPClip', Component = "w_sg_heavyshotgun_boxmag"},
-- ["COMPONENT_AT_AR_FLSH"] = {Base = 'WAPFlshLasr', Component = "W_AT_AR_FLSH"},
-- ["COMPONENT_AT_AR_SUPP_02"] = {Base = 'WAPSupp', Component = "w_at_ar_supp_02"},
-- ["COMPONENT_AT_AR_AFGRIP"] = {Base = 'WAPGrip', Component = "w_at_ar_afgrip"},
-- }
},
-- Melee Weapons
["weapon_machete"] = { model = "w_me_machette_lr" },
["weapon_bat"] = { model = "w_me_bat" },
-- Items
["cokebaggy"] = { model = "bkr_prop_coke_cutblock_01" },
["markedbills"] = { model = "prop_money_bag_01" },
["meth"] = { model = "hei_prop_pill_bag_01" },
["weed_brick"] = { model = "bkr_prop_weed_drying_02a" },
["fishingrod"] = { model = "prop_fishing_rod_02" },
["fishingrod2"] = { model = "prop_fishing_rod_01" },
["fishingrod3"] = { model = "prop_fishing_rod_01" },
-- Addon weapons
-- ["weapon_katana"] = { model = "w_me_katana"},
-- ["weapon_remington"] = { model = "w_sg_remington" },
-- ["weapon_mp5"] = { model = "w_sb_mp5" },
-- ["weapon_huntingrifle"] = { model = "w_sr_huntingrifle" },
}
------------------------------
------------------------------
--## DONT CHANGE ANY OF THESE ##--
Config.FrameworkFunctions = {
-- Client-side trigger callback
TriggerCallback = function(...)
if Framework == 'QBCore' then
FWork.Functions.TriggerCallback(...)
else
FWork.TriggerServerCallback(...)
end
end,
-- Server-side register callback
CreateCallback = function(...)
if Framework == 'QBCore' then
FWork.Functions.CreateCallback(...)
else
FWork.RegisterServerCallback(...)
end
end,
GetPlayer = function()
local self = {}
if Framework == 'QBCore' then
player = FWork.Functions.GetPlayerData()
self.PlayerData = { job = { name = player.job.name} }
return self
else
player = FWork.GetPlayerData()
self.PlayerData = { job = { name = player.job.name }}
return self
end
return nil
end,
}
------------------------------
------------------------------
end

View file

@ -0,0 +1,31 @@
lua54 'yes'
fx_version 'cerulean'
game 'gta5'
author 'Discord: zpug'
description 'pug-sling'
version '2.1.3'
shared_scripts {
'config.lua',
'old-sling/config-old.lua',
}
server_script 'server/main.lua'
client_script {
'client/main.lua',
'client/open.lua',
'old-sling/client-old.lua',
}
file 'json/config-weapons.json'
escrow_ignore {
'config.lua',
'client/open.lua',
'server/main.lua',
'json/config-weapons.json',
'old-sling/config-old.lua',
}
dependency '/assetpacks'

View file

@ -0,0 +1 @@
[{"z":0.17,"WeaponModel":"fishingrod","bone":36,"zR":-13.5,"WeaponProp":"prop_fishing_rod_02","yR":103.34645567461848,"xR":-9.01574753224849,"x":0.0,"y":-0.08999999999999},{"z":0.03999999999999,"WeaponModel":"weapon_pistol","bone":36,"zR":0.0,"WeaponProp":"w_pi_pistol","yR":-209.99999856576324,"xR":-185.59054903686048,"x":-0.13999999999999,"y":-0.13999999999999},{"z":0.14999999999999,"WeaponModel":"fishingrod2","bone":36,"zR":-9.0,"WeaponProp":"prop_fishing_rod_01","yR":114.92125941440465,"xR":-18.54330701753497,"x":0.0,"y":-0.10999999999999},{"z":-0.08,"WeaponModel":"weapon_advancedrifle","bone":36,"zR":-1.5,"WeaponProp":"w_ar_advancedrifle","yR":-180.27558963745833,"xR":3.85826759040355,"x":0.06999999999999,"y":-0.14999999999999},{"z":0.03,"WeaponModel":"weapon_bat","bone":36,"zR":-1.5,"WeaponProp":"w_me_bat","yR":95.1181093044579,"xR":-2.36220469698309,"x":0.0,"y":-0.15999999999999},{"z":-0.04999999999999,"WeaponModel":"weapon_carbinerifle_mk2","bone":36,"zR":1.5,"WeaponProp":"w_ar_carbineriflemk2","yR":130.62992081046105,"xR":1.53543286025524,"x":0.29,"y":-0.16999999999999},{"z":0.04999999999999,"WeaponModel":"weapon_carbinerifle","bone":36,"zR":-7.5,"WeaponProp":"w_ar_carbinerifle","yR":64.48818914592266,"xR":0.51181092858314,"x":0.17,"y":0.17},{"z":0.07,"WeaponModel":"weapon_bullpupshotgun","bone":36,"zR":-4.5,"WeaponProp":"w_sg_bullpupshotgun","yR":0.0,"xR":0.0,"x":0.0,"y":-0.13999999999999},{"z":-0.10999999999999,"WeaponModel":"weapon_musket","bone":36,"zR":0.0,"WeaponProp":"w_ar_musket","yR":186.1023604311049,"xR":0.51181094720959,"x":0.39,"y":-0.15999999999999},{"z":0.21,"WeaponModel":"weapon_sawnoffshotgun","bone":36,"zR":-36.0,"WeaponProp":"w_sg_sawnoff","yR":121.37795131653549,"xR":20.82677146419882,"x":0.4,"y":0.02},{"z":0.03,"WeaponModel":"weed_brick","bone":36,"zR":-15.0,"WeaponProp":"bkr_prop_weed_drying_02a","yR":-61.33858216926455,"xR":-1.61417311057448,"x":0.0,"y":-0.2},{"z":0.09,"WeaponModel":"weapon_compactrifle","bone":36,"zR":-4.5,"WeaponProp":"w_ar_assaultrifle_smg","yR":55.31496053561568,"xR":8.14960626885295,"x":0.0,"y":0.17},{"z":0.12999999999999,"WeaponModel":"meth","bone":36,"zR":-19.5,"WeaponProp":"hei_prop_pill_bag_01","yR":96.22047184035182,"xR":-7.5984251499176,"x":-0.24,"y":-0.09999999999999},{"z":0.06,"WeaponModel":"weapon_bullpuprifle","bone":36,"zR":0.0,"WeaponProp":"w_ar_bullpuprifle","yR":0.0,"xR":0.0,"x":0.17,"y":-0.14999999999999},{"z":-0.15,"WeaponModel":"fishingrod3","bone":36,"zR":-15.0,"WeaponProp":"prop_fishing_rod_01","yR":77.51968448981643,"xR":-18.7795277684927,"x":0.0,"y":-0.10999999999999},{"z":0.2,"WeaponModel":"weapon_machete","bone":36,"zR":-1.5,"WeaponProp":"w_me_machette_lr","yR":-75.86614115163684,"xR":-71.1417325772345,"x":-0.06,"y":-0.04999999999999},{"z":0.05,"WeaponModel":"weapon_heavyshotgun","bone":36,"zR":1.5,"WeaponProp":"w_sg_heavyshotgun","yR":61.0629915446043,"xR":-2.75590546429157,"x":0.13999999999999,"y":-0.14999999999999},{"z":0.08,"WeaponModel":"weapon_pumpshotgun","bone":36,"zR":12.0,"WeaponProp":"w_sg_pumpshotgun","yR":83.81889715790749,"xR":1.33858261629939,"x":0.35,"y":-0.15999999999999},{"z":-0.23,"WeaponModel":"cokebaggy","bone":36,"zR":84.0,"WeaponProp":"bkr_prop_coke_cutblock_01","yR":-2.44094524532556,"xR":5.3937011770904,"x":-0.3,"y":0.05},{"z":0.06,"WeaponModel":"weapon_assaultsmg","bone":36,"zR":-6.0,"WeaponProp":"w_sb_assaultsmg","yR":26.57480303198099,"xR":-9.96062995865941,"x":0.11999999999999,"y":-0.14999999999999},{"z":-0.09999999999999,"WeaponModel":"weapon_assaultshotgun","bone":36,"zR":0.0,"WeaponProp":"w_sg_assaultshotgun","yR":39.88188944756985,"xR":-171.22047116979958,"x":0.11999999999999,"y":-0.14999999999999},{"z":0.06,"WeaponModel":"weapon_specialcarbine","bone":36,"zR":0.0,"WeaponProp":"w_ar_specialcarbine","yR":0.39370089769363,"xR":1.18110233917832,"x":0.22,"y":-0.15999999999999},{"z":-0.10999999999999,"WeaponModel":"weapon_sniperrifle","bone":36,"zR":0.0,"WeaponProp":"w_sr_sniperrifle","yR":-1.33858224377036,"xR":185.2755897305906,"x":0.05,"y":-0.14999999999999},{"z":0.09999999999999,"WeaponModel":"weapon_smg","bone":36,"zR":-12.0,"WeaponProp":"w_sb_smg","yR":60.98425174131989,"xR":15.47244081273675,"x":0.19,"y":0.14},{"z":-0.02,"WeaponModel":"weapon_microsmg","bone":36,"zR":-10.5,"WeaponProp":"w_sb_microsmg","yR":66.81102283298969,"xR":180.23622082546354,"x":0.24,"y":0.16},{"z":0.04,"WeaponModel":"weapon_gusenberg","bone":36,"zR":0.0,"WeaponProp":"w_sb_gusenberg","yR":0.0,"xR":0.0,"x":0.28,"y":-0.14999999999999},{"z":-0.15999999999999,"WeaponModel":"markedbills","bone":36,"zR":-10.5,"WeaponProp":"prop_money_bag_01","yR":88.93700690940023,"xR":21.37795263901353,"x":-0.52,"y":-0.07999999999999}]

View file

@ -0,0 +1,107 @@
if Config.UseOldSlingScript then
Config2 = {}
Config2.CoreName = "qb-core" -- Only change this if you have changed your core name.
Config2.Inventory = "qb-inventory" -- Inventory type (ox_inventory, qb-inventory, lj-inventory etc.)
Config2.LoopSpeed = 500 -- How fast the loop to check weapons runs. Lower numbers are lest optimized.
Config2.Placement = {
["Back"] = {
bone = 24816,
x = 0.275, -- up and down
y = -0.165, -- in and out
z = 0.02, -- left and right
x_rotation = 0.0,
y_rotation = 0.0,
z_rotation = 0.0
},
["Front"] = {
bone = 10706,
x = 0.0, -- up and down
y = 0.19, -- in and out
z = -0.25, -- left and right
x_rotation = 0.0, -- flips the gun how you would want
y_rotation = 75.0, -- tilts sideways
z_rotation = 180.0 -- tilts into ped
}
}
Config2.PlacementSecond = {
["Back"] = {
bone = 24816,
x = 0.235, -- up and down
y = -0.165, -- in and out
z = -0.08, -- left and right
x_rotation = 180.0, -- flips the gun how you would want
y_rotation = 0.0, -- tilts sideways
z_rotation = 0.0 -- tilts into ped
},
["Front"] = {
bone = 24816,
x = 0.275, -- up and down
y = -0.165, -- in and out
z = 0.02, -- left and right
x_rotation = 0.0, -- flips the gun how you would want
y_rotation = 0.0, -- tilts sideways
z_rotation = 0.0 -- tilts into ped
}
}
Config2.PlacementThird = {
["Back"] = {
bone = 10706,
x = 0.0, -- up and down
y = 0.19, -- in and out
z = -0.25, -- left and right
x_rotation = 0.0, -- flips the gun how you would want
y_rotation = 75.0, -- tilts sideways
z_rotation = 180.0 -- tilts into ped
},
["Front"] = {
bone = 24816,
x = 0.235, -- up and down
y = -0.165, -- in and out
z = -0.08, -- left and right
x_rotation = 180.0, -- flips the gun how you would want
y_rotation = 0.0, -- tilts sideways
z_rotation = 0.0 -- tilts into ped
}
}
-- To add custom rotations to items or weapons all you need to do is add the "x_rotation = 0.0, y_rotation = 90.0, z_rotation = 0.0"
-- as seen for the "weapon_machete" for example and adjust the values of the rotations.
Config2.WeaponsOnBack = {
-- assault rifles:
["weapon_carbinerifle"] = { model = "w_ar_carbinerifle" },
["weapon_compactrifle"] = { model = "w_ar_assaultrifle_smg" },
["weapon_carbinerifle_mk2"] = { model = "w_ar_carbineriflemk2" },
["weapon_assaultrifle"] = { model = "w_ar_assaultrifle" },
["weapon_specialcarbine"] = { model = "w_ar_specialcarbine" },
["weapon_bullpuprifle"] = { model = "w_ar_bullpuprifle" },
["weapon_advancedrifle"] = { model = "w_ar_advancedrifle" },
-- sub machine guns:
["weapon_microsmg"] = { model = "w_sb_microsmg" },
["weapon_assaultsmg"] = { model = "w_sb_assaultsmg" },
["weapon_smg"] = { model = "w_sb_smg" },
["weapon_smg_mk2"] = { model = "w_sb_smgmk2" },
["weapon_gusenberg"] = { model = "w_sb_gusenberg" },
-- sniper rifles:
["weapon_sniperrifle"] = { model = "w_sr_sniperrifle" },
-- shotguns:
["weapon_sawnoffshotgun"] = { model = "w_sg_sawnoff" },
["weapon_assaultshotgun"] = { model = "w_sg_assaultshotgun" },
["weapon_bullpupshotgun"] = { model = "w_sg_bullpupshotgun" },
["weapon_pumpshotgun"] = { model = "w_sg_pumpshotgun" },
["weapon_musket"] = { model = "w_ar_musket" },
["weapon_heavyshotgun"] = { model = "w_sg_heavyshotgun" },
-- mele weapons
["weapon_machete"] = { model = "w_me_machette_lr", x_rotation = 0.0, y_rotation = 90.0, z_rotation = 0.0 },
["weapon_bat"] = { model = "w_me_bat", x_rotation = 0.0, y_rotation = 90.0, z_rotation = 0.0 },
["coke_brick"] = { model = "bkr_prop_coke_cutblock_01", x_rotation = 0.0, y_rotation = 90.0, z_rotation = 90.0 },
["markedbills"] = { model = "prop_money_bag_01", x_rotation = 0.0, y_rotation = 90.0, z_rotation = 0.0 },
-- Addon weapons
["weapon_katana"] = { model = "w_me_katana", x_rotation = 0.0, y_rotation = 90.0, z_rotation = 0.0 },
["weapon_remington"] = { model = "w_sg_remington" },
["weapon_mp5"] = { model = "w_sb_mp5" },
["weapon_huntingrifle"] = { model = "w_sr_huntingrifle" },
}
end

View file

@ -0,0 +1,40 @@
# pug-sling
Advanced weapons slings for the qbcore framework. Any weapon in the players inventory will show up on there back.
# -- if you are using ox_inventory make sure to change Config.Inventory no other inventory name matters.
# -- If you are using illenium-appearance make sure to head to illenium-appearance/server/server.lua and replace these commands with these.
lib.addCommand("reloadskin", { help = _L("commands.reloadskin.title") }, function(source)
local src = source
TriggerClientEvent("illenium-appearance:client:reloadSkin", src)
Wait(500)
TriggerClientEvent("Pug:ReloadGuns:sling", src)
end)
lib.addCommand("clearstuckprops", { help = _L("commands.clearstuckprops.title") }, function(source)
local src = source
TriggerClientEvent("illenium-appearance:client:ClearStuckProps", src)
Wait(500)
TriggerClientEvent("Pug:ReloadGuns:sling", src)
end)
# --
# -- Support
Full support provided in my discord here: https://discord.gg/jYZuWYjfvq
# --
# -- My other scripts
https://pug-webstore.tebex.io/
# --
# -- Config file
To add a new weapon you must change the first option to the qbcore shared.lua.
# --
# -- Commands
`/sling` - Will toggle the weapon placement on the front and back.
# --
# -- Use this event to clear items stuck on players without removing the weapons on the players back
TriggerEvent("Pug:ReloadGuns:sling")
# --

View file

@ -0,0 +1,56 @@
# pug-sling 2.0
# -- If you are using illenium-appearance make sure to head to illenium-appearance/server/server.lua and replace these commands with these.
lib.addCommand("reloadskin", { help = _L("commands.reloadskin.title") }, function(source)
local src = source
TriggerClientEvent("illenium-appearance:client:reloadSkin", src)
Wait(500)
TriggerClientEvent("Pug:ReloadGuns:sling", src)
end)
lib.addCommand("clearstuckprops", { help = _L("commands.clearstuckprops.title") }, function(source)
local src = source
TriggerClientEvent("illenium-appearance:client:ClearStuckProps", src)
Wait(500)
TriggerClientEvent("Pug:ReloadGuns:sling", src)
end)
# --
# -- Use this event to clear items stuck on players without removing the weapons on the players back
TriggerEvent("Pug:ReloadGuns:sling")
# --
Advanced Weapon Sling | Weapons On Back: For any questions please contact me here: https://discord.com/invite/jYZuWYjfvq
PREVIEW HERE: https://youtu.be/hluGYRiVY1E
This script is partially locked using escrow encryption. Most of the script is accessible in client/open.lua, and config.lua.
Full QBCore & ESX Compatibility.
This completely configurable script consist of:
● Wearable weapons and items that are placed onto the player when they have the set weapon or item anywhere within their inventory.
● Advanced system controlling and moving around items/weapons in 3D space to get the best position of where the items/weapons should sit on the player.
● Option for individual players to tailor the placement of items and weapons on their characters, enabling unique item positioning for each player. (QBCORE ONLY)
● Full control over the items/weapons with the ability to adjust rotation, XYZ position, and edit the entire script from in-game without doing any code or configuring.
● /rack Command Utilizes the custom weapon racking system, which is exclusively available for select jobs and used to store weapons in emergency service vehicles.
● Version 1.0 comes with this script and is a completely different system shown off and explained in the video.
● Anti-Car tornadoing mechanics designed to prevent car tornadoing from ever occurring on your server.
● /weaponposition command for individual players to set personal weapon and item placements (optional).
● /setweapon command to begin editing where the weapons/items should sit on the player.
● Advanced checks to avoid and stop car tornadoing that occurs in every FiveM server.
● 30 weapons and items pre-configured for you.
● 0:00 ms ResMon for complete optimization.
● qb-inventory support.
● ox_inventory support.
● qs-inventory support.
● ps-inventory support.
● Request inventory support and i will do it for this script if it is possible.
Requirements consist of:
QBCore OR ESX (other frameworks will work but not supported)
qb-inventory OR ox_inventory OR qs-inventory OR ps-inventory (any qb-inventory resource name changed will work)
1400 LINES OF CODE

View file

@ -0,0 +1,65 @@
if not Config.UseOldSlingScript then
Config.FrameworkFunctions.CreateCallback('Pug:server:GetWeaponConfig', function(source, cb)
local File = LoadResourceFile(GetCurrentResourceName(), "./json/config-weapons.json")
cb(File)
end)
RegisterNetEvent("Pug:server:SaveWeaponFile", function(JsonWeapons, Personal)
local src = source
if Personal then
if Framework == "QBCore" then
local Player = FWork.Functions.GetPlayer(src)
if Player ~= nil then
Player.Functions.SetMetaData("pug-weapondata", JsonWeapons)
Player.Functions.Save()
end
else
end
else
local JsonWeapon = json.encode(JsonWeapons)
SaveResourceFile(GetCurrentResourceName(), "./json/config-weapons.json", JsonWeapon)
TriggerClientEvent("Pug:client:RegisterAllBackWeapons", -1, JsonWeapon)
end
end)
---------- [OX_INVENTORY RACK STASH SUPPORT] ----------
local StashCreated = {}
RegisterNetEvent("Pug:server:SlingOpenOxInvRack", function(StashName, Slots, Space)
if not StashCreated[StashName] then
StashCreated[StashName] = true
exports.ox_inventory:RegisterStash(
StashName,
StashName,
Slots,
Space
)
end
end)
------------------------------
---------- [Commands] ----------
if Framework == "QBCore" then
FWork.Commands.Add(Config.WeaponSettingCommand, "Adjust server weapons positions", {}, false, function(source, args)
local src = source
TriggerClientEvent("Pug:client:OpenSlingEditor",src)
end,"admin")
FWork.Commands.Add(Config.PersonalWeponSettingsCommand, "Adjust personal weapons positions", {}, false, function(source, args)
local src = source
TriggerClientEvent("Pug:client:OpenSlingEditor",src, true)
end)
else
FWork.RegisterCommand(Config.WeaponSettingCommand, 'admin', function(xPlayer, args)
local src = xPlayer.source
TriggerClientEvent("Pug:client:OpenSlingEditor",src)
end, true, {help = 'Create business menu', validate = true, arguments = {} })
FWork.RegisterCommand(Config.PersonalWeponSettingsCommand, 'admin', function(xPlayer, args)
local src = xPlayer.source
TriggerClientEvent("Pug:client:OpenSlingEditor",src, true)
end, true, {help = 'Create business menu', validate = true, arguments = {} })
end
------------------------------
end