Skip to content

Installing Everyday Animations ​

Installing this pack is one line in server.cfg. Getting an animation onto a character takes one more thing, because the pack has no menu, no command and no key binding — read What you still need before you call the job done.

What you install is 38 .ycd files and a reference table. The server script is a single print, and there is no code anywhere in the resource that plays a clip. That is the normal shape for an asset pack, and it is what makes Check it worked the section to read carefully: the console line you get on start proves less than it looks like it does.

Requirements ​

Required
RedM serverYesOn a current server build. The manifest declares fx_version 'cerulean' and lua54 'yes'
Asset packsYesThe manifest declares dependency '/assetpacks'
FrameworkNoVORP, RSG, RedEM:RP or none. The pack never touches one
DatabaseNoThe only server script is a single print
OneSyncNoNothing is replicated and nothing is stored
An emote menu or your own scriptIn practice, yesNothing in the pack plays an animation. Something has to call the natives

That last row is the one that surprises people. The 94 animations are all present and all playable, but the thing that plays them is yours.

Asset packs is a real entitlement check, not boilerplate

dependency '/assetpacks' is checked by Cfx.re against your server's licence key. This pack streams 38 files, so the requirement is genuine.

Without the entitlement the resource starts and nothing streams, so no animation plays. That failure is quiet: your menu opens, your command answers, and the character stands still. It is the most common cause of "the list works but nothing happens" on a pack like this. Enable asset packs for your key in the Cfx.re portal before you debug anything else.

No npm, no build step, no SQL import, no extra resources.

Install ​

  1. Unzip the download into a folder your server loads resources from. As it arrives the folder is rm_everyday_v1:

    text
    resources/[animations]/rm_everyday_v1
    resources/[standalone]/rm_everyday_v1

    Keep the name lowercase and without spaces, and strip any version suffix the unzip adds, such as rm_everyday_v1-1.0.0. You may rename the folder, as long as the ensure line follows it — see Folder name, resource name and the dictionary names.

  2. Check for a doubled folder level. Unzipping into a folder you already named creates rm_everyday_v1/rm_everyday_v1/, which the server reads as an empty resource. The test is one path:

    text
    resources/[animations]/rm_everyday_v1/fxmanifest.lua

    If fxmanifest.lua is not directly inside the folder you point ensure at, move the inner folder up a level.

  3. Add one line to server.cfg:

    cfg
    ensure rm_everyday_v1

    Order barely matters. There is one print on the server and no database to wait on, and stream/ is mounted by the platform itself. The one case worth respecting is an emote resource that reads dictionaries while it starts: put this line before or alongside it.

  4. Restart the server, or from the server console:

    text
    refresh
    ensure rm_everyday_v1

A correct tree ​

There is no config.lua, no client.lua and no html/ folder, and none of them are missing. The pack does not have them:

text
rm_everyday_v1/
  fxmanifest.lua
  clips.lua
  server.lua
  README.md
  CHANGELOG.md
  docs/
  stream/
    rm@casual_actions.ycd
    rm@[email protected]
    rm@communication_gestures.ycd
    rm@[email protected]
    ... 38 in total, about 4.7 MB

Nineteen dictionaries, each shipping as a male and a female file, which is where 38 comes from. None is missing and none is unused — every dictionary named in clips.lua has both of its files on disk. The pairing rule is on the animation list.

The Markdown files inside the download, at the root and in docs/, were written alongside development and describe a fuller build than the one you have. Where they disagree with these pages, these pages were written from the Lua.

Folder name, resource name and the dictionary names ​

Three names are in play here and they are not the same thing, so it is worth being precise about which one the server uses.

In CFX, the resource name is the directory name. The name field in fxmanifest.lua is descriptive metadata; it renames nothing, and the server never loads a resource by it. This manifest says name 'rm' while the folder says rm_everyday_v1, and the folder is the one that counts.

So there is exactly one rule:

The ensure line must match the folder on disk

Nothing else. If the folder is rm_everyday_v1, write ensure rm_everyday_v1. If you rename it to something shorter, write that instead.

Folder on diskLine in server.cfgWorks
rm_everyday_v1ensure rm_everyday_v1Yes
rm_everydayensure rm_everydayYes
rm_everyday_v1ensure rmNo — there is no resource by that name
rm_everyday_v1-1.0.0ensure rm_everyday_v1No — rename the folder first

