Maturity: Draft. What the game offers a mod for driving V directly: teleporting and walking her, turning the camera instantly or smoothly, reading and choosing interaction and dialogue choices, the other things a player does (crouch, weapons, consumables, menus), and how input reaches the game and could be synthesised from inside it. Consolidated on 29 September 2026 from the decompiled 2.31 script bundle (redscript-cli 0.5.31, final.redscripts SHA-256 2119046f…ee86), the game's input configuration and executable imports, the address library, the red-dump-json RTTI dump (a8e52990, pre-2.3), RED4ext.SDK (ad727771), Cyber Engine Tweaks (v1.37.1-9), Codeware (clone 1.20.4, installed 1.20.5), Appearance Menu Mod, Input Loader and Native Interactions Framework clones, and installed mods read in place (FreeFly 2.4.0, Immersive Third Person - Best Of Both Worlds 1.3.0, 0-Engine 0.13.0). Nothing on this page has runtime evidence yet except where marked. The command design built on it is the player-control design, whose phase 1 is built in XF Runtime Bridge 0.6 (offline only: player.state, player.teleport, player.look, player.action, player.interact.list, input.probe, and glides and looks as behaviours; bridge README); the session-7 card's group E is its first in-game test; experiments/ reproduces the import, address-library and RTTI facts. Grades follow the knowledge rules.
Game-script citations are paths inside the decompiled bundle; installed-mod citations are paths inside each mod's folder in the mod manager (mods/).
1. At a glance
| Capability | Route | Grade |
|---|---|---|
| Teleport with facing | GameInstance.GetTeleportationFacility(game).Teleport(player, pos, EulerAngles(0, 0, yaw)) | source |
| Turn V instantly | Teleport in place with a new yaw (her yaw is the first-person camera's) | source |
| Aim the camera at a point over time | TargetingSystem.LookAt(player, AimRequest); BreakLookAt | source |
| Walkable ground and paths | NavigationSystem.FindPointInSphereOnlyHumanNavmesh, IsNavmeshStreamedInLocation, CalculatePathOnlyHumanNavmesh | source |
| Walk with the game's own locomotion | Only through movement input; no script sets it | source |
| What V looks at; what the HUD offers | TargetingSystem.GetLookAtObject; the UIInteractions blackboard | source |
| Choose a dialogue line | Only through input (scroll, confirm); no script or native call is exposed | source |
| Crouch, weapons, consumables, menus | Status effect, equipment requests, item actions, UI events | source |
| Input from inside the game without focus | CDPR's functional-test system (FakeInput*), a virtual XInput pad, or the decoded input buffer | existence source; behaviour hypothesis |
2. Moving V
- Teleport.
TeleportationFacilityhasTeleport(object, position: Vector4, orientation: EulerAngles)andTeleportToNode(object, NodeRef), nothing else sourceorphans.script:31933-31938. Fast travel callsGetFPPCameraComponent().ResetPitch()and thenTeleportToNodesourcecore/. Appearance Menu Mod teleports V withsystems/ fastTravelSystem.script:321-341 EulerAngles.new(0, 0, yaw)and pins her by teleporting her onto her own position source AMMModules/,tools.lua:1782-1786 Modules/.util.lua:516-523 - Teleport checks nothing. Snap a destination with
FindPointInSphereOnlyHumanNavmesh(center, radius, NavGenAgentSize.Human, heightDetail)and requireIsNavmeshStreamedInLocation; the game's ownGetNearestNavmeshPointBelowOnlyHumanNavmeshwalks spheres downwards, andIsOnGroundcasts 0.2 m down against static geometry sourcecore/.systems/ navigationSystem.script:8, 18, 24-60 - Paths.
CalculatePathOnlyHumanNavmesh(start, end, agentSize, findPointTolerance)returns aNavigationPathwithpath: [Vector4]andCalculateLength()sourcenavigationSystem.script:4,orphans.script:29743-29748; an area-effect device uses it to test reachability sourcecyberpunk/.devices/ aoeSystem/ aoeArea.script:236 - Walking is input. The player state machine (PSM) reads the movement actions (
GetActionValue(n"MoveX"),n"MoveY",GetInputHeading(),IsMoveInputConsiderable()) to choose its states; the motion itself is native sourcecyberpunk/,player/ psm/ defaultTransition.script:587-588, 639 orphans.script:42516-42572.MoveX/MoveYmap to the left stick and the WASD buttons resourcer6/,config/ inputContexts.xml:895-896 inputUserMappings.xml. - The PSM's own nudge.
AdjustTransformWithDurations(position, slide duration, rotation, rotation duration, target and distance radius, gravity, curve, parabolic motion), set as the temporary parameteradjustTransformon the PSM'sStateContext, moves or turns V over time; melee lunges, takedown alignment and turning a knocked-down V use it sourceorphans.script:42776-42798,defaultTransition.script:319-345,locomotionTransitions.script:5112-5121. Only PSM callbacks receive aStateContext; Immersive Third Person turns V's body this way from its wrap ofStandEvents.OnTicksource ITPr6/.scripts/ immersive_ third_ person/ tpp_ camera_ bridge.reds:2030-2057 LocomotionParameters.SetUseCameraHeadingForMovement(through thelocomotionParameterstemporary parameter) is how that mod makes movement follow the camera sourceorphans.script:45147-45185; ITPtpp_.camera_ move360.reds - Noclip. FreeFly applies
GameplayRestriction.NoMovementandNoZooming(and optionallyNoCombat) to V, then teleports her every frame along the active camera's forward and right vectors, turning her by the teleport's yaw plus the mouse'sCameraMouseXsource FreeFlybin/,x64/ plugins/ cyber_ engine_ tweaks/ mods/ freefly/ modules/ utils/ logic.lua miscUtils.lua. - State to check first. The PSM blackboard (
PlayerPuppet.GetPlayerStateMachineBlackboard()) carriesLocomotion(gamePSMLocomotionStates: Default, Crouch, Sprint, Jump, Vault, Dodge, Workspot, Slide…),HighLevel(Default, SceneTier1-5, Swimming),SceneTier,Vehicle,Combat,Fall,Landing,Swimming,IsInWorkspot,Takedown,BodyCarryingand more sourcecore/(blackboard/ blackboardDefinitions.script PlayerStateMachineDef),orphans.script:6647-6693; 0-Engine reads all of them every frame for its state cache source 0-Enginemodules/. AlsoBlackboardCache2.lua VehicleComponent.IsMountedToVehicle(game, player)sourcecore/andcomponents/ scriptComponents/ vehicleComponent.script:255 SceneSystemInterface.IsEntityInScene/sourceIsEntityInDialogue orphans.script:32248-32252.
3. The camera
- Reading the look direction:
CameraSystem.GetActiveCameraForward()(pitch =asin(z)),GetActiveCameraWorldTransform(); V's facingGetWorldYaw()sourcecore/.entity/ entity.script:48 TargetingSystem.LookAt(instigator, out AimRequest)turns the player's camera in yaw and pitch towardslookAtTargetoverduration, withmaxDuration,easeIn/easeOut,precision,adjustYaw/adjustPitch,endOnTargetReached,endOnTimeExceeded,endOnCameraInputApplied,cameraInputMagToBreak,cameraMouseInputMagToBreak,processAsInputand body-part tracking fields;BreakLookAt,BreakAimSnapend it sourceorphans.script:22401-22423, 26044-26088. The scanner's target switch (0.1 s) sourcecore/, melee sourcesystems/ hud/ hudManager.script:640-670 defaultTransition.script:720-755, an item action that makes V look at a thrown knife sourcecyberpunk/and an effect executor (0.25 s, eased) sourceitems/ combat_ gadgets/ kurtThrowableKnife.script:295-313 cyberpunk/call it, the last two from outside the PSM.strike/ executors/ executorLookAt.script - The first-person camera is the player's
cameracomponent (GetFPPCameraComponent(), agameFPPCameraComponent):ResetPitch(),SceneDisableBlendingToStaticPosition(), the placed-componentGet/andSetLocalPosition Get/, and the fieldsSetLocalOrientation pitchMin,pitchMax,yawMaxLeft,yawMaxRight,headingLocked,sensitivityMultX/sourceY orphans.script:16646-16664, 27006-27011; SDKgame/. The current pitch is in an unnamed field. Native Interactions Framework pulls this camera 2 m behind V (FPPCameraComponent.hpp SetLocalPosition(0, -2, 0)) and widens its limits for an external view source NIFmodules/. Whether a local-orientation write sets pitch or is overwritten each frame is hypothesis.ui/ interactionUI.lua:38-62 - Hidden test natives:
PlayerFunctionalTests.SetCameraOrientationandRemoveCollisionexist in retail RTTI, parameters stripped (§6) sourcered-dump-jsonclasses/.PlayerFunctionalTests.json - Immersive Third Person activates its own camera component (
tppCamera) and sets its local orientation and position every frame from an orbit fed by the player's mouse and stick actions caught inPlayerPuppet.OnAction; it locks the first-person camera's heading while free-looking and resets it (ResetPitch, neutral orientation, origin) when switching back source ITPbin/. Its RED4ext pluginx64/ plugins/ cyber_ engine_ tweaks/ mods/ immersive_ third_ person/ init.lua:1029-1070, 3890-3920, 4490-4600 ImmersiveThirdPersonMove360swaps the native handlers ofStateGameScriptInterface.GetActionValueandGetInputHeading, guarded against a table it can't verify, so the PSM reads the movement input it wants source the plugin's log strings. A third-person look is therefore that mod's own state, not the game's. - A free camera of one's own: spawn
base\,entities\ cameras\ simple_ free_ camera.ent FindComponentByName("camera"),Activate(blendTime, false),SetFOV,SetZoom, move the entity withTeleport;DeactivateandGetFPPCameraComponent().Activate()to return. AMM holds V still meanwhile withNoMovement,NoCameraControl,NoZooming,FastForwardCrouchLock,NoCombat,VehicleNoSummoning,NoPhoneandNoDriving, and shows her head source AMMModules/,camera.lua Modules/.util.lua:541-561
4. Interactions and dialogue
- Everything the HUD offers is on the
UIInteractionsblackboard (global, auto-created):InteractionChoiceHub(InteractionChoiceHubData { id, flags, active, title, choices }),DialogChoiceHubs({ choiceHubs: [ListChoiceHubData { id, activityState, flags, isPhoneLockActive, title, choices: [ListChoiceData] }] }),ActiveChoiceHubID,SelectedIndex,LootData,ContactsData,ActiveInteractions,InteractionSkillCheckHub,NameplateOwnerID,VisualizersInfo,LastAttemptedChoice,LookAtTargetVisualizerID,HasScrollableInteractionsourcecore/;blackboard/ blackboardDefinitions.script:805-838 orphans.script:42008-42026, 54489-54552. The HUD listens to exactly these sourcecyberpunk/.UI/ interactions/ interactionUIBase.script:30-107 - A world choice (
InteractionChoiceData) carries theinputActionthat selects it (Choice1…Choice4or a hold),isHoldAction, a LocKeylocalizedName(shown withGetLocalizedText), a type, caption parts anddatavariants sourceorphans.script:54537-54552,cyberpunk/. A dialogue line (UI/ interactions/ interactionsUIChoiceItem.script:64, 152 ListChoiceData) carries its text, type, caption parts andinputActionName, its dedicated input where it has one sourcecyberpunk/.UI/ interactions/ dialogUI.script:312-324 LastAttemptedChoice(InteractionAttemptedChoice { visualizerType, choice, choiceIdx, isSuccess }) records the last choice made and whether it succeeded; the prevention system listens to it sourceorphans.script:33653-33662,core/.systems/ preventionSystem.script:1150 - Selection is native and input-driven. The interaction manager turns the choice's action into an
InteractionChoiceEvent { hotspot, activator, layerData, choice: InteractionChoice { caption, captionParts, data, choiceMetaData }, actionType }on the hotspot's entity sourceorphans.script:18261-18268, 22133-22144, 35785-35790. The script API ofInteractionManagerhas onlyIsInteractionLookAtTarget,SetBlockAllInteractionsandAreSceneInteractionsBlockedsourceorphans.script:33671-33678, andSceneSystemInterfacehas no choice function sourceorphans.script:32199-32252. Selecting a dialogue line therefore means input:ChoiceScrollUp/untilDown SelectedIndexmatches, thenDialogConfirm(IK_,F IK_, pad X) or the line's own input resourceEnter r6/.config/ inputUserMappings.xml:1175-1200 - Devices handle the event with
OnInteractionUsed(evt) → ExecuteAction(evt.choice, evt.activator, evt.layerData.tag)sourcecyberpunk/; containers, mountable vehicles and puppets and the inventory component have their own handlers sourcedevices/ core/ interactiveDevice.script:276-278 core/,components/ lootContainers.script:113 gameVehicleMountableComponent.script:4-12,inventoryComponent.script:44. Queuing such an event from script, without input, is hypothesis. - Usable spots added by Native Interactions Framework are scene interactions (it registers scene resources), so they select like dialogue source NIF
r6/.scripts/ nativeInteractions.reds - A mod can add its own hub to the dialogue widget and let the player choose from it with the usual keys; the answer comes back to the mod, not as input it must synthesise (NPC direction §5) source.
5. Other player actions
| Action | Route | Grade |
|---|---|---|
| Crouch / stand | GameplayRestriction.ForceCrouch status effect; the PSM tests the ForceCrouch tag and the sniper nest applies and removes it | source defaultTransition.script:1203, cyberpunk/ |
| Jump | Input only: JumpDecisions wakes on a Jump input event and checks IsActionJustPressed(n"Jump") or the JumpPressed condition | source locomotionTransitions.script:4141-4185 |
| Sprint, dodge | Input only; sprint needs movement input near forward | source locomotionTransitions.script:1461 onwards |
| Draw, holster, pick a weapon slot | EquipmentSystemWeaponManipulationRequest { owner, requestType: EquipmentManipulationAction } queued on EquipmentSystem (RequestLastUsedOrFirstAvailableWeapon, UnequipWeapon, RequestWeaponSlot1-3, RequestFists…) | source orphans.script:11191-11221, 28176-28184, cyberpunk/ |
| Consume, heal | ItemActionsHelper.ConsumeItem(executor, itemID, fromInventory), UseHealCharge(executor, itemID) | source cyberpunk/ |
| Hub menus | StartHubMenuEvent.SetStartMenu(n"inventory_ through GameInstance.GetUISystem(game).QueueEvent | source inGameScenarios.script:2-12, inGameMenuGameController.script:501-526, cyberpunk/ |
| Wardrobe | inkMenuInstance_ through the UI system | source cyberpunk/ |
| Close a hub menu | ForceCloseHubMenuEvent, which the in-game menu turns into OnCloseHubMenuRequest | source inGameMenuGameController.script:274-276 |
| Restrict the player | GameplayRestriction.NoMovement, NoCameraControl, NoJump, NoZooming, NoCombat, NoWorldInteractions, BlockAllHubMenu … as status effects | source 2.31 scripts (usage counts in the design) |
6. How input reaches the game, and synthetic input
- Devices: the executable imports
RegisterRawInputDevicesandGetRawInputData(keyboard and mouse as Raw Input),XInputGetStatefromXINPUT9_,1_ 0.dll HID.DLLfunctions (other pads), andGetForegroundWindow,ClipCursor,SetCursorPosresource 2.31 executable imports. Posted key messages never reach it andSendInputworks only with the game in front runtime sessions 4 and 5 (photo mode §2.3). - Where it can be seen: the address library names
input::InputSystemWin32Base::Update(hash261693736) resource; CET usesinput::InputSystemWin32Base::ForceCursor(2130646213) and blocks game input by swallowing mouse, keyboard andWM_messages in its window-procedure hook source CETINPUT src/,reverse/ Addresses.h:62-63 src/. Codeware reads decoded input by hookingd3d12/ D3D12.cpp:27-50 inkSystem::ProcessInputEvents(hash673454961), whoseRawInputBufferholds 0x40-byteRawInputData { EInputKey key, EInputAction action, float value, mouseX, mouseY, … }records source Codewaresrc/,App/ Callback/ Controllers/ RawInputHook.hpp src/.Red/ Input.hpp - Actions are data. Each action in
inputContexts.xmlmaps to a mapping ininputUserMappings.xmllisting keys and pad buttons, for exampleChoice1=IK_or pad X,F TogglePhotoMode=IK_or both sticks clicked (N IK_) resourcePAD_ LR_ THUMB inputUserMappings.xml:1175-1200, 2066-2069. Input Loader adds actions by mergingr6/(or a plugin's file) into copies ininput/ *.xml r6/and pointing the game at them withcache engine/; it fires nothing source Input Loaderconfig/ platform/ pc/ input_ loader.ini src/. Mods consume actions withMain.cpp RegisterInputListeneror by observingPlayerPuppet.OnAction. - CDPR's functional-test system is in the retail build.
FunctionalTestsGameSystemlists 60 native functions, among themFakeInputPressAction,FakeInputReleaseAction,FakeInputHoldAction,FakeInputClickAction,FakeInputMultitapAction,FakeInputAxisAction,FakeInputReleaseAxisAction,FakePressButton,FakeReleaseButton,FakeSetAxis,TakeOverInput,ReleaseAllInput,LookAtPosition,NavigateFlatTowards,TeleportPlayer,GetPlayerPositionandGetPlayerOrientation;NavigationFunctionalTestshasGetPathOnNavmesh, andUIFunctionalTestshasPlay,IsPlayingandGetPlaybackResultsourcered-dump-jsonclasses/. None has parameters in RTTI (Codeware re-declares them empty) source Codeware 1.20.5*FunctionalTests*.json Scripts/. The retail game doesn't register the system; CET creates it as a singleton for its entity spawner, and adds the missing parameters ofCodeware.Global.reds:16732-16791 WorldFunctionalTests.SpawnEntityitself before calling that native's retail body, kept for mods that still call it source CETsrc/. So the fake-input natives exist and are reachable with CET installed; whether their bodies do anything outside the test engine, and with which parameters, is hypothesis. Recovering a signature means reading the native handler's parameter reads in the executable, the method game crashes §2.1 used.reverse/ RTTIExtender.cpp:341-390, 585-625, 660-667 - Other channels hypothesis: a virtual XInput pad (replace the
XInputGetStateimport in-process and merge a synthetic state with the real pad's; unknown whether the game polls pads in the background, and it switches its prompts to pad glyphs), or appending records to the decoded buffer beforeinkSystem::ProcessInputEvents(unknown whether gameplay reads the same buffer).
What the bridge builds on (0.6 and 0.6.1, offline)
- Refusals first. Every player write reads the PSM blackboard's
HighLevelandLocomotion,IsInCombat,VehicleComponent.IsMountedToVehicleand the scene system'sIsEntityInScene/IsEntityInDialogue, and refuses within_,combat in_,vehicle in_orscene player_(a jump, slide, swim, workspot, menu or photo mode; named apart from the bridge queue's ownbusy busy). 0.6.1 also reads the blackboard'sFall,Landing,Swimming,IsInWorkspot(an Int),TakedownandBodyCarrying(non-zero is busy:gamePSMFallStates,gamePSMLandingState,gamePSMSwimming,gamePSMTakedown,gamePSMBodyCarrying;HighLevel6 isSwimming) source 2.31blackboardDefinitions.script:110-162,orphans.script:6647-6980,isInWorkspotPSMPrereq.script:8. - Teleport snaps to
FindPointInSphereOnlyHumanNavmesh(2 m)afterIsNavmeshStreamedInLocation(2 m), keeps within 50 m unless asked, and reads V's place back two ticks later; an instant yaw is a teleport in place; pitch goes through a very shortLookAt. Since 0.6.1 the streaming check applies toexactteleports too (any destination more than 0.5 m away). - A glide follows
CalculatePathOnlyHumanNavmesh's points by a teleport per tick withGameplayRestriction.NoMovementheld (and lifted at the end); it plays no walk cycle (whether the third-person body animates is open question 5). Since 0.6.1 it checks V before every step, and ends when the player's own input moves her: while the hold is on, a listener object is registered on V forMoveX,MoveY,Jump,ToggleCrouch,Crouch,ToggleSprint,Sprint,Dodgeand the camera axes (GameObject.RegisterInputListener(listener, name), answered through the listener'sOnAction, as the takeover system listens for camera input sourcegameObject.script:152-156,takeOverControlSystem.script:348, 540-570).PlayerPuppet.OnActionitself only sees the actions the puppet registered (player.script:1075-1080), so wrapping it would not see movement. Whether actions still reach a listener whileNoMovementholds V is hypothesis until session 7's G2. - Crouch is
GameplayRestriction.ForceCrouch, remembered so that only the bridge's own is lifted; weapons go throughEquipmentSystemWeaponManipulationRequest; menus throughStartHubMenuEventand the wardrobe's spawn event; closing a hub menu withForceCloseHubMenuEventthrough the UI system is hypothesis. - The probe reads the functional-test classes' functions (parameter counts and types, registration index) and each native handler's offset from the engine's handler table, without calling anything; its numbers feed the disassembly step of §6.
Open questions
- Do the
FakeInput*natives work in the retail engine, with which parameters, and without window focus? A read-only probe of their handler offsets, then offline disassembly, then one supervised call (design §2.5). - Does the game poll XInput while its window is not in front?
- Does gameplay input read the same decoded buffer that
inkSystem::ProcessInputEventsreceives? - Can script build an
InteractionChoiceEventthat a device accepts from the hub's choice data? - Is the first-person camera's pitch settable directly, or only through
LookAt? - Does a per-tick teleport ("glide") play any locomotion animation on V's third-person body, and does it trip area triggers as walking does?
Related pages
Player-control design · Runtime access · Photo mode · Game crashes · Poses · Mod ecosystem survey