30+ Dances FAQ
The questions this pack raises most often. The short version: there are 34 dances, and the resource contains no code at all.
Before you buy
How many dances are there?
34. Twenty breakdance moves, six hip hop dances and eight party dances.
All 34 rows in clips.lua are live. Nothing is commented out, both dictionaries named by those rows are present in stream/, and neither file is unused. The "30+" on the label means 34, so the count is not short.
The full table is on the animation list.
Is it a script or an asset pack?
An asset pack, and a stricter one than most: the manifest declares no scripts at all.
| File | What it is |
|---|---|
stream/ | 2 .ycd animation dictionaries, 2.9 MB total |
clips.lua | A data table. 34 rows, all live. No logic, and the manifest never loads it |
fxmanifest.lua | fx_version 'cerulean', game 'rdr3', lua54 'yes', escrow_ignore, dependency '/assetpacks' |
README.md, CHANGELOG.md, docs/ | Notes, version history and three guides |
That is the whole resource. There is no client_scripts block, no server_scripts block and no server.lua. CFX picks stream/ up on its own without a manifest entry, which is how a pack with no code works at all.
It does not announce itself
Most packs print a start-up line. This one has no server script to print one, so the console shows only the ordinary resource line:
Started resource redmorrow2Nothing is wrong when that is all you see. It is the expected output.
Does it include a menu, a command or exports?
No. No menu, no chat command, no keybind, no events, no exports and no config options — there is no code in the resource to hang any of them on.
That is the difference between this pack and the sibling pose pack that does ship a front end:
| 30+ Dances | 30+ Female Poses | |
|---|---|---|
Streamed .ycd dictionaries | Yes | Yes |
| In-game menu | No | Yes |
| Chat command | No | Yes |
| Exports | No | Yes |
| Scripts of any kind | None | Yes |
| Male and female versions | Yes | Female only |
The other sibling, 100+ Female Poses, is assets-only in the same way this pack is — and female only.
A player cannot start a dance out of the box
Install this pack on its own and the two dictionaries stream correctly, but no key and no command will do anything, because nothing in the resource listens for one. You supply the playback: an emote resource you already run, or a few lines of your own client code. Both routes are under Using it.
Are there male and female versions?
Yes, for every one of the 34 dances.
| Body | Dictionary |
|---|---|
| Male | redmorrow2@dance |
| Female | redmorrow2@dance@f |
Those two are the only dictionaries in the pack, and there are no exceptions to the pattern. Every row's dict is the male dictionary, bodies.female is that same name plus @f, and the clip names inside the two files are identical. Both play on either body; the matching one fits better. See two dictionaries, that is all.
Do I need a framework, a database or OneSync?
None of the three. VORP, RSG, RedEM:RP or no framework at all — the resource never looks for one, because it runs nothing that could. There is no SQL, nothing is saved between sessions, and OneSync is not required.
Do I need an emote menu?
Not strictly, but you do need something to play the clips.
Your options are an emote resource — RedM Emotes or whatever you already run — or about ten lines of your own client script. With neither, the pack streams 3 MB to every player and does nothing visible.
What do I actually need?
| A RedM server | An up-to-date build. Old builds cannot load escrow-protected resources |
| Asset packs on your licence key | Required. The manifest declares dependency '/assetpacks' |
| A way to play clips | Required. An emote resource, or your own script |
| Framework | Not required |
| Database | Not required |
| OneSync | Not required |
What is dependency '/assetpacks'?
A Cfx.re entitlement check tied to your server licence key. If asset packs are not enabled for that key, the resource refuses to start, and nothing inside the resource can work around it.
The requirement is genuine here — the pack streams files, which is exactly what the entitlement governs.
Will it slow my server down?
No. The figure is not low, it is absent: there is no client script and no server script, so the resource costs 0.00 ms on both sides.
Players download about 3 MB of animation files the first time they join, and the files are cached after that. A dictionary only loads into memory when someone plays a dance from it, so the first play may stutter once. Every play after that is instant.
Does it work on FiveM?
No. These are RDR2 .ycd dictionaries and the manifest declares game 'rdr3'.
Using it
I installed it and nothing happens. What now?
Confirm the resource started, then decide who plays the clips.
Check the console. Look for the plain start line and nothing more:
textStarted resource redmorrow2There is no custom message to look for. A pack with no server script cannot print one.
Install it so the dictionaries stream. The folder and the manifest
nameare bothredmorrow2, so the line inserver.cfgis:cfgensure redmorrow2Decide who plays the clips. Either hand the dictionary and clip pairs from the animation list to your emote resource, or add your own client script.
Test exactly one dance first, before you copy 34 rows anywhere.
redmorrow2@dancewith the clipbellydancingis a good choice — 25.367 s, the longest in the pack, and impossible to miss on screen.
Installation and Scripting the pack walk through both routes in full.
What does the minimum client code look like?
Three natives, in this order:
local dict = 'redmorrow2@dance'
local clip = 'moonwalk'
RequestAnimDict(dict)
while not HasAnimDictLoaded(dict) do Wait(0) end
-- RDR3's TaskPlayAnim takes THIRTEEN arguments
TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 1, 0.0, false, 0, false, 0, false)A duration of -1 means no time limit. With the loop flag, the dance runs until something stops it.
Put a timeout on that wait
A clip asked for from a dictionary that never loaded fails silently — no console error, no warning, the character stands there doing nothing. An unbounded while not HasAnimDictLoaded(dict) do Wait(0) end turns that into a thread that spins forever and tells you nothing. Guard it with DoesAnimDictExist, give it a deadline, and print the dictionary name when you give up:
local function loadDict(dict)
if HasAnimDictLoaded(dict) then return true end
if not DoesAnimDictExist(dict) then return false end
RequestAnimDict(dict)
local deadline = GetGameTimer() + 5000
while not HasAnimDictLoaded(dict) do
if GetGameTimer() > deadline then return false end
Wait(0)
end
return true
endWhich argument is the flag word?
The seventh. RDR3's eScriptedAnimFlags values are not GTA V's, so a flag word copied out of a FiveM script will not mean the same thing here:
| Flag | Value |
|---|---|
LOOPING | 1 |
HOLD_LAST_FRAME | 2 |
NOT_INTERRUPTABLE | 4 |
UPPERBODY | 8 |
SECONDARY | 16 |
ABORT_ON_PED_MOVEMENT | 32 |
So: loop a dance with 1, play it once with 0, play it once and freeze on the last frame with 2. The platform notes under RedM cover the wider native differences.
Are they loops or one-shots?
Every one of the 34 rows is mode = 'loop'. There are no once and no hold entries in this build.
A dance therefore runs indefinitely once started, and your code decides when to clear it. mode maps to flags as 'loop' = 1, 'hold' = 2, 'once' = 0; with walk = true, add 8 + 16.
Can a player walk while dancing?
Flags 25 does that — LOOPING plus UPPERBODY plus SECONDARY, which is 1 + 8 + 16. The clip plays on the upper body in the secondary task slot and the legs keep walking.
TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 25, 0.0, false, 0, false, 0, false)Upper-body play looks wrong on this pack
These are full-body moves, and the twenty breakdance entries especially are mostly legs and floor work. Play one from the waist up and the lower half walks normally while the arms do something unrelated. No row sets walk = true, so offering flags 25 is a decision your own code makes per dance — check each one on screen before you expose it.
How do I stop a dance?
StopAnimTask(ped, dict, clip, 2.0) — the fourth argument is the blend-out speed and must be greater than 0. ClearPedTasks(ped, true, false) stops everything at once. If you played with the SECONDARY flag, also call ClearPedSecondaryTask(ped).
Release dictionaries you no longer need with RemoveAnimDict(dict), for example in onResourceStop.
How do I pick the male or female version?
Read the ped's type and compare the number. GET_META_PED_TYPE returns 0 for male and 1 for female, and 0 is truthy in Lua, so testing the result as a boolean gives every player the female version. IsPedMale may also return 0/1 rather than true/false on RedM, so a fallback has to handle both:
-- true when the ped uses the female body.
-- GET_META_PED_TYPE: 0 = male, 1 = female. Compare the number, 0 is truthy in Lua.
local function isFemale(ped)
if GetMetaPedType then
local ok, t = pcall(GetMetaPedType, ped)
if ok and t == 1 then return true end
if ok and t == 0 then return false end
end
local male = IsPedMale(ped)
return not (male == true or (type(male) == 'number' and male ~= 0))
end
local dict = isFemale(PlayerPedId()) and 'redmorrow2@dance@f' or 'redmorrow2@dance'Because the pack has exactly two dictionaries and the female one is the male name plus @f, appending the suffix is safe here. Full context is on Scripting the pack.
Why is Config.Clips nil in my script?
Because nothing ever loaded it. clips.lua is not in client_scripts or server_scripts — the manifest has neither block — so Config.Clips does not exist at runtime on either side, and clients never download the file. It is a reference document that happens to be valid Lua.
To read it programmatically, load it from disk yourself. LoadResourceFile is server-side, so the usual shape is to read it on the server and send the result to clients over an event:
-- Server side, in your resource. Returns redmorrow2's Config.Clips, or an empty table.
local function getDanceClips()
local src = LoadResourceFile('redmorrow2', 'clips.lua')
if not src then return {} end
local env = { Config = {} }
local chunk = load(src, '@redmorrow2/clips.lua', 't', env)
if not chunk or not pcall(chunk) then return {} end
return env.Config.Clips or {}
endThis works because clips.lua is listed in escrow_ignore and therefore stays readable on disk. The alternative is copying the 34 rows into your own resource and maintaining your copy. Both routes are on The clips.lua table.
Do the dances move the character?
No. All 34 rows carry rootMotion = false, the moonwalk included — it slides in place and the character does not travel. A dance started on a spot stays on that spot.
Why does a floor move snap to the ground?
Because it needs a slower blend-in than the rest. Six moves begin on the ground rather than standing, and clips.lua gives each of them blendIn = 2.0 — about half a second — instead of the 4.0 everything else uses, so the character eases down instead of dropping:
crossleg_freeze, flair_1, breakdance_footwork_1, breakdance_footwork_3, breakdance_footwork_to_freeze and breakdance_footwork_to_idle.
All six are in the breakdance group. If your emote menu exposes a blend-in setting, use 2.0 for these and leave everything else at 4.0. If it does not, they still play — they arrive hard. blendIn is the only optional field any row in this pack uses; see floor moves.
Why is one dance a single second long?
Because the clip really is 1 s. flair_1 is the shortest in the pack, and three more run under a second and a half: moonwalk at 1.033 s, wave_hip_hop_dance_1 at 1.167 s and breakdance_ready at 1.433 s.
Looped, a clip that short reads as a repeating beat rather than something with a beginning and an end. Look at those four on screen before you put them in a menu. The rest run up to 25.367 s, with a median of 4.133 s and 205.0 s across all 34 — the breakdown is under lengths.
The duration field is metadata only
Nothing reads it, because there is no code in the pack to read it and the file is never loaded. The numbers are what the author recorded in clips.lua. If a dance looks longer or shorter than the table says in game, trust the game and ask GET_ANIM_DURATION for the real figure.
Compatibility
Can I run it alongside the 27-dance pack?
Yes. The two packs use different dictionary names, so both can be started on the same server and neither overwrites the other's clips:
| Pack | Dictionaries |
|---|---|
| 30+ Dances | redmorrow2@dance, redmorrow2@dance@f |
| 24+ Dances | redmorrow_dance_24@ and three dnac@ dictionaries |
They are separate purchases and separate ensure lines. Running both gives your emote menu two sets of clips to point at, with no shared names to disambiguate.
Will it clash with another animation pack?
Only if that pack ships dictionaries under the same names, and redmorrow2@ is specific enough that it is unlikely.
What can clash is two resources animating the same character at once. Starting an animation clears the ped's tasks, so an emote menu and your own dance script will cancel each other. Stop one deliberately before starting the other. Animation Basics goes into that.
Can I add the dances to my emote menu?
Yes, and for most servers that is the easiest route. Every emote system needs the same three values — the dictionary, the clip name and a flag. Use flag 1 to loop, and take the pairs from the animation list.
If your menu supports one animation per gender, point it at redmorrow2@dance and redmorrow2@dance@f. If it does not, add the dance twice under separate labels, or use the male version for everyone and accept the fit.
For RedM Emotes specifically, see three ways to add an emote. Emote menus covers the general shape.
Why does grouping by category give me one list of 34?
Because category is a single flat value: all 34 rows read dance. The breakdance / hip hop / party split exists as prose in the resource's own server owner guide, not as a field you can read, so a menu built straight from category gets one undifferentiated list.
The grouping is exact and complete, which makes it worth applying by hand: 20 + 6 + 8 = 34, and every clip belongs to exactly one group. Either rewrite category in clips.lua or group the rows in your menu's own config. The three lists are on the animation list.
Can I use it on two servers?
Yes, as long as both servers run an sv_licenseKey belonging to the Cfx.re account that bought the pack. The resource is Asset Escrow protected and checks that, not the number of servers. A key from another account cannot start it.
Will it survive a server restart or a resource restart?
The dictionaries are streamed assets, so they come back with the resource. Who was dancing and which dance they had is state your own code owns — the pack stores nothing, because it runs nothing.
If you hold one of these dictionaries in your own resource, release it in your own onResourceStop. An animation left playing from a dictionary that has been unloaded underneath it is the usual cause of a frozen or T-posing character.
Editing and licensing
Can I edit the list?
Yes. escrow_ignore covers clips.lua, README.md, CHANGELOG.md and the three guides in docs/, so all of them ship readable and stay that way.
| Safe to edit | Leave alone |
|---|---|
label — the display name your menu shows | dict — must match the name stored inside the .ycd |
category — the menu group, and worth rewriting | clip — must match the clip name inside the dictionary |
mode, walk and blendIn — playback hints for your code | stream/*.ycd — protected binary assets |
Every row carries id, label, dict, clip, category, duration, mode, rootMotion and bodies, and six rows add blendIn. The header comment also documents walk and flags, which no row uses — they are there for you to add.
Editing clips.lua changes nothing on its own. The file is never loaded, so your emote menu does not see it either: copy the names into the menu's own config as well. The clips.lua table covers the format.
Can I rename the resource folder?
Yes. In CFX the resource name is the directory name. Out of the box the folder and the manifest name are both redmorrow2, so nothing disagrees to begin with.
Two things have to match the folder if you rename it:
- the
ensureline inserver.cfg— out of the box,ensure redmorrow2 - the first argument to
LoadResourceFile, if you readclips.luafrom your own resource
The dictionary names are baked into the .ycd files and have nothing to do with the folder name, so no dance cares either way.
Can I rename the .ycd files?
No. An RDR2 dictionary stores its own name inside the file. Renaming it only makes the file name and the dictionary name disagree, and that dictionary stops loading.
What does escrow protect?
The two .ycd files in stream/ and the .fxap file. Everything listed in escrow_ignore ships open, and with no scripts in the pack there is nothing else left to protect.
Do not edit any of the protected files, not even to add a comment — escrow refuses to start a protected file that has changed, and the fix is downloading the pack again from portal.cfx.re under Assets then Granted Assets. Upload over FTP in binary mode as well: ASCII mode corrupts protected files in transit.
The .fxap file is only in your download
It is produced when the resource is packaged, so it appears in the copy you download from the portal and not in the author's working copy. Its absence from a screenshot of a development folder is not a sign that something is missing from yours.
What may I not do with it?
In short: the pack is licensed for use on servers whose key belongs to the Cfx.re account that bought it, and it is not yours to pass on. Sharing, reselling, republishing or extracting the animation files is out, as is converting them for use on another platform.
This pack does not ship a separate licence file, so there is none to point you at. The terms that apply to you are the ones in docs/CUSTOMER_GUIDE.md inside your download, not anything this page could paraphrase — read that file, and for anything involving redistribution, bundling or resale, ask on the RedMorrow Discord and get an answer in writing.
What happens to my edits when the pack updates?
They are overwritten, unless you move them first. An update means replacing the whole folder, including clips.lua.
Keep a copy of your edited clips.lua outside the resource folder and diff it against the new one rather than pasting it back blind — a new version may have added dances or changed a field your copy does not know about. Do not mix files from two versions in one folder.
Still stuck? Troubleshooting sorts the common symptoms by cause. If that does not cover it, bring your server console output and the result of DoesAnimDictExist('redmorrow2@dance') to the RedMorrow Discord.