Before You Begin#
Pause Menu Creator has almost no requirements. The menu itself runs on an empty server; the only thing it needs from you is a MySQL driver, so the themes you make and the places your players save have somewhere to live.
Requirement | Status | Notes |
|---|---|---|
| Required to save | Stores your themes and the players' saved places. Without one the menu still opens and draws the bundled themes, but nothing can be saved. |
Framework | Optional |
|
Notifications | Optional |
|
Everything optional is detected by looking at what is already running:
Layer | Detection order |
|---|---|
Framework |
|
Database |
|
Notifications |
|
Every optional integration degrades quietly: a missing framework hides the rows it would have filled rather than printing $0, and nothing errors. Integrations has the details and how to pin one by hand.
Downloading Pause Menu Creator#
After purchasing Pause Menu Creator, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Pause Menu Creator.
After extracting the download, you should have the following folder:
qs-pausemenu/
├── shared/config.lua -- the configuration
├── custom/ -- framework adapters, notifications, blip hook (editable)
├── locales/ -- 41 languages (editable)
├── database/sql.sql -- the schema, if you want to import it by hand
├── images/ -- your logos, headers and avatars
├── videos/ -- your background clips (WebM)
├── stream/ -- reads blip names from the game
├── client/ · server/ -- the resource itself
└── web/ -- the interface, already builtThe folder must be named
qs-pausemenu. Your images and videos are served fromhttps://cfx-nui-qs-pausemenu/, the blip hook other resources include is@qs-pausemenu/custom/blip_hook.lua, and every export is called asexports['qs-pausemenu']— a renamed copy stops matching all three.
Installing the Resource#
Move the qs-pausemenu folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-pausemenu/Then open your server.cfg and make sure the database driver and your framework start before Pause Menu Creator:
ensure oxmysql
# Framework (one of them)
ensure es_extended
# ensure qb-core
# ensure qbx_core
# ensure qs-core
# Optional notifications
ensure ox_lib
ensure qs-pausemenuThe loading order matters for the database, which is looked for once at boot. A framework that starts late is less of a problem: with Config.Framework = 'auto', detection is tried again a few seconds later and the right adapter is swapped in.
The Database#
There is no SQL file you have to import. Pause Menu Creator creates its three tables on start with CREATE TABLE IF NOT EXISTS, so it never touches data that is already there. database/sql.sql holds the same statements in plain SQL, for anyone who wants the tables in place before the server has ever run.
Table | Holds |
|---|---|
| The themes you saved from the creator, one row each. |
| Which theme is live for the whole server. |
| The places each player saved on the map, against their character. |
The eight bundled themes are not in the database. They ship inside the interface, so the menu can draw before it has spoken to the server — which is also why there is nothing to seed. Installs that stored saved places in the older two-column format are moved to the new one automatically on the first start; the console says how many were moved.
Granting Creator Access#
The creator decides what every player sees, so /pausecreator is behind a permission check. Either of these routes is enough:
Works on every server, with or without a framework. Grant the ace command.pausecreator (the value of Config.Creator.permission) in server.cfg, either to a group or to one player:
# To your admin group
add_ace group.admin command.pausecreator allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.admin
# Or to one player directly
add_ace identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx command.pausecreator allowAny player in one of the groups listed in Config.Creator.adminGroups is let in. The check goes through custom/, so it uses your framework's own groups — ESX groups, QBCore and Qbox permissions.
Config.Creator = {
command = 'pausecreator',
permission = 'command.pausecreator',
adminGroups = {
'admin',
'superadmin',
'god',
},
}Configuring the Resource#
The config file is short on purpose. How the menu looks — every module, colour, font, page and button — lives in the creator, in game. The files are for plumbing:
File | Contents |
|---|---|
| The language, the framework, the commands, ESC behaviour, the server's name and links, actions, storage, the player photo, saved places, the realistic map. |
| One adapter per framework, the notification function and the creator's group check. Yours to change. |
| Included by your other resources so the map legend knows their blips' names. |
| The 41 translations of the notifications and the creator. |
| Your media. Anything you drop in shows up as a choice in the creator. |
The values worth reviewing first:
Config.Language = 'en' -- one of the 41 files in locales/
Config.Framework = 'auto' -- 'auto' | 'qs' | 'esx' | 'qb' | 'standalone'
Config.Menu.replacePauseMenu = true -- take over ESC
Config.Menu.command = 'pausemenu' -- opens it without the ESC hook
Config.Menu.defaultTheme = 'launch' -- what players get before you set one live
Config.Server = {
name = 'Quasar Roleplay', -- empty uses sv_hostname
discord = 'discord.gg/quasar-store',
website = 'quasar-store.com',
}Every section of the file, with its defaults:
Config.Menu — opening, ESC and the live feed
Config.Menu = {
replacePauseMenu = true, -- ESC opens this menu instead of GTA's
command = 'pausemenu', -- opens it directly, skipping the ESC hook
extraKey = '', -- an extra key that also opens it ('' = none)
freezePlayer = false, -- freeze the character while it is open
blurBackground = true, -- blur the game behind it
enableControlsWhenFocus = false,-- let the game keep reading keys
updateInterval = 200, -- ms between live data updates
showGameBlips = true, -- mirror the game's blips onto the map
readBlipNames = true, -- read each blip's real name from the game
defaultTheme = 'launch', -- launch, onyx, aurora, carbon, cyberpunk,
-- ivory, hackerman, velvet
}updateInterval is the one knob between smooth and cheap: it is how often the player's position, money and condition reach the page while the menu is open. An update that changes nothing is never sent, so a player reading the menu standing still costs almost nothing.
Config.BlipNames — fallback names for the map legend
Config.BlipNames = {
-- [357] = 'Garage',
-- [71] = 'Barber',
-- [73] = 'Clothing Store',
}A name per blip sprite id, used only for a blip whose real name could not be found any other way. Usage → Blip names explains the order names are looked for in.
Config.Actions — what buttons may do
Config.Actions = {
-- Commands a menu button may never run, whatever a theme says.
blockedCommands = { 'quit', 'connect', 'restart', 'stop', 'start', 'refresh' },
-- 'quit' drops the player from the server, 'event' fires disconnectEvent
-- so your own script can save and disconnect them.
disconnect = 'quit',
disconnectEvent = 'qs-pausemenu:client:disconnect',
disconnectReason = 'You left the server.', -- shown after 'quit'
-- Page of GTA's own pause menu that "Open GTA's settings" opens. 42 is Settings.
gtaSettingsComponent = 42,
}Config.Database — the driver and table names
Config.Database = {
driver = 'auto', -- 'auto' | 'oxmysql' | 'mysql-async'
themesTable = 'qs_pausemenu_themes',
settingsTable = 'qs_pausemenu_settings',
blipsTable = 'qs_pausemenu_blips',
}
Config.MaxThemes = 50 -- how many saved themes the server will holdConfig.Mugshot — the player's photo
Config.Mugshot = {
enabled = true,
transparent = true, -- cut out against nothing, instead of the mugshot backdrop
refresh = 120000, -- ms between retakes; it is also retaken on a model change
}Config.Places — places players save on the map
Config.Places = {
limit = 30, -- per player
icons = { 'pin', 'star', 'home', 'car', 'wallet', 'briefcase',
'heart', 'gem', 'fire', 'shield', 'cart', 'key' },
colors = { '#38bdf8', '#22c55e', '#fbbf24', '#fb7185',
'#a78bfa', '#f472b6', '#f97316', '#e2e8f0' },
}The server only accepts icons and colours from these lists, so a player cannot save anything the panel did not offer.
Config.RealisticMap — the 3D map
Config.RealisticMap = {
enabled = true, -- the master switch; a theme can only turn it off
height = 900.0, -- camera distance from the ground when it opens
minHeight = 90.0, -- closest the mouse wheel can take it
maxHeight = 3200.0, -- furthest
clearWeather = true, -- clear sky while it is up, the server's weather after
}Config.Language, Config.Framework and Config.Debug
-- ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id,
-- it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk,
-- ur, vi, zh
Config.Language = 'en'
Config.Framework = 'auto' -- 'auto' | 'qs' | 'esx' | 'qb' | 'standalone'
Config.Debug = false -- extra console outputVerifying the Installation#
Restart your server and read the console. Two lines tell you the install is healthy:
[qs-pausemenu] framework loaded: esx
[qs-pausemenu] storage driver: oxmysqlframework loaded names the adapter it picked — standalone means no framework was found. storage driver means themes and places can be saved; if you see no database resource found instead, start oxmysql above this resource.
Then join your server and work through the first loop:
Press ESC
The Launch theme opens instead of GTA's pause menu. Its map shows where you are, and its buttons switch pages. ESC again closes it.
Open the creator
Type
/pausecreator. The eight bundled themes are listed on the left; pick one and it opens on the canvas, ready to edit.Set a theme live
Change something, press Save, then Set live. Every player gets it the next time they press ESC — nobody reconnects. Usage covers everything the creator can do.
Nothing about the look needs a restart from here on. Themes are designed, saved and set live in game; only
shared/config.luachanges need the resource restarted.



