Skip to content

Everyday Animations ​

94 everyday animations for RedM — greetings, gestures, reactions, idles and casual actions — streamed as 19 native RDR2 .ycd dictionaries, each shipping as a male and a female pair, with a readable clips.lua listing the dictionary and clip name of every one.

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 and no export. The animations reach your players through an emote menu you already run, or through a few lines of your own code.

No framework No database 94 animations Male and female 19 dictionary pairs 4.5 MB Asset pack — no menu

The 60-second version ​

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

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

    cfg
    ensure rm_everyday_v1

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

  3. Restart, or from the server console:

    text
    refresh
    ensure rm_everyday_v1
  4. Check the server console. server.lua prints one line, and that line is the whole of its server-side behaviour:

    text
    [rm] Animation pack started.

No framework, no database, no SQL, no build step. One ensure line and nothing else.

That [rm] prefix is written into the print itself, so it stays [rm] whatever you call the folder. Strip a version suffix like rm_everyday_v1-1.0.0 before adding the ensure line, and remove the extra folder level that unzipping sometimes leaves behind — resources/rm_everyday_v1/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 38 dictionaries sit on the client unused.

Go to Integrating or Playing an animation next.

Your server key needs asset packs enabled

The manifest declares dependency '/assetpacks', a Cfx.re licence-key entitlement check. Without it the resource still starts and still prints its line, but nothing streams — so no animation plays. That combination, a working list and a character who does nothing, is the most common cause of a silent install. See Installation.

This is an asset pack, not an emote menu ​

This is the thing most worth knowing before you install it. The resource is a manifest, a data file, a one-line server script, 38 animation files and some markdown:

fxmanifest.luacerulean, rdr3, lua54 'yes', rdr3_warning. Loads clips.lua as a client script and server.lua as a server script. Declares dependency '/assetpacks' and an escrow_ignore list
clips.luaA data table and nothing else — 94 entries, no functions. It sets a global and nothing reads it
server.luaOne line. A print that confirms the resource started
stream/38 .ycd dictionaries, about 4.5 MB in total
README.md, CHANGELOG.md, docs/Markdown

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

Not in this packConsequence
No client script beyond the data fileNothing requests a dictionary or calls TaskPlayAnim. No animation can play on its own
No menu, no NUIPlayers have nothing to open
No RegisterCommandThere is no chat command
No key bindingThere is no key to press
No exportsexports['rm_everyday_v1'] 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/ works because CFX picks that folder up automatically. That is the whole mechanism by which a pack with no playback code puts animations in your game.

100+ Female Poses, 24+ Dances and 30+ Dances are assets-only in the same way. The 30+ Female Poses pack does ship a menu and a command and can be handed to players as-is; this one cannot. If you were expecting that shape, that is the difference.

There are two routes to actually using it:

RoutePage
Feed the dictionary and clip pairs into an emote menu you already runIntegrating
Write a few lines of Lua that play a clip by dictionary and clip namePlaying an animation

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

lua
local dict, clip = 'rm@waving', 'waving'

