All documentation

Paid scripts

Poggy Emotes

A searchable emote menu for RedM with over 330 emotes, favourites, a preview character, and a Nearby tab that lets players use the chairs, bars and railings around them.

  • poggy_emotesv1.1.2
  • FrameworksVORP Core, RSG Core, QBCore RedM
  • Updated5 Oct 2026

Overview#

Poggy Emotes is an emote menu for RedM. It has over 330 emotes: the game's scenarios, animations, prop emotes and the game's own built-in emotes, sorted into eight categories.

Players can search the whole list, star the emotes they like, and watch a stand-in character act an emote out before they play it. The first tab, Nearby, is different: it lists what the player can do with the things around them. Sit on that chair, stand at the bar, lean on that railing. Pick one and the character walks over and does it.

  • Nearby tab: uses the same seats and spots the game's own people use. Nothing is teleported.
  • Search: type any part of a name. It looks in every category at once.
  • Favourites and Recent: saved per character in the database.
  • Watch it first: a stand-in character beside the player plays the emote, props and all. Only that player sees it.
  • Props filter: one button shows only emotes that put something in the hand.
  • Props are cleaned up when an emote stops for any reason: cancelling, dying, mounting, swimming, playing another emote, or the script restarting.
  • Ragdoll: one key drops the character limp, the next lets them get up, with a cooldown.
  • Owner editable: add your own emotes, change the shipped ones, or hide the ones you do not want, from config.lua or the /poggy settings hub.

Requirements#

NeedsWhy
A RedM server on VORP Core, RSG Core or QBCore RedM (QBR)poggy_core talks to the framework for the script.
poggy_core 0.13.0 or newerEvery Poggy script needs it. It must start first. With 0.23.0 or newer the menu follows the Poggy theme you pick in /poggy.
oxmysqlStores each character's favourites and recent emotes.

Installation#

  1. Download Poggy Emotes from your Cfx.re portal and put the poggy_emotes folder in your server's resources folder.
  2. If you run another emote script, stop it and take it out first. Two scripts that both use /e fight over it.
  3. Add this to server.cfg, below ensure poggy_core and ensure oxmysql:
    ensure poggy_emotes
  4. Restart the server.

There is no SQL to import. poggy_core creates the table (poggy_emotes_player, one row per character) the first time the script starts.

If you would rather run the SQL yourself, set PoggyCoreConfig.Sql.AutoInstall = false in poggy_core's config.lua and import sql/install.sql, or type poggycore sql install poggy_emotes in the server console.

Configuration#

Every setting is in config.lua, and every one is also in the /poggy settings hub under Poggy Emotes, with a tooltip. The hub has eight tabs: General, Behaviour, Ragdoll, Menu, Nearby, Preview, Emotes and Text. The defaults below are what the script ships with.

Commands and keys (General tab)

SettingDefaultWhat it does
Config.Language"en"Which language from translations.lua the script uses.
Config.MenuCommand"emotes"The command that opens the menu. No slash.
Config.PlayCommand"e"The command that plays one emote by name.
Config.CancelCommand"ec"The command that stops an emote.
Config.ChatSuggestionsonAdds every emote name to the chat autocomplete. Turn it off if your chat gets slow with a few hundred suggestions.
Config.Keys.OpenMenuKey"END"The keyboard key that opens and closes the menu. One of END, HOME, INSERT, DELETE, PAGEUP, PAGEDOWN, F1 to F12, or a single letter or digit. "" turns the key off; the command still works.
Config.Keys.OpenMenuControl0 (off)A game control that also opens the menu, for example for controller players.
Config.Keys.CancelBackspaceThe key that stops an emote and puts away any prop.

RedM has no screen where players rebind keys, so the keys you set here are the same for everyone. Pick keys no other script on your server uses.

How emotes behave (Behaviour tab)

SettingDefaultWhat it does
Config.Behaviour.CancelOnMoveonStops the emote when the player walks off. Turn it off if you want emotes to hold until cancelled.
Config.Behaviour.CancelOnAimonStops the emote when the player draws or fires a weapon. Leave it on.
Config.Behaviour.HolsterWeaponsonPuts weapons away before an emote starts.
Config.Behaviour.AllowWhileMountedoffLets emotes play on a horse or in a wagon. Most animations look broken mounted.
Config.Behaviour.AllowWhileSwimmingoffLets emotes play in water. Strongly advised off: the character usually sinks or freezes.

Ragdoll (Ragdoll tab)

