> For the complete documentation index, see [llms.txt](https://docs.mongenscave.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.mongenscave.com/premium-products/quests/features/daily-board.md).

# Daily Board

The daily board is each player's personal quest selection for the day. Every player gets their own randomized set of quests, picked from your quest pool based on their level. The board is saved to the database, so it survives restarts and relogs — a player keeps the same board until the daily reset (or until they reroll it).

Players open the board with `/quests`.

### How quests are picked <a href="#how-quests-are-picked" id="how-quests-are-picked"></a>

When a player's board is generated, the plugin:

1. Collects every quest with `daily: true` whose `level` is within `level-range` of the player's level.
2. Randomly picks quests from that pool, one by one, until the board is full. The pick is **weighted** — quests closer to the player's level are more likely to be chosen, but anything in range can appear.
3. Saves the board with an expiry timestamp set to the next daily reset.

A quest can only appear once per board. If the pool is smaller than the board size, the player simply gets fewer quests.

{% hint style="info" %} Quests with `daily: false` in `quests.yml` never appear on the board. Use that for quests you only hand out with `/quests force give`. {% endhint %}

### Configuration <a href="#configuration" id="configuration"></a>

Everything lives under `quests.daily-board` in `config.yml`:

```yaml
quests:
  daily-board:
    base: 5
    per-level: 5
    level-range: 15
    reset-time: "04:00"
    timezone: "Europe/Budapest"
```

| Key           | Description                                                                                                                                     |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `base`        | How many quests every player gets on their board.                                                                                               |
| `per-level`   | Grants one extra board slot every X levels. With `per-level: 5`, a level 12 player gets 2 extra slots (`12 / 5 = 2`). Set to `0` to disable.    |
| `level-range` | How far a quest's `level` may be from the player's level to be eligible. With `range: 15`, a level 20 player can get quests from level 5 to 35. |
| `reset-time`  | When boards expire and regenerate, in 24-hour `HH:mm` format.                                                                                   |
| `timezone`    | IANA timezone for the reset time (e.g. `Europe/Budapest`, `America/New_York`). Leave empty to use the server's timezone.                        |

#### How the reset works <a href="#how-the-reset-works" id="how-the-reset-works"></a>

There's no server-wide reset task. Each board stores its own expiry time; when a player opens the board after the reset time has passed, a fresh one is generated on the spot. The time remaining is shown in the GUI title via the `{reset}` placeholder.

#### Related limits <a href="#related-limits" id="related-limits"></a>

These aren't board settings, but they shape how players interact with it (`config.yml`):

```yaml
quests:
  limits:
    max-accepted:
      base: 3
      per-level: 10
    max-active:
      base: 1
      per-level: 20
```

`max-accepted` caps how many quests a player can hold at once, and `max-active` caps how many can progress at the same time. Both grow with level the same way board slots do (`base + level / per-level`).

### Rerolling <a href="#rerolling" id="rerolling"></a>

The board GUI has a refresh button that regenerates the player's board immediately with a new random selection. By default it's free. To charge for it, enable `refresh-cost` under `quest-board` in `guis.yml`:

```yaml
quest-board:
  refresh-cost:
    enabled: true
    placeholder: "%vault_eco_balance%"
    cost: 1000.0
    take-command: "eco take %player% 1000"
    sounds:
      success: "entity.experience_orb.pickup"
      error: "entity.villager.no"
    messages:
      not-enough: "&#FF6B6BYou don't have enough money to reroll your quests."
      success: "&#B8FFF2Your quests have been rerolled for &#FFFFFF{cost}&#B8FFF2."
```

| Key            | Description                                                     |
| -------------- | --------------------------------------------------------------- |
| `placeholder`  | A PlaceholderAPI placeholder that returns the player's balance. |
| `cost`         | The minimum balance required to reroll.                         |
| `take-command` | Console command that actually withdraws the money.              |

{% hint style="warning" %}
The paid reroll requires **PlaceholderAPI** plus whatever plugin provides the balance placeholder (e.g. Vault). Keep `cost` and `take-command` in sync — the plugin checks the balance against `cost` but takes money with the command.
{% endhint %}

Rerolling replaces the whole board, including quests the player hasn't finished yet. Already accepted quests keep running.

### Premium bonuses <a href="#premium-bonuses" id="premium-bonuses"></a>

Players with the `mcquests.premium` permission get the bonuses defined in `config.yml`:

```yaml
premium:
  bonus:
    max-accepted: 3
    max-active: 1
    daily-board: 2

  multipliers:
    xp: 1.25
    reward: 1.5
```

`daily-board: 2` means premium players see 2 more quests on their board. Premium players also get a different GUI title (`title-premium` in `guis.yml`) and the multipliers apply to their quest XP and rewards.

### Customizing the GUI <a href="#customizing-the-gui" id="customizing-the-gui"></a>

The whole board menu is configured under `quest-board` in `guis.yml`:

```yaml
quest-board:
  title: "<dark_gray>Quest Board ({reset})"
  title-premium: "<dark_gray>Premium Quest Board ({reset})"
  size: 54

  quest-slots: [20, 21, 22, 23, 24, 29, 30, 31, 32, 33]

  quest-template:
    material: TRIAL_KEY
    name: "&#B8FFF2&l{name}"
    lore:
      - " &#8A8F98◆ Status: {status}"
      - "&#7CF6FF&lOBJECTIVES"
      - "{objectives}"
      - "{action}"
```

The important parts:

* **`quest-slots`** — the inventory slots where daily quests appear. This also caps how many quests are visible: if a player's board size is larger than the number of slots, the extra quests aren't shown, so add slots if you raise the board size.
* **`quest-template`** — the item used for every quest that has no `display` section of its own. Quests with a `display` in `quests.yml` use their own icon, but always take the template's lore.
* **`formats`** — the text snippets used to fill the template: status lines, objective/reward/condition lines, time limit lines and the click hints.

Template lore placeholders: `{name}`, `{status}`, `{objectives}`, `{conditions}`, `{rewards}`, `{time}` and `{action}`. The list placeholders (`{objectives}`, `{rewards}`, `{conditions}`) expand to one line per entry using the matching `formats` entry, with live progress numbers for objectives.

Sounds for opening, accepting, errors and rerolling are under `quest-board.sounds`.

### Accepting quests from the board <a href="#accepting-quests-from-the-board" id="accepting-quests-from-the-board"></a>

Clicking a quest on the board accepts it. The plugin checks, in order:

1. The quest isn't already completed today or already accepted.
2. The player is below their `max-accepted` limit.
3. The quest's `conditions` (permission, world) pass.

Completed board quests stay visible with the `completed` status until the reset, so players can see what they've already done today.
