Gun Tricks
Draw a sidearm and double-tap N. Your character starts spinning it.
Using it
| Start | double-tap N within 400 ms |
| Next trick | tap N while spinning |
| Stop | hold N for 500 ms |
| Pick a specific trick | Combat 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:
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
| # | Name | Description | Emote |
|---|---|---|---|
| 1 | Reverse Spin | Twirl your guns | KIT_EMOTE_TWIRL_GUN_VAR_A |
| 2 | Spin Up | Raise your guns and twirl them high | …VAR_B |
| 3 | Reverse Spin Up | Raise your guns and twirl them backwards | …VAR_C |
| 4 | Alternating Flips | Flip your guns back and forth | …VAR_D |
| 5 | Shoulder Toss | Throw your guns over your shoulder | …VAR_E |
| 6 | Figure Eight Toss | Twirl 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:
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:
| Mode | Emote | |
|---|---|---|
'auto' | whichever the game picks | default — returns the dual emote only when two sidearms are actually held, which is what the original does |
'dual' | KIT_EMOTE_TWIRL_GUN_DUAL | forces both hands |
'single' | KIT_EMOTE_TWIRL_GUN | forces one hand |
'left' | KIT_EMOTE_TWIRL_GUN_LEFT_HOLSTER | left 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 | ||
|---|---|---|
enabled | true | the feature itself |
key | 'N' | start, next and stop all use it |
doubleTapWindow | 400 | ms between the two presses |
holdToStopMs | 500 | hold this long to stop |
nextTrickKey | nil | a separate key for the next trick |
requirePistol | true | only pistols and revolvers can be spun |
handMode | 'auto' | see above |
holsterOnStop | true | put the gun away when spinning stops |
cooldown | 600 | ms |
random | 'start' | random trick on each start |
notifyOnChange | true | print 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'.
hudMode | Renderer |
|---|---|
'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.
Menu rows
Combat Moves → Gun Tricks, or the Tricks tab.
| Section | Rows |
|---|---|
| (no heading) | Start Spinning / Stop Spinning |
| Tricks | all six by name, with the current one marked |
| More | Settings > |
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
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 diagnosticsGetGunTricks() returns an array of:
{ 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.
emoteType | 4 |
playbackMode | 1 |
resetFlag | 292 (0x124), set every frame while spinning |
lookAtBlockMs | 250 — _DISABLE_ALL_LOOK_AT_REQUESTS |