Wardogs: Buildables

Source: Wardogs/Plugins/GameFeatures/Items/Buildables (206 files), the buildable cash tables under Content/GameMechanics/Gamemode/Data/CashRewardsDataTable and the reward plugin BuildableRewards. Every table below is generated by _tools/buildable_tables.py; do not edit it by hand.

This page is the per-structure inventory: what exists, what it costs, how tough it is, where it can be placed and what it pays. The Items page, section 6 holds the hammer lists, the bounding boxes and the older damage matrix; this page adds the rest.

Labels: Data is read straight from the export. Native is read from the game code. Derived is worked out from Data or Native values. “Not traced” means nobody has followed it yet.

  • Files under the Buildables plugin: 206.
  • Buildable data assets: 32 (31 WDBuildableDataAsset, 1 WDBuildableHotZoneMagnetDataAsset).
  • Build-stage definitions: 31.
  • Rows in the entity name table: 36; in the vendor table: 8; in the damage table: 20.
  • Hammer lists: Small 7, Medium 12, Large 19.

1. How a buildable is put together

A player builds with a hammer (Small, Medium or Large). The hammer’s table says which buildables it can place. Placing makes a schematic (a see-through ghost). Building then moves it through stages until it is finished. Hammers need Build Supplies to work (Data: the item descriptions in section 7).

Piece What it is Where
WDBuildableDataAsset The main definition: tag, supply cost, health, placement rules, damage row, sounds, wheel slot one DA_Buildable_* per structure or part
WDActorBuildSpawner A small sub-object inside each definition. It names the actor class that is created (B_Buildable_C for most structures) 32 of them, one per definition
BuildingStagesDefinition The build stages: a progress threshold, the meshes shown and the weak spots (critical-hit spots) per stage one *_Stages per definition
Radial wheel slot The icon and title in the build wheel DA_RadialWheelSlotType_*
Damage row What each damage type does to the structure DT_GlobalDamage_BuildableData

Data. The special spawner classes are: B_Buildable_BarbedWire_C, B_Buildable_CamoNetTent_C, B_Buildable_Radio_C, B_Buildable_BremmerWall_C, B_Buildable_HBlock_QuadWall_C, B_BuildableRefuelStation_C, B_BuildableRepairStation_C, B_Buildable_HotzoneMagnet_C, B_Buildable_CrowsNestActorReplacing_C and B_Buildable_Door_ActorReplacing_C. The Forward Operating Base picks a class by faction (section 8).

Data. The feature root Buildables adds a pawn component (WDPawnBuildableManager) to the player character and a vehicle component (WDVehicleBuildableComponent) to stationary vehicles. It also registers the vendor table, the radial wheel registry and the build tool HUD widget (W_BuildTool).

2. Inventory

One row per definition (32 rows). Parts of a bigger structure (floor, roof, gate halves) are separate definitions and cannot be picked from the wheel alone.

  • Supply cost is the Cost field (Data). The game code has three cost getters on the asset: GetPlacementCost, GetTotalBuildCost and GetTotalSupplyCost (Native, reflection thunks at RVA 0x8593E80, 0x8593FB0, 0x85940E0). The first two read a float scale from the player’s object. How Cost becomes Build Supplies spent, and whether it is taken at placement or while building, is not traced.
  • Name is DisplayName, or the row in DT_EntityData_UI_Buildables when that is empty. (blank in export) means the text key exists but its source string is empty in the export (WoodBase, Shelter and the Recon Tower parts). The UI name table gives the same name to HBlock, TallHBlock and HBlockQuadWall (“HBlock”), while the asset names are Hesco Block (Small), Hesco Block (Large) and Hesco Wall.
  • Repair multiplier is RepairSpeedMultiplier. - means the field is not set. Meaning of the number beyond “bigger repairs faster” is not traced.
  • Hammers: S, M, L = Small, Medium, Large (Data, the three DT_Buildables_*Hammer tables). Parts are placed together with their parent.

| Asset | Tag | Name (UI text) | Supply cost | Max health | Repair multiplier | Stages | Hammers | Part of | |—|—|—|—|—|—|—|—|—| | DA_Buildable_AirRaidShelter | Id.Buildable.AirRaidShelter | Indirect Fire Shelter | 200 | 5,000 | 6.67 | 5 | L | - | | DA_Buildable_AirRaidShelter_Ceiling | Id.Buildable.AirRaidShelter.Ceiling | Indirect Fire Shelter | 10 | 2,250 | 0.67 | 1 | with AirRaidShelter | AirRaidShelter | | DA_Buildable_AirRaidShelter_Floor | Id.Buildable.AirRaidShelter.Floor | Indirect Fire Shelter | 10 | 2,250 | 0.67 | 1 | with AirRaidShelter | AirRaidShelter | | DA_Buildable_BarbedWire | Id.Buildable.BarbedWire | Barbed Wire | 7 | 250 | 0.47 | 5 | SML | - | | DA_Buildable_Door | Id.Buildable.Door | Door | 80 | 2,200 | 2 | 5 | ML | - | | DA_Buildable_Door_DoorOnly | Id.Buildable.Door | Door | 22 | 500 | 1.47 | 1 | with Door | Door | | DA_Buildable_Door_TopSegment | Id.Buildable.Door.TopSegment | Door | 22 | 500 | 1.47 | 1 | with Door | Door | | DA_Buildable_BremmerWall | Id.Buildable.BremmerWall | Bremer Wall | 32 | 6,500 | 1.47 | 5 | L | - | | DA_Buildable_Bunker | Id.Buildable.Bunker | Bunker | 200 | 5,000 | 6.67 | 5 | L | - | | DA_Buildable_Bunker_Floor | Id.Buildable.Bunker.Floor | Bunker | 10 | 2,250 | 0.67 | 1 | with Bunker | Bunker | | DA_Buildable_Bunker_Roof | Id.Buildable.Bunker.Roof | Bunker | 10 | 2,250 | 0.67 | 1 | with Bunker | Bunker | | DA_Buildable_CamoNetTent | Id.Buildable.CamoNetTent | Recon Tent | 7 | 300 | 0.47 | 5 | SML | - | | DA_Buildable_CrowsNest | Id.Buildable.CrowsNest | Recon Tower | 200 | 5,000 | 6.67 | 5 | L | - | | DA_Buildable_CrowsNest_BaseFloor | Id.Buildable.CrowsNest.BaseFloor | (blank in export) | 10 | 2,250 | 0.67 | 1 | with CrowsNest | CrowsNest | | DA_Buildable_CrowsNest_FirstFloor | Id.Buildable.CrowsNest.FirstFloor | (blank in export) | 10 | 2,250 | 0.67 | 1 | with CrowsNest | CrowsNest | | DA_Buildable_CrowsNest_Roof | Id.Buildable.CrowsNest.Roof | (blank in export) | 10 | 2,250 | 0.67 | 1 | with CrowsNest | CrowsNest | | DA_Buildable_FOB | Id.Buildable.FOB | Forward Operating Base | 30 | 15,000 | 2 | - | - | - | | DA_Buildable_HBlock | Id.Buildable.HBlock | Hesco Block (Small) | 15 | 1,600 | - | 5 | SML | - | | DA_Buildable_Gate | Id.Buildable.Gate | Gate | 200 | 5,320 | 5.67 | 5 | ML | - | | DA_Buildable_Gate_Left | Id.Buildable.Gate | Gate | 85 | 5,320 | 5.67 | 1 | with Gate | Gate | | DA_Buildable_Gate_Ramp | Id.Buildable.Gate.Ramp | Gate | 85 | 6,500 | 5.67 | 1 | with Gate | Gate | | DA_Buildable_Gate_Right | Id.Buildable.Gate | Gate | 85 | 5,320 | 5.67 | 1 | with Gate | Gate | | DA_Buildable_HBlock_QuadWall | Id.Buildable.HBlockQuadWall | Hesco Wall | 75 | 4,600 | 5 | 5 | ML | - | | DA_Buildable_HotzoneMagnet | Id.Buildable.HotzoneMagnet | Drill Rig | 2,750 | 2,500 | 150 | 5 | L | - | | DA_Buildable_Radio | Id.Buildable.Radio | Builder’s Radio | 20 | 1,000 | 1.33 | 5 | SML | - | | DA_Buildable_RefuelStation | Id.Buildable.RefuelStation | Refuel Station | 200 | 1,600 | 13.33 | 5 | L | - | | DA_Buildable_RepairStation | Id.Buildable.RepairStation | Repair Station | 200 | 1,600 | 13.33 | 5 | L | - | | DA_Buildable_Shelter | Id.Buildable.SV_Shelter | (blank in export) | 250 | 2,250 | - | 5 | ML | - | | DA_Buildable_SandbagWall | Id.Buildable.SandbagWall | Sandbag Wall | 15 | 735 | - | 5 | SML | - | | DA_Buildable_TallHBlock | Id.Buildable.TallHBlock | Hesco Block (Large) | 22 | 2,250 | 1.47 | 5 | ML | - | | DA_Buildable_TankTrap | Id.Buildable.TankTrap | Hedgehog | 22 | 4,500 | 1.47 | 5 | SML | - | | DA_Buildable_WoodBase | Id.Buildable.WoodBase | (blank in export) | 15 | 735 | - | 5 | SML | - |

Things the inventory shows (Derived from the table):

  • Small items cost 7 to 32 supplies, the Radio 20, the Hesco Wall 75 and the Door 80. The Gate, Bunker, Recon Tower, Indirect Fire Shelter and the Refuel and Repair stations cost 200, the Shelter 250 and the Drill Rig 2,750.
  • Only the Large Hammer can place the Bunker, Recon Tower, Indirect Fire Shelter, Bremer Wall, Refuel Station, Repair Station and Drill Rig.
  • The Forward Operating Base has no hammer entry. It comes from its own item (section 8).
  • Entity tags also exist for the Mortar, Loudspeaker, Talon 9K-SAM, Vanguard CIWS, Stingray and MG Nest. Their definitions are in the Vehicles/STN_* plugins (section 6, “Stationary weapons”).

3. Build stages

Stages are progress thresholds from 0 to 1. A stage becomes visible when the build progress reaches its RequiredBuildingProgress. The export carries no build time per stage; build speed comes from the hammer (“Fast”, “Moderate”, “Slow” in the item text) and the construct action DA_Action_Buildable_Construct. The per-hit build amount and the swing animation times of each hammer are in the table below (Data, round 17 evidence). Supplies spent per stage are not in the stage files.

Hammer swing and build amount (buildable_tables hammer_speed). Build amount per hit is WDItemExtensionData_BuildTool.BuildAmount on the hammer item; the critical-spot amount is BuildAmountWhenTargetIsHit (Data). The swing times are the first-person use montage: the swing loops between the LoopStart and LoopEnd sections while the button is held and the Hit notify marks the blow (Data (Blueprint CDO)).

