Pepper RP-Commands
Free roleplay commands with modern speech bubbles – /me, /do, /try, /status, /whisper, /shout and more. Standalone.
Free and open source: https://github.com/PepperScripts/pepper_rpcommands
Overview
Pepper RP-Commands brings ten roleplay commands like /me, /do, /try and /status to your server. The text
appears as a speech bubble above the head and, if you want, as a line in chat – but only for players in range and,
optionally, only with line of sight. Dice, coin and /try are decided by the server, so nobody can fake a result. It
runs standalone and takes the character name from ESX, QBCore or Qbox when one is running.
Features
- 10 commands:
/me,/do,/try,/roll,/dice,/coin,/status,/looc,/whisper,/shout - Modern speech bubbles above the head with an icon per command – or
minimal(text with shadow) orclassic(GTA font) /statuskeeps a text above your head (e.g. "injured") until you remove it or the time runs out- Several texts stack above a player, long texts wrap
- Character name from ESX, QBCore or Qbox in the chat line – detected automatically
/try,/roll,/diceand/coinare decided on the server, so nobody can fake a result- Only players in range receive the text (same routing bucket); optional line-of-sight check, so nothing shows through walls
- Discord webhook log, word filter, admin commands to clear texts and mute players
- Exports for other resources
- English, German, French, Spanish and Dutch
- No dependencies; the draw loop only runs while a text or status is active
Requirements
| Dependency | Required/optional | What for | Link |
|---|---|---|---|
FiveM server (fx_version 'cerulean', Lua 5.4) |
required | Runs the resource | https://docs.fivem.net/docs/server-manual/setting-up-a-server/ |
| ESX Legacy, QBCore or Qbox | optional | Character name in the chat line and admin groups; without a framework FiveM name + ACE | – |
| Chat resource (default chat or e.g. Pepper Chat) | optional | Chat line, hints and command suggestions (chat:addMessage, chat:addSuggestion) |
Pepper Chat |
| OneSync | optional | With OneSync the server sends texts only to players in range; without it to everyone, the client checks the distance itself | – |
| Database | not needed | No database, no oxmysql – status and mutes live in the server's memory | – |
Installation
- Put the
pepper_rpcommandsfolder into yourresourcesfolder. Do not rename the folder – the exports are calledexports.pepper_rpcommands:…. - Add it to your
server.cfg, after your framework and your chat:ensure es_extended # or qb-core / qbx_core – optional ensure chat # or pepper_chat ensure pepper_rpcommands - Remove other resources that register
/meor/do, otherwise both will answer. - Set
Config.Localeinconfig.luaand restart the server. - Optional – admin rights via ACE:
add_ace group.admin pepperrp.admin allow
Updating from 1.x: replace the whole folder. If you changed config.lua, copy your values into the new file – the
new commands only appear with the new config. config_server.lua is new and belongs to it.
First test
- In game type
/me opens the trunk– a speech bubble appears above your head and a line in chat. /try pick the lock– the server decides "succeeds" or "fails"./dice 2d6– two dice with single results and the sum./status injuredsets a lasting text,/statuswithout text removes it.- With a second player:
/whisper over hereis only visible within 3 m.
Configuration
| File | Controls |
|---|---|
config.lua |
Language, style, size, range, duration, stack, line of sight, length, cooldown, chat, name, all commands (sent to players) |
config_server.lua |
Webhook, console log, word filter, admin groups and commands (server only) |
locales/*.json |
Texts above the head, chat lines and hints per language |
html/style.css |
Look of the speech bubbles (styles modern and minimal) |
General
| Option | Default | Description |
|---|---|---|
Config.Locale |
'en' |
en, de, fr, es or nl |
Config.Style |
'modern' |
modern (speech bubble with icon), minimal (text with shadow) or classic (GTA font like version 1) |
Config.Scale |
1.0 |
Size of the bubbles |
Config.Distance |
15.0 |
Default range in metres |
Config.Duration |
7000 |
How long a text stays above the head (milliseconds) |
Config.MaxStack |
3 |
Texts stacked above one player; older ones disappear |
Config.RequireLineOfSight |
true |
Only show texts with line of sight (not through walls) |
Config.MaxLength |
150 |
Max input length (up to 250) |
Config.Cooldown |
1500 |
Wait between two commands per player (ms) |
Config.Chat |
true |
Also a chat line for everyone in range |
Config.NameMode |
'character' |
character (name from ESX/QBCore/Qbox, else FiveM name) or fivem |
Config.GetName |
nil |
Own name function (runs on the server, overrides NameMode) |
Commands
Config.Commands = {
me = { enabled = true, name = 'me', color = { 255, 196, 107 }, icon = 'me' },
try = { enabled = true, name = 'try', color = { 196, 160, 255 }, icon = 'try', chance = 50 },
status = { enabled = true, name = 'status', color = { 200, 205, 215 }, icon = 'status', maxLength = 60, maxMinutes = 60 },
whisper = { enabled = true, name = 'whisper', color = { 190, 215, 230 }, icon = 'whisper', distance = 3.0 },
-- …
}
| Field | Description |
|---|---|
enabled |
false turns the command off |
name |
Command name without / |
color |
Colour as { red, green, blue } (0–255) |
icon |
me, do, try, dice, coin, status, ooc, whisper, shout |
distance |
Own range (otherwise Config.Distance); whisper 3 m, shout 35 m |
overhead / chat |
false hides the speech bubble or the chat line for this command |
chance (try) |
Success chance in percent, default 50 |
default / max (roll) |
Sides without input 6, at most 1000 |
maxDice / maxSides (dice) |
At most 10 dice with 100 sides each |
maxLength / maxMinutes (status) |
Status text up to 60 characters, expires after 60 minutes (0 = until logging out) |
Server settings (config_server.lua)
| Option | Default | Description |
|---|---|---|
ServerConfig.Webhook |
'' |
Discord webhook for the log of all RP commands (name, server ID, licence), '' = off |
ServerConfig.ConsoleLog |
false |
Also print every line to the server console |
ServerConfig.Filter.mode |
'censor' |
censor (asterisks), block (reject the command) or off |
ServerConfig.Filter.words |
empty | Filtered words (case-insensitive) |
ServerConfig.Admin.groups |
{ 'god', 'superadmin', 'admin', 'mod' } |
Framework groups allowed to use admin commands |
ServerConfig.Admin.commands |
rpclear, rpmute, rpunmute |
Names of the admin commands |
ServerConfig.Admin.defaultMuteMinutes |
30 |
Mute duration without input (1 to 10080 minutes) |
Commands and permissions
| Command | Who | Example → above the head |
|---|---|---|
/me [text] |
everyone | /me opens the trunk → opens the trunk |
/do [text] |
everyone | /do The door is locked. |
/try [text] |
everyone | /try pick the lock → tries to pick the lock – succeeds / fails |
/roll [sides] |
everyone | /roll 20 → rolls 14 (1–20) |
/dice [dice] |
everyone | /dice 2d6 → 3 + 5 = 8 (also d20 or 3 = 3d6) |
/coin |
everyone | flips a coin: heads |
/status [text] |
everyone | lasting text; /status alone removes it |
/looc [text] |
everyone | (( brb )) – local OOC chat |
/whisper [text] |
everyone | only visible within 3 m |
/shout [text] |
everyone | visible within 35 m |
/rpclear [ID] |
admin | Remove texts and status of one player – without ID of everyone |
/rpmute ID [minutes] |
admin | Block RP commands for a player (stays after reconnecting) |
/rpunmute ID |
admin | Unblock |
Admin is whoever has the ACE permission pepperrp.admin, a group from ServerConfig.Admin.groups (ESX group,
QBCore permission or ACE group on Qbox) or the server console. The RP commands themselves do not work from the
console. There are no keys.
Exports and events
-- Server
exports.pepper_rpcommands:ShowText(source, 'opens the safe', { color = { 255, 196, 107 }, icon = 'me', duration = 5000, distance = 10.0 })
exports.pepper_rpcommands:SetStatus(source, 'handcuffed', 10) -- minutes optional
exports.pepper_rpcommands:ClearStatus(source)
exports.pepper_rpcommands:GetStatus(source) -- text or nil
exports.pepper_rpcommands:IsMuted(source) -- true / false
-- Client
exports.pepper_rpcommands:ShowLocalText(serverId, 'only you see this', { icon = 'do' })
exports.pepper_rpcommands:SetHidden(true) -- hide everything, e.g. for a cinematic mode
| Side | Export | Effect |
|---|---|---|
| Server | ShowText(source, text, options) |
Speech bubble above a player for everyone in range; options.chat = own chat line |
| Server | SetStatus(source, text, minutes) / ClearStatus(source) / GetStatus(source) |
Set, remove, read a lasting text |
| Server | IsMuted(source) |
Is the player blocked from RP commands? |
| Client | ShowLocalText(serverId, text, options) |
Speech bubble only for this player |
| Client | SetHidden(bool) |
Hide/show all texts |
Icons: me, do, try, dice, coin, status, ooc, whisper, shout, chat.
FAQ
/me answers twice – what now?
Another resource registers /me or /do as well (often an old RP script or a framework module). Remove it or rename
the commands here via name in Config.Commands.
I see the speech bubble but no chat line?
The chat line goes through chat:addMessage – a chat resource must be running (default chat or Pepper Chat). Also
check Config.Chat = true and that the command does not have chat = false.
Why don't I see other players' texts?
You must be in range (15 m by default, whisper 3 m) and in the same routing bucket. With
Config.RequireLineOfSight = true texts behind walls are hidden – set it to false for testing.
Do I need a database?
No. Status and mutes live in the server's memory. A mute is tied to the licence and lasts through a reconnect, but ends with a restart of the resource or the server.
How long does a /status stay?
Until the player types /status without text, logs out or maxMinutes runs out – 60 minutes by default. With
maxMinutes = 0 it stays until logging out.
How do I show the character name instead of the FiveM name?
Config.NameMode = 'character' (default) takes the name from Qbox, QBCore or ESX. For other frameworks set
Config.GetName = function(source) … end – the function runs on the server.
How do I change colours and look?
The colour per command is in Config.Commands (color), the style in Config.Style, the size in Config.Scale.
Finer details of the bubble are in html/style.css.
How do I change the texts?
In locales/<language>.json, e.g. the lines above the head (overhead_…) and in chat (chat_…).
Can a player fake the result of /try or /dice?
No. The server draws the random numbers, the client only shows the result. You set the success chance of /try with
chance.
How do I use the speech bubbles from my own script?
On the server exports.pepper_rpcommands:ShowText(source, 'Text', { icon = 'me' }), for a lasting text
SetStatus(source, 'handcuffed', 10). Details under "Exports and events".
Are colour codes or HTML shown in the text?
No. The server removes control characters, GTA codes (~r~), chat colour codes (^1) and angle brackets before the
text is sent out.
How do I log all RP commands to Discord?
Put the webhook URL into config_server.lua at ServerConfig.Webhook. The file stays on the server.
How do I update Pepper RP-Commands?
Replace the folder, back up config.lua and config_server.lua first and copy your values into the new files.
Changes are listed in the CHANGELOG.md in the resource folder.
Support
Questions or bugs? Open a ticket in our Discord: https://discord.gg/6NaFJWKDYu – link your purchase with /verify
first. The source code is on GitHub: https://github.com/PepperScripts/pepper_rpcommands
Permanently tested on the Pepper Scripts dev server.
Changelog
Current version 2.0.0: speech bubbles in three styles, /status, /looc, /whisper, /shout, /coin, /dice,
character name, webhook, admin commands, word filter, exports and three new languages. All changes are listed in the
CHANGELOG.md in the resource folder.
Found a mistake? Report it on Discord.