Configuration Reference

Complete reference for all Oxide 3D Weapon Printing configuration settings organized by config file.

Config File: shared/config.lua

General Settings

SettingTypeDefaultDescription
Config.DebugbooleanfalseEnable debug output to server console with [oxide-weaponprinting] prefix
Config.SpawnDistancenumber100.0Distance at which placed equipment spawns for clients
Config.RequireOwnershipbooleantrueOnly the player who placed equipment can pick it up
Config.Debug = false
Config.SpawnDistance = 100.0
Config.RequireOwnership = true

Per-Player Equipment Limits

SettingTypeDefaultDescription
Config.MaxPerPlayer.printersnumber3Maximum 3D printers a player can have placed
Config.MaxPerPlayer.benchesnumber2Maximum weapon benches a player can have placed
Config.MaxPerPlayer.tablesnumber5Maximum tables a player can have placed
Config.MaxPerPlayer = {
    printers = 3,
    benches = 2,
    tables = 5,
}

Set any value to 0 to disable the limit for that equipment type.

Safe Zones

SettingTypeDefaultDescription
Config.SafeZonestable{}Array of polygon zones where placement is blocked
Config.SafeZones = {}
-- Example: Block placement in a rectangular area
-- Config.SafeZones = {
--     {
--         points = {
--             vec2(100.0, 100.0),
--             vec2(200.0, 100.0),
--             vec2(200.0, 200.0),
--             vec2(100.0, 200.0),
--         },
--     },
-- }

Printer Settings

SettingTypeDefaultDescription
Config.PrinterModelhash`prop_3d_printer`Model hash for the 3D printer prop
Config.PrinterItemstring'3d_printer'Item name that places a printer
Config.FilamentItemstring'printer_filament'Item consumed during printing
Config.UsbItemstring'printer_usb'Item used to load blueprints
Config.PrinterModel = `prop_3d_printer`
Config.PrinterItem = '3d_printer'
Config.FilamentItem = 'printer_filament'
Config.UsbItem = 'printer_usb'

Camera Settings

Controls the camera angle when interacting with a 3D printer.

SettingTypeDefaultDescription
Config.Camera.offsetvector3vector3(0.0, -0.8, 0.6)Camera offset from printer position
Config.Camera.rotvector3vector3(-15.0, 0.0, 0.0)Camera rotation (pitch, roll, yaw)
Config.Camera.fovnumber70.0Field of view in degrees
Config.Camera.transitionMsnumber500Transition duration in milliseconds
Config.Camera = {
    offset = vector3(0.0, -0.8, 0.6),
    rot = vector3(-15.0, 0.0, 0.0),
    fov = 70.0,
    transitionMs = 500,
}

Target Settings

Controls the ox_target interaction zone for printers.

SettingTypeDefaultDescription
Config.Target.iconstring'fas fa-print'Font Awesome icon class
Config.Target.labelstring'Use Printer'Interaction label text
Config.Target.distancenumber1.5Interaction distance in meters
Config.Target = {
    icon = 'fas fa-print',
    label = 'Use Printer',
    distance = 1.5,
}

Bench Settings

SettingTypeDefaultDescription
Config.BenchModelhash`gr_prop_gr_bench_04b`Model hash for the weapon bench prop
Config.BenchItemstring'weapon_bench'Item name that places a bench
Config.BenchWeaponOffsetvector3vector3(0.0, 0.0, 0.95)Offset for the weapon preview model on the bench
Config.BenchModel = `gr_prop_gr_bench_04b`
Config.BenchItem = 'weapon_bench'
Config.BenchWeaponOffset = vector3(0.0, 0.0, 0.95)

ox_inventory users: items prefixed with weapon_ are treated as weapons by ox_inventory, so the default weapon_bench won't work. Rename the item (e.g. weaponbench) when registering it in ox_inventory/data/items.lua and set Config.BenchItem to match.

Bench Camera Settings

Controls the camera angle when interacting with a weapon bench.

SettingTypeDefaultDescription
Config.BenchCamera.offsetvector3vector3(0.0, -1.0, 1.5)Camera offset from bench position
Config.BenchCamera.rotvector3vector3(-20.0, 0.0, 0.0)Camera rotation
Config.BenchCamera.fovnumber65.0Field of view
Config.BenchCamera.transitionMsnumber500Transition duration in milliseconds
Config.BenchCamera = {
    offset = vector3(0.0, -1.0, 1.5),
    rot = vector3(-20.0, 0.0, 0.0),
    fov = 65.0,
    transitionMs = 500,
}

Bench Target Settings

Controls the ox_target interaction zone for weapon benches.

