Phase 8: the quest book, generated from docs/quests.yaml
- tools/quests.py writes pack/config/ftbquests/quests/ in FTB Quests 2101's format (data.snbt, chapters/*.snbt, texts in lang/en_us.snbt) with ids derived from the YAML names, so progress survives regeneration. Flexible progression, no lock icons, no rewards (Adrian, 2026-11-03). tools/build.py runs it. - docs/quests.yaml: 18 chapters, 74 quests. Getting Started; one chapter per zone and the End from a zone template (reach it, catch three of its Pokemon, mine its ores, beat its guardian) plus chapter extras (Mire Waders, Eyes of Ender, Eternatus); Pokemon Machines; Base and Jobs. - Node positions: --pull reads them from an FTB Quests folder into the layout block (only moved nodes); tools/prism_instance.py pulls from the instance before each sync and rebuilds if something moved. - The pack's own events as hidden advancements (cobblesurvival:events/...), granted by QuestEvents: zone reached, guardian beaten, machine filled, End boss beaten. - Self-tests quest_book_loads and quest_events_mark_zones; the guardian and furnace tests check their events. Self-tests and island check pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9fb5e9895e
commit
c5d1cf93f4
70 files changed
+3665
-7
No files matched your search
@@ -111,6 +111,13 @@ python3 tools/smoke_test.py --accept-eula
|
||||
```
|
||||
The full smoke test: boots the server and runs `tools/smoke_checks.json` over RCON (companion mod live, core data pack enabled, key commands registered), then fails on unexpected errors in the log. Passing `--accept-eula` states that you accept the [Minecraft EULA](https://aka.ms/MinecraftEULA) for this test server. There is no CI: the Gitea server has no capacity for Actions runners, so the checks run locally (this, `tools/selftest.py`, `tools/quick_check.py`).
|
||||
|
||||
## Quest book
|
||||
|
||||
```bash
|
||||
python3 tools/quests.py
|
||||
```
|
||||
Generates the quest book (Phase 8) from `docs/quests.yaml` into `pack/config/ftbquests/quests/`, and the hidden advancements quests check. `tools/build.py` runs it. `--pull <FTB Quests folder>` first copies node positions moved in the in-game editor back into `docs/quests.yaml` (`tools/prism_instance.py` does it from the instance before each sync); `--check` fails if the generated files are out of date.
|
||||
|
||||
## Adding a mod
|
||||
|
||||
1. Read its license and its Cobblemon 1.8 status; add both to `docs/licenses.md` and `docs/addon-status.md`.
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {
|
||||
"done": {
|
||||
"trigger": "minecraft:impossible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,11 +8,18 @@
|
||||
|
||||
- **Add-ons in the pack:** Cobblemon Quests Reloaded 2.0.2 (Cobblemon task type for FTB Quests) and Cobblemon Info for REI / JEI / EMI 2.32.14. Automated: `quests_have_cobblemon_tasks`, `jei_addon_shows_island_spawns`.
|
||||
- **Spawn info in JEI:** right for the pack (species, levels, rarity come from the zone pools), but it shows biomes, not zones; our own pages will add the zone.
|
||||
- **Quest book:** 18 chapters, 74 quests, generated from `docs/quests.yaml`: Getting Started, one chapter per zone and the End, Pokémon Machines, Base and Jobs. No rewards, nothing locked. Zone chapters: reach the zone, catch three of its Pokémon, mine its ores, beat its guardian. Automated: `quest_book_loads`, `quest_events_mark_zones` (and the guardian and furnace tests check their quest events).
|
||||
|
||||
## In game (Prism instance)
|
||||
|
||||
- [ ] Open JEI, look up a Pokémon (e.g. Pikachu) in Cobblemon Info's pages: the spawn levels match its zone (`docs/zone-species.md`), and its drops are listed.
|
||||
|
||||
- [ ] Open the quest book (FTB Quests' book item, or its key): every chapter shows, nodes are joined by lines, none shows a lock.
|
||||
- [ ] Getting Started: tick "Welcome to the Island"; catch a Pokémon: "A Partner" completes.
|
||||
- [ ] Soft-lock check: get 16 Poké Balls before ticking "Welcome to the Island", then tick it: "Poké Balls" completes too (if it stays stuck, tell me: there's a known flexible-mode bug in older FTB Quests).
|
||||
- [ ] Walk into Southwold: "Southwold" in its chapter and "Beyond Button Isle" complete.
|
||||
- [ ] Move a few nodes in the editor (`/ftbquests editing_mode`), close the game, run `tools/prism_instance.py`: your positions stay, and `docs/quests.yaml` has them in its `layout` block.
|
||||
|
||||
## Ask Adrian
|
||||
|
||||
- (after the first chapters) Does the layout read well? Move nodes freely in the editor; the next generation keeps your positions.
|
||||
+8
-5
@@ -304,11 +304,14 @@ Adrian's choices: Cobblemon tasks come from **Cobblemon Quests Reloaded** (a mai
|
||||
|
||||
**Add-ons checked** (2026-11-03). Quests Reloaded declares Cobblemon 1.8+ and FTB Quests 2101+, boots with the pack and adds the task type `cobblemon_tasks:cobblemon_task` (catch, defeat, evolve into, level up, obtain, seen, and more; filters by species, type, form, shiny, level, biome). Cobblemon Info reads the server's live spawn pool, so what it shows is the pack's own zone pools: right species, levels and rarity; the self-test compares every entry. It does not know the pack's zone rule and lists a spawn's biomes instead: a Southwold Pokémon reads as "plains", though it only spawns in Southwold's plains. Our own JEI pages add the zone. It must be on the server too (it is, side both): a client on a server without it falls back to Cobblemon's unmodified spawn files.
|
||||
|
||||
**Plan** (in progress):
|
||||
- `docs/quests.yaml` → `tools/quests.py` → `pack/config/ftbquests/quests/` (FTB Quests 2101 format: `data.snbt`, `chapter_groups.snbt`, `chapters/*.snbt`, texts in `lang/en_us.snbt`). Quest ids are derived from the YAML ids, so they stay the same across regenerations and players keep their progress. `tools/quests.py --pull <instance>` reads node positions back from an instance's quest files first.
|
||||
- Flexible progression everywhere and no lock icons, so dependencies show as lines but never block; check FTB Quests 2101.1.37 for the soft-lock a fix mod reports for 1.20.1.
|
||||
- Chapters: getting started, one per zone, base building and Pokémon jobs, machines, bosses and the End. Tasks: Cobblemon tasks (Quests Reloaded), items (drops, materials), and the pack's own events (zone reached, guardian beaten, machine built) as hidden advancements the companion mod grants.
|
||||
- JEI: our plugin adds, per item, every place on the island it comes from that Cobblemon Info doesn't cover: guardian and End boss rewards, Sacrifice Altar tiers, ore veins by zone, pasture mining and finder tables by zone; and per Pokémon its zone.
|
||||
**The quest book** is written in `docs/quests.yaml` and generated by `tools/quests.py` (run by `tools/build.py`) into `pack/config/ftbquests/quests/` in FTB Quests 2101's format (`data.snbt`, `chapter_groups.snbt`, `chapters/*.snbt`, every title and text in `lang/en_us.snbt`). Chapter, quest and task ids are derived from their names in the YAML, so they stay the same across regenerations and players keep their progress. The whole book is in flexible progression with lock icons off: dependencies show as lines but never block. No rewards.
|
||||
|
||||
- **Chapters** (18, 74 quests on 2026-11-03): Getting Started (welcome, first catch, Poké Balls, a full team, the Revival Charm and permadeath, healing, level 10, drops and JEI, evolution, on to Southwold); one per zone and the End; Pokémon Machines (how to build one, then each of the five); Base and Jobs (Pasture Block, PC). A zone chapter (`zone: <id>`) starts with the template quests `zone_chapter`, filled from the zone's data: reach it (levels, hazard), catch three of its Pokémon (any species of its spawn pool), mine its ores (one item task per vein), beat its guardian (species, level, drops, the boss bar). Chapters add their own quests (Mire Waders for the Mire; Eyes of Ender and Eternatus for the End).
|
||||
- **Tasks:** Cobblemon actions through Quests Reloaded (catch, defeat, evolve, level up), items, and the pack's own events: hidden advancements `cobblesurvival:events/zone/<zone>`, `guardian/<zone>`, `machine/<core>` and `end_boss` (no display, no toast; written by `tools/quests.py`), granted by the companion mod (`QuestEvents`: a player's zone once a second, a guardian's battle winners, a machine's owner when a Pokémon goes in, the End boss's winners). They unlock nothing.
|
||||
- **Node positions:** Adrian moves nodes in the in-game editor; `tools/quests.py --pull <folder>` records every node that isn't where the generator would put it in the `layout` block at the end of `docs/quests.yaml`. `tools/prism_instance.py` does that from the instance before each sync, and rebuilds if something moved, so a sync never undoes his layout (docs/quests.yaml then needs committing). Titles, texts, tasks and dependencies edited in game are overwritten.
|
||||
- **Self-tests:** `quest_book_loads` (FTB Quests on the server has the book in flexible mode, every task type is known, every item and advancement exists), `quest_events_mark_zones`, and the guardian and furnace tests check their events.
|
||||
- Still open: the flexible-mode soft-lock a fix mod reports for 1.20.1 (tasks done before their dependencies); checked in game for now.
|
||||
- JEI (next): our plugin adds, per item, every place on the island it comes from that Cobblemon Info doesn't cover: guardian and End boss rewards, Sacrifice Altar tiers, ore veins by zone, pasture mining and finder tables by zone; and per Pokémon its zone.
|
||||
|
||||
## Open decisions for Adrian (proceeding with the default, flagged)
|
||||
|
||||
|
||||
@@ -0,0 +1,366 @@
|
||||
# The quest book (roadmap Phase 8). tools/quests.py turns this file into pack/config/ftbquests/quests/.
|
||||
#
|
||||
# Adrian, 2026-11-03: quests give no rewards; they point the way and never block (flexible progression, no lock
|
||||
# icons). Titles, texts, tasks and dependencies live only here: edits to them in game are overwritten. Node
|
||||
# positions are different: move nodes in the in-game editor, then `tools/quests.py --pull <instance quests folder>`
|
||||
# (tools/prism_instance.py does it before each sync) copies them into the `layout` block at the end of this file.
|
||||
#
|
||||
# A chapter lists quests: id (unique in its chapter), title, optional subtitle, text (blank line = new paragraph),
|
||||
# icon, after (quests it builds on: an id in the chapter, or chapter/id), and tasks, each one of:
|
||||
# item: <item id>, count: <n> have the item
|
||||
# cobblemon: catch|defeat|evolve|level_up_to|..., amount: <n>, optional pokemon: [ids], types: [types],
|
||||
# zone_species: <zone> a Cobblemon action (Cobblemon Quests Reloaded); zone_species = any
|
||||
# Pokémon of that zone's spawn pool
|
||||
# event: zone/<zone> | guardian/<zone> | machine/<core> | end_boss the pack's own events (hidden advancements)
|
||||
# checkmark: true the player ticks it
|
||||
# A task may also have a title. A chapter with `zone: <id>` starts with the quests of `zone_chapter`, where
|
||||
# {zone}, {low}, {high}, {hazard_text}, {guardian}, {guardian_level}, {drops} and {ore_names} come from the
|
||||
# zone's data; a template quest with `when:` is left out of zones that lack the thing named.
|
||||
|
||||
book:
|
||||
title: Cobblemon Survival
|
||||
icon: cobblemon:poke_ball
|
||||
|
||||
# What each zone's ore veins give when mined (pack/config/regenerating_ore_veins/veins.json).
|
||||
ore_items:
|
||||
coal_node: minecraft:coal
|
||||
copper_node: minecraft:raw_copper
|
||||
iron_node: minecraft:raw_iron
|
||||
redstone_node: minecraft:redstone
|
||||
lapis_node: minecraft:lapis_lazuli
|
||||
gold_node: minecraft:raw_gold
|
||||
emerald_node: minecraft:emerald
|
||||
amethyst_node: minecraft:amethyst_shard
|
||||
diamond_node: minecraft:diamond
|
||||
quartz_node: minecraft:quartz
|
||||
netherite_node: minecraft:ancient_debris
|
||||
thunder_stone_node: cobblemon:thunder_stone
|
||||
shiny_stone_node: cobblemon:shiny_stone
|
||||
leaf_stone_node: cobblemon:leaf_stone
|
||||
water_stone_node: cobblemon:water_stone
|
||||
moon_stone_node: cobblemon:moon_stone
|
||||
sun_stone_node: cobblemon:sun_stone
|
||||
fire_stone_node: cobblemon:fire_stone
|
||||
ice_stone_node: cobblemon:ice_stone
|
||||
dawn_stone_node: cobblemon:dawn_stone
|
||||
dusk_stone_node: cobblemon:dusk_stone
|
||||
|
||||
zone_chapter:
|
||||
- id: arrive
|
||||
title: "{zone}"
|
||||
subtitle: "Lv {low}–{high}"
|
||||
icon: minecraft:filled_map
|
||||
text: |
|
||||
Wild Pokémon in {zone} are level {low} to {high}. Bring a team that can hold its own there. {hazard_text}
|
||||
A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full.
|
||||
tasks:
|
||||
- event: "zone/{zone_id}"
|
||||
title: "Reach {zone}"
|
||||
- id: locals
|
||||
when: [species]
|
||||
title: "Locals of {zone}"
|
||||
icon: cobblemon:poke_ball
|
||||
after: [arrive]
|
||||
text: |
|
||||
Each kind of Pokémon lives in one zone of the island. Catch three that call {zone} home.
|
||||
Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it.
|
||||
tasks:
|
||||
- cobblemon: catch
|
||||
zone_species: "{zone_id}"
|
||||
amount: 3
|
||||
- id: ores
|
||||
when: [ores]
|
||||
title: "Ores of {zone}"
|
||||
icon: minecraft:iron_pickaxe
|
||||
after: [arrive]
|
||||
text: |
|
||||
There is no ore anywhere except in each zone's own veins, and they grow back after you mine them.
|
||||
{zone} has {ore_names}.
|
||||
tasks:
|
||||
- each: ores
|
||||
count: 8
|
||||
- id: guardian
|
||||
when: [guardian]
|
||||
title: "Guardian of {zone}"
|
||||
icon: minecraft:netherite_sword
|
||||
after: [locals]
|
||||
text: |
|
||||
{guardian}, Lv {guardian_level}, guards {zone}: a giant that takes at most a quarter of its health from any one attack.
|
||||
Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight.
|
||||
Beat it for {drops}. It returns 5 hours later.
|
||||
tasks:
|
||||
- event: "guardian/{zone_id}"
|
||||
title: "Beat {guardian}"
|
||||
|
||||
chapters:
|
||||
- id: getting_started
|
||||
title: Getting Started
|
||||
subtitle: The island, your first partner, and the rules that matter
|
||||
icon: cobblemon:poke_ball
|
||||
quests:
|
||||
- id: welcome
|
||||
title: Welcome to the Island
|
||||
icon: minecraft:filled_map
|
||||
size: 1.5
|
||||
text: |
|
||||
This island has no zombies, no creepers and no cows: only Pokémon. Their drops are your food, string, leather and much more.
|
||||
The island is split into zones, each with its own Pokémon, levels, ores and a guardian. You start on Button Isle; the further out you go, the stronger everything gets.
|
||||
|
||||
This book suggests what to do next. Nothing in it is locked and it gives no rewards: do things in any order you like.
|
||||
tasks:
|
||||
- checkmark: true
|
||||
title: Read this
|
||||
- id: first_partner
|
||||
title: A Partner
|
||||
icon: cobblemon:poke_ball
|
||||
after: [welcome]
|
||||
text: |
|
||||
Weaken a wild Pokémon in battle, then throw a Poké Ball at it.
|
||||
tasks:
|
||||
- cobblemon: catch
|
||||
amount: 1
|
||||
- id: poke_balls
|
||||
title: Poké Balls
|
||||
icon: cobblemon:poke_ball
|
||||
after: [welcome]
|
||||
text: |
|
||||
Poké Balls are crafted from apricorns, which grow on apricorn trees around the island. Look the recipe up in JEI.
|
||||
tasks:
|
||||
- item: cobblemon:poke_ball
|
||||
count: 16
|
||||
- id: full_team
|
||||
title: A Full Team
|
||||
icon: cobblemon:great_ball
|
||||
after: [first_partner]
|
||||
text: |
|
||||
Six Pokémon of different types handle more than one strong one.
|
||||
tasks:
|
||||
- cobblemon: catch
|
||||
amount: 6
|
||||
- id: permadeath
|
||||
title: A Second Chance
|
||||
icon: cobblesurvival:revival_charm
|
||||
after: [first_partner]
|
||||
text: |
|
||||
A Pokémon that faints is gone for good once the battle ends. Revives only help within that battle.
|
||||
A Pokémon holding a Revival Charm is saved once instead: the charm is used up and the Pokémon is healed. Give one to your most valuable partner.
|
||||
tasks:
|
||||
- item: cobblesurvival:revival_charm
|
||||
- id: healing
|
||||
title: Healing
|
||||
icon: cobblemon:healing_machine
|
||||
after: [first_partner]
|
||||
text: |
|
||||
Sleeping doesn't heal your Pokémon. A Healing Machine does, but it is expensive and recharges slowly; potions and berries help in between.
|
||||
tasks:
|
||||
- item: cobblemon:healing_machine
|
||||
- id: level_10
|
||||
title: Growing Up
|
||||
icon: cobblemon:exp_candy_s
|
||||
after: [first_partner]
|
||||
text: |
|
||||
Raise a Pokémon to level 10 by battling. Wild Pokémon stronger than your team may come after you; weaker ones keep their distance.
|
||||
tasks:
|
||||
- cobblemon: level_up_to
|
||||
amount: 10
|
||||
- id: drops
|
||||
title: What Pokémon Leave Behind
|
||||
icon: minecraft:string
|
||||
after: [first_partner]
|
||||
text: |
|
||||
Defeated Pokémon drop items. Look any item up in JEI (Cobblemon Info pages) to see which Pokémon drop it and where they live.
|
||||
tasks:
|
||||
- cobblemon: defeat
|
||||
amount: 5
|
||||
- id: evolve
|
||||
title: Evolution
|
||||
icon: cobblemon:fire_stone
|
||||
after: [level_10]
|
||||
text: |
|
||||
Evolve a Pokémon. Some need a level, some an evolution stone: the stones come from ore veins in particular zones.
|
||||
tasks:
|
||||
- cobblemon: evolve
|
||||
amount: 1
|
||||
- id: beyond
|
||||
title: Beyond Button Isle
|
||||
icon: minecraft:compass
|
||||
after: [level_10, full_team]
|
||||
text: |
|
||||
Southwold, north of Button Isle, is the next step: Pokémon up to level 18 and the island's copper.
|
||||
tasks:
|
||||
- event: zone/southwold
|
||||
title: Reach Southwold
|
||||
|
||||
- id: button_isle
|
||||
zone: button_isle
|
||||
title: Button Isle
|
||||
icon: cobblemon:poke_ball
|
||||
- id: shallows
|
||||
zone: shallows
|
||||
title: Shallows
|
||||
icon: minecraft:kelp
|
||||
- id: southwold
|
||||
zone: southwold
|
||||
title: Southwold
|
||||
icon: minecraft:raw_copper
|
||||
- id: lush_caves
|
||||
zone: lush_caves
|
||||
title: Lush Caves
|
||||
icon: minecraft:glow_berries
|
||||
- id: westmarch
|
||||
zone: westmarch
|
||||
title: Westmarch
|
||||
icon: cobblemon:thunder_stone
|
||||
- id: jungle
|
||||
zone: jungle
|
||||
title: Verdant Jungle
|
||||
icon: cobblemon:leaf_stone
|
||||
- id: dripstone
|
||||
zone: dripstone
|
||||
title: Dripstone Depths
|
||||
icon: minecraft:pointed_dripstone
|
||||
- id: highlands
|
||||
zone: highlands
|
||||
title: Highland Meadows
|
||||
icon: cobblemon:sun_stone
|
||||
- id: mire
|
||||
zone: mire
|
||||
title: Mangrove Mire
|
||||
icon: cobblesurvival:mire_waders
|
||||
hazard_text: "The Mire's water poisons you unless you wear Mire Waders: the guardians of Westmarch and the Verdant Jungle drop them."
|
||||
quests:
|
||||
- id: waders
|
||||
title: Mire Waders
|
||||
icon: cobblesurvival:mire_waders
|
||||
text: |
|
||||
Waders keep the Mire's poison off. Beat the guardian of Westmarch or the Verdant Jungle for a pair.
|
||||
tasks:
|
||||
- item: cobblesurvival:mire_waders
|
||||
- id: sunscorch
|
||||
zone: sunscorch
|
||||
title: Sunscorch
|
||||
icon: cobblemon:fire_stone
|
||||
hazard_text: "The desert heat hurts without heat insulation on your armor (Cold Sweat): look up insulation in JEI."
|
||||
- id: deep_sea
|
||||
zone: deep_sea
|
||||
title: Deep Sea
|
||||
icon: cobblemon:mystic_water
|
||||
- id: frostpeak
|
||||
zone: frostpeak
|
||||
title: Frostpeak Range
|
||||
icon: cobblemon:ice_stone
|
||||
hazard_text: "The cold hurts without wool insulation on your armor (Cold Sweat): look up insulation in JEI."
|
||||
- id: deep_dark
|
||||
zone: deep_dark
|
||||
title: Deep Dark
|
||||
icon: minecraft:sculk
|
||||
hazard_text: "Sculk darkens your sight down here. There is no Warden, but the ancient colossus sleeps in the ruins."
|
||||
- id: basalt
|
||||
zone: basalt
|
||||
title: Basalt Furnace
|
||||
icon: minecraft:magma_block
|
||||
hazard_text: "The heat of the furnace hurts without heat insulation on your armor (Cold Sweat)."
|
||||
- id: the_end
|
||||
zone: the_end
|
||||
title: The End
|
||||
icon: minecraft:end_stone
|
||||
quests:
|
||||
- id: eyes
|
||||
title: Eyes of Ender
|
||||
icon: minecraft:ender_eye
|
||||
text: |
|
||||
The way to the End is through a stronghold's portal. Ender pearls come from Abra and its evolutions; blaze powder from Fire types such as Magmar.
|
||||
tasks:
|
||||
- item: minecraft:ender_eye
|
||||
count: 12
|
||||
- id: eternatus
|
||||
title: Eternatus
|
||||
icon: minecraft:dragon_egg
|
||||
after: [arrive]
|
||||
text: |
|
||||
Eternatus has taken the dragon's place: a Lv 80 giant whose bar shows its health. Like the guardians, it takes at most a quarter of its health from any one attack.
|
||||
Beating it opens the way home and leaves the dragon egg the first time.
|
||||
tasks:
|
||||
- event: end_boss
|
||||
title: Beat Eternatus
|
||||
|
||||
- id: machines
|
||||
title: Pokémon Machines
|
||||
subtitle: Five machines, each powered by a Pokémon inside it
|
||||
icon: cobblesurvival:heat_core
|
||||
quests:
|
||||
- id: about
|
||||
title: Building a Machine
|
||||
icon: cobblesurvival:heat_core
|
||||
text: |
|
||||
Each machine is a 3×3×3 shell with its core in the middle of one wall and an empty chamber in the centre for the Pokémon. Place the core: glowing ghost blocks show where the shell goes.
|
||||
Send your Pokémon out near the core and use the core with an empty hand: it walks in. Use the core again to take it back; sneak-use to see what the machine is doing.
|
||||
tasks:
|
||||
- checkmark: true
|
||||
title: Read this
|
||||
- id: furnace
|
||||
title: Large Furnace
|
||||
icon: cobblesurvival:heat_core
|
||||
after: [about]
|
||||
text: |
|
||||
A Fire-type Pokémon in a Heat Core shell of bricks heats furnaces placed against the shell: they burn without fuel and cook much faster. Hoppers work as usual.
|
||||
tasks:
|
||||
- event: machine/heat_core
|
||||
title: Put a Fire type into a Large Furnace
|
||||
- id: generator
|
||||
title: Generator
|
||||
icon: cobblesurvival:dynamo_core
|
||||
after: [about]
|
||||
text: |
|
||||
An Electric-type Pokémon in a Dynamo Core shell of copper makes Forge Energy for cables and other machines.
|
||||
tasks:
|
||||
- event: machine/dynamo_core
|
||||
title: Put an Electric type into a Generator
|
||||
- id: synthesizer
|
||||
title: Drop Synthesizer
|
||||
icon: cobblesurvival:synthesis_core
|
||||
after: [generator]
|
||||
text: |
|
||||
Feed energy into a Synthesis Core shell: the Pokémon inside makes its own drops, as if defeated. Gold, diamond or netherite shells add looting.
|
||||
tasks:
|
||||
- event: machine/synthesis_core
|
||||
title: Put a Pokémon into a Drop Synthesizer
|
||||
- id: altar
|
||||
title: Sacrifice Altar
|
||||
icon: cobblesurvival:altar_core
|
||||
after: [about]
|
||||
text: |
|
||||
A Pokémon of level 20 or more in an Altar Core shell of obsidian can be given up for rare rewards: rare candies, ability items, even a nether star. It is gone for good.
|
||||
tasks:
|
||||
- event: machine/altar_core
|
||||
title: Put a Pokémon on a Sacrifice Altar
|
||||
- id: rebirth
|
||||
title: Rebirth Chamber
|
||||
icon: cobblesurvival:rebirth_core
|
||||
after: [about]
|
||||
text: |
|
||||
A level 100 Pokémon in a Rebirth Core shell of amethyst is reborn after two hours as a shiny level 1 of its first stage, with better IVs and every move it knew.
|
||||
tasks:
|
||||
- event: machine/rebirth_core
|
||||
title: Start a rebirth
|
||||
|
||||
- id: base
|
||||
title: Base and Jobs
|
||||
subtitle: Pokémon that work while you're away
|
||||
icon: cobblemon:pasture
|
||||
quests:
|
||||
- id: pasture
|
||||
title: A Pasture
|
||||
icon: cobblemon:pasture
|
||||
text: |
|
||||
Pokémon in a Pasture Block live at your base. With Cobblebase they work there: harvesting, mining, finding items, breeding.
|
||||
A job needs the Pokémon to be strong enough for the zone its work belongs to, or to hold one of that zone's materials.
|
||||
tasks:
|
||||
- item: cobblemon:pasture
|
||||
- id: pc
|
||||
title: A PC
|
||||
icon: cobblemon:pc
|
||||
text: |
|
||||
Your PC holds every Pokémon not in your party. There is no remote access: you have to stand at a PC block.
|
||||
tasks:
|
||||
- item: cobblemon:pc
|
||||
@@ -21,6 +21,7 @@ import dev.cobblesurvival.selftest.SelfTest
|
||||
import dev.cobblesurvival.world.OnlyPokemon
|
||||
import dev.cobblesurvival.world.SharedLoot
|
||||
import dev.cobblesurvival.world.SpecialPokemon
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import dev.cobblesurvival.zone.GuardianBars
|
||||
import dev.cobblesurvival.zone.Guardians
|
||||
import dev.cobblesurvival.zone.InZoneCondition
|
||||
@@ -80,6 +81,7 @@ class CobbleSurvival {
|
||||
NeoForge.EVENT_BUS.addListener(Zones::onAddReloadListeners)
|
||||
Guardians.register()
|
||||
GuardianBars.register()
|
||||
QuestEvents.register()
|
||||
BossFights.register()
|
||||
BossToughness.register()
|
||||
EndBoss.register()
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.cobblemon.mod.common.api.events.battles.BattleFaintedEvent
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import dev.cobblesurvival.CobbleSurvival
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import dev.cobblesurvival.zone.GuardianState
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.core.BlockPos
|
||||
@@ -149,6 +150,7 @@ object EndBoss {
|
||||
}
|
||||
val xp = if (firstWin) def?.xpFirstWin ?: 0 else def?.xp ?: 0
|
||||
players.forEach {
|
||||
QuestEvents.award(it, "end_boss")
|
||||
it.giveExperiencePoints(xp)
|
||||
it.sendSystemMessage(Component.translatableWithFallback("message.cobblesurvival.boss.end_beaten",
|
||||
"The End's guardian is beaten! The way home is open.").withStyle(ChatFormatting.GOLD))
|
||||
|
||||
@@ -4,6 +4,8 @@ import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import dev.cobblesurvival.CobbleSurvival
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import java.util.UUID
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.HolderLookup
|
||||
@@ -22,7 +24,6 @@ import net.minecraft.world.phys.AABB
|
||||
import net.neoforged.neoforge.energy.IEnergyStorage
|
||||
import net.neoforged.neoforge.items.IItemHandler
|
||||
import net.neoforged.neoforge.items.ItemStackHandler
|
||||
import java.util.UUID
|
||||
|
||||
/**
|
||||
* The core of a Pokémon machine (roadmap Phase 6). It keeps the Pokémon put in (its data lives only here while it's
|
||||
@@ -148,6 +149,7 @@ class MachineBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Machine
|
||||
MachineWork.onInsert(this, level, def)
|
||||
setChanged()
|
||||
display = MachineDisplay.spawn(level, pokemon, worldPosition, match.chamber, facing())
|
||||
QuestEvents.award(player, "machine/${BuiltInRegistries.BLOCK.getKey(blockState.block).path}")
|
||||
tell(player, Component.translatableWithFallback("message.cobblesurvival.machine.inserted", "%s went into the %s.", pokemon.getDisplayName(), machineName)
|
||||
.withStyle(ChatFormatting.GREEN))
|
||||
tell(player, MachineWork.status(this, level, def))
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package dev.cobblesurvival.progress
|
||||
|
||||
import dev.cobblesurvival.CobbleSurvival
|
||||
import dev.cobblesurvival.zone.Zones
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.neoforged.neoforge.common.NeoForge
|
||||
import net.neoforged.neoforge.event.tick.ServerTickEvent
|
||||
|
||||
/**
|
||||
* The pack's own events as hidden advancements (roadmap Phase 8), for quest tasks of FTB Quests' "advancement" type:
|
||||
* `cobblesurvival:events/zone/<zone>` on reaching a zone, `events/guardian/<zone>` on beating its guardian,
|
||||
* `events/machine/<core>` on putting a Pokémon into a complete machine, `events/end_boss` on beating the End boss.
|
||||
* They have no display (no toast, not in the advancement screen) and unlock nothing (no flags: Adrian, 2026-10-31);
|
||||
* tools/quests.py writes them.
|
||||
*/
|
||||
object QuestEvents {
|
||||
private const val ZONE_CHECK_TICKS = 20
|
||||
|
||||
fun register() {
|
||||
NeoForge.EVENT_BUS.addListener<ServerTickEvent.Post> { event ->
|
||||
if (event.server.tickCount % ZONE_CHECK_TICKS != 0) return@addListener
|
||||
for (player in event.server.playerList.players) {
|
||||
Zones.at(player.serverLevel(), player.blockPosition())?.let { award(player, "zone/${it.id}") }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun id(event: String) = ResourceLocation.fromNamespaceAndPath(CobbleSurvival.MOD_ID, "events/$event")
|
||||
|
||||
fun award(player: ServerPlayer, event: String) {
|
||||
val advancement = player.server.advancements.get(id(event)) ?: return
|
||||
if (!player.advancements.getOrStartProgress(advancement).isDone) player.advancements.award(advancement, "done")
|
||||
}
|
||||
|
||||
fun done(player: ServerPlayer, event: String): Boolean =
|
||||
player.server.advancements.get(id(event))?.let { player.advancements.getOrStartProgress(it).isDone } == true
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import com.cobblemon.mod.common.battles.BattleBuilder
|
||||
import com.cobblemon.mod.common.battles.MoveActionResponse
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.isInBattle
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import dev.cobblesurvival.zone.GuardianBars
|
||||
import dev.cobblesurvival.zone.Guardians
|
||||
import dev.cobblesurvival.zone.Zones
|
||||
@@ -73,6 +74,7 @@ object GuardianTests {
|
||||
.thenExecute {
|
||||
s.check(Guardians.guardianOf(level, ZONE) == null) { "the guardian came back right away" }
|
||||
s.check(GuardianBars.barFor(ZONE, player) == null) { "the beaten guardian's bar is still shown" }
|
||||
s.check(QuestEvents.done(player, "guardian/$ZONE")) { "beating the guardian didn't mark guardian/$ZONE for the quest book" }
|
||||
Guardians.expireDefeatForTest(level, ZONE)
|
||||
}
|
||||
.thenWaitUntil {
|
||||
|
||||
@@ -13,6 +13,7 @@ import dev.cobblesurvival.machine.MachineGhosts
|
||||
import dev.cobblesurvival.machine.MachineShowcase
|
||||
import dev.cobblesurvival.machine.MachineWork
|
||||
import dev.cobblesurvival.machine.Shell
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
@@ -240,6 +241,7 @@ object MachineTests {
|
||||
val player = s.player()
|
||||
val core = build(s, "heat_core", Blocks.BRICKS)
|
||||
insert(s, core, player, s.give(player, s.pokemon("charmander", 50)))
|
||||
s.check(QuestEvents.done(player, "machine/heat_core")) { "a Large Furnace built didn't mark machine/heat_core for the quest book" }
|
||||
// A furnace against the east wall, a hopper with raw iron above it and an empty one below; no fuel anywhere.
|
||||
val furnace = core.blockPos.offset(2, 0, -1)
|
||||
level.setBlockAndUpdate(furnace, Blocks.FURNACE.defaultBlockState())
|
||||
|
||||
@@ -2,7 +2,13 @@ package dev.cobblesurvival.selftest
|
||||
|
||||
import com.cobblemon.mod.common.api.spawning.CobblemonSpawnPools
|
||||
import com.cobblemon.mod.common.api.spawning.detail.PokemonSpawnDetail
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import dev.cobblesurvival.zone.Zones
|
||||
import net.minecraft.gametest.framework.GameTestAssertException
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.levelgen.Heightmap
|
||||
import java.util.function.Consumer
|
||||
|
||||
/**
|
||||
* Roadmap Phase 8 (Adrian, 2026-11-03): the add-ons the quest book and JEI lean on work with the pack. Read by
|
||||
@@ -12,8 +18,63 @@ object QuestTests {
|
||||
fun all() = listOf(
|
||||
SelfTestCase("quests_have_cobblemon_tasks", 20, ::cobblemonTasks),
|
||||
SelfTestCase("jei_addon_shows_island_spawns", 20, ::addonSpawns),
|
||||
SelfTestCase("quest_book_loads", 20, ::bookLoads),
|
||||
SelfTestCase("quest_events_mark_zones", 200, ::zoneEvent),
|
||||
)
|
||||
|
||||
/** At least this many quests in the book (docs/quests.yaml: 74 on 2026-11-03). */
|
||||
private const val MIN_QUESTS = 70
|
||||
|
||||
private fun field(obj: Any, name: String): Any? {
|
||||
var c: Class<*>? = obj.javaClass
|
||||
while (c != null) {
|
||||
runCatching { return c.getDeclaredField(name).apply { isAccessible = true }.get(obj) }
|
||||
c = c.superclass
|
||||
}
|
||||
throw GameTestAssertException("${obj.javaClass.simpleName} has no field $name")
|
||||
}
|
||||
|
||||
/**
|
||||
* FTB Quests loaded the generated book (tools/quests.py): enough quests, flexible progression, and every task
|
||||
* understood: no unknown task type, every item exists, every advancement exists on the server.
|
||||
*/
|
||||
private fun bookLoads(s: Scenario) {
|
||||
val file = Class.forName("dev.ftb.mods.ftbquests.quest.ServerQuestFile").getField("INSTANCE").get(null)
|
||||
?: throw GameTestAssertException("FTB Quests has no server quest file")
|
||||
val quests = mutableListOf<Any>()
|
||||
file.javaClass.getMethod("forAllQuests", Consumer::class.java).invoke(file, Consumer<Any> { quests += it })
|
||||
s.check(quests.size >= MIN_QUESTS) { "FTB Quests loaded ${quests.size} quests, not the book's $MIN_QUESTS or more" }
|
||||
s.check(field(file, "progressionMode").toString().equals("flexible", ignoreCase = true)) { "the book isn't in flexible mode" }
|
||||
val problems = mutableListOf<String>()
|
||||
for (quest in quests) {
|
||||
for (task in quest.javaClass.getMethod("getTasks").invoke(quest) as Collection<*>) {
|
||||
when (task!!.javaClass.simpleName) {
|
||||
"CustomTask" -> problems += "unknown task type in quest ${quest}"
|
||||
"ItemTask" -> if ((field(task, "itemStack") as ItemStack).isEmpty) problems += "an item task with no item in $quest"
|
||||
"AdvancementTask" -> {
|
||||
val id = field(task, "advancement") as ResourceLocation
|
||||
if (s.level.server.advancements.get(id) == null) problems += "no advancement $id"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
s.check(problems.isEmpty()) { problems.take(5).joinToString("; ") }
|
||||
s.helper.succeed()
|
||||
}
|
||||
|
||||
/** Walking into a zone marks the hidden advancement its "reach the zone" quest checks (progress/QuestEvents.kt). */
|
||||
private fun zoneEvent(s: Scenario) {
|
||||
val sample = Zones.samples["button_isle"] ?: throw GameTestAssertException("no sample point for Button Isle")
|
||||
val player = s.player()
|
||||
s.helper.startSequence()
|
||||
.thenExecute {
|
||||
s.level.getChunk(sample.x shr 4, sample.z shr 4)
|
||||
s.moveTo(player, sample.x + 0.5, s.level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, sample.x, sample.z).toDouble(), sample.z + 0.5)
|
||||
}
|
||||
.thenWaitUntil { s.check(QuestEvents.done(player, "zone/button_isle")) { "reaching Button Isle didn't mark zone/button_isle" } }
|
||||
.thenSucceed()
|
||||
}
|
||||
|
||||
/** Cobblemon Quests Reloaded adds its task type (catch, defeat, evolve, level up, ...) to FTB Quests. */
|
||||
private fun cobblemonTasks(s: Scenario) {
|
||||
val types = Class.forName("dev.ftb.mods.ftbquests.quest.task.TaskTypes").getField("TYPES").get(null) as Map<*, *>
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.google.gson.Gson
|
||||
import com.google.gson.JsonElement
|
||||
import dev.cobblesurvival.CobbleSurvival
|
||||
import dev.cobblesurvival.boss.BossToughness
|
||||
import dev.cobblesurvival.progress.QuestEvents
|
||||
import net.minecraft.ChatFormatting
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.HolderLookup
|
||||
@@ -204,6 +205,7 @@ object Guardians : SimpleJsonResourceReloadListener(Gson(), "guardians") {
|
||||
val zoneName = Zones.byId[zone]?.name ?: zone
|
||||
val hours = definition.respawnTicks / TICKS_PER_HOUR
|
||||
for (player in players) {
|
||||
QuestEvents.award(player, "guardian/$zone")
|
||||
for ((item, count) in definition.drops) {
|
||||
val stack = ItemStack(BuiltInRegistries.ITEM.get(item), count)
|
||||
if (!player.inventory.add(stack)) player.drop(stack, false)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
chapter_groups: [ ]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "basalt"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:magma_block"
|
||||
}
|
||||
id: "1AB2113B8D294817"
|
||||
order_index: 14
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "347307113EAA43B7"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/basalt"
|
||||
criterion: ""
|
||||
id: "0988A335BEF29999"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["347307113EAA43B7"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "1391BDC3E21A671E"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "77936B324D4901E5"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:absol,cobblemon:arcanine,cobblemon:centiskorch,cobblemon:charizard,cobblemon:dugtrio,cobblemon:durant,cobblemon:excadrill,cobblemon:gliscor,cobblemon:heatmor,cobblemon:houndoom,cobblemon:liepard,cobblemon:magcargo,cobblemon:magmortar,cobblemon:mawile,cobblemon:torkoal,cobblemon:turtonator"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["347307113EAA43B7"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "0CA0C724D201B8A0"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "508D2FA30F4BB2DC"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:ancient_debris"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "04B9FA5742524931"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:quartz"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["1391BDC3E21A671E"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "64893157D81592CD"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/basalt"
|
||||
criterion: ""
|
||||
id: "3760C53D7E826E9F"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "base"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:pasture"
|
||||
}
|
||||
id: "5B1F192C5A22F0B9"
|
||||
order_index: 17
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "cobblemon:pasture"
|
||||
}
|
||||
id: "3D4FF7751561B88E"
|
||||
tasks: [
|
||||
{
|
||||
id: "74FA251013AB0E92"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:pasture"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
icon: {
|
||||
id: "cobblemon:pc"
|
||||
}
|
||||
id: "0512AD0A323B6CBF"
|
||||
tasks: [
|
||||
{
|
||||
id: "09F3BBBEAC1DAC09"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:pc"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.75d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "button_isle"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "5B1E1FC28AA13DF0"
|
||||
order_index: 1
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "74149A0BF939C15E"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/button_isle"
|
||||
criterion: ""
|
||||
id: "37E84BF7E0830965"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["74149A0BF939C15E"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "6C03647CB1240A88"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "21A5BCFFBB9A9905"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:beautifly,cobblemon:beedrill,cobblemon:bidoof,cobblemon:bonsly,cobblemon:butterfree,cobblemon:cascoon,cobblemon:caterpie,cobblemon:combee,cobblemon:dustox,cobblemon:gimmighoul,cobblemon:hoothoot,cobblemon:kakuna,cobblemon:kricketot,cobblemon:kricketune,cobblemon:ledyba,cobblemon:meditite,cobblemon:meowth,cobblemon:metapod,cobblemon:morpeko,cobblemon:nincada,cobblemon:pachirisu,cobblemon:rattata,cobblemon:sableye,cobblemon:scatterbug,cobblemon:silcoon,cobblemon:skitty,cobblemon:smeargle,cobblemon:spewpa,cobblemon:spinarak,cobblemon:sunkern,cobblemon:tarountula,cobblemon:weedle,cobblemon:wooper,cobblemon:wurmple,cobblemon:wynaut"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["74149A0BF939C15E"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "04E681E6F33D559E"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "113016070BB2C8A8"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:coal"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["6C03647CB1240A88"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "7D6694B8BDAB6CC3"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/button_isle"
|
||||
criterion: ""
|
||||
id: "601AABB55A476514"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "deep_dark"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:sculk"
|
||||
}
|
||||
id: "3D9DA7F91C127569"
|
||||
order_index: 13
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "5C9CBA31D53F1574"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/deep_dark"
|
||||
criterion: ""
|
||||
id: "6F3A4DD1B1D796C0"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["5C9CBA31D53F1574"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "7D3AE59367CE04F7"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "4D0AD628007C8063"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:aegislash,cobblemon:bronzong,cobblemon:carbink,cobblemon:coalossal,cobblemon:corviknight,cobblemon:crobat,cobblemon:ditto,cobblemon:doublade,cobblemon:dusclops,cobblemon:dusknoir,cobblemon:gallade,cobblemon:gardevoir,cobblemon:gigalith,cobblemon:glimmora,cobblemon:golbat,cobblemon:honchkrow,cobblemon:houndstone,cobblemon:klinklang,cobblemon:mabosstiff,cobblemon:milotic,cobblemon:mimikyu,cobblemon:mrmime,cobblemon:mrrime,cobblemon:probopass,cobblemon:revavroom,cobblemon:steelix,cobblemon:zweilous"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["5C9CBA31D53F1574"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "55E9777C26CA6D8B"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "4B3AC312983F5BBB"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:diamond"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "3B3FCB6CC47D01E3"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:dusk_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["7D3AE59367CE04F7"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "2AAB6A47FDDD9D21"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/deep_dark"
|
||||
criterion: ""
|
||||
id: "6FC8CBBD36184562"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "deep_sea"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:mystic_water"
|
||||
}
|
||||
id: "720F052C0D14A813"
|
||||
order_index: 11
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "731852EDB1EE12B7"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/deep_sea"
|
||||
criterion: ""
|
||||
id: "574F9217F1F28CA1"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["731852EDB1EE12B7"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "38D974F9298EC54A"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "7FAC82727FD30447"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:barbaracle,cobblemon:binacle,cobblemon:brionne,cobblemon:clamperl,cobblemon:clauncher,cobblemon:clawitzer,cobblemon:cloyster,cobblemon:dewott,cobblemon:dhelmise,cobblemon:dragalge,cobblemon:drakloak,cobblemon:frillish,cobblemon:gorebyss,cobblemon:horsea,cobblemon:huntail,cobblemon:jellicent,cobblemon:kilowattrel,cobblemon:kingdra,cobblemon:lapras,cobblemon:mantine,cobblemon:mantyke,cobblemon:octillery,cobblemon:oshawott,cobblemon:popplio,cobblemon:primarina,cobblemon:remoraid,cobblemon:samurott,cobblemon:seadra,cobblemon:shellder,cobblemon:skrelp,cobblemon:starmie,cobblemon:staryu,cobblemon:veluza,cobblemon:wailmer,cobblemon:wailord"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["38D974F9298EC54A"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "6293CDFC2970C810"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/deep_sea"
|
||||
criterion: ""
|
||||
id: "40450EFE21BCC6AC"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "dripstone"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:pointed_dripstone"
|
||||
}
|
||||
id: "1CC462D3533A24CB"
|
||||
order_index: 7
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "234A59E2E707A288"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/dripstone"
|
||||
criterion: ""
|
||||
id: "541704C98A1EFEFD"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["234A59E2E707A288"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "4508548D257AA751"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "15AB0D7B120C183E"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:alcremie,cobblemon:bagon,cobblemon:baltoy,cobblemon:beldum,cobblemon:claydol,cobblemon:clefable,cobblemon:clefairy,cobblemon:cleffa,cobblemon:comfey,cobblemon:dachsbun,cobblemon:drowzee,cobblemon:druddigon,cobblemon:duosion,cobblemon:elgyem,cobblemon:espurr,cobblemon:fidough,cobblemon:geodude,cobblemon:golem,cobblemon:graveler,cobblemon:hypno,cobblemon:indeedee,cobblemon:klefki,cobblemon:lunatone,cobblemon:meowstic,cobblemon:metang,cobblemon:milcery,cobblemon:munna,cobblemon:musharna,cobblemon:orthworm,cobblemon:shelgon,cobblemon:sigilyph,cobblemon:slurpuff,cobblemon:solosis,cobblemon:solrock,cobblemon:swirlix"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["234A59E2E707A288"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "28873C8A3FDC26C6"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "039F7832BBF6B948"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:amethyst_shard"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "559DB3B670250DDB"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:moon_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "frostpeak"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:ice_stone"
|
||||
}
|
||||
id: "5FFC982FA1DF927B"
|
||||
order_index: 12
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "5E3FC3FC950242DD"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/frostpeak"
|
||||
criterion: ""
|
||||
id: "3DDCEC8895708D8B"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["5E3FC3FC950242DD"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "69D3A6622A0EE729"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "7DDE77D3AC4ED018"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:abomasnow,cobblemon:annihilape,cobblemon:archaludon,cobblemon:aromatisse,cobblemon:basculegion,cobblemon:basculin,cobblemon:bayleef,cobblemon:braviary,cobblemon:cherrim,cobblemon:chesnaught,cobblemon:copperajah,cobblemon:cryogonal,cobblemon:dartrix,cobblemon:decidueye,cobblemon:delibird,cobblemon:dubwool,cobblemon:duraludon,cobblemon:eldegoss,cobblemon:electabuzz,cobblemon:electivire,cobblemon:floragato,cobblemon:fraxure,cobblemon:froslass,cobblemon:frosmoth,cobblemon:glalie,cobblemon:gogoat,cobblemon:grumpig,cobblemon:hariyama,cobblemon:haxorus,cobblemon:hitmonchan,cobblemon:hitmonlee,cobblemon:hitmontop,cobblemon:infernape,cobblemon:jynx,cobblemon:lucario,cobblemon:lycanroc,cobblemon:machamp,cobblemon:machoke,cobblemon:meganium,cobblemon:meowscarada,cobblemon:mienshao,cobblemon:minior,cobblemon:monferno,cobblemon:primeape,cobblemon:pupitar,cobblemon:quilladin,cobblemon:rhydon,cobblemon:rhyperior,cobblemon:roselia,cobblemon:roserade,cobblemon:salandit,cobblemon:sawk,cobblemon:sneasel,cobblemon:sneasler,cobblemon:spinda,cobblemon:staraptor,cobblemon:throh,cobblemon:togedemaru,cobblemon:togekiss,cobblemon:togetic,cobblemon:tyranitar,cobblemon:vanillish,cobblemon:vanilluxe"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["5E3FC3FC950242DD"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "33052810B8325006"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "36583475D440D0DF"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:dawn_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "5F9AD8C3A96810CA"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:emerald"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "5A030E9C822D784F"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:ice_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["69D3A6622A0EE729"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "3F61AFD873C3F8EE"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/frostpeak"
|
||||
criterion: ""
|
||||
id: "22A180D1442FFCE5"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "getting_started"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "3016E46A8F77F347"
|
||||
order_index: 0
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "692C224D099307BA"
|
||||
size: 1.5d
|
||||
tasks: [
|
||||
{
|
||||
id: "1EB647481990638E"
|
||||
type: "checkmark"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["692C224D099307BA"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "662D0BC3B032EA6A"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 1L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "5D508D8465BB3D2E"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: ""
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["692C224D099307BA"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "05B922BE6CEBAAC2"
|
||||
tasks: [
|
||||
{
|
||||
count: 16L
|
||||
id: "60E85755B62E0639"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["662D0BC3B032EA6A"]
|
||||
icon: {
|
||||
id: "cobblemon:great_ball"
|
||||
}
|
||||
id: "4E95F2B6B144DACB"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 6L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "77EB6E4496784340"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: ""
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: -3.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["662D0BC3B032EA6A"]
|
||||
icon: {
|
||||
id: "cobblesurvival:revival_charm"
|
||||
}
|
||||
id: "6603239BE6012B1F"
|
||||
tasks: [
|
||||
{
|
||||
id: "409E1983A3EA5E2A"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblesurvival:revival_charm"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: -1.5d
|
||||
}
|
||||
{
|
||||
dependencies: ["662D0BC3B032EA6A"]
|
||||
icon: {
|
||||
id: "cobblemon:healing_machine"
|
||||
}
|
||||
id: "4CCE497681B71AB5"
|
||||
tasks: [
|
||||
{
|
||||
id: "33E4D851DCC35B04"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:healing_machine"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["662D0BC3B032EA6A"]
|
||||
icon: {
|
||||
id: "cobblemon:exp_candy_s"
|
||||
}
|
||||
id: "734F4C633D8946E3"
|
||||
tasks: [
|
||||
{
|
||||
action: "level_up_to"
|
||||
amount: 10L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "4D6E1C7B66413D13"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: ""
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 1.5d
|
||||
}
|
||||
{
|
||||
dependencies: ["662D0BC3B032EA6A"]
|
||||
icon: {
|
||||
id: "minecraft:string"
|
||||
}
|
||||
id: "4D8A9AAC3492BF6A"
|
||||
tasks: [
|
||||
{
|
||||
action: "defeat"
|
||||
amount: 5L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "01AE5D898D38E9EF"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: ""
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 3.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["734F4C633D8946E3"]
|
||||
icon: {
|
||||
id: "cobblemon:fire_stone"
|
||||
}
|
||||
id: "7B60BB7EF06BE4E4"
|
||||
tasks: [
|
||||
{
|
||||
action: "evolve"
|
||||
amount: 1L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "3EFBBA3B25149DCF"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: ""
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 6.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["734F4C633D8946E3", "4E95F2B6B144DACB"]
|
||||
icon: {
|
||||
id: "minecraft:compass"
|
||||
}
|
||||
id: "0830DA072B96D6A8"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/southwold"
|
||||
criterion: ""
|
||||
id: "44B70BA974514E63"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 6.0d
|
||||
y: 0.75d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "highlands"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:sun_stone"
|
||||
}
|
||||
id: "26CC78ED0BC7D785"
|
||||
order_index: 8
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "498A85F2039AF3BB"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/highlands"
|
||||
criterion: ""
|
||||
id: "2D2320863A33D6F6"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["498A85F2039AF3BB"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "60D115B2A0C801B7"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "5709B9DB121328F3"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:abra,cobblemon:alakazam,cobblemon:ampharos,cobblemon:bellossom,cobblemon:bouffalant,cobblemon:buizel,cobblemon:chewtle,cobblemon:cinderace,cobblemon:combusken,cobblemon:cottonee,cobblemon:cyclizar,cobblemon:cyndaquil,cobblemon:drednaw,cobblemon:electrike,cobblemon:flaaffy,cobblemon:fletchinder,cobblemon:fletchling,cobblemon:floatzel,cobblemon:gloom,cobblemon:golduck,cobblemon:golett,cobblemon:grotle,cobblemon:hoppip,cobblemon:jigglypuff,cobblemon:jumpluff,cobblemon:kadabra,cobblemon:lechonk,cobblemon:lickilicky,cobblemon:lickitung,cobblemon:lokix,cobblemon:manectric,cobblemon:mareep,cobblemon:mightyena,cobblemon:miltank,cobblemon:mudbray,cobblemon:mudsdale,cobblemon:ninetales,cobblemon:oddish,cobblemon:oinkologne,cobblemon:pidgeotto,cobblemon:pidgey,cobblemon:pignite,cobblemon:politoed,cobblemon:poliwag,cobblemon:poliwhirl,cobblemon:poliwrath,cobblemon:polteageist,cobblemon:ponyta,cobblemon:psyduck,cobblemon:quaxly,cobblemon:quaxwell,cobblemon:quilava,cobblemon:raboot,cobblemon:scorbunny,cobblemon:seviper,cobblemon:sinistea,cobblemon:skiploom,cobblemon:spiritomb,cobblemon:squirtle,cobblemon:stonjourner,cobblemon:talonflame,cobblemon:tauros,cobblemon:tepig,cobblemon:tinkatink,cobblemon:tinkatuff,cobblemon:torchic,cobblemon:torterra,cobblemon:turtwig,cobblemon:vileplume,cobblemon:vulpix,cobblemon:wartortle,cobblemon:whimsicott,cobblemon:wigglytuff,cobblemon:zangoose,cobblemon:zoroark,cobblemon:zorua"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["498A85F2039AF3BB"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "15287B830F186D1D"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "1D5CB444C94CE15B"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:lapis_lazuli"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "49EBDD458B5E3F3B"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:sun_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["60D115B2A0C801B7"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "673147FA87104942"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/highlands"
|
||||
criterion: ""
|
||||
id: "1FDC2EC84BCB0799"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "jungle"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:leaf_stone"
|
||||
}
|
||||
id: "0F763138AA0551CF"
|
||||
order_index: 6
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "190884D7C1509137"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/jungle"
|
||||
criterion: ""
|
||||
id: "6D2ED8A178EE3B43"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["190884D7C1509137"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "1CC49658829D508F"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "2B6ECDA368144338"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:aipom,cobblemon:bellsprout,cobblemon:bounsweet,cobblemon:bulbasaur,cobblemon:chatot,cobblemon:darumaka,cobblemon:exeggcute,cobblemon:exeggutor,cobblemon:fomantis,cobblemon:grafaiai,cobblemon:grookey,cobblemon:grovyle,cobblemon:ivysaur,cobblemon:jangmoo,cobblemon:kecleon,cobblemon:litten,cobblemon:natu,cobblemon:panpour,cobblemon:pansage,cobblemon:pansear,cobblemon:pikipek,cobblemon:servine,cobblemon:shroodle,cobblemon:simipour,cobblemon:simisage,cobblemon:simisear,cobblemon:slakoth,cobblemon:snivy,cobblemon:steenee,cobblemon:stunfisk,cobblemon:swoobat,cobblemon:tangela,cobblemon:tangrowth,cobblemon:thwackey,cobblemon:torracat,cobblemon:toucannon,cobblemon:treecko,cobblemon:tropius,cobblemon:trumbeak,cobblemon:tsareena,cobblemon:unown,cobblemon:vigoroth,cobblemon:weepinbell,cobblemon:woobat,cobblemon:xatu"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["190884D7C1509137"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "176EAF7AF6072172"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "1C5D2E8AEDE391CA"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:leaf_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "6DAC1EB6531FC107"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:redstone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["1CC49658829D508F"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "3D8B1B2FA845C406"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/jungle"
|
||||
criterion: ""
|
||||
id: "26D7F4049F9F71AF"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "lush_caves"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:glow_berries"
|
||||
}
|
||||
id: "5FD07FF070099857"
|
||||
order_index: 4
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "23A088BCF63BF446"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/lush_caves"
|
||||
criterion: ""
|
||||
id: "1AD94715DD267878"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["23A088BCF63BF446"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "70FDBAB56079AA17"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "0DA807941A1C114E"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:amaura,cobblemon:anorith,cobblemon:archen,cobblemon:barboach,cobblemon:carnivine,cobblemon:cranidos,cobblemon:cutiefly,cobblemon:ferroseed,cobblemon:granbull,cobblemon:joltik,cobblemon:kabuto,cobblemon:lileep,cobblemon:morelull,cobblemon:omanyte,cobblemon:paras,cobblemon:parasect,cobblemon:ribombee,cobblemon:shieldon,cobblemon:shiinotic,cobblemon:shuckle,cobblemon:snubbull,cobblemon:tirtouga,cobblemon:trubbish,cobblemon:tyrunt,cobblemon:venipede,cobblemon:whirlipede"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["23A088BCF63BF446"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "496174D8AF114AE5"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "08D4BDE1D28B3E70"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:shiny_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "machines"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblesurvival:heat_core"
|
||||
}
|
||||
id: "5170190C30A58C4C"
|
||||
order_index: 16
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "cobblesurvival:heat_core"
|
||||
}
|
||||
id: "0416CE46FDF992CF"
|
||||
tasks: [
|
||||
{
|
||||
id: "2B27F35809CBDD44"
|
||||
type: "checkmark"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["0416CE46FDF992CF"]
|
||||
icon: {
|
||||
id: "cobblesurvival:heat_core"
|
||||
}
|
||||
id: "19F164637025FA56"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/machine/heat_core"
|
||||
criterion: ""
|
||||
id: "1E88C490A11841C2"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -2.25d
|
||||
}
|
||||
{
|
||||
dependencies: ["0416CE46FDF992CF"]
|
||||
icon: {
|
||||
id: "cobblesurvival:dynamo_core"
|
||||
}
|
||||
id: "6B424DADFF959A58"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/machine/dynamo_core"
|
||||
criterion: ""
|
||||
id: "29BC1DB51DDFA453"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["6B424DADFF959A58"]
|
||||
icon: {
|
||||
id: "cobblesurvival:synthesis_core"
|
||||
}
|
||||
id: "035E43CC5E263118"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/machine/synthesis_core"
|
||||
criterion: ""
|
||||
id: "1DC91BD8BFFFEDA9"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["0416CE46FDF992CF"]
|
||||
icon: {
|
||||
id: "cobblesurvival:altar_core"
|
||||
}
|
||||
id: "3B64655619EB4CD4"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/machine/altar_core"
|
||||
criterion: ""
|
||||
id: "6EC304EEC3D8E6C3"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["0416CE46FDF992CF"]
|
||||
icon: {
|
||||
id: "cobblesurvival:rebirth_core"
|
||||
}
|
||||
id: "1DE944B24F006EB2"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/machine/rebirth_core"
|
||||
criterion: ""
|
||||
id: "3733FBDB6C485FA5"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 2.25d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "mire"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblesurvival:mire_waders"
|
||||
}
|
||||
id: "44799AD1E5B5CCB8"
|
||||
order_index: 9
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "7EE0590D4FE1CF15"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/mire"
|
||||
criterion: ""
|
||||
id: "60EA09356932EC73"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["7EE0590D4FE1CF15"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "6F4F5AFD500EF638"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "0F2192166EF9657C"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:accelgor,cobblemon:arrokuda,cobblemon:barraskewda,cobblemon:bellibolt,cobblemon:croagunk,cobblemon:dondozo,cobblemon:drizzile,cobblemon:ducklett,cobblemon:escavalier,cobblemon:flamigo,cobblemon:froakie,cobblemon:frogadier,cobblemon:greninja,cobblemon:illumise,cobblemon:inteleon,cobblemon:karrablast,cobblemon:marshtomp,cobblemon:masquerain,cobblemon:misdreavus,cobblemon:mudkip,cobblemon:shelmet,cobblemon:slowpoke,cobblemon:sobble,cobblemon:surskit,cobblemon:swampert,cobblemon:swanna,cobblemon:tadbulb,cobblemon:tatsugiri,cobblemon:toxicroak,cobblemon:volbeat,cobblemon:yanma,cobblemon:yanmega"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["7EE0590D4FE1CF15"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "160F8C59205DCFAB"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "34DCD38C4CA4715D"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:water_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["6F4F5AFD500EF638"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "18899F287B836AF9"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/mire"
|
||||
criterion: ""
|
||||
id: "48FAAD6D76831C55"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
icon: {
|
||||
id: "cobblesurvival:mire_waders"
|
||||
}
|
||||
id: "6D67BB02A856BDF9"
|
||||
tasks: [
|
||||
{
|
||||
id: "42ADEC4535FAAC05"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblesurvival:mire_waders"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.75d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "shallows"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:kelp"
|
||||
}
|
||||
id: "1B23BCD483E3F9CE"
|
||||
order_index: 2
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "2F51067D3773786B"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/shallows"
|
||||
criterion: ""
|
||||
id: "400C02B8A2511867"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["2F51067D3773786B"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "2B50212FDAA429C2"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "14CD76A3A1DA8813"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:alomomola,cobblemon:bruxish,cobblemon:carvanha,cobblemon:chinchou,cobblemon:clobbopus,cobblemon:crabrawler,cobblemon:cramorant,cobblemon:finizen,cobblemon:finneon,cobblemon:inkay,cobblemon:krabby,cobblemon:luvdisc,cobblemon:mareanie,cobblemon:pincurchin,cobblemon:pyukumuku,cobblemon:qwilfish,cobblemon:sandygast,cobblemon:shellos,cobblemon:wiglett,cobblemon:wingull,cobblemon:wishiwashi"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "southwold"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:raw_copper"
|
||||
}
|
||||
id: "39B2B675E1F194C2"
|
||||
order_index: 3
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "4C0B4F1365903D23"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/southwold"
|
||||
criterion: ""
|
||||
id: "58EAEDE25DA7FDA3"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["4C0B4F1365903D23"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "35B82AF57D59FD63"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "0642427B02A6BC0C"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:audino,cobblemon:azumarill,cobblemon:azurill,cobblemon:bunnelby,cobblemon:burmy,cobblemon:chansey,cobblemon:chingling,cobblemon:corsola,cobblemon:drifloon,cobblemon:dunsparce,cobblemon:eevee,cobblemon:farfetchd,cobblemon:furfrou,cobblemon:furret,cobblemon:gastly,cobblemon:glameow,cobblemon:goldeen,cobblemon:grimer,cobblemon:grubbin,cobblemon:happiny,cobblemon:hawlucha,cobblemon:heracross,cobblemon:herdier,cobblemon:koffing,cobblemon:lillipup,cobblemon:lombre,cobblemon:lotad,cobblemon:magnemite,cobblemon:marill,cobblemon:minccino,cobblemon:minun,cobblemon:noibat,cobblemon:patrat,cobblemon:pidove,cobblemon:pinsir,cobblemon:plusle,cobblemon:porygon,cobblemon:pumpkaboo,cobblemon:relicanth,cobblemon:sentret,cobblemon:shuppet,cobblemon:squawkabilly,cobblemon:swablu,cobblemon:taillow,cobblemon:tentacool,cobblemon:timburr,cobblemon:toxel,cobblemon:tynamo,cobblemon:venonat,cobblemon:voltorb,cobblemon:whismur,cobblemon:wimpod,cobblemon:yamask,cobblemon:yamper,cobblemon:yungoos,cobblemon:zigzagoon"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["4C0B4F1365903D23"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "1154E278D871A8CA"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "2BA8271FAADE7352"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:raw_copper"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["35B82AF57D59FD63"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "7F9137726771D1B4"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/southwold"
|
||||
criterion: ""
|
||||
id: "643C68559D41888A"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "sunscorch"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:fire_stone"
|
||||
}
|
||||
id: "683F9A3EE54CFAEB"
|
||||
order_index: 10
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "55ECFCF6F71DD9EA"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/sunscorch"
|
||||
criterion: ""
|
||||
id: "25A95FE7586E9E36"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["55ECFCF6F71DD9EA"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "5A9BD54AA3CCF992"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "30B0A497459D10DC"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:arbok,cobblemon:braixen,cobblemon:brambleghast,cobblemon:cacnea,cobblemon:cacturne,cobblemon:camerupt,cobblemon:capsakid,cobblemon:crocalor,cobblemon:croconaw,cobblemon:crustle,cobblemon:cubone,cobblemon:delphox,cobblemon:donphan,cobblemon:drampa,cobblemon:drapion,cobblemon:dwebble,cobblemon:espathra,cobblemon:falinks,cobblemon:fearow,cobblemon:fennekin,cobblemon:feraligatr,cobblemon:flygon,cobblemon:fuecoco,cobblemon:garganacl,cobblemon:heliolisk,cobblemon:hippopotas,cobblemon:hippowdon,cobblemon:klawf,cobblemon:krokorok,cobblemon:krookodile,cobblemon:larvesta,cobblemon:luxio,cobblemon:luxray,cobblemon:maractus,cobblemon:marowak,cobblemon:naclstack,cobblemon:numel,cobblemon:palpitoad,cobblemon:pawniard,cobblemon:phanpy,cobblemon:poltchageist,cobblemon:rabsca,cobblemon:sandaconda,cobblemon:sandshrew,cobblemon:sandslash,cobblemon:scovillain,cobblemon:scrafty,cobblemon:scraggy,cobblemon:seismitoad,cobblemon:silicobra,cobblemon:sinistcha,cobblemon:skarmory,cobblemon:skeledirge,cobblemon:skorupi,cobblemon:totodile,cobblemon:vibrava"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["55ECFCF6F71DD9EA"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "51641292C7351094"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "7D4BA54983656549"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:fire_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "6BA82FAA6EE34245"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:raw_gold"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["5A9BD54AA3CCF992"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "20F77357783CD1BD"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/sunscorch"
|
||||
criterion: ""
|
||||
id: "63B77EE998527582"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "the_end"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "minecraft:end_stone"
|
||||
}
|
||||
id: "523B743FE073F7FE"
|
||||
order_index: 15
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "0EFBAEBACB069D59"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/the_end"
|
||||
criterion: ""
|
||||
id: "34B8D43E572277D5"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["0EFBAEBACB069D59"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "1066F4CF69C3BC3D"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "110E73F79CC591F3"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:beheeyem,cobblemon:gothitelle,cobblemon:malamar,cobblemon:metagross,cobblemon:reuniclus,cobblemon:sigilyph,cobblemon:unown"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:ender_eye"
|
||||
}
|
||||
id: "33109004C52AD664"
|
||||
tasks: [
|
||||
{
|
||||
count: 12L
|
||||
id: "68AAA5056828342A"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:ender_eye"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["0EFBAEBACB069D59"]
|
||||
icon: {
|
||||
id: "minecraft:dragon_egg"
|
||||
}
|
||||
id: "6EB4CFA7061556F9"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/end_boss"
|
||||
criterion: ""
|
||||
id: "011FDF522119676D"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
default_hide_dependency_lines: false
|
||||
default_quest_shape: ""
|
||||
filename: "westmarch"
|
||||
group: ""
|
||||
icon: {
|
||||
id: "cobblemon:thunder_stone"
|
||||
}
|
||||
id: "59ECDC0F93A836A2"
|
||||
order_index: 5
|
||||
quest_links: [ ]
|
||||
quests: [
|
||||
{
|
||||
icon: {
|
||||
id: "minecraft:filled_map"
|
||||
}
|
||||
id: "0644BAB8C69CE8D0"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/zone/westmarch"
|
||||
criterion: ""
|
||||
id: "03F5C5D2587C6503"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 0.0d
|
||||
y: 0.0d
|
||||
}
|
||||
{
|
||||
dependencies: ["0644BAB8C69CE8D0"]
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
id: "66F360A95FD42556"
|
||||
tasks: [
|
||||
{
|
||||
action: "catch"
|
||||
amount: 3L
|
||||
biome: ""
|
||||
dex_progress: ""
|
||||
dimension: ""
|
||||
form: ""
|
||||
gender: ""
|
||||
id: "7E55DFAB964DF237"
|
||||
max_level: 0
|
||||
min_level: 0
|
||||
natures: ""
|
||||
poke_ball_used: ""
|
||||
pokemon: "cobblemon:appletun,cobblemon:applin,cobblemon:araquanid,cobblemon:breloom,cobblemon:buneary,cobblemon:corphish,cobblemon:deerling,cobblemon:dewpider,cobblemon:dipplin,cobblemon:dratini,cobblemon:flabebe,cobblemon:flapple,cobblemon:floette,cobblemon:gabite,cobblemon:gible,cobblemon:goomy,cobblemon:greedent,cobblemon:gyarados,cobblemon:lilligant,cobblemon:magikarp,cobblemon:maushold,cobblemon:munchlax,cobblemon:nickit,cobblemon:nuzleaf,cobblemon:petilil,cobblemon:phantump,cobblemon:pichu,cobblemon:pikachu,cobblemon:scyther,cobblemon:seedot,cobblemon:sewaddle,cobblemon:shroomish,cobblemon:skwovet,cobblemon:stunky,cobblemon:swadloon,cobblemon:tandemaus,cobblemon:teddiursa,cobblemon:thievul"
|
||||
pokemon_type: ""
|
||||
region: ""
|
||||
shiny: false
|
||||
time_max: 0L
|
||||
time_min: 0L
|
||||
type: "cobblemon_tasks:cobblemon_task"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: -0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["0644BAB8C69CE8D0"]
|
||||
icon: {
|
||||
id: "minecraft:iron_pickaxe"
|
||||
}
|
||||
id: "5F224979C849BDB1"
|
||||
tasks: [
|
||||
{
|
||||
count: 8L
|
||||
id: "5A7B474658E6A223"
|
||||
item: {
|
||||
count: 1
|
||||
id: "minecraft:raw_iron"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
{
|
||||
count: 8L
|
||||
id: "28C263298DD74549"
|
||||
item: {
|
||||
count: 1
|
||||
id: "cobblemon:thunder_stone"
|
||||
}
|
||||
type: "item"
|
||||
}
|
||||
]
|
||||
x: 2.0d
|
||||
y: 0.75d
|
||||
}
|
||||
{
|
||||
dependencies: ["66F360A95FD42556"]
|
||||
icon: {
|
||||
id: "minecraft:netherite_sword"
|
||||
}
|
||||
id: "51F4867542A2849E"
|
||||
tasks: [
|
||||
{
|
||||
advancement: "cobblesurvival:events/guardian/westmarch"
|
||||
criterion: ""
|
||||
id: "16DC8BE1DDE7B0D7"
|
||||
type: "advancement"
|
||||
}
|
||||
]
|
||||
x: 4.0d
|
||||
y: 0.0d
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
default_autoclaim_rewards: "disabled"
|
||||
default_consume_items: false
|
||||
default_quest_disable_jei: false
|
||||
default_quest_shape: "circle"
|
||||
default_reward_team: false
|
||||
detection_delay: 20
|
||||
disable_gui: false
|
||||
drop_book_on_death: false
|
||||
drop_loot_crates: false
|
||||
emergency_items_cooldown: 300
|
||||
fallback_locale: "en_us"
|
||||
grid_scale: 0.5d
|
||||
hide_excluded_quests: false
|
||||
icon: {
|
||||
id: "cobblemon:poke_ball"
|
||||
}
|
||||
lock_message: ""
|
||||
pause_game: false
|
||||
progression_mode: "flexible"
|
||||
show_lock_icons: false
|
||||
verify_on_load: false
|
||||
version: 13
|
||||
}
|
||||
@@ -0,0 +1,437 @@
|
||||
{
|
||||
"chapter.0F763138AA0551CF.title": "Verdant Jungle"
|
||||
"chapter.1AB2113B8D294817.title": "Basalt Furnace"
|
||||
"chapter.1B23BCD483E3F9CE.title": "Shallows"
|
||||
"chapter.1CC462D3533A24CB.title": "Dripstone Depths"
|
||||
"chapter.26CC78ED0BC7D785.title": "Highland Meadows"
|
||||
"chapter.3016E46A8F77F347.chapter_subtitle": ["The island, your first partner, and the rules that matter"]
|
||||
"chapter.3016E46A8F77F347.title": "Getting Started"
|
||||
"chapter.39B2B675E1F194C2.title": "Southwold"
|
||||
"chapter.3D9DA7F91C127569.title": "Deep Dark"
|
||||
"chapter.44799AD1E5B5CCB8.title": "Mangrove Mire"
|
||||
"chapter.5170190C30A58C4C.chapter_subtitle": ["Five machines, each powered by a Pokémon inside it"]
|
||||
"chapter.5170190C30A58C4C.title": "Pokémon Machines"
|
||||
"chapter.523B743FE073F7FE.title": "The End"
|
||||
"chapter.59ECDC0F93A836A2.title": "Westmarch"
|
||||
"chapter.5B1E1FC28AA13DF0.title": "Button Isle"
|
||||
"chapter.5B1F192C5A22F0B9.chapter_subtitle": ["Pokémon that work while you're away"]
|
||||
"chapter.5B1F192C5A22F0B9.title": "Base and Jobs"
|
||||
"chapter.5FD07FF070099857.title": "Lush Caves"
|
||||
"chapter.5FFC982FA1DF927B.title": "Frostpeak Range"
|
||||
"chapter.683F9A3EE54CFAEB.title": "Sunscorch"
|
||||
"chapter.720F052C0D14A813.title": "Deep Sea"
|
||||
"file.0000000000000001.title": "Cobblemon Survival"
|
||||
"quest.035E43CC5E263118.quest_desc": [
|
||||
"Feed energy into a Synthesis Core shell: the Pokémon inside makes its own drops, as if defeated. Gold, diamond or netherite shells add looting."
|
||||
]
|
||||
"quest.035E43CC5E263118.title": "Drop Synthesizer"
|
||||
"quest.0416CE46FDF992CF.quest_desc": [
|
||||
"Each machine is a 3×3×3 shell with its core in the middle of one wall and an empty chamber in the centre for the Pokémon. Place the core: glowing ghost blocks show where the shell goes."
|
||||
"Send your Pokémon out near the core and use the core with an empty hand: it walks in. Use the core again to take it back; sneak-use to see what the machine is doing."
|
||||
]
|
||||
"quest.0416CE46FDF992CF.title": "Building a Machine"
|
||||
"quest.04E681E6F33D559E.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Button Isle has Coal."
|
||||
]
|
||||
"quest.04E681E6F33D559E.title": "Ores of Button Isle"
|
||||
"quest.0512AD0A323B6CBF.quest_desc": [
|
||||
"Your PC holds every Pokémon not in your party. There is no remote access: you have to stand at a PC block."
|
||||
]
|
||||
"quest.0512AD0A323B6CBF.title": "A PC"
|
||||
"quest.05B922BE6CEBAAC2.quest_desc": [
|
||||
"Poké Balls are crafted from apricorns, which grow on apricorn trees around the island. Look the recipe up in JEI."
|
||||
]
|
||||
"quest.05B922BE6CEBAAC2.title": "Poké Balls"
|
||||
"quest.0644BAB8C69CE8D0.quest_desc": [
|
||||
"Wild Pokémon in Westmarch are level 15 to 25. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.0644BAB8C69CE8D0.quest_subtitle": "Lv 15–25"
|
||||
"quest.0644BAB8C69CE8D0.title": "Westmarch"
|
||||
"quest.0830DA072B96D6A8.quest_desc": [
|
||||
"Southwold, north of Button Isle, is the next step: Pokémon up to level 18 and the island's copper."
|
||||
]
|
||||
"quest.0830DA072B96D6A8.title": "Beyond Button Isle"
|
||||
"quest.0CA0C724D201B8A0.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Basalt Furnace has Ancient Debris, Quartz."
|
||||
]
|
||||
"quest.0CA0C724D201B8A0.title": "Ores of Basalt Furnace"
|
||||
"quest.0EFBAEBACB069D59.quest_desc": [
|
||||
"Wild Pokémon in The End are level 50 to 70. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.0EFBAEBACB069D59.quest_subtitle": "Lv 50–70"
|
||||
"quest.0EFBAEBACB069D59.title": "The End"
|
||||
"quest.1066F4CF69C3BC3D.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call The End home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.1066F4CF69C3BC3D.title": "Locals of The End"
|
||||
"quest.1154E278D871A8CA.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Southwold has Raw Copper."
|
||||
]
|
||||
"quest.1154E278D871A8CA.title": "Ores of Southwold"
|
||||
"quest.1391BDC3E21A671E.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Basalt Furnace home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.1391BDC3E21A671E.title": "Locals of Basalt Furnace"
|
||||
"quest.15287B830F186D1D.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Highland Meadows has Lapis Lazuli, Sun Stone."
|
||||
]
|
||||
"quest.15287B830F186D1D.title": "Ores of Highland Meadows"
|
||||
"quest.160F8C59205DCFAB.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Mangrove Mire has Water Stone."
|
||||
]
|
||||
"quest.160F8C59205DCFAB.title": "Ores of Mangrove Mire"
|
||||
"quest.176EAF7AF6072172.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Verdant Jungle has Leaf Stone, Redstone."
|
||||
]
|
||||
"quest.176EAF7AF6072172.title": "Ores of Verdant Jungle"
|
||||
"quest.18899F287B836AF9.quest_desc": [
|
||||
"Swampert, Lv 43, guards Mangrove Mire: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 3 Icy Rock, 4 Super Potion. It returns 5 hours later."
|
||||
]
|
||||
"quest.18899F287B836AF9.title": "Guardian of Mangrove Mire"
|
||||
"quest.190884D7C1509137.quest_desc": [
|
||||
"Wild Pokémon in Verdant Jungle are level 18 to 30. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.190884D7C1509137.quest_subtitle": "Lv 18–30"
|
||||
"quest.190884D7C1509137.title": "Verdant Jungle"
|
||||
"quest.19F164637025FA56.quest_desc": [
|
||||
"A Fire-type Pokémon in a Heat Core shell of bricks heats furnaces placed against the shell: they burn without fuel and cook much faster. Hoppers work as usual."
|
||||
]
|
||||
"quest.19F164637025FA56.title": "Large Furnace"
|
||||
"quest.1CC49658829D508F.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Verdant Jungle home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.1CC49658829D508F.title": "Locals of Verdant Jungle"
|
||||
"quest.1DE944B24F006EB2.quest_desc": [
|
||||
"A level 100 Pokémon in a Rebirth Core shell of amethyst is reborn after two hours as a shiny level 1 of its first stage, with better IVs and every move it knew."
|
||||
]
|
||||
"quest.1DE944B24F006EB2.title": "Rebirth Chamber"
|
||||
"quest.20F77357783CD1BD.quest_desc": [
|
||||
"Flygon, Lv 50, guards Sunscorch: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 3 Heat Rock, 2 Exp Candy L. It returns 5 hours later."
|
||||
]
|
||||
"quest.20F77357783CD1BD.title": "Guardian of Sunscorch"
|
||||
"quest.234A59E2E707A288.quest_desc": [
|
||||
"Wild Pokémon in Dripstone Depths are level 22 to 38. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.234A59E2E707A288.quest_subtitle": "Lv 22–38"
|
||||
"quest.234A59E2E707A288.title": "Dripstone Depths"
|
||||
"quest.23A088BCF63BF446.quest_desc": [
|
||||
"Wild Pokémon in Lush Caves are level 12 to 28. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.23A088BCF63BF446.quest_subtitle": "Lv 12–28"
|
||||
"quest.23A088BCF63BF446.title": "Lush Caves"
|
||||
"quest.28873C8A3FDC26C6.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Dripstone Depths has Amethyst Shard, Moon Stone."
|
||||
]
|
||||
"quest.28873C8A3FDC26C6.title": "Ores of Dripstone Depths"
|
||||
"quest.2AAB6A47FDDD9D21.quest_desc": [
|
||||
"Regigigas, Lv 65, guards Deep Dark: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 3 Icy Rock, 2 Exp Candy L. It returns 5 hours later."
|
||||
]
|
||||
"quest.2AAB6A47FDDD9D21.title": "Guardian of Deep Dark"
|
||||
"quest.2B50212FDAA429C2.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Shallows home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.2B50212FDAA429C2.title": "Locals of Shallows"
|
||||
"quest.2F51067D3773786B.quest_desc": [
|
||||
"Wild Pokémon in Shallows are level 5 to 20. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.2F51067D3773786B.quest_subtitle": "Lv 5–20"
|
||||
"quest.2F51067D3773786B.title": "Shallows"
|
||||
"quest.33052810B8325006.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Frostpeak Range has Dawn Stone, Emerald, Ice Stone."
|
||||
]
|
||||
"quest.33052810B8325006.title": "Ores of Frostpeak Range"
|
||||
"quest.33109004C52AD664.quest_desc": [
|
||||
"The way to the End is through a stronghold's portal. Ender pearls come from Abra and its evolutions; blaze powder from Fire types such as Magmar."
|
||||
]
|
||||
"quest.33109004C52AD664.title": "Eyes of Ender"
|
||||
"quest.347307113EAA43B7.quest_desc": [
|
||||
"Wild Pokémon in Basalt Furnace are level 55 to 70. Bring a team that can hold its own there. The heat of the furnace hurts without heat insulation on your armor (Cold Sweat)."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.347307113EAA43B7.quest_subtitle": "Lv 55–70"
|
||||
"quest.347307113EAA43B7.title": "Basalt Furnace"
|
||||
"quest.35B82AF57D59FD63.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Southwold home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.35B82AF57D59FD63.title": "Locals of Southwold"
|
||||
"quest.38D974F9298EC54A.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Deep Sea home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.38D974F9298EC54A.title": "Locals of Deep Sea"
|
||||
"quest.3B64655619EB4CD4.quest_desc": [
|
||||
"A Pokémon of level 20 or more in an Altar Core shell of obsidian can be given up for rare rewards: rare candies, ability items, even a nether star. It is gone for good."
|
||||
]
|
||||
"quest.3B64655619EB4CD4.title": "Sacrifice Altar"
|
||||
"quest.3D4FF7751561B88E.quest_desc": [
|
||||
"Pokémon in a Pasture Block live at your base. With Cobblebase they work there: harvesting, mining, finding items, breeding."
|
||||
"A job needs the Pokémon to be strong enough for the zone its work belongs to, or to hold one of that zone's materials."
|
||||
]
|
||||
"quest.3D4FF7751561B88E.title": "A Pasture"
|
||||
"quest.3D8B1B2FA845C406.quest_desc": [
|
||||
"Tangrowth, Lv 35, guards Verdant Jungle: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 1 Mire Waders, 4 Pecha Berry, 2 Exp Candy M. It returns 5 hours later."
|
||||
]
|
||||
"quest.3D8B1B2FA845C406.title": "Guardian of Verdant Jungle"
|
||||
"quest.3F61AFD873C3F8EE.quest_desc": [
|
||||
"Abomasnow, Lv 60, guards Frostpeak Range: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 3 Icy Rock, 2 Exp Candy L. It returns 5 hours later."
|
||||
]
|
||||
"quest.3F61AFD873C3F8EE.title": "Guardian of Frostpeak Range"
|
||||
"quest.4508548D257AA751.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Dripstone Depths home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.4508548D257AA751.title": "Locals of Dripstone Depths"
|
||||
"quest.496174D8AF114AE5.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Lush Caves has Shiny Stone."
|
||||
]
|
||||
"quest.496174D8AF114AE5.title": "Ores of Lush Caves"
|
||||
"quest.498A85F2039AF3BB.quest_desc": [
|
||||
"Wild Pokémon in Highland Meadows are level 25 to 35. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.498A85F2039AF3BB.quest_subtitle": "Lv 25–35"
|
||||
"quest.498A85F2039AF3BB.title": "Highland Meadows"
|
||||
"quest.4C0B4F1365903D23.quest_desc": [
|
||||
"Wild Pokémon in Southwold are level 8 to 18. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.4C0B4F1365903D23.quest_subtitle": "Lv 8–18"
|
||||
"quest.4C0B4F1365903D23.title": "Southwold"
|
||||
"quest.4CCE497681B71AB5.quest_desc": [
|
||||
"Sleeping doesn't heal your Pokémon. A Healing Machine does, but it is expensive and recharges slowly; potions and berries help in between."
|
||||
]
|
||||
"quest.4CCE497681B71AB5.title": "Healing"
|
||||
"quest.4D8A9AAC3492BF6A.quest_desc": [
|
||||
"Defeated Pokémon drop items. Look any item up in JEI (Cobblemon Info pages) to see which Pokémon drop it and where they live."
|
||||
]
|
||||
"quest.4D8A9AAC3492BF6A.title": "What Pokémon Leave Behind"
|
||||
"quest.4E95F2B6B144DACB.quest_desc": ["Six Pokémon of different types handle more than one strong one."]
|
||||
"quest.4E95F2B6B144DACB.title": "A Full Team"
|
||||
"quest.51641292C7351094.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Sunscorch has Fire Stone, Raw Gold."
|
||||
]
|
||||
"quest.51641292C7351094.title": "Ores of Sunscorch"
|
||||
"quest.51F4867542A2849E.quest_desc": [
|
||||
"Scyther, Lv 30, guards Westmarch: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 1 Mire Waders, 4 Pecha Berry, 2 Exp Candy M. It returns 5 hours later."
|
||||
]
|
||||
"quest.51F4867542A2849E.title": "Guardian of Westmarch"
|
||||
"quest.55E9777C26CA6D8B.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Deep Dark has Diamond, Dusk Stone."
|
||||
]
|
||||
"quest.55E9777C26CA6D8B.title": "Ores of Deep Dark"
|
||||
"quest.55ECFCF6F71DD9EA.quest_desc": [
|
||||
"Wild Pokémon in Sunscorch are level 30 to 45. Bring a team that can hold its own there. The desert heat hurts without heat insulation on your armor (Cold Sweat): look up insulation in JEI."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.55ECFCF6F71DD9EA.quest_subtitle": "Lv 30–45"
|
||||
"quest.55ECFCF6F71DD9EA.title": "Sunscorch"
|
||||
"quest.5A9BD54AA3CCF992.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Sunscorch home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.5A9BD54AA3CCF992.title": "Locals of Sunscorch"
|
||||
"quest.5C9CBA31D53F1574.quest_desc": [
|
||||
"Wild Pokémon in Deep Dark are level 45 to 60. Bring a team that can hold its own there. Sculk darkens your sight down here. There is no Warden, but the ancient colossus sleeps in the ruins."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.5C9CBA31D53F1574.quest_subtitle": "Lv 45–60"
|
||||
"quest.5C9CBA31D53F1574.title": "Deep Dark"
|
||||
"quest.5E3FC3FC950242DD.quest_desc": [
|
||||
"Wild Pokémon in Frostpeak Range are level 40 to 55. Bring a team that can hold its own there. The cold hurts without wool insulation on your armor (Cold Sweat): look up insulation in JEI."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.5E3FC3FC950242DD.quest_subtitle": "Lv 40–55"
|
||||
"quest.5E3FC3FC950242DD.title": "Frostpeak Range"
|
||||
"quest.5F224979C849BDB1.quest_desc": [
|
||||
"There is no ore anywhere except in each zone's own veins, and they grow back after you mine them."
|
||||
"Westmarch has Raw Iron, Thunder Stone."
|
||||
]
|
||||
"quest.5F224979C849BDB1.title": "Ores of Westmarch"
|
||||
"quest.60D115B2A0C801B7.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Highland Meadows home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.60D115B2A0C801B7.title": "Locals of Highland Meadows"
|
||||
"quest.6293CDFC2970C810.quest_desc": [
|
||||
"Kingdra, Lv 55, guards Deep Sea: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 1 Mystic Water, 3 Exp Candy M. It returns 5 hours later."
|
||||
]
|
||||
"quest.6293CDFC2970C810.title": "Guardian of Deep Sea"
|
||||
"quest.64893157D81592CD.quest_desc": [
|
||||
"Moltres, Lv 75, guards Basalt Furnace: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 3 Exp Candy Xl, 2 Netherite Scrap. It returns 5 hours later."
|
||||
]
|
||||
"quest.64893157D81592CD.title": "Guardian of Basalt Furnace"
|
||||
"quest.6603239BE6012B1F.quest_desc": [
|
||||
"A Pokémon that faints is gone for good once the battle ends. Revives only help within that battle."
|
||||
"A Pokémon holding a Revival Charm is saved once instead: the charm is used up and the Pokémon is healed. Give one to your most valuable partner."
|
||||
]
|
||||
"quest.6603239BE6012B1F.title": "A Second Chance"
|
||||
"quest.662D0BC3B032EA6A.quest_desc": ["Weaken a wild Pokémon in battle, then throw a Poké Ball at it."]
|
||||
"quest.662D0BC3B032EA6A.title": "A Partner"
|
||||
"quest.66F360A95FD42556.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Westmarch home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.66F360A95FD42556.title": "Locals of Westmarch"
|
||||
"quest.673147FA87104942.quest_desc": [
|
||||
"Mudsdale, Lv 40, guards Highland Meadows: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 3 Icy Rock, 4 Super Potion. It returns 5 hours later."
|
||||
]
|
||||
"quest.673147FA87104942.title": "Guardian of Highland Meadows"
|
||||
"quest.692C224D099307BA.quest_desc": [
|
||||
"This island has no zombies, no creepers and no cows: only Pokémon. Their drops are your food, string, leather and much more."
|
||||
"The island is split into zones, each with its own Pokémon, levels, ores and a guardian. You start on Button Isle; the further out you go, the stronger everything gets."
|
||||
""
|
||||
"This book suggests what to do next. Nothing in it is locked and it gives no rewards: do things in any order you like."
|
||||
]
|
||||
"quest.692C224D099307BA.title": "Welcome to the Island"
|
||||
"quest.69D3A6622A0EE729.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Frostpeak Range home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.69D3A6622A0EE729.title": "Locals of Frostpeak Range"
|
||||
"quest.6B424DADFF959A58.quest_desc": [
|
||||
"An Electric-type Pokémon in a Dynamo Core shell of copper makes Forge Energy for cables and other machines."
|
||||
]
|
||||
"quest.6B424DADFF959A58.title": "Generator"
|
||||
"quest.6C03647CB1240A88.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Button Isle home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.6C03647CB1240A88.title": "Locals of Button Isle"
|
||||
"quest.6D67BB02A856BDF9.quest_desc": [
|
||||
"Waders keep the Mire's poison off. Beat the guardian of Westmarch or the Verdant Jungle for a pair."
|
||||
]
|
||||
"quest.6D67BB02A856BDF9.title": "Mire Waders"
|
||||
"quest.6EB4CFA7061556F9.quest_desc": [
|
||||
"Eternatus has taken the dragon's place: a Lv 80 giant whose bar shows its health. Like the guardians, it takes at most a quarter of its health from any one attack."
|
||||
"Beating it opens the way home and leaves the dragon egg the first time."
|
||||
]
|
||||
"quest.6EB4CFA7061556F9.title": "Eternatus"
|
||||
"quest.6F4F5AFD500EF638.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Mangrove Mire home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.6F4F5AFD500EF638.title": "Locals of Mangrove Mire"
|
||||
"quest.70FDBAB56079AA17.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Lush Caves home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.70FDBAB56079AA17.title": "Locals of Lush Caves"
|
||||
"quest.731852EDB1EE12B7.quest_desc": [
|
||||
"Wild Pokémon in Deep Sea are level 30 to 50. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.731852EDB1EE12B7.quest_subtitle": "Lv 30–50"
|
||||
"quest.731852EDB1EE12B7.title": "Deep Sea"
|
||||
"quest.734F4C633D8946E3.quest_desc": [
|
||||
"Raise a Pokémon to level 10 by battling. Wild Pokémon stronger than your team may come after you; weaker ones keep their distance."
|
||||
]
|
||||
"quest.734F4C633D8946E3.title": "Growing Up"
|
||||
"quest.74149A0BF939C15E.quest_desc": [
|
||||
"Wild Pokémon in Button Isle are level 2 to 10. Bring a team that can hold its own there."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.74149A0BF939C15E.quest_subtitle": "Lv 2–10"
|
||||
"quest.74149A0BF939C15E.title": "Button Isle"
|
||||
"quest.7B60BB7EF06BE4E4.quest_desc": [
|
||||
"Evolve a Pokémon. Some need a level, some an evolution stone: the stones come from ore veins in particular zones."
|
||||
]
|
||||
"quest.7B60BB7EF06BE4E4.title": "Evolution"
|
||||
"quest.7D3AE59367CE04F7.quest_desc": [
|
||||
"Each kind of Pokémon lives in one zone of the island. Catch three that call Deep Dark home."
|
||||
"Their drops are what this zone adds to your crafting: look an item up in JEI to see who drops it."
|
||||
]
|
||||
"quest.7D3AE59367CE04F7.title": "Locals of Deep Dark"
|
||||
"quest.7D6694B8BDAB6CC3.quest_desc": [
|
||||
"Morpeko, Lv 15, guards Button Isle: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 10 Poke Ball, 4 Potion. It returns 5 hours later."
|
||||
]
|
||||
"quest.7D6694B8BDAB6CC3.title": "Guardian of Button Isle"
|
||||
"quest.7EE0590D4FE1CF15.quest_desc": [
|
||||
"Wild Pokémon in Mangrove Mire are level 25 to 38. Bring a team that can hold its own there. The Mire's water poisons you unless you wear Mire Waders: the guardians of Westmarch and the Verdant Jungle drop them."
|
||||
"A Pokémon far above a zone's levels learns less from battles there; Exp. Candy always works in full."
|
||||
]
|
||||
"quest.7EE0590D4FE1CF15.quest_subtitle": "Lv 25–38"
|
||||
"quest.7EE0590D4FE1CF15.title": "Mangrove Mire"
|
||||
"quest.7F9137726771D1B4.quest_desc": [
|
||||
"Pinsir, Lv 23, guards Southwold: a giant that takes at most a quarter of its health from any one attack."
|
||||
"Within 128 blocks its bar shows how far away it is. In the fight, watch the ground and step out of its area attacks; leaving the arena or dying loses the fight."
|
||||
"Beat it for 6 Great Ball, 4 Exp Candy S. It returns 5 hours later."
|
||||
]
|
||||
"quest.7F9137726771D1B4.title": "Guardian of Southwold"
|
||||
"task.011FDF522119676D.title": "Beat Eternatus"
|
||||
"task.03F5C5D2587C6503.title": "Reach Westmarch"
|
||||
"task.0988A335BEF29999.title": "Reach Basalt Furnace"
|
||||
"task.16DC8BE1DDE7B0D7.title": "Beat Scyther"
|
||||
"task.1AD94715DD267878.title": "Reach Lush Caves"
|
||||
"task.1DC91BD8BFFFEDA9.title": "Put a Pokémon into a Drop Synthesizer"
|
||||
"task.1E88C490A11841C2.title": "Put a Fire type into a Large Furnace"
|
||||
"task.1EB647481990638E.title": "Read this"
|
||||
"task.1FDC2EC84BCB0799.title": "Beat Mudsdale"
|
||||
"task.22A180D1442FFCE5.title": "Beat Abomasnow"
|
||||
"task.25A95FE7586E9E36.title": "Reach Sunscorch"
|
||||
"task.26D7F4049F9F71AF.title": "Beat Tangrowth"
|
||||
"task.29BC1DB51DDFA453.title": "Put an Electric type into a Generator"
|
||||
"task.2B27F35809CBDD44.title": "Read this"
|
||||
"task.2D2320863A33D6F6.title": "Reach Highland Meadows"
|
||||
"task.34B8D43E572277D5.title": "Reach The End"
|
||||
"task.3733FBDB6C485FA5.title": "Start a rebirth"
|
||||
"task.3760C53D7E826E9F.title": "Beat Moltres"
|
||||
"task.37E84BF7E0830965.title": "Reach Button Isle"
|
||||
"task.3DDCEC8895708D8B.title": "Reach Frostpeak Range"
|
||||
"task.400C02B8A2511867.title": "Reach Shallows"
|
||||
"task.40450EFE21BCC6AC.title": "Beat Kingdra"
|
||||
"task.44B70BA974514E63.title": "Reach Southwold"
|
||||
"task.48FAAD6D76831C55.title": "Beat Swampert"
|
||||
"task.541704C98A1EFEFD.title": "Reach Dripstone Depths"
|
||||
"task.574F9217F1F28CA1.title": "Reach Deep Sea"
|
||||
"task.58EAEDE25DA7FDA3.title": "Reach Southwold"
|
||||
"task.601AABB55A476514.title": "Beat Morpeko"
|
||||
"task.60EA09356932EC73.title": "Reach Mangrove Mire"
|
||||
"task.63B77EE998527582.title": "Beat Flygon"
|
||||
"task.643C68559D41888A.title": "Beat Pinsir"
|
||||
"task.6D2ED8A178EE3B43.title": "Reach Verdant Jungle"
|
||||
"task.6EC304EEC3D8E6C3.title": "Put a Pokémon on a Sacrifice Altar"
|
||||
"task.6F3A4DD1B1D796C0.title": "Reach Deep Dark"
|
||||
"task.6FC8CBBD36184562.title": "Beat Regigigas"
|
||||
}
|
||||
@@ -28,6 +28,90 @@ hash = "fbc8a858d5cfe978ed48a6a5f564b9d0a7b540e12b5f481c4eb797021a9f6078"
|
||||
file = "config/fightorflight.json5"
|
||||
hash = "d1f8daadc8e34c41950e8f439ca089e8820142e57767459cbe1eb2a250ee4441"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapter_groups.snbt"
|
||||
hash = "e57d8311aec9f524911ed1313cabf138bb7fa5a2d3ba985a00a2a267ff35ef78"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/basalt.snbt"
|
||||
hash = "7e1b74aebae51bf0433bdd422b3ad9097e58abaf25cabaa5fcf03ca78d417bfd"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/base.snbt"
|
||||
hash = "46710212af0c6bf3f39e97b95d2a5e0dfdfb312470fbfab5f24b6d95764032c9"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/button_isle.snbt"
|
||||
hash = "ce24fccd748e805ec617f7b571263c1af91377644a3fc17146bf38963e8b54ab"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/deep_dark.snbt"
|
||||
hash = "45a3992afb773ea5442dc536d18a6c7b2ed20befe1daf31f170e27d2b1c67324"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/deep_sea.snbt"
|
||||
hash = "6c01131b458060cf69e11dae1f08ac9944ac77e2d6abcfb58a630137579cf9c3"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/dripstone.snbt"
|
||||
hash = "6de9aff416df5c916f00065c90ce64c57422ae4de4c415522178e090e5a5f830"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/frostpeak.snbt"
|
||||
hash = "e0f380185bc9cb53c993e86d6fcb9a82ea14723bf211c5ad7d046aaeadd7c468"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/getting_started.snbt"
|
||||
hash = "829aa67db8a39f6f43aa6076090c0040e4324be70abe0b30e0edcce48d924ab9"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/highlands.snbt"
|
||||
hash = "ed7e66df09969ac69acc0f12648c7fb71589c37a14f4530714c1a97ffb5dab17"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/jungle.snbt"
|
||||
hash = "bdfd541303d72bcfa0b8a28cf1a9277701be2f7d75edd5a95175e6cf3915fc39"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/lush_caves.snbt"
|
||||
hash = "cd7dd0f47b33063d867f9f55c8b4307935ceda64509701886da75dbfb2ab92be"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/machines.snbt"
|
||||
hash = "dbeb43e993d27656f75e7a64a118e3592c40b5cbfc089bdf6a02069edae57011"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/mire.snbt"
|
||||
hash = "95bc5a97874794dff8d19cff04bfebe984c1d2fcefabcba15fc3b36a14e0880a"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/shallows.snbt"
|
||||
hash = "1f3829f5f40e853673645d7ea250e646f97bbd79b3235bc6f2b119defb573423"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/southwold.snbt"
|
||||
hash = "7bec07cf30f2b218e7d89b617fb61f7077f692fe570694bb70aef8067052511a"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/sunscorch.snbt"
|
||||
hash = "a975e58e4576456b574da8b51e76dc9f7f2e2c148c2c98a1af35469c522528b2"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/the_end.snbt"
|
||||
hash = "4a3aa5f1e3bed52e6c844284dec549367af01d4341aeefa460cdc135e2fba660"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/chapters/westmarch.snbt"
|
||||
hash = "d37a2c7743a9f38993c8d0d38f2f9c056bc760b68d04ea8bd91cc122e52e5d99"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/data.snbt"
|
||||
hash = "35b6760d4c56b02f2ff77dd5ba2f0e634c7f68238ce2809cddb22d9c61c6f943"
|
||||
|
||||
[[files]]
|
||||
file = "config/ftbquests/quests/lang/en_us.snbt"
|
||||
hash = "bce591f1d3b03bd1b4fe5a49a6153e06b825b41c3fc17fba23ac6b262afb0d50"
|
||||
|
||||
[[files]]
|
||||
file = "config/lootr-common.toml"
|
||||
hash = "b13f8c4e4211b698b9e680c99dcdd2b77ab06806dd597ad94dd8e753b6f571de"
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ pack-format = "packwiz:1.1.0"
|
||||
[index]
|
||||
file = "index.toml"
|
||||
hash-format = "sha256"
|
||||
hash = "08f7e8891c89f74815c92be37a9e80497356dac36b34ba06f060f353df059faa"
|
||||
hash = "8016bb0599908a11ee19680f1dccf1a7c13aa36d7012a0f1eb4cbad37e0756f8"
|
||||
|
||||
[versions]
|
||||
minecraft = "1.21.1"
|
||||
|
||||
@@ -104,6 +104,7 @@ def main():
|
||||
if not args.skip_mod:
|
||||
build_mod()
|
||||
jar = companion_jar()
|
||||
run([sys.executable, str(ROOT / "tools/quests.py")], ROOT) # the quest book (Phase 8) from docs/quests.yaml
|
||||
packwiz("refresh", cwd=PACK)
|
||||
pack = tomllib.loads((PACK / "pack.toml").read_text())
|
||||
base = f"{pack['name'].lower().replace(' ', '-')}-{pack['version']}"
|
||||
|
||||
@@ -5,6 +5,8 @@ Writes instance.cfg and mmc-pack.json (Minecraft + NeoForge from pack.toml),
|
||||
then syncs the client-side files with packwiz-installer. Run tools/build.py
|
||||
first. Run it again after changing the pack; options and saves in the
|
||||
instance are left alone. Close the instance in Prism before syncing.
|
||||
Quest nodes moved in the instance's quest editor are first copied into
|
||||
docs/quests.yaml (tools/quests.py --pull), and the pack rebuilt with them.
|
||||
|
||||
When build/world-template exists (tools/make_world.py), it is copied into the
|
||||
instance as the save "Cobblemon Survival Island" unless that save already
|
||||
@@ -16,6 +18,7 @@ Usage: tools/prism_instance.py [--name NAME] [--prism-dir DIR] [--memory MB] [--
|
||||
import argparse
|
||||
import json
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
@@ -78,6 +81,16 @@ def main():
|
||||
instance = prism / "instances" / args.name
|
||||
game = instance / "minecraft"
|
||||
game.mkdir(parents=True, exist_ok=True)
|
||||
# Node positions moved in the in-game quest editor go back into docs/quests.yaml first (Adrian, 2026-11-03),
|
||||
# so the sync doesn't overwrite them; the pack is rebuilt with them.
|
||||
quests = game / "config/ftbquests/quests"
|
||||
if (quests / "chapters").is_dir():
|
||||
source = ROOT / "docs/quests.yaml"
|
||||
before = source.read_text()
|
||||
subprocess.run([sys.executable, str(ROOT / "tools/quests.py"), "--pull", str(quests)], check=True)
|
||||
if source.read_text() != before:
|
||||
print("rebuilding with the moved quest nodes (commit docs/quests.yaml)")
|
||||
subprocess.run([sys.executable, str(ROOT / "tools/build.py"), "--skip-mod"], check=True)
|
||||
pack = tomllib.loads((stage / "pack.toml").read_text())
|
||||
write_cfg(instance / "instance.cfg", args.name, args.memory)
|
||||
write_components(instance / "mmc-pack.json", pack["versions"])
|
||||
|
||||
+427
@@ -0,0 +1,427 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Generate the quest book (roadmap Phase 8) from docs/quests.yaml.
|
||||
|
||||
Writes pack/config/ftbquests/quests/ in FTB Quests' own format (data.snbt, chapter_groups.snbt, chapters/*.snbt and
|
||||
every title and text in lang/en_us.snbt), and the hidden advancements the companion mod grants for the pack's own
|
||||
events (datapacks/core/data/cobblesurvival/advancement/events/: zone reached, guardian beaten, machine built, End boss
|
||||
beaten), which quests check with FTB Quests' "advancement" tasks.
|
||||
|
||||
Adrian's choices (2026-11-03): quests give no rewards; Cobblemon tasks come from Cobblemon Quests Reloaded; quests are
|
||||
written in docs/quests.yaml and node positions he moves in the in-game editor are read back into its `layout` block
|
||||
(--pull). Titles, texts, tasks and dependencies live only in docs/quests.yaml: edits to those in game are overwritten.
|
||||
|
||||
Every chapter, quest and task gets an id derived from its name in docs/quests.yaml, so the ids stay the same when the
|
||||
book is regenerated and players keep their progress. Zone chapters (`zone: <id>`) start with the quests of
|
||||
`zone_chapter`, filled in from world/zones.json, the zone's spawn pool and its guardian.
|
||||
|
||||
Usage:
|
||||
tools/quests.py generate
|
||||
tools/quests.py --pull DIR first copy node positions from an FTB Quests folder (e.g. a Prism instance's
|
||||
minecraft/config/ftbquests/quests) into docs/quests.yaml, then generate
|
||||
tools/quests.py --check fail if the generated files are out of date
|
||||
"""
|
||||
import argparse
|
||||
import copy
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
|
||||
ROOT = Path(__file__).resolve().parent.parent
|
||||
SOURCE = ROOT / "docs/quests.yaml"
|
||||
OUT = ROOT / "pack/config/ftbquests/quests"
|
||||
DATA = ROOT / "datapacks/core/data/cobblesurvival"
|
||||
EVENTS = DATA / "advancement/events"
|
||||
COBBLEMON_TASK = "cobblemon_tasks:cobblemon_task"
|
||||
LAYOUT_START = "layout:"
|
||||
|
||||
|
||||
# --- SNBT, the way FTB Quests writes it: one entry per line, no commas -------------------------------------------
|
||||
|
||||
class Long(int):
|
||||
pass
|
||||
|
||||
|
||||
def snbt(value, indent=0):
|
||||
pad = "\t" * indent
|
||||
if isinstance(value, dict):
|
||||
if not value:
|
||||
return "{ }"
|
||||
body = "\n".join(f"{pad}\t{key(k)}: {snbt(v, indent + 1)}" for k, v in sorted(value.items()))
|
||||
return "{\n" + body + "\n" + pad + "}"
|
||||
if isinstance(value, list):
|
||||
if not value:
|
||||
return "[ ]"
|
||||
if all(isinstance(v, str) for v in value) and len(value) <= 4 and sum(map(len, value)) < 80:
|
||||
return "[" + ", ".join(snbt(v) for v in value) + "]"
|
||||
return "[\n" + "\n".join(f"{pad}\t{snbt(v, indent + 1)}" for v in value) + "\n" + pad + "]"
|
||||
if isinstance(value, bool):
|
||||
return "true" if value else "false"
|
||||
if isinstance(value, Long):
|
||||
return f"{int(value)}L"
|
||||
if isinstance(value, float):
|
||||
return f"{value}d"
|
||||
if isinstance(value, int):
|
||||
return str(value)
|
||||
return '"' + str(value).replace("\\", "\\\\").replace('"', '\\"') + '"'
|
||||
|
||||
|
||||
def key(k):
|
||||
return k if re.fullmatch(r"[a-z0-9_]+", k) else snbt(k)
|
||||
|
||||
|
||||
def parse_snbt(text):
|
||||
"""Reads FTB Quests' SNBT (and vanilla's, with commas) into dicts, lists, strings and numbers."""
|
||||
pos = 0
|
||||
|
||||
def skip():
|
||||
nonlocal pos
|
||||
while pos < len(text) and (text[pos].isspace() or text[pos] == ","):
|
||||
pos += 1
|
||||
|
||||
def token():
|
||||
nonlocal pos
|
||||
start = pos
|
||||
while pos < len(text) and not text[pos].isspace() and text[pos] not in ",:{}[]":
|
||||
pos += 1
|
||||
return text[start:pos]
|
||||
|
||||
def string():
|
||||
nonlocal pos
|
||||
quote, pos, out = text[pos], pos + 1, []
|
||||
while text[pos] != quote:
|
||||
if text[pos] == "\\":
|
||||
pos += 1
|
||||
out.append(text[pos])
|
||||
pos += 1
|
||||
pos += 1
|
||||
return "".join(out)
|
||||
|
||||
def value():
|
||||
nonlocal pos
|
||||
skip()
|
||||
c = text[pos]
|
||||
if c == "{":
|
||||
pos += 1
|
||||
out = {}
|
||||
while True:
|
||||
skip()
|
||||
if text[pos] == "}":
|
||||
pos += 1
|
||||
return out
|
||||
k = string() if text[pos] in "\"'" else token()
|
||||
skip()
|
||||
assert text[pos] == ":", f"expected ':' at {pos}"
|
||||
pos += 1
|
||||
out[k] = value()
|
||||
if c == "[":
|
||||
pos += 1
|
||||
m = re.match(r"\s*[BIL];", text[pos:])
|
||||
if m:
|
||||
pos += m.end()
|
||||
out = []
|
||||
while True:
|
||||
skip()
|
||||
if text[pos] == "]":
|
||||
pos += 1
|
||||
return out
|
||||
out.append(value())
|
||||
if c in "\"'":
|
||||
return string()
|
||||
t = token()
|
||||
if t in ("true", "false"):
|
||||
return t == "true"
|
||||
m = re.fullmatch(r"(-?[0-9.]+(?:[eE]-?[0-9]+)?)([bBsSlLfFdD]?)", t)
|
||||
if m:
|
||||
return float(m[1]) if "." in m[1] or m[2] in "fFdD" and m[2] else int(m[1])
|
||||
return t
|
||||
|
||||
return value()
|
||||
|
||||
|
||||
# --- Ids ----------------------------------------------------------------------------------------------------------
|
||||
|
||||
def object_id(name):
|
||||
"""A stable FTB Quests id (16 hex digits) for a chapter, quest or task name."""
|
||||
n = int(hashlib.sha1(f"cobblesurvival:{name}".encode()).hexdigest()[:16], 16) & 0x7FFF_FFFF_FFFF_FFFF
|
||||
return f"{max(n, 2):016X}"
|
||||
|
||||
|
||||
# --- The pack's data, for zone chapters and event advancements ---------------------------------------------------
|
||||
|
||||
def zone_data():
|
||||
plan = json.loads((ROOT / "world/zones.json").read_text())
|
||||
zones = {z["id"]: z for z in plan["zones"] + plan["caves"] + plan.get("dimensions", [])}
|
||||
nodes = json.loads((DATA / "ore_nodes/island.json").read_text())["nodes"]
|
||||
for zid, z in zones.items():
|
||||
pool = DATA / f"spawn_pool_world/{zid}.json"
|
||||
spawns = json.loads(pool.read_text())["spawns"] if pool.exists() else []
|
||||
z["species"] = sorted({f"cobblemon:{s['pokemon'].split()[0].lower()}" for s in spawns})
|
||||
z["veins"] = sorted({n["vein"] for n in nodes if n["zone"] == zid})
|
||||
guardian = DATA / f"guardians/{zid}.json"
|
||||
z["guardian_data"] = json.loads(guardian.read_text()) if guardian.exists() else None
|
||||
return zones
|
||||
|
||||
|
||||
def machine_cores():
|
||||
return sorted(json.loads(p.read_text())["core"].split(":")[1] for p in (DATA / "machines").glob("*.json"))
|
||||
|
||||
|
||||
def write_event_advancements(zones):
|
||||
"""The hidden advancements the companion mod grants (progress/QuestEvents.kt)."""
|
||||
shutil.rmtree(EVENTS, ignore_errors=True)
|
||||
hidden = {"_comment": "Generated by tools/quests.py; granted by the companion mod (progress/QuestEvents.kt). "
|
||||
"No display: no toast, not in the advancement screen; quests check it.",
|
||||
"criteria": {"done": {"trigger": "minecraft:impossible"}}}
|
||||
names = [f"zone/{z}" for z in zones] + [f"guardian/{z}" for z, d in zones.items() if d["guardian_data"]]
|
||||
names += [f"machine/{core}" for core in machine_cores()] + ["end_boss"]
|
||||
for name in names:
|
||||
path = EVENTS / f"{name}.json"
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_text(json.dumps(hidden, indent=2) + "\n")
|
||||
return set(names)
|
||||
|
||||
|
||||
# --- Expanding docs/quests.yaml ----------------------------------------------------------------------------------
|
||||
|
||||
def title_case(item):
|
||||
return item.split(":")[1].replace("_", " ").title()
|
||||
|
||||
|
||||
def zone_fields(zone, chapter, book):
|
||||
g = zone["guardian_data"]
|
||||
ores = [book["ore_items"][v] for v in zone["veins"] if v in book["ore_items"]]
|
||||
return {
|
||||
"zone": zone["name"], "zone_id": zone["id"], "low": zone["levels"][0], "high": zone["levels"][1],
|
||||
"hazard_text": chapter.get("hazard_text", ""),
|
||||
"guardian": g["pokemon"].split()[0].title() if g else "",
|
||||
"guardian_level": re.search(r"level=(\d+)", g["pokemon"])[1] if g else "",
|
||||
"drops": ", ".join(f"{d['count']} {title_case(d['item'])}" for d in g["drops"]) if g else "",
|
||||
"ores": ores, "ore_names": ", ".join(title_case(o) for o in ores),
|
||||
}
|
||||
|
||||
|
||||
def fill(value, fields):
|
||||
if isinstance(value, str):
|
||||
return re.sub(r"\{(\w+)\}", lambda m: str(fields[m[1]]) if m[1] in fields else m[0], value)
|
||||
if isinstance(value, list):
|
||||
return [fill(v, fields) for v in value]
|
||||
if isinstance(value, dict):
|
||||
return {k: fill(v, fields) for k, v in value.items()}
|
||||
return value
|
||||
|
||||
|
||||
def chapter_quests(chapter, book, zones):
|
||||
quests = copy.deepcopy(chapter.get("quests", []))
|
||||
if "zone" in chapter:
|
||||
zone = zones[chapter["zone"]]
|
||||
fields = zone_fields(zone, chapter, book)
|
||||
wanted = {"ores": bool(fields["ores"]), "guardian": bool(zone["guardian_data"]), "species": bool(zone["species"])}
|
||||
template = [q for q in book["zone_chapter"] if all(wanted[w] for w in q.get("when", []))]
|
||||
quests = [fill({k: v for k, v in q.items() if k != "when"}, fields) for q in template] + quests
|
||||
# One item task per ore of the zone.
|
||||
for q in quests:
|
||||
tasks = []
|
||||
for t in q.get("tasks", []):
|
||||
tasks += [{**t, "item": o, "each": None} for o in fields["ores"]] if t.get("each") == "ores" else [t]
|
||||
q["tasks"] = [{k: v for k, v in t.items() if k != "each"} for t in tasks]
|
||||
# "Catch Pokémon of a zone": its spawn pool's species (Cobblemon Quests' own biome filter knows no zones).
|
||||
for q in quests:
|
||||
for t in q.get("tasks", []):
|
||||
if t.get("zone_species"):
|
||||
t["pokemon"] = zones[t.pop("zone_species")]["species"]
|
||||
return quests
|
||||
|
||||
|
||||
def task_nbt(task, name, events):
|
||||
tid = object_id(f"task:{name}")
|
||||
if "item" in task:
|
||||
nbt = {"id": tid, "type": "item", "item": {"count": 1, "id": task["item"]}}
|
||||
if task.get("count", 1) > 1:
|
||||
nbt["count"] = Long(task["count"])
|
||||
return nbt
|
||||
if "event" in task:
|
||||
assert task["event"] in events, f"{name}: no event advancement {task['event']}"
|
||||
return {"id": tid, "type": "advancement", "advancement": f"cobblesurvival:events/{task['event']}", "criterion": ""}
|
||||
if "advancement" in task:
|
||||
return {"id": tid, "type": "advancement", "advancement": task["advancement"], "criterion": ""}
|
||||
if "cobblemon" in task:
|
||||
species = task.get("pokemon", [])
|
||||
return {
|
||||
"id": tid, "type": COBBLEMON_TASK, "action": task["cobblemon"], "amount": Long(task.get("amount", 1)),
|
||||
"pokemon": ",".join(s if ":" in s else f"cobblemon:{s}" for s in species),
|
||||
"pokemon_type": ",".join(task.get("types", [])), "shiny": False,
|
||||
"biome": "", "dimension": "", "form": "", "gender": "", "poke_ball_used": "", "region": "", "natures": "",
|
||||
"time_min": Long(0), "time_max": Long(0), "min_level": 0, "max_level": 0, "dex_progress": "",
|
||||
}
|
||||
if task.get("checkmark"):
|
||||
return {"id": tid, "type": "checkmark"}
|
||||
raise ValueError(f"{name}: unknown task {task}")
|
||||
|
||||
|
||||
def auto_layout(quests, chapter_id):
|
||||
"""Left to right by dependency depth inside the chapter, stacked within a column."""
|
||||
local = {q["id"] for q in quests}
|
||||
depth = {}
|
||||
|
||||
def d(q):
|
||||
if q["id"] not in depth:
|
||||
deps = [p for p in q.get("after", []) if p in local]
|
||||
depth[q["id"]] = 0 if not deps else 1 + max(d(next(x for x in quests if x["id"] == p)) for p in deps)
|
||||
return depth[q["id"]]
|
||||
|
||||
columns = {}
|
||||
for q in quests:
|
||||
columns.setdefault(d(q), []).append(q["id"])
|
||||
pos = {}
|
||||
for col, ids in columns.items():
|
||||
for row, qid in enumerate(ids):
|
||||
pos[f"{chapter_id}/{qid}"] = [col * 2.0, (row - (len(ids) - 1) / 2) * 1.5]
|
||||
return pos
|
||||
|
||||
|
||||
def build(book):
|
||||
zones = zone_data()
|
||||
events = write_event_advancements(zones)
|
||||
layout = book.get("layout") or {}
|
||||
lang = {"file.0000000000000001.title": book["book"]["title"]}
|
||||
chapters, seen = {}, set()
|
||||
expanded = {c["id"]: chapter_quests(c, book, zones) for c in book["chapters"]}
|
||||
all_quests = {f"{cid}/{q['id']}" for cid, qs in expanded.items() for q in qs}
|
||||
for index, chapter in enumerate(book["chapters"]):
|
||||
cid = chapter["id"]
|
||||
quests = expanded[cid]
|
||||
auto = auto_layout(quests, cid)
|
||||
chapter_id = object_id(f"chapter:{cid}")
|
||||
lang[f"chapter.{chapter_id}.title"] = chapter["title"]
|
||||
if chapter.get("subtitle"):
|
||||
lang[f"chapter.{chapter_id}.chapter_subtitle"] = [chapter["subtitle"]]
|
||||
nbt_quests = []
|
||||
for q in quests:
|
||||
name = f"{cid}/{q['id']}"
|
||||
assert name not in seen, f"quest {name} twice"
|
||||
seen.add(name)
|
||||
qid = object_id(f"quest:{name}")
|
||||
x, y = layout.get(name) or auto[name]
|
||||
deps = []
|
||||
for dep in q.get("after", []):
|
||||
full = dep if "/" in dep else f"{cid}/{dep}"
|
||||
assert full in all_quests, f"{name}: depends on unknown quest {full}"
|
||||
deps.append(object_id(f"quest:{full}"))
|
||||
nbt = {"id": qid, "x": float(x), "y": float(y),
|
||||
"tasks": [task_nbt(t, f"{name}/{i}", events) for i, t in enumerate(q["tasks"])]}
|
||||
if deps:
|
||||
nbt["dependencies"] = deps
|
||||
if q.get("icon"):
|
||||
nbt["icon"] = {"id": q["icon"]}
|
||||
if q.get("size"):
|
||||
nbt["size"] = float(q["size"])
|
||||
nbt_quests.append(nbt)
|
||||
lang[f"quest.{qid}.title"] = q["title"]
|
||||
if q.get("subtitle"):
|
||||
lang[f"quest.{qid}.quest_subtitle"] = q["subtitle"]
|
||||
if q.get("text"):
|
||||
lang[f"quest.{qid}.quest_desc"] = [line.rstrip() for line in q["text"].rstrip("\n").split("\n")]
|
||||
for i, t in enumerate(q["tasks"]):
|
||||
if t.get("title"):
|
||||
lang[f"task.{object_id(f'task:{name}/{i}')}.title"] = t["title"]
|
||||
chapters[cid] = {
|
||||
"id": chapter_id, "filename": cid, "group": "", "order_index": index,
|
||||
"icon": {"id": chapter["icon"]}, "default_quest_shape": "", "default_hide_dependency_lines": False,
|
||||
"quest_links": [], "quests": nbt_quests,
|
||||
}
|
||||
data = {
|
||||
# Adrian, 2026-11-03 / roadmap: flexible progression (tasks count before their dependencies are done) and no
|
||||
# lock icons, so dependencies show as lines but never block. No rewards anywhere.
|
||||
"version": 13, "progression_mode": "flexible", "show_lock_icons": False,
|
||||
"default_reward_team": False, "default_consume_items": False, "default_autoclaim_rewards": "disabled",
|
||||
"default_quest_shape": "circle", "default_quest_disable_jei": False, "emergency_items_cooldown": 300,
|
||||
"drop_loot_crates": False, "disable_gui": False, "grid_scale": 0.5, "pause_game": False, "lock_message": "",
|
||||
"detection_delay": 20, "drop_book_on_death": False, "hide_excluded_quests": False, "fallback_locale": "en_us",
|
||||
"verify_on_load": False, "icon": {"id": book["book"]["icon"]},
|
||||
}
|
||||
return data, chapters, lang
|
||||
|
||||
|
||||
def write(data, chapters, lang, out):
|
||||
if out.exists():
|
||||
shutil.rmtree(out)
|
||||
(out / "chapters").mkdir(parents=True)
|
||||
(out / "lang").mkdir()
|
||||
(out / "data.snbt").write_text(snbt(data) + "\n")
|
||||
(out / "chapter_groups.snbt").write_text(snbt({"chapter_groups": []}) + "\n")
|
||||
for cid, chapter in chapters.items():
|
||||
(out / f"chapters/{cid}.snbt").write_text(snbt(chapter) + "\n")
|
||||
(out / "lang/en_us.snbt").write_text(snbt(lang) + "\n")
|
||||
|
||||
|
||||
# --- Reading positions back from the game ------------------------------------------------------------------------
|
||||
|
||||
def pull(book, folder):
|
||||
"""The book's `layout` updated from an FTB Quests folder: a quest found there is recorded where it stands, unless
|
||||
that's where the generator puts it anyway; quests not found there keep their entry."""
|
||||
zones = zone_data()
|
||||
auto, by_id = {}, {}
|
||||
for c in book["chapters"]:
|
||||
quests = chapter_quests(c, book, zones)
|
||||
auto |= auto_layout(quests, c["id"])
|
||||
by_id |= {object_id(f"quest:{c['id']}/{q['id']}"): f"{c['id']}/{q['id']}" for q in quests}
|
||||
layout = dict(book.get("layout") or {})
|
||||
for path in sorted((folder / "chapters").glob("*.snbt")):
|
||||
for q in parse_snbt(path.read_text()).get("quests", []):
|
||||
name = by_id.get(str(q.get("id", "")).upper())
|
||||
if not name:
|
||||
continue
|
||||
pos = [round(float(q.get("x", 0)), 2), round(float(q.get("y", 0)), 2)]
|
||||
if pos == auto[name]:
|
||||
layout.pop(name, None)
|
||||
else:
|
||||
layout[name] = pos
|
||||
return layout
|
||||
|
||||
|
||||
def write_layout(positions):
|
||||
"""Replaces the `layout:` block at the end of docs/quests.yaml."""
|
||||
text = SOURCE.read_text()
|
||||
head = text[:text.index("\n" + LAYOUT_START) + 1] if "\n" + LAYOUT_START in text else text.rstrip("\n") + "\n\n"
|
||||
lines = [LAYOUT_START] + [f" {name}: [{x}, {y}]" for name, (x, y) in sorted(positions.items())]
|
||||
SOURCE.write_text(head + "\n".join(lines) + "\n")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||
parser.add_argument("--pull", type=Path, metavar="DIR", help="read node positions from an FTB Quests folder first")
|
||||
parser.add_argument("--check", action="store_true", help="fail if the generated files are out of date")
|
||||
args = parser.parse_args()
|
||||
|
||||
book = yaml.safe_load(SOURCE.read_text())
|
||||
if args.pull:
|
||||
layout = pull(book, args.pull)
|
||||
if layout != (book.get("layout") or {}):
|
||||
write_layout(layout)
|
||||
book = yaml.safe_load(SOURCE.read_text())
|
||||
print(f"quest positions from {args.pull} written to {SOURCE.relative_to(ROOT)} ({len(layout)} moved nodes)")
|
||||
else:
|
||||
print(f"no quest moved in {args.pull}")
|
||||
data, chapters, lang = build(book)
|
||||
if args.check:
|
||||
tmp = ROOT / "build/quests-check"
|
||||
write(data, chapters, lang, tmp)
|
||||
stale = [p.relative_to(tmp) for p in tmp.rglob("*.snbt") if not (OUT / p.relative_to(tmp)).exists()
|
||||
or (OUT / p.relative_to(tmp)).read_text() != p.read_text()]
|
||||
stale += [p.relative_to(OUT) for p in OUT.rglob("*.snbt") if not (tmp / p.relative_to(OUT)).exists()]
|
||||
if stale:
|
||||
sys.exit(f"quest files out of date ({', '.join(map(str, stale[:5]))}); run tools/quests.py")
|
||||
print("quest files up to date")
|
||||
return
|
||||
write(data, chapters, lang, OUT)
|
||||
count = sum(len(c["quests"]) for c in chapters.values())
|
||||
print(f"wrote {len(chapters)} chapters, {count} quests to {OUT.relative_to(ROOT)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user