Skip to content

Gun Tricks ​

Draw a sidearm and double-tap N. Your character starts spinning it.

Using it ​

Startdouble-tap N within 400 ms
Next tricktap N while spinning
Stophold N for 500 ms
Pick a specific trickCombat Moves → Gun Tricks, or /guntricks

Equip two sidearms and the tricks use both hands.

N is push-to-talk in RedM

Double-tapping it to spin will also key the player's microphone on a server with voice chat. TAB is the usual swap:

lua
Config.GunTricks.key = 'TAB'

A double-tap starts a random trick by default

Config.GunTricks.random ships as 'start', so each double-tap begins with a random trick rather than the one you last used. A random pick is never the trick that was playing last. Set it to 'off' to always start on the selected trick, as the original does.

The six tricks ​

#NameDescriptionEmote
1Reverse SpinTwirl your gunsKIT_EMOTE_TWIRL_GUN_VAR_A
2Spin UpRaise your guns and twirl them high…VAR_B
3Reverse Spin UpRaise your guns and twirl them backwards…VAR_C
4Alternating FlipsFlip your guns back and forth…VAR_D
5Shoulder TossThrow your guns over your shoulder…VAR_E
6Figure Eight TossTwirl and throw your guns…VAR_F

All six are available. The original mod's menu only let you equip four at a time, because the game has four dedicated inputs (INPUT_EMOTE_TWIRL_GUN_VAR_A..D) and it bound them to those. Without that constraint there is no reason to cap it at four.

Remove any you do not want in the rotation by deleting its row from Config.GunTricks.tricks.

How it works ​

This feature plays no animation clips of its own. It drives the game's gun-spinning emote system — the same one Red Dead Online uses:

lua
base  = _GET_CORRECT_KIT_EMOTE_TWIRL_GUN(ped)
_SET_ACTIVE_GUN_SPINNING_EQUIP_KIT_EMOTE_TWIRL(ped, base)
emote = _GET_PED_GUN_SPINNING_EQUIPPED_KIT_EMOTE_TWIRL(ped)
TASK_PLAY_EMOTE_WITH_HASH(ped, 4, 1, emote, true, false, false, false, false)
_SET_ACTIVE_GUN_SPINNING_KIT_EMOTE_TWIRL(ped, 4, trick)
_SET_GUN_SPINNING_INVENTORY_SLOT_ID_ACTIVATE(ped, 4)

The original needed version.dll; this does not

The ASI had to load multiplayer content into story mode to reach these emotes at all. RedM is multiplayer, so that content is already there and the requirement simply does not apply.

The mod's own in-game settings menu was not ported — it was a DirectX overlay and would have had to be rebuilt as NUI. Its settings live in this resource's panel instead.

Hands ​

Config.GunTricks.handMode picks between the game's three base twirl emotes:

ModeEmote
'auto'whichever the game picksdefault — returns the dual emote only when two sidearms are actually held, which is what the original does
'dual'KIT_EMOTE_TWIRL_GUN_DUALforces both hands
'single'KIT_EMOTE_TWIRL_GUNforces one hand
'left'KIT_EMOTE_TWIRL_GUN_LEFT_HOLSTERleft holster only

'dual' is safe with one gun

Before it picks the base emote, startSpinning checks the off hand and downgrades 'dual' to 'single' when there is no sidearm in it. The gun you are actually holding spins, and no empty hand twirls. The comment next to handMode in config.lua still warns otherwise; the code was changed to fix exactly that.

cs_hands <auto|dual|single|left> switches it live, and Gun Tricks → Settings → Hands does the same from the panel.

Settings ​

Default
enabledtruethe feature itself
key'N'start, next and stop all use it
doubleTapWindow400ms between the two presses
holdToStopMs500hold this long to stop
nextTrickKeynila separate key for the next trick
requirePistoltrueonly pistols and revolvers can be spun
handMode'auto'see above
holsterOnStoptrueput the gun away when spinning stops
cooldown600ms
random'start'random trick on each start
notifyOnChangetrueprint the trick name to the console when it changes
hudMode'none'the on-screen trick list — off

requirePistol ships true because the original mod's 1.1 release note was a fix for exactly that. Set it to false to let anything be spun.

The mouse wheel is not used ​