SettingDefaultWhat it does
Config.Ragdoll.EnabledonTurns the ragdoll key and command on. Off removes both.
Config.Ragdoll.KeyZThe key that drops the character and lets them up. 0 turns the key off and keeps the command.
Config.Ragdoll.Command"ragdoll"The command that does the same. "" turns it off.
Config.Ragdoll.MinSeconds2The least time a player stays down. A second press sooner is ignored.
Config.Ragdoll.Cooldown3Seconds after getting up before a player can drop again. Stops players spamming it to dodge a lasso or a fight.
Config.Ragdoll.MaxSeconds0The longest a player can stay down before they are stood up. 0 means no limit.
Config.Ragdoll.AllowWhileMountedoffLets players drop while riding, which throws them off.

The menu (Menu tab)

SettingDefaultWhat it does
Config.Menu.RecentCount12How many recent emotes each character keeps. 0 turns Recent off.
Config.Menu.FavouritesonLets players star emotes.
Config.Menu.StayOpenAfterPlayoffWhere the Keep menu open switch starts for a new player. After that, each player's own choice is remembered.
Config.Menu.FilterByGenderonHides emotes built for the other gender. Off shows every emote to everyone.
Config.Menu.CategoryOrderall 11Which categories show, and in what order. Remove one to hide it and every emote in it.

The categories, in their default order: nearby, favourites, recent, gestures, conversation, idle, sitting, working, consume, dance, injury. The first three are built by the script for each player.

Nearby (Nearby tab)

SettingDefaultWhat it does
Config.Nearby.EnabledonShows the Nearby tab at all.
Config.Nearby.Radius4.0How far around the player to look, in metres.
Config.Nearby.MaxRows40The most rows shown at once, closest first.
Config.Nearby.WalkTimeout10Seconds the character may go without getting closer before the action is cancelled with "You cannot get there."
Config.Nearby.ChainsonRuns two-part actions (pick a bale up, carry it, set it down) all the way through. These rows are marked carry.
Config.Nearby.AdminsCanBlockonLets anyone poggy_core counts as an admin block Nearby actions in game.
Config.Nearby.BlockAce"poggy_emotes.nearby.block"The ACE that also lets a player block Nearby actions.
Config.Nearby.BlockRadius0.75How close, in metres, a "Here only" block reaches.
Config.Nearby.BlockedemptyThe blocked actions. Filled in from the game (see Permissions), or by hand.
Config.Nearby.Marker.EnabledonDraws a soft pink circle on the thing the highlighted row belongs to, so players see which chair "Sit down" means.
Config.Nearby.Wall.EnabledonOffers lean, smoke, drink and brace actions against a wall beside the player.
Config.Nearby.RequireUsableoffAlso asks the game whether the character may use each spot. Turn on if rows appear that the character then refuses.
Config.Nearby.ShowUnknownoffLists spot types the script has no name for. Useful for a moment while you hunt for one to label.
Config.Nearby.DebugoffPrints what the walk sees in the player's F8 console. Leave off on a live server.

Four lists shape the tab:

  • Config.Nearby.Labels turns the game's spot names (like PROP_HUMAN_SEAT_CHAIR_DRINKING) into words ("Sit and drink"). Anything not listed is named from the spot itself.
  • Config.Nearby.Keywords adds actions for props the game has no spot for, matched on a word in the prop's model name: lean on any barrel, rummage in any crate, knock on any door.
  • Config.Nearby.Prefixes is the allow-list of spot types. The defaults keep the human and player ones and leave out animal, ambient and cutscene types.
  • Config.Nearby.Hidden lists spot types that are never shown. Add one here to take it away.

A keyword action looks like this. distance is metres from the edge of the prop; face = "away" puts the character's back to it, for leaning and sitting on edges.

{ keywords = { "anvil" }, label = "Hammer", scenario = "WORLD_HUMAN_HAMMER_GROUND", distance = 0.3, face = "toward" },

The preview character (Preview tab)

SettingDefaultWhat it does
Config.Preview.EnabledonShows the stand-in character. Turn off on a busy server, or if you would rather players tried emotes on themselves.
Config.Preview.Model"u_m_m_sdphotographer_01"The character model used. Any valid ped model works.
Config.Preview.Alpha200How solid it looks, from 0 (invisible) to 255 (solid).
Config.Preview.OffsetRight / OffsetForward / OffsetHeight1.0 / 0.75 / 0.0Where it stands, in metres from the player.
Config.Preview.LightEnabledonA soft light on the preview so it can be seen at night.
Config.Preview.LightColour / LightRange / LightIntensitywhite / 3.0 / 10.0The light's colour, reach in metres, and brightness. Above about 25 it washes the character out.

Your own emotes (Emotes tab)

Add emotes in Config.CustomEmotes, or on the Emotes tab in /poggy. An update never changes this list. A row with the same name as a shipped emote replaces it, which is how you re-label, re-categorise or re-time a shipped emote.

