Skip to content

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:

CauseCheckFix
No SQL importedSELECT COUNT(*) FROM rm_emotes; returns 0 or errorsImport one language seed
oxmysql started after this resourceAn oxmysql error naming rm_emotes on startPut 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

SituationWhy
The player is on a horseDeliberate guard. Dismount
The player is in adjust modeDeliberate guard. Enter or Backspace first
Only for one playerAlmost always one of the above
For everyone, and /emotes also does nothingCheck 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:

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

  1. Detection failure — same as above. Check the ensure order first.
  2. The job string does not match. The comparison is exact and case-sensitive. Sheriff does not match sheriff.

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:

cfg
restart rm_emotes

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

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

lua
exports.rm_emotes:Rebuild()
cfg
restart rm_emotes

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

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

sql
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 load

The 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 nudging

The 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 load

The 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. F1F12 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:

cfg
refresh
ensure rm_emotes

Three 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, refresh is not enough. Restart the server.
  • If you edited fxmanifest.lua yourself, keep lua54 '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_emotes

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

sql
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

ErrorMeaning
#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 / #1217DROP TABLE rm_emotes blocked by the foreign key. Drop rm_emote_favs first
Specified key was too longOld 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.

SendHow to get it
Resource versionThe version line in fxmanifest.lua
Which editionEscrow builds have an escrow_ignore block and no web/ folder
Framework and versionVORP Core, RSG Core, RedEM:RP, or none
Server artifacts buildPrinted at startup
Server console outputFrom the rm_emotes line through to the first error. Include oxmysql's startup lines
Client F8 outputReproduce with F8 open. Lines from this resource are prefixed [rm_emotes]
Which SQL you imported, in what orderSay whether you ran any of them twice
Row countSELECT COUNT(*) FROM rm_emotes; — separates an empty library from an interface fault
Your config.luaRemove RM.Webhook and any identifiers in RM.Admins first. The webhook URL is a credential and the identifiers are personal data
Steps to reproduceWhat you did, what happened, what you expected
Anything touching emotes, animations or key bindsResource 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 load

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

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