Skip to content

24+ Dances FAQ ​

The questions this pack raises most often, starting with the count on the label and the menu that is not in the box.

Before you buy ​

How many dances are there? ​

27. Twenty-four main dances plus three bonus dances.

All 27 rows in clips.lua are live. Nothing is commented out, and every dictionary a row names is present in stream/, so there are no broken entries and no dead files. The "24+" on the label is 24 plus 3, and the count is not short.

The full table is on the animation list, with the three bonus dances in their own section.

Is it a script or an asset pack? ​

An asset pack, plus a reference table telling you what is in it.

That is the whole resource:

FileWhat it is
stream/8 .ycd animation dictionaries, 4.0 MB total
clips.luaA data table. 27 rows, all live. No logic
server.luaOne line. It prints a start-up message
fxmanifest.luaDeclares the two scripts and dependency '/assetpacks'
README.md, CHANGELOG.md, LICENSE.md, docs/Notes, version history, licence, and three guides

Does it include a menu, a command or exports? ​

No. There is no menu, no chat command, no keybind, no events, no exports and no config options. clips.lua is a data file and server.lua prints one line, so there is nothing to open, nothing to type and nothing to call.

That is the difference between this pack and the sibling pose pack that does ship a front end:

24+ Dances30+ Female Poses
Streamed .ycd dictionariesYesYes
In-game menuNoYes
Chat commandNoYes
ExportsNoYes
Config optionsNoYes
Male and female versionsYesFemale 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 eight 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 27 dances. This is the pack's main advantage over the two pose packs, which are female only.

The female dictionary is always the male name plus @f, with identical clip names inside:

BodyDictionary
Maleredmorrow_dance_24@dance
Femaleredmorrow_dance_24@dance@f

Both play on either body. The matching one fits better. The three bonus dances each have their own pair — see every dance has two dictionaries.

Do I need a framework or a database? ​

Neither. VORP, RSG, RedEM:RP or no framework at all — the resource never looks for one. There is no SQL, nothing is saved, and OneSync is not required either.

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 roughly ten lines of your own client script. With neither, this pack streams 4 MB to every player and does nothing visible.

What do I actually need? ​

A RedM serverAn up-to-date build. Old builds cannot load escrow-protected resources
Asset packs on your licence keyRequired. The manifest declares dependency '/assetpacks'
A way to play clipsRequired. An emote resource, or your own script
FrameworkNot required
DatabaseNot required
OneSyncNot 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 resource runs no loops and no threads, and its only server-side code is a single print, so it costs 0.00 ms on both the client and the server.

Players download about 4 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, and the first play of that dictionary 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'. The animations do not exist in GTA V.

Using it ​

I installed it and nothing happens. What now? ​

Confirm the resource started, then pick who plays the clips.

  1. Check the console. A started pack prints:

    text
    [redmorrow_dance_24] Dance animation pack started.

    That is the name field from fxmanifest.lua, not your folder name, so the two reading differently is expected.

  2. Install it so the dictionaries stream. The folder is rm_dance_24, so the line in server.cfg is:

    cfg
    ensure rm_dance_24
  3. Decide who plays the clips. Either hand the dict and clip pairs from the animation list to your emote resource, or add your own client script.

  4. Test exactly one dance first, before you copy 27 rows anywhere. redmorrow_dance_24@dance / samba_dancing is a good choice — an 18.2 s loop with no naming surprises.

Installation and Playing a dance walk through both routes in full.

What does the minimum client code look like? ​

Three natives, in this order:

lua
local dict = 'redmorrow_dance_24@dance'
local clip = 'samba_dancing'

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 requested 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. Give it a deadline and print the dictionary name when you give up:

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

Which argument is the flag word? ​

The seventh. RDR3's flag values are not GTA V's, so a number copied out of a FiveM resource will not mean there what its name suggests:

FlagValue
LOOPING1
HOLD_LAST_FRAME2
NOT_INTERRUPTABLE4
UPPERBODY8
SECONDARY16
ABORT_ON_PED_MOVEMENT32

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 27 rows is mode = 'loop'. There are no once and no hold entries in this build.

A dance therefore runs indefinitely once started, and it is your code that 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? ​

Yes, with flags 25 — LOOPING plus UPPERBODY plus SECONDARY, which is 1 + 8 + 16. The dance plays on the upper body in the secondary task slot and the legs keep walking.

lua
TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 25, 0.0, false, 0, false, 0, false)

No row in this pack sets walk = true itself, so this is a decision your own code makes per dance. Dances with a lot of leg work look wrong from the waist down when played this way, so check each one on screen before you offer 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 it 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:

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.
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 function dictFor(entry, ped)
    if entry.bodies then
        local want = isFemale(ped) and 'female' or 'male'
        return entry.bodies[want] or entry.bodies.male or entry.bodies.female
    end
    return entry.dict
end

