Troubleshooting
Start with tunit_diag, then data.json precedence, missing fonts, distant aliasing, the 32-cell atlas, the plane ceiling and the pinned ytd slot.
Run tunit_diag in the server console before changing anything.
── tUnit ────────────────────────────────────────────────
version 2.0.0
demo mode off
config.lua validated with no problems
sources callsign, player
driver-set unit
layouts 4 in use (2 saved in data.json, the rest seeded from config.lua)
valor2rb 2 element(s) data.json (config.lua is being overridden)
valor5rb 2 element(s) config.lua
──────────────────────────────────────────────────────────
Symptoms
| Symptom | Cause and fix |
|---|---|
My config.lua layout is not applying | data.json wins once that model is edited in game. Edit in game, or delete the model's entry and restart |
| Nothing is written to disk | tLib demo mode drops every write and the editor still looks right. Check line 2 |
| Every element is white | Known. Nothing tints the plane today; color is still stored and shared |
| All text is in the wrong font | A face is missing from web/fonts/, which is not an error — the generic sans is painted instead. List the directory: web/atlas.html expects condensed.woff2, block.woff2, stencil.woff2 |
| One element is in the wrong font | It names a font this server lacks, so it falls back to Config.defaultFont. Add the typeface and a Config.fonts key; no re-import |
| Text shimmers on a parked car | A build older than the plane renderer, or something drawing over the top |
| "The text atlas is full" | 32 distinct strings, keyed by content. Add rows or columns and grow width/height to match |
| Text vanished when the driver got out | It should not — a mark survives the driver leaving the seat. See Who a number belongs to |
| A driver's menu field does nothing | The name is in both Config.userSources and tUnit.source; the computed value wins |
| A typed value vanished on reconnect | Values key on the license identifier; with no Rockstar auth the server-id fallback does not survive |
| A typed value vanished on restart | Expected. Driver-set values are in memory only |
| An imported layout will not load | A payload that is not a JSON list is refused. If it imported but looks wrong, sizes are clamped and the count capped at 16 |
| tUnit consumed a streaming slot | Permanently, for the session. One slot, never more |
Nothing is drawn at all
| Check | Where |
|---|---|
| tLib at 1.0 or newer, started first? | Server console at boot |
Did config.lua validate? | tunit_diag line 3 |
| A layout for this model? | tunit_diag, console, per-model block |
| Does the element have a value? | /tunit, or the source's return |
| Within 50 m, on the painted side? | The plane is single-sided and back-face culled |
An element with neither src nor text draws nothing, and so does one whose source returned nil or "". Neither is an error.
A source never runs, or runs once and never again
| Symptom | Cause |
|---|---|
| Never appears | Not registered — check the sources line |
| Appeared once, then stopped | Sources resolve on a driver change, not continuously |
| Errored once, then silent | A throwing source is reported once per session, then empty |
| Nothing at all, no error | The function yielded. Cache the slow value elsewhere |
A source is not re-run when the same player re-seats in the same car. A different driver will.
Who a number belongs to
A unit number stays on the car when its driver gets out. A marked car parked outside a scene is still that unit's car, so the text does not vanish the moment the officer steps out.
A mark ends in exactly three ways:
| The same person takes a different wheel | The number follows them; the car they left goes blank |
| Someone else takes that wheel | Re-resolved for them — their number replaces the old one |
| The vehicle is deleted or destroyed | The state bag dies with the entity |
Two things are deliberately not on that list:
- Getting out. That is the whole point.
- Disconnecting. The car keeps the number. A reconnecting player gets the same license identifier and the same stored values, so it is still their car.
Because a mark outlives the seat, /tunit works when you are not in the vehicle — it updates whichever car you are currently marking. Permission is unchanged: a player can only ever change their own values.
Distant text looks like a crawling dashed line
A fixed property of the texture, not a setting. Four things help:
- Keep
Config.atlas.edgeSoftnessat or near0.6;0is the first thing to crawl. - Lower
Config.render.drawDistancebelow 50 m. - Choose a thicker-stroked font.
- Do not raise
cellWidth/cellHeight— a larger texture looks worse, not better.
"Hit the plane ceiling"
maxPropsOnScreen (96) was reached across every vehicle on screen. The nearest are kept, the furthest dropped, and the line names how many of each.
A per-character element costs one plane per letter, so lowering drawDistance is usually the better lever than raising the ceiling. On an older config.lua, see maxQuadsPerFrame.
Still stuck
Have tunit_diag's console output ready, plus your tLib version and Config.layouts for that vehicle.
tUnit
Still stuck? Support can answer it directly.
Was this page helpful?
TIMMYG Studios