Everyday Animations Troubleshooting
Nearly every report about this pack lands in one of three places: the assets are not streaming at all, a dictionary name was built instead of copied, or the clip is playing exactly as asked and the ask was wrong. Work down the page by symptom.
What the pack can tell you
Start by knowing how little the resource says out loud. Three files carry Lua, and only one of them runs anything:
| File | What it does |
|---|---|
fxmanifest.lua | Streams stream/, loads clips.lua on the client and server.lua on the server |
clips.lua | A data table. 94 rows describing a dictionary and a clip name each — no functions, no events, no commands |
server.lua | One print. Nothing else |
So the pack's entire diagnostic output is one line in the server console at start-up:
[rm] Animation pack started.There is no client script in the download, which means no client-side logging, no chat feedback and no error message when a clip fails. Everything below is diagnosed from the server console, from DoesAnimDictExist on the client, and from your own playback code.
The guides inside the download describe a different build
The docs/ folder and the comment header at the top of clips.lua were written against a version with a client script. This download has none, so none of what they promise is available to test against. Read clips.lua for the data and these pages for the behaviour.
The resource starts but no animation plays anywhere
Not one of the 94 works, on any character, from any code — and the start-up line looks fine.
Check asset packs on your server licence key first. The manifest declares dependency '/assetpacks', which is a Cfx.re entitlement check rather than a dependency on another resource. Without that entitlement the resource still starts and still prints its line, but the stream/ folder is never served, so none of the 19 dictionaries exist in the game. This is the most common cause of a total silence on a streaming pack like this one, and the start-up line is what makes it confusing.
The start-up line is not evidence that the assets streamed
[rm] Animation pack started. comes from server.lua, which prints unconditionally. It tells you the resource was found and started. It says nothing about stream/.
Confirm it from the client in one test. Pick any dictionary from the animation list and ask the game whether it exists:
print(DoesAnimDictExist('rm@waving'), DoesAnimDictExist('rm@communication_gestures'))| Result | Means |
|---|---|
false for every dictionary you test | The assets are not streaming. Asset packs, or the resource is not started |
true for some and false for others | The assets are streaming and the failing names are wrong. See the dictionary-name section below |
true for everything | Streaming is fine. The problem is in the playback call |
Enable asset packs for your key in the Cfx.re portal. Nothing in the resource works around it, and no other setting matters until it passes.
If the resource did not start at all, the ensure line does not match the folder on disk. In CFX the resource name is the directory name, and the name 'rm' line in fxmanifest.lua is metadata that renames nothing. The folder ships as rm_everyday_v1, so the default line is ensure rm_everyday_v1; if you rename the folder to rm, the line becomes ensure rm. The one rule is that the two match. Full sequence in Installation.
Nothing happens when I play a clip
The character stands there. No error anywhere, and other clips work.
A clip requested from a dictionary that never loaded fails silently. TaskPlayAnim does not throw, does not warn and returns nothing useful — the task is never given at all. This is the most common bug in hand-written playback code, and it always looks like a broken asset.
Wait for the load, with a timeout, and make the failure say so:
local dict = 'rm@communication_gestures'
local clip = 'thankful'
RequestAnimDict(dict)
local deadline = GetGameTimer() + 5000
while not HasAnimDictLoaded(dict) do
if GetGameTimer() > deadline then
print(('[everyday] dictionary "%s" never loaded'):format(dict))
return
end
Wait(0)
end
TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 1, 0.0, false, 0, false, 0, false)With the timeout in place the two halves come apart:
| Test | Result | Means |
|---|---|---|
DoesAnimDictExist(dict) | false | The dictionary is not streamed. Wrong name, or asset packs |
DoesAnimDictExist(dict) | true, but the timeout fires | It exists and has not streamed in yet. Give it longer, or request it earlier |
| The dictionary loads, nothing plays | — | The clip name is wrong for that dictionary |
Then work through this in order:
Is
[rm] Animation pack started.in the server console, with no red errors after it?Does the
ensureline match the folder name on disk?Did you
refreshafter copying the folder in? A new resource is not picked up without it.Are the
dictandclipstrings copied from the animation list, rather than typed or assembled from the id?Is that dictionary in
stream/under exactly that name, with.ycdon the end?
Copy the pair, do not type it
rm@communication_gestures@f has two @ symbols, a lowercase prefix and a @f suffix. A dropped @f or a missed underscore produces precisely the symptom above — silence.
There is no command and no menu
Correct, and it is not a fault. The pack ships fxmanifest.lua, clips.lua, a one-line server.lua and 38 .ycd files. There is no client script and no interface, so nothing registers a key, opens a menu or listens for chat. Pressing keys in game will never do anything on its own.
What you have is 94 playable animations and a table giving the dictionary and clip name of each, which is all the game ever asks for. To put them in front of a player, take one of two routes:
| Route | What you do |
|---|---|
| Your own client script | A few lines of RequestAnimDict and TaskPlayAnim. See Playing an animation |
| An existing emote resource | Add the dictionary and clip pairs to its list. See Integrating |
For RedM Emotes the shape of that list is described under three ways to add an emote. The other RedMorrow asset packs — 100+ Female Poses, 24+ Dances and 30+ Dances — are driven the same way, so whatever already plays those will play these.
I copied rows out of clips.lua and most animations are missing
You found 15 rows where the docs list 94.
clips.lua contains five Config.Clips = { statements. Four of them ship commented out, and one is live:
| Block | Animations | State in the file |
|---|---|---|
| Communication Gestures | 32 | commented |
| Reactions & Expressions | 16 | commented |
| Standing & Idle | 18 | commented |
| Casual Actions | 13 | commented |
| Greetings & Social | 15 | live |
Nothing is missing from your download. All 38 .ycd files are in stream/, all 19 dictionaries ship as a male and a female pair, 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, whether its row is commented or not — because nothing in the resource reads the table in the first place.
So copy from the animation list rather than from the file. It covers all 94 with the dictionary, clip name, length and intended play mode on every row. If you would rather work in the file itself, read the next section before you delete any --.
Why the file is readable at all
escrow_ignore covers clips.lua and every .ycd, so the clip list and the assets stay open. You can read and edit the table; it is not a complete list as it ships. Details in The clips.lua file.
I uncommented the blocks and now only some work
Two separate problems, in the order you hit them.
The four commented blocks sit above the line that creates the table. Config = Config or {} is at line 122, and the four blocks are at lines 30, 65, 84 and 105. Delete the -- from a block where it stands and Config is still nil at that point, so the file errors with an attempt to index a nil value and stops loading. You will see it in the client console (F8) and nowhere else.
Config.Clips assigns, it does not append. Each of the five statements replaces the table rather than adding to it, so the last one in the file wins. The live greetings block is last, which is why uncommenting the four above it leaves you with the same 15 animations you started with — the other 79 are assigned and then silently thrown away.
The fix is to merge, not to uncomment. Move the rows into a single Config.Clips table below Config = Config or {}, with one pair of braces around all 94:
Config = Config or {}
Config.Clips = {
-- all 94 rows here, one table, no second assignment
}Two things to settle while you are in there:
Resolve the duplicate ids.
pointingandpointing_gestureeach appear twice. Merged into one table, the second of each pair overwrites the first. See the section below.Decide what you want
modeto say. Nothing reads it, so it is a note to your own playback code. The 15 greetings all ship asloopand are one-shot gestures.
Two animations behave like the same one
pointing and pointing_gesture each appear twice in the clip list, once inside rm@communication_gestures and once in a standalone dictionary of their own (rm@pointing and rm@pointing_gesture). Both sides are set out in the duplicate ids table.
pointing runs 3.433 s in both places and is very likely one animation exported twice, so those two genuinely do look alike. pointing_gesture differs between the two dictionaries by 0.134 s, which makes them separate takes — if yours looks like the wrong one, you are reaching the other dictionary.
As the file ships, the standalone pair is live and the gesture-pack twins are commented, so there is no collision yet. It appears the moment you merge all 94 into one table: a lookup keyed on id finds whichever row comes second and the other becomes unreachable. Key on the dictionary and clip together, or rename one side — pointing_alt and pointing_gesture_alt read well enough for the standalone pair. The id and the label are yours to change; the dictionary and clip names are not.
A pose flashes and disappears
Five rows are a single frame. They carry duration = 0.033, which is one frame at 30 fps: male_sitting_pose, female_standing_pose, hand_in_back, cross_legged_sitting and leaning_against_wall. They are poses rather than animations, and played with a finite duration they are over before the next frame is drawn.
They need the task to hold instead of end. Ask for no time limit — -1 in the duration argument — and then stop it deliberately when you are done:
-- argument 6 is the duration in milliseconds; -1 means no time limit
TaskPlayAnim(PlayerPedId(), dict, clip, 4.0, -4.0, -1, 1, 0.0, false, 0, false, 0, false)
-- later
ClearPedTasks(PlayerPedId())RDR3 flag values are not GTA V's
TaskPlayAnim in RDR3 takes thirteen arguments, and the flag word in argument 7 does not mean what the same number means in GTA V. Hold-last-frame behaviour comes from that word, so a flag copied out of a FiveM snippet is a reliable way to get a pose that drops or never appears. Treat 1 as the known-good starting point and verify any variant in game. Background in the RedM platform notes.
All five are flagged in the single-frame list.
A sitting or kneeling animation snaps into place
The character teleports into the pose rather than lowering into it.
Nine rows start seated or kneeling and carry blendIn = 2.0 — roughly half a second, slower than the default blend. blendIn is argument 4 of TaskPlayAnim, and the fast 4.0 used in every example on this page is what makes a sitting clip look like a snap:
-- 4.0 for a standing gesture, 2.0 for these nine
TaskPlayAnim(PlayerPedId(), dict, clip, 2.0, -4.0, -1, 1, 0.0, false, 0, false, 0, false)The nine are sitting_yell, standing_clap, male_sitting_pose, finger_tapping, cross_legged_sitting, kneeling_idle, sitting_ground, sleeping_idle and sleeping, listed in the animation list. The field is a note to your code and nothing in the pack reads it, so the value has to reach the native from your side.
It also helps to let the ped come to a stop first. Blending a seated clip onto a ped that is still running looks wrong at any blend speed.
An animation moved my character
Correct for four of the 94. 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 and whiteboard_animation carry root motion, so they walk or turn the character as part of the performance. Play them full body, leave some space around the ped, and expect it to finish somewhere other than where it started — ClearPedTasks hands control back but does not put the character back. They are listed under root-motion clips.
The other 90 are authored in place. If one of those appears to slide, the movement is not coming from the clip:
| Cause | What to do |
|---|---|
| The ped still has momentum from running | Let it stop before you start the clip |
| You layered the clip over a movement task | ClearPedTasks first, or accept the blend |
| The ped is on a slope or on a moving entity | Expected. The clip does not fight physics |
| Another script is issuing a task | Stop that one first — the last task wins |
A short gesture looks like a twitch
It is restarting before it reads as a gesture. All 15 greetings ship mode = 'loop' even though every one of them is a one-shot social gesture, and waving is 0.533 s — on a loop that is a flicker, not a wave.
mode is metadata; nothing in the pack reads it, so the looping is coming from your own code repeating the task or from the flag word you passed. Give a one-shot gesture a finite life instead: the duration argument takes milliseconds, so the length from the animation list ends the task on its own.
-- waving is 0.533 s, so 533 ms
TaskPlayAnim(PlayerPedId(), 'rm@waving', 'waving', 4.0, -4.0, 533, 1, 0.0, false, 0, false, 0, false)Across all 94 rows, mode is split 48 once and 46 loop, and the 15 greetings are the rows where the shipped value and the sensible value disagree. Lengths in clips.lua were written by the author rather than read out of the .ycd, so if a clip runs long or short, trust the game — GET_ANIM_DURATION gives the real figure for any dictionary and clip.
The female version plays on a male character
You requested the female dictionary. The rule holds on all 94 rows with no exceptions:
bodies.male == dict
bodies.female == dict .. '@f'The clip name inside both dictionaries is identical, so the body is decided entirely by the dictionary string — rm@waving or rm@waving@f, same waving clip either way. That is why the mistake is invisible in your code: the clip name looks right because it is right.
The pack contains no selection code of any kind, so which body plays is a choice your script makes at request time. Make it explicitly:
local dict = isFemale and (base .. '@f') or basePrefer your own character-sex field
IsPedMale is reliable on standard multiplayer and story peds and can be wrong on heavily customised ones. If your framework already stores a character's sex, use that instead and keep the decision in one place.
There is no fallback to the other body and no option that adds one. All 19 dictionaries ship both halves, so the correct name always exists — every dictionary ships twice.
A dictionary name I built by hand does not exist
Code that assembles the dictionary as 'rm@' .. id works for exactly 15 of the 94 and fails silently on the other 79.
The 15 greetings each have their own dictionary named after the id, so waving really is in rm@waving. The remaining 79 live in four shared dictionaries:
| Group | Animations | Dictionary |
|---|---|---|
| Communication Gestures | 32 | rm@communication_gestures |
| Reactions & Expressions | 16 | rm@reactions_expressions |
| Standing & Idle | 18 | rm@standing_idle |
| Casual Actions | 13 | rm@casual_actions |
So rm@thankful and rm@sleeping do not exist, while rm@salute does. The fix is not to special- case the four groups — it is to stop deriving the name at all. Every row in the animation list carries the dictionary and the clip name side by side; read the pair.
Renaming a .ycd does not rename the dictionary
An RDR2 clip dictionary stores its own name inside the file. Renaming rm@communication_gestures.ycd on disk leaves the internal name unchanged, the two disagree, and every clip in it becomes unreachable with no error to explain why. Rename at export time or not at all.
Renaming the resource folder is a different matter and is perfectly safe — the dictionary names have nothing to do with the resource name. Only the ensure line has to follow the folder.
Still stuck
Collect this before opening a ticket:
Your server console from when the resource started, including the
[rm]line or whatever error replaced it.The exact
ensureline fromserver.cfg, and the exact folder name on disk.Whether asset packs are enabled on the server licence key.
The exact
dictandclipstrings you are using, copied from your code rather than retyped.The result of
DoesAnimDictExist(dict)on the client for that dictionary —trueorfalse.The snippet that plays it, including whether you wait on
HasAnimDictLoadedand what you pass for duration and flags.Whether you edited
clips.lua, and if so, whether you merged the blocks or uncommented them in place.Which emote resource you are integrating with, if any.
Then open a ticket on Discord.
If the playback code itself is new ground, start with Animation Basics and the RedM platform notes, then come back to Playing an animation. Shorter answers to the common questions are in the FAQ.