Because bodies.female is always bodies.male plus @f in this pack, appending @f works too. Reading bodies is the safer habit.

Do the dances move the character? ​

No. All 27 rows carry rootMotion = false. Nothing here walks, turns or slides the character off its mark, so a dance started on a spot stays on that spot.

How do I work out a dance's dictionary? ​

Read it out of clips.lua, and key on the id rather than the clip name.

Twenty-six rows have id equal to clip. One does not: jazz_dancing_2 is the clip jazz_dancing inside dnac@jazz_dancing. And jazz_dancing is also a different dance — the clip jazz_dancing inside redmorrow_dance_24@dance.

Two different dances share the clip name jazz_dancing

A menu that keys rows on the clip name alone collides on these two and silently keeps one. Key on id, or on the dictionary and clip together. This is the only duplicated clip name and the only row whose id differs from its clip — see the 3 bonus dances.

Why is one dance half a second long? ​

Because the clip really is 0.5 s. breakdance_1990_2 is the only entry under a second, and the next shortest is 2.033 s.

Looped, a 0.5 s clip reads as a fast repeating twitch rather than a dance you would leave running. Look at it on screen before you put it in a menu. The rest run up to 27.867 s, with a median of 8.833 s and 299.3 s across all 27 — the breakdown is under lengths.

The duration field is metadata only

Nothing in the pack reads it, because there is no code to read it. 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 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 redmorrow_dance_24@dance and redmorrow_dance_24@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.

Will it clash with another animation pack? ​

Only if that pack uses the same dictionary names. The 24 main dances live under redmorrow_dance_24@, and the three bonus dances under dnac@chicken_dance, dnac@jazz_dancing and dnac@dancing_twerk.

Those three dnac@ names are shared ground — another dance pack carrying its own copies of the same vanilla-style dictionaries would collide with them. The sibling pose packs use redmorrow@ and redmorrow_com@, so neither clashes with this one.

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 another resource read Config.Clips? ​

Not directly. Config.Clips is a global inside rm_dance_24, and CFX gives every resource its own Lua state. There are no exports to hand it over.

Two ways around that:

  • Copy the 27 rows into your own resource and maintain your copy.
  • Load the file into a sandbox and read it back. clips.lua is listed in escrow_ignore, so it stays readable on disk:
lua
-- Returns rm_dance_24's Config.Clips, or an empty table.
local function getDanceClips()
    local src = LoadResourceFile('rm_dance_24', 'clips.lua')
    if not src then return {} end
    local env = { Config = {} }
    local chunk = load(src, '@rm_dance_24/clips.lua', 't', env)
    if not chunk or not pcall(chunk) then return {} end
    return env.Config.Clips or {}
end

LoadResourceFile takes the folder name, so rename the folder and this string has to change with it. The clips.lua table covers both routes.

Why does grouping by category give me one huge group? ​

Because the category field is lopsided: 24 rows read dance in lowercase, and the three bonus rows carry their own title-case names — Chicken Dance, Jazz Dancing and Dancing Twerk, one row each.

A menu built straight from category therefore gets one group of 24 and three groups of one, with inconsistent capitalisation between them. Rewriting the field is allowed and is the most worthwhile edit you can make. See categories.

Can I use it on two servers? ​

Yes, as long as both servers run a 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.

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, the three guides in docs/, README.md, CHANGELOG.md and LICENSE.md, so all of them ship readable and stay that way.

Safe to editLeave alone
label — the display name your menu showsdict — must match the name stored inside the .ycd
category — the menu group, and worth rewritingclip — must match the clip name inside the dictionary
mode and walk — playback hints for your codestream/*.ycd — protected binary assets

Each row carries exactly these fields: id, label, dict, clip, category, duration, mode, rootMotion and bodies. The comment header also documents walk, flags and blendIn, but no row in this build uses them — they are there for you to add.

Editing clips.lua does not change your emote menu. It is a reference list, so copy the names into your menu's own config as well.

Can I rename the resource folder? ​

Yes. In CFX the resource name is the directory name, and the name 'redmorrow_dance_24' line in fxmanifest.lua is metadata that renames nothing.

Two things have to match the folder:

  • the ensure line in server.cfg — out of the box, ensure rm_dance_24
  • the first argument to LoadResourceFile, if you read clips.lua from your own resource

The start-up message prints [redmorrow_dance_24] because that is the manifest name. Do not copy it into your server.cfg. 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 dance stops loading.

What does escrow protect? ​

server.lua, the eight .ycd files in stream/ and the .fxap file. Everything else is listed in escrow_ignore and ships open.

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. Upload over FTP in binary mode as well — ASCII mode corrupts protected files in transit.

What may I not do? ​

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 reverse engineering them for use elsewhere.

The terms that actually apply to you are the ones in LICENSE.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('redmorrow_dance_24@dance') to the RedMorrow Discord.

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