Skip to main content

Types, flags, results, and limits

The SDK is a C-compatible, x64 function-table ABI presented through a C++ header. V1 currently contains 90 function pointers (720 bytes). Public structures are standard-layout, trivially copyable value types; function pointers use __cdecl. Initialize output structures with {} so their default size, version, sentinels, and reserved bytes are correct.

RockProviderHandInteractionStateV1 state{}; // correct
// Do not memset a previously versioned object and then forget size/version.

RockProviderResultV1

Every result-returning call uses the same stable values.

ResultMeaning / consumer response
OkThe operation completed.
NotReadyROCK or the requested subsystem is temporarily unavailable. Wait for lifecycle readiness.
InvalidArgumentToken, pointer, enum, flags, data, or combination is invalid. Fix the request; do not retry unchanged.
InvalidSizeA fixed-size structure did not match the provider's current size requirement.
UnsupportedVersionA structure version is zero or newer than the provider supports.
CapacityFullA fixed provider pool cannot admit the operation. Reduce rows or release state.
OwnerNotRegisteredThe owner token is absent/stale. Register again only after reacquiring the API.
OwnerConflictAnother owner holds an exclusive resource, or the caller tried to clear another owner.
PermissionDeniedThe required capability was not granted. Disable that feature.
WorldNotReadyThe game world required by the operation is unavailable.
TargetInvalidTarget identity is malformed or unsuitable.
TargetUnavailableThe target/resource was valid in principle but does not currently exist or cannot be used.
HandUnavailableThe requested physical hand is invalid or unavailable.
HandBusyAnother current interaction prevents the request.
ObjectAlreadyOwnedThe object already has incompatible ownership.
RequestQueuedThe provider accepted an asynchronous command for later processing.
RequestNotFoundThe command ID is unknown, expired, or not owned by the caller.
WrongThreadA live/callback-only operation was called outside ROCK's game-thread boundary.
AlreadyCommittedA command crossed its cancellation boundary and can no longer be cancelled.

Do not collapse these into a Boolean. NotReady can be retried after state changes; PermissionDenied requires a feature downgrade; InvalidArgument requires a code fix; OwnerConflict requires respecting another owner.

Identity and sentinel rules

ValueMeaning
RockProviderHand::Right / LeftPhysical controller identity, independent of primary/offhand role.
RockProviderHand::NoneNo hand; accepted only by APIs that explicitly document it.
body ID 0x7FFF'FFFFInvalid/unavailable body identity.
form ID 0No resolved Bethesda form.
owner/callback/command/scope token 0Invalid token.
generation 0 in a request guardWildcard: do not constrain that generation.
pointer-sized field 0No current identity witness.

Pointer-sized fields such as node, sourceRoot, interactionRoot, and weaponNode are non-owning identity witnesses. Never dereference them through the SDK and never retain them across a frame or generation change.

Transforms and coordinates

RockProviderTransform contains a row-major 3×3 rotation, three-value translation, and uniform scale. The structure alone does not define its space; the field name or associated enum does:

  • game/world fields use Fallout game units;
  • weaponRootLocal is local to the equipped weapon root;
  • sourceParentLocal is local to the source node's parent;
  • hand-in-weapon values are weapon-local;
  • external-contact vectors explicitly named Havok use Havok space.

RockProviderPoint3 and RockProviderBounds3 are game-space value helpers. Optional vectors and transforms always have an accompanying validity field or flag. Zero is a legitimate coordinate and is not a validity signal.

Flag handling

Most public flags fields store an integer bitmask even when the named bits are an enum class. Use the supplied helpers where available:

if (hasLifecycleFlag(frame.lifecycleFlags,
RockProviderLifecycleFlag::PhysicsWriteAllowed)) {
// Safe to consider a write operation.
}

if (hasConsumerCapabilityV1(handle.grantedCapabilities,
RockProviderConsumerCapabilityV1::ProviderEvents)) {
// The owner may use the provider-event stream.
}

Header helpers include hasLifecycleFlag, hasConsumerCapabilityV1, hasFeatureBitV1, hasFeatureBit2V1, hasHandInputSuppressionFlagV1, hasWeaponPartTargetFlagV1, hasWeaponKeywordFlagV1, hasNativeAnimationAuthorityFlagV1, and hasEquippedWeaponHandlingFlagV1.

The two advertised feature-mask families are RockProviderFeatureBitV1 and RockProviderFeatureBit2V1. They describe provider implementation support; they do not replace owner capability grants.

