# Denní a měsíční questy

> Každý hráč si vylosuje vlastní denní a měsíční questy z tvých poolů, jeden denně vymění, staví sérii a dostane odměnu, kterou nastavíš. Novinka v 0.3, ve výchozím stavu vypnuto.

Source: https://stygion.eu/cs/docs/keystone/quests
Updated: 2026-10-25

Novinka v 0.3, modul `quests`, **ve výchozím stavu vypnutý** (rozdává věci). Všechno se nastavuje v `quests.toml` (a v Nastavení v editoru); nic není přibité k jednomu serveru: výchozí pooly jsou čistě vanilla.

## Jak to funguje

- Každý hráč si vylosuje vlastní questy: `daily.count` z `daily.quests` (výchozí 3) a `monthly.count` z `monthly.quests` (výchozí 3). Quest padá tak často, jak říká jeho `weight`; včerejší questy se vrací, jen když je v poolu málo jiných.
- Nový den questů začíná v `reset-at` (výchozí `00:00`) v pásmu `time-zone` (prázdné = pásmo serveru); nový měsíc v tu hodinu 1. dne v měsíci.
- `/quests reroll <id>` vymění jeden nesplněný quest za jiný, `rerolls-per-day`krát za den questů (výchozí 1, 0 vypne).
- Kdo splní všechny questy dne nebo měsíce, dostane navíc `daily.all-done` / `monthly.all-done`.
- **Série:** den se počítá, když jsou splněné všechny denní questy (`streak.counts = all`) nebo aspoň jeden (`any`). Vynechaný den sérii vynuluje. `streak.goals` platí při určitém počtu dní; se `streak.repeat` (výchozí zapnuto) znovu na každém násobku (7, 14, 21 …).
- Postup a splněné questy jsou v databázi serveru a přežijí restart; nic se nevyplatí dvakrát.

## Jak napsat quest

Jeden řádek na quest v `daily.quests` nebo `monthly.quests`, části oddělené ` | `:

```
id=ores | title=[en]Mine 16 ores[cs]Vytěž 16 rud | goal=mine #c:ores 16 | reward=item minecraft:diamond 2; keys 1 | reward-text=2 diamanty a klíč | icon=minecraft:iron_ore | weight=2
```

Povinné je jen `id` (jedno slovo) a `goal`. `title` a `reward-text` můžou mít části `[en]…[cs]…`; bez `title` se ukáže cíl, jak je napsaný, bez `icon` se ikona vybere podle cíle, bez `reward-text` odměny popíše Keystone sám. Řádek, který nejde přečíst, se vypíše do logu a přeskočí.

**Cíle**

| Cíl | Co počítá | Jak |
|---|---|---|
| `mine <id\|#tag\|*> <n>`, `kill …` | vytěžené bloky, zabité moby | hned, z vlastních událostí Keystone |
| `place <id\|#tag\|*> <n>` | položené bloky | až blok vydrží `anti-farm.window` (viz níž) |
| `vote [n]` | hlasy (modul `votes`) | hned; hlas, když hráč není online, se započítá a vyplatí při dalším připojení |
| `biome <id\|#tag\|*> [n]` | různé biomy, ve kterých hráč stál | podle pozice hráče, každých `look-every` (10 s) |
| `dimension <id>` | že tam byl | stejně |
| `craft`, `use`, `eat`, `pickup`, `break <id\|#tag\|*> <n>` | vlastní statistiky hry | rozdíl od chvíle, kdy hráč quest dostal |
| `walk`, `swim`, `boat`, `minecart`, `horse`, `fly <bloky>` | uražená vzdálenost | stejně |
| `fish <n>`, `trade <n>`, `play <minuty\|2h>` | chycené ryby, obchody s vesničany, odehraný čas | stejně |
| `stat <kategorie>/<id> <n>` | jakákoli statistika, kterou hra vede | stejně |

Statistiky se čtou ze souboru hry každých `stats-every` (30 s) mimo vlákno serveru; hra ten soubor zapisuje při ukládání, takže u hráče online se zpožďují až o jeden autosave.

**Proti farmení.** Položený blok se do questu započítá, až vydrží `anti-farm.window` (výchozí 30 minut); když ho hráč rozbije dřív, nezapočítá se nikdy. Rozbití bloku stejného druhu, který hráč v tom chunku nebo v sousedním během okna položil, není těžba, takže písek, který spadl, nebo blok posunutý pístem je pořád jeho; bloky, které padají nebo se mění v jiné (`anti-farm.loose`: písek, štěrk, betonový prášek a beton, kovadliny …; id, `#tagy` nebo `*_přípona`), se berou jako jeden druh. Nic se nezapomíná, aby se udělalo místo: hráč s víc než `anti-farm.most` (4096) čekajícími bloky nedostane za stavění ani těžbu nic, dokud okno neuplyne. `0` jako okno celé hlídání vypne.

**Odměny**, spojené `;` (stejná slova platí v `daily.all-done`, `monthly.all-done` a `streak.goals`, tam jedna odměna na řádek):

| Odměna | Co udělá |
|---|---|
| `item <id> <n>` | itemy, zapsané jako pro `/give` |
| `keys <n>` | klíče k bednám (modul `crates`) |
| `xp <n>` / `xp <n>L` | body zkušeností / levely |
| `rank <skupina> for 7d` | skupina na dobu (bez `for` natrvalo) |
| `perk <výhoda> for 1d` | výhoda na dobu |
| `badge <id>` | odznak (modul `badges`) |
| `message <text>` | řádek do chatu |
| `/<příkaz>` | jakýkoli příkaz za konzoli; `{player}` je jméno hráče |

Řádek série: `days=7 | reward=keys 2; xp 500 | reward-text=2 klíče k bedně`.

## Příkazy a oprávnění

- `/quests` vypíše tvoje questy do chatu; s klientskou částí Keystone otevře obrazovku questů. `/quests reroll <id>`. Oprávnění `keystone.quests`, má ho každý (skupina `default`).
- `/keystone quests reset <hráč>` dá hráči nové questy a vrátí mu přelosování. Oprávnění `keystone.quests.admin`.

## S klientskou částí

Klientská část kreslí obrazovku questů a prvek HUD a ukáže upozornění, když je quest splněný. Stav dostává pod `quests.state` (když se pohne postup, nejvýš jednou za 2 vteřiny, a po připojení) a posílá `quests.reroll`; HUD čte `quests` a `quests.resets` ([hodnoty HUD](/docs/keystone/hud-values)). Všechno se řídí oprávněním `keystone.quests`. Hráč bez klientské části nic nepřijde: chat řekne totéž.

## API a události

`GET /v1/quests` (scope `players.read`): pooly, čas resetu, přelosování a odměny za sérii; s `?player=` questy, postup a sérii jednoho hráče. Doplňky slyší `QuestCompleted` (hráč, id questu, `daily` nebo `monthly`) až po předání odměny.

Texty jsou v jazykových souborech pod `quests.*`; upravíš je na obrazovce Languages v editoru.