SettingTypeDefaultDescription
Config.BenchTarget.iconstring'fas fa-wrench'Font Awesome icon class
Config.BenchTarget.labelstring'Use Workbench'Interaction label text
Config.BenchTarget.distancenumber1.5Interaction distance in meters
Config.BenchTarget = {
    icon = 'fas fa-wrench',
    label = 'Use Workbench',
    distance = 1.5,
}

Craft Animation

Controls the animation played during weapon assembly.

SettingTypeDefaultDescription
Config.CraftAnimation.dictstring'mini@repair'Animation dictionary
Config.CraftAnimation.namestring'fixing_a_player'Animation name
Config.CraftAnimation = {
    dict = 'mini@repair',
    name = 'fixing_a_player',
}

Label Settings

Controls floating 3D labels above printers and benches.

SettingTypeDefaultDescription
Config.Labels.toggleKeynumber74Key code to toggle labels (74 = J)
Config.Labels.maxDistnumber5.0Maximum render distance in meters
Config.Labels.scaleMinnumber0.55Minimum text scale at far distance
Config.Labels.scaleMaxnumber1.0Maximum text scale at near distance
Config.Labels.scaleNearDistnumber1.5Distance where max scale applies
Config.Labels.scaleFarDistnumber4.0Distance where min scale applies
Config.Labels.heightOffsetnumber1.2Height above equipment in meters
Config.Labels.updateIntervalnumber16Render update interval in milliseconds
Config.Labels.dataRefreshMsnumber2000Data refresh interval in milliseconds
Config.Labels = {
    toggleKey = 74,
    maxDist = 5.0,
    scaleMin = 0.55,
    scaleMax = 1.0,
    scaleNearDist = 1.5,
    scaleFarDist = 4.0,
    heightOffset = 1.2,
    updateInterval = 16,
    dataRefreshMs = 2000,
}

Table Settings

SettingTypeDefaultDescription
Config.TableModelhash`bkr_prop_weed_table_01b`Model hash for the placeable table
Config.TableItemstring'placeable_table'Item name that places a table
Config.TableModel = `bkr_prop_weed_table_01b`
Config.TableItem = 'placeable_table'

Config File: shared/config/blueprints.lua

Defines all weapon blueprints and their printable parts. Each blueprint contains an array of parts with the following structure:

FieldTypeDescription
idstringUnique part identifier within the blueprint
labelstringDisplay name for the part
itemstringItem name given when the part is printed
modelstringProp model name for the ghost prop during printing
filamentCostnumberFilament items consumed per print
printTimenumberBase print duration in seconds
Config.Blueprints = {
    pistol = {
        label = 'Pistol',
        parts = {
            { id = 'slide', label = 'Slide', item = '3d_printed_pistol_slide', model = 'prop_pistol_slide', filamentCost = 2, printTime = 1200 },
            { id = 'grip', label = 'Grip', item = '3d_printed_pistol_grip', model = 'prop_pistol_grip', filamentCost = 2, printTime = 1200 },
            { id = 'clip', label = 'Magazine', item = '3d_printed_pistol_clip', model = 'prop_pistol_clip', filamentCost = 2, printTime = 1200 },
        },
    },
    -- ... 60+ weapon blueprints
}

Filament costs and print times scale with weapon tier:

  • Tier 1 pistols: 1 filament, 600s (10 min) per part
  • Tier 2 pistols: 2 filament, 1200s (20 min) per part
  • Advanced pistols: 3 filament, 2100s (35 min) per part
  • Rifles: 3-4 filament, 2400-3600s (40-60 min) per part

Config File: shared/config/items.lua

Defines non-weapon items that can be printed directly from the printer without bench assembly. Added in v1.0.1 as a preview feature.

Config.ItemPrints

Each entry defines a printable item. The key is used as the blueprint identifier and in the blueprint metadata field of a printer_usb item.

FieldTypeRequiredDescription
labelstringYesDisplay name shown in the printer NUI and notifications
itemstringYesInventory item name given when the print is collected
modelstring or nilNoGhost prop model name for preview during printing. Set to nil to skip preview
filamentCostnumberYesNumber of filament items consumed when starting the print
printTimenumberYesBase print duration in seconds (before nozzle upgrades)
Config.ItemPrints = {
    lockpick = {
        label        = 'Lockpick',
        item         = 'lockpick',
        model        = 'm25_1_prop_m51_lockpick_01a',
        filamentCost = 2,
        printTime    = 900,
    },
    -- radio = {
    --     label        = 'Radio',
    --     item         = 'radio',
    --     model        = nil,
    --     filamentCost = 3,
    --     printTime    = 1200,
    -- },
}