| Hammer | Shop text | Build amount per hit | Critical-spot hit amount | Use montage | Montage (s) | Hit notify (s) | Swing loop (s) | Dismantle per hit | |—|—|—:|—:|—|—:|—:|—:|—:| | Large (ID_LargeHammer) | Fast Build Speed | 1.5 | 8 | AM_FP_Large_Hammer_Use | 1.43 | 0.45 | 0.883 | 250 | | Medium (ID_MediumHammer) | Moderate Build Speed | 1 | 5 | AM_FP_BuildTool_Use | 1.67 | 0.25 | 0.567 | 200 | | Small (ID_SmallHammer) | Slow Build Speed | 0.5 | 3 | AM_FP_Small_Hammer_Use | 1.27 | 0.24 | 0.567 | 150 |

Derived, if the loop section is the swing period and one BuildAmount is added per hit: Large 1.5 per 0.88 s (about 1.7 per second), Medium 1.0 per 0.57 s (about 1.76 per second), Small 0.5 per 0.57 s (about 0.88 per second). That puts Large and Medium about equal, although the shop text calls the Large hammer fast and the Medium hammer moderate; so the hit rate is probably not the loop length (not native, not resolved). The scale of BuildAmount against the 0 to 1 stage progress is known since round 38 (Native, section 13): a hit adds BuildAmount / Cost of the structure’s progress, and the hammer path does use the BuildAmount field of UWDItemExtensionData_BuildBuildable (the hammer class derives from it; 3.0 is only the default for unset assets). The large hammer also carries DismantleRatePerSecond 250, medium 200, small 150 (equal to the per-hit values).

  • Most structures use 0, 0.25, 0.5, 0.75, 1. The Door uses 0, 0.3, 0.6, 0.8, 1 and the WoodBase uses 0, 0.2, 0.45, 0.7, 1.
  • Parts (floors, roofs, gate halves, door halves) have one stage at 1, so they appear complete.
  • The last stage has no weak spots (critical-hit spots) in every multi-stage definition. Earlier stages carry them, so a half-built structure has marked weak spots. They are a hammer build bonus, not a damage multiplier (section 14.3); Barbed Wire and the Recon Tent have the spots in their stage files but turn the feature off (bUsesCriticalHitSpots false).
  • bOverridesFinalStage is set on 6 definitions: Indirect Fire Shelter, Door, Bunker, Recon Tower, Gate and Hesco Wall (Data). What it changes: the finished structure is assembled from separate sub-buildable actors that the last stage lists (floors, roofs, walls, door leaf, gate halves) instead of one mesh (section 14.1). All six use ...ActorReplacing or composite spawner classes.
  • The Forward Operating Base has no stage file; it is bInstantFinish (Data).

| Stage definition | Stages | Progress thresholds | Meshes per stage | Critical-hit spots per stage | |—|—|—|—|—| | DA_Buildable_AirRaidShelter_Ceiling_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_AirRaidShelter_Floor_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_AirRaidShelter_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 3, 3, 6, 8, 4 | 26, 40, 72, 86, 0 | | DA_Buildable_BarbedWire_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 10, 11, 11, 11, 0 | | DA_Buildable_BremmerWall_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 15, 20, 15, 19, 0 | | DA_Buildable_Bunker_Floor_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_Bunker_Roof_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_Bunker_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 3, 4, 4, 6, 5 | 29, 39, 60, 99, 0 | | DA_Buildable_CamoNetTent_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 5, 0, 6, 29, 0 | | DA_Buildable_CrowsNest_BaseFloor_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_CrowsNest_FirstFloor_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_CrowsNest_Roof_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_CrowsNest_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 6, 5, 6, 9, 6 | 27, 47, 41, 41, 0 | | DA_Buildable_Door_DoorOnly_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_Door_Stages | 5 | 0, 0.3, 0.6, 0.8, 1 | 3, 4, 4, 3, 3 | 12, 11, 15, 11, 0 | | DA_Buildable_Door_TopSegment_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_Gate_Left_Stages | 1 | 1 | 0 | 0 | | DA_Buildable_Gate_Ramp_Stages | 1 | 1 | 1 | 0 | | DA_Buildable_Gate_Right_Stages | 1 | 1 | 0 | 0 | | DA_Buildable_Gate_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 3, 3, 4, 3, 4 | 21, 19, 39, 40, 0 | | DA_Buildable_HBlock_QuadWall_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 8, 31, 34, 69, 0 | | DA_Buildable_HBlock_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 5, 16, 16, 16, 0 | | DA_Buildable_HotzoneMagnet_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 8, 9, 9, 14, 20 | 70, 79, 98, 95, 0 | | DA_Buildable_Radio_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 4, 8, 10, 11, 11 | 8, 9, 9, 9, 0 | | DA_Buildable_RefuelStation_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 2, 3, 4, 5 | 15, 14, 27, 14, 0 | | DA_Buildable_RepairStation_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 2, 3, 6, 12 | 16, 16, 16, 15, 0 | | DA_Buildable_SandbagWall_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 14, 12, 10, 8, 0 | | DA_Buildable_Shelter_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 3, 5, 1 | 24, 24, 24, 24, 0 | | DA_Buildable_TallHblock_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 6, 24, 24, 32, 0 | | DA_Buildable_TankTrap_Stages | 5 | 0, 0.25, 0.5, 0.75, 1 | 1, 1, 1, 1, 1 | 3, 5, 6, 7, 0 | | DA_WoodBase_Stages | 5 | 0, 0.2, 0.45, 0.7, 1 | 4, 4, 3, 3, 1 | 16, 14, 47, 56, 0 |

Parts that carry one inline stage in the asset itself (no separate stage file):

| Asset | Stages | Progress | |—|—|—| | DA_Buildable_AirRaidShelter_Ceiling | 1 | 1 | | DA_Buildable_Bunker_Roof | 1 | 1 | | DA_Buildable_CrowsNest_FirstFloor | 1 | 1 | | DA_Buildable_CrowsNest_Roof | 1 | 1 |

4. Health and damage rules

MaxHealth is set per definition. The DamageEntityData tag points at one row of DT_GlobalDamage_BuildableData. There are 20 rows. Every definition points at one, and every row is used.

How to read a percentage (Native, damage pipeline section 6): the operation is Percentage_Ongoing, so each matching entry changes the running damage C by Amount * 0.01 * C. -80% means 20% of the damage is left. +1400% means 15 times the damage. Which entries are selected, and in what order, is in the same pipeline page (rule tables, entry selection and ordering). This confirms the sign reading that the Items page marked as inferred.

The table shows the entries that match one source tag alone (no instigator, target or hit-location requirement). Other entries exist (armor-piercing and hollow-point bullets, many rocket and cannon calibers, throwables) and are in the Items page section 6.3 and the data file. - means that source has no single-tag entry in that row.

| Asset | Max health | Damage row | Entries | Melee | Bullet | Grenade | Rocket | C4 | IED | |—|—|—|—|—|—|—|—|—|—| | DA_Buildable_AirRaidShelter | 5,000 | Meta.Damage.Buildable.AirRaidShelter | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_AirRaidShelter_Ceiling | 2,250 | Meta.Damage.Buildable.AirRaidShelter | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_AirRaidShelter_Floor | 2,250 | Meta.Damage.Buildable.AirRaidShelter | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_BarbedWire | 250 | Meta.Damage.Buildable.BarbedWire | 22 | -28% | -85% | +0% | +200% | +150% | +400% | | DA_Buildable_Door | 2,200 | Meta.Damage.Buildable.Door | 23 | -80% | -85% | +0% | +650% | +200% | +800% | | DA_Buildable_Door_DoorOnly | 500 | Meta.Damage.Buildable.Door | 23 | -80% | -85% | +0% | +650% | +200% | +800% | | DA_Buildable_Door_TopSegment | 500 | Meta.Damage.Buildable.Door | 23 | -80% | -85% | +0% | +650% | +200% | +800% | | DA_Buildable_BremmerWall | 6,500 | Meta.Damage.Buildable.BremmerWall | 23 | -80% | -80% | +50% | +250% | +280% | +350% | | DA_Buildable_Bunker | 5,000 | Meta.Damage.Buildable.Bunker | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_Bunker_Floor | 2,250 | Meta.Damage.Buildable.Bunker | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_Bunker_Roof | 2,250 | Meta.Damage.Buildable.Bunker | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_CamoNetTent | 300 | Meta.Damage.Buildable.CamoTent | 22 | -28% | -85% | +0% | +200% | +150% | +500% | | DA_Buildable_CrowsNest | 5,000 | Meta.Damage.Buildable.CrowsNest | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_CrowsNest_BaseFloor | 2,250 | Meta.Damage.Buildable.CrowsNest | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_CrowsNest_FirstFloor | 2,250 | Meta.Damage.Buildable.CrowsNest | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_CrowsNest_Roof | 2,250 | Meta.Damage.Buildable.CrowsNest | 17 | -10% | -80% | -50% | +45% | +50% | +200% | | DA_Buildable_FOB | 15,000 | Meta.Damage.Buildable.FOB | 23 | -80% | -80% | +200% | +1400% | +1250% | +5000% | | DA_Buildable_HBlock | 1,600 | Meta.Damage.Buildable.SmallHesco | 23 | -80% | -80% | +50% | +120% | +220% | +500% | | DA_Buildable_Gate | 5,320 | Meta.Damage.Buildable.HescoGate | 22 | -80% | -85% | +0% | +850% | +1000% | +2000% | | DA_Buildable_Gate_Left | 5,320 | Meta.Damage.Buildable.HescoGate | 22 | -80% | -85% | +0% | +850% | +1000% | +2000% | | DA_Buildable_Gate_Ramp | 6,500 | Meta.Damage.Buildable.HescoGate | 22 | -80% | -85% | +0% | +850% | +1000% | +2000% | | DA_Buildable_Gate_Right | 5,320 | Meta.Damage.Buildable.HescoGate | 22 | -80% | -85% | +0% | +850% | +1000% | +2000% | | DA_Buildable_HBlock_QuadWall | 4,600 | Meta.Damage.Buildable.QuadLargeHescoWall | 17 | +0% | -80% | +0% | +200% | +150% | +400% | | DA_Buildable_HotzoneMagnet | 2,500 | Meta.Damage.Buildable.BuildableHotzoneMagnet | 22 | -80% | -85% | +0% | +850% | +500% | +1500% | | DA_Buildable_Radio | 1,000 | Meta.Damage.Buildable.Radio | 22 | +70% | -85% | +500% | +1000% | +400% | +800% | | DA_Buildable_RefuelStation | 1,600 | Meta.Damage.Buildable.RefuelStation | 21 | -80% | -80% | +50% | +1500% | +600% | - | | DA_Buildable_RepairStation | 1,600 | Meta.Damage.Buildable.RepairStation | 21 | -80% | -80% | +50% | +1500% | +600% | +1000% | | DA_Buildable_Shelter | 2,250 | Meta.Damage.Buildable.SV_Shelter | 23 | -80% | -80% | +50% | +80% | +150% | +300% | | DA_Buildable_SandbagWall | 735 | Meta.Damage.Buildable.SandbagWall | 22 | -80% | -85% | +0% | +650% | +200% | +500% | | DA_Buildable_TallHBlock | 2,250 | Meta.Damage.Buildable.LargeHesco | 23 | -80% | -80% | +50% | +80% | +150% | +300% | | DA_Buildable_TankTrap | 4,500 | Meta.Damage.Buildable.TankTrap | 20 | -80% | -85% | -50% | +450% | +500% | +1000% | | DA_Buildable_WoodBase | 735 | Meta.Damage.Buildable.WoodBase | 22 | -80% | -85% | +0% | +650% | +200% | +500% |