Unknown bits must not be sent to a setter. On readback, ignore unknown bits so future compatible providers can enrich a mask without breaking your consumer.

Public limits

Read limits from getProviderLimitsV1/getProviderLimitsExtV1 at runtime. The header constants provide compile-time storage ceilings for this SDK snapshot.

ResourceCurrent V1 maximum
Consumers64
Owner frame callbacks16
Animation phase callbacks16
Compact frame weapon body IDs8
Complete weapon evidence details100
Points per evidence detail252
External bodies2,048
External child scopes256
External contact records512
Body contacts128
Queued interaction commands32
Retained completed commands64
Input-suppression owners32
Weapon-part targets / drives128 / 64
Weapon emitters32
Provider events256
Weapon composition entries64
Semantic hand contacts20
Player collider descriptors96
Weapon-part poses / drive results128 / 64
Held body IDs per hand state8
Finger-local transforms per hand15 (0x7FFF full mask)
Touch targets / scopes256 / 64
World raycasts per owner per frame8
World raycast distance8,192 game units

Lease maxima are 120 frames for input suppression, part drives, hand visuals, native-runtime publication, equipped handling, debug overlay, and offhand reservation, touch targets, and collider focus. Native animation authority alone permits up to 1,200 frames.

Enum catalogue

The behavior-focused pages explain these values in context. This catalogue makes every public family discoverable.

Runtime, hands, and body

TypeValues
RockProviderHandNone, Right, Left
RockProviderHandStateFlagTouching, Holding, PhysicsDisabled
RockProviderHandFrameFlagV1Valid, Left, Primary, Offhand, HasSceneNode, RootFlattenedAuthority, PresentedVisual
RockProviderLifecycleFlagWorldAvailable, SkeletonReady, ProviderReady, MenuBlocking, ConfigBlocking, LoadingOrWorldTransition, GeneratedBodiesValid, PhysicsWriteAllowed, VisualWriteAllowed
RockProviderLifecycleReasonNone, GameLoaded, SkeletonReady, SkeletonDestroying, PowerArmorChanged, WorldAvailable, WorldChanged, WorldUnavailable, ProviderReady, ProviderLost, MenuBlocked, ConfigBlocked, GeneratedBodiesRebuilt, GeneratedBodiesInvalidated, TransitionSettled, Shutdown
RockProviderBodyZoneSideCenter, Left, Right
RockProviderBodyZoneKindpelvis, spine, chest, neck/head, left/right shoulder, upper arm, forearm, hand, hip, thigh, calf, and foot zones
RockProviderBodyContactTargetKindUnknown, Hand, Weapon, HeldObject, Body, External, WorldSurface, DynamicProp, Actor, QueryOnly
RockProviderFrameEnrichmentFlagV1delta, HMD transform/forward, coherent hand roles, state sequence, collision generation, and equipped-transition sequence validity
RockProviderFrameStateChangeFlagV1lifecycle, right hand, left hand, weapon, equipped transition, collision, and hand-role changes

Interaction and input

TypeValues
RockProviderInteractionCommandKindV1ForceGrab, ForceRelease, ThrownDrop
RockProviderInteractionCommandStateV1Queued, Succeeded, Rejected, Cancelled
RockProviderCommandStageV1Accepted, Queued, Committed, Applied, Terminal
RockProviderInteractionFailureV1provider/write/owner/request/generation/target/hand/ownership mismatch reasons
RockProviderForceGrabFlagV1UsePreferredGrabPointGame
RockProviderForceReleaseFlagV1ImmediateCollisionRestore, RequireMatchingTarget, UseVelocityHavok
RockProviderThrownDropFlagV1ImmediateCollisionRestore, RequireMatchingTarget, UseVelocityHavok
RockProviderHandInputSuppressionFlagV1normal grab press/release, held-weapon trigger equip, gameplay candidates, OpenVR game input, native VATS release, native V.A.N.S. hold, and SuppressConfigModeChord combination
RockProviderInputAvailabilityReasonV1Available, HookNotSampled, BlockingMenu, ReleaseToRearm, InvalidButton
RockProviderSuppressionInvalidationReasonV1None, Expired, GenerationChanged, OwnerUnregistered, ProviderLost, ExplicitClear, CallbackFault
RockProviderOffhandReservationNormal, ReloadReserved, ReloadPoseOverride

Weapon parts and classification

