Need help? Join our Discord for support and updates

Scrapyard

v1.0.0UtilityESXQBQBOX
On this page

Scrapyard

Overview

Scrapyard is a script designed for roleplay servers in GTA V that allows players to engage in scrapyard activities. Players can collect various materials such as metal, scrap, rubber, and glass, which are essential for crafting and missions. The script includes a digital scanner weapon required for specific locator missions, enhancing the gameplay experience by integrating scavenging mechanics into the roleplay environment.

Compatibility

Framework: ESX, QBCore, QBox, Standalone

Target: ox_target, qb-target, or qtarget (optional) — falls back to 3D text / TextUI if none are installed

Dependencies

Required Dependencies

  • ox_lib
  • es_extended
  • ox_inventory
  • WEAPON_DIGISCANNER
  • drc_scrapyard_props

Optional Dependencies

  • oxmysql
  • qb-inventory
  • ox_target or qb-target or qtarget
  • qb-core

Installation

1. Upload the resource

Place the resource folder inside your server's resources directory (rename it to drc_scrapyard if needed).

2. Install dependencies

Make sure all of the following are installed and started before this script:

  • ox_lib
  • es_extended
  • ox_inventory

3. Import database

No SQL file was detected. If this script uses a database, this needs manual review.

4. Add to server.cfg

ensure ox_lib
ensure es_extended
ensure ox_inventory
ensure drc_scrapyard

5. Configure the script

Open the config file and adjust the settings for your server. See the Config section below.

6. Restart and test

Restart your server (or start the resource) and test it in-game, e.g. with /helpscrap.

Config

drc_scrapyardpack/drc_scrapyard/shared/sh_config.lua

Config = {}

Config.Debug = false
Config.Locale = 'en'
Config.HelpItem = 'scrap_help'

Config.Framework = 'ESX' -- auto | ESX | qbcore | standalone
Config.Inventory = 'ox' -- auto-detect | ox | esx | qb | none
Config.NotificationType = "ox_lib" -- Notifications | types: ESX, ox_lib, qbcore
Config.Progress = "ox_lib" -- ProgressBar | types: progressBars, ox_lib, qbcore
Config.TextUI = "ox_lib" -- TextUI | types: ox_lib, esx, luke, GTA
Config.Menu = "ox_lib" -- Menu | types: ox_lib, qb-menu
Config.Target = 'auto' -- auto | ox_target | qb-target | qtarget
Config.InteractionType = "target" -- Interaction mode | types: target, textui, 3dtext
Config.KeySystem = 'none' -- qs, wasabi, fivecode, qbcore
Config.Dispatch = {
    enabled = false,
    script = "cd_dispatch", -- cd_dispatch, linden_outlawalert, ps-dispatch, custom
    chance = {
        disassemble = 20, -- chance in percent when removing a vehicle part
        crusher = 35 -- chance in percent when starting the crusher
    }
}
Config.PoliceJobs = { 'police', 'sheriff' }
Config.PoliceRequired = 0 -- Number of police required to scrap, use crusher or 


Config.Blips = {
    enabled = true,
    scrapyard = {
        enabled = true,
        sprite = 365,
        colour = 5,
        scale = 0.85,
        shortRange = true
    },
    crusher = {
        enabled = true,
        sprite = 566,
        colour = 1,
        scale = 0.8,
        shortRange = true
    },
    locatorStart = {
        enabled = true,
        sprite = 326,
        colour = 3,
        scale = 0.85,
        shortRange = true
    },
    buyer = {
        enabled = true,
        sprite = 605,
        colour = 2,
        scale = 0.75,
        shortRange = true
    }
}
-- here you can find all vehicle classes: https://wiki.rage.mp/wiki/Vehicle_Classes


Config.WreckModels =  {
       [0] = `prop_rub_carwreck_17`, -- 0 vehicle class prop wreck for that classs
       [1] = `prop_rub_carwreck_2`,
       [2] = `prop_rub_carwreck_8`,
       [3] = `prop_rub_carwreck_2`,
       [4] = `prop_rub_carwreck_17`,
       [5] = `prop_rub_carwreck_2`,
       [6] = `prop_rub_carwreck_8`,
       [7] = `prop_rub_carwreck_2`,
       [9] = `prop_rub_carwreck_17`,
       [10] = `prop_rub_carwreck_2`,
       [11] = `prop_rub_carwreck_8`,
       [12] = `prop_rub_carwreck_2`,
       [17] = `prop_rub_carwreck_17`,
       [18] = `prop_rub_carwreck_2`,
       [19] = `prop_rub_carwreck_8`,
       [20] = `prop_rub_carwreck_2`
}