Damage rows that no buildable asset points at: none.

Worked example (Derived): a Sandbag Wall has 735 health. A bullet entry of -85% leaves 15% of the bullet’s damage, a rocket entry of +650% makes a rocket do 7.5 times its base damage. This ignores the other entries that may also match, so it is a first estimate and not the final hit count.

Other facts:

  • Shared damage tint: all definitions that set bUseCurveToUpdateHealthVisuals use the curve C_DamageTintCurve to tint the mesh as health drops (Data).
  • The Forward Operating Base has Buildable.Damage.DoNotTakeDamage set in an unnamed field next to its health (Data). How that interacts with its damage row and its 15,000 health: no native code reads the field (round 38, section 13); the effect is unknown.
  • The Door and the Gate have door destruction definitions (Items page section 6.5) and breach effects (NS_BuildableDoorBreach, NS_BuildableGateBreach).
  • Buildables are a ruleset in the demolition system (BH_Demolition_RS_Buildables), see the Demolition page. Which props accept it: Demolition Assets, rulesets.

5. Placement rules

All of this is Data. Global limits live in DA_BuildablePlacementData:

Setting Value
Max distance to the placement point (MaxPlaceTraceDistance) 600
Max support height (SupportHeightLimit) 1,500
Valid / invalid ghost colour white / red, both at alpha 64 (40FFFFFF, 40FF0000)
Actors ignored when a foundation is blocked LandscapeStreamingProxy, PCGPartitionActor
Actors ignored when a snapped placement is blocked LandscapeStreamingProxy, WDDroppedItem

Per-structure rules are in the table that follows. Plain meaning:

  • Placement conditions are checked before a ghost turns valid. SafeZonePlacementCondition and WithinLadderBoundsPlacementCondition are Blueprint conditions (what they test is in section 14.4). WDWithinFobBoundsPlacementCondition means the spot must be inside a friendly FOB radius. WDNotInsideEnemyFobBoundsPlacementCondition forbids it inside an enemy FOB radius. WDLimitedByFOBCondition enforces the per-FOB limit. WDFobPlacementCondition is the FOB’s own rule. WDPlacementZoneCondition and WDWithinControlZonePlacementCondition limit the Drill Rig to zones.
  • Small structures (Barbed Wire, Recon Tent, Sandbag Wall, Hedgehog) do not need a FOB. Every other structure except the FOB itself must be inside a FOB radius (Derived: from which conditions each definition lists).
  • Max stack is the MaxStack field. It is the stack-height limit when a structure is placed on top of another buildable, not a placement count; a - in the table above means the field is not serialized and the native default of 2 applies (section 14.2).
  • FOB limit is the per-FOB count from DA_FOB_Ruleset: Refuel Station 1, Repair Station 1, Builder’s Radio 4.
  • PlacementFlags is a bit set (EWDPlacementFlags): 1 AllowRotation, 2 CanBeBuiltOn, 4 CanPlaceVertically, 8 CanPlaceOnBuildables. It is serialized as 9 on 14 assets (small items, stationary weapons, Radio, stations, Drill Rig), as 1 on the FOB, and not serialized on 23 assets, where the native default 11 (1 + 2 + 8) applies (section 14.2). The earlier wording “9 for almost every structure” counted only the serialized values.
  • Terrain: MaximumValidSurfaceAngle is 10 on the Gate parts; MaxDepthUnderTerrain lets a structure sink 30 to 200 into the ground; bRequiresAllCornersOnSurface is false and bRotateWithSurface is true on the small walls.

| Asset | Placement conditions | Max stack | Pivot up / side | Max under terrain | Block buffer (free / snapped) | Max surface angle | Registers with FOB | FOB limit | |—|—|—|—|—|—|—|—|—| | DA_Buildable_AirRaidShelter | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 1 | - / - | - | - | - | - | - | | DA_Buildable_AirRaidShelter_Ceiling | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 1 | - / - | - | - | - | - | - | | DA_Buildable_AirRaidShelter_Floor | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 1 | - / - | - | - | - | - | - | | DA_Buildable_BarbedWire | SafeZonePlacementCondition, WithinLadderBoundsPlacementCondition, WDNotInsideEnemyFobBoundsPlacementCondition | 100 | - / - | - | 20 / 25 | - | - | - | | DA_Buildable_Door | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | - | - / - | - | - | - | - | - | | DA_Buildable_Door_DoorOnly | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | - | - / - | - | - | - | - | - | | DA_Buildable_Door_TopSegment | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | - | - / - | - | - | - | - | - | | DA_Buildable_BremmerWall | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 1 | 75 / - | 200 | - | - | - | - | | DA_Buildable_Bunker | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | - | 75 / - | - | 30 / 30 | - | - | - | | DA_Buildable_Bunker_Floor | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | - | - / - | - | - | - | - | - | | DA_Buildable_Bunker_Roof | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | - | - / - | - | - | - | - | - | | DA_Buildable_CamoNetTent | SafeZonePlacementCondition, WithinLadderBoundsPlacementCondition, WDNotInsideEnemyFobBoundsPlacementCondition | 100 | - / - | - | 25 / 25 | - | - | - | | DA_Buildable_CrowsNest | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 0 | 75 / - | - | 30 / 30 | - | - | - | | DA_Buildable_CrowsNest_BaseFloor | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 0 | - / - | - | - | - | - | - | | DA_Buildable_CrowsNest_FirstFloor | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 0 | - / - | - | - | - | - | - | | DA_Buildable_CrowsNest_Roof | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 0 | - / - | - | - | - | - | - | | DA_Buildable_FOB | WDFobPlacementCondition, SafeZonePlacementCondition, WithinLadderBoundsPlacementCondition | 1 | 110 / - | - | - | - | - | - | | DA_Buildable_HBlock | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 5 | 75 / - | 30 | - | - | - | - | | DA_Buildable_Gate | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 1 | 150 / 300 | - | - | 10 | - | - | | DA_Buildable_Gate_Left | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 0 | 150 / 300 | - | - | 10 | - | - | | DA_Buildable_Gate_Ramp | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 0 | 150 / 300 | - | - | 10 | - | - | | DA_Buildable_Gate_Right | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition | 0 | 150 / 300 | - | - | 10 | - | - | | DA_Buildable_HBlock_QuadWall | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | - | 150 / 50 | 45 | - | - | - | - | | DA_Buildable_HotzoneMagnet | WDWithinFobBoundsPlacementCondition, WDPlacementZoneCondition, WDWithinControlZonePlacementCondition | 0 | 75 / - | - | - | - | - | - | | DA_Buildable_Radio | WDWithinFobBoundsPlacementCondition, WDLimitedByFOBCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 6 | - / - | - | - | - | yes | 4 | | DA_Buildable_RefuelStation | WDWithinFobBoundsPlacementCondition, WDLimitedByFOBCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 100 | - / - | - | - | - | yes | 1 | | DA_Buildable_RepairStation | WDWithinFobBoundsPlacementCondition, WDLimitedByFOBCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 100 | - / - | - | - | - | yes | 1 | | DA_Buildable_Shelter | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 1 | -250 / - | - | - | - | - | - | | DA_Buildable_SandbagWall | SafeZonePlacementCondition, WithinLadderBoundsPlacementCondition, WDNotInsideEnemyFobBoundsPlacementCondition | 100 | - / - | - | 20 / 25 | - | - | - | | DA_Buildable_TallHBlock | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | - | 150 / 50 | 30 | - | - | - | - | | DA_Buildable_TankTrap | SafeZonePlacementCondition, WithinLadderBoundsPlacementCondition, WDNotInsideEnemyFobBoundsPlacementCondition | 100 | - / - | - | 25 / 25 | - | - | - | | DA_Buildable_WoodBase | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | 4 | 18.75 / - | 30 | - | - | - | - |

6. What each structure provides

Structure What the data says Source label
Wall, block, trap, wire, tent Cover and obstruction. No gameplay values beyond health and damage rules. Data
Door, Gate Closeable doors with a breach effect. A closed FOB door pays cash (section 9). Data
Bunker, Recon Tower, Indirect Fire Shelter Large multi-part structures (floor, roof, ceiling). Cash only for placing and destroying. Data
Builder’s Radio Up to 4 per FOB. Registers with the FOB (bRegisterWithFOB, counts toward the per-FOB limit). Plays music: a power toggle and seven stations (section 14.5). Data
Refuel Station Up to 1 per FOB. Registers with the FOB. A material tracker and a refuel start/stop sound exist. The Fuel Supplies item is described as “Resource Required to Refuel Vehicles. Requires FOB Radius to Use”. The refuel rate is not traced. Data
Repair Station Same shape as the Refuel Station, with Mechanical Supplies (“Resource Required to Repair Vehicles”). The repair rate is not traced. Data
Drill Rig (HotzoneMagnet) Fuel-driven structure that works with a hot zone (settings below). Data
Mortar, Loudspeaker, Talon 9K-SAM, Vanguard CIWS, Stingray, MG Nest Stationary weapons. Entity names and cash rewards (Mortar only) are here; the buildable definitions are in the Vehicles/STN_* plugins (table below). Data

The Refuel and Repair stations also have a scene, DA_Scene_FobRefuelRepair, that lists the vehicle health parts shown per tracked vehicle variant (Data).

The Drill Rig has its own settings asset (WDBuildableHotZoneMagnetDataAsset), with one interaction to activate it and one to add fuel (Interaction.Context.Buildables.HotZoneMagnet.Activate and .Fuel). Data:

| Setting (DA_Buildable_HotzoneMagnet) | Value | |—|—| | InitialDelayDuration | 15 | | HotZoneMagnetRechargeDuration | 900 | | HotZoneMagnetMinimumFuel | 2,000 | | HotZoneMagnetDurationPerFuel | 0.03 | | MaxFuel | 10,000 | | FuelSuppliesResourceItemTag | Id.Item.FuelSupplies |

