10 Chapter 8: Parts System
Every weapon in Borderlands 4 is an assembly. A Daedalus pistol isn’t one object — it’s a barrel, a grip, a magazine, a scope, and a body bolted together, each chosen from a pool of compatible parts. Swap the barrel and you change damage. Swap the grip and you change handling. The combinations run into the millions, and every one of them needs to encode into a compact serial string.
BL4’s parts system lives in NCS (Nexus Config Store) files, not in Unreal Engine assets. This is a fundamental departure from Borderlands 3, where parts were defined in PartSet and PartPool uassets that tools like FModel could read directly. In BL4, you won’t find a single InventoryPartDef in the pak files. Part definitions are native C++ objects compiled into the game binary, and the only structured record of what parts exist — and which ones go together — is the NCS inventory data.
This chapter maps the entire parts system: what parts exist, how they’re named, how they compose into items, and where the remaining gaps are.
10.1 Data Sources
Two sources provide part data, and they don’t agree.
| Source | File | Parts | What It Provides |
|---|---|---|---|
| NCS extraction | share/manifest/item_parts.json |
1,614 | Complete item-to-parts mapping (authoritative) |
| Memory extraction | share/manifest/parts_database.json |
5,368 | Parts with serial indices, category IDs |
NCS extraction is the authoritative source for which parts exist and which items they belong to. It’s static — extracted from the game’s pak files, deterministic, reproducible:
# Extract all item parts from NCS
bl4 ncs extract /path/to/ncsdata/pakchunk4-*/Nexus-Data-inv4.bin -t item-parts --json -o item_parts.jsonMemory extraction captures runtime data from the game process. It provides serial indices (the numeric IDs needed to encode parts into serial strings) and category assignments, but it’s incomplete — parts that aren’t loaded in the current game session don’t appear. A dump taken in the main menu will miss parts that only load when specific items are in your inventory.
The two sources are complementary. NCS tells you what parts exist. Memory tells you how they’re indexed.
10.2 Item Types
BL4 has 30 weapon types and one shield type. Weapons are organized by manufacturer and weapon class — not every manufacturer makes every class.
10.2.1 Weapons
| Manufacturer | PS | SG | AR | SM | SR | HW |
|---|---|---|---|---|---|---|
| BOR (Ripper) | - | Y | - | Y | Y | Y |
| DAD (Daedalus) | Y | Y | Y | Y | - | - |
| JAK (Jakobs) | Y | Y | Y | - | Y | - |
| MAL (Maliwan) | - | Y | - | Y | Y | Y |
| ORD (Order) | Y | - | Y | - | Y | - |
| TED (Tediore) | Y | Y | Y | - | - | - |
| TOR (Torgue) | Y | Y | Y | - | - | Y |
| VLA (Vladof) | - | - | Y | Y | Y | Y |
Table 8.1: Weapon types by manufacturer. PS=Pistol, SG=Shotgun, AR=Assault Rifle, SM=SMG, SR=Sniper Rifle, HW=Heavy Weapon.
That’s 8 manufacturers and 6 weapon classes. Each manufacturer produces 3-4 weapon classes, giving 30 distinct weapon types.
10.2.2 Shields
Shields are a single type: Armor_Shield, with 70 parts split between manufacturer-specific cores (44 parts) and reactive armor augments (26 parts).
10.3 Part Naming Convention
Part names follow predictable patterns, and learning them makes the raw data readable at a glance.
10.3.1 Weapon Parts
{MANUFACTURER}_{WEAPONTYPE}_{SLOT}_{VARIANT}
The manufacturer is a three-letter code (DAD, JAK, BOR, etc.). The weapon type is a two-letter abbreviation (PS, SG, AR, SM, SR, HW). The slot identifies where the part attaches. The variant distinguishes between alternatives.
Examples:
DAD_PS_Barrel_01— Daedalus Pistol, Barrel slot, base variantDAD_PS_Barrel_01_A— Daedalus Pistol, Barrel slot, A variantJAK_SG_Grip_03— Jakobs Shotgun, Grip slot, variant 3VLA_AR_Scope_IronSight— Vladof Assault Rifle, iron sight scope
10.3.2 Shield Parts
part_{type}_{name}
part_core_{manufacturer}_{effect}
part_ra_{augment}_{slot}
Examples:
part_core_dad_accelerator— Daedalus shield core with accelerator effectpart_ra_armor_segment_primary— Primary reactive armor augment
10.3.3 Licensed and Special Parts
Some parts break the standard convention:
LicensedPart_WeaponSpecific_UB_Tier1— Tiered weapon-specific underbarrelpart_barrel_licensed_ted_mirv— Tediore licensed barrel with MIRV reloadcomp_05_legendary_Zipgun— Legendary composition for the Zipgun
10.4 Part Categories
10.4.1 Weapon Parts
Each weapon type draws from the same eight part slots, though the counts vary:
| Slot | Typical Count | Notes |
|---|---|---|
| Barrel | ~10 | 2 base types x 4 variants, plus legendaries |
| Body | 5 | Base + A/B/C/D variants |
| Grip | 5-8 | |
| Magazine | 4-6 | |
| Scope | 10-11 | Includes iron sights |
| Foregrip | 3 | |
| Underbarrel | 4-6 | |
| Top Accessory | 5-8 |
Table 8.2: Weapon part slots and typical part counts.
10.4.2 Shield Parts
Shields use a different slot structure:
- Core (44 total) — manufacturer-specific, determines the shield’s base behavior
- Reactive Armor Primary (13 types) — augments primary defense
- Reactive Armor Secondary (13 types) — augments secondary defense
10.4.3 Part Counts by Item Type
The full breakdown across all 31 item types totals 1,614 parts:
| Item Type | Parts | Item Type | Parts | |
|---|---|---|---|---|
| Armor_Shield | 70 | ORD_AR | 54 | |
| BOR_HW | 15 | ORD_PS | 59 | |
| BOR_SG | 55 | ORD_SR | 54 | |
| BOR_SM | 57 | TED_AR | 57 | |
| BOR_SR | 55 | TED_PS | 60 | |
| DAD_AR | 56 | TED_SG | 58 | |
| DAD_PS | 56 | TOR_AR | 55 | |
| DAD_SG | 56 | TOR_HW | 15 | |
| DAD_SM | 55 | TOR_PS | 56 | |
| JAK_AR | 56 | TOR_SG | 53 | |
| JAK_PS | 53 | VLA_AR | 68 | |
| JAK_SG | 53 | VLA_HW | 20 | |
| JAK_SR | 55 | VLA_SM | 65 | |
| MAL_HW | 15 | VLA_SR | 63 | |
| MAL_SG | 56 | |||
| MAL_SM | 58 | Total | 1,614 | |
| MAL_SR | 56 |
Table 8.3: Part counts by item type.
Heavy weapons (BOR_HW, MAL_HW, TOR_HW) have notably fewer parts at 15 each, except Vladof heavy weapons at 20. Most standard weapons cluster around 53-60 parts.
10.5 Category Mappings
The serial format assigns each item type a numeric category ID. Decoding a serial requires knowing which category you’re looking at — it determines how part indices map to actual parts.
10.5.1 Weapons
| Range | Type | Categories |
|---|---|---|
| 2-7 | Pistols | DAD, JAK, TED, TOR, ORD, VLA |
| 8-12 | Shotguns | DAD, JAK, TED, TOR, BOR |
| 13-18 | Assault Rifles | DAD, JAK, TED, TOR, VLA, ORD |
| 19 | Maliwan Shotgun | MAL_SG |
| 20-23 | SMGs | DAD, BOR, VLA, MAL |
| 25 | BOR Sniper | BOR_SR |
| 26-29 | Snipers | JAK, VLA, ORD, MAL |
| 244-247 | Heavy Weapons | VLA, TOR, BOR, MAL |
Table 8.4: Weapon category ID ranges.
10.5.2 Equipment
| Category | Type | Status |
|---|---|---|
| 44 | Dark Siren Class Mod | Named, no parts in dump |
| 55 | Paladin Class Mod | Named, no parts in dump |
| 97 | Gravitar Class Mod | Named, 2 parts mapped |
| 140 | Exo Soldier Class Mod | Named, no parts in dump |
| 151 | Firmware | Named, no parts in dump |
| 279-288 | Shields | Energy, BOR, DAD, JAK, Armor, MAL, ORD, TED, TOR, VLA |
| 289 | Shield Variant | Named, unknown subtype |
| 300-330 | Gadgets | Grenade (300), Turret (310), Repair (320), Terminal (330) |
| 400-409 | Enhancements | DAD, BOR, JAK, MAL, ORD, TED, TOR, VLA, COV, ATL |
Table 8.5: Equipment category ID ranges.
10.5.3 Category Derivation
Categories can be derived from serial data depending on format:
VarInt-first (weapons): category from WEAPON_INFO lookup table
VarBit-first (equipment): category = first_varbit / 384 (or / 8192 for some items)
The category_from_prefix() function in bl4-ncs can also derive categories from manufacturer prefixes when processing NCS data directly (e.g., BOR_SG maps to category 7, JAK_SG maps to category 9).
10.6 Composition System
Items don’t just have parts — they have compositions that control which parts appear at each rarity tier. The composition system is how the game decides that a common Daedalus pistol gets basic parts while a legendary one gets unique, named parts.
10.6.1 Rarity Tiers
Five composition tiers correspond to the game’s rarity levels:
| Tier | Composition Prefix | Rarity |
|---|---|---|
| 1 | comp_01_common |
Common (white) |
| 2 | comp_02_uncommon |
Uncommon (green) |
| 3 | comp_03_rare |
Rare (blue) |
| 4 | comp_04_epic |
Epic (purple) |
| 5 | comp_05_legendary |
Legendary (orange) |
Table 8.6: Composition tiers.
Each composition can reference:
- Part slot assignments (which parts are eligible at this rarity)
- Rarity weights (
firmware_weight_XX_rarity) controlling drop frequency - Unique part mandates for legendaries
10.6.2 Legendary Compositions
Legendary items use comp_05_legendary_* compositions that mandate specific unique parts. These compositions name the legendary and pin particular parts that give it its identity:
comp_05_legendary_Zipgun
uni_zipper <- Unique naming part (red text flavor)
part_barrel_01_Zipgun <- Mandatory unique barrel
comp_05_legendary_GoreMaster
part_barrel_02_GoreMaster
comp_05_legendary_OM <- Oscar Mike
part_barrel_unique_OM
The unique naming part (prefixed uni_) is what gives the weapon its red-text name in the game UI. The mandatory parts give the weapon its distinctive behavior — the Zipgun’s barrel is what makes it a Zipgun.
10.7 Licensed Parts
Licensed parts are BL4’s cross-pollination system. They let weapons gain abilities from other manufacturers — a Jakobs shotgun with a Tediore reload, or a Vladof rifle with a Maliwan underbarrel.
10.7.1 License Types
| License | Effect | Slot |
|---|---|---|
| Jakobs Ricochet | Critical hits ricochet to nearby targets | Barrel Acc |
| Hyperion Shield | Weapon shield while aiming | Barrel Acc |
| Hyperion Grip | Accuracy bonuses | Grip |
| Tediore Reload | Throw weapon on reload | Barrel Acc, Grip |
| Torgue Mag | Explosive magazine | Magazine |
| Borg Mag | Borg magazine bonus | Magazine |
| Forge Mag | COV repair mechanic | Magazine |
| Atlas UB | Atlas underbarrel | Underbarrel |
| Daedalus UB | Daedalus underbarrel | Underbarrel |
| Maliwan UB | Maliwan underbarrel | Underbarrel |
Table 8.7: Licensed part types.
10.7.2 Tediore Reload Variants
The Tediore reload license has the most variation — six distinct payload types:
| Part | Effect |
|---|---|
part_barrel_licensed_ted |
Default throw |
part_barrel_licensed_ted_combo |
Combo reload |
part_barrel_licensed_ted_mirv |
MIRV explosion |
part_barrel_licensed_ted_shooting |
Gun continues shooting mid-air |
part_barrel_licensed_ted_replicator |
Gun replicates on throw |
part_barrel_licensed_ted_replicator_multi |
Multi-replicator variant |
Table 8.8: Tediore reload variants.
10.7.3 Weapon-Specific Underbarrels
Some weapons have tiered underbarrel parts that unlock progressively:
LicensedPart_WeaponSpecific_UB_Tier0_Vladof— Vladof-exclusive tier 0LicensedPart_WeaponSpecific_UB_Tier1throughTier4— Tiered unlocks
10.7.4 KL (Killer License) Parts
Certain weapons have dedicated _KL suffix slots:
DAD_PS_KL— Daedalus Pistol killer licenseJAK_PS_KL— Jakobs Pistol killer license
These appear to be dedicated slots for applying licensed part effects, separate from the standard part slots.
10.8 Serial Index Architecture
To encode a part into a serial string, the game needs a numeric index for every part. These indices are assigned by the GbxSerialNumberProvider system at runtime.
10.8.1 GbxSerialNumberIndex Structure
GbxSerialNumberIndex:
Category : Int64 <- Part group ID
scope : Byte <- Root/Sub scope
status : Byte <- Active/Static/etc.
Index : Int16 <- Part index within group
Each part is self-describing — the serial format encodes the category, scope, and index together, so a serial can be decoded without knowing the item type in advance.
10.8.2 Part Index Resolution
Part indices in serials map directly to the parts database for the item’s category. The index is used as-is — no bit manipulation is needed. With the corrected bit assembly (nibble-reversed VarInt/VarBit values), part indices resolve correctly to the NCS-extracted parts database.
10.8.3 Registration Order
Part indices aren’t stored in NCS for most manufacturers. Only BOR (Ripper) parts have inline serial indices embedded as null-terminated strings directly after the part name:
BOR_SG_Grip_01\0 42\0 part_grip_02\0 ...
BOR_SG_Grip_02\0 43\0 part_grip_03\0 ...
That’s 36 BOR parts with extractable indices — roughly 2.2% of the total 1,614 parts. For the other 98%, indices are assigned at runtime when the game engine registers parts with GbxSerialNumberProvider. This means the only complete source for serial indices is a memory dump from a running game process.
Serial index assignments may change between game versions. A parts database extracted from one patch may produce incorrect decodes on another. Always verify against the current game version.
10.9 Part Validation
With the parts data extracted, you can validate whether a given part belongs to a given item type.
10.9.1 Using item_parts.json
import json
with open('share/manifest/item_parts.json') as f:
items = json.load(f)
# Build lookup: item_id -> set of valid parts
valid_parts = {item['item_id']: set(item['parts']) for item in items}
# Check if a part is valid for an item
def is_valid_part(item_id: str, part_name: str) -> bool:
return part_name in valid_parts.get(item_id, set())
# Example
is_valid_part('DAD_PS', 'DAD_PS_Barrel_01') # True
is_valid_part('DAD_PS', 'JAK_PS_Barrel_01') # False10.9.2 Using the CLI
# Extract parts for a specific item type
bl4 ncs extract inv4.bin -t item-parts | grep "DAD_PS_"
# Decode a serial to see its category and parts
bl4 serial decode '@Uge8;)m/&zJ!tkr0N4>8ns8H{t!6ljj'
# Output includes: Category: Paladin Class Mod (55)10.9.3 NCS vs. Memory: Source of Truth
| Source | Parts for DAD_PS | Status |
|---|---|---|
| NCS inv.bin | 56 | Complete |
| Memory extraction | 34 | Incomplete |
NCS is the authoritative source for valid parts. Memory extraction misses parts that aren’t currently loaded in the game process. Always use NCS-extracted data for part validation. Use memory data only when you need serial indices.
10.10 Level Gating
Parts and features are gated by player level through Att_MinGameStage_* attributes. These control when parts can appear on dropped or vendor items — a level 5 character won’t find Jakobs Ricochet licensed parts.
10.10.1 Known Level-Gated Categories
| Category | Attribute Pattern |
|---|---|
| Weapon Types | Att_MinGameStage_WeaponType_* |
| Shield Types | Att_MinGameStage_ShieldType_* |
| Manufacturers | Att_MinGameStage_Manufacturer_* |
| Elements | Att_MinGameStage_Element_* |
| Licensed Parts | Att_MinGameStage_LicensedPart_* |
| Enhancement Tiers | Att_MinGameStage_Enhancement_Stats_Tier* |
| Gadgets | Att_MinGameStage_Gadget_* |
Table 8.9: Level gating categories.
Each licensed part has its own MinGameStage attribute. The full list:
Att_MinGameStage_LicensedPart_JakobsRicochet
Att_MinGameStage_LicensedPart_HyperionShield
Att_MinGameStage_LicensedPart_HyperionGrip
Att_MinGameStage_LicensedPart_TedioreReload_TopACC
Att_MinGameStage_LicensedPart_TedioreReload_Grip
Att_MinGameStage_LicensedPart_TorgueMag
Att_MinGameStage_LicensedPart_ForgeMag
Att_MinGameStage_LicensedPart_BorgMag
Att_MinGameStage_LicensedPart_Atlas_UB
Att_MinGameStage_LicensedPart_Daedalus_UB
Att_MinGameStage_LicensedPart_Maliwan_UB
Att_MinGameStage_LicensedPart_WeaponSpecific_UB_Tier0_Vladof
Att_MinGameStage_LicensedPart_WeaponSpecific_UB_Tier1
Att_MinGameStage_LicensedPart_WeaponSpecific_UB_Tier2
Att_MinGameStage_LicensedPart_WeaponSpecific_UB_Tier3
Att_MinGameStage_LicensedPart_WeaponSpecific_UB_Tier4
The actual level thresholds (e.g., “Jakobs Ricochet unlocks at level 15”) are not stored in NCS files. They’re likely defined in binary data tables or engine code and haven’t been located yet.
10.11 Known Gaps
The parts system is roughly 95% mapped, but several areas remain incomplete.
10.11.1 Rainbow Vomit Legendary Parts
The Rainbow Vomit (Jakobs Legendary Shotgun) serves as our benchmark for decode resolution. After the bit 7 discovery, 7 of 10 parts resolve correctly (70%). Three indices remain unresolved: 73, 201, and 206.
These correspond to legendary-specific parts found in pak extraction but absent from the NCS inventory files:
part_barrel_RainbowVomitpart_mag_RainbowVomit- 10 elemental body variants:
part_body_ele_RainbowVomit_Cor_Fire_Shock, etc.
Twelve legendary-specific parts total. Their serial indices need manual mapping or memory extraction.
10.11.2 Non-Prefixed Parts
Parts without manufacturer prefixes can’t have categories derived from NCS:
comp_*— rarity modifiers that exist in multiple categoriespart_firmware_*— no manufacturer prefixpart_ra_*— reactive armor parts with unknown categorization
These require memory dumps or manual mapping.
10.11.3 Missing Class Mod Parts
Three of four class mod categories have no parts in any dump:
| Category | Class | Parts Found |
|---|---|---|
| 44 | Dark Siren | 0 |
| 55 | Paladin | 0 |
| 97 | Gravitar | 2 |
| 140 | Exo Soldier | 0 |
Only Gravitar has any parts mapped (part_grav_asm_legendaryGravitar and part_grav_asm_skill_test). The others require memory dumps taken while the relevant class mods are equipped.
10.11.4 Equipment Low Resolution
Equipment serials (class mods, firmware) decode with improving resolution as the parts database grows. Some part indices still map to nothing in the current database, particularly for equipment categories not yet fully extracted from NCS.
10.12 Key Differences from BL3
If you’ve worked with Borderlands 3 modding, the parts system will feel familiar in concept but different in every implementation detail.
| Aspect | BL3 | BL4 |
|---|---|---|
| Part definitions | PartSet/PartPool uassets | NCS inv.bin (native C++ objects) |
| Part lists | GestaltPartListData for all items | Gestalt only for AI/creatures |
| Weapon assets | Include part pool references | Mesh components only |
| Validation | Check PartSet for weapon type | Check NCS composition |
| Category mappings | Extractable from pak | Runtime-assigned, memory-only |
| Serial indices | Static in assets | Runtime-assigned by GbxSerialNumberProvider |
Table 8.10: BL3 vs. BL4 parts system comparison.
The biggest practical difference: in BL3, a motivated person with FModel could extract complete part data from the pak files alone. In BL4, you need NCS parsing for part lists and memory extraction for serial indices. No single source gives you everything.
10.13 Unresolved Questions
A few aspects of the parts system remain unproven:
Rarity filtering — Parts have
firmware_weight_XX_rarityvalues in NCS. It’s unclear whether common-weighted parts can appear on legendary items.License availability — We’ve confirmed that some weapons accept specific licenses (e.g., BOR SG can have Jakobs/Hyperion/Tediore licenses), but the complete mapping of which weapons accept which licenses is incomplete.
Per-item restrictions — Legendaries may impose restrictions through their compositions beyond what the base part list shows.
These gaps are tractable. More memory dumps across different characters, levels, and loadouts will fill them in. The next chapter covers the bl4 CLI tools that make this extraction practical.