RedM Emotes Troubleshooting
Find your symptom. Each entry names the cause, because the same symptom often has two very different ones.
The menu is empty
Every tab shows zero.
Two causes, and the server console tells you which:
| Cause | Check | Fix |
|---|---|---|
| No SQL imported | SELECT COUNT(*) FROM rm_emotes; returns 0 or errors | Import one language seed |
| oxmysql started after this resource | An oxmysql error naming rm_emotes on start | Put ensure oxmysql above ensure rm_emotes |
An oxmysql error mentions an unknown column such as command or hidden.
You have a 2.0 table and a 2.1 resource. Run sql/upgrade_2.1.sql once.
The Walks tab is empty, or /e slugs are missing on walk cards.
walkstyles.sql was not imported, or was imported before the language seed. Import the seed first, then walkstyles.sql.
The menu will not open at all
| Situation | Why |
|---|---|
| The player is on a horse | Deliberate guard. Dismount |
| The player is in adjust mode | Deliberate guard. Enter or Backspace first |
| Only for one player | Almost always one of the above |
For everyone, and /emotes also does nothing | Check RM.Command.enabled and RM.Keys.open.active |
Notifications appear as chat lines on a framework server
Your framework resource started after RedM Emotes, so detection fell through to standalone.
Detection runs once, at script load, and a core that starts later is never re-detected. Fix the ensure order — framework above ensure rm_emotes — or set both explicitly:
RM.Framework = 'vorp'
RM.NotifyMode = 'vorp'This is the same root cause as the next entry.
Job-restricted emotes are invisible to everyone
Including the players who hold the right job.
- Detection failure — same as above. Check the
ensureorder first. - The job string does not match. The comparison is exact and case-sensitive.
Sheriffdoes not matchsheriff.
On RSG Core, use the job name (PlayerData.job.name), not the label — vallaw, not "Valentine Law".
On standalone there are no jobs at all, so restricted is ACE-only. Express the role as an ACE instead.
The Admin tab never appears
You added yourself to RM.Admins but nothing changed.
The admin list is cached on first use and never rebuilt. refresh is not enough:
restart rm_emotesYou granted the ACE and nothing changed.
Admin status is computed server-side on every library push, and the client only learns about it from that push. Granting it mid-session does not make the tab appear on its own. Relog, or restart the resource.
Still nothing.
Re-check the ACE object name against RM.AdminAce, and the identifier prefix — RM.Admins entries are matched verbatim, including the prefix.
Someone you do not know has the admin editor
The shipped sample identifier is still in RM.Admins:
RM.Admins = {
'steam:11000014864548d', -- ← this
}That is a real identifier, not an inert placeholder. Empty the list, restart the resource, and use the ACE instead.
Direct SQL edits do not show up in game
The library is an in-memory cache. The server reads the table once and serves every client from memory.
Do one of:
exports.rm_emotes:Rebuild()restart rm_emotesOr make the edit in the in-game editor, which rebuilds automatically.
Saved emotes disappeared
For everyone, all at once.
Not a seed re-import. A second language seed collides on id 4 and the whole INSERT rolls back, so the installed language stays intact and no collection is touched. No seed drops rm_emote_favs — each one ends with CREATE TABLE IF NOT EXISTS, a no-op on an install that already has the table — so a re-import is harmless in every tool, including mysql --force and HeidiSQL's "ignore errors" mode.
If the collections really are empty, look for a manual DROP TABLE rm_emote_favs, or for emotes deleted in the editor or by a hand-written DELETE — those cascade through the foreign key and take the matching favourites with them.
For one player.
Favourites key on the Steam identifier when one exists, and license: otherwise. A player who connects without Steam gets a different key and appears to have lost everything.
SELECT SUBSTRING_INDEX(steam_id, ':', 1) AS identifier_type,
COUNT(DISTINCT steam_id) AS players,
COUNT(*) AS saved_rows
FROM `rm_emote_favs`
GROUP BY identifier_type;If that returns both steam and license, your server changed its identifier situation at some point. There is no supported way to merge the two keys — the resource offers no identifier override.
After an admin deleted an emote.
rm_emote_favs has ON DELETE CASCADE. Deleting an emote removes it from every player's collection and takes their key bind with it. There is no undo. Use hidden = 1 instead.
Admin-created emotes vanished after a maintenance import
Not from the import. amount.sql, scenarios.sql and walkstyles.sql contain no DELETE — each one ends with ON DUPLICATE KEY UPDATE, so re-running it rewrites its own ids in place and touches nothing else. Admin-created emotes land at 9133 and above once amount.sql has pushed AUTO_INCREMENT past 9132, outside every pack's ids, so they survive a re-import and so do the favourites pointing at them.
What a re-import does overwrite is an edit you made to a pack row in the editor. The upsert puts the shipped values back.
If rows really are gone, the cause was a delete, not an import. Check what is left:
SELECT id, custom_name, category, emote_type FROM `rm_emotes` WHERE id > 9132 ORDER BY id;The preview mannequin is missing
F8 shows:
[rm_emotes] preview model "<model>" failed to loadThe configured ped model is not available on this build. Ambient models stream reliably at runtime; story models (player_zero, cs_*) often fail. Set a valid model in RM.Showcase.models, or RM.Showcase.enabled = false.
The mannequin renders as floating clothes.
RM.Showcase.clonePlayer = true on a framework with MP characters. RedM cannot clone a component-built mp_male / mp_female cleanly. Set it back to false. The same applies to RM.Adjust.ghostClone.
Adjust mode problems
"Play an emote first" while an emote is clearly playing.
You are playing a walk style, a scenario or a shared emote. None can be repositioned. It also refuses while you are seated or mounted.
Aiming does nothing.
[rm_emotes] aim placement unavailable on this build, using manual nudgingThe shape-test natives failed on this build. Crosshair placement is off; the keys and gizmo still work.
You see yourself move instead of a ghost.
[rm_emotes] ghost model "<model>" failed to loadThe session fell back to moving your real character. It still works.
The pose stopped following the crosshair.
Working as designed. The first keyboard nudge or gizmo grab pins it for the rest of the session. Turning does not.
Sitting problems
No Chair prompt appears.
The scan does not run while you are moving. Stand still and wait about two seconds. This is by far the most common report.
If it still does not appear, the prop is not on the 82-model whitelist in shared/seats.lua. Add it.
Two "Sit" prompts.
Another sitting resource is running. Set RM.Seats.enabled = false in shared/seats.lua, or remove the other one.
"You cannot use this style on this chair".
Not every sitting style works on every prop. Try a different chair or a different style. Note that female characters have 10 of the 19 styles available; the other 9 are male only.
X does nothing while seated.
Expected. The global stop key is suppressed while seated so X reaches the stand-up prompt. Stand up first, or use /e stop.
Key binds do not fire
Bound keys are switched off while the menu is open, while you are typing in chat or any other resource's text box, and during adjust mode. They also only fire when Shift is not held, so they never clash with SHIFT+1..5.
Only single letters and digits can be bound. F1–F12 and X are permanently rejected.
Running another raw-keyboard resource? This one polls IsRawKeyDown and does not stand down for it. Set RM.BindListener = 'ctrl' and RM.ShiftHotkeys = false.
Script errors after updating the resource
F8 shows:
SCRIPT ERROR: @rm_emotes/client/main.lua:311: attempt to index a nil value (global 'Showcase')Or the same line naming RMBridge. FXServer started the resource from its cached file list, so client/main.lua loaded while one of its sibling client files did not. The menu may still open, but closing it, stopping an emote or showing a notice errors.
From the server or txAdmin console:
refresh
ensure rm_emotesThree follow-ups:
- Players who were already connected keep the client files they downloaded on join. Have them rejoin.
- If you renamed or moved the folder,
refreshis not enough. Restart the server. - If you edited
fxmanifest.luayourself, keeplua54 'yes'. The playback code uses the Lua 5.4 bitwise operator (flag = flag | 48) and will not compile without it.
Exports error in another resource
No such export Play in resource rm_emotesThe folder was renamed. Exports are namespaced by folder name — rename it back to rm_emotes.
If the folder name is right, check you are calling from the correct side: Play, PlayById, PlayByCommand, Stop, Open, Close and IsOpen are client exports. Rebuild is server.
/e <name> does nothing
No error and no message is the designed behaviour for an unknown slug. Check the spelling against the hint on the card.
If the slug on the card is not the one you set in the command column, you have a collision — there is no unique constraint on command, so the lower id keeps the slug and the higher one gets a numeric suffix:
SELECT command, COUNT(*) AS copies, GROUP_CONCAT(id ORDER BY id) AS ids
FROM `rm_emotes`
WHERE command IS NOT NULL AND command <> ''
GROUP BY command
HAVING copies > 1;The save notice appeared but the emote is not in the list
"Emote saved" is shown by the client before the server replies, so a save that matches no row still shows it.
The notice with nothing changed means you were editing a prop or shared entry. Those are merged into the library with synthetic ids from 90000 up and live in shared/extras.lua, not the database, so the write matches zero rows.
If Save does nothing at all and the form stays open, a required field is empty: Display name, Anim clip, or — for every type except walk — Anim dictionary. That check runs in the form, before any notice. A scenario row with an empty dictionary is refused by it too, even though the server would accept it — put any text in the dictionary field, or add scenario rows through SQL.
SQL error reference
| Error | Meaning |
|---|---|
#1060 - Duplicate column name 'command' | upgrade_2.1.sql on a table that already has the 2.1 columns. Nothing changed. Skip it |
#1062 - Duplicate entry '4' for key 'PRIMARY' | A language seed on a database that already has one. See "Saved emotes disappeared" |
#1054 - Unknown column 'emote_type' | A pack on a 2.0 table. Run upgrade_2.1.sql first |
#3730 / #1217 | DROP TABLE rm_emotes blocked by the foreign key. Drop rm_emote_favs first |
Specified key was too long | Old MySQL row format. The unique key is 1024 bytes; COMPACT and REDUNDANT cap at 767. Use DYNAMIC |
What to send when you ask for help
A report with all of this is usually answered on the first reply. One without it is not.
| Send | How to get it |
|---|---|
| Resource version | The version line in fxmanifest.lua |
| Which edition | Escrow builds have an escrow_ignore block and no web/ folder |
| Framework and version | VORP Core, RSG Core, RedEM:RP, or none |
| Server artifacts build | Printed at startup |
| Server console output | From the rm_emotes line through to the first error. Include oxmysql's startup lines |
| Client F8 output | Reproduce with F8 open. Lines from this resource are prefixed [rm_emotes] |
| Which SQL you imported, in what order | Say whether you ran any of them twice |
| Row count | SELECT COUNT(*) FROM rm_emotes; — separates an empty library from an interface fault |
Your config.lua | Remove RM.Webhook and any identifiers in RM.Admins first. The webhook URL is a credential and the identifiers are personal data |
| Steps to reproduce | What you did, what happened, what you expected |
| Anything touching emotes, animations or key binds | Resource names are enough |
These three client messages are worth quoting verbatim, because each points at a specific cause:
[rm_emotes] aim placement unavailable on this build, using manual nudging
[rm_emotes] ghost model "<model>" failed to load
[rm_emotes] preview model "<model>" failed to loadThose are the only three prints in the resource, and all three are failure paths — a correct start is completely silent on both console and F8.