Plain reading (Derived, units are not stated in the export): after placing there is a 15 second start delay, the rig needs at least 2,000 fuel to run, each fuel unit buys 0.03 of run time (probably seconds), it holds at most 10,000 fuel and it recharges for 900 (probably seconds). What the “magnet” does to the hot zone, and the units, are in section 14.6.

Stationary weapons (Vehicles/STN_*)

Six vehicle plugins (STN_01 to STN_06) each ship a WDBuildableDataTableRow table with one row: a buildable tag and the WDBuildableDataAsset it uses. The plugin’s GameFeatureAction_DataRegistrySource adds that table to a hammer registry (Buildables_LargeHammer; STN_04 also to Buildables_MediumHammer), so the stationary weapon joins the hammer list at run time. The hammer tables inside this plugin do not list them (the Small, Medium and Large counts above are the plugin’s own rows). Each data asset has a WDVehicleBuildSpawner that names the vehicle variant spawned (base actor B_Buildable_StationaryVehicle_C), a build-stage definition, and the same three placement conditions (WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition). Data: Vehicles/STN_*/Content/{STN_nn.json, BuildableData, Data}. The vehicle variants, their weapons, seats and damage rows are in Vehicles, Vehicle Handling and Vehicle Damage Pipeline.

| Plugin | Table | Added to registries | Row tag | Data asset | Name | Cost | Max health | Repair multiplier | Max stack | Stages | Vehicle tag | Placement conditions | |—|—|—|—|—|—|—|—|—|—|—|—|—| | STN_01 | DT_STN_01_Buildable_Data | Buildables_LargeHammer | Id.Buildable.MistralAA | DA_Buildable_MistralAA | Talon 9K-SAM | 650 | 3,000 | 66.67 | 6 | 5 | Vehicle.Variant.Stationary.MistralAA | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | | STN_02 | DT_STN_02_Buildable_Data | Buildables_LargeHammer | Id.Buildable.Phalanx | DA_Buildable_STN_02 | Vanguard CIWS | 1,200 | 5,000 | 100 | 6 | 5 | Vehicle.Variant.Stationary.Phalanx | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | | STN_03 | DT_STN_03_Buildable_Data | Buildables_LargeHammer | Id.Buildable.Mortar | DA_Buildable_STN_03 | L81 Mortar | 600 | 3,000 | 10 | 6 | 4 | Vehicle.Variant.Stationary.Mortar | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | | STN_04 | DT_Buildables_STN_04 | Buildables_MediumHammer, Buildables_LargeHammer | Id.Buildable.Loudspeaker | DA_Buildable_STN_04 | Loudspeaker | 200 | 1,000 | 6.67 | - | 5 | Vehicle.Variant.Stationary.Loudspeaker | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | | STN_05 | DT_STN_05_Buildable_Data | Buildables_LargeHammer | Id.Buildable.STN_05 | DA_Buildable_STN_05 | Stingray | 650 | 3,000 | 10 | 6 | 4 | Vehicle.Variant.Stationary.STN_05 | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition | | STN_06 | DT_Buildables_STN_06 | Buildables_LargeHammer | Id.Buildable.MGNest | DA_Buildable_MGNest | MG Nest | 650 | 3,000 | - | 5 | 5 | Vehicle.Variant.Stationary.MGNest | WDWithinFobBoundsPlacementCondition, WithinLadderBoundsPlacementCondition, SafeZonePlacementCondition |

Source: WDBuildableDataTableRow tables DT_STN_01_Buildable_Data, DT_STN_02_Buildable_Data, DT_STN_03_Buildable_Data, DT_Buildables_STN_04, DT_STN_05_Buildable_Data and DT_Buildables_STN_06. What the hammer does with these rows (the native placement path) is not traced.

7. Names, descriptions and the vendor

The entity name table DT_EntityData_UI_Buildables has 36 rows. Only the items carry a description. The wall, block, door, gate, tower, shelter, radio, FOB and weapon rows set the role XP tag Attribute.Meta.XP.Role.Support; the Refuel Station, Repair Station and the three DPLY rows do not (Data). The reward calculator pays a role resource next to cash for most build events (section 9), so building likely feeds Support role XP (Derived).

| Entity tag | UI name | Description (as shown in game) | |—|—|—| | ID.Item.BuildTool.Hammer.Large | Large Hammer | - Can Build ALL Buildables / - Fast Build Speed / - Requires Build Supplies to Use | | ID.Item.BuildTool.Hammer.Medium | Medium Hammer | - Used to Build Large and Basic Buildables Only / - Moderate Build Speed / - Requires Build Supplies to Use | | ID.Item.BuildTool.Hammer.Small | Small Hammer | - Used to Build Small Buildables Only / - Slow Build Speed / - Requires Build Supplies to Use | | Id.Item.MunitionsSupplies | Ammo Supplies | - Resource Required to Reload Buildable Weapons / - Requires FOB Radius to Use | | Id.Item.FOB | Forward Operating Base | - Needed to Build Larger Structures. / - Can hold Items & Resources for Players to Use. / - Provides a Radius in Which Players Can Build. | | Id.Item.BuildToolSupply | Build Supplies | - Resource Required to Build all Buildables. / - Requires any Hammer to Build. | | Id.Item.FuelSupplies | Fuel Supplies | - Resource Required to Refuel Vehicles. / - Requires FOB Radius to Use. | | Id.Item.SparePartsSupplies | Mechanical Supplies | - Resource Required to Repair Vehicles / - Requires FOB Radius to Use. | | Id.Buildable.RefuelStation | Refuel Station | - | | Id.Buildable.RepairStation | Repair Station | - | | ID.Item.DPLY_001 | Drill Rig | - | | ID.Item.DPLY_002 | blank in export | - | | ID.Item.DPLY_003 | Repair Station | - | | Id.Buildable.BarbedWire | Barbed Wire | - | | Id.Buildable.BremmerWall | Bremer Wall | - | | Id.Buildable.CamoNetTent | Recon Tent | - | | Id.Buildable.Door | Door | - | | Id.Buildable.FOB | Forward Operating Base | - | | Id.Buildable.Gate | Gate | - | | Id.Buildable.HBlock | HBlock | - | | Id.Buildable.TallHBlock | HBlock | - | | Id.Buildable.HBlockQuadWall | HBlock | - | | Id.Buildable.LoudSpeaker | Loudspeaker | - | | Id.Buildable.MistralAA | Talon 9K-SAM | - | | Id.Buildable.Mortar | L81 Mortar | - | | Id.Buildable.Phalanx | Vanguard CIWS | - | | Id.Buildable.Radio | Builder’s Radio | - | | Id.Buildable.SandbagWall | Sandbag Wall | - | | Id.Buildable.TankTrap | Hedgehog | - | | Id.Buildable.Bunker.Floor | Bunker | - | | Id.Buildable.Bunker.Roof | Bunker | - | | Id.Buildable.Bunker | Bunker | - | | Id.Buildable.CrowsNest | Recon Tower | - | | Id.Buildable.AirRaidShelter.Ceiling | Indirect Fire Shelter | - | | Id.Buildable.AirRaidShelter.Floor | Indirect Fire Shelter | - | | Id.Buildable.AirRaidShelter | Indirect Fire Shelter | - |

The vendor table DT_VendorData_Ext_Buildables sells the tools and the supplies, not the structures. Structures are paid for with supplies when built (section 2).

| Vendor row | Variation | Price | Amount per purchase | Level to unlock | Lifetime buy limit | |—|—|—|—|—|—| | Id.Item.MunitionsSupplies | Id.Item.MunitionsSupplies | 10 | 50 | 1 | none | | Id.Item.FOB | Id.Item.FOB | 7,500 | 1 | 0 | none | | ID.Item.BuildTool.Hammer.Large | ID.Item.BuildTool.Hammer.Large | 2,400 | 1 | 0 | none | | ID.Item.BuildTool.Hammer.Medium | ID.Item.BuildTool.Hammer.Medium | 800 | 1 | 0 | none | | ID.Item.BuildTool.Hammer.Small | ID.Item.BuildTool.Hammer.Small | 100 | 1 | 0 | none | | Id.Item.BuildToolSupply | Id.Item.BuildToolSupply | 10 | 50 | 1 | none | | Id.Item.FuelSupplies | Id.Item.FuelSupplies | 10 | 50 | 1 | none | | Id.Item.SparePartsSupplies | Id.Item.SparePartsSupplies | 10 | 50 | 1 | none |

Derived: one purchase of 50 supplies costs 10, so a supply unit costs 0.2 cash at the vendor. A Sandbag Wall (15 supplies) is therefore 3 cash of supplies, a Bunker (200) is 40 cash and a Drill Rig (2,750) is 550 cash, if the Cost field is counted in Build Supplies. That last “if” is the open point from section 2.

8. The Forward Operating Base

The FOB is the anchor for most other structures. Facts (Data):

  • Item description: “Needed to Build Larger Structures. Can hold Items & Resources for Players to Use. Provides a Radius in Which Players Can Build.”
  • Vendor price 7,500 for one FOB item. Buildable definition: 15,000 health, Cost 30, PlacementCost 0, repair multiplier 2, instant finish.
  • One class per faction: Alpha uses B_Buildable_ForwardOperatingBase_Lonestar_C, Bravo ..._Valkyra_C, Charlie and the default ..._Manticore_C. Each has its own placement class.
  • Limits inside one FOB: 1 Refuel Station, 1 Repair Station, 4 Builder’s Radios.
  • Two interactions (DA_FOB_Interactions): Access (tap on keyboard, hold on gamepad, several users at once) and Hacking (hold 30 seconds, one user, success and failure sent to the server).
  • Sounds exist for deposits of Ammo, Build, Fuel and Mechanical supplies, pallets and supply crates, and for hack start, stop, success and fail (laptop and siren variants).
  • Cash for hacking and closing a FOB door is in the Rewards page.

A spawn point is not found in this plugin, and none was found elsewhere in the client data either (section 14.8).

9. Cash and XP

Placing, building and destroying are paid through the reward system. The flat cash tables are DT_Reward_Cash_BuildableBuilt, DT_Reward_Cash_BuildablePlaced, DT_Reward_Cash_BuildablePlacedInFOB and, for destroying an enemy structure, the buildable rows of DT_Reward_Cash_DeployableDestroyed. All values are Data.

  • Built is a flat 1 cash (a placeholder-sized credit), so the real payout is Placed.
  • Placed pays the owner (owner modifier 1) and Placed in FOB pays 0 to the owner (owner modifier 0) with the same base. The seven structures that have no row are covered in section 14.7; how the tables are chosen is native and not read.
  • A friendly modifier of -0.75 applies to placed and destroyed rows.
  • Only 10 structures have a Placed value. The Sandbag Wall, Door, Recon Tower, Recon Tent and Drill Rig have a Destroyed value only. WoodBase and Shelter have no cash row in these tables.