Renaming is safe here, and that is worth saying plainly: nothing in the pack is keyed to the folder name. There is no command, no key binding and nothing for another resource to call, so a rename cannot break an interface that does not exist. Pick a name, keep it, and keep the ensure line matching.

The dictionary names are a separate matter again. Every dictionary is rm@…, and that prefix comes from inside the .ycd files themselves, not from the resource. Renaming the folder to taco would still leave you playing rm@salute.

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 one dictionary becomes unreachable while the other 18 keep working. If one group of animations fails and the rest are fine, this is almost always why.

If you need different dictionary names, they have to be changed at export time, not on disk.

Check it worked ​

On start, server.lua prints one line to the server console:

text
[rm] Animation pack started.

That line is hardcoded, so it says rm whatever you named the folder.

The console line proves the resource mounted, and nothing more

It tells you the folder was found, the manifest parsed and the resource started. It does not prove a .ycd reached a client, and it cannot prove an animation will play, because the pack contains no code that plays one.

The next check is client-side. In the F8 console in game:

lua
DoesAnimDictExist('rm@salute')

true means the dictionary streamed to your client. false means the resource is not started, you never ran refresh after copying the folder in, or the asset-pack entitlement is missing.

The pack ships no command to test with, so the only check that proves the whole chain is playing a clip from your own code. Paste this into F8 — it reports the failure instead of leaving you looking at a character who is doing nothing:

lua
CreateThread(function()
    local dict, clip = 'rm@salute', 'salute'
    if not DoesAnimDictExist(dict) then
        print('FAILED: ' .. dict .. ' does not exist. Is the resource started?')
        return
    end
    RequestAnimDict(dict)
    local deadline = GetGameTimer() + 5000
    while not HasAnimDictLoaded(dict) do
        if GetGameTimer() > deadline then
            print('FAILED: ' .. dict .. ' never loaded')
            return
        end
        Wait(0)
    end
    TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 1, 0.0, false, 0, false, 0, false)
    print('SUCCESS: salute is playing. ClearPedTasks(PlayerPedId()) to stop it.')
end)

To stop it:

lua
ClearPedTasks(PlayerPedId())

The timeout in that script matters. A clip asked for from a dictionary that never loaded fails silently — no error, no red line, the character stands there. Always guard with DoesAnimDictExist, always wait on HasAnimDictLoaded, and always give the wait a deadline.

Two details in the TaskPlayAnim call are worth noting now rather than debugging later. RDR3's TaskPlayAnim takes thirteen arguments, and its flag values are not GTA V's — a flag word copied out of a FiveM script does not mean the same thing here. Treat 1 as the known-good starting point and verify any variant in game. The -1 is the duration, meaning no time limit, so with a looping flag the clip runs until something stops it. The full argument list is on Playing an animation.

On a female character, swap the dictionary for rm@salute@f. The clip name does not change — that holds on all 94 rows, so choosing a body is a dictionary swap rather than a lookup.

Verification checklist ​

StepHowExpected
Asset packsServer console on startNo entitlement error
Resource mountedServer console after ensure[rm] Animation pack started.
Male dictionary streamedDoesAnimDictExist('rm@salute') in F8true
Female dictionary streamedDoesAnimDictExist('rm@salute@f') in F8true
An animation playsThe script above, in F8The character salutes
Stop worksClearPedTasks(PlayerPedId())The character returns to idle

Then run the same test through whatever will actually drive the pack in production — your own code or your emote menu — because that is the layer the pack does not supply.

Common install mistakes ​

MistakeSymptomFix
Asset packs not enabledThe resource starts, nothing streams, nothing playsEnable asset packs on your Cfx.re key
ensure name and folder name disagreeCouldn't find resource in the consoleMake the line match the folder
Doubled folder levelSamefxmanifest.lua must be directly inside the folder
Version suffix left on the folderSameRename the folder
Forgot refreshDictionaries missing after copying the folder inrefresh, then ensure
Renamed a .ycdOne group of animations fails, the rest workRestore the original name
Typo in a dictionary nameNothing plays, no errorCopy the name from the animation list
Waiting for a menu or a commandNothing happens on any keyThere is none. See below
Expecting FiveMNothing loads at allThese are RDR2 .ycd files. RedM only

