What goes wrong most often, what it actually means, and what to do about it. Most of these are configuration, not faults — check the matching entry before opening a ticket.
Installation and Access#
"You don't have permission." on /ahcreator
The ace in Config.Creator.permission — command.ahcreator by default — is not granted to you. Add add_ace group.admin command.ahcreator allow, put your identifier in that group with add_principal, and restart the server — aces are read when server.cfg is executed. Check that the identifier belongs to the account you are playing on. See Installation.
The creator window does not open, or is blank
The interface ships ready to use in web/build/. If that folder is missing or was only partly copied, the window cannot load and there is no error in game — copy the whole resource again from your download.
Nobody is charged for anything
Either the tables are free — fees are set per table in the creator, and tables from Config.Tables or the map are free until you edit them there; Config.PlayPrice is not used — or Air Hockey is running standalone because your framework starts after qs-airhockey. Move its ensure above ensure qs-airhockey and restart. Standalone never takes money unless you define Config.CanAfford and Config.RemoveMoney.
Tables placed with the creator disappear after a restart
They are not reaching the database. Look for [qs-airhockey] Loaded N table(s) from SQL. in the server console: if it is missing, or errors appear above it, oxmysql is not connected, or your database user cannot create the table — import database/sql.sql by hand once. Tables made with the debug commands /ahplace and /ahspawn are never saved.
"Locale not found, falling back to en" in F8
Config.Locale is set to a code with no file in locales/. Use one of the 41 codes listed in Integrations, or add the file.
"Migrated N table(s) to the JSON coords column" in the console
Not an error. An update moved your tables from the old position columns into the new coords column. It happens once, and every table keeps its place.
Tables#
The [E] - Play Air Hockey prompt does not appear
You are too far — it appears within 2.5 m of the table's centre (Config.InteractDistance) — or the table's prop is not there yet: tables from the creator and the config are spawned on each player's screen once they come within 30 m, checked every two seconds. It is also hidden during your own match.
A table I deleted came back
It is also in Config.Tables, or it is a map table and Config.AutoDetect is on. Delete the line from the config, or set AutoDetect = false so map tables are no longer registered.
An air hockey table on my map cannot be played
Config.AutoDetect is off, or the map uses a different model from Config.TableModel. Tables are looked for around each player every two seconds, so give it a moment after arriving. A different model also needs its playing area calibrated — see Usage.
A table from Config.Tables floats in the air
Its line was probably made with /ahhere, which prints your character's position — about a metre above the floor. Lower the z value, or take the line printed by the creator or /ahplace, which sit on the floor.
The puck is invisible
None of the models in Config.PuckModels exists in your game, so there is nothing to draw — the game itself still plays. Turn on Config.Debug and run /ahcheck to see which puck models are valid, then put a valid one in the list. With debug on, a dark disc stands in for a missing puck.
The puck floats above the table, sinks into it, or bounces off thin air
Config.Table no longer matches the table — usually after changing Config.TableModel or editing the geometry. Calibrate it with /ahbounds, /ahtune, /ahup and /ahdown; see Usage.
Goals are not counted where the holes are
The goal mouths are Config.Table.goalHalfWidth either side of the centre of each end rail. /ahbounds draws them in orange; widen or narrow them with /ahtune gw until they match the table.
Playing#
"You don't have enough money to play."
The table's entry fee is more than the player has in that account. The fee comes from the account chosen in the creator — Cash or Bank. In a duel both players must be able to pay it.
"No players nearby to challenge."
Nobody else is within 15 m of the table. Raise Config.NearbyPlayerRadius for larger rooms.
"That player is busy right now."
They are in a match, or another challenge is already waiting for their answer.
"You already have a pending challenge."
Only one challenge can be out at a time. It expires after 30 seconds if it is not answered.
"That table is no longer available."
Somebody started a game on that table before the challenge was accepted, the table was deleted, or the challenger could no longer pay when it was accepted.
"Opponent disconnected." in the middle of a match
The other player left — with Backspace and Confirm, or by disconnecting. A duel cannot go on with one player, so it ends with no result.
The paddle is too slow or too fast
Change Config.Mouse.sensitivity — 0.09 by default. Higher moves the paddle further for the same mouse movement.
The bot is too hard, or too easy
Tune Config.NPC: lower speed and raise errorRange to make it easier, the opposite to make it harder. aggression moves the line it defends. Every value is explained in Usage.
In a duel the puck jumps on the challenged player's screen
The challenger's game runs the puck; the other player's screen predicts it and is corrected as updates arrive, so a high ping on either side shows as small jumps. Small differences are blended in (Config.MpCorrection), large ones snap at once (Config.MpSnapDistance). The defaults suit most servers — change them in small steps.
The entry fee was not given back
Entry fees are never returned — they are the price of using the table, whatever the result, and whoever leaves.
The winner did not get paid
By design: Air Hockey has no bets and no prize money. The only money involved is each table's entry fee.
Calibration#
"Activa Config.Debug = true para usar este comando."
The debug tools only run with Config.Debug = true. Set it, restart the resource, and remember to turn it off again afterwards — the tools do not check the creator permission.
"No hay mesas cercanas." or "No hay mesas registradas."
/ahbounds, /ahtune and /ahwatch work on the nearest registered table, and none is known to your game yet. Walk up to one, or place a test table with /ahspawn first.
My calibration was lost after a restart
The tools change the values on your screen only. Copy the Config.Table line printed in F8 into config/config.lua, and restart the resource so every player gets it.
Messages#
The server sends locale keys, not sentences, so each player reads every message in the language set in Config.Locale. The ones that point at a problem:
Key | Message | Means |
|---|---|---|
| You don't have enough money to play. | The entry fee is more than the player has in that account. |
| You don't have permission. | The creator ace is not granted to that player. |
| Failed to load the model. | The model in |
| No players nearby to challenge. | Nobody else within |
| That player is busy right now. | In a match, or already holding a challenge. |
| Your challenge was declined. | The opponent pressed Decline. |
| Your challenge expired. | Thirty seconds passed with no answer. |
| That table is no longer available. | A game started on the table, it was deleted, or the challenger can no longer pay. |
| Opponent disconnected. | The other player left the match or the server. |
| The game has ended. | The table was deleted, or the server closed the game, while you were playing. |
Still stuck? Open a ticket and include the
[qs-airhockey]lines from your server console, your framework and its version, and the relevant part ofconfig/config.lua. A screenshot of the F8 console helps for anything about the interface or the props.