| Buildable | Built | Placed | Placed in FOB | Destroyed (enemy build) | |—|—|—|—|—| | Id.Buildable.AirRaidShelter | 1 | 500 | 500 | 1,400 | | Id.Buildable.BarbedWire | 1 | 10 | 10 | 75 | | Id.Buildable.Bunker | 1 | 500 | 500 | 1,400 | | Id.Buildable.CamoNetTent | - | - | - | 75 | | Id.Buildable.CrowsNest | - | - | - | 1,400 | | Id.Buildable.Door | - | - | - | 100 | | Id.Buildable.FOB | 1 | 1,000 | 1,000 | 5,000 | | Id.Buildable.Gate | 1 | 300 | 300 | 500 | | Id.Buildable.HBlock | 1 | 100 | 100 | 100 | | Id.Buildable.HBlockQuadWall | 1 | 500 | 500 | 125 | | Id.Buildable.HotzoneMagnet | - | - | - | 3,000 | | Id.Buildable.Mortar | 1 | 300 | 300 | 300 | | Id.Buildable.SandbagWall | - | - | - | 100 | | Id.Buildable.TallHBlock | 1 | 200 | 200 | 100 | | Id.Buildable.TankTrap | 1 | 100 | 100 | 250 |

Friendly modifier on every row above: placed [-0.75], destroyed [-0.75]. Owner modifier: built [0.5, 1.0], placed [1.0], placed in FOB [0.0], destroyed [0.0].

Beyond these flat values, the reward plugin has a calculator with 47 rows (Data). Forty-three pay cash plus a role resource and four pay cash only. It covers: building progress, finishing a build, schematic placed, build supplies deposited and consumed, damaging and destroying (with an assist share), FOB hacked, FOB owner paid and FOB door closed. The formulas, selectors and zone multipliers are in the Rewards page and the older summary in Rewards and Progression section 7.

10. Every file in the plugin

All 206 files, grouped by folder (Data). Use this to find the file behind any name above.

| Folder | Files | What is in it | File names | |—|—|—|—| | Data/Actions | 7 | build-tool actions (construct, place, dismantle, rotate, snap, secondary use) | DA_Action_BuildTool_Dismantle, DA_Action_BuildTool_PlaceSchematic, DA_Action_BuildTool_Rotate, DA_Action_BuildTool_SecondaryUse, DA_Action_BuildTool_ToggleSnapping, DA_Action_Buildable_Construct, DA_Action_Buildable_Place | | Data/BuildTool | 8 | build tool HUD, radial wheel data, camera FOV curves, hit sound | AE_Buildtool_Hit, C_BuildTool_CameraFovCurve, C_BuildTool_CameraFovCurve_LargeHammer, C_BuildTool_CameraFovCurve_SmallHammer, DA_BuildToolRadialWheelData, DA_UI_BuildTool, DT_RadialWheelSlotType_BuildToolData, DT_RadialWheelType_BuildToolData | | Data/BuildToolSupply | 2 | Build Supplies item and its audio | DA_Item_BuildingSupply_Audio, ID_BuildToolSupply | | Data/Buildables | 2 | shared damage tint curve and global placement settings | C_DamageTintCurve, DA_BuildablePlacementData | | Data/Buildables/AirRaidShelter | 7 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_AirRaidShelter, DA_Buildable_AirRaidShelter_Ceiling, DA_Buildable_AirRaidShelter_Ceiling_Stages, DA_Buildable_AirRaidShelter_Floor, DA_Buildable_AirRaidShelter_Floor_Stages, DA_Buildable_AirRaidShelter_Stages, DA_RadialWheelSlotType_AirRaidShelter | | Data/Buildables/Audio | 6 | default buildable sound events (placed, constructed, damaged, destroyed) | AE_Buildable_Constructed, AE_Buildable_Damaged, AE_Buildable_Destroyed, AE_Buildable_Placed, AE_Buildable_SupplyCrate_Damaged, DA_Buildable_Default_Audio | | Data/Buildables/BarbedWire | 5 | buildable, stage definition, radial wheel slot and sounds | AE_Buildable_BarbedWire_Damage, DA_Buildable_BarbedWire_Audio, DA_Buildable_BarbedWire, DA_Buildable_BarbedWire_Stages, DA_RadialWheelSlotType_BarbedWire | | Data/Buildables/BarrierDoor | 8 | door buildable, its two parts, stages and destruction definition | DA_Buildable_Door, DA_Buildable_Door_DoorOnly, DA_Buildable_Door_DoorOnly_Stages, DA_Buildable_Door_Stages, DA_Buildable_Door_TopSegment, DA_Buildable_Door_TopSegment_Stages, DA_RadialWheelSlotType_Door, D_BuildableDoor | | Data/Buildables/BremmerWall | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_BremmerWall, DA_Buildable_BremmerWall_Stages, DA_RadialWheelSlotType_BremmerWall | | Data/Buildables/Bunker | 7 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_Bunker, DA_Buildable_Bunker_Floor, DA_Buildable_Bunker_Floor_Stages, DA_Buildable_Bunker_Roof, DA_Buildable_Bunker_Roof_Stages, DA_Buildable_Bunker_Stages, DA_RadialWheelSlotType_Bunker | | Data/Buildables/CamoNetTent | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_CamoNetTent, DA_Buildable_CamoNetTent_Stages, DA_RadialWheelSlotType_CamoNetTent | | Data/Buildables/CrowsNest | 9 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_CrowsNest, DA_Buildable_CrowsNest_BaseFloor, DA_Buildable_CrowsNest_BaseFloor_Stages, DA_Buildable_CrowsNest_FirstFloor, DA_Buildable_CrowsNest_FirstFloor_Stages, DA_Buildable_CrowsNest_Roof, DA_Buildable_CrowsNest_Roof_Stages, DA_Buildable_CrowsNest_Stages, DA_RadialWheelSlotType_CrowsNest | | Data/Buildables/FloorBoard | 1 | radial wheel slot only; no buildable asset in this export | DA_RadialWheelSlotType_FloorBoard | | Data/Buildables/ForwardOperatingBase | 25 | FOB buildable asset, ruleset, interactions, FOB sound events | DA_Buildable_FOB_Audio, AE_Build_FOB_Active, AE_Build_FOB_Damaged, AE_Build_FOB_Deposit_AmmoSupplies, AE_Build_FOB_Deposit_BuildSupplies, AE_Build_FOB_Deposit_FuelSupplies, AE_Build_FOB_Deposit_MechanicalSupplies, AE_Build_FOB_Deposit_Pallet, AE_Build_FOB_Deposit_Supply, AE_Build_FOB_Destroyed, AE_Build_FOB_DestroyedExplosion, AE_Build_FOB_Disabled, AE_Build_FOB_Hack_Laptop_Fail, AE_Build_FOB_Hack_Laptop_Start, AE_Build_FOB_Hack_Laptop_Stop, AE_Build_FOB_Hack_Laptop_Success, AE_Build_FOB_Hack_Siren_Fail, AE_Build_FOB_Hack_Siren_Start, AE_Build_FOB_Hack_Siren_Stop, AE_Build_FOB_Hack_Siren_Success, AE_Build_FOB_Repaired, AE_Build_FOB_State, DA_Buildable_FOB, DA_FOB_Interactions, DA_FOB_Ruleset | | Data/Buildables/HBlock | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_HBlock, DA_Buildable_HBlock_Stages, DA_RadialWheelSlotType_HBlock | | Data/Buildables/HBlock_Gate_6x2 | 14 | gate buildable, left, right and ramp parts, stages, door destruction definitions | DA_Buildable_Gate_Audio, DA_Buildable_Gate, DA_Buildable_Gate_Left, DA_Buildable_Gate_Left_Stages, DA_Buildable_Gate_Ramp, DA_Buildable_Gate_Ramp_Stages, DA_Buildable_Gate_Right, DA_Buildable_Gate_Right_Stages, DA_Buildable_Gate_Stages, DA_RadialWheelSlotType_Gate, D_Decorator_Door_Gate_Left, D_Decorator_Door_Gate_Right, D_Door_Gate_Left, D_Door_Gate_Right | | Data/Buildables/HBlock_QuadWall | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_HBlock_QuadWall, DA_Buildable_HBlock_QuadWall_Stages, DA_RadialWheelSlotType_HBlock_QuadWall | | Data/Buildables/Hotzone_Magnet | 7 | buildable, stage definition, radial wheel slot and sounds | AE_Buildable_HotzoneMagnet_Generator_Start, AE_Buildable_HotzoneMagnet_Generator_Stop, AE_Buildable_HotzoneMagnet_Ready_Start, AE_Buildable_HotzoneMagnet_Ready_Stop, DA_Buildable_HotzoneMagnet, DA_Buildable_HotzoneMagnet_Stages, DA_RadialWheelSlotType_HotzoneMagnet | | Data/Buildables/Radio | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_Radio, DA_Buildable_Radio_Stages, DA_RadialWheelSlotType_Radio | | Data/Buildables/Ramp | 1 | radial wheel slot only; no buildable asset in this export | DA_RadialWheelSlotType_Ramp | | Data/Buildables/RefuelStation | 6 | buildable, stage definition, radial wheel slot and sounds | AE_Buildable_RefuelStation_Refuel_Start, AE_Buildable_RefuelStation_Refuel_Stop, DA_RefuelStation_Audio, DA_Buildable_RefuelStation, DA_Buildable_RefuelStation_Stages, DA_RadialWheelSlotType_RefuelStation | | Data/Buildables/RepairStation | 6 | buildable, stage definition, radial wheel slot and sounds | AE_Buildable_RepairStation_Repair_Start, AE_Buildable_RepairStation_Repair_Stop, DA_RepairStation_Audio, DA_Buildable_RepairStation, DA_Buildable_RepairStation_Stages, DA_RadialWheelSlotType_RepairStation | | Data/Buildables/SV_Shelter | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_Shelter, DA_Buildable_Shelter_Stages, DA_RadialWheelSlotType_Shelter | | Data/Buildables/SandbagWall | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_SandbagWall, DA_Buildable_SandbagWall_Stages, DA_RadialWheelSlotType_SandbagWall | | Data/Buildables/TallHBlock | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_TallHBlock, DA_Buildable_TallHblock_Stages, DA_RadialWheelSlotType_TallHBlock | | Data/Buildables/TankTrap | 4 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_TankTrap_Audio, DA_Buildable_TankTrap, DA_Buildable_TankTrap_Stages, DA_RadialWheelSlotType_TankTrap | | Data/Buildables/WindowBoard | 1 | radial wheel slot only; no buildable asset in this export | DA_RadialWheelSlotType_WindowBoard | | Data/Buildables/WoodBase | 3 | buildable, stage definition, radial wheel slot and sounds | DA_Buildable_WoodBase, DA_RadialWheelSlotType_WoodBase, DA_WoodBase_Stages | | Data/ForwardOperatingBase | 7 | FOB item, animation set, placement texts, interaction and post-process data | AnimSet_FOB, DA_Item_FOB_Audio, DT_ForwardOperatingBase_PlacementDisplayTexts, DT_InteractionContextData_ForwardOperatingBase, DT_InteractionContext_ForwardOperatingBase, DT_PostProcessEffects_FOB, ID_ForwardOperatingBase | | Data/FuelSupplies | 2 | Fuel Supplies item and audio | DA_Item_FuelSupplies_Audio, ID_FuelSupplies | | Data/LargeHammer | 4 | Large Hammer item, animations, audio and its placeable list | AnimSet_BuildToolHammerLarge, DA_Item_BuildTool_LargeHammer_Audio, DT_Buildables_LargeHammer, ID_LargeHammer | | Data/MediumHammer | 4 | Medium Hammer item, animations, audio and its placeable list | AnimSet_BuildToolHammerMedium, DA_Item_BuildTool_MediumHammer_Audio, DT_Buildables_MediumHammer, ID_MediumHammer | | Data/MunitionsSupplies | 2 | Ammo Supplies item and audio | DA_Item_AmmoSupplies_Audio, ID_MuntionsSupplies | | Data/SmallHammer | 4 | Small Hammer item, animations, audio and its placeable list | AnimSet_BuildToolHammerSmall, DA_Item_BuildTool_SmallHammer_Audio, DT_Buildables_SmallHammer, ID_SmallHammer | | Data/SparePartsSupplies | 2 | Mechanical Supplies item and audio | DA_Item_MechanicalSupplies_Audio, ID_SparePartsSupplies | | Data/UI | 22 | FOB inventory and tooltip, map and spatial trackers, material trackers, refuel and repair scene | DA_ContainerGridSlot_FOB_Inventory_Storage, DA_ContainerGrid_Inventory_Subslots_FOB, DA_ContainerGrid_Inventory_Subslots_FOBSupplies, DA_ItemCard_FOBSupplies, DA_ItemCard_Inventory_FOB, DA_LootedComponent_FOB, DA_MaterialTrackerData_HotZoneMagnet, DA_MaterialTrackerData_RefuelStation, DA_MaterialTrackerData_RepairStation, DA_Tooltip_Entry_FOB, DA_Tooltip_FOB, DA_Tracker_Map_Buildable, DA_Tracker_Map_BuildableHotZoneMagnet, DA_Tracker_Map_FOB, DA_Tracker_Spatial_Buildable, DT_LootedComponentTypes_FOB, DT_MaterialTrackerSettingsData_Buildables, DT_TrackerData_Map_Buildables, DT_TrackerData_Spatial_Buildables, DA_Scene_FobRefuelRepair, DT_SceneData_Match_Buildables, DT_TooltipData_Buildables | | root | 6 | feature root, entity names, global damage, vendor table, input mappings | Buildables, DT_EntityData_UI_Buildables, DT_GlobalDamage_BuildableData, DT_VendorData_Ext_Buildables, IMC_Action_Build, IMC_Action_Dismantle |