The original used the mouse wheel for the next trick. In RedM that also opens the weapon wheel, so a tap of key does it instead and nextTrickKey is left nil.

The on-screen trick list ​

Off by default. Gun Tricks → Settings → Show trick list turns it on, which sets hudMode to 'nui'.

hudModeRenderer
'none'no list — default
'nui'the menu's own look; what the menu row turns on
'hud'the game's text renderer — western font, right-justified
'draw'the UIDEBUG text natives; plain debug font, but it always renders
'prompt'RDR2's prompt UI

Pick a mode that renders on your build before switching it on

A half-working renderer leaves its title stuck on screen. If 'hud' shows nothing, use 'draw' — it is uglier but it always draws. /unstuck sets hudMode back to 'none' if you get stuck with a stranded title.

'prompt' mode will show very little, and the reason is worth knowing because it explains several decisions in this feature:

RDR2 hides a prompt whose control is disabled

So does the quickselect group while an emote runs. Suppressing a control to stop it doing its normal job also stops its prompt row drawing. promptForceEnableControls would force the rows to appear, at the cost of the game acting on the keys — which is why it cannot be combined with suppressSelectKeys, and why it ships off.

Position, scale and colours are under Config.GunTricks.hud.

Keys that are deliberately not bound ​

Config.GunTricks.slots{} — the original's G H J B L F per-trick keys
Config.GunTricks.nativeSlots{} — the game's own four INPUT_EMOTE_TWIRL_GUN_VAR_A..D inputs
Config.GunTricks.numberKeys{}

All six of the original's trick keys were real game controls. Suppressing them while spinning kept F from swinging a fist and H from whistling your horse, but it also stopped their prompt rows drawing — so they earned nothing. Both tables are left in place as empty tables rather than removed, so putting them back is a config change.

suppressSlotControls (true) and suppressSelectKeys (true) remain, the latter so the number keys cannot change weapon mid-spin. The number keys 1–6 are INPUT_SELECT_QUICKSELECT_* controls, which the game disables during an emote anyway.

Combat Moves → Gun Tricks, or the Tricks tab.

SectionRows
(no heading)Start Spinning / Stop Spinning
Tricksall six by name, with the current one marked
MoreSettings >

Selecting a trick also starts spinning if you are not already. The Settings sub-page holds Enabled, Hands, Random trick, Sidearms only, Holster when stopping, Show trick list and Announce in console — and keeps the Tricks tab lit while you are in it.

/guntricks jumps straight to the Tricks page. It respects both the master switch and the page switch, so it is not a way round a hidden Tricks page.

Exports ​

lua
exports.rm_combat_moves:IsSpinning()
exports.rm_combat_moves:ToggleGunTrick(randomStart)
exports.rm_combat_moves:StopGunTrick()
exports.rm_combat_moves:NextGunTrick()           -- returns the new index
exports.rm_combat_moves:SetGunTrick(3)           -- index 1-6, or the name
exports.rm_combat_moves:GetCurrentGunTrick()
exports.rm_combat_moves:GetGunTricks()           -- the list, see below
exports.rm_combat_moves:SetGunTrickHands('dual')
exports.rm_combat_moves:GetGunTrickHands()
exports.rm_combat_moves:SetGunTricksEnabled(false)
exports.rm_combat_moves:ForceResetGunTricks()    -- recovery
exports.rm_combat_moves:DumpGunTrickPrompts()    -- prompt diagnostics

GetGunTricks() returns an array of:

lua
{ index = 1, name = 'Reverse Spin', desc = 'Twirl your guns',
  emote = 'KIT_EMOTE_TWIRL_GUN_VAR_A', current = true }

There is no key field on a default install. It is looked up in Config.GunTricks.slots and Config.GunTricks.nativeSlots, and both ship as empty tables, so the lookup returns nil for every trick — in the menu rows as well. Filling in slots brings it back, but only for a plain key name — the lookup deliberately skips INPUT_* control names, so nativeSlots entries never produce one. A slot also has to carry the matching trick index.

Constants ​

Read out of the decompile. Change only if you know why.

emoteType4
playbackMode1
resetFlag292 (0x124), set every frame while spinning
lookAtBlockMs250 — _DISABLE_ALL_LOOK_AT_REQUESTS

Documentation for RedMorrow. Scripts are licensed per server — redistribution is not permitted.