Config.WreckOffsets = {
    [0] = vec3(0.0, 1.75, 0.0),
    [1] =vec3(0.0, 1.75, 0.0),
    [2] =vec3(0.0, 1.75, 0.0),
    [3] =vec3(0.0, 1.75, 0.0),
    [4] =vec3(0.0, 1.75, 0.0),
    [5] =vec3(0.0, 1.75, 0.0),
    [6] =vec3(0.0, 1.75, 0.0),
    [7] =vec3(0.0, 1.75, 0.0),
    [9] =vec3(0.0, 1.75, 0.0),
    [10] =vec3(0.0, 1.75, 0.0),
    [11] =vec3(0.0, 1.75, 0.0),
    [12] =vec3(0.0, 1.75, 0.0),
    [17] = vec3(0.5, 1.5, -1.5), -- bikes need different offset
    [18] = vec3(2.5, 2.5, -2.5), -- boats need different offset
    [19] = vec3(2.5, 2.5, -2.5), -- boats need different offset
    [20] = vec3(2.5, 2.5, -2.5) -- boats need different offset
}
Config.AllowedVehicleClasses = {
    [0] = true,
    [1] = true,
    [2] = true,
    [3] = true,
    [4] = true,
    [5] = true,
    [6] = true,
    [7] = true,
    [9] = true,
    [10] = true,
    [11] = true,
    [12] = true,
    [17] = true,
    [18] = true,
    [19] = true,
    [20] = true
}

Config.Scrapyards = {
    CanOnlyLocatorVehicles = false, -- If true, only vehicles that were spawned for locator missions can be scrapped. Otherwise, any vehicle can be scrapped.
    {
        id = 'main_scrapyard',
        center = vec3(-424.8291, -1686.8055, 19.0286),
        radius = 32.0,
        dropoff = {
            coords = vec3(-422.2881, -1673.6614, 19.0291),
            radius = 0.75
        },
        crusher = {
            enabled = true,
            npc = {
                model = 's_m_m_dockwork_01',
                coords = vec3(-430.4944, -1678.8488, 18.0291),
                heading = 254.2851
            },
            forklift = {
                model = 'forklift',
                rentDurationMs = 5 * 60 * 1000,
                spawn = {
                    coords = vec3(-425.9178, -1670.5419, 19.0291),
                    heading = 156.8812
                }
            },
            dropoff = {
                coords = vec3(-462.7299, -1709.1974, 18.4340),
                heading = 180.8080,
                triggerRadius = 5.0,
                lockPosition = true
            },
            machine = {
                coords = vec3(-462.7263, -1714.8179, 17.6398),
                heading = 358.5675,
                control = vec3(-459.9529, -1718.6213, 18.6336),
                zone = {
                    type = 'box',
                    width = 3.6,
                    length = 11.0,
                    minZ = 18.2,
                    maxZ = 21.6,
                    heading = 358.5675,
                    localOffset = vec3(0.0, 5.0, 0.0),
                    debug = false
                }
            },
            wreck = {
                progressMs = 7000,
                rewards = {
                    { item = 'metal', min = 4, max = 8, chance = 100 },
                    { item = 'scrap', min = 2, max = 5, chance = 80 }
                }
            }
        }
    }
}

Config.ScrapBuyer = {
    enabled = true,
    account = 'money', -- money | blackmoney
    moneyItem = 'money', -- inventory fallback money item
    blackMoneyItem = 'markedbills', -- QB/QBCore black money item fallback
    locations = {
        {
            coords = vec4(-350.1300, -1569.8236, 25.2216, 338.3901),
            radius = 1.6,
            npc = {
                enabled = true,
                model = 's_m_m_dockwork_01',
                scenario = 'WORLD_HUMAN_CLIPBOARD'
            }
        }
    },
    items = {
        { item = 'metal', label = 'Metal', price = 18, icon = 'fa-solid fa-cubes-stacked' },
        { item = 'scrap', label = 'Scrap', price = 12, icon = 'fa-solid fa-recycle' },
        { item = 'rubber', label = 'Rubber', price = 10, icon = 'fa-solid fa-circle' },
        { item = 'glass', label = 'Glass', price = 14, icon = 'fa-solid fa-wine-glass-empty' }
    }
}