Total: 206 files.

11. Open items

  • Resolved in round 38 (section 13): how Cost turns into Build Supplies and how BuildAmount scales against stage progress. Still open: the hammer’s real swing period (seconds to build), the build cost scale S (live curve, 1.0 without it), and the effect of Buildable.Damage.DoNotTakeDamage on the FOB (no native reader found). Resolved in round 45: the FOB Blueprint’s vitality override of 300 does not apply; when the buildable’s data asset is set the server writes the data asset’s MaxHealth into both the base and the maximum health of the vitality component, so the FOB has 15,000 health (Native, static reading, evidence).
  • StackCheckOffset and the unnamed (_aaab...) placement fields beyond what section 14.2 reads.
  • The native code of the Drill Rig hot zone effect (movement and resizing of the zone) and the native choice between the Placed and Placed-in-FOB cash tables (section 14.6, 14.7).
  • Whether destroying or dismantling a structure refunds supplies (no credit call found; OnBuildableDestroyed not decoded).
  • Hit-count tables per structure: a derived bound for four sources is in section 12.3; the exact tables need all matching damage entries (armor-piercing, hollow-point, calibers) and the instigator and target rules.

Resolved in round 38 (section 14): bOverridesFinalStage, MaxStack, PlacementFlags, weak spots, the two Blueprint placement conditions, the Builder’s Radio, the Drill Rig numbers and units, the missing cash rows, and the FOB spawn question.

12. Round 36 additions

Evidence: cooked data read and static disassembly, see round 36 combat evidence. Re-derive the numbers with python -I _tools/round36_combat.py --check.

12.1 Refuel and Repair Station rates

The stations hold no numbers of their own. The rates are in the FOB refuel and repair scene asset DA_Scene_FobRefuelRepair (StationData). MaxAmount is a fraction of the vehicle’s fuel tank or health pool.

Station Button MaxAmount Cost (cash) RestockTime (s) Supply item Items per restock
Refuel Station Fast 0.05 75 3.0 Fuel Supplies 5
Refuel Station Max 1.0 1,500 9.0 Fuel Supplies 5
Repair Station Fast 0.05 100 3.0 Mechanical Supplies (SparePartsSupplies) 5
Repair Station Max 1.0 2,000 9.0 Mechanical Supplies 5

The cash for Fast is 5% of the Max price. The sale appears to pay the FOB owner (inferred from WDFobStationPayOwner). How the 5 items scale with the amount restocked is native and not read.

12.2 What RepairSpeedMultiplier is

WDBuildableDataAsset.RepairSpeedMultiplier exists on 32 buildable assets. It equals Cost / 15 on 21 of them (Refuel and Repair Station 13.33, Radio 1.33, Tank Trap 1.47, Quad Wall 5.0); the multi-stage parents and the stationary weapons differ (Bunker 6.67, Door 2.0, Gate 5.67, Talon 66.67). It is a per-structure value that the native hammer path multiplies into the hit amount (inferred from 0x85F1F20, which reads the data asset at +0x64); it is not a vehicle refuel or repair rate.

12.3 Hits to destroy (derived)

ceil(MaxHealth / (base * (1 + factor))) at point blank with full base damage, using the per-source factors of section 4. Base damage: M4 5.56 FMJ 28, M67 frag 100, 120 mm tank rocket 150, C4 250.

Structure HP M4 5.56 FMJ M67 frag 120 mm rocket C4
Barbed Wire 250 60 3 1 1
Sandbag Wall, Wood base 735 175 8 1 1
Hesco (HBlock) 1,600 286 11 5 2
Door 2,200 524 22 2 3
Tall Hesco, Shelter 2,250 402 15 9 4
Tank Trap 4,500 1,072 90 6 3
Bunker, Recon Tower, Indirect Fire Shelter 5,000 893 100 23 14
Gate 5,320 1,267 54 4 2
Bremer Wall 6,500 1,161 44 13 7
Refuel Station, Repair Station 1,600 286 11 1 1
FOB 15,000 2,679 50 7 5

These are bounds from the tables, not observed hit counts. The build time per structure and how Cost converts to Build Supplies per hit stay native (hit path Server_SingleHitMode_Construct -> 0x86032F0 -> 0x85EAAA0 -> 0x85F1D90 -> 0x85F1F20).

12.4 Stationary weapon health and restock

The MG Nest buildable asset says 3,000 MaxHealth; the finished gun is the STN_06 vehicle, whose InitialVehicleHealth and VP_STN_06 MaxHealth are 1,800 (the other five stationary weapons have equal values in both places). The plot actor B_Buildable_StationaryVehicle takes its health from the buildable asset while it is being built.

Weapon ReloadTime (s) Start + end delay (s) Restock supplies Cash Rounds per restock
Talon (STN_01) 5.0 1.0 + 1.0 200 Munitions not set not serialized
STN_02 3.0 1.0 + 1.0 250 Munitions not set 500
L81 Mortar (STN_03) 4.5 1.0 + 1.0 150 Munitions not set not serialized
Stingray (STN_05) 0.0 1.0 + 1.0 900 Mechanical Supplies 5,000 1 (native default)
MG Nest (STN_06) 8.0 1.0 + 1.0 200 Munitions not set 60

The Stingray is bought, not reloaded: the drone reload scene reads “PURCHASE STINGRAY” with spare parts and cash. It and the Talon are lock-on weapons (TargetingSetup: air targets, TimeToTarget 2.0 s, FireDelayAfterLock 0.5 s; the Stingray fires only while locked).

13. Round 38: the building arithmetic

Evidence: static disassembly of the hammer hit path, see round 38 evidence. Labels: Native for the formulas, Derived for the table.

  • Per hit (Native). A hit adds A / T of the structure’s progress, where A = BuildAmount x build factor and T = Cost (rounded, scaled by a live-curve value that is 1.0 when absent). The build factor is 1 except Barbed Wire 3.5, Camo Net Tent 3.5, Hotzone Magnet 2.0 and STN_02 1.25. A hit on a critical spot adds BuildAmountWhenTargetIsHit / T instead. Hits to build = ceil(T / A).
  • Supplies (Native). Cost is spent a little per hit: about A Build Supplies per hit (whole supplies are taken, the fraction carries over), Cost in total whichever hammer builds. PlacementCost is a separate amount checked and charged at placement; it is 0 on every buildable in the data.
  • Repair (Native). On a finished structure the same hit restores A x RepairSpeedMultiplier / T of its maximum health, capped; unneeded supplies are refunded. RepairSpeedMultiplier is used only for finished structures.
  • Unfinished structures (Native). Damage lowers build progress by damage / MaxHealth; at 0 the structure is destroyed.
  • Dismantle (Native). Damage of type Damage.Type.Dismantle: 250 / 200 / 150 per hit (Large / Medium / Small), times 1.0 on your own structure and 0.5 on another owner’s (key choice inferred). No supply refund was found.
  • Extension class (Native). The hammer’s BuildAmount is the field of UWDItemExtensionData_BuildBuildable; its 3.0 default and BuildAmountPerSecond (continuous mode) are not used by the hammers.
  • FOB (not resolved). Buildable.Damage.DoNotTakeDamage is an FName on the data asset that no native function reads; the buildable damage path has no check for it. Whether the FOB takes damage is unknown.
  • Not native. The swing period: seconds below assume one hit per swing loop of the use montage.

