Skip to content

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:

FileWhat it does
fxmanifest.luaStreams stream/, loads clips.lua on the client and server.lua on the server
clips.luaA data table. 94 rows describing a dictionary and a clip name each — no functions, no events, no commands
server.luaOne print. Nothing else

So the pack's entire diagnostic output is one line in the server console at start-up:

text
[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:

lua
print(DoesAnimDictExist('rm@waving'), DoesAnimDictExist('rm@communication_gestures'))
ResultMeans
false for every dictionary you testThe assets are not streaming. Asset packs, or the resource is not started
true for some and false for othersThe assets are streaming and the failing names are wrong. See the dictionary-name section below
true for everythingStreaming 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:

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

TestResultMeans
DoesAnimDictExist(dict)falseThe dictionary is not streamed. Wrong name, or asset packs
DoesAnimDictExist(dict)true, but the timeout firesIt 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:

  1. Is [rm] Animation pack started. in the server console, with no red errors after it?

  2. Does the ensure line match the folder name on disk?

  3. Did you refresh after copying the folder in? A new resource is not picked up without it.

  4. Are the dict and clip strings copied from the animation list, rather than typed or assembled from the id?

  5. Is that dictionary in stream/ under exactly that name, with .ycd on 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:

RouteWhat you do
Your own client scriptA few lines of RequestAnimDict and TaskPlayAnim. See Playing an animation
An existing emote resourceAdd 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:

BlockAnimationsState in the file
Communication Gestures32commented
Reactions & Expressions16commented
Standing & Idle18commented
Casual Actions13commented
Greetings & Social15live

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:

lua
Config = Config or {}

Config.Clips = {
    -- all 94 rows here, one table, no second assignment
}

Two things to settle while you are in there:

  1. Resolve the duplicate ids. pointing and pointing_gesture each appear twice. Merged into one table, the second of each pair overwrites the first. See the section below.

  2. Decide what you want mode to say. Nothing reads it, so it is a note to your own playback code. The 15 greetings all ship as loop and 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:

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

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

CauseWhat to do
The ped still has momentum from runningLet it stop before you start the clip
You layered the clip over a movement taskClearPedTasks first, or accept the blend
The ped is on a slope or on a moving entityExpected. The clip does not fight physics
Another script is issuing a taskStop 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.

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

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

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

GroupAnimationsDictionary
Communication Gestures32rm@communication_gestures
Reactions & Expressions16rm@reactions_expressions
Standing & Idle18rm@standing_idle
Casual Actions13rm@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:

  1. Your server console from when the resource started, including the [rm] line or whatever error replaced it.

  2. The exact ensure line from server.cfg, and the exact folder name on disk.

  3. Whether asset packs are enabled on the server licence key.

  4. The exact dict and clip strings you are using, copied from your code rather than retyped.

  5. The result of DoesAnimDictExist(dict) on the client for that dictionary — true or false.

  6. The snippet that plays it, including whether you wait on HasAnimDictLoaded and what you pass for duration and flags.

  7. Whether you edited clips.lua, and if so, whether you merged the blocks or uncommented them in place.

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

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