Config.LocatorMission = {
    MissionStart = {
        npcLocation = vec4(-400.0506, 1138.3512, 325.8531, 55.4026),
        npcModel = 's_m_m_dockwork_01'
    },
    VehicleModels = {
        'blista',
        'brioso',
        'dilettante',
        'issi2',
        'panto',
        'prairie',
        'rhapsody'
    },
    MissionLocations = {
        vec4(353.6303, -1116.6316, 29.4064, 2.4139),
        vec4(28.6140, -865.0303, 30.4987, 163.4119),
        vec4(-168.2436, -1436.6215, 31.2511, 231.2457),
        vec4(828.1843, -1258.3951, 26.2781, 1.8534),
        vec4(901.5261, -68.0688, 78.7624, 58.5737),
        vec4(-49.8067, 214.7430, 106.5450, 165.7220),
        vec4(-1186.5050, -743.2142, 19.9413, 130.6973),
        vec4(-1318.5322, -1137.7690, 4.3516, 273.6900),
        vec4(-1006.2433, -1632.7238, 4.5240, 235.7077),
    }
}


Config.OwnershipCheck = {
    enabled = true,
    allowCrusherOwnedVehicles = false, -- If true, player-owned vehicles can be crushed and will be removed from the ownership database.
    deleteOwnedVehicleOnCrusher = true,
    useStateBag = true,
    stateBagKeys = {
        'owner',
        'owned',
        'vehicleid',
        'citizenid',
        'garageOwner'
    },
    useDatabase = true,
    databaseResource = 'oxmysql',
    tableCandidates = {
        { name = 'owned_vehicles', plateColumn = 'plate' },
        { name = 'player_vehicles', plateColumn = 'plate' },
        { name = 'owned_cars', plateColumn = 'plate' }
    }
}

Config.PartOrder = {
    'door_lf',
    'door_rf',
    'door_lr',
    'door_rr',
    'hood',
    'trunk',
    'engine',
    'wheel_lf',
    'wheel_rf',
    'wheel_lr',
    'wheel_rr',
    'windshield'
}