| Structure | Tag | Build Supplies to finish (T) | Placement supplies | Build factor | Repair multiplier | Max health | Placed with | Hits S / M / L | Seconds S / M / L | Full repair hits S / M / L | Dismantle hits S / M / L (own) | |—|—|—:|—:|—:|—:|—:|—|—|—|—|—| | DA_Buildable_AirRaidShelter | AirRaidShelter | 200 | 0 | 1 | 6.7 | 5,000 | L | 400 / 200 / 134 | 226.8 / 113.4 / 118.3 | 60 / 30 / 20 | 34 / 25 / 20 | | DA_Buildable_AirRaidShelter_Ceiling | AirRaidShelter.Ceiling | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_AirRaidShelter_Floor | AirRaidShelter.Floor | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_BarbedWire | BarbedWire | 7 | 0 | 3.5 | 0.5 | 250 | SML | 4 / 2 / 2 | 2.3 / 1.1 / 1.8 | 9 / 5 / 3 | 2 / 2 / 1 | | DA_Buildable_Door | Door | 80 | 0 | 1 | 2 | 2,200 | ML | 160 / 80 / 54 | 90.7 / 45.4 / 47.7 | 80 / 40 / 27 | 15 / 11 / 9 | | DA_Buildable_Door_DoorOnly | Door | 22 | 0 | 1 | 1.5 | 500 | ML | 44 / 22 / 15 | 24.9 / 12.5 / 13.2 | 30 / 15 / 10 | 4 / 3 / 2 | | DA_Buildable_Door_TopSegment | Door.TopSegment | 22 | 0 | 1 | 1.5 | 500 | - | 44 / 22 / 15 | 24.9 / 12.5 / 13.2 | 30 / 15 / 10 | 4 / 3 / 2 | | DA_Buildable_BremmerWall | BremmerWall | 32 | 0 | 1 | 1.5 | 6,500 | L | 64 / 32 / 22 | 36.3 / 18.1 / 19.4 | 44 / 22 / 15 | 44 / 33 / 26 | | DA_Buildable_Bunker | Bunker | 200 | 0 | 1 | 6.7 | 5,000 | L | 400 / 200 / 134 | 226.8 / 113.4 / 118.3 | 60 / 30 / 20 | 34 / 25 / 20 | | DA_Buildable_Bunker_Floor | Bunker.Floor | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_Bunker_Roof | Bunker.Roof | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_CamoNetTent | CamoNetTent | 7 | 0 | 3.5 | 0.5 | 300 | SML | 4 / 2 / 2 | 2.3 / 1.1 / 1.8 | 9 / 5 / 3 | 2 / 2 / 2 | | DA_Buildable_CrowsNest | CrowsNest | 200 | 0 | 1 | 6.7 | 5,000 | L | 400 / 200 / 134 | 226.8 / 113.4 / 118.3 | 60 / 30 / 20 | 34 / 25 / 20 | | DA_Buildable_CrowsNest_BaseFloor | CrowsNest.BaseFloor | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_CrowsNest_FirstFloor | CrowsNest.FirstFloor | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_CrowsNest_Roof | CrowsNest.Roof | 10 | 0 | 1 | 0.7 | 2,250 | - | 20 / 10 / 7 | 11.3 / 5.7 / 6.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_FOB | FOB | 30 | 0 | 1 | 2 | 15,000 | - | instant | instant | 30 / 15 / 10 | 100 / 75 / 60 | | DA_Buildable_HBlock | HBlock | 15 | 0 | 1 | 1 | 1,600 | SML | 30 / 15 / 10 | 17 / 8.5 / 8.8 | 30 / 15 / 10 | 11 / 8 / 7 | | DA_Buildable_Gate | Gate | 200 | 0 | 1 | 5.7 | 5,320 | ML | 400 / 200 / 134 | 226.8 / 113.4 / 118.3 | 71 / 36 / 24 | 36 / 27 / 22 | | DA_Buildable_Gate_Left | Gate | 85 | 0 | 1 | 5.7 | 5,320 | ML | 170 / 85 / 57 | 96.4 / 48.2 / 50.3 | 30 / 15 / 10 | 36 / 27 / 22 | | DA_Buildable_Gate_Ramp | Gate.Ramp | 85 | 0 | 1 | 5.7 | 6,500 | - | 170 / 85 / 57 | 96.4 / 48.2 / 50.3 | 30 / 15 / 10 | 44 / 33 / 26 | | DA_Buildable_Gate_Right | Gate | 85 | 0 | 1 | 5.7 | 5,320 | ML | 170 / 85 / 57 | 96.4 / 48.2 / 50.3 | 30 / 15 / 10 | 36 / 27 / 22 | | DA_Buildable_HBlock_QuadWall | HBlockQuadWall | 75 | 0 | 1 | 5 | 4,600 | ML | 150 / 75 / 50 | 85 / 42.5 / 44.1 | 30 / 15 / 10 | 31 / 23 / 19 | | DA_Buildable_HotzoneMagnet | HotzoneMagnet | 2750 | 0 | 2 | 150 | 2,500 | L | 2,750 / 1,375 / 917 | 1,559.2 / 779.6 / 809.7 | 19 / 10 / 7 | 17 / 13 / 10 | | DA_Buildable_Radio | Radio | 20 | 0 | 1 | 1.3 | 1,000 | SML | 40 / 20 / 14 | 22.7 / 11.3 / 12.4 | 31 / 16 / 11 | 7 / 5 / 4 | | DA_Buildable_RefuelStation | RefuelStation | 200 | 0 | 1 | 13.3 | 1,600 | L | 400 / 200 / 134 | 226.8 / 113.4 / 118.3 | 31 / 16 / 11 | 11 / 8 / 7 | | DA_Buildable_RepairStation | RepairStation | 200 | 0 | 1 | 13.3 | 1,600 | L | 400 / 200 / 134 | 226.8 / 113.4 / 118.3 | 31 / 16 / 11 | 11 / 8 / 7 | | DA_Buildable_Shelter | SV_Shelter | 250 | 0 | 1 | 1 | 2,250 | ML | 500 / 250 / 167 | 283.5 / 141.8 / 147.5 | 500 / 250 / 167 | 15 / 12 / 9 | | DA_Buildable_SandbagWall | SandbagWall | 15 | 0 | 1 | 1 | 735 | SML | 30 / 15 / 10 | 17 / 8.5 / 8.8 | 30 / 15 / 10 | 5 / 4 / 3 | | DA_Buildable_TallHBlock | TallHBlock | 22 | 0 | 1 | 1.5 | 2,250 | ML | 44 / 22 / 15 | 24.9 / 12.5 / 13.2 | 30 / 15 / 10 | 15 / 12 / 9 | | DA_Buildable_TankTrap | TankTrap | 22 | 0 | 1 | 1.5 | 4,500 | SML | 44 / 22 / 15 | 24.9 / 12.5 / 13.2 | 30 / 15 / 10 | 30 / 23 / 18 | | DA_Buildable_WoodBase | WoodBase | 15 | 0 | 1 | 1 | 735 | SML | 30 / 15 / 10 | 17 / 8.5 / 8.8 | 30 / 15 / 10 | 5 / 4 / 3 |

Hammer constants used (BuildAmount, critical-spot amount, dismantle damage per hit, swing loop in seconds): Small 0.5, 3, 150, 0.567; Medium 1, 5, 200, 0.567; Large 1.5, 8, 250, 0.883.

14. Round 38 additions

Evidence: cooked data and Blueprint bytecode read with the extractor (dump mode), the Dumper-7 headers in sdk/raw, and static reading of the decompiled native code. Nothing was run. Details, asset names and RVAs: round 38 building data evidence. The per-structure values below are in assets/data/buildable-semantics.json, written by python -I _tools/buildable_semantics.py (--check asserts the key values).

14.1 bOverridesFinalStage and the ...ActorReplacing spawners

Data, Derived. The six definitions with the flag are the six whose finished form is a composite: Indirect Fire Shelter, Door, Bunker, Recon Tower, Gate and Hesco Wall (quad wall). Each one has a spawner base class that derives from WDActorReplacingBuildable (B_Buildable_AirRaidShelter_C, B_Buildable_Door_ActorReplacing_C, B_Buildable_Bunker_C, B_Buildable_CrowsNestActorReplacing_C, B_Buildable_Gate_ActorReplacing_C, B_Buildable_HBlock_QuadWall_C; the Blueprints hold no logic of their own). The other structures use a WDActorSpawningBuildable subclass or a plain B_Buildable_C.

What differs is the last stage. In every override definition the last stage’s mesh list names ActorToSpawn sub-actors (separate buildable prefabs); structures without the flag have a single finished mesh and no sub-actors. Final-stage sub-actors:

Structure Sub-actors listed by the last stage
Indirect Fire Shelter shelter floor, shelter ceiling, one tall Hesco, one Hesco
Door door top segment, the Door actor (B_Buildable_Door_C)
Bunker tall Hesco, sandbag wall, Hesco, bunker roof, bunker floor
Recon Tower tall Hesco, sandbag wall, Hesco, tower roof, first floor, base floor
Gate left gate half, right gate half, Hesco gate ramp (rule FinalOnly)
Hesco Wall (quad) tall Hesco

So while the structure is built the stage meshes are previews (the placement rule is PreviewOnly for the mesh that carries the sub-actor), and at completion the sub-actors take over, each its own buildable with its own health and damage row (the parts are single-stage data assets such as DA_Buildable_Bunker_Floor). That the native code swaps preview for actors at completion is Derived from the field names (EWDPlacementRules: PreviewAndFinal, PreviewOnly, FinalOnly, FinalOnlyWithFoundations) and the class names; the swap itself is native and was not read. The native default of the flag is false (data asset constructor 0x8585020, offset 0x290).

14.2 MaxStack and PlacementFlags

