Knowledge from the fieldRedM

Safecracking move-network def is `Script_MUD5_Safecrack_Player` (NOT mini_games@safecrack); name lives in alloc8or move_networks.txt, not native docs

learning:88

Safecracking move-network def is Script_MUD5_Safecrack_Player (NOT mini_games@safecrack); name lives in alloc8or move_networks.txt, not native docs

Goal

Drive RDR2's real safe-cracking minigame (kneel at dial, listen for tumbler clicks) from a script — the immersive "rob the safe" animation. The mechanic is a move-network task: TASK_MOVE_NETWORK_BY_NAME_WITH_INIT_PARAMS (0x139805C2A67C4795) / ..._ADVANCED_... (0x7B6A04F98BBAFB2C) with a caller-built DataView taskData* struct.

The trap

The first thing you reach for is the anim-DICT name as the move-network DEF name, e.g. mini_games@safecrack@base (the dict exists — HasAnimDictLoaded returns true). But move-network def names are a SEPARATE namespace from anim dicts. Verified live on build 1491:

  • REQUEST_MOVE_NETWORK_DEF("mini_games@safecrack@base")HAS_MOVE_NETWORK_DEF_LOADED stays false (60ms+). Same for bare "safecrack".
  • The task then no-ops (IS_TASK_MOVE_NETWORK_ACTIVE = false).

The fix — the real def name

Move-network def names are catalogued in alloc8or's dump, referenced by _GET_TASK_MOVE_NETWORK_ID (0xCACC2F9D994504B7): https://alloc8or.re/rdr3/doc/misc/move_networks.txt . The safecrack-related defs there are:

  • Script_MUD5_Safecrack_Player ← runs on the CRACKER ped
  • Script_MUD5_Safecrack_Safe ← runs on the SAFE entity
  • Script_MPOUT4_Safecrack_Player

Verified live (build 1491): REQUEST_MOVE_NETWORK_DEF("Script_MUD5_Safecrack_Player")HAS_MOVE_NETWORK_DEF_LOADED = true in ~60ms, and TASK_MOVE_NETWORK_ADVANCED_BY_NAME_WITH_INIT_PARAMS on the player ped → IS_TASK_MOVE_NETWORK_ACTIVE = true. So the task starts.

Useful probe natives (all confirmed present, build 1491)

  • REQUEST_MOVE_NETWORK_DEF 0x2B6529C54D29037A
  • HAS_MOVE_NETWORK_DEF_LOADED 0x2C04D89A0FB4E244 (BOOL) — your "is this name real?" oracle. Brute-test candidate names with this.
  • IS_TASK_MOVE_NETWORK_ACTIVE 0x921CE12C489C4C41 (BOOL) — did the task actually start on the ped.
  • GET_TASK_MOVE_NETWORK_STATE 0x717E4D1F2048376D (const char*) — current state node name; use this to read the dial/crack progress instead of guessing signal names.
  • REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION 0xD01015C7316AE176 (ped, name) — drive the net to the next state.

Method that works for ANY unknown move-network

Don't grep the native docs for def names (they aren't there). Pull the full list from move_networks.txt, then brute-confirm each candidate with REQUEST_MOVE_NETWORK_DEF + HAS_MOVE_NETWORK_DEF_LOADED in a tight loop in-game. The dict the net references (mini_games@safecrack@base) still needs RequestAnimDict loaded alongside.

Soundset for the clicks: RDRO_Safecracking_Sounds. Freestanding safe model with open anim: s_safe01x (0x45FCD11E) — NOT p_safebla01x (that's a vault-DOOR panel).

Linked natives

  • _GET_TASK_MOVE_NETWORK_ID (0xCACC2F9D994504B7)
  • GET_TASK_MOVE_NETWORK_STATE (0x717E4D1F2048376D)
  • HAS_MOVE_NETWORK_DEF_LOADED (0x2C04D89A0FB4E244)
  • IS_TASK_MOVE_NETWORK_ACTIVE (0x921CE12C489C4C41)
  • REQUEST_MOVE_NETWORK_DEF (0x2B6529C54D29037A)
  • REQUEST_TASK_MOVE_NETWORK_STATE_TRANSITION (0xD01015C7316AE176)
  • TASK_MOVE_NETWORK_ADVANCED_BY_NAME_WITH_INIT_PARAMS (0x7B6A04F98BBAFB2C)
  • TASK_MOVE_NETWORK_BY_NAME_WITH_INIT_PARAMS (0x139805C2A67C4795)

Tags: safecrack, movenetwork, task, minigame, robbery, rdr3, animation
Category: natives
Source: scandi-robbery-core-build
Created: 2026-06-09T16:40:32.234Z

Back to documentation