Notes

  • Keys in Config.ItemPrints must not collide with keys in Config.Blueprints. If a key exists in both, the weapon blueprint takes priority.
  • To gate an item behind a player level, add the key to Config.Progression.blueprintLevels in shared/config/progression.lua.
  • To define a ghost prop scale and offset for the preview, add the model name to Config.GhostProps in shared/config/ghostprops.lua.
  • Items produced by item prints carry no quality, durability, or serial metadata — they are plain inventory items.

Config File: shared/config/assembly.lua

Defines weapon assembly recipes for the weapon bench. Each recipe specifies the weapon to produce and the parts required.

FieldTypeDescription
weaponstringGTA weapon hash name (e.g., 'weapon_pistol')
labelstringDisplay name
modelstringWeapon model for preview on bench
craftTimenumberAssembly duration in seconds
partstableArray of required parts with item, label, and amount
Config.Assembly = {
    pistol = {
        weapon = 'weapon_pistol', label = 'Pistol', model = 'w_pi_pistol', craftTime = 30,
        parts = {
            { item = '3d_printed_pistol_slide', label = 'Pistol Slide', amount = 1 },
            { item = '3d_printed_pistol_grip', label = 'Pistol Grip', amount = 1 },
            { item = '3d_printed_pistol_clip', label = 'Magazine', amount = 1 },
        },
    },
    -- ... 60+ assembly recipes
}

Craft times range from 20 seconds (basic pistols) to 90 seconds (heavy snipers, combat MGs, exotic weapons).

Config File: shared/config/progression.lua

Level Requirements

SettingTypeDescription
Config.Progression.metadataKeystringPlayer metadata key ('weaponprinting')
Config.Progression.levelstableArray of { level, xpRequired } entries
Config.Progression = {
    metadataKey = 'weaponprinting',
    levels = {
        { level = 1,  xpRequired = 0 },
        { level = 2,  xpRequired = 200 },
        { level = 3,  xpRequired = 600 },
        { level = 4,  xpRequired = 1400 },
        { level = 5,  xpRequired = 2800 },
        { level = 6,  xpRequired = 5000 },
        { level = 7,  xpRequired = 8500 },
        { level = 8,  xpRequired = 14000 },
        { level = 9,  xpRequired = 22000 },
        { level = 10, xpRequired = 35000 },
    },
}

XP Rewards

SettingTypeDefaultDescription
Config.Progression.xpRewards.loadUsbnumber5XP for loading a USB into a printer
Config.Progression.xpRewards.printCompletenumber15XP for completing a print
Config.Progression.xpRewards.assembleWeaponnumber30XP for assembling a weapon
Config.Progression.xpRewards = {
    loadUsb = 5,
    printComplete = 15,
    assembleWeapon = 30,
}

Blueprint Level Gates

The Config.Progression.blueprintLevels table maps each blueprint key to the minimum level required to load its USB into a printer. The Config.Progression.assemblyLevels table maps each assembly recipe key to the minimum level required to assemble that weapon.

Upgrade Level Gates

SettingDescription
Config.Progression.upgradeLevels.nozzle{ [1] = 1, [2] = 3, [3] = 6 }
Config.Progression.upgradeLevels.storage{ [1] = 1, [2] = 3, [3] = 6 }
Config.Progression.upgradeLevels.cooling{ [1] = 1, [2] = 3, [3] = 6 }
Config.Progression.upgradeLevels.buildplate{ [1] = 2, [2] = 4, [3] = 7 }
Config.Progression.upgradeLevels.psu{ [1] = 2, [2] = 5 }

Bad Luck Protection

SettingTypeDefaultDescription
Config.Progression.badLuckChancenumber10Percentage chance of a bad luck event during assembly
Config.Progression.badLuckPenaltynumber15Quality percentage points deducted from the assembled weapon (minimum 5%)
Config.Progression.badLuckChance = 10
Config.Progression.badLuckPenalty = 15

Experience Bonuses

SettingTypeDefaultDescription
Config.Progression.experienceBonus.printsPerBonusnumber50Prints needed per quality bonus milestone
Config.Progression.experienceBonus.printBonusPercentnumber2Quality bonus per print milestone
Config.Progression.experienceBonus.assembliesPerBonusnumber25Assemblies needed per quality bonus milestone
Config.Progression.experienceBonus.assemblyBonusPercentnumber3Quality bonus per assembly milestone
Config.Progression.experienceBonus.maxBonusnumber20Maximum combined quality bonus percentage
Config.Progression.experienceBonus = {
    printsPerBonus = 50,
    printBonusPercent = 2,
    assembliesPerBonus = 25,
    assemblyBonusPercent = 3,
    maxBonus = 20,
}

Quality Grades