Native (static reading), enum from the SDK.

  • EWDPlacementFlags (BuildablesRuntime): 1 AllowRotation, 2 CanBeBuiltOn, 4 CanPlaceVertically, 8 CanPlaceOnBuildables, 11 Default (a bit set).
  • Native defaults: PlacementFlags 11 (1 + 2 + 8) and MaxStack 2 (data asset constructor 0x8585020). Serialized values: 9 (AllowRotation + CanPlaceOnBuildables) on 14 assets (Recon Tent, Sandbag Wall, Tank Trap, Radio, Refuel and Repair Station, Gate halves, Drill Rig and five of the six stationary weapons), 1 (AllowRotation only) on the FOB, and nothing on the other 23, where the default 11 applies. The earlier wording “9 for almost every structure” counted only serialized values.
  • Reader: the snap-on-top placement check sub_1485C5390 (RVA 0x85C5390). In order it requires: the new structure has bit 8; the buildable underneath has bit 2 (sub_1485889A0, RVA 0x85889A0); the entity tag of each is allowed by the other’s tag list; the lower buildable is complete (progress at least 1.0); lower.StackHeight + 1 <= MaxStack of the new structure; and the new support height stays within SupportHeightLimit of DA_BuildablePlacementData (1,500). Every failure returns its own reason tag.
  • So MaxStack is the stack-height limit for the structure being placed on top of other buildables (the one placed included), not a placement count. Examples: Barbed Wire, Recon Tent, Sandbag Wall, Tank Trap and both stations 100; Hesco block 5; MG Nest 5; Wood base 4; Radio and four stationary weapons 6; FOB, Gate, Shelter, Bremer Wall and Indirect Fire Shelter 1; Recon Tower parts, Drill Rig and Gate halves 0. Unset (- in the placement table) means the default 2.
  • Flag meaning per group: FOB (1) can be rotated, cannot be built on and cannot be placed on other buildables. The 9 group can be placed on buildables but nothing can be placed on them. The default 11 group (walls, Bunker and its parts, MG Nest, Door, Gate) can be both. CanPlaceVertically (4) is set on no asset and its reader was not found.
  • The two tag containers on the data asset (offsets 0x130 and 0x150) are the allowed-neighbour lists used by the two tag checks: the Barbed Wire lists only itself, the Bremer Wall lists Barbed Wire and Sandbag Wall. Derived from the reader; which list is which direction was not separated.

14.3 Weak spots (critical-hit spots)

Data, Blueprint bytecode, native defaults. A weak spot is a build-speed bonus for the hammer, not a damage multiplier. B_CriticalHitSpot is an actor with a small box (extent taken from its decal, 6.4 x 12.8 x 12.8) that ignores every collision channel including projectiles and melee, so bullets cannot hit it; its tick only draws a debug sphere. The hammer item carries WDItemExtensionData_CriticalHitSpotManager, which shows a highlighted decal on the structure being built:

Hammer Normal hit Hit on the weak spot (BuildAmountWhenTargetIsHit) Factor Max distance from player view Facing-away limit at spawn
Small 0.5 3 6 290 135 degrees
Medium 1 5 5 290 135 degrees
Large 1.5 8 5.3 340 135 degrees

Native defaults of the manager that the hammers do not override (constructor 0x85E0960): BuildAmountPerSecondWhenTargetIsTracked 4.0 (continuous mode, while the aim stays on the spot), CriticalHitSpotSpeed 30, CriticalHitSpotRotationLerpSpeed 0.02, CriticalHitSpotDistanceRequirementSquared 4, relocation mode EyeLine, life span 0 and spawn delay 0. Spot colours: default FFCF02, highlighted FFEFD1. Each non-final stage lists its spot positions in its stage file (counts per stage are in the JSON); the last stage has none. The data-asset flag bUsesCriticalHitSpots defaults to true and is set false on Barbed Wire, Recon Tent and the part assets (so those two have spots in the stage files that are never shown). No damage-table row, Gameplay Effect or reward mentions weak spots (searched data/ for CriticalSpot and CriticalHit).

14.4 The two Blueprint placement conditions

Blueprint bytecode and native code (static).

Condition Test Number
B_SafeZonePlacementCondition (IsSatisfied) Fails with the warning tag UI.Interactions.PlacementWarnings.InSafeZone if the placing player carries any of the tags State.Location.SafeZone.Alpha, .Bravo, .Charlie or .Hostile. Otherwise it walks every B_SafeZone actor and fails if the closest point of that safe zone’s trigger volume to the placement location is at most MinDistanceToSafezone away. 300 Unreal units (3 m)
B_WithinLadderBoundsPlacementCondition (native WDWithinLadderBoundsPlacementCondition, vtable slot 0x7725250) Runs a sphere overlap (trace tag WDLadderPlacementCheck) at the placement location and fails if any WDMoverLadder actor (class in /Script/WDGame) overlaps. BlockRadius 100 Unreal units (1 m)

The safe-zone condition is listed on 25 of the 38 buildable data assets (the FOB, Bunker, Door and Gate main assets list it; the Drill Rig and the sub-part assets of multi-part structures do not), the ladder condition on 37 (all but the Drill Rig). The Unreal unit is the centimetre.

14.5 Builder’s Radio

Data, Blueprint bytecode. The Builder’s Radio is a music radio. B_Radio has a world interactable with a power toggle and seven stations (Interaction.Context.Buildables.Radio.Power, .Station1 to .Station7). The power interaction sets the station number to 0 (off) or back to the previous station; each station interaction sets the number; B_Radio_AudioHandler replicates Curr Station Num and Prev Station Num, starts the audio component with the trigger parameter Play and sets a timer for the next song. No spawn, call, supply drop or UI effect is in the Blueprints. bRegisterWithFOB makes the FOB count the radio toward its limit of 4 (the FOB component keeps a TrackedBuildablesCount against the ruleset’s LimitFOBBuildables); placement must also be inside a friendly FOB radius. B_Radio_World is the same radio as a world prop (a WDWorldRadioSpawnComponent spawns it in the pre-lobby).

14.6 Drill Rig and the hot zone magnet

Data and native defaults. The HotzoneMagnet buildable is the buildable form of the map’s hot zone magnet. Its settings, with the native default for what the asset does not set (data asset constructor 0x85E05D0):

Setting Asset value Native default
InitialDelayDuration 15 10
HotZoneMagnetRechargeDuration 900 300
HotZoneMagnetMinimumFuel 2,000 200
HotZoneMagnetDurationPerFuel 0.03 0.3
MaxFuel 10,000 1,000
ActivateInteractionDuration not set 10
ActivateInteractionRange / FuelInteractionRange not set 200 / 200
ActivatedHotZoneMagnetSpeed not set 5.0
ActivatedHotZoneMagnetSizeMultiplier not set (0.5, 0.5, 1.0)
HotZoneTowerRewardRange (actor) not set 2,500

Units (Derived). The delays and the recharge are seconds (the Blueprint drives timers with them and the HUD divides the remaining cooldown by the total). Run time is fuel times DurationPerFuel: the minimum 2,000 fuel gives 60 s and the full 10,000 fuel gives 300 s of activation. Fuel is the FOB’s Fuel Supplies (Id.Item.FuelSupplies; the rig follows the FOB inventory, and the HUD strings read “FOB REQUIRED”, “MIN FUEL”, “INSUFFICIENT FUEL”, “READY TO ACTIVATE”, “DRILL ACTIVE”). Activation is an interaction held for 10 s within 200 units.

What it does. The rig drives the session-wide WDHotZoneMagnetGameStateComponent, the same component that the map’s tower and keypad puzzle uses (towers captured reveal a code; a wrong code costs HotZoneMagnetCodeAttemptsTimePenalty 30 s on B_HotZoneMagnet). The component keeps the active magnet number and location, a speed (native 3.0), a size multiplier (native (0.6, 0.6, 1.0)), an activation duration (Blueprint value 180 s, native 120) and a tower recharge (Blueprint value 900 s, native 150); the 900 matches the rig’s own recharge. While a magnet is active, the hot zone (control zone) is moved to it and scaled by the size multiplier. Movement (round 46): the speed is in metres per second; the transition time is the straight-line distance in metres divided by the speed (native world speed 3.0), and that time is added to the activation duration (0x776DDD0, 0x776D890; round 46, item 3). Reward rows (cash table base): magnet activated 5,000, magnet destroyed 150 (200 for the instigator), tower captured 250 (1,000 hostile); the reward text says resources go to all friendly players within range of an activated magnet. Not traced: the per-tick interpolation of the zone centre, and which of the two speed and size pairs (component or rig asset) applies to a rig (both handlers read the world component’s pair).

14.7 Cash rows for the missing structures, and the Placed tables

ABSENT as named rows; table choice is native. None of the Talon 9K-SAM, Loudspeaker, Vanguard CIWS, Stingray, MG Nest, Wood Base or Shelter has a row in DT_Reward_Cash_BuildableBuilt, ...Placed or ...PlacedInFOB; all three tables hold the same 10 structures (HBlock, TallHBlock, Gate, FOB, HBlockQuadWall, Mortar, BarbedWire, TankTrap, AirRaidShelter, Bunker) and none of the seven is in a reward lookup or challenge table for placing. Each table has a Meta.Progression.Context.DefaultReward row: Built base 1 (owner 0.5, friendly 1), Placed base 1 (owner 1, friendly -1), Placed in FOB base 1 (owner 0, friendly -1). If the lookup falls back to that row for an unlisted structure the payout would be 1 cash; the fallback is native and not confirmed.

How the tables are chosen: all are sources of one Data Registry, DR_CashRewards (registry type CashRewards, item struct WDCustomRewardTableRow), in this order: Built, Placed, Placed in FOB, ControlZoneReward, DeployableDestroyed, DeployedSupplyCrate, EndGameFactionReward, Heal, HotZoneMagnet, PlayerKill, Refuel, Repair, Revive, VehicleDestroyed, VehicleTransport. Built, Placed and Placed in FOB use the same row names, so a lookup by row name alone cannot tell them apart (which source’s row is cached for an id is decided by the registry’s acquire order, which was not read: the lookup itself is one cache map keyed by the resolved id, round 46, item 4). Which table a placement event reads was not found in the native code. The per-placement reward that is visible in data is Challenges.Rewards.Buildables.SchematicPlaced (“Wait For Schematic Placed In FOB Event”): a flat 10 times the zone modifier (control zone 1, hot zone 2) with no role resource, plus the resource SchematicPlacedInFOBScore of 5 cash (+5 inside a hot zone), neither depends on the structure type.

14.8 Is the FOB a spawn point?

ABSENT in the client data (not excluded on the server). Searched: every FOB Blueprint (B_ForwardOperatingBase*, B_ForwardOperatingBaseComponent, the three faction buildable and placement classes), the WDForwardOperatingBaseComponent and WDFobWatchingCollisionBox members in the SDK, the spawn tags and string tables in data/, and the spawn classes (WDSpawnManager, WDSpawnVolume, WDSpawnQueryPoint, WDPlayerSpawnManagerComponent), which are keyed by faction tag and map-placed query points and never reference the FOB. The only “spawn” the FOB Blueprints use is WDBuildable_ActorSpawnLocation, the anchor for the sub-actors a buildable spawns. The player-facing texts describe the FOB as a claim-territory and supply point (“Needed to Build Larger Structures”, “Can hold Items & Resources”, “Provides a Radius in Which Players Can Build”; “claim territory for your team”). Placement warnings: “Too close to another Forward Operating Base”, “FOB build zones cannot overlap”, “Can’t Place In Enemy FOB Radius”. Vehicle.Variant.Land.Tracked.SpawnVehicle is a separate vehicle class, not the FOB.