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
community_bridgelatestFramework abstraction layer (available from the Oxide Studios Discord)

Supported Frameworks

FrameworkSupport
QBCoreFull
ESXFull
QBX (qbx_core)Full
CustomVia community_bridge

Installation Steps

1. Download and Place Resource

Place the oxide-weaponprinting folder in your server's resources directory:

resources/
└── [oxide]/
    └── oxide-weaponprinting/

2. Add to Server Config

Add the following to your server.cfg, ensuring dependencies start first:

QBCore:

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

ESX:

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

QBX:

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

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

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

4. Item Registration

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

Item images: Copy all .png files from oxide-weaponprinting/itemimages/ to your inventory's image directory:

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

Equipment 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 all .png files from oxide-weaponprinting/itemimages/ to qb-inventory/html/images/.

Step 2: Add items 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)

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' },
['weapon_bench'] = { 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.

5. Configure

Review and adjust configuration files in shared/config.lua and shared/config/*.lua to match your server's needs. See Configuration for all available settings.


Framework Setup

oxide-weaponprinting uses community_bridge for all framework interactions. If you do not already have it installed, download it from the community_bridge Discord. No framework-specific configuration is needed beyond registering the items listed above. The bridge handles:

  • Usable item registration
  • Inventory add/remove/check operations
  • Player metadata for progression
  • Notification delivery

Verification

After installation, verify the following:

  • Resource starts without errors in server console
  • Database tables are created
  • Use /printer_kit in-game (requires admin permission) to receive filament and a pistol blueprint USB
  • Use the 3D printer item from your inventory to enter placement mode
  • 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

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

-- 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' })

-- community_bridge (recommended)
Bridge.Inventory.AddItem(source, 'printer_usb', 1, { blueprint = 'assault_rifle' })

Adding USBs to a Loot Table or Crafting Recipe

-- 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 Features) — they are consumable and can be destroyed on use
  • The admin command /givewepblueprint [id] [name] [amount] can be used for testing (see Admin Tools)

Troubleshooting

If you encounter issues during installation, see Troubleshooting.