TypeValues
RockProviderWeaponPartGrabModeV1None, FullTwoHandAuthority, AttachOnly
RockProviderWeaponPartTargetFlagV1body/root/name/part/reload/support/socket/action matchers and NonExclusive
RockProviderWeaponPartDriveSpaceV1WeaponRootLocal, SourceParentLocal
RockProviderWeaponPartGripKindV1None, FiringGrip, SupportFullAuthority, SupportVisualOnly, PartCarry, AttachOnly
RockProviderWeaponPartGripLocalSpaceV1WeaponRootLocal, PartSourceLocal
RockProviderWeaponPartDriveApplicationV1Unknown, Applied, Unresolved, StaleGeneration, MissingParent, LostPriority, InvalidTransform, CapacityRejected, Restored
RockProviderWeaponPartPoseFlagV1Valid, SourceParentLocalValid, WeaponRootLocalValid
RockProviderWeaponPartClassificationSourceV1NameToken, SlotAnchor, RigAnchor, AttachmentEvidence
RockProviderWeaponPartKindV1receiver, barrel, handguard, foregrip, pump, stock, grip, magazine, magwell, bolt, slide, charging handle, break action, cylinder, chamber, shell, round, laser cell, lever, sight, accessory, cosmetic ammo, other, laser sight, flashlight, laser/flashlight combo, scope, muzzle device, bipod
RockProviderWeaponActionRoleV1None, Bolt, Slide, ChargingHandle, Pump, BreakAction, Cylinder, Lever, Latch
RockProviderWeaponSizeClassV1Melee, Pistol, Rifle, Heavy
RockProviderWeaponClassificationSourceV1None, Keyword, WeightFallback, Default
RockProviderWeaponClassificationProvenanceFlagV1KeywordEvidence, MeshBoundsFallback, GenerationBound
RockProviderWeaponKeywordFlagV1weapon-family/material/behavior keyword bits from Pistol through Automatic
RockProviderWeaponEmitterKindV1Unknown, Flashlight, Laser, Reticle
RockProviderWeaponEmitterSourceV1Unknown, EffectGeometry, AddOnNode
RockProviderWeaponEmitterFlagV1transform, direction, effect-state, addon-node, OMOD, and attach-point validity
RockProviderWeaponCompositionFlagV1Active, Disabled, AttachPointResolved, SemanticEvidenceMatched
RockProviderScopeActivationSourceV1None, NativeGeometry, RockGeometry, ManualInput
RockProviderScopeSightFlagV1availability/activity/menu, anchor/bounds/native-overlay validity, and manual direct-transition requirement

Animation, presentation, and equipped weapon

TypeValues
RockProviderNativeAnimationAuthorityFlagV1Arms, Hands, Weapon, combined ReloadPose
RockProviderNativeAnimationAuthorityStatusFlagV1hook/runtime/capture/test/failure/thread/fault/provider status
RockProviderAnimationPhaseV1BeforeRock, AfterRock, Complete, NativeGraphOutput
RockProviderAnimationPhaseContextFlagV1ROCK/provider/skeleton readiness, menu/config blocking, visual-write permission
RockProviderEquippedWeaponGripStateFlagV1validity, two-hand grip, firing-hand side, transform ownership, world/hand-transform validity
RockProviderEquippedWeaponHandlingFlagV1firing ownership, detach, handoff, grip-zone equip/haptics, proximity support, shoulder stash, Pip-Boy-hand equip, visual-bridge tuning
RockProviderEquippedWeaponHandlingRuntimeFlagV1authority/fixed hand/current hand/infrastructure/manual/part-carry/grip/weapon state
RockProviderHandVisualAuthorityFlagV1WorldTransform, FingerLocalTransforms
RockProviderAuthoredGripSourceV1Unknown, LiveEquippedGraph, NativeIdlePreharvest, RuntimeCanonical
RockProviderAuthoredGripPoseFlagV1pose and per-hand/per-finger validity
RockProviderPresentedHandPoseFlagV1pose/world/finger validity and root-flattened readback
RockProviderEquippedWeaponTransitionSourceV1observed/trigger/grip-zone equip, menu exit, workbench exit
RockProviderEquippedWeaponTransitionResultV1completion and terminal loss/timeout/handoff/recovery/provider/shutdown reasons
RockProviderEquippedWeaponStateFlagV1validity, identity/draw pending, bridge/native render, handoff, recovery, transition state

Contacts, events, and diagnostics

