What goes wrong most often, what it actually means, and what to do about it. Most of these come down to a step of Installation or one value in config/main.lua.
Installation and Access#
"You don't have permission to use /pingpongcreator."
The ace in Config.Creator.permission — command.pingpongcreator unless you changed it — is not granted to you. Add it to a group you are in and restart the server; aces are read when server.cfg runs.
add_ace group.admin command.pingpongcreator allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.adminIf you renamed the permission, the ace you grant must match Config.Creator.permission exactly.
qs-pingpong does not start, and the console names a missing dependency
Ping Pong needs OneSync, ox_lib, oxmysql and pingpong-objects running before it. Check that pingpong-objects is in your resources folder with exactly that name, that every dependency is ensured above qs-pingpong, and that OneSync is enabled on the server.
Tables vanish after a restart, or the console shows "Table … qs_pingpong_tables doesn't exist"
The database was not imported. Ping Pong does not create its tables: import database/sql.sql and restart. Tables placed before that were never saved and have to be placed again.
"Server framework loaded: standalone" on an ESX, QBCore or Qbox server
The framework started after Ping Pong, so it was not there to be detected — bets move no money and names come from FiveM. Move the framework's ensure above qs-pingpong, or force the mode with Config.Framework = 'esx' (or 'qb').
"Missing locale key" or "Locale file not found" in the console
Your translation lacks some keys, or Config.Locale names a file that does not exist. Both are harmless — English fills the gaps — but check the code is one of the 41 in locales/ and copy any missing keys over from en.json.
A large translucent sphere appears around a table during matches
That is the spectator zone, drawn because Config.Debug is on — it ships switched on. Set Config.Debug = false and restart.
Tables#
The [E] - Ping Pong prompt does not appear
One of three things:
Config.UseTarget = true— the prompt is replaced by ox_target options.You are more than 2.5 m from the centre of the table (
Config.InteractDistance). Stand at one end or along a side.You are already in a match.
A table does not show up
Tables are only spawned within 30 m (Config.StreamDistance). If you are close and it is still missing, its model failed to load — the F8 console says Model load timeout. Check Config.Creator.model if you changed it.
"Model could not be loaded. Check Config.Creator.models."
The placing mode could not load Config.Creator.model within 3 seconds: the name is wrong, or the model is not part of the game or of a streamed resource. Put back `prop_table_tennis` to test.
The table floats or sinks into the floor
The placing aim lands on the first surface it meets — a rug or another prop counts. Open the table in the creator, press Reposition, aim at bare floor and correct it with the mouse wheel, 5 cm per step.
A table's price or mode switches have no effect
They are saved with the table but not applied in this version: matches are free at every table and every mode in Config.Modes is offered. To remove a mode, delete its line from Config.Modes.
Config.AutoDetect = true does nothing
Tables on maps are not picked up in this version; Config.AutoDetect and Config.TableModel are not used. Place every table with /pingpongcreator — on top of a map's own table if you like.
Playing#
"You don't have enough money. You need $…"
The stake is more than the player's cash — bets use cash, not the bank, unless you changed the money functions (Integrations). Against the bot the same message appears when the stake is below Config.Betting.min — the slider starts at No Bet, so a small stake like $50 is refused with the default minimum of $100.
"No players nearby"
Nobody else is within 15 m of the table — measured from the table, not from you (Config.NearbyPlayerRadius).
"No player selected"
The match settings were confirmed for a duel without an opponent picked first. This is what the Play vs Player ox_target option does in this version. Challenge from the [E] menu instead, which shows the player list first — with Config.UseTarget = false.
"This player already has a pending challenge" / "You already sent a challenge"
Each player can have one challenge out and one waiting at a time. Wait for the answer, or for the invitation to expire after 30 seconds.
"This table is already in use."
A duel is being played at that table, or a challenge for it was accepted a moment ago. Wait for it to finish, or use another table.
The racket goes straight through the ball
It could not hit at that moment. The racket is faint — and cannot hit — for half a second at the start of each point and until you move it clear of the ball; after a hit it waits 350 ms (Config.Physics.hitCooldown); and it only hits a ball on its way to you. Pull the racket back and meet the ball again.
Returns are slow, or always go to the same place
Speed and direction come from how the mouse is moving as the racket meets the ball. A still racket only blocks the ball back; flick forward through it for pace and sweep sideways to place it.
The ball stutters for the second player in a duel
The player who accepted the challenge follows the challenger's ball, so a high ping shows as small corrections. Three values tune it:
Config.MpTickMs = 16 -- ms between updates; lower = more updates
Config.MpCorrection = 0.35 -- 0-1; higher follows the challenger's ball more tightly
Config.MpSnapDistance = 0.5 -- metres of drift before the ball jumps into placeA duel did not change the leaderboard
Only duels that end with a winner after at least 15 seconds are rated (Config.Leaderboard.minMatchDuration). A duel somebody left, a bot match, or Config.Leaderboard.enabled = false are never rated.
Bets move no money
Ping Pong is running standalone — the console says Server framework loaded: standalone. Start your framework before it, as above.
Messages#
Every message comes from the locale file in Config.Locale. The ones players ask about most:
Key | Message | Means |
|---|---|---|
| You don't have enough money. You need $… | Not enough cash for the stake — or, against the bot, a stake outside |
| This table is already in use. | A duel is on at that table. |
| Your opponent has left the match. | They left or disconnected. If there was a stake, you have the pot. |
| No players nearby | Nobody within 15 m of the table. |
| No player selected | Duel settings confirmed with no opponent picked. |
| This player already has a pending challenge | Someone else challenged them first. |
| You already sent a challenge | Your previous challenge has not been answered yet. |
| The opponent doesn't have enough money for this bet | Checked when the challenge is sent. |
| The challenger no longer has enough money | Checked again when the challenge is accepted; the challenge is dropped. |
| … declined your challenge | They pressed Decline. |
| Challenge expired | 30 seconds passed without an answer. |
| Challenge was cancelled | The player you challenged disconnected before answering. |
| You don't have permission to use /pingpongcreator. | The creator ace is not granted to you. |
| Model could not be loaded. Check Config.Creator.models. |
|
Still stuck? Open a ticket and include the
[qs-pingpong:…]lines from your server console, your F8 console, and yourconfig/main.lua.



