🚗 Garage
Access a comprehensive guide that includes a detailed installation process, examples of code, previews of configurations.
Garages use a different database than those from the Framework
INSTALLATION GUIDE
Step 0 - First Steps
Step 1 - Configure Resources
Step 2 - Import SQL
CREATE TABLE `is_garage` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`owner` longtext,
`model` varchar(50),
`hash` bigint(20),
`vin` varchar(50),
`plate` varchar(25),
`status` longtext,
`parked` longtext,
`fuel` int(11),
`engine` int(11),
`body` int(11),
`distance` float(10,2),
`mods` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
CREATE TABLE `is_garage_codes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(100),
`code` varchar(100),
`package` int(11),
`count` int(11),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
CREATE TABLE `is_garage_keys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`identifier` varchar(100),
`name` varchar(100),
`vin` varchar(100),
`favorite` tinyint(1),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
ALTER TABLE `is_garage` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=84;
ALTER TABLE `is_garage_codes` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
ALTER TABLE `is_garage_keys` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=66;
COMMIT;
Step 3 - Tebex Integration
Step 4 - Package Integration
Step 5 - Converting Vehicles
Step 6 - Snippet for Vehicle Shops
QBCore
qb-vehicleshop
-> client.lua
Search
{
header = Lang:t('menus.freeuse_buy_header'),
txt = Lang:t('menus.freeuse_buy_txt'),
icon = 'fa-solid fa-hand-holding-dollar',
params = {
isServer = true,
event = 'qb-vehicleshop:server:buyShowroomVehicle',
args = {
buyVehicle = Config.Shops[insideShop]['ShowroomVehicles'][ClosestVehicle].chosenVehicle
}
}
},
{
header = Lang:t('menus.finance_header'),
txt = Lang:t('menus.freeuse_finance_txt'),
icon = 'fa-solid fa-coins',
params = {
event = 'qb-vehicleshop:client:openFinance',
args = {
price = getVehPrice(),
buyVehicle = Config.Shops[insideShop]['ShowroomVehicles'][ClosestVehicle].chosenVehicle
}
}
},
Replace to
{
header = Lang:t('menus.freeuse_buy_header'),
txt = Lang:t('menus.freeuse_buy_txt'),
icon = 'fa-solid fa-hand-holding-dollar',
params = {
isServer = true,
event = 'qb-vehicleshop:server:buyShowroomVehicle',
args = {
buyVehicle = Config.Shops[insideShop]['ShowroomVehicles'][ClosestVehicle].chosenVehicle,
shop = insideShop,
}
}
},
-- {
-- header = Lang:t('menus.finance_header'),
-- txt = Lang:t('menus.freeuse_finance_txt'),
-- icon = 'fa-solid fa-coins',
-- params = {
-- event = 'qb-vehicleshop:client:openFinance',
-- args = {
-- price = getVehPrice(),
-- buyVehicle = Config.Shops[insideShop]['ShowroomVehicles'][ClosestVehicle].chosenVehicle
-- }
-- }
-- },
qb-vehicleshop
-> server.lua
Search
RegisterNetEvent('qb-vehicleshop:server:buyShowroomVehicle', function(vehicle)
local src = source
vehicle = vehicle.buyVehicle
local pData = QBCore.Functions.GetPlayer(src)
local cid = pData.PlayerData.citizenid
local cash = pData.PlayerData.money['cash']
local bank = pData.PlayerData.money['bank']
local vehiclePrice = QBCore.Shared.Vehicles[vehicle]['price']
local plate = GeneratePlate()
if cash > tonumber(vehiclePrice) then
MySQL.insert('INSERT INTO player_vehicles (license, citizenid, vehicle, hash, mods, plate, garage, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', {
pData.PlayerData.license,
cid,
vehicle,
GetHashKey(vehicle),
'{}',
plate,
'pillboxgarage',
0
})
TriggerClientEvent('QBCore:Notify', src, Lang:t('success.purchased'), 'success')
TriggerClientEvent('qb-vehicleshop:client:buyShowroomVehicle', src, vehicle, plate)
pData.Functions.RemoveMoney('cash', vehiclePrice, 'vehicle-bought-in-showroom')
elseif bank > tonumber(vehiclePrice) then
MySQL.insert('INSERT INTO player_vehicles (license, citizenid, vehicle, hash, mods, plate, garage, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', {
pData.PlayerData.license,
cid,
vehicle,
GetHashKey(vehicle),
'{}',
plate,
'pillboxgarage',
0
})
TriggerClientEvent('QBCore:Notify', src, Lang:t('success.purchased'), 'success')
TriggerClientEvent('qb-vehicleshop:client:buyShowroomVehicle', src, vehicle, plate)
pData.Functions.RemoveMoney('bank', vehiclePrice, 'vehicle-bought-in-showroom')
else
TriggerClientEvent('QBCore:Notify', src, Lang:t('error.notenoughmoney'), 'error')
end
end)
Replace to
RegisterNetEvent('qb-vehicleshop:server:buyShowroomVehicle', function(data)
local src = source
local vehicle = data.buyVehicle
local shop = data.shop
local vehiclePrice = QBCore.Shared.Vehicles[vehicle]['price']
local plate = GeneratePlate()
local pData = QBCore.Functions.GetPlayer(src)
local cash = pData.PlayerData.money['cash']
local bank = pData.PlayerData.money['bank']
if cash > tonumber(vehiclePrice) then
pData.Functions.RemoveMoney('cash', vehiclePrice, 'vehicle-bought-in-showroom')
elseif bank > tonumber(vehiclePrice) then
pData.Functions.RemoveMoney('bank', vehiclePrice, 'vehicle-bought-in-showroom')
else
TriggerClientEvent('QBCore:Notify', src, Lang:t('error.notenoughmoney'), 'error')
return
end
TriggerClientEvent('QBCore:Notify', src, Lang:t('success.purchased'), 'success')
TriggerEvent("is_garage:createVehicle", {
model = vehicle,
hash = GetHashKey(vehicle),
plate = plate,
parked = {
coords = Config.Shops[shop].VehicleSpawn,
street = Config.Shops[shop].ShopLabel,
},
}, src)
end)
QBox
Go to qbx_vehicleshop/config/shared.lua
and set finance.enable
to false
qbx_vehicleshop
-> server
-> main.lua
Search
RegisterNetEvent('qbx_vehicleshop:server:buyShowroomVehicle', function(vehicle)
local src = source
local shopId = GetShopZone(src)
local shop = sharedConfig.shops[shopId]
if not shop then return end
if not CheckVehicleList(vehicle, shopId) then
return exports.qbx_core:Notify(src, locale('error.notallowed'), 'error')
end
local coords = GetClearSpawnArea(shop.vehicleSpawns)
if not coords then
return exports.qbx_core:Notify(src, locale('error.no_clear_spawn'), 'error')
end
local player = exports.qbx_core:GetPlayer(src)
local vehiclePrice = COREVEHICLES[vehicle].price
if not RemoveMoney(src, vehiclePrice, 'vehicle-bought-in-showroom') then
return exports.qbx_core:Notify(src, locale('error.notenoughmoney'), 'error')
end
local vehicleId = exports.qbx_vehicles:CreatePlayerVehicle({
model = vehicle,
citizenid = player.PlayerData.citizenid,
})
exports.qbx_core:Notify(src, locale('success.purchased'), 'success')
SpawnVehicle(src, {
coords = coords,
vehicleId = vehicleId
})
end)
Replace to
RegisterNetEvent('qbx_vehicleshop:server:buyShowroomVehicle', function(vehicle)
local src = source
local shopId = GetShopZone(src)
local shop = sharedConfig.shops[shopId]
if not shop then return end
if not CheckVehicleList(vehicle, shopId) then
return exports.qbx_core:Notify(src, locale('error.notallowed'), 'error')
end
local coords = GetClearSpawnArea(shop.vehicleSpawns)
if not coords then
return exports.qbx_core:Notify(src, locale('error.no_clear_spawn'), 'error')
end
local player = exports.qbx_core:GetPlayer(src)
local vehiclePrice = COREVEHICLES[vehicle].price
if not RemoveMoney(src, vehiclePrice, 'vehicle-bought-in-showroom') then
return exports.qbx_core:Notify(src, locale('error.notenoughmoney'), 'error')
end
TriggerEvent("is_garage:createVehicle", {
model = vehicle,
hash = GetHashKey(vehicle),
plate = qbx.generateRandomPlate(),
parked = {
coords = coords,
street = shop.blip.label,
},
}, src)
exports.qbx_core:Notify(src, locale('success.purchased'), 'success')
end)
Last updated