Installation Guide

Complete installation instructions for the Oxide 3D Weapon Printing system including database setup, item registration, and framework configuration.

Prerequisites

Required Resources

ResourceMinimum VersionPurpose
ox_libv3.0.0+Utility library, locale, callbacks
oxmysqllatestMySQL database operations
o-linklatestFramework and system abstraction layer

Supported Frameworks

FrameworkSupport
QBCoreFull
ESXFull
QBX (qbx_core)Full

Installation Steps

  1. Extract the resource to your resources/ folder (e.g., resources/[oxide]/oxide-weaponprinting)

  2. Add to server.cfg (dependency order matters):

    QBCore:

    ensure ox_lib
    ensure oxmysql
    ensure qb-core
    ensure qb-inventory     # or your inventory resource
    ensure o-link
    ensure oxide-weaponprinting

    ESX:

    ensure ox_lib
    ensure oxmysql
    ensure es_extended
    ensure ox_inventory     # or your inventory resource
    ensure o-link
    ensure oxide-weaponprinting

    QBX:

    ensure ox_lib
    ensure oxmysql
    ensure qbx_core
    ensure ox_inventory     # or your inventory resource
    ensure o-link
    ensure oxide-weaponprinting

    Note: Your framework core and inventory resource must load before o-link and oxide-weaponprinting.

  3. Import the database (see Database Setup)

  4. Register all items in your framework (see Item Registration)

  5. Configure settings in shared/config.lua and shared/config/*.lua

Database Setup

Import the SQL file into your MySQL database:

sql/install.sql

This creates the following tables:

TablePurpose
3d_printersPlaced 3D printers with position, owner, name, and upgrade metadata
weapon_benchesPlaced weapon benches with position and owner
placeable_tablesPlaced tables with position and owner
active_printsCurrently printing or uncollected parts linked to printers

Item Registration

You must register the following items in your framework's item database. These include placeable equipment, consumable materials, 30 printed weapon parts, and 14 printer upgrade components.

Item images: Item icon images are included in the itemimages/ folder within the oxide-weaponprinting resource. Copy all .png files from itemimages/ to your inventory's image directory:

  • QBCore (qb-inventory): qb-inventory/html/images/
  • ESX (ox_inventory): ox_inventory/web/images/

Required Items

Item NameLabelDescription
3d_printer3D PrinterPlaceable printer for manufacturing parts
printer_usbPrinter USBUSB drive containing a blueprint (metadata-based)
printer_filamentPrinter FilamentFilament spool consumed during printing
weapon_benchWeapon BenchPlaceable workbench for assembling weapons
placeable_tableTableGeneral-purpose placeable table
printer_manualThe Ghost Gunner's HandbookIn-game guide book for the weapon printing system

Printed Part Items (30)

Item NameLabel
3d_printed_pistol_slidePrinted Pistol Slide
3d_printed_pistol_gripPrinted Pistol Grip
3d_printed_pistol_clipPrinted Pistol Magazine
3d_printed_pistol_compact_framePrinted Compact Frame
3d_printed_revolver_framePrinted Revolver Frame
3d_printed_revolver_receiverPrinted Revolver Receiver
3d_printed_trigger_groupPrinted Trigger Group
3d_printed_smg_barrelPrinted SMG Barrel
3d_printed_smg_receiverPrinted SMG Receiver
3d_printed_smg_magPrinted SMG Magazine
3d_printed_compact_barrelPrinted Compact Barrel
3d_printed_folding_stockPrinted Folding Stock
3d_printed_rifle_barrelPrinted Rifle Barrel
3d_printed_rifle_upperPrinted Rifle Upper
3d_printed_rifle_lowerPrinted Rifle Lower
3d_printed_rifle_handguardPrinted Rifle Handguard
3d_printed_rifle_magPrinted Rifle Magazine
3d_printed_rifle_stockPrinted Rifle Stock
3d_printed_bullpup_chassisPrinted Bullpup Chassis
3d_printed_shotgun_barrelPrinted Shotgun Barrel
3d_printed_shotgun_receiverPrinted Shotgun Receiver
3d_printed_shotgun_stockPrinted Shotgun Stock
3d_printed_pump_handlePrinted Pump Handle
3d_printed_double_barrel_setPrinted Double Barrel Set
3d_printed_sniper_barrelPrinted Sniper Barrel
3d_printed_sniper_receiverPrinted Sniper Receiver
3d_printed_sniper_magPrinted Sniper Magazine
3d_printed_sniper_stockPrinted Sniper Stock
3d_printed_long_scopePrinted Long Scope
3d_printed_drum_magPrinted Drum Magazine

Printer Upgrade Items (14)

Item NameLabel
printer_nozzle_mk1Nozzle Mk I
printer_nozzle_mk2Nozzle Mk II
printer_nozzle_mk3Nozzle Mk III
printer_storage_mk1Storage Drive Mk I
printer_storage_mk2Storage Drive Mk II
printer_storage_mk3Storage Drive Mk III
printer_cooling_mk1Cooling Fan Mk I
printer_cooling_mk2Cooling Fan Mk II
printer_cooling_mk3Cooling Fan Mk III
printer_buildplate_mk1Build Plate Mk I
printer_buildplate_mk2Build Plate Mk II
printer_buildplate_mk3Build Plate Mk III
printer_psu_mk1Power Supply Mk I
printer_psu_mk2Power Supply Mk II

QBCore Item Registration

Step 1: Copy item images

Copy all .png files from oxide-weaponprinting/itemimages/ to qb-inventory/html/images/.

Step 2: Add items to qb-core

Add these to qb-core/shared/items.lua:

-- oxide-weaponprinting: Equipment Items
['3d_printer']                       = { name = '3d_printer',                       label = '3D Printer',               weight = 10000, type = 'item', image = '3d_printer.png',                       unique = false, useable = true,  shouldClose = true, description = 'A portable 3D printer for manufacturing parts' },
printer_usb                          = { name = 'printer_usb',                      label = 'Printer USB',              weight = 100,   type = 'item', image = 'printer_usb.png',                      unique = true,  useable = false, shouldClose = true, description = 'A USB drive containing a 3D printing blueprint' },
printer_filament                     = { name = 'printer_filament',                 label = 'Printer Filament',         weight = 500,   type = 'item', image = 'printer_filament.png',                 unique = false, useable = false, shouldClose = true, description = 'Filament spool for 3D printers' },
weapon_bench                         = { name = 'weapon_bench',                     label = 'Weapon Bench',             weight = 15000, type = 'item', image = 'weapon_bench.png',                     unique = false, useable = true,  shouldClose = true, description = 'A portable workbench for assembling weapon parts' },
placeable_table                      = { name = 'placeable_table',                  label = 'Table',                    weight = 8000,  type = 'item', image = 'placeable_table.png',                  unique = false, useable = true,  shouldClose = true, description = 'A placeable table' },
printer_manual                       = { name = 'printer_manual',                   label = 'The Ghost Gunner\'s Handbook', weight = 500, type = 'item', image = 'printer_manual.png',                   unique = false, useable = true,  shouldClose = true, description = 'An in-game guide to 3D weapon printing' },

-- oxide-weaponprinting: Pistol Parts
['3d_printed_pistol_slide']          = { name = '3d_printed_pistol_slide',          label = 'Printed Pistol Slide',     weight = 300,   type = 'item', image = '3d_printed_pistol_slide.png',          unique = false, useable = false, shouldClose = true, description = 'A 3D printed pistol slide' },
['3d_printed_pistol_grip']           = { name = '3d_printed_pistol_grip',           label = 'Printed Pistol Grip',      weight = 400,   type = 'item', image = '3d_printed_pistol_grip.png',           unique = false, useable = false, shouldClose = true, description = 'A 3D printed pistol grip and frame' },
['3d_printed_pistol_clip']           = { name = '3d_printed_pistol_clip',           label = 'Printed Pistol Magazine',  weight = 200,   type = 'item', image = '3d_printed_pistol_clip.png',           unique = false, useable = false, shouldClose = true, description = 'A 3D printed pistol magazine' },
['3d_printed_pistol_compact_frame']  = { name = '3d_printed_pistol_compact_frame',  label = 'Printed Compact Frame',    weight = 200,   type = 'item', image = '3d_printed_pistol_compact_frame.png',  unique = false, useable = false, shouldClose = true, description = 'A 3D printed compact pistol frame' },
['3d_printed_revolver_frame']        = { name = '3d_printed_revolver_frame',        label = 'Printed Revolver Frame',   weight = 300,   type = 'item', image = '3d_printed_revolver_frame.png',        unique = false, useable = false, shouldClose = true, description = 'A 3D printed revolver frame' },
['3d_printed_revolver_receiver']     = { name = '3d_printed_revolver_receiver',     label = 'Printed Revolver Receiver', weight = 300,  type = 'item', image = '3d_printed_revolver_receiver.png',     unique = false, useable = false, shouldClose = true, description = 'A 3D printed revolver receiver' },
['3d_printed_trigger_group']         = { name = '3d_printed_trigger_group',         label = 'Printed Trigger Group',    weight = 100,   type = 'item', image = '3d_printed_trigger_group.png',         unique = false, useable = false, shouldClose = true, description = 'A 3D printed trigger assembly' },

-- oxide-weaponprinting: SMG Parts
['3d_printed_smg_barrel']            = { name = '3d_printed_smg_barrel',            label = 'Printed SMG Barrel',       weight = 200,   type = 'item', image = '3d_printed_smg_barrel.png',            unique = false, useable = false, shouldClose = true, description = 'A 3D printed SMG barrel' },
['3d_printed_smg_receiver']          = { name = '3d_printed_smg_receiver',          label = 'Printed SMG Receiver',     weight = 300,   type = 'item', image = '3d_printed_smg_receiver.png',          unique = false, useable = false, shouldClose = true, description = 'A 3D printed SMG receiver' },
['3d_printed_smg_mag']               = { name = '3d_printed_smg_mag',              label = 'Printed SMG Magazine',     weight = 150,   type = 'item', image = '3d_printed_smg_mag.png',               unique = false, useable = false, shouldClose = true, description = 'A 3D printed SMG magazine' },
['3d_printed_compact_barrel']        = { name = '3d_printed_compact_barrel',        label = 'Printed Compact Barrel',   weight = 150,   type = 'item', image = '3d_printed_compact_barrel.png',        unique = false, useable = false, shouldClose = true, description = 'A 3D printed compact barrel' },
['3d_printed_folding_stock']         = { name = '3d_printed_folding_stock',         label = 'Printed Folding Stock',    weight = 250,   type = 'item', image = '3d_printed_folding_stock.png',         unique = false, useable = false, shouldClose = true, description = 'A 3D printed folding stock' },

-- oxide-weaponprinting: Rifle Parts
['3d_printed_rifle_barrel']          = { name = '3d_printed_rifle_barrel',          label = 'Printed Rifle Barrel',     weight = 400,   type = 'item', image = '3d_printed_rifle_barrel.png',          unique = false, useable = false, shouldClose = true, description = 'A 3D printed rifle barrel' },
['3d_printed_rifle_upper']           = { name = '3d_printed_rifle_upper',           label = 'Printed Rifle Upper',      weight = 300,   type = 'item', image = '3d_printed_rifle_upper.png',           unique = false, useable = false, shouldClose = true, description = 'A 3D printed rifle upper receiver' },
['3d_printed_rifle_lower']           = { name = '3d_printed_rifle_lower',           label = 'Printed Rifle Lower',      weight = 300,   type = 'item', image = '3d_printed_rifle_lower.png',           unique = false, useable = false, shouldClose = true, description = 'A 3D printed rifle lower receiver' },
['3d_printed_rifle_handguard']       = { name = '3d_printed_rifle_handguard',       label = 'Printed Rifle Handguard',  weight = 200,   type = 'item', image = '3d_printed_rifle_handguard.png',       unique = false, useable = false, shouldClose = true, description = 'A 3D printed rifle handguard' },
['3d_printed_rifle_mag']             = { name = '3d_printed_rifle_mag',             label = 'Printed Rifle Magazine',   weight = 200,   type = 'item', image = '3d_printed_rifle_mag.png',             unique = false, useable = false, shouldClose = true, description = 'A 3D printed rifle magazine' },
['3d_printed_rifle_stock']           = { name = '3d_printed_rifle_stock',           label = 'Printed Rifle Stock',      weight = 300,   type = 'item', image = '3d_printed_rifle_stock.png',           unique = false, useable = false, shouldClose = true, description = 'A 3D printed rifle stock' },
['3d_printed_bullpup_chassis']       = { name = '3d_printed_bullpup_chassis',       label = 'Printed Bullpup Chassis',  weight = 500,   type = 'item', image = '3d_printed_bullpup_chassis.png',       unique = false, useable = false, shouldClose = true, description = 'A 3D printed bullpup chassis' },

-- oxide-weaponprinting: Shotgun Parts
['3d_printed_shotgun_barrel']        = { name = '3d_printed_shotgun_barrel',        label = 'Printed Shotgun Barrel',   weight = 500,   type = 'item', image = '3d_printed_shotgun_barrel.png',        unique = false, useable = false, shouldClose = true, description = 'A 3D printed shotgun barrel' },
['3d_printed_shotgun_receiver']      = { name = '3d_printed_shotgun_receiver',      label = 'Printed Shotgun Receiver', weight = 400,   type = 'item', image = '3d_printed_shotgun_receiver.png',      unique = false, useable = false, shouldClose = true, description = 'A 3D printed shotgun receiver' },
['3d_printed_shotgun_stock']         = { name = '3d_printed_shotgun_stock',         label = 'Printed Shotgun Stock',    weight = 300,   type = 'item', image = '3d_printed_shotgun_stock.png',         unique = false, useable = false, shouldClose = true, description = 'A 3D printed shotgun stock' },
['3d_printed_pump_handle']           = { name = '3d_printed_pump_handle',           label = 'Printed Pump Handle',      weight = 150,   type = 'item', image = '3d_printed_pump_handle.png',           unique = false, useable = false, shouldClose = true, description = 'A 3D printed pump action handle' },
['3d_printed_double_barrel_set']     = { name = '3d_printed_double_barrel_set',     label = 'Printed Double Barrel Set', weight = 600,  type = 'item', image = '3d_printed_double_barrel_set.png',     unique = false, useable = false, shouldClose = true, description = 'A 3D printed double barrel assembly' },

-- oxide-weaponprinting: Sniper Parts
['3d_printed_sniper_barrel']         = { name = '3d_printed_sniper_barrel',         label = 'Printed Sniper Barrel',    weight = 600,   type = 'item', image = '3d_printed_sniper_barrel.png',         unique = false, useable = false, shouldClose = true, description = 'A 3D printed sniper barrel' },
['3d_printed_sniper_receiver']       = { name = '3d_printed_sniper_receiver',       label = 'Printed Sniper Receiver',  weight = 400,   type = 'item', image = '3d_printed_sniper_receiver.png',       unique = false, useable = false, shouldClose = true, description = 'A 3D printed sniper receiver' },
['3d_printed_sniper_mag']            = { name = '3d_printed_sniper_mag',            label = 'Printed Sniper Magazine',  weight = 200,   type = 'item', image = '3d_printed_sniper_mag.png',            unique = false, useable = false, shouldClose = true, description = 'A 3D printed sniper magazine' },
['3d_printed_sniper_stock']          = { name = '3d_printed_sniper_stock',          label = 'Printed Sniper Stock',     weight = 400,   type = 'item', image = '3d_printed_sniper_stock.png',          unique = false, useable = false, shouldClose = true, description = 'A 3D printed sniper stock' },
['3d_printed_long_scope']            = { name = '3d_printed_long_scope',            label = 'Printed Long Scope',       weight = 300,   type = 'item', image = '3d_printed_long_scope.png',            unique = false, useable = false, shouldClose = true, description = 'A 3D printed long range scope' },

-- oxide-weaponprinting: Machine Gun Parts
['3d_printed_drum_mag']              = { name = '3d_printed_drum_mag',              label = 'Printed Drum Magazine',    weight = 400,   type = 'item', image = '3d_printed_drum_mag.png',              unique = false, useable = false, shouldClose = true, description = 'A 3D printed drum magazine' },

-- oxide-weaponprinting: Printer Upgrades
printer_nozzle_mk1                   = { name = 'printer_nozzle_mk1',              label = 'Nozzle Mk I',             weight = 200,   type = 'item', image = 'printer_nozzle_mk1.png',              unique = false, useable = false, shouldClose = true, description = 'Basic printer nozzle upgrade' },
printer_nozzle_mk2                   = { name = 'printer_nozzle_mk2',              label = 'Nozzle Mk II',            weight = 200,   type = 'item', image = 'printer_nozzle_mk2.png',              unique = false, useable = false, shouldClose = true, description = 'Advanced printer nozzle upgrade' },
printer_nozzle_mk3                   = { name = 'printer_nozzle_mk3',              label = 'Nozzle Mk III',           weight = 200,   type = 'item', image = 'printer_nozzle_mk3.png',              unique = false, useable = false, shouldClose = true, description = 'Precision printer nozzle upgrade' },
printer_storage_mk1                  = { name = 'printer_storage_mk1',             label = 'Storage Drive Mk I',      weight = 100,   type = 'item', image = 'printer_storage_mk1.png',             unique = false, useable = false, shouldClose = true, description = 'Basic storage expansion' },
printer_storage_mk2                  = { name = 'printer_storage_mk2',             label = 'Storage Drive Mk II',     weight = 100,   type = 'item', image = 'printer_storage_mk2.png',             unique = false, useable = false, shouldClose = true, description = 'Advanced storage expansion' },
printer_storage_mk3                  = { name = 'printer_storage_mk3',             label = 'Storage Drive Mk III',    weight = 100,   type = 'item', image = 'printer_storage_mk3.png',             unique = false, useable = false, shouldClose = true, description = 'High-capacity storage expansion' },
printer_cooling_mk1                  = { name = 'printer_cooling_mk1',             label = 'Cooling Fan Mk I',        weight = 300,   type = 'item', image = 'printer_cooling_mk1.png',             unique = false, useable = false, shouldClose = true, description = 'Basic cooling system' },
printer_cooling_mk2                  = { name = 'printer_cooling_mk2',             label = 'Cooling Fan Mk II',       weight = 300,   type = 'item', image = 'printer_cooling_mk2.png',             unique = false, useable = false, shouldClose = true, description = 'Advanced cooling system' },
printer_cooling_mk3                  = { name = 'printer_cooling_mk3',             label = 'Cooling Fan Mk III',      weight = 300,   type = 'item', image = 'printer_cooling_mk3.png',             unique = false, useable = false, shouldClose = true, description = 'Industrial cooling system' },
printer_buildplate_mk1               = { name = 'printer_buildplate_mk1',          label = 'Build Plate Mk I',        weight = 500,   type = 'item', image = 'printer_buildplate_mk1.png',          unique = false, useable = false, shouldClose = true, description = 'Improved build plate' },
printer_buildplate_mk2               = { name = 'printer_buildplate_mk2',          label = 'Build Plate Mk II',       weight = 500,   type = 'item', image = 'printer_buildplate_mk2.png',          unique = false, useable = false, shouldClose = true, description = 'Advanced build plate' },
printer_buildplate_mk3               = { name = 'printer_buildplate_mk3',          label = 'Build Plate Mk III',      weight = 500,   type = 'item', image = 'printer_buildplate_mk3.png',          unique = false, useable = false, shouldClose = true, description = 'Precision build plate' },
printer_psu_mk1                      = { name = 'printer_psu_mk1',                 label = 'Power Supply Mk I',       weight = 800,   type = 'item', image = 'printer_psu_mk1.png',                 unique = false, useable = false, shouldClose = true, description = 'Upgraded power supply unit' },
printer_psu_mk2                      = { name = 'printer_psu_mk2',                 label = 'Power Supply Mk II',      weight = 800,   type = 'item', image = 'printer_psu_mk2.png',                 unique = false, useable = false, shouldClose = true, description = 'High-output power supply unit' },

Note on printer_usb: This item uses unique = true because each USB drive carries metadata with a specific blueprint name. Every USB is a distinct item.

ESX Item Registration (ox_inventory)

Heads up — weapon_ prefix is reserved. ox_inventory treats any item whose name starts with weapon_ as a weapon, which breaks the bench item. Rename weapon_bench to something without the prefix (e.g. weaponbench) and set Config.BenchItem to the same name in your config.lua. The example below uses weaponbench.

Add these to your ox_inventory/data/items.lua:

-- oxide-weaponprinting: Equipment Items

['3d_printer'] = { label = '3D Printer', weight = 10000, stack = true, close = true, description = 'A portable 3D printer for manufacturing parts' },
['printer_usb'] = { label = 'Printer USB', weight = 100, stack = false, close = true, description = 'A USB drive containing a 3D printing blueprint' },
['printer_filament'] = { label = 'Printer Filament', weight = 500, stack = true, close = true, description = 'Filament spool for 3D printers' },
['weaponbench'] = { label = 'Weapon Bench', weight = 15000, stack = true, close = true, description = 'A portable workbench for assembling weapon parts' },
['placeable_table'] = { label = 'Table', weight = 8000, stack = true, close = true, description = 'A placeable table' },
['printer_manual'] = { label = 'The Ghost Gunner\'s Handbook', weight = 500, stack = true, close = true, description = 'An in-game guide to 3D weapon printing' },

-- oxide-weaponprinting: Pistol Parts
['3d_printed_pistol_slide'] = { label = 'Printed Pistol Slide', weight = 300, stack = true, close = true, description = 'A 3D printed pistol slide' },
['3d_printed_pistol_grip'] = { label = 'Printed Pistol Grip', weight = 400, stack = true, close = true, description = 'A 3D printed pistol grip and frame' },
['3d_printed_pistol_clip'] = { label = 'Printed Pistol Magazine', weight = 200, stack = true, close = true, description = 'A 3D printed pistol magazine' },
['3d_printed_pistol_compact_frame'] = { label = 'Printed Compact Frame', weight = 200, stack = true, close = true, description = 'A 3D printed compact pistol frame' },
['3d_printed_revolver_frame'] = { label = 'Printed Revolver Frame', weight = 300, stack = true, close = true, description = 'A 3D printed revolver frame' },
['3d_printed_revolver_receiver'] = { label = 'Printed Revolver Receiver', weight = 300, stack = true, close = true, description = 'A 3D printed revolver receiver' },
['3d_printed_trigger_group'] = { label = 'Printed Trigger Group', weight = 100, stack = true, close = true, description = 'A 3D printed trigger assembly' },

-- oxide-weaponprinting: SMG Parts
['3d_printed_smg_barrel'] = { label = 'Printed SMG Barrel', weight = 200, stack = true, close = true, description = 'A 3D printed SMG barrel' },
['3d_printed_smg_receiver'] = { label = 'Printed SMG Receiver', weight = 300, stack = true, close = true, description = 'A 3D printed SMG receiver' },
['3d_printed_smg_mag'] = { label = 'Printed SMG Magazine', weight = 150, stack = true, close = true, description = 'A 3D printed SMG magazine' },
['3d_printed_compact_barrel'] = { label = 'Printed Compact Barrel', weight = 150, stack = true, close = true, description = 'A 3D printed compact barrel' },
['3d_printed_folding_stock'] = { label = 'Printed Folding Stock', weight = 250, stack = true, close = true, description = 'A 3D printed folding stock' },

-- oxide-weaponprinting: Rifle Parts
['3d_printed_rifle_barrel'] = { label = 'Printed Rifle Barrel', weight = 400, stack = true, close = true, description = 'A 3D printed rifle barrel' },
['3d_printed_rifle_upper'] = { label = 'Printed Rifle Upper', weight = 300, stack = true, close = true, description = 'A 3D printed rifle upper receiver' },
['3d_printed_rifle_lower'] = { label = 'Printed Rifle Lower', weight = 300, stack = true, close = true, description = 'A 3D printed rifle lower receiver' },
['3d_printed_rifle_handguard'] = { label = 'Printed Rifle Handguard', weight = 200, stack = true, close = true, description = 'A 3D printed rifle handguard' },
['3d_printed_rifle_mag'] = { label = 'Printed Rifle Magazine', weight = 200, stack = true, close = true, description = 'A 3D printed rifle magazine' },
['3d_printed_rifle_stock'] = { label = 'Printed Rifle Stock', weight = 300, stack = true, close = true, description = 'A 3D printed rifle stock' },
['3d_printed_bullpup_chassis'] = { label = 'Printed Bullpup Chassis', weight = 500, stack = true, close = true, description = 'A 3D printed bullpup chassis' },

-- oxide-weaponprinting: Shotgun Parts
['3d_printed_shotgun_barrel'] = { label = 'Printed Shotgun Barrel', weight = 500, stack = true, close = true, description = 'A 3D printed shotgun barrel' },
['3d_printed_shotgun_receiver'] = { label = 'Printed Shotgun Receiver', weight = 400, stack = true, close = true, description = 'A 3D printed shotgun receiver' },
['3d_printed_shotgun_stock'] = { label = 'Printed Shotgun Stock', weight = 300, stack = true, close = true, description = 'A 3D printed shotgun stock' },
['3d_printed_pump_handle'] = { label = 'Printed Pump Handle', weight = 150, stack = true, close = true, description = 'A 3D printed pump action handle' },
['3d_printed_double_barrel_set'] = { label = 'Printed Double Barrel Set', weight = 600, stack = true, close = true, description = 'A 3D printed double barrel assembly' },

-- oxide-weaponprinting: Sniper Parts
['3d_printed_sniper_barrel'] = { label = 'Printed Sniper Barrel', weight = 600, stack = true, close = true, description = 'A 3D printed sniper barrel' },
['3d_printed_sniper_receiver'] = { label = 'Printed Sniper Receiver', weight = 400, stack = true, close = true, description = 'A 3D printed sniper receiver' },
['3d_printed_sniper_mag'] = { label = 'Printed Sniper Magazine', weight = 200, stack = true, close = true, description = 'A 3D printed sniper magazine' },
['3d_printed_sniper_stock'] = { label = 'Printed Sniper Stock', weight = 400, stack = true, close = true, description = 'A 3D printed sniper stock' },
['3d_printed_long_scope'] = { label = 'Printed Long Scope', weight = 300, stack = true, close = true, description = 'A 3D printed long range scope' },

-- oxide-weaponprinting: Machine Gun Parts
['3d_printed_drum_mag'] = { label = 'Printed Drum Magazine', weight = 400, stack = true, close = true, description = 'A 3D printed drum magazine' },

-- oxide-weaponprinting: Printer Upgrades
['printer_nozzle_mk1'] = { label = 'Nozzle Mk I', weight = 200, stack = true, close = true, description = 'Basic printer nozzle upgrade' },
['printer_nozzle_mk2'] = { label = 'Nozzle Mk II', weight = 200, stack = true, close = true, description = 'Advanced printer nozzle upgrade' },
['printer_nozzle_mk3'] = { label = 'Nozzle Mk III', weight = 200, stack = true, close = true, description = 'Precision printer nozzle upgrade' },
['printer_storage_mk1'] = { label = 'Storage Drive Mk I', weight = 100, stack = true, close = true, description = 'Basic storage expansion' },
['printer_storage_mk2'] = { label = 'Storage Drive Mk II', weight = 100, stack = true, close = true, description = 'Advanced storage expansion' },
['printer_storage_mk3'] = { label = 'Storage Drive Mk III', weight = 100, stack = true, close = true, description = 'High-capacity storage expansion' },
['printer_cooling_mk1'] = { label = 'Cooling Fan Mk I', weight = 300, stack = true, close = true, description = 'Basic cooling system' },
['printer_cooling_mk2'] = { label = 'Cooling Fan Mk II', weight = 300, stack = true, close = true, description = 'Advanced cooling system' },
['printer_cooling_mk3'] = { label = 'Cooling Fan Mk III', weight = 300, stack = true, close = true, description = 'Industrial cooling system' },
['printer_buildplate_mk1'] = { label = 'Build Plate Mk I', weight = 500, stack = true, close = true, description = 'Improved build plate' },
['printer_buildplate_mk2'] = { label = 'Build Plate Mk II', weight = 500, stack = true, close = true, description = 'Advanced build plate' },
['printer_buildplate_mk3'] = { label = 'Build Plate Mk III', weight = 500, stack = true, close = true, description = 'Precision build plate' },
['printer_psu_mk1'] = { label = 'Power Supply Mk I', weight = 800, stack = true, close = true, description = 'Upgraded power supply unit' },
['printer_psu_mk2'] = { label = 'Power Supply Mk II', weight = 800, stack = true, close = true, description = 'High-output power supply unit' },

Important Notes on Item Metadata

Several items carry metadata that must be preserved through inventory operations:

  • printer_usb - Contains blueprint key identifying which weapon blueprint is stored on the USB drive
  • Assembled weapons - Weapons produced at the weapon bench carry printed = true, durability, quality, grade, and a display table for inventory tooltip rendering

The printer_usb item should be registered as non-stackable (unique = true for QBCore, stack = false for ox_inventory) because each USB holds a different blueprint in its metadata.

Metadata Display (qb-inventory)

Assembled weapons include a display metadata table for clean inventory tooltips. If you have already applied the display table rendering patch from another Oxide resource (e.g., oxide-weed), no further changes are needed. If not, see the Oxide Weed Installation Guide for the qb-inventory tooltip patch instructions.

Framework Setup

oxide-weaponprinting uses o-link for all framework interactions. No framework-specific configuration is required beyond registering the items listed above — o-link handles framework detection automatically. The bridge handles:

  • Usable item registration
  • Inventory add/remove/check operations
  • Player character metadata for progression
  • Notification delivery
  • Progress bar during bench assembly
  • Targeting via ox_target

Verification

  1. Start your server and check the console for:

    [oxide-weaponprinting] oxide-weaponprinting initialized

    (Debug messages only appear when Config.Debug = true)

  2. Use /printer_kit in-game (requires admin permission) to receive filament and a pistol blueprint USB

  3. Use the 3D printer item from your inventory to enter placement mode

  4. Place the printer, interact with it via ox_target, and verify the NUI opens

Distributing Blueprint USBs to Players

oxide-weaponprinting does not include a built-in way for players to obtain blueprint USBs through normal gameplay — this is intentional. Server owners choose how USBs enter their economy: shops, NPC vendors, crafting, loot drops, heists, black market dealers, or any other system.

USB Metadata Format

A printer_usb item must carry a blueprint key in its metadata that matches a key from Config.Blueprints (defined in shared/config/blueprints.lua). Without this metadata, the USB cannot be loaded into a printer.

-- The metadata structure for a blueprint USB:
{ blueprint = 'pistol' }  -- value must match a Config.Blueprints key

Valid Blueprint Keys

These are the keys you can use in the blueprint metadata field. Each key corresponds to a weapon blueprint and is gated behind a player level (see Progression).

LevelBlueprint Keys
1sns_pistol, vintage_pistol, flare_gun, pistol, sns_pistol_mk2, ceramic_pistol, double_action_revolver, marksman_pistol, machine_pistol
2micro_smg, mini_smg, smg, smg_mk2, combat_pdw, assault_smg, pump_shotgun, sawnoff_shotgun, db_shotgun, auto_shotgun
3combat_pistol, ap_pistol, pistol_mk2, heavy_pistol
4assault_rifle, carbine_rifle, special_carbine, compact_rifle, bullpup_rifle, pump_shotgun_mk2, bullpup_shotgun, assault_shotgun
5assault_rifle_mk2, carbine_rifle_mk2, special_carbine_mk2, bullpup_rifle_mk2, advanced_rifle, military_rifle, heavy_rifle, heavy_shotgun
6pistol_50, heavy_revolver, heavy_revolver_mk2, navy_revolver
7sniper_rifle, marksman_rifle, marksman_rifle_mk2
8mg, combat_mg, combat_mg_mk2, heavy_sniper, heavy_sniper_mk2
9perico_pistol

Integration Examples

Adding USBs to a Shop (oxide-shops)

Add printer_usb entries to your shop config with the appropriate metadata:

-- Example shop item entry
{
    name = 'printer_usb',
    price = 5000,
    metadata = { blueprint = 'pistol' },
},
{
    name = 'printer_usb',
    price = 15000,
    metadata = { blueprint = 'smg' },
},

Giving a USB via Server Script

-- QBCore
local Player = QBCore.Functions.GetPlayer(source)
Player.Functions.AddItem('printer_usb', 1, nil, { blueprint = 'assault_rifle' })

-- ESX (ox_inventory)
exports.ox_inventory:AddItem(source, 'printer_usb', 1, { blueprint = 'assault_rifle' })

-- Via o-link (framework-agnostic, recommended)
olink.inventory.AddItem(source, 'printer_usb', 1, nil, { blueprint = 'assault_rifle' })

Adding USBs to a Loot Table or Crafting Recipe

Use whatever loot/crafting system your server runs — the only requirement is that the resulting printer_usb item includes the correct metadata. For example, if your crafting system supports metadata on output items:

-- Example crafting recipe (syntax varies by crafting resource)
{
    name = 'printer_usb',
    amount = 1,
    metadata = { blueprint = 'pistol' },
    ingredients = {
        { name = 'electronic_parts', amount = 3 },
        { name = 'usb_stick', amount = 1 },
    },
}

Important Notes

  • Each USB is a unique/non-stackable item because the metadata differs per blueprint
  • The blueprint value is case-sensitive and must exactly match a key in Config.Blueprints
  • Players still need the required progression level to use a USB — owning a high-tier USB at level 1 won't let them load it into a printer
  • USBs have a malfunction chance when loaded (see USB Malfunction) — they are consumable and can be destroyed on use
  • The admin command /givewepblueprint [id] [name] [amount] can be used for testing (see Admin Guide)

Next Steps

  • Features - Understand every gameplay mechanic in detail
  • Configuration - Customize all settings for your server
  • Admin - Learn the admin commands for testing and management