Replay
Replay recording and playback system. Records vehicle physics state to `.rpl` files, plays back with variable speed, seeking, and frame stepping. Supports mission auto-recording and user-saved replays
Replay recording and playback system. Records vehicle physics state to .rpl files, plays back with variable speed, seeking, and frame stepping. Supports mission auto-recording and user-saved replays.
Public Functions
| Function | Signature | Description |
|---|---|---|
M.toggleRecording | (autoplay, isMission) → filename | Starts or stops recording; returns replay filename |
M.toggleMissionRecording | () → filename | Toggle recording for mission replays |
M.cancelRecording | () | Cancels active recording and deletes the file |
M.togglePlay | () | Plays/pauses the loaded replay |
M.loadFile | (filename) | Loads and pauses a replay file |
M.stop | () | Stops playback/recording |
M.pause | (v) | Sets pause state during playback |
M.setSpeed | (speed) | Sets playback speed (1.0 = realtime) |
M.toggleSpeed | (val) | Cycles speed: "realtime", "slowmotion", or ±1 step |
M.seek | (percent) | Seeks to normalized position [0..1] |
M.jumpTime | (seconds) | Jumps forward/backward by seconds |
M.jumpFrames | (offset) | Steps forward/backward by frames |
M.jump | (offset) | Alias for jumpFrames |
M.getRecordings | () → table | Lists .rpl files in /replays/ |
M.getState | () → string | Current state: "inactive", "recording", "playback" |
M.isPaused | () → boolean | Whether playback is paused |
M.getPositionSeconds | () → number | Current playback position in seconds |
M.getTotalSeconds | () → number | Total replay duration in seconds |
M.getLoadedFile | () → string | Currently loaded replay filename |
M.displayMsg | (level, msg, context) | Shows a toast notification |
M.openReplayFolderInExplorer | () | Opens /replays/ in file explorer |
M.startLevel | (levelPath) | Loads a level for replay playback |
M.acceptRename | (oldFile, newFile) | Renames a replay file and reloads |
M.saveMissionReplay | (replayFile) | Moves a mission replay to user-saved folder |
M.getMissionReplayFiles | (mission, onlyWithAttempt) → table | Lists replays for a specific mission |
M.getMissionReplaysPath | () → string | Returns "replays/missionReplays/" |
M.removeMissionSavedReplay | (replayFile) | Moves a saved replay back to auto folder |
M.openMissionReplayFolder | (replayFile) | Opens replay file location in explorer |
Replay State Object (M.state)
| Field | Type | Description |
|---|---|---|
loadedFile | string | Current replay file path |
positionSeconds | number | Current position in seconds |
totalSeconds | number | Total duration |
speed | number | Playback speed multiplier |
paused | boolean | Whether paused |
state | string | "inactive", "recording", "playback" |
Speed Presets
1/1000, 1/500, 1/200, 1/100, 1/50, 1/32, 1/16, 1/8,
1/4, 1/2, 3/4, 1.0, 1.5, 2, 4, 8Hooks
| Hook | Purpose |
|---|---|
M.onInit | Called on Init event |
M.onClientEndMission | Called on ClientEndMission event |
M.stateChanged(loadedFile, positionSeconds, totalSeconds, speed, paused, fpsPlay, fpsRec, statestr, framePositionSeconds) | Callback when replay state changes. |
Module State
| Variable | Type | Default |
|---|---|---|
requestedStartLevel | nil | nil |
Usage Example
-- Start recording
local filename = core_replay.toggleRecording()
-- filename: "replays/2024-01-15_14-30-00 gridmap.rpl"
-- Stop and auto-play
core_replay.toggleRecording(true)
-- Load and play a file
core_replay.loadFile("replays/myreplay.rpl")
core_replay.togglePlay()
-- Slow motion
core_replay.setSpeed(0.25)
-- Seek to 50%
core_replay.seek(0.5)
-- Step 10 frames forward
core_replay.jumpFrames(10)Notes
- During playback, vehicle action maps are disabled and
ReplayPlaybackActionMapis pushed. - Mission replays include
.rplMeta.jsonmetadata files with mission ID, attempt data, and save slot. - Recording filename format:
YYYY-MM-DD_HH-MM-SS <mapname>.rpl. - The
stateChangedcallback is called from C++ - do not remove. - Career replays are organized by save slot in
replays/userSavedMissionReplays/.
See Also
Remote Controller
Mobile phone remote controller support. Listens for UDP connections from the BeamNG Remote Control app, creates virtual input devices, and bridges accelerometer/button data to vehicle controls.
Repository
Online mod repository client. Handles mod browsing, subscribing/unsubscribing, downloading with progress, update queuing, and synchronization with BeamNG servers.