Combat Moves Controls
Every key here is a default in config.lua and can be changed. Names come from client/keys.lua, which ships readable. INPUT_* control names resolve in only two places — the four dive inputs, and the gun-trick slots and nativeSlots entries — which fall through to GetHashKey when the name is not a key name. Config.MenuKey, Config.SlideKey, Config.Roll.key and Config.GunTricks.key go through CS.ResolveKey alone, so an INPUT_* name is not found there: the menu key is dropped with a console error and the panel is left on /combatmoves, and the other three fall back to C, LALT and TAB.
Keyboard
| Action | Default | Set in |
|---|---|---|
| Open the menu | PGUP | Config.MenuKey |
| Open the menu (command) | /combatmoves | — |
| Jump straight to Gun Tricks | /guntricks | — |
| Slide | hold C for 250 ms | Config.SlideKey |
| Roll | LALT, with or without a movement direction | Config.Roll.key |
| Start / stop gun tricks | double-tap N | Config.GunTricks.key |
| Next trick | tap N while spinning | same key |
| Stop spinning | hold N for 500 ms | Config.GunTricks.holdToStopMs |
| Dive | G plus a movement direction | Config.Dive.keyboard.diveInput |
| Go prone | hold crouch for 500 ms | Config.Dive.keyboard.proneInput |
| Stand up from prone | tap crouch | same control |
| Roll onto your back | the jump control, while crawling | not configurable |
| Sit up from prone | the lock-on-animal control | Config.Dive.keyboard.sitInput |
| Stealth mode | double-tap the left-stick-click control | Config.Dive.keyboard.stealthInput |
| Release everything | /unstuck | — |
A direction is optional for the roll but required for the dive. pickClips() returns the forward pair when no movement control is held, and Config.Roll.allowFromStandstill ships true, so a bare LALT rolls you forward. The dive returns without diving if nothing is held, but one movement key on its own is enough, including S for a backward dive.
The defaults for the three dive controls are given as game controls rather than letters, so they follow whatever the player has those actions bound to:
| Setting | Default | Which action that is |
|---|---|---|
proneInput | INPUT_DUCK | crouch |
stealthInput | INPUT_FRONTEND_LS | left stick click |
sitInput | INPUT_INTERACT_LOCKON_ANIMAL | lock on to an animal |
Controller
The resource reads IS_USING_KEYBOARD_AND_MOUSE every frame and swaps binding sets, exactly as the original does, so a player moving between a pad and a keyboard mid-session gets the right set each time. Only the dive feature has a separate controller set.
| Action | Default control | Set in |
|---|---|---|
| Dive | INPUT_MELEE_GRAPPLE, held 300 ms | Config.Dive.controller.diveInput |
| Go prone | INPUT_DUCK, held 500 ms | Config.Dive.controller.proneInput |
| Stealth mode | double-tap INPUT_LOOK_BEHIND | Config.Dive.controller.stealthInput |
| Sit up from prone | INPUT_COVER | Config.Dive.controller.sitInput |
The stealth double-tap window is tighter on a pad — 201 ms, against 401 ms on keyboard. Both numbers come from the original binary.
The slide, roll and gun-trick keys have no separate controller set, and an INPUT_* control name will not give them one. Config.SlideKey (in the default 'key' input mode), Config.Roll.key and Config.GunTricks.key are resolved with CS.ResolveKey only, which looks the name up in the raw keyboard hashes in client/keys.lua and returns nothing for an INPUT_* name. Each then prints a console error and falls back to its shipped default — C for the slide, LALT for the roll, TAB for gun tricks — so the binding looks unchanged in game.
The one supported way to put the slide on a game control is Config.InputMode = 'control' plus Config.SlideInput. The roll and gun-trick keys have no control-name path at all. The dive inputs need none — they already ship as control names.
Hold and tap timings
| Default | Setting | |
|---|---|---|
| Slide hold | 250 ms | Config.HoldDuration |
| Slide double-tap window | 400 ms | Config.DoubleTapWindow |
| Gun-trick double-tap window | 400 ms | Config.GunTricks.doubleTapWindow |
| Gun-trick hold-to-stop | 500 ms | Config.GunTricks.holdToStopMs |
| Dive hold (keyboard) | 1 ms | Config.Dive.keyboard.diveHoldTime |
| Dive hold (controller) | 300 ms | Config.Dive.controller.diveHoldTime |
| Prone hold | 500 ms | Config.Dive.keyboard.proneHoldTime |
| Stealth tap window | 401 ms / 201 ms | Config.Dive.*.stealthTapWindow |
A keyboard dive hold time of 1 means the dive fires on press. The controller's 300 ms exists because the grapple button has a normal job to do.
What each default key steals
Every default is already a game control, so binding it means taking that action away for as long as the key is held.
| Key | Normal game action | How it is handled |
|---|---|---|
C | INPUT_LOOK_BEHIND | suppressed while held, via Config.SuppressWhileHeld |
N | INPUT_PUSH_TO_TALK | not suppressed — see the warning below |
G | INPUT_INTERACT_OPTION1 | the dive needs a direction too, so a bare press still does its normal job |
| crouch | duck | prone needs a 500 ms hold, so a tap still crouches |
N is push-to-talk
On a server with voice chat, double-tapping N to start spinning also keys the player's microphone. TAB (INPUT_TOGGLE_HOLSTER) is the obvious swap:
Config.GunTricks.key = 'TAB'This is not a bug in the resource — N is the original mod's key, and RedM puts push-to-talk on it. It is simply worth changing before launch on any server with voice.
If you change Config.SlideKey, change Config.SuppressWhileHeld to match, or set it to {} to leave the vanilla action alone:
Config.SlideKey = 'V'
Config.SuppressWhileHeld = {} -- or the INPUT_* name V is bound toKeys that cannot be bound
K, T and Y
RedM has no raw key hash for these three, so nothing can bind them. This is a platform limitation, not a limitation of this resource. The usable set in client/keys.lua is:
- letters
A–ZexceptK,TandY - numbers
1–8 - arrow keys,
F1,F4,F6 CTRL,SHIFT,TAB,SPACEBAR,ENTER,BACKSPACE,LALT,DEL,PGUP,PGDNMOUSE1,MOUSE2,MOUSE3,MWUP,LEFTBRACKET,RIGHTBRACKET
A raw hash works too: Config.SlideKey = 0x9959A6F0 is C.
The per-trick keys the original mod used — G H J B L F for tricks 1–6 — are not bound here. Every one of them is a real game control, and because RDR2 hides a prompt whose control is disabled, suppressing them also stopped their prompt rows drawing, so they cost something and earned nothing. Tap N for the next trick, or pick one in the menu.
Config.GunTricks.slots is left in place as an empty table rather than removed, so putting them back is a config change rather than a code change.
Letting players choose their own slide key
Config.InputMode = 'keymap'
Config.DefaultKey = 'C'The slide then appears in the player's own Settings → Key Bindings → FiveM list and they pick the key themselves. The other two modes are:
Config.InputMode | Reads | Uses |
|---|---|---|
'key' | a plain keyboard key by name | Config.SlideKey (default) |
'control' | an in-game control name | Config.SlideInput |
'keymap' | a rebindable binding | Config.DefaultKey as the starting offer |
Only the slide has an input mode. The roll and gun-trick keys are read as key names only — a control name is rejected and the shipped default is substituted. The dive inputs and the gun-trick slots and nativeSlots entries are the places that accept either form.
Driving the menu
| Arrow keys | move, and change the value on a slider or options row |
| Enter | select |
| Backspace | go back a page |
| Escape | close |
| Tab | focus the search box |
| Mouse | hover to highlight, click to activate, click a ◀ ▶ to nudge a value, wheel to scroll, click outside to close |
You cannot walk around while the panel is open. The menu calls SetNuiFocus(true, ...) and the resource never calls SetNuiFocusKeepInput, so the keyboard goes to the page and the game receives nothing — your character stands still until you close it. The mouse cursor is the second half of that call and needs Config.MenuMouse, which is on by default — the trade-off and how to turn it off live are covered on The menu.