Configuration Reference

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

Config File Map

FilePurpose
shared/config.luaGeneral settings, printer/bench/table models, camera, target, labels, safe zones
shared/config/blueprints.luaAll weapon blueprints and their printable parts
shared/config/assembly.luaWeapon assembly recipes for the weapon bench
shared/config/progression.luaLevel requirements, XP rewards, blueprint/upgrade level gates, quality grades
shared/config/upgrades.luaUpgrade categories, tiers, and USB malfunction settings
shared/config/durability.luaWeapon degradation, jam chances, and break behavior
shared/config/ghostprops.luaGhost prop appearance during printing

General Settings

File: shared/config.lua

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

File: shared/config.lua

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

File: shared/config.lua

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)

Bench Camera Settings

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

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

File: shared/config.lua

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

File: shared/config.lua

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'

Blueprints

File: shared/config/blueprints.lua

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

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:

TierFilament per PartPrint Time per Part
Tier 1 pistols1600s (10 min)
Tier 2 pistols21200s (20 min)
Advanced pistols32100s (35 min)
Rifles3–42400–3600s (40–60 min)

Assembly

File: shared/config/assembly.lua

Defines weapon assembly recipes for the weapon bench.

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).


Progression

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

Config.Progression.blueprintLevels maps each blueprint key to the minimum level required to load its USB into a printer. Config.Progression.assemblyLevels 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 (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

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.


Upgrades

File: shared/config/upgrades.lua

Upgrade Categories

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)


Durability

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

Ghost Props

File: shared/config/ghostprops.lua

Controls the appearance of ghost props during printing.

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.