> For the complete documentation index, see [llms.txt](https://devmosaic.gitbook.io/devmosaic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://devmosaic.gitbook.io/devmosaic/resources/devmosaic-dm-tennis/troubleshooting.md).

# Troubleshooting

Fixes for the most common problems: missing terminal, keys that do nothing, matches that will not start, and calls that look wrong.

### The terminal does not appear at a court

* Make sure the resource started without errors: `ensure dm-tennis` in the console and read the output. The terminal is a streamed prop (`stream/dm_tennis_kiosk.ytyp`); if the resource failed to start, the prop never loads.
* `ox_lib` must start **before** `dm-tennis`. Check the order in `server.cfg`.
* If the court is one you added, confirm its `coords` are on the ground at the net centre. A wrong Z puts the terminal under the court or in the air.
* If something on your map sits where the terminal should stand, move it with the `terminal` field. See [Courts](/devmosaic/resources/devmosaic-dm-tennis/courts.md#moving-the-terminal).

### Pressing E does nothing at the terminal

* Stand in front of the screen, within `Config.Lobby.distance` (1.6 m by default).
* Another resource may have claimed the same key. Rebind **Tennis: use terminal** in **Settings > Key Bindings > FiveM**, or change `Config.Lobby.key`.

### Shot keys do nothing

* Shots only work during a match, once the ball is in play or it is your serve.
* The mouse buttons are bound through FiveM key mappings. A player who bound them to something else earlier keeps that binding; have them check **Settings > Key Bindings > FiveM** under the `dm-tennis` entries.
* Changing `Config.Keys` only sets the defaults for players who never bound the key.

### The match will not start

* Every spot must be filled and every human player must press **Ready**. Empty spots can be filled with **Add CPU** if `Config.Lobby.allowBots` is `true`.
* Everyone must still be at the court (within about 45 m) when the countdown ends, otherwise the start is cancelled and Ready is reset. Keep players near the terminal during the countdown.
* A player who is already in a match on another court cannot join a second lobby.

### My player will not move or swing

* Check `Config.Assist.level`. At `none` the player does everything by hand; at `full` the player runs to every ball automatically and cannot be steered. See [Assists](/devmosaic/resources/devmosaic-dm-tennis/configuration.md#assists).
* While a shot key is held, **W A S D** aims the shot instead of moving the player. Release the key to run.

### Calls look wrong on a custom court

* The resource measures a regulation court from `coords` (net centre) and `heading`. Re-check both; a heading off by a few degrees puts the baselines across the painted lines.
* Pick the `net` profile that matches the net prop, otherwise balls clip the tape at the wrong height.
* Set `doubles = false` on courts without doubles alleys.

### The review camera never shows

`Config.Match.hawkEyeMargin` is `0`, or the ball never landed close enough to a line. Raise the margin (15 cm is the default) if you want reviews more often.

### The leaderboard is empty

* `Config.Stats.enabled` must be `true` when the match is played; stats are not recorded retroactively.
* Matches against computer players still count for the human players.

### Players see different things

The ball and the score are shared by everyone within `Config.Match.spectatorRange`. If spectators report no ball, raise that distance or make sure they stand closer to the court.

### Still stuck?

Set `Config.Debug = true`, reproduce the problem, copy the console output and ask in the [DevMosaic Discord](https://discord.gg/CWyTmCU3Ht). Set it back to `false` afterwards.