SettingTypeDescription
Config.Progression.qualitytableArray defining quality tiers with gap, min, max, and grade
Config.Progression.quality = {
    { gap = 0, min = 20, max = 30, grade = 'Poor' },
    { gap = 1, min = 35, max = 45, grade = 'Decent' },
    { gap = 2, min = 50, max = 60, grade = 'Standard' },
    { gap = 3, min = 65, max = 75, grade = 'Quality' },
    { gap = 4, min = 80, max = 90, grade = 'Superior' },
}

The gap value is the minimum level difference between your level and the recipe's required level to reach that quality tier.

Config File: shared/config/upgrades.lua

Upgrade Categories

Each upgrade category defines its tiers, required items, and stat effects:

Config.Upgrades = {
    nozzle = {
        label = 'Nozzle',
        maxTier = 3,
        items = { 'printer_nozzle_mk1', 'printer_nozzle_mk2', 'printer_nozzle_mk3' },
        speedMultiplier = { [0] = 1.0, [1] = 0.85, [2] = 0.7, [3] = 0.55 },
        psuRequired = { [1] = 0, [2] = 1, [3] = 2 },
    },
    storage = {
        label = 'Storage Drive',
        maxTier = 3,
        items = { 'printer_storage_mk1', 'printer_storage_mk2', 'printer_storage_mk3' },
        slots = { [0] = 1, [1] = 3, [2] = 5, [3] = 8 },
        psuRequired = { [1] = 0, [2] = 1, [3] = 2 },
    },
    cooling = {
        label = 'Cooling Fan',
        maxTier = 3,
        items = { 'printer_cooling_mk1', 'printer_cooling_mk2', 'printer_cooling_mk3' },
        malfunctionReduction = { [0] = 0, [1] = 10, [2] = 20, [3] = 30 },
        psuRequired = { [1] = 0, [2] = 0, [3] = 1 },
    },
    buildplate = {
        label = 'Build Plate',
        maxTier = 3,
        items = { 'printer_buildplate_mk1', 'printer_buildplate_mk2', 'printer_buildplate_mk3' },
        qualityBonus = { [0] = 0, [1] = 3, [2] = 6, [3] = 10 },
        psuRequired = { [1] = 0, [2] = 1, [3] = 2 },
    },
    psu = {
        label = 'Power Supply',
        maxTier = 2,
        items = { 'printer_psu_mk1', 'printer_psu_mk2' },
    },
}

USB Malfunction

SettingTypeDefaultDescription
Config.UsbMalfunction.baseChancenumber25Base percentage chance of USB destruction on load
Config.UsbMalfunction.levelReductionnumber1.5Percentage reduction per player level
Config.UsbMalfunction.minimumChancenumber5Lowest possible malfunction chance
Config.UsbMalfunction = {
    baseChance = 25,
    levelReduction = 1.5,
    minimumChance = 5,
}

Formula: chance = max(minimumChance, baseChance - (playerLevel * levelReduction) - coolingReduction)

Config File: shared/config/durability.lua

SettingTypeDefaultDescription
Config.Durability.degradePerShotnumber0.15Durability percentage lost per shot
Config.Durability.unjamTimenumber3000Unjam animation duration in milliseconds
Config.Durability.shotSyncIntervalnumber10Shots between client-server durability syncs
Config.Durability.breakAtZerobooleantrueDestroy weapon when durability reaches 0%
Config.Durability = {
    degradePerShot = 0.15,
    jamChance = {
        { maxDurability = 100, minDurability = 80, chance = 0 },
        { maxDurability = 80,  minDurability = 60, chance = 2 },
        { maxDurability = 60,  minDurability = 40, chance = 5 },
        { maxDurability = 40,  minDurability = 20, chance = 10 },
        { maxDurability = 20,  minDurability = 0,  chance = 20 },
    },
    unjamTime = 3000,
    unjamAnim = { dict = 'anim@mp_player_intupperknuckle_crunch', name = 'idle_a' },
    shotSyncInterval = 10,
    breakAtZero = true,
}

Jam Chance Ranges

Durability RangeJam ChanceDescription
80-100%0%No jams at high durability
60-80%2%Rare jams begin
40-60%5%Noticeable jam frequency
20-40%10%Frequent jams
0-20%20%Very frequent jams, weapon near breaking

Config File: shared/config/ghostprops.lua

Controls the appearance of ghost props during printing. Each prop has a scale and vertical offset for positioning on the printer build plate.

SettingTypeDefaultDescription
Config.GhostPropDefaults.alphanumber170Transparency (0-255) of the ghost prop
Config.GhostPropDefaults.rotationSpeednumber0.7Rotation speed of the ghost prop during printing

Individual prop entries in Config.GhostProps control scale and offset per model. These rarely need modification.

Next Steps

  • Features - Understand the gameplay mechanics these settings control
  • Admin - Admin commands for testing configuration changes
  • Troubleshooting - Common issues related to misconfiguration