CreateThread(function()
    RequestAnimDict(dict)
    local timeout = GetGameTimer() + 5000
    while not HasAnimDictLoaded(dict) do
        if GetGameTimer() > timeout then
            print('dictionary did not load — is rm_everyday_v1 started?')
            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 ClearPedTasks(ped), or ClearPedSecondaryTask(ped) for something played as an upper-body gesture. RemoveAnimDict(dict) releases the dictionary once playback has started.

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. Treat 1 as the known-good starting point and verify any variant in game. Duration -1 means no time limit, so with the loop flag the clip 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 wait on HasAnimDictLoaded with a timeout, as above. Full argument list on Playing an animation.

Config.Clips is not readable from another resource

clips.lua is loaded as a client script, so the global it sets exists inside rm_everyday_v1 — and CFX gives every resource its own Lua state, so it does not exist in yours. There is no getter here and no shared table to require. Reading the list means copying the rows you want into your own resource, or adding your own client script to this one. Both are covered in Integrating.

What is actually in it ​

Animations94
Clips188 — a male and a female version of each
Dictionaries19, each shipping as a pair
Stream files38 .ycd, about 4.5 MB in total
FormatNative RDR2 .ycd
Dictionary prefixrm@ …, with @f for the female version
BodiesBoth, on every one of the 94. No exceptions
Mode48 once, 46 loop
Root motion4 clips
Single-frame poses5 clips
Server scriptsOne print

Every dictionary the rows name is present in stream/, and every file in stream/ belongs to a row — 19 dictionaries times two bodies, nothing missing and nothing orphaned.

The full table, with the dictionary, clip name, length and mode of all 94, is on the animation list.

The five groups ​

The pack divides into five groups, and the division is clean: 15 + 32 + 16 + 18 + 13 = 94, and every animation falls in exactly one.

GroupAnimationsDictionariesMode in clips.lua
Greetings & Social1515 — one per animationloop
Communication Gestures321once
Reactions & Expressions161once
Standing & Idle181loop
Casual Actions131loop
Total941948 once, 46 loop

The dictionary column is the shape of the pack in one line. Four big dictionaries carry 79 of the animations between them, and the fifteen greetings each have a dictionary of their own — which is why the greetings are listed with a dictionary per row on the animation list and the other four groups are listed under one heading each.

The category field is only half this split

There are 19 category values in clips.lua, not five. The four large groups each have one, and each of the fifteen greetings has a category to itself — Salute, Waving, Patting and so on. A menu built straight from category gets four useful groups and fifteen one-item ones.

category and label are yours to rewrite, and this is the most worthwhile edit in the file. See The clips.lua file.

The 15 greetings ship as loop

Every greeting carries mode = 'loop', and they are one-shot social gestures — a 0.533-second waving on loop reads as a twitch rather than a wave. Set them to once unless you specifically want them repeating.

Choosing a body is a dictionary swap ​

Every animation ships twice, and the rule holds on all 94 rows with no exceptions:

bodies.male   == dict
bodies.female == dict .. '@f'

The female dictionary is the male name with @f appended, and the clip name inside both is identical. So rm@waving and rm@waving@f both contain a clip called waving, and picking a body is a string swap rather than a lookup:

lua
local base = 'rm@waving'
local dict = isFemale and (base .. '@f') or base
local clip = 'waving'

That is the single thing that makes this pack quick to wire up. One list of 94 clip names covers both bodies, and there is no per-body table to maintain.

Where isFemale comes from is yours to decide. 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. If your emote menu cannot pick a dictionary per body, add the animation twice — "Waving (M)" and "Waving (F)" — or use the male version for everyone. Both versions play on either body; the matching one fits better. See Integrating.

The pairing is tabulated dictionary by dictionary on the animation list.

Four clips move the character ​

Four animations carry rootMotion = true, which means the clip walks, turns or shifts the character rather than holding it on the spot:

  • a_man_stands_on_the_left_leg_in_a_yoga_tree_pose_with_the_hands
  • a_woman_stands_holding_a_map_open_in_both_hands_and_looks_aroun
  • look_binoculars_animation
  • whiteboard_animation

Play those four full body and give them a little space. The other 90 leave the character where it started. Details on the animation list.

Those first two ids are 63 characters each, because they were generated from source filenames. They work, and they are awkward in a menu — id and label are yours to rename, while clip is not.

Five rows are poses, not animations ​

Five rows have duration = 0.033, which is one frame at 30 fps:

male_sitting_pose · female_standing_pose · hand_in_back · cross_legged_sitting · leaning_against_wall

A one-frame clip played once is over before the blend finishes, so you see a flash and nothing else. These need hold-last-frame or loop behaviour to be usable, and four of the five already ship as loop for that reason. Treat them as static poses. More on the animation list.

Nine rows carry blendIn = 2.0 — roughly half a second, slower than the default — so the character eases into the position instead of snapping into it. Most of them start seated or kneeling; standing_clap and finger_tapping do not, and simply want the gentler entry. Two of the nine are also single-frame poses, so the two lists overlap rather than adding up. If your menu exposes a blend-in setting, use 2.0 for those nine and leave the rest at 4.0. If it does not, they still play, they arrive hard.

Requirements ​

Required
RedM serverYesAny build supporting fx_version 'cerulean' and lua54 'yes'
Asset packsYesThe manifest declares dependency '/assetpacks'
An emote menu, or your own codeYesThe pack cannot play an animation by itself
FrameworkNoVORP, RSG, RedEM:RP or none — it looks for nothing
DatabaseNoNo SQL, no server-side state
OneSyncNoNothing is synchronised by the pack

The asset-pack entitlement is genuine here rather than boilerplate: this resource streams 38 files, and it is the only thing between a clean console and a character who will not move. If the check fails, enable asset packs for your key in the Cfx.re portal.

15 rows are live and 79 are commented out ​

clips.lua contains five Config.Clips = { statements. One is live — the 15 greetings — and four are commented out, covering Communication Gestures, Reactions & Expressions, Standing & Idle and Casual Actions.

All 94 animations work regardless

Nothing in the resource reads that table, so the split has no effect on anything today. 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 right now. Nothing is missing from your download.

It matters in exactly one situation: when you copy rows out of clips.lua instead of out of these docs. Then you get 15 greetings and wonder where the other 79 went. Work from the animation list, which carries all 94.

Config.Clips assigns, it does not append

Deleting the comment markers from all four blocks does not give you 94 rows. Each statement overwrites the one before it, so you would be left with the last block alone and the rest silently discarded.

Merging all 94 into a single table is the right move, and the two duplicate ids have to be resolved at the same time — pointing and pointing_gesture each appear twice, in a standalone dictionary and in the gesture pack. Only the standalone pair is live as it ships, so there is no collision yet; merging creates one. The merge and the rename are walked through on The clips.lua file, and the duplicates are tabulated on the animation list.

The folder name is the resource name ​

In CFX the resource name is the directory name on disk. The name 'rm' line in fxmanifest.lua is metadata and renames nothing.

The folder ships as rm_everyday_v1, so the line is ensure rm_everyday_v1. Rename the folder to rm and the line becomes ensure rm. Either is fine, and nothing in the pack breaks either way, because the dictionary names are baked inside the .ycd files and are independent of the resource name.

The only rule: the ensure line must match the folder name on disk.

Never rename a .ycd file

An RDR2 dictionary stores its own name inside the file. Renaming the file does not rename the dictionary — it makes the two disagree, and that dictionary becomes unreachable. Clip and dictionary names are fixed at export time.

Lengths, and what you can edit ​

The duration field spans 0.033 s to 89 s. The five 89 s entries are the long standing idles; batter_on_deck at 37.333 s is the longest that is not an idle, terrified at 20 s the longest one-shot, and waving at 0.533 s the shortest real animation. The breakdown is on the animation list.

duration is metadata, and nothing reads it

It is a number the author wrote into clips.lua. No code in the pack consults it. If an animation looks like it runs longer or shorter than the table says, trust the game — GET_ANIM_DURATION gives the real figure for any clip.

escrow_ignore names clips.lua, stream/*.ycd and stream/**/*.ycd, so the clip list and the animation files themselves ship readable and stay that way.

EditableLeave alone
clips.lua — id, label, category, mode, and the commented-out blocksdict and clip, which must match the names stored inside the .ycd
The markdown in the downloadstream/*.ycd file names

Editing clips.lua does not change your emote menu. It is a reference list nothing reads at runtime: whatever you rename there has to be renamed in your menu's own config as well.

Beyond RedM ​

The .ycd files are standard RDR2 clip dictionaries, so they also work in single-player through Lenny's Mod Loader — a mod folder with a stream directory, the files copied in, then any script or trainer that takes a dictionary and a clip name. The names are identical to the RedM side.

Where to go next ​

PageWhat's in it
InstallationRequirements, the folder name, the asset-pack check, verifying the dictionaries streamed
Playing an animationThe 13-argument TaskPlayAnim call, loading a dictionary safely, picking a body, stopping cleanly
Animation listAll 94 with dictionary, clip name, length and mode, grouped
The clips.lua fileEvery field, the four commented-out blocks, merging them, and what is safe to change
IntegratingGetting the pairs into the emote menu you already run, including both bodies
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('rm@waving') returns true on your client.

Version 1.0.0.

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