⚡ LG Thunder Garage Documentation
LG Thunder Garage is a complete vehicle garage system for ESX, QB-Core and QBox, featuring public garages, private garages, job fleets, impounds, persistent vehicle conditions, garage transfers and an advanced vehicle management interface.
📋 Requirements
Required
- FiveM server using OneSync
ox_liboxmysql- One supported framework:
es_extendedqb-coreqbx_core
Optional
Depending on your configuration:
ox_targetqb-target- Fuel system
- Vehicle key system
- Banking system
- Society account system
- Notification system
- Mileage system
- Mechanic system
- Dealership system
- Discord webhook
📦 Installation
1. Download the Resource
Download LG Thunder Garage through your Cfx account after purchasing it from Tebex.
Keep the resource folder name as:
LG-ThunderGaragePlace it inside your server resources directory:
resources/[lg]/LG-ThunderGarage2. Start Required Dependencies
Add the following resources to server.cfg in the correct order.
ESX
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure ox_target
ensure LG-ThunderGarageQB-Core
ensure oxmysql
ensure ox_lib
ensure qb-core
ensure ox_target
ensure LG-ThunderGarageQBox
ensure oxmysql
ensure ox_lib
ensure qbx_core
ensure ox_target
ensure LG-ThunderGarageStart your fuel, vehicle key, banking and notification resources before LG Thunder Garage.
🗄️ Database Installation
LG Thunder Garage can automatically create and repair the required database columns.
Open:
config/advanced.luaDefault setting:
Config.AutoRunSQL = trueWhen enabled, the resource checks the database structure during startup and adds missing fields using non-destructive CREATE and ALTER operations.
Manual SQL Installation
Disable automatic SQL installation:
Config.AutoRunSQL = falseThen import the correct SQL file.
ESX
sql/run-esx.sqlDefault vehicle table:
owned_vehiclesQB-Core / QBox
sql/run-qb.sqlDefault vehicle table:
player_vehiclesA universal repair file is also included:
sql/sql_fix_columns.sql⚙️ Framework Configuration
Open:
config/core.luaSet your framework:
Config.Framework = "ESX"Supported values:
Config.Framework = "auto"
Config.Framework = "ESX"
Config.Framework = "QBCore"
Config.Framework = "Qbox"auto attempts to detect the currently running supported framework.
For production servers, selecting the framework explicitly is recommended.
🌍 Language Configuration
Open:
config/core.luaSet the language:
Config.Locale = "en"Included locale codes:
en English
cn Simplified Chinese
de German
fr French
es Spanish
it Italian
pt Portuguese
nl Dutch
sv Swedish
da Danish
fi Finnish
cs Czech
hu Hungarian
ro Romanian
lt Lithuanian
bg Bulgarian
vi VietnameseCurrency and number formatting can also be configured:
Config.NumberAndDateFormat = "en-US"
Config.Currency = "USD"Example for Simplified Chinese:
Config.NumberAndDateFormat = "zh-CN"
Config.Currency = "CNY"🎨 Interface Configuration
Interface settings are located in:
config/core.luaLGGarageConfig.Interface = {
Theme = "thunder-vault",
EnableAnimations = true,
EnableVehicleImages = true,
VehicleImageFormat = "png",
VehicleImageFallback = "technical",
Scale = 1.0,
ShowBrandSignature = true
}Disable Animations
Config.Interface.EnableAnimations = falseInterface Scale
Config.Interface.Scale = 1.0Examples:
Config.Interface.Scale = 0.9
Config.Interface.Scale = 1.1Use the default value unless the interface is too large or too small for your server's preferred resolution.
🖼️ Vehicle Images
Real vehicle side-view images are optional.
Enable Vehicle Images
Config.Interface.EnableVehicleImages = trueDisable Vehicle Images
Config.Interface.EnableVehicleImages = falseWhen disabled, the interface uses included technical SVG vehicle graphics.
Adding Vehicle Images
Place vehicle images inside:
vehicle_images/The file name must match the lowercase vehicle spawn name.
Example vehicle:
model = "sultanrs"Required image name:
vehicle_images/sultanrs.pngAdditional examples:
vehicle_images/police.png
vehicle_images/ambulance.png
vehicle_images/taxi.png
vehicle_images/towtruck.pngRecommended image specifications:
Format: PNG
Background: Transparent
View: Side profile
Recommended size: 800 × 400 or larger
File name: Lowercase vehicle spawn codeWhen an image is missing, the interface automatically falls back to the appropriate technical SVG category.
Available fallback categories include:
- Sedan
- Utility vehicle
- Emergency vehicle
- Motorcycle
- Boat
- Aircraft
Change Image Format
Config.Interface.VehicleImageFormat = "webp"When using WebP, all vehicle image files must use:
vehicle_images/<model>.webp🎯 Interaction Configuration
Open:
config/core.luaTarget Interaction
Config.UseTarget = true
Config.Target = "ox_target"Supported target providers:
Config.Target = "auto"
Config.Target = "ox_target"
Config.Target = "qb-target"To disable target interaction:
Config.UseTarget = falseThe resource will then use configurable key and TextUI interactions.
Interaction Ped
Config.TargetPed = "s_m_m_autoshop_02"Keybinds
Config.OpenGarageKeyBind = 38
Config.OpenImpoundKeyBind = 38
Config.InsertVehicleKeyBind = 38
Config.ExitInteriorKeyBind = 38Key 38 is the default FiveM E key.
Prompts
Config.OpenGaragePrompt = "[E] Open Garage"
Config.OpenImpoundPrompt = "[E] Open Impound"
Config.InsertVehiclePrompt = "[E] Store Vehicle"
Config.ExitInteriorPrompt = "[E] Exit Garage"💬 TextUI Configuration
Supported TextUI providers:
Config.DrawText = "auto"
Config.DrawText = "ox_lib"
Config.DrawText = "okokTextUI"
Config.DrawText = "ps-ui"Recommended:
Config.DrawText = "ox_lib"🔔 Notification Configuration
Supported notification providers:
Config.Notifications = "auto"
Config.Notifications = "ox_lib"
Config.Notifications = "okokNotify"
Config.Notifications = "ps-ui"Recommended:
Config.Notifications = "ox_lib"⛽ Fuel Configuration
Set the fuel resource in:
config/core.luaExample:
Config.FuelSystem = "ox_fuel"Included adapters support:
ox_fuel
LegacyFuel
ps-fuel
lj-fuel
cdn-fuel
hyon_gas_station
okokGasStation
nd_fuel
myFuel
ti_fuel
Renewed-Fuel
rcore_fuelMake sure the selected fuel resource is started before LG Thunder Garage.
🔑 Vehicle Key Configuration
Automatic key-system detection:
Config.VehicleKeys = "auto"Disable key integration:
Config.VehicleKeys = "none"Included adapters support:
qb-vehiclekeys
MrNewbVehicleKeys
jaksam-vehicles-keys
qs-vehiclekeys
mk_vehiclekeys
wasabi_carlock
cd_garage
okokGarage
t1ger_keys
Renewed-Vehiclekeys
tgiann-hotwireExample:
Config.VehicleKeys = "qb-vehiclekeys"🏦 Banking Configuration
Example:
Config.Banking = "okokBanking"Included banking adapters support:
auto
Renewed-Banking
okokBanking
fd_banking
qb-banking
qb-management
esx_addonaccountUse:
Config.Banking = "auto"to let the resource select an available supported banking integration.
🏢 Public Garages
Public garages are configured in:
config/public_garages.luaBasic Car Garage Example
Config.GarageLocations["Example Garage"] = {
coords = vector3(215.09, -805.17, 30.81),
spawn = {
vector4(216.84, -802.02, 30.78, 69.82),
vector4(218.09, -799.42, 30.76, 66.17),
vector4(219.29, -797.23, 30.75, 65.40)
},
distance = 18,
type = "car",
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.7
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3
},
color = {
r = 255,
g = 255,
b = 255,
a = 120
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0
}
}Garage Types
type = "car"
type = "sea"
type = "air"Vehicle types must match the garage type.
Important Rules
- Every garage name must be unique.
- Do not rename an existing garage after vehicles have been stored there unless you also update their
garage_iddatabase value. - Spawn points should be placed on clear and level surfaces.
- Add multiple spawn points to reduce blocked vehicle spawns.
- Do not place car spawn points inside buildings or props.
👮 Job Garages
Job garages are configured in:
config/job_garages.luaJob Garage Example
Config.JobGarageLocations["Police Garage"] = {
coords = vector3(445.01, -1018.51, 28.63),
spawn = {
vector4(445.98, -1024.88, 27.23, 5.70),
vector4(449.10, -1025.20, 27.23, 5.70)
},
distance = 18,
job = {
"police"
},
type = "car",
hideBlip = false,
blip = {
id = 357,
color = 3,
scale = 0.7
},
hideMarkers = false,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3
},
color = {
r = 255,
g = 255,
b = 255,
a = 120
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0
},
vehiclesType = "spawner",
showLiveriesExtrasMenu = true,
vehicles = {
{
model = "police",
plate = "PD",
minJobGrade = 0,
nickname = "Police Cruiser",
livery = 1,
extras = {
1,
2
},
maxMods = true
},
{
model = "police2",
plate = false,
minJobGrade = 3,
nickname = "Advanced Police Cruiser",
livery = 2,
extras = {},
maxMods = true
}
}
}Vehicle Types
vehiclesType = "spawner"Vehicles are generated from the configured vehicle list.
vehiclesType = "owned"Vehicles are stored as job-owned vehicles in the database.
vehiclesType = "personal"The garage uses the player's personal vehicles while restricting garage access by job.
Vehicle Options
model = "police"Vehicle spawn name.
plate = falseGenerates a random plate.
plate = "PD"Uses a configured plate prefix or value.
Do not use a fixed plate already assigned to another database vehicle.
minJobGrade = 0Minimum required job grade.
nickname = "Police Cruiser"Vehicle name displayed in the interface.
livery = 1Default vehicle livery.
extras = { 1, 2 }Enabled vehicle extras.
maxMods = trueApplies maximum vehicle modifications where supported.
🏴 Gang Garages
Gang garage settings are located in:
config/gang_garages.luaGang garages are disabled by default for the ESX configuration.
Config.Gangs = false
Config.GangEnableCustomESXIntegration = falseQB-Core and QBox gang support can use framework gang data.
Supported external gang integration:
Config.Gangs = "rcore_gangs"Custom ESX gang systems require manual bridge integration in:
bridge/client/functions.lua
bridge/server/functions.luaDo not enable gang garages until your gang resource is correctly connected.
🔐 Private Garages
Private garage settings are located in:
config/private_garages.luaDefault creation command:
/privategaragesAllowed jobs:
Config.PrivGarageCreateJobRestriction = {
"realestate"
}Multiple jobs can be added:
Config.PrivGarageCreateJobRestriction = {
"realestate",
"government"
}Private garage interiors:
Config.PrivGarageEnableInteriors = falsePrivate garage blips:
Config.PrivGarageHideBlips = falseBlip settings:
Config.PrivGarageBlip = {
id = 357,
color = 0,
scale = 0.7
}Private garages are stored in:
player_priv_garages🚨 Vehicle Impounds
Impound settings are located in:
config/impounds.luaDefault command:
/ivThe server validates whether the player has access to the selected impound location.
Impound Location Example
Config.ImpoundLocations["Police Impound"] = {
coords = vector3(404.99, -1626.91, 29.29),
spawn = {
vector4(409.87, -1647.58, 28.88, 228.80)
},
distance = 5,
type = "car",
job = {
"police"
},
hideBlip = false,
blip = {
id = 68,
color = 0,
scale = 0.7
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3
},
color = {
r = 255,
g = 255,
b = 255,
a = 120
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0
}
}Impound Time Options
Config.ImpoundTimeOptions = {
0,
1,
4,
12,
24,
72,
168
}Values are in hours.
Society Fund
Disable society income:
Config.ImpoundFeesSocietyFund = falseSend fees to the police society account:
Config.ImpoundFeesSocietyFund = "police"The selected banking integration must support society accounts.
🔄 Vehicle Transfers
Transfer settings are located in:
config/core.luaConfig.EnableTransfers = {
betweenGarages = true,
betweenPlayers = true
}Garage Transfer Cost
Config.GarageVehicleTransferCost = 1500Hide Player Names
Config.TransferHidePlayerNames = falseRestrict Unregistered Garages
Config.DisableTransfersToUnregisteredGarages = trueVehicle Transfer Blacklist
Open:
config/advanced.luaConfig.PlayerTransferBlacklist = {
"police",
"ambulance"
}Use vehicle spawn names in lowercase.
🔧 Vehicle Storage Settings
Config.SaveVehicleDamage = true
Config.AdvancedVehicleDamage = true
Config.SaveVehiclePropsOnInsert = true
Config.CheckVehicleModel = trueServer-Side Spawning
Config.SpawnVehiclesWithServerSetter = falseEnable only when your server environment and OneSync configuration support the selected spawning method.
Spawn Outside Vehicle
Config.DoNotSpawnInsideVehicle = falseWhen false, the player is placed inside the retrieved vehicle.
Duplicate Spawn Protection
Config.AllowInfiniteVehicleSpawns = false
Config.JobGaragesAllowInfiniteVehicleSpawns = false
Config.GangGaragesAllowInfiniteVehicleSpawns = falseKeep these disabled to prevent the same database vehicle from being spawned repeatedly.
💰 Recovery and Return Fees
Vehicle recovery cost:
Config.GarageVehicleReturnCost = 1000Transfer cost:
Config.GarageVehicleTransferCost = 1500Send recovery fees to a society account:
Config.GarageVehicleReturnCostSocietyFund = "mechanic"Disable society payment:
Config.GarageVehicleReturnCostSocietyFund = false🛠️ Commands
Player and Job Commands
| Command | Description |
|---|---|
/iv | Opens the vehicle impound form for authorized jobs |
/privategarages | Opens private garage management for permitted jobs |
Administrator Commands
| Command | Description |
|---|---|
/vplate | Change a database vehicle plate |
/dvdb | Delete the current vehicle from the database |
/vreturn [plate] | Force a vehicle back into a garage |
/setjobvehicle [job] [grade] | Convert the current owned vehicle into a job vehicle |
/removejobvehicle [playerId] | Convert the current job vehicle into a personal vehicle owned by the selected player |
/setgangvehicle [gang] [grade] | Convert the current owned vehicle into a gang vehicle |
/removegangvehicle [playerId] | Convert the current gang vehicle into a personal vehicle owned by the selected player |
Administrator permissions are checked through the selected framework bridge.
Debug Commands
Available only when:
Config.Debug = trueCommands:
/testgaragemenu [garage name]
/testgarageinterior [garage name]Keep debug mode disabled on production servers:
Config.Debug = false🔌 Exports
Client Export
Get the current vehicle condition:
local stats = exports["LG-ThunderGarage"]:GetCurrentVehicleStats()Example result:
{
engine = 1000.0,
body = 1000.0,
fuel = 85.0,
enginePercent = 100.0,
bodyPercent = 100.0,
fuelPercent = 85.0,
engineDisplay = "100.0%",
bodyDisplay = "100.0%",
fuelDisplay = "85.0%"
}Server Export: Get All Garages
local garages = exports["LG-ThunderGarage"]:getAllGarages()Server Export: Impound Vehicle
exports["LG-ThunderGarage"]:impoundVehicle(
source,
plate,
impoundId,
reason,
retrievable,
retrievalDate,
retrievalCost,
vehicleProps,
fuel,
engine,
body,
damage,
retrievalTimestamp
)This is an advanced server-side export. Validate all supplied data before calling it from another resource.
🧩 Custom Hooks
Custom client hooks are located in:
config/client.luaVehicle Stored
RegisterNetEvent("lg-thundergarage:client:InsertVehicle:config", function(vehicle, vehicleDbData, type)
-- Custom code
end)Vehicle Retrieved
RegisterNetEvent("lg-thundergarage:client:TakeOutVehicle:config", function(vehicle, vehicleDbData, type)
-- Custom code
end)Vehicle Impounded
RegisterNetEvent("lg-thundergarage:client:ImpoundVehicle:config", function(vehicle)
-- Custom code
end)Vehicle Transferred
RegisterNetEvent("lg-thundergarage:client:TransferVehicle:config", function(plate, newOwnerPlayerId)
-- Custom code
end)Custom Storage Verification
RegisterNetEvent("lg-thundergarage:client:insert-vehicle-verification", function(
vehicle,
plate,
garageId,
vehicleDbData,
props,
fuel,
body,
engine,
damageModel,
cb
)
cb(true)
end)Return false to block vehicle storage.
Custom Retrieval Verification
lib.callback.register("lg-thundergarage:client:takeout-vehicle-verification", function(
plate,
vehicleDbData,
garageId
)
return true
end)Return false to block vehicle retrieval.
🔒 Asset Escrow
The core Lua modules may be protected by the official Cfx Asset Escrow system.
Editable files should include:
config/
locales/
sql/
vehicle_images/Do not modify protected files unless an unlocked version is explicitly provided.
The resource does not require:
- External license tokens
- IP locking
- Remote code execution
- Mandatory Discord verification
- Additional account registration
Entitlement is handled through the official Cfx asset system.
❓ Troubleshooting
The Resource Does Not Start
Confirm the start order:
ensure oxmysql
ensure ox_lib
ensure your_framework
ensure your_target
ensure LG-ThunderGarageCheck the server console for missing dependencies or framework selection errors.
Framework Detection Error
Set the framework manually:
Config.Framework = "ESX"or:
Config.Framework = "QBCore"or:
Config.Framework = "Qbox"Make sure the framework starts before LG Thunder Garage.
Garage Does Not Appear
Check:
Config.UseTarget = true
Config.Target = "ox_target"Confirm that:
- The target resource is running.
- The garage coordinates are correct.
- The player is within the configured distance.
- The garage job restriction matches the player's job.
hideBliponly controls the map icon and does not remove the garage.- The garage name is unique.
Vehicle Does Not Spawn
Check:
- Vehicle model exists and streams correctly.
- Spawn points are not blocked.
- Spawn coordinates are above the ground.
- Garage type matches the vehicle type.
- The vehicle is not already outside.
- Duplicate spawn protection is not rejecting an existing vehicle.
- Server-side vehicle spawning is disabled if unsupported.
Recommended setting:
Config.SpawnVehiclesWithServerSetter = falseVehicle Images Are Missing
Check:
Config.Interface.EnableVehicleImages = true
Config.Interface.VehicleImageFormat = "png"Confirm the file name matches the lowercase spawn model:
vehicle_images/sultanrs.pngDo not use the display label:
Karin Sultan RS.pngThe correct file name uses the actual spawn code.
Vehicle Keys Are Not Given
Set the exact key resource:
Config.VehicleKeys = "qb-vehiclekeys"Confirm the selected key resource starts before LG Thunder Garage.
Use:
Config.VehicleKeys = "auto"only when one supported key system is running.
Fuel Is Not Saved Correctly
Set the exact fuel provider:
Config.FuelSystem = "ox_fuel"Confirm that the selected fuel resource supports the expected exports and is started before the garage.
Database Column Error
Enable automatic SQL repair:
Config.AutoRunSQL = trueRestart the resource and review the server console.
Alternatively, import:
sql/run-esx.sqlor:
sql/run-qb.sqlUI Appears on Resource Start
The interface should remain hidden until a garage is opened.
Check for:
- Modified
web/index.html - Other resources forcing NUI focus
- Cached old resource files
- Duplicate copies of the garage resource
Clear the FiveM client cache and ensure only one copy of LG Thunder Garage is running.
Player Cannot Retrieve an Impounded Vehicle
Check:
impound_retrievabledatabase value- Retrieval timestamp
- Retrieval cost
- Player bank balance
- Selected impound location
- Impound vehicle type
- Job restrictions
- Banking integration
Restricted impounds cannot be bypassed through the interface.
💬 Support
Before requesting support, prepare:
- Framework and version
- Server artifact version
- Full server console error
- Full client F8 error
- Relevant configuration section
- Database structure
- Steps required to reproduce the problem
- Video or screenshot where applicable
Support link:
INSERT_YOUR_SUPPORT_LINKDocumentation website:
INSERT_YOUR_DOCUMENTATION_LINKTebex store:
INSERT_YOUR_TEBEX_LINK🆕 Version 1.1.0
- New premium LG Thunder Garage interface
- Optional real vehicle side-view images
- Technical SVG vehicle fallbacks
- Vehicle grid and list views
- ESX, QB-Core and QBox framework bridges
- Public, private, job and impound garages
- Vehicle transfer system
- Persistent fuel, engine, body and damage data
- Improved vehicle ownership validation
- Improved garage transfer validation
- Improved impound security
- Retrieval-time validation
- Payment refund protection
- Correct NUI focus handling
- Multiple included locale files
© LG Scripts — LG Thunder Garage