TypeValues
RockProviderExternalBodyRolereload mobile/socket/action/proxy and actor ragdoll bone
RockProviderExternalBodyContactPolicyhand reporting, all-source reporting, ROCK dynamic-push suppression
RockProviderExternalSourceKindUnknown, Hand, Weapon, HeldObject
RockProviderExternalContactQualityBodyPairOnly, AggregateImpulse, RawPoint
RockProviderExternalContactFlagV1velocity/point/normal validity, measured/estimated point, collision availability, transition suppression
RockProviderExternalContactStreamFlagV1gap and overwrite indicators
RockProviderSemanticHandContactFlagV1point/normal/form/relation/collision/transition validity
RockProviderSemanticContactStateV1Begin, Continued, End
RockProviderPlayerColliderKindV1Hand, Body
RockProviderPlayerColliderFlagV1validity, enabled, palm anchor, transform, power armor
RockProviderHandCollisionAvailabilityFlagV1body/twin/write/collision readiness and transition/menu/disabled suppression
RockProviderHandInteractionPhaseV1idle through touching/selecting/pulling/catching/holding/releasing/stash/consume candidate
RockProviderHandInteractionFlagV1hand role, object/weapon/grip type, suppression, collision, transition, touch grab, fixed/global surface latch, valid surface anchor, mesh authority/finger pose/fallback, and truncation state
RockProviderEventKindV1lifecycle, equipped transition, authority loss, command terminal, grab state
RockProviderEventStreamFlagV1gap and overwrite indicators
RockProviderAuthorityKindV1input, drives, native animation/runtime, equipped handling, reservation, visuals, overlay, targets
RockProviderDebugOverlayTextFlagV1WorldAnchored
RockProviderTouchGrabKindV1FixedAnchor, LimitedHinge, LimitedPrismatic
RockProviderSurfaceGripModeV1CollisionAnchor, MeshAnchor, CollisionFallback
RockProviderTouchGrabTargetFlagV1right/left/two-hand eligibility, latch-on-release, wildcard body matching, and static/keyframed/dynamic motion masks
RockProviderTouchGrabPhaseV1Inactive, Armed, Held, Latched, Yielded, Invalidated
RockProviderTouchGrabReleaseReasonV1grip release, owner yield, target removal, expiry, generation/world/target/hand invalidation
RockProviderTouchGrabStateFlagV1contact point/normal/coordinate validity, fixed-anchor state, original keyframed/dynamic motion, mesh authority, active mesh finger pose, and collision fallback
RockProviderWorldRaycastResultFlagV1Hit, NormalValid

Public structure catalogue

RockProviderStructureIdV1 assigns stable IDs to 66 public structures so a consumer can query sizes before constructing a type shared with a newer V1 provider.

IDsStructuresDetailed reference
1–5API descriptor, consumer registration/handle, base and extended limitsCore and discovery
6–7frame snapshot, hand frameFrames, hands, and events
8–11hand interaction, provider event/stream, equipped-weapon stateFrames, hands, and events
12–15external registration, legacy/scoped contact, contact streamContacts and external bodies
16–19part resolution query/result, part pose, drive resultWeapon-part interaction
20–22scope state and weapon composition state/entryWeapon data and optics
23–24authored grip pose, presented hand poseAnimation and visuals
25–27semantic contact, collider descriptor, collision availabilityContacts and external bodies
28–30suppression state and offhand reservation request/stateInput and offhand
31–34force-grab/release/drop requests and command resultInteraction commands
35–36input-suppression request and raw-button stateInput and offhand
37–40part target, transform, drive target, grip stateWeapon-part interaction
41–46contact query/result, classification, point, bounds, emitterWeapon data and weapon parts
47–50native authority request/state, phase context, grip stateAnimation and visuals
51–52equipped handling request/stateEquipped-weapon handling
53–54hand visual request and native runtime publicationAnimation and visuals
55–57debug line, text, and publicationShared debug overlay
58–59weapon evidence detail and body contactWeapon data and contacts
60complete API function tableEvery API function
61–62touch-grab target and stateTouch mechanisms and world tools
63equipped-weapon hand requestEquipped-weapon handling
64–65world raycast request/resultTouch mechanisms and world tools
66collider visualization requestShared debug overlay

ABI-safe structure use

For a setter, follow the API's exact-size and supported-version rules. For a getter, construct the output with {} and let its default member initializers advertise your compiled size/version. Use getPublicStructureSizeV1 when loading types dynamically or validating a generated binding.

Reserved fields must remain zero. Never serialize raw public structures as a permanent file format: tokens, pointer witnesses, generation values, table extent, and future reserved meaning are runtime contracts, not save data.