Version 1.0.3

LCK Chop Shop

Install and configure vehicle dismantling, ordered part removal, inventory rewards, ownership checks, police requirements, chop locations, and the parts buyer.

QboxQBCoreESXox_libox_targetoxmysql
01 / Installation

Installation

  • Copy lck_chopshop into 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 from ItemImage/ 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_lib
  • ox_target
  • oxmysql
  • qbx_core, qb-core, or es_extended
Inventory support

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.

02 / Player flow

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.

03 / General settings

Framework, police, and cooldowns

FRAMEWORK

framework = 'auto' detects Qbox, QBCore, or ESX. Manual values are qbx, qb, esx, and standalone.

COOLDOWN

globalCooldown = 5 applies a global delay in minutes from the moment a new chop is approved.

POLICE

policeRequired sets the minimum count and policeJob selects the exact framework job name.

  • dropCheaters = true disconnects players after invalid server requests.
  • countOffDutyPolice controls Qbox and QBCore off-duty counting.
  • blockedVehicleTypes prevents configured GTA vehicle types from starting.
  • debug enables 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,
04 / Vehicle ownership

Owned-vehicle validation

Qbox / QBCore

player_vehicles

Default table for both frameworks. Qbox can use qbx_vehicles exports when useQboxExports = true.

ESX / Standalone

owned_vehicles

Default table with plate as the configured plate column.

  • enabled controls ownership behavior.
  • requireOwned rejects plates absent from the configured source.
  • deleteOwned deletes 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
}
05 / Rewards & skill checks

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.

06 / Chop-shop locations

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.

07 / Parts buyer

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.

08 / Security behavior

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.

Keep validation enabled

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.

09 / Troubleshooting

Common issues

01

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.

02

Vehicle is not registered

Check framework detection, ownership tables, plateColumn, and the normalized plate stored in the database.

03

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.

04

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.

05

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