What you still need ​

This is the honest part of the page, and it is better read now than discovered after a restart.

You haveYou do not have
38 streamed .ycd dictionaries, 19 pairsAn in-game menu
94 animations, each with a male and a female versionA chat command
A readable, editable clips.luaA key binding
A server console line on startAny exports or events
Any config options
Any client-side code that plays a clip

So one more step is needed before players can use the pack, and there are two routes:

  • Feed the pairs to the emote menu you already run. The dictionary and clip values from the animation list go straight into an emote table. RedM Emotes takes them — see three ways to add an emote. Other emote systems work the same way with their own table format. Worked examples are on Integrating.
  • Or write the few lines yourself. RequestAnimDict, wait for HasAnimDictLoaded, then TaskPlayAnim, and ClearPedTasks to end it. Walked through on Playing an animation.

Three things to know before you build either one.

Picking the body is yours to do. Request dict for a male ped or dict .. '@f' for a female one. IsPedMale is reliable on standard multiplayer and story peds and can be wrong on heavily customised ones, so prefer your own server's character-sex field where you have one. Either version plays on either body; the matching one fits better.

Some rows need handling. Five animations are single-frame poses that flash and vanish unless they hold, four move the character and want full-body play and a little space, and two ids appear twice. All of them are listed under Special cases.

Config.Clips is not readable from another resource. clips.lua is a client script in this pack, so the table does exist on the client at runtime — but it is a global inside this resource, and CFX gives every resource its own Lua state. Your script cannot see it however it asks. Copy the rows into your own resource, or add your own client script to this one. Both are on Integrating.

About the clip list in the download ​

clips.lua holds all 94 rows, and 15 of them are live while 79 are commented out — the 15 greetings are active and the four larger blocks are not.

Nothing is missing from your download, and this is worth being exact about. All 38 .ycd files are present, and every one of the 94 clip names resolves inside them. An emote menu handed a dictionary and a clip name plays any of the 94 today. Nothing in the pack reads the table either, so the split has no effect at runtime.

It matters in one case: copying rows out of clips.lua instead of out of the animation list. Then you get 15 rows and wonder where the rest went.

Uncommenting the blocks does not merge them

The file contains five Config.Clips = { statements. Each one assigns, so it replaces whatever the previous one set rather than adding to it. Uncomment all four blocks and you are left with the contents of the last one alone, silently, with no error anywhere.

Merge the rows into a single table instead, and resolve the two duplicate ids at the same time. The clips.lua file walks through it, and the duplicates are on the animation list.

Updating ​

  1. Back up your clips.lua if you edited it. escrow_ignore covers clips.lua and the .ycd files, so the clip list ships readable and editable — and a fresh copy will overwrite your labels, categories, modes and any rows you uncommented or merged.

  2. Stop the resource, or stop the server.

  3. Replace stream/, fxmanifest.lua and server.lua with the new versions, keeping the folder name the same so your ensure line still matches. Do not mix files from two versions.

  4. Merge your edits back into the new clips.lua. Diff the two rather than dropping your old file in blind — a new version may add rows you want, and your old file would hide them.

  5. refresh, then ensure the resource, and re-run the F8 play test above.

The .ycd files are assets rather than Lua, and the dictionary and clip names inside them do not change between installs. So a reinstall never invalidates a name you already put in a menu.

Which leads to the thing people forget: your emote menu holds its own copy of the dictionary and clip names. Editing clips.lua changes nothing in game on its own. The names have to be in the menu's config too.

Single-player RDR2 through Lenny's Mod Loader ​

The files in stream/ are standard RDR2 clip dictionaries, so they also work outside RedM.

  1. Install Lenny's Mod Loader for RDR2 if you have not already.

  2. Create a mod folder with a stream directory inside it, under the mod loader's own mods folder.

  3. Copy the .ycd files from stream/ into it. Keep the file names exactly as they are.

  4. Play a clip with any script or trainer that takes a dictionary and a clip name.

The dictionary and clip names are identical to the RedM side, so the animation list is still the reference table.

Nothing else from this page applies there

There is no server.cfg, no ensure line and no asset-pack entitlement in single-player. fxmanifest.lua and server.lua are ignored, and clips.lua is only a reference document — nothing loads it. Copying stream/ across is the whole installation.

Next ​

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