FieldWhat it is
nameWhat the player types after /e. Lower case, no spaces.
labelThe name shown in the menu.
categoryWhich category it sits under. It must also be in Config.Menu.CategoryOrder, or it is not shown.
gender"any", "male" or "female". Only matters while FilterByGender is on.
kind"scenario" (a world scenario, loops until cancelled), "kit" (one of the game's built-in emotes, by number) or "anim" (an animation; the only kind that can hold a prop).

One of each kind:

Config.CustomEmotes = {
    { name = "mysalute", label = "Salute", category = "gestures", gender = "any",
      kind = "kit", hash = 901097731 },

    { name = "mylean", label = "Lean on a Post", category = "idle", gender = "any",
      kind = "scenario", scenario = "WORLD_HUMAN_LEAN_POST_LEFT" },

    { name = "mybook", label = "Read a Book", category = "sitting", gender = "any",
      kind = "anim", dict = "amb_rest_sit@world_human_sit_ground@read_book@male_a@base",
      anim = "base", speed = 2.0, speedX = 2.0, duration = -1, flags = 1,
      prop = { model = "p_journal_open01x", bone = 22798,
               x = 0.1, y = 0.07, z = -0.08, rx = 0.0, ry = 180.0, rz = 70.0 } },
}

For animations: speed and speedX are how quickly it fades in and out, duration is milliseconds (-1 holds until stopped), and flags are added together: 1 loops, 2 holds the last frame, 49 plays on the upper body only so the player can still walk. For a prop, bone 22798 is the right hand and 34606 the left; x y z are metres from the bone and rx ry rz are degrees. Getting prop offsets right is fiddly: copy a shipped prop emote with a similar prop and nudge the numbers. Poggy Animtool does it visually.

Do not edit shared/emotes.lua, the list of shipped emotes. An update replaces it, and your changes would be lost.

An entry missing a name, a kind, or the fields its kind needs is skipped, and the console says how many were skipped.

Hiding emotes

Config.HiddenEmotes = { "pee", "vomitkneel" }

A hidden emote is gone from the menu and from /e, so a player who knows the name still cannot play it. Use the typed name (the one in brackets in the menu), not the label. A name that matches nothing is ignored. To hide a whole category, take it out of Config.Menu.CategoryOrder.

Hiding is for everyone. There is no per-job or per-rank emote locking.

Text and languages (Text tab)

Every word a player sees, including the menu and the category names, is in translations.lua. To add a language, copy the ["en"] block, rename it, translate it, and set Config.Language to its name.

Commands#

CommandWhoWhat it does
/emotesEveryoneOpens the emote menu. Again to close it.
/e <name>EveryonePlays one emote straight away, for example /e wave. On its own it opens the menu.
/ecEveryoneStops the emote and puts away any prop.
/ragdollEveryoneDrops the character limp. Again to get up.

All four command names can be changed in the settings (see Configuration).

KeyWhat it does
EndOpens and closes the menu.
BackspaceStops the emote and puts away any prop, including while riding. With the menu open, use its Stop emote button instead.
ZRagdoll: press once to drop, again to get up (after 2 seconds by default). Not a key to hold. Does nothing while the chat box is open.

Permissions#

Every player can use the menu, the commands and the ragdoll. There is nothing to grant.

The one staff power is blocking a Nearby action. Some of the game's sit and lean spots are broken in custom-built areas (a seat that puts the character through the floor, a lean that faces the wrong way). A "dev" can remove them for everyone from inside the game. A dev is:

  • anyone poggy_core counts as an admin, while Config.Nearby.AdminsCanBlock is on (the default), and
  • anyone with the ACE poggy_emotes.nearby.block.

To give the ACE to a group, add a line like this to server.cfg:

add_ace group.dev poggy_emotes.nearby.block allow

Using it in game#

Playing emotes

  1. Press End or type /emotes. The menu opens on the first category that has anything in it.
  2. Start typing to search. The search looks at the shown name and the typed name, in every category.
  3. Click the â–¶ in front of a name, or hover the row, to watch the stand-in character play it. The menu stays open.
  4. Click the name, or move to it with the arrow keys and press Enter, to play it.
  5. Stop with Backspace, /ec or the Stop emote button.
  • Click the star on a row to add it to Favourites.
  • Props only, beside the search box, narrows whatever is showing to emotes that put something in the hand. Those rows are marked PROP.
  • Keep menu open, at the bottom, keeps the menu up after each emote so players can try several in a row.
  • Left and right arrows change category while the search box is empty. Esc, the × or End closes the menu.
  • Players who know the name can skip the menu: /e wave.

The Nearby tab

Chairs, benches, bars, pianos, water pumps, stoves, campfires and railings carry spots that the game's own people sit, stand and work at. The Nearby tab lists the ones around the player, grouped by the thing they belong to, closest first:

CHAIR - 1.2 m
  Sit down
  Sit and drink
  Sit at the table
WALL - 0.6 m
  Lean back on the wall
  1. Open the menu. Nearby is the first tab.
  2. A marker shows which thing the highlighted row belongs to. Tab jumps to the next thing.
  3. Click a row, or press Enter. The character walks over, turns, and does it.
  4. Stop with Backspace, /ec or Stop emote, whether still walking or already sitting.

With the mouse off the menu, the player can still walk about and the list follows them. With the mouse over the menu, the game gets no input. There is no preview character on this tab, and typing only searches on the other tabs.

Any prop the game hands out during the action (a broom, a pitchfork) is put away when it stops. In a two-part carry action, what the character set down stays where the game put it.

Blocking a broken Nearby action (devs)

  1. Open the Nearby tab next to the broken spot. As a dev you see a small × on every row.
  2. Click it and choose Here only (that action at that one spot) or Everywhere (that action on every copy of the prop).
  3. The action is gone from the tab for everyone at once.

The block is written into Config.Nearby.Blocked in config.lua, so it is kept with your settings and an update never touches it. Devs still see the blocked row, crossed out, with ↺ to allow it again. You can also add or remove rows by hand:

Blocked = {
    { scenario = "PROP_HUMAN_SEAT_CHAIR", x = 2412.35, y = -1210.80, z = 44.21 },
    { scenario = "WORLD_HUMAN_LEAN_WALL_LEFT" },
},

A row with x, y, z is for that one spot. A row without is for that action everywhere.

Ragdoll

Press Z (or type /ragdoll) to drop limp. Press it again to get up, after at least 2 seconds. After getting up there is a 3 second wait before dropping again. It does not work while dead, hogtied, swimming, with the menu open, or (by default) while mounted.

Moving from another emote script#

Run only one emote script. Stop and remove the old one before starting Poggy Emotes.

From js_emotes

Favourites come across on their own. On first start, Poggy Emotes looks for the old emote_favorites table and, if it is there, copies each character's starred emotes into its own table. It runs once. The old table is left exactly as it is, so you can go back if you want.

Emote names are the same, so /e wave, /e sitground1 and the rest still work, and players' macros keep working. The differences:

  • Cancel with /ec or Backspace (not /e c).
  • Three emotes that did nothing (fixwagon1, fixwagon2, indicate) are gone.
  • Thirteen emotes you could only reach by typing are now in the menu.

From any other emote script

There is no automatic import. To keep a name your players know, like /e dance5, add a row to Config.CustomEmotes with that name, pointing at the animation you want. Most emote scripts store a dictionary, an animation name and flags, so their emotes move across easily (see Your own emotes).

After the move

  1. Check the console on first start for skipped custom emotes.
  2. Open /poggy, find Poggy Emotes, and look at the Emotes tab.
  3. Play a prop emote, then mount a horse. The prop should be put away.
  4. Ask a player to check their favourites are still there.

Troubleshooting#

The menu does not open with the key.
Press F8 in game: the console says if Config.Keys.OpenMenuKey is not a key the script knows, or if this RedM build cannot read the keyboard directly. In that case set Config.Keys.OpenMenuControl. /emotes always works. Also check that no other script uses the same key.
An emote does nothing.
The animation is not in your game build, or a custom emote has a typo in dict or anim. The player's F8 console names the dictionary that failed to load.
My custom emote is not in the menu.
Check that its category is in Config.Menu.CategoryOrder, its name is not in Config.HiddenEmotes, and its gender matches your character or is "any". Then watch the console on restart for skipped entries.
A prop is stuck in someone's hand.
Press Backspace or type /ec. If it keeps happening, please report it.
The preview character is missing.
Config.Preview.Enabled is off, or Config.Preview.Model is not a valid ped model. The F8 console says if the model failed to load.
The preview stands in a wall.
Move it with Config.Preview.OffsetRight and OffsetForward.
Emotes stop the moment a player moves.
That is Config.Behaviour.CancelOnMove. Turn it off to make emotes hold.
The Nearby tab is empty.
Check Config.Nearby.Enabled and that "nearby" is in Config.Menu.CategoryOrder. If Config.Nearby.RequireUsable is on, try turning it off.
A Nearby row says "You cannot get there."
Something is in the way, or the spot cannot be stood on. Move closer or come at it from the other side. If the spot is broken, block it (see Permissions).
Blocking a Nearby action fails.
The block is written into config.lua. If the server cannot write that file, the block fails and the server console says why.
Typing /e plays the wrong thing, or nothing.
Another emote script is still running and also uses /e. Remove it.

Updating#

poggy_core's updater installs new versions for you; see Updates. Your config.lua and translations.lua are merged, never overwritten: new settings arrive with their defaults and your values stay. That includes Config.CustomEmotes, Config.HiddenEmotes and Config.Nearby.Blocked.

The one file an update replaces is shared/emotes.lua, the shipped emote list. Put your changes in Config.CustomEmotes instead.

Join the Discord Discord