> For the complete documentation index, see [llms.txt](https://mole-resource.gitbook.io/mole-resource-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mole-resource.gitbook.io/mole-resource-docs/scripts/4-in-line/faq.md).

# Faq

### How do you play?

Aim at a column and drop a disc — it falls to the lowest free cell in that column. First to line up four in a row wins, in any direction: horizontal, vertical or diagonal.

### Can I play against the computer?

Yes. Use **Play vs AI** (target) or press **H** at a board. Difficulty is configurable — see [Singleplayer (AI)](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#singleplayer-ai).

### Is the AI beatable?

Yes, even on `hard`. A 7×6 board has far too many positions to solve exhaustively in a server tick, so `hard` uses a 5-ply alpha-beta search with a positional evaluation instead of perfect play. It will always take an immediate win and always block yours, but a good player can out-plan it. Use `easy` or `medium` for a weaker bot, or let players choose themselves in-game (see next question).

### How do players change the AI difficulty themselves?

While `Config.AI.AllowDifficultyChoice = true` (default) and the board is still empty, the in-game bar (same one showing "Lock camera") has a **1: AI difficulty** entry — pressing **1** cycles Easy → Medium → Hard. It disappears the moment the first disc is dropped, so difficulty can't be changed mid-match. See [Configuration](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#letting-players-pick-the-difficulty).

### Which colour goes first?

Black. The first player to sit down gets Black, the second gets White. Set which one the AI plays with `Config.AI.Color` — making it `"Black"` means the AI opens.

### Which frameworks are supported?

`ox_inventory`, `qb-core` and `es_extended`. Set `Config.Framework` accordingly.

### Which notification / target systems?

Notifications: ESX, ox\_lib, mythic\_notify, QB-Core. Interaction: ox\_target, sleepless\_interact, or built-in proximity prompts (`Config.Target = "none"`).

### Do boards save after a restart?

Yes — placed boards persist in MySQL. Finished games are cleared, so boards always come back empty and playable. Static `Config.Boards` are memory-only and reset each restart.

### Can two boards exist at once?

Yes, unlimited. Each placed board is independent and stored separately.

### How many players per board?

Two (Black and White) plus any number of spectators who see moves live (when `Config.Live = true`). A third player who tries to join a full board is refused.

### Can I make permanent public boards that can't be picked up?

Yes. Add them to `Config.Boards`. They can't be picked up and reset on every restart.

### Does it work inside apartments / instanced housing?

Yes. Boards are instance-aware. Integrate via the `SetPlayerInstance` export — see [Housing / Instances](broken://pages/db81e65f66957f1d8f8a8ace242e520f8afdd80c).

### The item does nothing when I use it (ox)

Under ox, the item must trigger placement via its `client.event`. Add `client = { event = 'mr_4inline:PlaceBoard' }` to the item in `ox_inventory/data/items.lua`. See [Installation](broken://pages/1eb49ba71301c0ebd2168a0a3211f715e07a351d).

### The board takes \~20 seconds to appear after I place it

That's `Config.SyncDelay`, and its countdown restarts with the resource — so it bites hardest while you're testing and restarting. A board placed within `Config.Streaming.InstantDistance` (30m) of you should appear immediately; if a distant one is missing, `/4inlineresync` forces a sync. See [Synchronization](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#synchronization).

### How do I fix discs floating above / sinking into the board?

Tune `Config.MarkOffset`, or use `/4inlinebones x` to calibrate it live. One value covers placed discs, the preview and the drop animation. See [Configuration](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#gameplay--placement).

### The board floats above the ground when I place it

Adjust `Config.PlaceZOffset` — it's applied after the game's ground-snapping, so it cancels out whatever gap the snap leaves. Boards already in the database keep their stored height; re-place them or fix them with `UPDATE fourinline_boards SET z = z + <offset>;`. See [Board height correction](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#board-height-correction).

### The board is lying flat / sideways

Set `Config.BoardRotationFix`. See [Configuration](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#board-model--orientation).

### I get an error about missing point bones

The board model needs bones `point1` … `point42`, numbered row-major from the top-left. Bone numbers map straight onto grid cells, so a model numbered in a different order will place discs in the wrong holes even though it loads fine. See [Installation](broken://pages/1eb49ba71301c0ebd2168a0a3211f715e07a351d#6-set-the-model-names).

### Does the turn timer count down while I'm just looking around?

No. `Config.TurnTimeout` only counts while your camera is **locked** (Space) — i.e. while you can actually pick a column. Orbiting with the camera unlocked doesn't burn your move time. See [Configuration](broken://pages/f850d5a1680d0412965446a0f6783a7b59631b18#timeouts).

### Does the score / win count persist after a restart?

No — `Black n - n White` is tracked in memory for the current session only. It resets when the board becomes fully empty (both players leave) and doesn't survive a server restart.

### How does the rematch work?

After a game ends, **hold R**. That only marks your side ready — the other player (or the AI automatically) also needs to hold R before the board resets and a new round starts. If the game is still in progress, holding R instead force-resets immediately (no confirmation needed).

### Nothing plays when a disc is dropped

`html/place.ogg` is missing — the resource doesn't ship a default sound file. See [Installation](broken://pages/1eb49ba71301c0ebd2168a0a3211f715e07a351d#7-add-the-drop-sound).

### Can I make a bigger board, like 8×7?

In principle: `Config.Grid` drives the rules, the AI and the winning-line table. In practice you also need a board model with a matching number of `point` bones and a wider `grid` column in the database (`Columns × Rows` characters). The shipped model is 7×6.
