Skip to content

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 all

The 60-second version ​

  1. Unzip into resources, keeping the folder name redmorrow2:

    text
    resources/[animations]/redmorrow2
  2. Add one line to server.cfg:

    cfg
    ensure redmorrow2

    Position does not matter. Before your emote menu is a good habit.

  3. Restart, or from the server console:

    text
    refresh
    ensure redmorrow2
  4. Check 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:

    text
    Started 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.luacerulean, rdr3, lua54 'yes', rdr3_warning. Declares dependency '/assetpacks' and an escrow_ignore list. No client_scripts and no server_scripts
clips.luaA 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/*.mdReadable, and accurate for this build

There is no client.lua, no server.lua, no config.lua and no html/ folder. So:

Not in this packConsequence
No client scriptNothing requests a dictionary or calls TaskPlayAnim. No dance can play on its own
No server scriptThe pack prints no startup banner. You get Started resource redmorrow2 and that is all
No menu, no NUIPlayers have nothing to open
No RegisterCommandThere is no chat command
No key bindingThere is no key to press
No exportsexports['redmorrow2'] has no methods on it
No eventsNothing to trigger from the server or from another client script
No config.luaThere 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:

RoutePage
Feed the 34 clip names into an emote menu you already runEmote menus
Write a few lines of Lua that play a clip by dictionary and clip nameScripting the pack

The minimum that puts a dance on screen, in a client script of your own:

lua
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:

lua
-- 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 {}
end

That 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 ​

Dances34 — 20 breakdance, 6 hip hop, 8 party
Rows in clips.lua34, all live. Nothing is commented out
Stream files2 .ycd, 2.9 MB total
FormatNative RDR2 .ycd (RSC8 v58)
BodiesA male and a female version of every dance
ModeEvery row is loop
Root motionNone. No dance moves the character
Total runtime205.0 s across all 34
ScriptsNone, 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 serverYesA current build. Old builds cannot load escrow-protected resources
Asset packsYesThe manifest declares dependency '/assetpacks'
An emote menu, or your own codeYesThe pack cannot play a dance by itself
FrameworkNoVORP, RSG, RedEM:RP or none — it looks for nothing
DatabaseNoNo SQL, no server-side state
OneSyncNoNothing 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 ​

BodyDictionary
Maleredmorrow2@dance
Femaleredmorrow2@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:

lua
-- 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))
end

If 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.

EditableLeave alone
clips.lua — label, category, mode, and adding walk, flags or blendIndict and clip, which must match the names inside the .ycd
README.md, CHANGELOG.md, docs/*.mdstream/*.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 ​

PageWhat's in it
InstallationRequirements, the folder name, the asset-pack check, verifying the dictionaries streamed
Scripting the packThe 13-argument TaskPlayAnim call, loading a dictionary safely, RDR3 flags, stopping cleanly
Dance listAll 34 with clip name and length, grouped
Emote menusGetting the 34 clip names into the menu you already run, including both bodies
The clips.lua tableEvery field, what is safe to change, reading the list off disk from your own resource
TroubleshootingSymptom to cause to fix, including the silent failures
FAQThe 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.

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