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.
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.luaor the/poggysettings hub.
Requirements#
| Needs | Why |
|---|---|
| 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 newer | Every Poggy script needs it. It must start first. With 0.23.0 or newer the menu follows the Poggy theme you pick in /poggy. |
oxmysql | Stores each character's favourites and recent emotes. |
Installation#
- Download Poggy Emotes from your Cfx.re portal and put the
poggy_emotesfolder in your server'sresourcesfolder. - If you run another emote script, stop it and take it out first. Two scripts that both use
/efight over it. - Add this to
server.cfg, belowensure poggy_coreandensure oxmysql:ensure poggy_emotes - 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)
| Setting | Default | What 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.ChatSuggestions | on | Adds 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.OpenMenuControl | 0 (off) | A game control that also opens the menu, for example for controller players. |
Config.Keys.Cancel | Backspace | The 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)
| Setting | Default | What it does |
|---|---|---|
Config.Behaviour.CancelOnMove | on | Stops the emote when the player walks off. Turn it off if you want emotes to hold until cancelled. |
Config.Behaviour.CancelOnAim | on | Stops the emote when the player draws or fires a weapon. Leave it on. |
Config.Behaviour.HolsterWeapons | on | Puts weapons away before an emote starts. |
Config.Behaviour.AllowWhileMounted | off | Lets emotes play on a horse or in a wagon. Most animations look broken mounted. |
Config.Behaviour.AllowWhileSwimming | off | Lets emotes play in water. Strongly advised off: the character usually sinks or freezes. |
Ragdoll (Ragdoll tab)
| Setting | Default | What it does |
|---|---|---|
Config.Ragdoll.Enabled | on | Turns the ragdoll key and command on. Off removes both. |
Config.Ragdoll.Key | Z | The 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.MinSeconds | 2 | The least time a player stays down. A second press sooner is ignored. |
Config.Ragdoll.Cooldown | 3 | Seconds after getting up before a player can drop again. Stops players spamming it to dodge a lasso or a fight. |
Config.Ragdoll.MaxSeconds | 0 | The longest a player can stay down before they are stood up. 0 means no limit. |
Config.Ragdoll.AllowWhileMounted | off | Lets players drop while riding, which throws them off. |
The menu (Menu tab)
| Setting | Default | What it does |
|---|---|---|
Config.Menu.RecentCount | 12 | How many recent emotes each character keeps. 0 turns Recent off. |
Config.Menu.Favourites | on | Lets players star emotes. |
Config.Menu.StayOpenAfterPlay | off | Where the Keep menu open switch starts for a new player. After that, each player's own choice is remembered. |
Config.Menu.FilterByGender | on | Hides emotes built for the other gender. Off shows every emote to everyone. |
Config.Menu.CategoryOrder | all 11 | Which 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)
| Setting | Default | What it does |
|---|---|---|
Config.Nearby.Enabled | on | Shows the Nearby tab at all. |
Config.Nearby.Radius | 4.0 | How far around the player to look, in metres. |
Config.Nearby.MaxRows | 40 | The most rows shown at once, closest first. |
Config.Nearby.WalkTimeout | 10 | Seconds the character may go without getting closer before the action is cancelled with "You cannot get there." |
Config.Nearby.Chains | on | Runs two-part actions (pick a bale up, carry it, set it down) all the way through. These rows are marked carry. |
Config.Nearby.AdminsCanBlock | on | Lets 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.BlockRadius | 0.75 | How close, in metres, a "Here only" block reaches. |
Config.Nearby.Blocked | empty | The blocked actions. Filled in from the game (see Permissions), or by hand. |
Config.Nearby.Marker.Enabled | on | Draws a soft pink circle on the thing the highlighted row belongs to, so players see which chair "Sit down" means. |
Config.Nearby.Wall.Enabled | on | Offers lean, smoke, drink and brace actions against a wall beside the player. |
Config.Nearby.RequireUsable | off | Also asks the game whether the character may use each spot. Turn on if rows appear that the character then refuses. |
Config.Nearby.ShowUnknown | off | Lists spot types the script has no name for. Useful for a moment while you hunt for one to label. |
Config.Nearby.Debug | off | Prints what the walk sees in the player's F8 console. Leave off on a live server. |
Four lists shape the tab:
Config.Nearby.Labelsturns the game's spot names (likePROP_HUMAN_SEAT_CHAIR_DRINKING) into words ("Sit and drink"). Anything not listed is named from the spot itself.Config.Nearby.Keywordsadds 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.Prefixesis the allow-list of spot types. The defaults keep the human and player ones and leave out animal, ambient and cutscene types.Config.Nearby.Hiddenlists 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)
| Setting | Default | What it does |
|---|---|---|
Config.Preview.Enabled | on | Shows 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.Alpha | 200 | How solid it looks, from 0 (invisible) to 255 (solid). |
Config.Preview.OffsetRight / OffsetForward / OffsetHeight | 1.0 / 0.75 / 0.0 | Where it stands, in metres from the player. |
Config.Preview.LightEnabled | on | A soft light on the preview so it can be seen at night. |
Config.Preview.LightColour / LightRange / LightIntensity | white / 3.0 / 10.0 | The 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.
| Field | What it is |
|---|---|
name | What the player types after /e. Lower case, no spaces. |
label | The name shown in the menu. |
category | Which 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#
| Command | Who | What it does |
|---|---|---|
/emotes | Everyone | Opens the emote menu. Again to close it. |
/e <name> | Everyone | Plays one emote straight away, for example /e wave. On its own it opens the menu. |
/ec | Everyone | Stops the emote and puts away any prop. |
/ragdoll | Everyone | Drops the character limp. Again to get up. |
All four command names can be changed in the settings (see Configuration).
| Key | What it does |
|---|---|
| End | Opens and closes the menu. |
| Backspace | Stops the emote and puts away any prop, including while riding. With the menu open, use its Stop emote button instead. |
| Z | Ragdoll: 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.AdminsCanBlockis 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
- Press End or type
/emotes. The menu opens on the first category that has anything in it. - Start typing to search. The search looks at the shown name and the typed name, in every category.
- Click the â–¶ in front of a name, or hover the row, to watch the stand-in character play it. The menu stays open.
- Click the name, or move to it with the arrow keys and press Enter, to play it.
- Stop with Backspace,
/ecor 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
- Open the menu. Nearby is the first tab.
- A marker shows which thing the highlighted row belongs to. Tab jumps to the next thing.
- Click a row, or press Enter. The character walks over, turns, and does it.
- Stop with Backspace,
/ecor 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)
- Open the Nearby tab next to the broken spot. As a dev you see a small × on every row.
- Click it and choose Here only (that action at that one spot) or Everywhere (that action on every copy of the prop).
- 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
/ecor 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
- Check the console on first start for skipped custom emotes.
- Open
/poggy, find Poggy Emotes, and look at the Emotes tab. - Play a prop emote, then mount a horse. The prop should be put away.
- 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.OpenMenuKeyis not a key the script knows, or if this RedM build cannot read the keyboard directly. In that case setConfig.Keys.OpenMenuControl./emotesalways 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
dictoranim. The player's F8 console names the dictionary that failed to load. - My custom emote is not in the menu.
- Check that its
categoryis inConfig.Menu.CategoryOrder, itsnameis not inConfig.HiddenEmotes, and itsgendermatches 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.Enabledis off, orConfig.Preview.Modelis 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.OffsetRightandOffsetForward. - 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.Enabledand that"nearby"is inConfig.Menu.CategoryOrder. IfConfig.Nearby.RequireUsableis 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
/eplays 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.