30+ Dances
34 dance animations for RedM — 20 breakdance moves, 6 hip hop dances and 8 party dances — streamed as two native RDR2 .ycd dictionaries, with a male version and a female version of every dance, listed in a readable clips.lua.
It is an asset pack. It streams the animations and tells you what they are called. It does not play them for you — there is no menu, no chat command, no keybind, no export and no event. In fact there is no script of any kind in the resource. The dances reach your players through an emote menu you already run, or through your own code.
No framework No database 34 dances Male and female All looping 2.9 MB Asset pack — no menu No scripts at allThe 60-second version
Unzip into
resources, keeping the folder nameredmorrow2:textresources/[animations]/redmorrow2Add one line to
server.cfg:cfgensure redmorrow2Position does not matter. Before your emote menu is a good habit.
Restart, or from the server console:
textrefresh ensure redmorrow2Check the server console. The pack ships no scripts, so it prints no message of its own. The only line you get is the ordinary CFX one:
textStarted resource redmorrow2
No framework, no database, no SQL, no build step. One ensure line and nothing else.
The folder on disk is redmorrow2 and the name field in fxmanifest.lua is redmorrow2 as well, so the two agree and ensure redmorrow2 is the whole of it. Strip a version suffix like redmorrow2-1.0.0 before adding the line, and remove the extra folder level that unzipping sometimes leaves behind — resources/redmorrow2/fxmanifest.lua has to exist.
Nothing happens in game yet, and that is correct
That console line is the only confirmation the pack gives you. There is no key to press and no command to type. Until an emote menu or your own code calls TaskPlayAnim, the two dictionaries sit on the client unused.
Go to Emote menus or Scripting the pack next.
Your server key needs asset packs enabled
The manifest declares dependency '/assetpacks', a Cfx.re licence-key entitlement check. Without it the resource refuses to start, and nothing in the resource can work around it. See Installation.
This is an asset pack with no front end
This is the thing most worth knowing before you install it. The resource is a manifest, a data file, two animation files and some markdown:
fxmanifest.lua | cerulean, rdr3, lua54 'yes', rdr3_warning. Declares dependency '/assetpacks' and an escrow_ignore list. No client_scripts and no server_scripts |
clips.lua | A data table and nothing else — 34 rows, all 34 live. The manifest never loads it |
stream/ | 2 .ycd dictionaries, 2.9 MB total |
README.md, CHANGELOG.md, docs/*.md | Readable, and accurate for this build |
There is no client.lua, no server.lua, no config.lua and no html/ folder. So:
| Not in this pack | Consequence |
|---|---|
| No client script | Nothing requests a dictionary or calls TaskPlayAnim. No dance can play on its own |
| No server script | The pack prints no startup banner. You get Started resource redmorrow2 and that is all |
| No menu, no NUI | Players have nothing to open |
No RegisterCommand | There is no chat command |
| No key binding | There is no key to press |
| No exports | exports['redmorrow2'] has no methods on it |
| No events | Nothing to trigger from the server or from another client script |
No config.lua | There are no settings to change. Everything tunable lives in clips.lua |
stream/ still works because CFX picks that folder up automatically, without a manifest entry. That is the whole mechanism by which a pack with no scripts does anything at all.
The sibling 30+ Female Poses pack does ship a menu and can be handed to players as-is. This one cannot. If you were expecting the same shape, that is the difference. 100+ Female Poses and 24+ Dances are assets-only like this one.
There are two routes to actually using it:
| Route | Page |
|---|---|
| Feed the 34 clip names into an emote menu you already run | Emote menus |
| Write a few lines of Lua that play a clip by dictionary and clip name | Scripting the pack |
The minimum that puts a dance on screen, in a client script of your own:
local dict, clip = 'redmorrow2@dance', 'moonwalk'
CreateThread(function()
if not DoesAnimDictExist(dict) then
print('no such dictionary — is redmorrow2 started?')
return
end
RequestAnimDict(dict)
local timeout = GetGameTimer() + 5000
while not HasAnimDictLoaded(dict) do
if GetGameTimer() > timeout then
print('dictionary did not load in time')
return
end
Wait(0)
end
TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 1, 0.0, false, 0, false, 0, false)
end)Stop it with StopAnimTask(ped, dict, clip, 2.0) — the blend-out speed has to be greater than 0 — or ClearPedTasks(ped, true, false). Add ClearPedSecondaryTask(ped) if you played with the SECONDARY flag. Release the dictionary with RemoveAnimDict(dict) when you are finished with it, for example in onResourceStop.
RDR3's TaskPlayAnim takes thirteen arguments
Its flag values are different numbers meaning different things from GTA V's, so a flag word copied from a FiveM script will not do what it says there. 1 is LOOPING here. Duration -1 means no time limit, so with the loop flag the dance runs until something stops it.
A clip requested from a dictionary that never loaded fails silently — the character stands there doing nothing, with no error anywhere. Always guard with DoesAnimDictExist, then wait on HasAnimDictLoaded with a timeout, as above. Full argument list and flag table on Scripting the pack.
clips.lua is never loaded, on either side
The manifest has no client_scripts and no server_scripts entries at all, so nothing in CFX ever executes clips.lua. Config.Clips does not exist at runtime — not in your resource, and not in redmorrow2 either, because redmorrow2 has no Lua state of its own. Clients never download the file. It is a reference document that happens to be valid Lua.
To read the list programmatically you load it from disk yourself. LoadResourceFile is server-side, so the usual shape is to read it on the server and send it to clients over an event:
-- 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 {}
endThat works because clips.lua is in escrow_ignore and therefore still plain text on disk. LoadResourceFile takes the resource name, which is redmorrow2. The full pattern, with the client half, is on The clips.lua table.
What is actually in it
| Dances | 34 — 20 breakdance, 6 hip hop, 8 party |
Rows in clips.lua | 34, all live. Nothing is commented out |
| Stream files | 2 .ycd, 2.9 MB total |
| Format | Native RDR2 .ycd (RSC8 v58) |
| Bodies | A male and a female version of every dance |
| Mode | Every row is loop |
| Root motion | None. No dance moves the character |
| Total runtime | 205.0 s across all 34 |
| Scripts | None, on either side |
Both dictionaries the rows name are present in stream/, and both files in stream/ belong to live rows — nothing missing, nothing orphaned. The full table, with the clip name and length of all 34, is on the dance list.
The count on the label is honest
"30+" means 34. All 34 rows are live, both dictionaries are present, and every clip name resolves. This pack is not short of its name.
Requirements
| Required | ||
|---|---|---|
| RedM server | Yes | A current build. Old builds cannot load escrow-protected resources |
| Asset packs | Yes | The manifest declares dependency '/assetpacks' |
| An emote menu, or your own code | Yes | The pack cannot play a dance by itself |
| Framework | No | VORP, RSG, RedEM:RP or none — it looks for nothing |
| Database | No | No SQL, no server-side state |
| OneSync | No | Nothing is synchronised by the pack |
Every dance loops, stays in place, and ships in both bodies
All 34 rows agree on two things, which keeps the integration simple:
mode = 'loop'. There is not one once or hold row. Play them with duration -1 and flag 1, and clear the task to stop. mode maps to flags as 'loop' = 1, 'hold' = 2, 'once' = 0; with walk = true you would add 8 + 16.
rootMotion = false. No dance walks, turns or slides the character, the moonwalk included. Where you start the clip is where the character stays.
Each row carries id, label, dict, clip, category, duration, mode, rootMotion and bodies, and six rows add blendIn. The clips.lua header also documents optional walk and flags keys; no row in this build sets either. label, category and mode are yours to rename — dict and clip are not, because they have to match the names stored inside the .ycd files.
Upper-body play looks wrong on these
The flag combination 1 + 8 + 16 = 25 loops a clip on the upper body only so the player can keep walking. It is a useful trick for greetings and smoking animations. These are full-body moves, breakdance especially, so the lower half keeps walking while the torso dances. Play them full body.
Both bodies, every dance
| Body | Dictionary |
|---|---|
| Male | redmorrow2@dance |
| Female | redmorrow2@dance@f |
Two dictionaries, and there are no exceptions. All 34 dances are in both, under identical clip names. In every row bodies.male equals dict, and bodies.female is that name plus @f. There are no per-dance dictionaries to look up, which is the single thing that makes this pack quicker to wire up than most — see Two dictionaries, that is all.
Both versions play on either body; the matching one fits better. Picking between them in code has one trap worth knowing up front:
-- true when the ped uses the female body.
-- GET_META_PED_TYPE: 0 = male, 1 = female. Compare the NUMBER — 0 is truthy in Lua.
-- Falls back to IS_PED_MALE, which RedM may return as 0/1 rather than a boolean.
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))
endIf your emote menu cannot pick a dictionary per body, add the dance twice (for example "Moonwalk (M)" and "Moonwalk (F)"), or use the male version for everyone. See Emote menus.
The three groups are prose, not data
The pack divides into 20 breakdance moves, 6 hip hop dances and 8 party dances, and that division is worth keeping — 20 + 6 + 8 = 34, and every clip falls in exactly one group.
It is not a field you can read, though. Every row carries category = 'dance', a single flat category for all 34. The split comes from the resource's own server owner guide. A menu built straight from category gets one undifferentiated list of 34 entries.
So either rewrite category in clips.lua — an edit the licence allows and the most worthwhile one in the file — or group the clips in your menu's own config. The per-group tables are on the dance list.
Six moves start on the floor
crossleg_freeze, flair_1, breakdance_footwork_1, breakdance_footwork_3, breakdance_footwork_to_freeze and breakdance_footwork_to_idle begin on the ground rather than standing. Those six rows set blendIn = 2.0 — about half a second — instead of the 4.0 everything else uses, so the character eases down to the floor instead of snapping to it.
All six are in the breakdance group. If your emote menu exposes a blend-in setting, use 2.0 for these and leave the rest at 4.0. If it does not, they still play, they just arrive hard. blendIn is the only optional field this pack uses. Details on Floor moves.
Clean naming, nothing to design around
Every row has id equal to clip. No id, clip name or label is repeated anywhere in the pack. That means the clip name is the id, there is nothing to derive, and a menu keyed on clip name alone cannot collide with itself.
Never rename a .ycd file
An RDR2 dictionary stores its own name inside the file. Renaming the file does not rename the dictionary — it only makes the two disagree, and that dictionary becomes unreachable.
Durations
The duration field spans 1 s to 25.367 s, with 205.0 s of animation in total. flair_1 is the shortest at 1 s and bellydancing the longest at 25.367 s.
Four clips run under a second and a half — flair_1, moonwalk (1.033 s), wave_hip_hop_dance_1 (1.167 s) and breakdance_ready (1.433 s). They are moves rather than routines, and looped they read as a repeating beat rather than as something with a beginning and an end. Worth looking at on screen before you put them in a player-facing menu.
duration is metadata, and nothing reads it
It is a number written into clips.lua by hand, and the manifest never loads that file, so no code consults it anywhere. If a dance looks like it runs longer or shorter than the table says, trust the game — GET_ANIM_DURATION gives the real figure. Full list on the dance list.
Escrow, and what you can edit
The resource is protected with Cfx.re Asset Escrow. It starts only on a server whose sv_licenseKey belongs to the Cfx.re account that bought it; a key from another account cannot start it. Download it from portal.cfx.re under Assets then Granted Assets, and if you upload over FTP, use binary mode — ASCII mode corrupts the protected files.
escrow_ignore covers clips.lua, README.md, CHANGELOG.md and docs/*.md, so those ship readable and stay editable after escrow.
| Editable | Leave alone |
|---|---|
clips.lua — label, category, mode, and adding walk, flags or blendIn | dict and clip, which must match the names inside the .ycd |
README.md, CHANGELOG.md, docs/*.md | stream/*.ycd and the .fxap file |
Editing a protected file stops the resource starting
Escrow refuses to start a changed protected file, with Failed to verify protected resource in the console. If you hit that, download the folder again and re-upload in binary mode. The .fxap file arrives with the customer download and is not present in a development copy, so do not be surprised to see it appear.
Editing clips.lua does not change your emote menu, either. It is a reference list the resource never reads: whatever you rename there also has to be renamed in your menu's own config.
What you may and may not do with the animations is set out in the customer guide inside the download, under "What you may and may not do". In short: use it on servers keyed to your own Cfx.re account, edit clips.lua and the documentation freely, and do not share, resell or extract the animation files.
Runtime cost
Nothing. There are no scripts, so there is nothing to register a loop or a thread — the resource reads 0.00 ms on both the client and the server resource monitor, and there is no server-side state at all. Players download about 3 MB of animation files the first time they join and the files are cached after that. A dictionary only occupies memory once someone plays a dance from it.
It runs alongside the 27-dance pack
redmorrow2 and rm_dance_24 use different dictionary names, so both can be started on the same server with no conflict. The other pack is documented at 24+ Dances.
Where to go next
| Page | What's in it |
|---|---|
| Installation | Requirements, the folder name, the asset-pack check, verifying the dictionaries streamed |
| Scripting the pack | The 13-argument TaskPlayAnim call, loading a dictionary safely, RDR3 flags, stopping cleanly |
| Dance list | All 34 with clip name and length, grouped |
| Emote menus | Getting the 34 clip names into the menu you already run, including both bodies |
| The clips.lua table | Every field, what is safe to change, reading the list off disk from your own resource |
| Troubleshooting | Symptom to cause to fix, including the silent failures |
| FAQ | The questions that come up first |
Related reading: Animation Basics for how RedM streams .ycd dictionaries, RedM Emotes if you want a menu to put these in — its three ways to add an emote applies directly — and RedM platform notes for how RDR3 differs from FiveM.
Support
RedMorrow Discord. Bring your server console output and whether DoesAnimDictExist('redmorrow2@dance') returns true on your client.
Version 1.0.0.