LCK Chop Shop
Install and configure vehicle dismantling, ordered part removal, inventory rewards, ownership checks, police requirements, chop locations, and the parts buyer.
Installation
- Copy
lck_chopshopinto the server resources directory. - Register every reward and sale item using the included
ITEM_SETUP.md. - For QBCore or
qb-inventory, copy the PNG files fromItemImage/into the inventory image directory. - Review the ownership table and plate-column mappings in
config.lua. - Start the database, libraries, framework, and inventory before the Chop Shop.
ensure oxmysql
ensure ox_lib
ensure ox_target
# Replace these with your framework and inventory.
ensure qbx_core
ensure ox_inventory
ensure lck_chopshop
Requirements
ox_libox_targetoxmysqlqbx_core,qb-core, ores_extended
Supported paths include ox_inventory, qb-inventory, framework inventory functions exposed by Qbox or QBCore, and the standard ESX inventory API. A supported framework is required for buyer payouts.
How chopping works
- Drive an eligible vehicle into a configured chop-shop polygon and press
E. - Remove the bonnet, available doors, boot, wheels, and chassis in order.
- Complete each skill check to remove the part and receive its configured rewards.
- After the chassis stage, the entity is deleted and its ownership row is optionally removed.
- Take rewarded parts to the configured NPC buyer and sell every eligible item at once.
Three-door and four-door vehicles automatically skip unavailable door stages. Bikes, helicopters, and boats are blocked by default.
Framework, police, and cooldowns
framework = 'auto' detects Qbox, QBCore, or ESX. Manual values are qbx, qb, esx, and standalone.
globalCooldown = 5 applies a global delay in minutes from the moment a new chop is approved.
policeRequired sets the minimum count and policeJob selects the exact framework job name.
dropCheaters = truedisconnects players after invalid server requests.countOffDutyPolicecontrols Qbox and QBCore off-duty counting.blockedVehicleTypesprevents configured GTA vehicle types from starting.debugenables zone visualization and additional resource output.
Police dispatch
The client-side policeDispatch hook runs when the first part is chopped and is independent from the police count requirement.
policeDispatch = function(ped, vehicle)
exports['ps-dispatch']:VehicleTheft(vehicle)
end,
Owned-vehicle validation
player_vehicles
Default table for both frameworks. Qbox can use qbx_vehicles exports when useQboxExports = true.
owned_vehicles
Default table with plate as the configured plate column.
enabledcontrols ownership behavior.requireOwnedrejects plates absent from the configured source.deleteOwneddeletes the row after the final stage.- Plate comparisons trim spaces and ignore case.
Custom garage schemas can supply server-side isOwned and delete functions. Return true only after the lookup or deletion succeeds. If ownership checking fails, the chop is denied.
vehicleOwnership = {
enabled = true,
requireOwned = true,
deleteOwned = true,
isOwned = function(plate)
return MySQL.scalar.await(
'SELECT 1 FROM custom_vehicles WHERE plate = ? LIMIT 1',
{ plate }
) ~= nil
end,
delete = function(plate)
return MySQL.update.await(
'DELETE FROM custom_vehicles WHERE plate = ? LIMIT 1',
{ plate }
) > 0
end
}
Stage rewards
The rewards, skillchecks, and duration tables use matching stage keys. All configured items must already exist in the active inventory.
rewards = {
['lck_chopshop:1'] = {
{ item = 'vehicle_parts', amount = 1 }
},
['lck_chopshop:11'] = {
{ item = 'vehicle_parts', amount = 1 },
{ item = 'steel', amount = 1 }
}
},
skillchecks = {
['lck_chopshop:1'] = { 'easy', 'easy' }
},
duration = {
['lck_chopshop:1'] = 2000
}
fullChopReward grants an additional item after stage 11 and can be set to false. Failed skill checks do not advance the stage, so the interaction can be attempted again.
Zones and security coordinates
chopShops = {
example = {
securityCoords = vec3(100.0, 200.0, 30.0),
blip = {
coords = vec3(100.0, 200.0, 30.0),
sprite = 225,
color = 59,
scale = 0.8,
name = 'Chop Shop'
},
zonePoints = {
vec3(95.0, 195.0, 30.0),
vec3(105.0, 195.0, 30.0),
vec3(105.0, 205.0, 30.0),
vec3(95.0, 205.0, 30.0)
}
}
}
Place securityCoords near the polygon center. The server requires the player to remain within 50 units of a configured security coordinate. Define polygon points in perimeter order, set blip = false for hidden locations, and temporarily enable debug mode while adjusting the zone.
Configure the NPC buyer
partsBuyer = {
items = {
{ item = 'vehicle_parts', price = 500 },
{ item = 'vehicle_tires', price = 250 }
},
account = 'cash',
sellDuration = 5000,
coords = vec4(-471.15, -1719.42, 17.69, 220.0),
model = 's_m_y_xmech_02',
scenario = 'WORLD_HUMAN_CLIPBOARD'
}
One interaction sells the player's full quantity of every configured item with a positive price. If removal or payment fails, previously removed items are returned. Set the buyer blip to false to hide it or set partsBuyer = false to disable the buyer.
Server-side validation
The server validates the networked entity, active chop state, registered session, normalized plate, player distance, stage order, and ownership result. Invalid entity or stage requests are treated as exploit attempts.
Public servers should leave dropCheaters = true. During development, set it to false only when you want invalid attempts logged without disconnecting the player.
Localization
Bundled locale codes are en, es, and nl. Select one before resource startup:
setr ox:locale "en"
To add a language, copy locales/en.json, translate values without changing JSON keys or %s placeholders, and keep target, progress, and notification keys synchronized with configurable stages.
Common issues
Resource does not start
Confirm ox_lib, ox_target, and oxmysql start first, the resource directory matches the ensure name, and the console has no Lua or JSON errors.
Vehicle is not registered
Check framework detection, ownership tables, plateColumn, and the normalized plate stored in the database.
Owned vehicle is not deleted
Enable deleteOwned, verify database delete permission, and check Qbox export configuration. The entity remains when deletion fails so the operation can be retried safely.
Rewards or sales fail
Register every item, start inventory first, verify capacity, use a supported framework for payouts, and keep the player within five units of the buyer.
Police are not counted
Use the exact job name, configure off-duty counting for Qbox/QBCore, and set policeRequired to a positive number.
Need help configuring Chop Shop?
Join the LCKSCRIPTS Discord for framework, inventory, ownership, reward, and location setup help.
Join Discord ↗