-- IMPORTANT:
-- 1) Change target.fallbackOffset for where circle target is shown on vehicle.
-- 2) Change carry.model and carry.offset/rotation for prop in player hand.
Config.Parts = {
    door_lf = {
        label = 'Door',
        icon = 'fa-solid fa-door-open',
        rewardKey = 'door',
        target = {
            bone = 'door_dside_f',
            fallbackOffset = vec3(-1.05, 1.12, 0.25)
        },
        remove = {
            type = 'door',
            doorIndex = 0
        },
        carry = {
            model = 'prop_car_door_01',
            bone = 57005,
            offset = vec3(0.6, -0.5, -0.1),
            rotation = vec3(-130.0, 70.0, 0.0)
        }
    },
    door_rf = {
        label = 'Door',
        icon = 'fa-solid fa-door-open',
        rewardKey = 'door',
        target = {
            bone = 'door_pside_f',
            fallbackOffset = vec3(1.05, 1.12, 0.25)
        },
        remove = {
            type = 'door',
            doorIndex = 1
        },
        carry = {
            model = 'prop_car_door_01',
            bone = 57005,
            offset = vec3(0.6, -0.5, -0.1),
            rotation = vec3(-130.0, 70.0, 0.0)
        }
    },
    door_lr = {
        label = 'Door',
        icon = 'fa-solid fa-door-open',
        rewardKey = 'door',
        target = {
            bone = 'door_dside_r',
            fallbackOffset = vec3(-1.05, -0.92, 0.25)
        },
        remove = {
            type = 'door',
            doorIndex = 2
        },
        carry = {
            model = 'prop_car_door_01',
            bone = 57005,
            offset = vec3(0.6, -0.5, -0.1),
            rotation = vec3(-130.0, 70.0, 0.0)
        }
    },
    door_rr = {
        label = 'Door',
        icon = 'fa-solid fa-door-open',
        rewardKey = 'door',
        target = {
            bone = 'door_pside_r',
            fallbackOffset = vec3(1.05, -0.92, 0.25)
        },
        remove = {
            type = 'door',
            doorIndex = 3
        },
        carry = {
            model = 'prop_car_door_01',
            bone = 57005,
            offset = vec3(0.6, -0.5, -0.1),
            rotation = vec3(-130.0, 70.0, 0.0)
        }
    },

    hood = {
        label = 'Hood',
        icon = 'fa-solid fa-car-side',
        target = {
            bone = 'bonnet',
            fallbackOffset = vec3(0.0, 1.55, 0.45)
        },
        remove = {
            type = 'door',
            doorIndex = 4
        },
        carry = {
            model = 'prop_car_bonnet_02',
            bone = 57005,
            offset = vec3(1.0, -0.3, 0.2),
            rotation = vec3(20.0, -110.0, 190.0)
        }
    },
    trunk = {
        label = 'Trunk',
        icon = 'fa-solid fa-box-open',
        rewardKey = 'hood',
        target = {
            bone = 'boot',
            fallbackOffset = vec3(0.0, -1.55, 0.45)
        },
        remove = {
            type = 'door',
            doorIndex = 5
        },
        carry = {
            model = 'imp_prop_impexp_trunk_01a',
            bone = 57005,
            offset = vec3(0.7, -0.3, -0.1),
            rotation = vec3(40.0, 80.0, 170.0)
        }
    },
    engine = {
        label = 'Engine',
        icon = 'fa-solid fa-gears',
        target = {
            bone = 'engine',
            fallbackOffset = vec3(0.0, 1.08, 0.52)
        },
        remove = {
            type = 'engine'
        },
        carry = {
            model = 'prop_car_engine_01',
            bone = 57005,
            offset = vec3(0.6, 0.4, -0.2),
            rotation = vec3(-140.0, 80.0, -20.0)
        }
    },
    wheel_lf = {
        label = 'Wheel',
        icon = 'fa-solid fa-circle',
        rewardKey = 'wheel',
        target = {
            bone = 'wheel_lf',
            fallbackOffset = vec3(-1.02, 1.30, -0.12)
        },
        remove = {
            type = 'wheel',
            wheelIndex = 0
        },
        carry = {
            model = 'prop_wheel_01',
            bone = 57005,
            offset = vec3(0.3, 0.0, -0.2),
            rotation = vec3(-140.0, 80.0, 0.0)
        }
    },
    wheel_rf = {
        label = 'Wheel',
        icon = 'fa-solid fa-circle',
        rewardKey = 'wheel',
        target = {
            bone = 'wheel_rf',
            fallbackOffset = vec3(1.02, 1.30, -0.12)
        },
        remove = {
            type = 'wheel',
            wheelIndex = 1
        },
        carry = {
            model = 'prop_wheel_01',
            bone = 57005,
            offset = vec3(0.3, 0.0, -0.2),
            rotation = vec3(-140.0, 80.0, 0.0)
        }
    },
    wheel_lr = {
        label = 'Wheel',
        icon = 'fa-solid fa-circle',
        rewardKey = 'wheel',
        target = {
            bone = 'wheel_lr',
            fallbackOffset = vec3(-1.02, -1.18, -0.12)
        },
        remove = {
            type = 'wheel',
            wheelIndex = 2
        },
        carry = {
            model = 'prop_wheel_01',
            bone = 57005,
            offset = vec3(0.3, 0.0, -0.2),
            rotation = vec3(-140.0, 80.0, 0.0)
        }
    },
    wheel_rr = {
        label = 'Wheel',
        icon = 'fa-solid fa-circle',
        rewardKey = 'wheel',
        target = {
            bone = 'wheel_rr',
            fallbackOffset = vec3(1.02, -1.18, -0.12)
        },
        remove = {
            type = 'wheel',
            wheelIndex = 3
        },
        carry = {
            model = 'prop_wheel_01',
            bone = 57005,
            offset = vec3(0.3, 0.0, -0.2),
            rotation = vec3(-140.0, 80.0, 0.0)
        }
    },
    windshield = {
        label = 'Windshield',
        icon = 'fa-solid fa-wind',
        target = {
            bone = 'windscreen',
            fallbackOffset = vec3(0.0, 0.55, 0.86)
        },
        remove = {
            type = 'front_windshield',
            windowIndex = 6
        }
    }
}

-- Rewards setup (editable)
Config.Reward = {
    fallback = {
        instant = false,
        rewards = {
            { item = 'metal', min = 1, max = 2, chance = 100 }
        }
    },
    parts = {
        door = {
            instant = false,
            rewards = {
                { item = 'metal', min = 3, max = 6, chance = 100 },
                { item = 'scrap', min = 1, max = 2, chance = 50 }
            }
        },
        hood = {
            instant = false,
            rewards = {
                { item = 'metal', min = 4, max = 7, chance = 100 },
                { item = 'scrap', min = 1, max = 3, chance = 60 }
            }
        },
        engine = {
            instant = false,
            rewards = {
                { item = 'metal', min = 5, max = 8, chance = 100 },
                { item = 'scrap', min = 2, max = 4, chance = 70 }
            }
        },
        wheel = {
            instant = false,
            rewards = {
                { item = 'rubber', min = 2, max = 4, chance = 100 },
                { item = 'metal', min = 1, max = 3, chance = 70 }
            }
        },
        windshield = {
            instant = true,
            rewards = {
                { item = 'glass', min = 1, max = 2, chance = 100 }
            }
        }
    }
}
Last updated 7/12/2026Browse all docs →