Production context
GDD/01-Gameplay/06-Inventory-and-Items.mdVerified implementation evidence
Source/Lambeer/Inventory/InventoryComponent.*Source/Lambeer/Inventory/EquipmentComponent.*Source/Lambeer/Inventory/HeldItemComponent.*Source/Lambeer/Inventory/LambeerInventoryLibrary.*Source/Lambeer/Items/WorldItemPickup.*Source/Lambeer/Items/WorldDropContainer.*Source/Lambeer/Data/LambeerItemDefinition.*Source/Lambeer/UI/LambeerInventory*.{h,cpp}
Relationships
ITEM-DB— ItemId catalogTECH-CONSOLE-CHEATS— GiveItem / Equip / SpawnPickup / UI_G3Give* catalogFEAT-SURVIVALFEAT-COMBATFEAT-WEAPON-CUSTOMIZATIONFEAT-BLOOD-VISUALFEAT-WETNESS-RAINFEAT-BUILDINGFEAT-VEHICLESFEAT-LOCK-ACCESS— Lock/key item and eligible-container rulesFEAT-AGRICULTUREFEAT-CRAFTING-PROGRESSIONPIPE-ROADMAPheld tools slice
Document contract coverage
Use these required Feature Specification areas during review. The HTML content below is authoritative; items not stated explicitly remain unresolved.
- ReviewPurpose & Player Value
- ReviewScope
- ReviewOut of Scope
- ReviewTerminology
- ReviewFunctional Behavior
- ReviewStates & Flows
- ReviewRules & Edge Cases
- ReviewDependencies
- ReviewAcceptance Criteria
- ReviewOpen Questions
Authoritative project content
Model — [CONFIRMED] SCUM-style worn containers + weight
Carry space is not a single fixed backpack grid. It is the sum of storage provided by worn clothing/equipment (SCUM-like), plus a small body/pockets baseline so a stripped character can still hold a few items.
- Weight still drives encumbrance (move speed, stamina). See 04-Survival-System.md.
- Slot count and weight cap both come from equipped containers (pockets, pants, jacket, vest, backpack, etc.). Manual unequip of a container that still holds items is refused until those items are moved or dropped (v1). Nested “items live inside the backpack item when unequipped” while alive remains the long-term SCUM target — [TBD] after clothing-as-container instances exist. [OWNER 2026-09-15] Inventory UI equip (drag onto a Worn/Back slot, context Equip, or Ctrl+RMB) is the implemented exception while alive: the displaced worn storage item packs matching
ContainerIdstacks intoNestedContents, then goes to player storage if there is space, otherwise it is dropped. [G4 IMPLEMENTATION 2026-09-12] Death dump is the other exception: contents whoseContainerIdmatches a worn storage item’sItemIdare packed into that item’sNestedContentsin the death bag. Equipping that packed item unpacks them back into worn storage. Owner-reported pass 2026-09-12 that backpack contents stay packed in the death bag. - Not a Tetris/grid-shape inventory. Each container is a list of stack slots.
- Backpack (when worn) is the largest typical container and is dropped on death as part of the loot bag.
Equipment slots — [CONFIRMED]
| Slot | What goes here |
|---|---|
| Headwear | Helmet or hat |
| Eyewear | Glasses, goggles, or other eye-slot equipment; separate from Headwear so both slots may be equipped together |
| Torso | Shirt / jacket |
| Legs | Pants |
| Feet | Boots |
| Hands | Gloves |
| Body armor | Protective torso armor |
| Vest | Chest rig / load-bearing vest (extra storage); separate from Body armor so both slots may be equipped together |
| Backpack | Worn pack (storage) |
| Back weapon 1 | Firearm or melee holstered on the back (world mesh on character) |
| Back weapon 2 | Second back holster (firearm or melee) |
[CONFIRMED] Headwear and Eyewear are separate equipment slots. Body armor and Vest are also separate equipment slots. Clothing that provides storage declares ProvidedStorageSlots + ProvidedWeightCapacity on the item definition. C++ enum: Head, Eyewear, Torso, Legs, Feet, Hands (gloves), BodyArmor, Vest, Backpack, BackWeapon1, BackWeapon2.
Q1/Q2 back visuals — 2026-09-18: ULambeerBackWeaponVisualComponent attaches holstered meshes to shared character Mesh Sockets back_weapon_1 (Q1/left) and back_weapon_2 (Q2/right) on spine_04. MCP authored those sockets on SKM_MHC_Man_BodyMesh and SKM_MHC_Woman_BodyMesh. Slot placement uses the physics-asset spine_04 torso capsule (center.Y − radius) plus a back-surface trace at ±8 cm on the Man body; Woman lateral is scaled by that capsule radius ratio. BP_PlayerCharacter CDO socket names read back as those two names. Missing sockets fall back to bone spine_04 with the Man bone-local offset. Per-item orientation is slot-specific: BackHolster1Relative (Q1) and BackHolster2Relative (Q2) on ULambeerItemDefinition (Equipment, visible when bCanHolsterOnBack). Runtime writes location and rotation only: ItemWorld = BackHolsterNRelative * SocketWorld on an authored socket, or that slot’s item relative × slot-relative on the spine_04 fallback. Identity is the uncalibrated default; do not copy RightGripRelative and do not silently mirror Q1 into Q2. Existing Data Assets stay identity until calibrated. Headless Lambeer.HUD.Backend.BackHolster passed 1/1 after the closed-Editor native rebuild. Owner PIE is not claimed.
Held hands — [CONFIRMED]
In-hand carry is not the Hands clothing slot. UHeldItemComponent has two held stacks: Right then Left. Runtime attachment uses the character mesh bone/socket references hand_r and hand_l, then applies the item definition’s right/left grip location and rotation. Identity remains the uncalibrated default. The approved grip contract is below. Per-item finger poses are TBD-INVENTORY-GRIP-003. A one-handed item may occupy the left hand only when that item has an authored left grip; missing left data refuses left-hand hold instead of mirroring the right transform. Missing finger Pose Assets do not refuse a hold.
- World single-item pickups are
AWorldItemPickup. Multi-item loot stays onAWorldDropContainer. - Pickup uses existing
IA_Interact. Routing is type-based [CONFIRMED 2026-09-11]: Clothing equips immediately when that equipment slot is empty (no replace; occupied slot goes to storage). Weapon goes to an empty hand first. Other types merge into incomplete stacks up to MaxStack, then an empty storage cell, then an empty hand; if hands are occupied, pickup fails. Items withbCanHolsterOnBacktake an empty back slot before storage. If storage and the applicable destinations are full, pickup is refused. - Stow from a hand into a container is drag-and-drop in inventory UI: press and hold on a held slot, then drop on a pocket/container cell (or on worn clothing that provides storage). Drop to the world by dragging onto the Drop slot.
- Combat dual-wield swing/fire from these hands remains [TBD] in
FEAT-COMBAT. Combat world-prop pickup is a separate feature and is not this pickup actor.
Character grip sockets — approved architecture, 2026-09-12
[OWNER-CLARIFIED ADVICE] The expert advice relayed by the owner means separate attachment sockets for each weapon on the character, not sockets on each weapon's Skeletal Mesh. The reported rationale is that a single socket with per-item offsets can fail on differently sized characters. The owner requested a best-practice check of that rationale. This paragraph records the advice reviewed before the owner approved the project architecture below. The reported rationale is not a universal engine rule; approval does not establish implementation.
Finding: separate sockets are a valid authoring workflow, but socket count alone does not solve character scale or proportions. The decisive factors are transform space, scale inheritance, character-specific calibration, and animation/IK. No universal rule requiring one character socket per weapon was found in the consulted Epic documentation.
What UE 5.8 actually computes
In the installed engine source, USkeletalMeshSocket::GetSocketLocalTransform returns the socket's relative rotation, location and scale. USkeletalMeshSocket::GetSocketTransform combines that transform with its parent bone; USceneComponent::CalcNewComponentToWorld combines a child relative transform with the parent socket. In UE multiplication order:
SocketWorld = SocketLocal * BoneWorld
ItemWorld = ItemRelative * SocketWorld
Engineering inference: for rigid/uniform-scale transforms using the same parent bone, matched coordinate frames and scale rules, an offset stored in a socket can describe the same placement as an appropriately composed item-relative offset. It is not made proportion-aware merely by storing it in a named socket. This equivalence is not a blanket guarantee for non-uniform or negative scale, absolute-transform overrides, different attachment rules, or offsets mistakenly applied in world space.
Illustrative scale example, not a project value: a local translation of 10 cm becomes a 12 cm world displacement under a uniform parent scale of 1.2, whether it is a socket translation or an equivalent child-relative translation. Separately, weapon world dimensions may need to stay fixed. Preserving the weapon's world scale does not automatically preserve the world distance represented by a local grip translation.
| Difference between characters | What can go wrong | Appropriate treatment |
|---|---|---|
| Uniform Actor/component/bone scale | Local translations and attached item dimensions can inherit scale. Additional sockets still use the same transform hierarchy. | Define item world-scale behavior and attachment rules; verify import units and inherited scale. Do not treat extra sockets as scale compensation. |
| Different palm size, hand origin or wrist orientation | One calibration can miss the palm on another mesh even if the Skeleton is shared. | Calibrate per character mesh/body family. A character Mesh Socket override or a body-specific grip profile can store that correction. |
| Different arm length, shoulder width or retargeted pose | The support hand can miss a fixed-size weapon or an arm can overextend. | Retarget the pose and use appropriate hand IK; a rigid attachment offset cannot by itself fix a two-hand constraint throughout an animation. |
Epic mechanisms: ordinary Skeleton sockets are shared through the Skeleton asset; Mesh Sockets allow placement specific to one Skeletal Mesh. Thus the expert's approach is especially useful if each character mesh receives its own calibrated socket placement. Duplicating weapon socket names only on a shared Skeleton does not supply that per-mesh calibration. See Skeletal Mesh Sockets.
Epic demonstrates correcting weapon contact for differently proportioned characters with Hand IK Retargeting and Two Bone IK. Its retargeting guide's end-effector discussion also separates body retargeting from prop-contact requirements. ABP_Player now wires Two Bone IK on hand_l after Control Rig; Hand IK Retargeting is unused. Wiring is not owner visual acceptance.
Approved grip architecture for Lambeer
[OWNER APPROVED 2026-09-12] Use a small, consistent set of character hand/grip attachment references, item-specific placement/pose data, and character/body-specific corrections where needed. Use character Mesh Sockets to author mesh-specific corrections in the Editor. Allow an explicit body-and-item override when one shared correction cannot fit all items. Standardize item pivots/orientation and units for new content; handle existing asset differences through authored data rather than assuming all pivots match.
The owner approved this engineering synthesis after the best-practice review; it is not an Epic-mandated socket layout. The current character scope uses curated MetaHuman presets with male/female base bodies and no runtime body scaling. Validate across the actual presets; do not assume their hand dimensions are identical or invent a list of body sizes.
| Authoring option | Assessment |
|---|---|
| One shared socket + one offset per item, calibrated on only one character | Incomplete for different body proportions when that calibration fails; this is the useful concern behind the reported advice. |
| Separate character socket per weapon, calibrated per character mesh | Permitted where direct visual authoring is useful, with character-specific calibration as needed. Not mandatory for every weapon; carries more weapon-by-body placements to maintain and still needs pose/IK and scale validation. |
| Shared grip references + per-item data + body corrections/overrides | Approved baseline architecture for the firearm, melee and held-item catalog. Requires explicit transform conventions and runtime support; offsets are not inherently incorrect. |
For two-handed items, the owner-approved approach uses a support-hand target on the held object (authored item-local transform; a mesh socket is optional) with Animation Blueprint Two Bone IK. This target has a different role from the character socket that carries the weapon. Blend/release the constraint when the animation intentionally lets go, such as magazine handling. Owner retargeted clips remain ROAD-P09-04.
TBD-INVENTORY-GRIP-001 — melee and general held-item scope
[RESOLVED — OWNER APPROVED 2026-09-12] Firearms, melee weapons and general physically held inspection items use the same attachment/grip contract, with pose and supported hands appropriate to each item. A rigid melee weapon or prop may remain a Static Mesh; attaching it to a character socket does not require a socket or Skeleton on the item. An item-side support target is optional according to the chosen animation approach. An isolated UI inspection preview has separate framing/pivot needs.
P09 animation extension — 2026-09-16: the owner requests Layered Blend Per Bone, all-pose Carry/ShoulderAim/Attack/Fire coverage and per-item animation overrides. ShoulderAim is the corrected name, not ADS. See the canonical animation design and Editor calibration procedure. Grip transforms remain on DA_Item_*; reusable animation profiles do not duplicate them. One-handed pistol support must not change inventory handedness.
P09 per-item hand pose — 2026-09-17: owner confirmed that shared family Carry/ShoulderAim is not enough for contact: each held item needs its own finger pose. TBD-INVENTORY-GRIP-003.
TBD-INVENTORY-GRIP-002 — final authoring and integration contract
[RESOLVED — OWNER APPROVED 2026-09-16] Shared character sockets plus per-item transforms. Architecture from 2026-09-12 is unchanged. Runtime fields, KeepWorld attach, left-hand refusal, bone fallback and AnimBP Two Bone IK landed under ROAD-P09-03 the same day. Numeric offsets and owner PIE remain open. Dedicated character sockets per item remain an authoring exception, not the baseline.
| Topic | Approved rule |
|---|---|
| Character sockets | Keep existing hand_r / hand_l. MCP 2026-09-16: both exist on SKM_MHC_Man_BodyMesh and SKM_MHC_Woman_BodyMesh, parented to bones of the same name, identity local transform. Both presets share metahuman_base_skel. Do not add one character socket per weapon as the default. |
| Data location | Fields on ULambeerItemDefinition, not a separate grip Data Asset for P09: RightGripRelative, optional bHasLeftGripRelative/LeftGripRelative, optional bHasSupportHandTarget/SupportHandTarget (item-local), optional GripBodyOverrides keyed by PresetId plus hand. An override replaces the shared relative for that preset and hand. Isolated UI framing is InspectPreviewRelative. |
| First-slice mapping | Bodies: Preset.Man / Preset.Woman. Items: Crowbar, FireAxe, Sledgehammer, WoodenMallet, L1810. Numeric location/rotation/scale offsets stay unauthored until calibrated in Editor and owner-verified in PIE. Do not invent them here. |
| Transform order | ItemWorld = ItemRelative * SocketWorld. ItemRelative is the authored right or left grip, after any matching body override. |
| World scale | KeepWorld: attach with SnapToTargetNotIncludingScale and keep relative scale 1 for real held meshes. Do not inherit character bone scale. Per-item scale is not the default policy. Crowbar/FireAxe imported oversize remains the 2026-09-15 content record, not a hidden grip scale. |
| Left / right | Author the right grip as the primary. The left grip must be its own transform. Do not silently mirror the right grip. Missing LeftGripRelative makes the item ineligible for the left hand until authored. Two-handed items attach to the right hand; the left hand is the support IK, not a mirrored item attach. |
| Support hand / IK | Two-handed items use AnimBP Two Bone IK to SupportHandTarget. MCP 2026-09-16: these MetaHuman bodies have no ik_hand_* bones; L1810 has no item sockets. ABP_Player applies Two Bone IK on hand_l after Control Rig, using world-space SupportHandIKLocation and SupportHandIKAlpha. Missing SupportHandIK curve keeps full weight. If SupportHandTarget is missing, log a warning, skip IK, and still occupy both hands. Owner clips stay ROAD-P09-04. |
| Missing character socket | Log a warning and attach to the same-named bone (hand_r / hand_l). Do not hide the mesh and do not refuse the inventory hold because the socket is missing. |
| UI inspect | Keep a separate framing/pivot. Do not reuse world-grip transforms for the isolated inspection preview. |
TBD-INVENTORY-GRIP-003 — per-item hand pose
[RESOLVED — OWNER CONFIRMED 2026-09-17] After P09 grip/profile work started, the owner confirmed that grabbing each item requires a specific hand pose. Shared family Carry/ShoulderAim clips stay; they do not replace per-item finger curl. Placement (RightGripRelative / LeftGripRelative) moves the mesh; IK (SupportHandTarget) moves the support wrist; Pose Assets curl fingers. All three are required for visual contact. This extends P09; it does not reopen TBD-INVENTORY-GRIP-002.
Lambeer mapping from the owner-supplied per-weapon hand-pose + left-hand IK guide: keep existing item-definition data and AnimBP Two Bone IK. Do not add per-item AnimBP subclasses, per-item locomotion sets, a second WeaponAnimationData class, or item-mesh Grip_L sockets as a Static Mesh requirement. Rigid items may remain Static Meshes (ROAD-P09-01). The guide’s left-hand IK role is already SupportHandTarget.
| Topic | Approved rule |
|---|---|
| Data location | Optional RightHandPose / LeftHandPose (UPoseAsset) on ULambeerItemDefinition, next to grip transforms. Family clips stay on AnimationProfile / AnimationOverrides. |
| What the Pose Asset writes | Hand and finger bones only. Do not author shoulder, arm or spine in the item pose unless a later contract explicitly extends it. |
| Right vs left | Right-held item uses RightHandPose. An independent left-held item uses that item’s LeftHandPose; do not mirror the right pose. Support IK on a right-held item uses that same item’s LeftHandPose. Occupied left hands keep the left item’s pose and never receive support IK. |
| Missing pose | Null Pose Assets keep family-pose fingers and do not refuse inventory hold. Visual acceptance still requires authored poses on the selected slice. Wrong-skeleton assets are ignored (alpha 0). |
| AnimGraph order | Family Layered Blend → DefaultSlot → Control Rig → right-hand pose on hand_r → Two Bone IK on hand_l → left-finger pose on hand_l → Output. Recoil, when implemented, stays before the support solve. Native properties are RightHeldHandPose / RightHeldHandPoseName / RightHeldHandPoseAlpha / LeftHeldHandPose / LeftHeldHandPoseName / LeftHeldHandPoseAlpha. Name is the Pose Asset’s first authored pose; extra poses (trigger finger) stay unused until that pass. |
| First-slice authoring | Crowbar, FireAxe, Sledgehammer, WoodenMallet, L1810. Proposed names PA_{Item}_RH / PA_{Item}_LH under /Game/Lambeer/Characters/Player/Animation/HandPoses/. No Pose Assets are created by this decision. Owner authors/retargets; agent may bind supplied assets through MCP. |
| Not this pass | Trigger-finger Safe/Trigger blend; item-switch blend times; Pose Asset body overrides. If Man/Woman need different finger poses, extend this contract first. Reload still uses existing SupportHandIK release curves, not a new pose field. |
| Persistence | Pose Asset references are item-definition content. Transient pose/IK alpha is not saved; persisted held item identity remains the restore input. |
Current source evidence and limits
UHeldItemComponent attaches to hand_r / hand_l with SnapToTargetNotIncludingScale, then ApplyGripTransform writes only location and rotation from TryGetGripRelative. Authored scale is ignored. Missing sockets still attach under the same name after a warning. Unauthored left holds are refused in inventory/quick-slot planners; leftover left visuals use identity and do not mirror. Two-handed items occupy both hands from the right attach; support IK uses held-mesh world transform × authored SupportHandTarget. Headless Lambeer.HUD including Lambeer.HUD.Backend.GripContract passed 25/25 after the closed-Editor native build. This is not owner PIE.
MCP 2026-09-16 compile/save of /Game/Lambeer/Characters/Player/Animation/ABP_Player: pose chain was MainStates → Slot → ControlRig → LocalToComponent → Two Bone IK (hand_l, BCS_WorldSpace effector, bMaintainEffectorRelRot) → ComponentToLocal → Output Pose. SM_Posture / Inertialization / ControlRig were not rewritten. ULambeerAnimInstance publishes SupportHandIKLocation and SupportHandIKAlpha; missing SupportHandIK curve defaults to 1.
2026-09-17 hand-pose wiring: ULambeerItemDefinition stores optional RightHandPose / LeftHandPose. ULambeerAnimInstance publishes a compatible Pose Asset and its first pose name after support-IK eligibility is known. Unauthored, empty, or wrong-skeleton assets stay alpha 0. MCP compile/save of ABP_Player now inserts Layered Blend Per Bone on hand_r (depth 0, Mesh Space Rotation Blend) after Control Rig / before LocalToComponent + Two Bone IK, and on hand_l after ComponentToLocal. Each blend evaluates the published Pose Asset through Evaluate Pose, driven by a Modify Curve of the first pose name at weight 1. Closed-Editor LambeerEditor Win64 Development and headless Lambeer.HUD 26/26 passed (report: Saved/Automation/P09HandPoseNames). First-slice Data Assets have no Pose Assets bound, so alphas stay 0 and no visual curl is claimed.
MCP 2026-09-16 first-slice Data Asset readback: Crowbar, FireAxe, WoodenMallet and L1810 are OneHanded; Sledgehammer is TwoHanded. All five store identity RightGripRelative, bHasLeftGripRelative false, bHasSupportHandTarget false, empty GripBodyOverrides, and identity InspectPreviewRelative. Sledgehammer therefore warns and skips support IK until a target is authored. No numeric offsets were invented.
Acceptance criteria for implementing the approved workflow
- Inspected 2026-09-16 through Unreal MCP: Man/Woman body sockets
hand_r/hand_lexist as identity aliases of those bones; L1810 has no item sockets; Tools Static Mesh pivots/bounds are not a shared grip origin. Record per-item offsets only after Editor calibration and owner PIE. - Compare the two attachment representations on the same bone/pose with matching transform and scale rules, then compare across actual body presets. Separate grip-position error, weapon-size changes and support-hand reach.
- Owner-only PIE in Dedicated Server + two clients: verify local/remote appearance for eligible left/right and two-handed items, idle, aim, movement, inspection, attack, draw, stow and drop. Check hand contact, wrist/finger pose, arm overextension, item dimensions and intentional hand release. Finger contact requires the item Pose Assets, not only grip transforms.
- Animation retargeting/export, Pose Asset authoring and PIE remain owner-only (
ROAD-P09-04). Runtime/AnimBP integration for grip/IK and per-item hand-pose graph wiring is implemented. That is not visual acceptance.
Revision, 2026-09-17 (TBD-INVENTORY-GRIP-003 ABP): owner confirmed per-item finger Pose Assets. Native fields, first-pose-name publish and ABP_Player hand Layered Blends landed the same day. No Pose Assets were authored. Owner PIE is not claimed.
Revision, 2026-09-16 (ROAD-P09-03): implemented the TBD-INVENTORY-GRIP-002 runtime contract: item-definition grip fields, KeepWorld attach, unauthored-left refusal, bone fallback, distinct inspect pivots, and ABP_Player Two Bone IK on hand_l. Headless Lambeer.HUD 25/25. First-slice offsets remain identity. Owner PIE and retargeted clips stay ROAD-P09-04.
Revision, 2026-09-16: owner selected the P09 integration options for TBD-INVENTORY-GRIP-002: keep hand_r/hand_l, store transforms on the item definition with optional PresetId overrides, KeepWorld scale, no left-hand mirroring, AnimBP Two Bone IK for two-handed support, and bone fallback when a character socket is missing. Numeric offsets and owner PIE remain pending. Stable decision IDs are preserved and referenced in DEC-BACKLOG.
Revision, 2026-09-12: owner clarified character-side per-weapon advice; reviewed scale/proportion rationale against official Epic documentation and installed UE 5.8 source. Replaced the earlier interpretation with confirmed advice provenance, bounded findings and a proposed architecture. The owner subsequently approved the architecture and its firearm/melee/held-inspection scope; TBD-INVENTORY-GRIP-001 is resolved. Asset authoring, runtime integration and owner PIE remain pending after the 2026-09-16 integration contract.
Player inventory UI — [CONFIRMED]
Widget: WBP_Inventory (/Game/Lambeer/UI/Inventory/). Open/close does not pause the world (multiplayer).
Open: Enhanced Input action IA_Inventory (/Game/Lambeer/Core/Input/Actions/IA_Inventory). Default mapping Tab — [RECOMMENDATION] until a settings screen exists.
Close: IA_Inventory again, or Escape. CommonUI Menu mode blocks the PlayerController IA_Inventory bind while the screen is open, so the widget consumes Tab with a Slate input preprocessor (not RegisterUIActionBinding; that path asserted LegacyActionData on 2026-09-12). Escape remains CommonUI Back. [OWNER-REPORTED PASS 2026-09-12] Tab opens and closes without crash.
| Region | Contents |
|---|---|
| Left | [OWNER APPROVED 2026-09-12] Character preview uses 36% of the main content width (scene-capture of the local pawn / appearance — [RECOMMENDATION]; v1 may show a placeholder image until the capture actor is authored). Left Hand, Right Hand and Drop sit below the preview. Back Weapon slots are not duplicated in this region. |
| Right | [OWNER APPROVED 2026-09-12; OWNER-REPORTED PASS 2026-09-14] Inventory uses 64% of the main content width. Worn clothing equipment slots (Head, Eyewear, Torso, Legs, Feet, Hands, BodyArmor, Vest, Backpack) remain fixed and fully visible above one scrolling panel per worn storage container (body pockets, pants, jacket, vest, backpack, …). Empty equipment = fewer/smaller storage panels, but all nine Worn targets remain visible. Implementation is UI-CORE-003 in Gate G4.2: designer Box_WornSlots is the Worn row above Scroll_Containers. The Night Ops presentation, responsive Worn flow and final visual correction passed owner PIE on 2026-09-14. |
| Bottom | [OWNER APPROVED 2026-09-12] One fixed Q1–Q0 row spans the safe-zone width below both main regions, followed by contextual action hints. Q1–Q2 display Back Weapon 1–2; Q3–Q0 display use-quick assignments. There is no separate Back Weapon panel. |
Back weapon slots 1–2: only firearms and melee that allow back holster. Assigning them equips the item to that slot (removed from a container). They are not a second copy of the item. Holstered world/held meshes appear on the character back through shared back_weapon_1 / back_weapon_2 sockets.
Quick slots: the combined row has 10 display slots Q1–Q0. Q1–Q2 exclusively mirror/equip Back Weapon 1–2. Q3–Q0 are eight player-assigned references to items already in inventory (consumables, medical, tools, building hammer, etc.). Using a quick slot consumes/uses that inventory stack; it does not create a separate stash. Combat draw of back weapons 1–2 remains [TBD] in 03-Combat-System.md.
v1 interaction: press and hold a slot, then drag onto the destination slot. Drop a held item onto a pocket/container cell to stow it in that container. Drag-and-drop is [CONFIRMED].
[CONFIRMED 2026-09-11 — G4 UI-CORE-002; SEARCH REMOVED 2026-09-14; EQUIP/TRANSFER SHORTCUTS 2026-09-15] Dragging the same mergeable item onto another stack combines them up to MaxStack; leftover stays on the source. Split requires an empty cell in the same container and does not merge into an existing same-item stack. Context menu: Split 1, Split half, Split amount (typed 1…quantity−1). Drop from the menu drops the whole stack (same world pickup as the Drop slot). Sort by display name, weight, or item type is per container. Take All from another inventory fills every player storage container that can fit. Transfer All is issued from one player container, not the whole character. Use runs from the inventory slot in place; no authored consume/heal/eat effect exists yet, so the server rejects without consuming. Drag from any inventory or loot cell onto a Worn or Back Weapon slot equips that item. If the target slot is occupied, the previous item is packed (worn storage contents stay nested) and moved into player storage when there is space; otherwise it is dropped as a world pickup. Equip from the context menu, and Ctrl+RMB, auto-select that same slot (clothing always uses Def->EquipmentSlot; holsterable Weapon/Tool uses the first empty back slot, then displaces BackWeapon1). Ctrl+LMB transfers one stack between the character and the open container: loot/container → player storage, or player storage → linked container. Depositing into a death bag stays blocked. Pickup/store from the world still does not replace worn clothing. Server stack commands include ExpectedItemId and reject when that index is empty or a different item. The owner removed Inventory Search as inappropriate for this game; there is no Search field or client-side item filtering contract. Side-by-side loot presentation remains UI-CORE-003 in Gate G4.2. Inventory action hints show Drag, RMB menu, Ctrl+RMB Equip, Ctrl+LMB Transfer, and Tab close.
Character-creation UI, if open, takes priority (inventory toggle is ignored).
Item definition (data-driven)
Every item is a UDataAsset (or DataTable row) — never a bespoke class per item. Current ItemId list: ITEM-DB. Base fields:
| Field | Notes |
|---|---|
| ID / display name / icon | |
| Item type | weapon, improvised weapon/world prop, ammo, consumable, resource, building, attachment, medical, key item, clothing |
| Weight | drives encumbrance |
| Max stack | resources stack; weapons and loaded magazines don't |
| Durability | [CONFIRMED] for firearms and tools; armor still [TBD]. Tracked on the stack instance (FInventoryStack.Durability). Items with MaxDurability > 0 never stack. Durability 0 keeps the item in inventory/hands; what “cannot use” means is [TBD] this pass. No dirt meter — 09-Weapon-Customization.md. Visual BloodAmount on instances: 10-Blood-Visual.md. Visual WetAmount on worn/held instances: 11-Wetness-and-Rain.md |
| Use action | what happens on use (eat, drink, equip, deploy, craft-ingredient) |
| Rarity / tier | metadata for loot tables and visuals; does not define its own drop chance |
| Mesh / equip socket | World drop + equipped representation. Held placement follows the grip contract: RightGripRelative, optional LeftGripRelative, optional SupportHandTarget, optional GripBodyOverrides, plus isolated InspectPreviewRelative. Finger contact uses optional RightHandPose / LeftHandPose (TBD-INVENTORY-GRIP-003). Back holster placement uses shared character sockets plus per-slot BackHolster1Relative / BackHolster2Relative (Q1/Q2 back visuals). First-slice Data Assets still store identity grips/holsters and unbound poses until calibrated. |
| Equipment slot / storage | clothing: which slot it occupies; ProvidedStorageSlots / ProvidedWeightCapacity for SCUM-style containers. Weapons: bCanHolsterOnBack for back slots 1–2, plus optional BackHolster1Relative (Q1) and BackHolster2Relative (Q2) for that item’s location/rotation on the matching socket |
| Combat handling | data-driven handedness (one-handed or two-handed) and allowed actions. One-handed weapons may occupy either hand only when that hand has an authored grip transform; eligible world props expose swing and throw actions. Exact combat field names are implementation-owned by FEAT-COMBAT. Melee is bMeleeWeapon, not a tool role. |
| Tool roles | [CONFIRMED 2026-09-13] GrantedToolRoles (FGameplayTagContainer) on the shared definition. See tool-role contract. Not in source yet. |
| Icon | inventory / quick-slot UMG |
Subtypes extend the base with type-specific data (e.g., weapons reference their combat stats — see 03-Combat-System.md).
TBD-INVENTORY-TOOLS-001 — tool roles and required-role actions
[RESOLVED 2026-09-13] Owner approved a capability-tag contract: items grant tool roles; actions require an AND of those roles. Multiple items may grant the same role. ELambeerItemType stays inventory/equipment taxonomy and is not a role. Folder names are not roles. Melee stays bMeleeWeapon / FEAT-COMBAT. Learn-by-doing skills in FEAT-CRAFTING-PROGRESSION are not tool roles. This records design; it does not authorize runtime implementation, PIE, or Data Asset authoring.
Architecture
- Author
GrantedToolRolesas anFGameplayTagContaineronULambeerItemDefinition. Planning field name only; the property is not inSource/Lambeeryet. - Native starter tags:
Tool.Role.ChopWood,Tool.Role.Hammer,Tool.Role.Pry,Tool.Role.Sledge,Tool.Role.Cut,Tool.Role.Screwdriver,Tool.Role.Pliers,Tool.Role.Jack. - Each world/craft/build action that needs tools stores
RequiredToolRoles(AND of every listed tag). Empty set means no tool gate. - Do not add per-item C++ subclasses, per-role bool explosion, or C++ enums that must change for every new axe.
- One item may grant several roles. Several items may grant one role (any matching stack satisfies that one required role).
Presence — held versus inventory
[CONFIRMED] Hybrid check, server-authoritative, acting player only. Squadmates cannot pool tools. World containers, vehicle trunks, crafting-station storage, and ground piles do not count.
| Action class | Where the matching item must be |
|---|---|
| Swing / world-use (chop, build place/upgrade/repair/demolish) | Held: at least one currently held stack (left or right hand) must grant every required role for that action. |
| Kit (vehicle repair) | Inventory: the acting player’s possessed inventories (hands, body pockets, worn storage including backpack) must cover every required role. The items need not all be held. |
Whether durability 0 still satisfies a role follows the existing durability “cannot use” TBD on this page. Do not treat 0-durability as an approved exception.
Starter roles
| Tag | Meaning | Starter grant |
|---|---|---|
Tool.Role.ChopWood | Axe / chop wood | Registered Item.Weapon.FireAxe |
Tool.Role.Hammer | Building hammer | Registered Item.Weapon.WoodenMallet |
Tool.Role.Pry | Pry / leverage | Existing Item.Weapon.Crowbar |
Tool.Role.Sledge | Heavy blunt impact | Existing Item.Weapon.Sledgehammer |
Tool.Role.Cut | Light cutting / shears | Existing Item.Scissor. No starter action requires it yet. |
Tool.Role.Screwdriver | Fasteners | Reserved. No ItemId. |
Tool.Role.Pliers | Grip / twist | Reserved. No ItemId. |
Tool.Role.Jack | Lift a vehicle | Reserved. No ItemId. |
Starter actions
| Action ID | Presence | Required roles | Owning spec / delivery |
|---|---|---|---|
Action.ChopTree | Held | Tool.Role.ChopWood | Later harvestable-node work (ROAD-TOOLS-11). Woodcutting skill remains Phase 2 speed/stamina, not a role. |
Action.BuildPlace | Held | Tool.Role.Hammer | FEAT-BUILDING / P16 |
Action.BuildUpgrade | Held | Tool.Role.Hammer | Same |
Action.BuildRepair | Held | Tool.Role.Hammer | Same |
Action.BuildDemolish | Held | Tool.Role.Hammer | Same. Authorize does not require Hammer. |
Action.VehicleRepair | Inventory | Tool.Role.Jack AND Tool.Role.Screwdriver AND Tool.Role.Pliers | FEAT-VEHICLES / P23. Repair kits/resources stay separate. Bumper/frame install tools remain TBD-VEHICLE-ADDON-001. |
Action.HarvestCrop | — | None | FEAT-AGRICULTURE first increment stays seed/water only. |
Firearm repair stays gun-repair-kit / family parts in FEAT-WEAPON-CUSTOMIZATION. Vehicle Lockpick, exact-ID keys and permanent Mechanics-skill Hotwire are confirmed in FEAT-LOCK-ACCESS; exact required equipment and timing remain TBD. Raid structure damage types and costs stay [TBD] in FEAT-PVP-RAIDING-TRADING; future raid actions may require Pry, Sledge, or ChopWood, but this decision does not invent those numbers.
ItemType and DefinitionIds
- Do not rename existing ItemIds.
- Crowbar and Sledgehammer stay
ELambeerItemType::Weapon. - Scissor stays
ELambeerItemType::Tool. - Registered 2026-09-15:
Item.Weapon.FireAxe/DA_Item_FireAxe, ItemTypeWeapon. Planned role ChopWood is not authored yet (GrantedToolRolesis not in source). - Registered 2026-09-15:
Item.Weapon.WoodenMallet/DA_Item_WoodenMallet, ItemTypeWeapon. Planned role Hammer is not authored yet.
Magazines are inventory items with per-instance loaded ammo (not a stack of empty mags). Load/unload ammo from inventory anywhere. Weapon attachments (including a mounted mag) persist on that weapon instance when dropped or looted. See 09-Weapon-Customization.md.
Containers
- World containers: storage boxes, lootable corpses, vehicle storage, environmental loot (crates, cabinets).
- All container contents are server-authoritative and, for player-placed storage, persisted.
World-prop combat pickup — [CONFIRMED]
- Picking up a combat-usable scene prop is a direct world interaction, separate from opening an environmental loot container.
- The interaction hands the eligible prop to the combat system so the player can swing or throw it. The combat specification is canonical for eligibility, handedness, damage, networking, and all unresolved prop-lifecycle rules.
- Props that are not explicitly authored as combat-usable remain ordinary environment objects and cannot be picked up through this feature.
Looting & dropping
- Death: all carried items + backpack drop into a lootable bag at the death location (full-loot, hardcore — [CONFIRMED]). Worn-container contents stay inside that dropped backpack/pants/vest via
NestedContents. Interact opens the bag like a storage box (loot panels in inventory, pick individual stacks or Take All); it does not vacuum-loot. Owner-reported pass 2026-09-12 for packed dump, loot-panel individual take, and immediate-respawn HUD refresh. Gate G4 had no authored despawn timer. [CONFIRMED 2026-09-14] P07 persists death bags across restart with a 24-hour remaining world-up despawn; leftover time continues after reopen. Canonical contract:TECH-NETWORK-ARCH. - Runtime world drops: player drop, throw-to-pickup and drop-trade use the same 24-hour remaining world-up despawn and persist across restart. Authored map-placed pickups are not this timer unless they become a runtime drop. Collecting a map-placed pickup records its actor id in world state so it does not reappear on the next load. Environmental container loot-table respawn remains later work.
- Drop-trade: the only player-to-player trade mechanism is dropping items for another player to pick up (no trade window). See ../04-Multiplayer/04-PvP-Raiding-and-Trading.md.
Loot economy
- Loot sources: zombies (especially bosses), environmental containers at POIs, other players' corpses/bases.
- Loot tables are data-driven and tied to region/difficulty and zombie/boss tier.
- Drop-rate ownership — [CONFIRMED]: drop chance belongs to the loot source/location/container/enemy/boss reward table, not to the item definition itself. Item definitions may carry rarity/tier metadata, but the source decides whether and how often that item appears.
- This rule applies globally across environmental containers, zombie loot, boss rewards, resource nodes, fishing/cooking/medical reward sources, and any future event or quest-style reward table.
- Scarcity is intentional — it powers the gun↔melee balance and the value of every excursion.
Networking & persistence
- The owning player's inventory replicates to that client only (privacy + bandwidth); the server validates every add/remove/use. Stack-index commands also require a matching
ExpectedItemId. - Player inventory, equipped state, nested contents, durability, magazine contents, chamber, attachments, item
BloodAmount/WetAmountand Q1–Q0 bindings are part of persisted player data. Runtime world drops and death bags are persisted world records. Placed-container contents are part of persisted world/base data. SeeTECH-NETWORK-ARCH.
Implementation guidance
UInventoryComponent+UEquipmentComponent+UHeldItemComponenton the character (C++).- Item stacks stored as lightweight structs (item ID + quantity + durability + container id + persisted per-instance
BloodAmount,WetAmount, attached parts and mag/chamber contents — [CONFIRMED 2026-09-14]). There is no dirt field. Unequipped backpack contents do not take rain wetness in v1. - World pickups:
AWorldItemPickup//Game/Lambeer/Items/Pickups/BP_WorldItemPickup. A stack withItemIdbutQuantity <= 0is empty and cannot be interacted with; placed pickups default Quantity to 1. For collect-once sandbox fixtures, place a unique pickup actor in the level (existing examples:Pickup_L1810_Test,BP_Pickup_Sledgehammer_Test, clothing pickups onL_Dev_Sandbox). Do not spawn a fresh copy from BeginPlay each PIE, and do not use the host cheatLambeer.SpawnPickupfor those fixtures — that cheat creates a 24-hour runtime drop. Cheat (host/listen server):Lambeer.SpawnPickup Item.Wood(alsoLambeerSpawnPickup). - Helpers live in
ULambeerInventoryLibrary(TryPickupStack,SpawnWorldItemPickup, merge/durability rules). Planned tool-role checks belong in a shared helper (planning nameLambeerToolRoleRules) used by interact/build/vehicle code; they are not in source yet. Canonical tags and presence: TBD-INVENTORY-TOOLS-001. - Inventory UI is UMG (Widget Blueprint child of C++
ULambeerInventoryWidget, now an activatable CommonUI screen in G4UI-CORE-001) bound to replicated C++ state. Toggle lives onALambeerPlayerControllerviaIA_Inventory. While the screen is open, CommonUI Menu mode still blocks that PlayerController bind, so the widget consumes Tab with a Slate input preprocessor instead ofRegisterUIActionBinding. [OWNER-REPORTED PASS 2026-09-12] Tab toggle and Worn clothing slots. Optional bind widgets:Slot_HeldRight,Slot_HeldLeft,Slot_DropandBox_WornSlots. DesignerBox_WornSlotsis the G4.2 Worn row aboveScroll_Containers; C++ no longer injects Worn into the container scroll. The 2026-09-13 missing-key, gray-button and overlapping-label failures were corrected. [OWNER-REPORTED G4.2 PASS 2026-09-14] Night Ops presentation, responsive Worn flow, focus/opacity correction, drag, split, sort, drop, hand/Q1/Q2, Player/Target transfer and the final field-free header passed. Search was intentionally removed by owner decision. G4.2 is closed. - G4
UI-CORE-002commands:TrySplitStack,TryMergeStacks,TryDropStackAt,TrySortContainer,TryTakeAllFrom,TryTransferAllFromContainer,TryUseStackAt,TryEquipStackAutomatically, type-routedTryReceivePickup. Pure helpers live inLambeerInventoryCommandRules.handMergeQuantityInto. Inventory Search and its client projection were removed 2026-09-14 by owner decision. Use currently logs and rejects until item definitions author a use effect. - Player
UInventoryComponentslot/weight limits are derived fromUEquipmentComponentworn storage. World loot crates keep their ownMaxSlots/MaxWeight. - Owner visual source update, 2026-09-14:
Inventory_UI_NEW.pngreplaces theme 5/Rescue Equipment. Inventory and transfer presentation now target near-black blue surfaces, thin steel-blue borders, cool white/muted text and cyan focus states. The 36/64 layout, responsive left-aligned Worn WrapBox, then-current 126×126 Worn/container/loot cells, flexible Q1/Q2 and hand targets, floating title/quantity overlays, centered aspect-safe icons, frameless Drop action, 10% viewport inset and 15 px content separation remained unchanged. The former orange/off-white theme assets and oldInventory_UI.pngreference were removed after referencer checks. - Owner slot-size compact, 2026-09-15: Worn equipment slots and player/loot container cells are now fixed 88×88 squares, about 30% smaller than the 126 px inspection target, so more cells fit. Q1/Q2, hands and Drop keep the independent 104 px action height. Item artwork stays centered in the square; title and quantity remain Overlay layers (top and bottom-right) and do not inset or offset the icon. Overlay label/quantity text is 7 pt, about 40% smaller than the 12 pt inspection size. Runtime tokens:
LambeerInventoryPresentation::SlotSizeandSlotLabelFontSize. Closed-EditorLambeerEditor Win64 Developmentrebuilt successfully; focused non-PIE Inventory tests passed 3/3 with zero warnings/errors. Owner PIE pending. - UI assets:
WBP_Inventory,WBP_InventorySlot,WBP_InventoryContainerandWBP_ContainerTransfercompile/save with resource-less Night Ops chrome;/Game/Lambeer/UI/Inventory/Textures/NightOps/T_UI_Inventory_NightOps_Focusis the only theme bitmap. Unreal MCP readback found no Rescue texture paths and 46 RoundedBox brush occurrences. Native source uses the same tokens. After Search removal, Development Game and Editor builds passed, focused non-PIE Inventory automation passed 3/3 with zero warnings/errors, andWBP_Inventorycompiled/saved with 43 widgets and no Search widget. Existing physical Q1/Q2 behavior and all remaining drag/command routes are unchanged. See current integration evidence and physical back-slot history. Toggle remainsIA_Inventory(default Tab) plus Escape. - Latest owner visual correction — owner-reported pass 2026-09-14: initial CommonUI focus moves from the Head equipment slot to the Close button so the Head slot no longer shows cyan corners before pointer hover; keyboard navigation still reveals slot focus. Night Ops background, surface and raised fills use 0.80 alpha while borders, text, icons and accents remain fully opaque. The closed-Editor native rebuild, four Widget Blueprint compiles/readback and three focused non-PIE Inventory tests passed before the owner PIE acceptance. The later Search removal and field-free header also passed owner PIE; retained layout and behavior remain accepted.
- G4 worn-slot sandbox pickups in saved
L_Dev_Sandbox(MCP 2026-09-12,is_dirtyfalse):Pickup_Clothes_Pants_Test(Item.Clothes.Pants),Pickup_Clothes_Glasses_Test(Item.Clothes.Glasses),Pickup_Clothes_BodyArmor_Test(Item.Clothes.BodyArmor),Pickup_Backpack_Improvised_Test(Item.Backpack.Improvised), on a cube row at Y 50 / Z 260 opposite the L1810 pickups. Pickup routing still auto-equips an empty matching clothing slot.
Responsive Worn/focus correction — owner-reported pass 2026-09-14: The prior WrapBox received only its desired width because its HorizontalBox slot used HAlign_Left. The saved asset and native layout use HAlign_Fill on that parent slot, while the WrapBox contents remain left-aligned. The intermediate initial-focus target was the first equipment slot; the final Night Ops correction routes initial focus to the valid Close button so Head has no cyan frame until interaction. WBP_Inventory compiled/saved, parent alignment readback passed, and LambeerEditor Win64 Development rebuilt successfully. Focused non-PIE Inventory tests passed and the owner reported the final PIE presentation passed.
HUD & UI contract — [CONFIRMED]
FEAT-HUD-UI defines drag/drop, click selection, context menu, keyboard/controller navigation, side-by-side container looting, Split, Transfer All, Take All, Sort, Inspect, Use, Equip, and Drop Quantity. Inventory Search is explicitly excluded by the 2026-09-14 owner decision. Q1/Q2 are physical Back Weapon storage slots: drawing or dragging an item into a hand leaves the source slot empty in Inventory and HUD, and that slot is immediately reusable. They never retain an In hand item reference; possessed items may bind to Quick Slots 3–0. Pressing a slot puts its item in hand and use occurs through the item's left/right action. TBD-HUD-UI-001 is resolved. Inventory presents Q1–Q0 together without separate Back Weapon UI slots. Q1 addresses the left hand and Q2 the right: draw into a free hand, store into the selected empty slot (falling back to the other held hand if needed), or exchange that hand with an occupied slot. Hand/back and Q1/Q2 drags move or exchange actual stacks. A historical return hint never occupies a back slot. One-handed items can coexist. Pocket drops move actual inventory/held/equipped items to the selected container within capacity. See the confirmed back-weapon return flow.
[OWNER-REPORTED PASS 2026-09-08] Latest pocket drag/drop, unified Q1–Q0 and hand/slot storage/exchange correction passed according to the owner. Scoped test record.
Sledgehammer G3 test item — 2026-09-09
Owner requested a new melee item using the Sledgehammer folder and delegated selection of prototype tuning. Runtime source: /Game/Lambeer/Core/Data/Items/DA_Item_Sledgehammer, registry ID Item.Weapon.Sledgehammer. World and held mesh: /Game/Lambeer/Items/Tools/Sledgehammer/Sledgehammer.
Authored values: two-handed, stack limit 1, weight 4.76 kg, max durability 100, melee enabled and back holstering enabled. The weight uses a full-size hammer reference, Fiskars IsoCore L 1020219 catalogue (4.76 kg); this does not identify the mesh as that manufacturer or measure its mass. Durability 100 is project tuning aligned with the existing Crowbar item, not a prediction of real tool lifespan. Throw follows the approved per-item defaults in the HUD throw contract.
MCP readback verified the data. Mesh bounds span approximately 96.9 cm on the long axis and contain one convex collision hull. /Game/Lambeer/Items/Pickups/BP_Pickup_Sledgehammer_Test supplies one item at full durability. MCP placed that pickup in L_Dev_Sandbox near PlayerStart; the placed instance uses the Sledgehammer mesh at scale 1. Owner reported throw/sledgehammer checks on that map passed on 2026-09-09. Final grip pose, two-hand animation and per-slot BackHolster1Relative / BackHolster2Relative remain unpolished content, not a PIE blocker for the G3 test item. Character Q1/Q2 sockets are authored; see back holster visuals.
L1810 G3 test firearm — 2026-09-09
Owner supplied the L1810 as the G3 inspection firearm: magazine capacity 18. Runtime source: /Game/Lambeer/Core/Data/Items/DA_Item_L1810, registry ID Item.Weapon.L1810.
Authored non-ammo fields were copied from the existing DA_Item_Pistol placeholder: one-handed, stack 1, weight 1.2 kg, max durability 100, back holstering enabled, throw 0.6 s / 900 cm/s. That weight is the pistol Data Asset value, not a measured L1810 mass. G3 closed with Engine-cube world/held meshes because the visual pipeline was StaticMesh-only. MCP readback 2026-09-11: WorldSkeletalMesh and HeldSkeletalMesh are /Game/Lambeer/Items/Weapons/Pistol/L1810/SKM_L1810; the Engine cube remains on WorldMesh/HeldMesh as the pickup collision proxy. The magazine static mesh is /Game/Lambeer/Items/Weapons/Pistol/L1810_Magazine/L1810_Magazine.
MCP placed Pickup_L1810_Test in the loaded L_Dev_Sandbox near the sledgehammer. Map save verified 2026-09-10: that pickup is in the saved map. On 2026-09-11 MCP also placed Pickup_L1810_Magazine_Test at (240, −150, 260) and Pickup_Ammo_9x19_Test at (280, −150, 260); map save is_dirty false. Development grants: UI_G3GiveL1810, UI_G3GiveL1810Magazine, UI_G3Give9x19. Owner reported chamber/magazine inspection working on 2026-09-10.
[CONFIRMED 2026-09-10 G3.2] New L1810 instances spawn with no magazine installed and an empty chamber (G3’s full-mag spawn is superseded for new stacks only; it does not reopen G3). Magazine item id Item.Magazine.L1810, ammo id Item.Ammo.9x19. Drag ammo onto a magazine to load. Drag a magazine onto a gun in inventory or hands to install (3 s). Right-click to unload ammo or remove the magazine (3 s). Chamber is unchanged on install/remove. Owner-delegated prototype masses: empty magazine 0.10 kg, 9x19 round 0.012 kg, ammo MaxStack 60 — not measured L1810 parts. MCP created and saved the magazine and ammo Data Assets on 2026-09-11. [OWNER-REPORTED PASS 2026-09-11] Owner reported skeletal world/held/back L1810, No mag / Mag 0 after inspect, ammo load, 3 s mag install, move-cancel, unload and remove. Grip pose remains unpolished content. Character Q1/Q2 holster sockets were authored 2026-09-18; per-slot BackHolster1Relative / BackHolster2Relative stay identity until calibrated. See G3.2.
Double Barrel Shotgun — 2026-09-17
Owner requested a ULambeerItemDefinition Data Asset for the existing DoubleBarrelShotgun content. Runtime source: /Game/Lambeer/Core/Data/Items/DA_Item_DoubleBarrelShotgun, registry ID Item.Weapon.DoubleBarrelShotgun. No C++ stub was added. Canonical ID index: ITEM-DB.
MCP created, authored and saved the asset on 2026-09-17 (is_dirty false). Readback: TwoHanded, ItemType Weapon, bMeleeWeapon false, back holster enabled, MagazineCapacity 2 so IsFirearm() is true, CompatibleItemIds empty, AnimationProfile /Game/Lambeer/Characters/Player/Animation/Profiles/DA_AnimProfile_Firearm2H. Weight 1.2 kg, stack 1, durability 100 and throw 0.6 s / 900 cm/s are copied from DA_Item_L1810; that weight is not a measured shotgun mass. WorldSkeletalMesh/HeldSkeletalMesh = /Game/Lambeer/Items/Weapons/DoubleBarrelShotgun/Shotgun; WorldMesh/HeldMesh remain the Engine cube as the pickup collision proxy. Icon = /Game/Lambeer/Items/Weapons/DoubleBarrelShotgun/ICON_DoubleBarrel. Right grip, left grip and support-hand target are unauthored identity defaults; bHasSupportHandTarget is false because its support target is unauthored.
Capacity 2 records the two barrels so the item classifies as a firearm. It is not an owner-approved damage/ammo balance pass. There is no shotgun ammo or magazine Data Asset; magazine-as-item load/install from the L1810 flow is not claimed. Break-action internal loading remains TBD. No sandbox pickup, DS-client UI_G3Give* helper, or measured grip was added in this registration. Host-pawn PIE can grant it with Lambeer.GiveItem Item.Weapon.DoubleBarrelShotgun or Lambeer.SpawnPickup Item.Weapon.DoubleBarrelShotgun.
Lock and vehicle-key items — [CONFIRMED 2026-09-17]
FEAT-LOCK-ACCESS is canonical. A found Lock item can be installed only on doors, windows, World Containers and Player-built Storage; removal returns the same item. Containers have no built-in lock, and no other container category—including Vehicle Storage—accepts this installed Lock. Vehicle keys are per-instance items bound to one stable Vehicle ID and may live in character/container/world inventory or be inserted in that exact vehicle. Exact ItemIds, definitions, loot weights and asset paths remain TBD.
Q1/Q2 holster sockets — 2026-09-18: shared Mesh Sockets back_weapon_1 / back_weapon_2 on spine_04 for Man and Woman bodies, bound on BP_PlayerCharacter. Previous mesh-root placeholder put Q items on the front/thighs. Per-item location/rotation is now BackHolster1Relative (Q1) and BackHolster2Relative (Q2) on the item definition; existing assets remain identity. Do not silently mirror Q1 into Q2. Owner PIE is not claimed. See back holster visuals.
P09 update — 2026-09-19: shared ADS/ShoulderAim pose selection, no Fire animation action, bHasSupportHandTarget as the support opt-in, arm pitch in both views, current-pose elbow poles, and Two Bone IK that keeps incoming limb twist so support/ADS wrists do not roll with look pitch. Native build and focused tests from 2026-09-18 remain; 2026-09-19 compiled and saved ABP_Player. Owner visual/network PIE acceptance pending. Canonical contract and validation.