diff --git a/README.md b/README.md index 3f41dd1..771256e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A free NeoForge 1.21.1 modpack on Cobblemon 1.8: one large island with soft-gate - **Core:** Cobblemon 1.8.4, KubeJS, FTB Quests, WorldGen Editor, and the companion mod (`mod/`). - **World:** a Poké Ball-shaped island (world type "Cobblemon Survival Island") with a fixed biome list, no natural ore and no Nether. See [world/README.md](world/README.md). -- **Quality of life:** JEI, Jade, Inventory Profiles Next, Mouse Tweaks, AppleSkin, Controlling, Xaero's Minimap and World Map; Default Options ships conflict-free default keybinds (`pack/config/defaultoptions/keybindings.txt`, check with `tools/check_keybinds.py`). +- **Quality of life:** JEI, Jade, Inventory Profiles Next, Mouse Tweaks, AppleSkin, Controlling, Xaero's Minimap and World Map; Default Options ships default keybinds (R recipes, U uses, J map, § quest book; JEI's R shares with Cobblemon's send-out, one works in screens, the other in the world) (`pack/config/defaultoptions/keybindings.txt`, check with `tools/check_keybinds.py`). - **Rules:** no vanilla mobs (only Pokémon), Nether portals don't form. - **Performance:** Sodium, FerriteCore, ModernFix, ImmediatelyFast, Entity Culling. - **Shaders:** Iris with Complementary Reimagined, installed but off by default (Toggle Shaders key M, or Video Settings > Shader Packs). @@ -29,9 +29,9 @@ tools/ build/export, cross-linking, Prism sync, server smoke test, i ## Requirements -- Java 21 to run Gradle and the server. `tools/` uses Prism's bundled Java 21 when present; Gradle downloads a JDK 21 for compiling if needed. -- [packwiz](https://github.com/packwiz/packwiz): `go install github.com/packwiz/packwiz@latest` -- Python 3.11+ +- Java 21 to run the test server (`tools/` uses Prism's bundled Java 21 when present). The build downloads its own pinned JDK. +- [Go](https://go.dev/dl/) (the build compiles its pinned packwiz; no system packwiz needed) +- Python 3.14 (the build makes its own venv with exact packages) ## Everyday commands @@ -131,7 +131,39 @@ Writes the Sigils' recipes and data and their fights (Phase 9) from `world/summo ```bash python3 tools/jei_sources.py ``` -Writes the data behind the pack's own JEI pages (Phase 8) into the companion mod (`mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json`): every Pokémon's drops and zones, guardians, the End boss, the altar, ore veins, pasture finds. Run it after changing species drops, spawns, guardians, machines, ores or Cobblebase tables, then rebuild; the self-test `drop_sources_match_the_server` fails while it's stale. Needs the Cobblemon jar in `build/server/mods` (any test-server run). +Writes the data behind the pack's own JEI pages (Phase 8) into the data pack (`datapacks/core/data/cobblesurvival/drop_sources/pages.json`), and the server sends it to players: every Pokémon's drops and zones, guardians, the End boss, the altar, ore veins, pasture finds. Run it after changing species drops, spawns, guardians, machines, ores or Cobblebase tables, then rebuild; the self-test `drop_sources_match_the_server` fails while it's stale. Needs the Cobblemon jar in `build/server/mods` (any test-server run). + +## Balancing on a running server + +Balance lives on the server, so playtesters keep the client they have. After changing the pack's data: + +```bash +python3 tools/server_update.py --install /path/to/server +``` + +Or without `--install`, unzip `build/server-update-.zip` into the server's folder. Then `/reload` for the data pack and recipes, `/ftbquests reload` for the quest book; changed mod configs need a restart. `/cobblesurvival data` shows what is live. The JEI drop pages update for players by themselves. + +This covers everything in `datapacks/core` (spawns, drops, machines, bosses, gates, hazards, recipes, `tuning/server.json`), `pack/config`, KubeJS server scripts and the quest book. It's refused when something players run or draw changed (mods, textures, lang, startup scripts, new items or blocks, client code), and names those files; hand out a new pack, then record it with `tools/server_update.py --mark-client-release`. Code that only the server runs can go along with `--with-jar`. Moving ores or reshaping the island needs a new world, not a new client. + +`tools/check_server_update.py` proves on the test server that the data switches over and `/reload` picks up a change. + +## Reproducible builds + +The same commit builds the same bytes, wherever the repo is and whatever the machine has installed: `tools/build.py` compiles with a pinned JDK and runs a pinned packwiz (`tools/build-lock.toml`), with exact Python packages (`tools/requirements.txt`) and Gradle plugins, and every mod is pinned by hash. `build/SHA256SUMS` lists what it produced. + +```bash +python3 tools/check_reproducible.py --fresh-gradle +``` + +Builds the working tree twice from clean copies in different folders, each with an empty Gradle home, and compares every output byte for byte. The island world template isn't covered: Minecraft's chunk generation is the same from one run to the next, the saved region files aren't. + +## Performance + +```bash +python3 tools/perf_test.py +``` + +Boots the island with fake players, full pastures and working machines at three sizes, profiles with spark (in the pack, server only) and writes [docs/performance.md](docs/performance.md). About 20 minutes. ## Adding a mod diff --git a/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/bergmite_hisuibiome.json b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/bergmite_hisuibiome.json new file mode 100644 index 0000000..e644c2f --- /dev/null +++ b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/bergmite_hisuibiome.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["minecraft:jagged_peaks"] +} diff --git a/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/bergmite_kalosbiome.json b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/bergmite_kalosbiome.json new file mode 100644 index 0000000..c8cc3ac --- /dev/null +++ b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/bergmite_kalosbiome.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["minecraft:windswept_hills"] +} diff --git a/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/cubone_alolabiome.json b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/cubone_alolabiome.json new file mode 100644 index 0000000..aea41a0 --- /dev/null +++ b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/cubone_alolabiome.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["minecraft:basalt_deltas"] +} diff --git a/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/dartrix_hisuibiome.json b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/dartrix_hisuibiome.json new file mode 100644 index 0000000..e644c2f --- /dev/null +++ b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/dartrix_hisuibiome.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["minecraft:jagged_peaks"] +} diff --git a/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/quilava_hisuibiome.json b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/quilava_hisuibiome.json new file mode 100644 index 0000000..c8cc3ac --- /dev/null +++ b/datapacks/core/data/cobblemon/tags/worldgen/biome/evolution/regional/quilava_hisuibiome.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["minecraft:windswept_hills"] +} diff --git a/datapacks/core/data/cobblesurvival/bosses/summon_articuno_galarian.json b/datapacks/core/data/cobblesurvival/bosses/summon_articuno_galarian.json new file mode 100644 index 0000000..009e790 --- /dev/null +++ b/datapacks/core/data/cobblesurvival/bosses/summon_articuno_galarian.json @@ -0,0 +1,69 @@ +{ + "_comment": "Generated by tools/zone_bosses.py; do not edit by hand. See docs/design.md (Phase 7) for the format.", + "summon": "articuno_galarian", + "arena": 32, + "patterns": [ + { + "shape": "circle", + "radius": 3.5, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "ice", + "trigger": { + "every_ticks": 112, + "offset": 40 + } + }, + { + "shape": "line", + "length": 14, + "width": 2, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "ice", + "trigger": { + "every_ticks": 160, + "offset": 100 + } + }, + { + "shape": "cone", + "length": 10, + "angle": 70, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "ice", + "trigger": { + "every_ticks": 200, + "offset": 160 + } + }, + { + "shape": "ring", + "inner": 3, + "outer": 9, + "aim": "boss", + "telegraph_ticks": 30, + "damage": 13, + "effect": "ice", + "trigger": { + "below_health": 0.5 + } + }, + { + "shape": "ring", + "inner": 2, + "outer": 12, + "aim": "boss", + "telegraph_ticks": 30, + "damage": 13, + "effect": "ice", + "trigger": { + "below_health": 0.25 + } + } + ] +} diff --git a/datapacks/core/data/cobblesurvival/bosses/summon_moltres_galarian.json b/datapacks/core/data/cobblesurvival/bosses/summon_moltres_galarian.json new file mode 100644 index 0000000..1990f83 --- /dev/null +++ b/datapacks/core/data/cobblesurvival/bosses/summon_moltres_galarian.json @@ -0,0 +1,69 @@ +{ + "_comment": "Generated by tools/zone_bosses.py; do not edit by hand. See docs/design.md (Phase 7) for the format.", + "summon": "moltres_galarian", + "arena": 32, + "patterns": [ + { + "shape": "circle", + "radius": 3.5, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "fire", + "trigger": { + "every_ticks": 112, + "offset": 40 + } + }, + { + "shape": "line", + "length": 14, + "width": 2, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "fire", + "trigger": { + "every_ticks": 160, + "offset": 100 + } + }, + { + "shape": "cone", + "length": 10, + "angle": 70, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "fire", + "trigger": { + "every_ticks": 200, + "offset": 160 + } + }, + { + "shape": "ring", + "inner": 3, + "outer": 9, + "aim": "boss", + "telegraph_ticks": 30, + "damage": 13, + "effect": "fire", + "trigger": { + "below_health": 0.5 + } + }, + { + "shape": "ring", + "inner": 2, + "outer": 12, + "aim": "boss", + "telegraph_ticks": 30, + "damage": 13, + "effect": "fire", + "trigger": { + "below_health": 0.25 + } + } + ] +} diff --git a/datapacks/core/data/cobblesurvival/bosses/summon_zapdos_galarian.json b/datapacks/core/data/cobblesurvival/bosses/summon_zapdos_galarian.json new file mode 100644 index 0000000..a1fb944 --- /dev/null +++ b/datapacks/core/data/cobblesurvival/bosses/summon_zapdos_galarian.json @@ -0,0 +1,69 @@ +{ + "_comment": "Generated by tools/zone_bosses.py; do not edit by hand. See docs/design.md (Phase 7) for the format.", + "summon": "zapdos_galarian", + "arena": 32, + "patterns": [ + { + "shape": "circle", + "radius": 3.5, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "none", + "trigger": { + "every_ticks": 112, + "offset": 40 + } + }, + { + "shape": "line", + "length": 14, + "width": 2, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "none", + "trigger": { + "every_ticks": 160, + "offset": 100 + } + }, + { + "shape": "cone", + "length": 10, + "angle": 70, + "aim": "player", + "telegraph_ticks": 30, + "damage": 13, + "effect": "none", + "trigger": { + "every_ticks": 200, + "offset": 160 + } + }, + { + "shape": "ring", + "inner": 3, + "outer": 9, + "aim": "boss", + "telegraph_ticks": 30, + "damage": 13, + "effect": "none", + "trigger": { + "below_health": 0.5 + } + }, + { + "shape": "ring", + "inner": 2, + "outer": 12, + "aim": "boss", + "telegraph_ticks": 30, + "damage": 13, + "effect": "none", + "trigger": { + "below_health": 0.25 + } + } + ] +} diff --git a/mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json b/datapacks/core/data/cobblesurvival/drop_sources/pages.json similarity index 86% rename from mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json rename to datapacks/core/data/cobblesurvival/drop_sources/pages.json index 217764a..7f76a58 100644 --- a/mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json +++ b/datapacks/core/data/cobblesurvival/drop_sources/pages.json @@ -1,5 +1,5 @@ { - "_comment": "Generated by tools/jei_sources.py from the pack's data; do not edit by hand. Read by the companion mod's JEI plugin (jei/DropSourcesJei.kt); checked against the live server by the self-test drop_sources_match_the_server.", + "_comment": "Generated by tools/jei_sources.py from the pack's data; do not edit by hand. The server sends it to players for the companion mod's JEI pages (jei/DropSources.kt); checked against the live server by the self-test drop_sources_match_the_server.", "zones": { "button_isle": { "name": "Button Isle", @@ -57,13 +57,6 @@ 18 ] }, - "shallows": { - "name": "Shallows", - "levels": [ - 5, - 20 - ] - }, "deep_sea": { "name": "Deep Sea", "levels": [ @@ -71,6 +64,13 @@ 50 ] }, + "shallows": { + "name": "Shallows", + "levels": [ + 5, + 20 + ] + }, "lush_caves": { "name": "Lush Caves", "levels": [ @@ -113,7 +113,8 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:sweet_berries", @@ -122,12 +123,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 26.5 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 25.5 } ], "zones": [ @@ -142,17 +143,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -168,17 +170,17 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:life_orb", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -209,22 +211,23 @@ "drops": [ { "item": "minecraft:iron_nugget", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:iron_sword", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:dusk_stone", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:ability_shield", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [ @@ -239,17 +242,18 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [], @@ -281,17 +285,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -306,12 +311,13 @@ "drops": [ { "item": "minecraft:sugar", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:cake", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -331,18 +337,18 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:deep_sea_scale", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ { - "zone": "shallows", - "levels": "5-20" + "zone": "deep_sea", + "levels": "30-50" } ] }, @@ -351,7 +357,8 @@ "drops": [ { "item": "minecraft:white_wool", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -360,7 +367,7 @@ { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -409,12 +416,13 @@ "drops": [ { "item": "minecraft:red_mushroom", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -435,7 +443,7 @@ { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 10.0 + "chance": 34.4 } ], "zones": [ @@ -451,12 +459,12 @@ { "item": "cobblemon:muscle_band", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -528,12 +536,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -565,12 +573,12 @@ { "item": "cobblemon:big_root", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -586,12 +594,13 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -606,7 +615,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [ @@ -621,7 +631,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 } ], "zones": [], @@ -637,20 +648,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:spider_eye", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [], @@ -683,22 +697,23 @@ "drops": [ { "item": "minecraft:charcoal", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:auspicious_armor", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -714,12 +729,12 @@ { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -734,17 +749,18 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -767,10 +783,11 @@ "chance": 5.0 } ], - "zones": [ + "zones": [], + "line": [ { - "zone": "mire", - "levels": "25-38" + "zone": "deep_sea", + "species": "cobblemon:barraskewda" } ] }, @@ -802,12 +819,12 @@ { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -840,12 +857,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -861,12 +878,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -915,17 +932,17 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -940,17 +957,18 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -966,12 +984,12 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:spell_tag", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -1003,7 +1021,8 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:rindo_berry", @@ -1033,8 +1052,8 @@ ], "zones": [ { - "zone": "mire", - "levels": "26-38" + "zone": "deep_sea", + "levels": "30-50" } ] }, @@ -1068,12 +1087,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:deep_sea_tooth", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -1088,7 +1107,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -1120,16 +1140,18 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:cod", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -1145,17 +1167,17 @@ { "item": "cobblemon:bright_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -1171,17 +1193,17 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -1196,17 +1218,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -1221,7 +1244,8 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:metal_coat", @@ -1242,12 +1266,12 @@ { "item": "minecraft:ochre_froglight", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -1263,12 +1287,12 @@ { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -1284,12 +1308,12 @@ { "item": "cobblemon:big_root", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -1305,12 +1329,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -1342,12 +1366,13 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -1363,7 +1388,8 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:oran_berry", @@ -1400,12 +1426,12 @@ { "item": "minecraft:iron_helmet", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -1421,12 +1447,13 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [], @@ -1442,7 +1469,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -1451,7 +1479,7 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [], @@ -1473,18 +1501,18 @@ { "item": "cobblemon:oval_stone", "count": "1", - "chance": 25.0 + "chance": 18.8 }, { "item": "minecraft:egg", "count": "1", - "chance": 50.0 + "chance": 28.1 } ], "zones": [], "line": [ { - "zone": "southwold", + "zone": "westmarch", "species": "cobblemon:chansey" } ] @@ -1494,7 +1522,8 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:cheri_berry", @@ -1514,22 +1543,23 @@ "drops": [ { "item": "minecraft:raw_copper", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:everstone", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -1545,12 +1575,13 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -1567,12 +1598,12 @@ { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -1587,7 +1618,8 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:beef", @@ -1600,7 +1632,7 @@ { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 22.6 } ], "zones": [ @@ -1616,12 +1648,12 @@ { "item": "cobblemon:grassy_seed", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -1640,12 +1672,13 @@ }, { "item": "minecraft:blaze_powder", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -1660,16 +1693,18 @@ "drops": [ { "item": "minecraft:dead_bush", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:stick", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -1684,11 +1719,13 @@ "drops": [ { "item": "minecraft:dead_bush", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:stick", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:kasib_berry", @@ -1709,7 +1746,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -1718,12 +1756,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [ @@ -1738,12 +1776,13 @@ "drops": [ { "item": "minecraft:brown_mushroom", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -1759,12 +1798,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:throat_spray", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -1779,22 +1818,23 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -1809,22 +1849,23 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -1845,12 +1886,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -1866,17 +1907,17 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -1892,7 +1933,8 @@ "drops": [ { "item": "minecraft:salmon", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:wacan_berry", @@ -1912,7 +1954,8 @@ "drops": [ { "item": "minecraft:melon_seeds", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:miracle_seed", @@ -1936,22 +1979,23 @@ }, { "item": "minecraft:rabbit_hide", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "minecraft:carrot", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -1970,22 +2014,23 @@ }, { "item": "minecraft:rabbit_hide", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "minecraft:carrot", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -2000,7 +2045,8 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:occa_berry", @@ -2021,17 +2067,17 @@ { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -2046,22 +2092,23 @@ "drops": [ { "item": "minecraft:cactus", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:sticky_barb", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -2076,22 +2123,23 @@ "drops": [ { "item": "minecraft:cactus", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:sticky_barb", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -2107,12 +2155,12 @@ { "item": "minecraft:magma_cream", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -2127,7 +2175,8 @@ "drops": [ { "item": "cobblemon:roasted_leek", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:rawst_berry", @@ -2148,17 +2197,17 @@ { "item": "minecraft:diamond", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:float_stone", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -2173,22 +2222,23 @@ "drops": [ { "item": "minecraft:coal", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "minecraft:blaze_rod", "count": "1", - "chance": 10.0 + "chance": 31.7 } ], "zones": [], @@ -2205,17 +2255,17 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:big_root", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -2230,7 +2280,8 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-3" + "count": "1-3", + "chance": 75.0 } ], "zones": [], @@ -2247,12 +2298,12 @@ { "item": "cobblemon:deep_sea_tooth", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -2267,12 +2318,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -2287,7 +2339,8 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:wepear_berry", @@ -2308,12 +2361,12 @@ { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -2328,22 +2381,23 @@ "drops": [ { "item": "minecraft:charcoal", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:malicious_armor", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -2359,12 +2413,13 @@ "drops": [ { "item": "minecraft:bone_block", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -2379,7 +2434,8 @@ "drops": [ { "item": "minecraft:bone_block", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:aspear_berry", @@ -2405,12 +2461,12 @@ { "item": "cobblemon:dusk_stone", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -2431,18 +2487,18 @@ { "item": "cobblemon:oval_stone", "count": "1", - "chance": 10.0 + "chance": 9.0 }, { "item": "minecraft:egg", "count": "1", - "chance": 50.0 + "chance": 40.5 } ], "zones": [ { - "zone": "southwold", - "levels": "17-18" + "zone": "westmarch", + "levels": "17-25" } ] }, @@ -2451,17 +2507,18 @@ "drops": [ { "item": "minecraft:charcoal", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 7.1 } ], "zones": [], @@ -2477,17 +2534,18 @@ "drops": [ { "item": "minecraft:blaze_powder", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 25.0 + "chance": 68.4 }, { "item": "minecraft:nether_star", "count": "1", - "chance": 5.0 + "chance": 15.6 } ], "zones": [ @@ -2502,17 +2560,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:cell_battery", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -2528,7 +2587,8 @@ "drops": [ { "item": "minecraft:blaze_powder", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:charcoal_stick", @@ -2549,12 +2609,13 @@ "drops": [ { "item": "minecraft:blaze_powder", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [], @@ -2570,7 +2631,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -2579,12 +2641,12 @@ { "item": "cobblemon:metronome", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -2604,12 +2666,12 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 21.7 } ], "zones": [ @@ -2629,12 +2691,12 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 2.5 + "chance": 9.4 } ], "zones": [], @@ -2683,7 +2745,8 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:rindo_berry", @@ -2738,17 +2801,17 @@ { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:cleanse_tag", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:soothe_bell", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -2764,17 +2827,18 @@ "drops": [ { "item": "minecraft:prismarine_crystals", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:deep_sea_scale", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -2790,17 +2854,17 @@ { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:soothe_bell", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:cleanse_tag", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -2816,12 +2880,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -2837,7 +2901,8 @@ "drops": [ { "item": "minecraft:rabbit_hide", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:rabbit", @@ -2846,12 +2911,12 @@ { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 25.0 + "chance": 68.4 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 25.0 + "chance": 61.1 } ], "zones": [ @@ -2882,17 +2947,18 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -2908,17 +2974,17 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -2934,17 +3000,17 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -2960,17 +3026,17 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -2990,7 +3056,7 @@ { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 2.5 + "chance": 7.3 } ], "zones": [ @@ -3005,12 +3071,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -3027,17 +3094,17 @@ { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shell_bell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "minecraft:shulker_shell", "count": "1", - "chance": 10.0 + "chance": 24.8 } ], "zones": [ @@ -3052,17 +3119,18 @@ "drops": [ { "item": "minecraft:coal", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -3094,21 +3162,23 @@ "drops": [ { "item": "minecraft:honey_bottle", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:honeycomb", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -3123,7 +3193,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -3132,7 +3203,7 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -3148,12 +3219,12 @@ { "item": "cobblemon:misty_seed", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -3169,12 +3240,12 @@ { "item": "cobblemon:muscle_band", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -3190,17 +3261,18 @@ "drops": [ { "item": "minecraft:raw_copper", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -3216,12 +3288,12 @@ { "item": "cobblemon:luminous_moss", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -3236,7 +3308,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -3245,12 +3318,12 @@ { "item": "cobblemon:metal_coat", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -3265,7 +3338,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -3274,12 +3348,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [], @@ -3300,12 +3374,12 @@ { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -3370,7 +3444,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -3378,12 +3453,13 @@ }, { "item": "minecraft:cod", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -3398,7 +3474,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -3414,12 +3491,12 @@ { "item": "cobblemon:black_sludge", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -3435,17 +3512,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -3492,12 +3569,13 @@ "drops": [ { "item": "minecraft:terracotta", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -3513,12 +3591,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -3533,11 +3611,13 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:cod", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:aspear_berry", @@ -3558,7 +3638,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:nanab_berry", @@ -3578,17 +3659,18 @@ "drops": [ { "item": "minecraft:raw_copper", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -3621,7 +3703,8 @@ "drops": [ { "item": "minecraft:honey_bottle", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:cheri_berry", @@ -3673,12 +3756,13 @@ "drops": [ { "item": "minecraft:bread", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -3699,6 +3783,10 @@ ], "zones": [], "line": [ + { + "zone": "frostpeak", + "species": "cobblemon:darumaka" + }, { "zone": "jungle", "species": "cobblemon:darumaka" @@ -3710,7 +3798,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -3719,7 +3808,7 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -3739,6 +3828,10 @@ } ], "zones": [ + { + "zone": "frostpeak", + "levels": "40-55" + }, { "zone": "jungle", "levels": "18-30" @@ -3750,7 +3843,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -3759,7 +3853,7 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [ @@ -3790,7 +3884,8 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:yache_berry", @@ -3810,7 +3905,8 @@ "drops": [ { "item": "minecraft:dragon_breath", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:roseli_berry", @@ -3832,12 +3928,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -3853,7 +3949,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -3862,7 +3959,7 @@ { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -3881,12 +3978,13 @@ }, { "item": "minecraft:blaze_powder", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [ @@ -3901,17 +3999,18 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -3927,12 +4026,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:shell_bell", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -3948,12 +4047,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -3968,11 +4067,13 @@ "drops": [ { "item": "minecraft:kelp", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [ @@ -3991,22 +4092,23 @@ }, { "item": "minecraft:rabbit_hide", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "minecraft:carrot", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -4022,29 +4124,29 @@ "drops": [ { "item": "minecraft:dirt", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:potato", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:big_root", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], - "zones": [], - "line": [ + "zones": [ { - "zone": "basalt", - "species": "cobblemon:dugtrio" + "zone": "highlands", + "levels": "25-35" } ] }, @@ -4053,7 +4155,8 @@ "drops": [ { "item": "cobblemon:quick_powder", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:metal_powder", @@ -4073,7 +4176,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -4082,12 +4186,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -4102,7 +4206,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -4111,12 +4216,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -4132,12 +4237,12 @@ { "item": "cobblemon:big_root", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -4173,17 +4278,18 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:protector", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -4198,17 +4304,18 @@ "drops": [ { "item": "minecraft:iron_nugget", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:iron_sword", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:dusk_stone", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -4223,12 +4330,13 @@ "drops": [ { "item": "minecraft:kelp", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -4244,12 +4352,12 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -4265,22 +4373,23 @@ "drops": [ { "item": "minecraft:dragon_breath", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -4296,22 +4405,23 @@ "drops": [ { "item": "minecraft:dragon_breath", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [], @@ -4328,12 +4438,12 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -4349,12 +4459,12 @@ { "item": "minecraft:dragon_breath", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -4370,12 +4480,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -4390,22 +4500,23 @@ "drops": [ { "item": "minecraft:dragon_breath", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -4420,12 +4531,13 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -4441,12 +4553,12 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -4463,17 +4575,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:air_balloon", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -4490,22 +4602,22 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 9.4 }, { "item": "cobblemon:air_balloon", "count": "1", - "chance": 2.5 + "chance": 9.2 }, { "item": "minecraft:ghast_tear", "count": "1", - "chance": 5.0 + "chance": 17.3 } ], "zones": [ @@ -4520,17 +4632,18 @@ "drops": [ { "item": "minecraft:dirt", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -4579,12 +4692,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -4618,7 +4731,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -4643,12 +4757,12 @@ { "item": "cobblemon:rocky_helmet", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -4664,22 +4778,23 @@ "drops": [ { "item": "minecraft:dirt", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:potato", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:big_root", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -4695,12 +4810,12 @@ { "item": "cobblemon:rocky_helmet", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -4715,12 +4830,13 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -4735,7 +4851,8 @@ "drops": [ { "item": "minecraft:iron_ingot", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -4750,7 +4867,8 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:occa_berry", @@ -4771,22 +4889,22 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:reaper_cloth", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 }, { "item": "minecraft:ghast_tear", "count": "1", - "chance": 10.0 + "chance": 30.4 } ], "zones": [ @@ -4802,17 +4920,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:reaper_cloth", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -4828,17 +4946,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:reaper_cloth", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -4855,17 +4973,17 @@ { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -4880,7 +4998,8 @@ "drops": [ { "item": "minecraft:terracotta", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:hard_stone", @@ -4900,7 +5019,8 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -4916,7 +5036,8 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-3" + "count": "1-3", + "chance": 75.0 } ], "zones": [], @@ -4933,12 +5054,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:eviolite", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -4953,7 +5074,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -4961,7 +5083,8 @@ }, { "item": "minecraft:cod", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:blue_ice", @@ -5007,7 +5130,7 @@ { "item": "cobblemon:coba_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -5022,17 +5145,18 @@ "drops": [ { "item": "minecraft:redstone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:electirizer", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -5047,17 +5171,18 @@ "drops": [ { "item": "minecraft:redstone", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:electirizer", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -5072,11 +5197,13 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:cheri_berry", @@ -5096,7 +5223,8 @@ "drops": [ { "item": "minecraft:gunpowder", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -5112,17 +5240,18 @@ "drops": [ { "item": "minecraft:redstone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:electirizer", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -5138,17 +5267,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -5168,7 +5298,7 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 25.0 + "chance": 68.4 } ], "zones": [], @@ -5200,7 +5330,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -5209,7 +5340,7 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [ @@ -5225,12 +5356,12 @@ { "item": "minecraft:iron_helmet", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -5266,12 +5397,12 @@ { "item": "cobblemon:sun_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -5303,17 +5434,18 @@ "drops": [ { "item": "minecraft:dirt", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -5328,22 +5460,23 @@ "drops": [ { "item": "minecraft:egg", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:oval_stone", "count": "1", - "chance": 2.5 + "chance": 11.9 }, { "item": "cobblemon:psychic_seed", "count": "1", - "chance": 2.5 + "chance": 11.6 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 2.5 + "chance": 11.4 } ], "zones": [ @@ -5358,22 +5491,23 @@ "drops": [ { "item": "minecraft:egg", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:oval_stone", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "cobblemon:psychic_seed", "count": "1", - "chance": 5.0 + "chance": 21.7 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 20.8 } ], "zones": [ @@ -5389,12 +5523,12 @@ { "item": "cobblemon:throat_spray", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -5411,12 +5545,12 @@ { "item": "minecraft:golden_helmet", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -5431,7 +5565,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -5439,7 +5574,8 @@ }, { "item": "cobblemon:medicinal_leek", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:chilan_berry", @@ -5459,17 +5595,18 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -5484,7 +5621,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -5493,12 +5631,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -5518,12 +5656,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:prism_scale", "count": "1", - "chance": 2.5 + "chance": 4.7 } ], "zones": [], @@ -5539,7 +5677,8 @@ "drops": [ { "item": "minecraft:blaze_powder", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:charcoal_stick", @@ -5575,17 +5714,18 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:sticky_barb", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -5600,17 +5740,18 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:sticky_barb", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -5626,7 +5767,8 @@ "drops": [ { "item": "minecraft:bread", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:nanab_berry", @@ -5646,7 +5788,8 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -5666,17 +5809,17 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 }, { "item": "cobblemon:prism_scale", "count": "1", - "chance": 2.5 + "chance": 6.8 } ], "zones": [ @@ -5700,7 +5843,7 @@ { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -5735,7 +5878,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -5744,12 +5888,12 @@ { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -5785,12 +5929,12 @@ { "item": "cobblemon:fire_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -5806,7 +5950,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -5815,12 +5960,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [ @@ -5835,7 +5980,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -5880,12 +6026,13 @@ "drops": [ { "item": "minecraft:salmon", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -5936,12 +6083,13 @@ "drops": [ { "item": "minecraft:poppy", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [], @@ -5958,12 +6106,12 @@ { "item": "cobblemon:soft_sand", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -5979,12 +6127,12 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -5999,7 +6147,8 @@ "drops": [ { "item": "minecraft:red_mushroom", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:cheri_berry", @@ -6019,17 +6168,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:iron_ball", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -6046,12 +6196,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -6066,7 +6216,8 @@ "drops": [ { "item": "minecraft:glow_ink_sac", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:kasib_berry", @@ -6086,7 +6237,8 @@ "drops": [ { "item": "minecraft:pearlescent_froglight", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mystic_water", @@ -6106,12 +6258,13 @@ "drops": [ { "item": "minecraft:pearlescent_froglight", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -6126,22 +6279,23 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -6156,17 +6310,18 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -6197,7 +6352,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:white_wool", @@ -6206,7 +6362,7 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -6222,12 +6378,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -6243,12 +6399,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -6263,22 +6419,23 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [ @@ -6293,20 +6450,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:spider_eye", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [], @@ -6323,22 +6483,22 @@ { "item": "cobblemon:black_sludge", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:leftovers", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 5.0 + "chance": 17.0 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 16.2 } ], "zones": [], @@ -6355,12 +6515,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -6376,22 +6536,23 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [ @@ -6406,12 +6567,13 @@ "drops": [ { "item": "minecraft:calcite", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -6427,12 +6589,12 @@ { "item": "cobblemon:spell_tag", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -6447,12 +6609,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -6469,12 +6632,12 @@ { "item": "cobblemon:spell_tag", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -6490,28 +6653,33 @@ "drops": [ { "item": "minecraft:gravel", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:everstone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ { "zone": "dripstone", "levels": "22-38" + }, + { + "zone": "westmarch", + "levels": "15-25" } ] }, @@ -6537,12 +6705,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -6557,22 +6725,23 @@ "drops": [ { "item": "minecraft:raw_copper", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:everstone", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [ @@ -6602,17 +6771,18 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -6628,12 +6798,12 @@ { "item": "cobblemon:ice_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -6649,22 +6819,23 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -6696,22 +6867,22 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 2.5 + "chance": 9.4 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 9.2 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 2.5 + "chance": 9.0 } ], "zones": [], @@ -6727,17 +6898,18 @@ "drops": [ { "item": "minecraft:amethyst_shard", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:float_stone", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -6753,17 +6925,18 @@ "drops": [ { "item": "minecraft:amethyst_shard", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:float_stone", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -6779,22 +6952,22 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 17.0 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 16.2 } ], "zones": [ @@ -6809,17 +6982,18 @@ "drops": [ { "item": "minecraft:honey_bottle", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -6839,7 +7013,7 @@ { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -6855,17 +7029,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -6885,17 +7059,17 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 2.5 + "chance": 7.0 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 2.5 + "chance": 6.8 } ], "zones": [ @@ -6910,7 +7084,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -6919,7 +7094,7 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -6934,22 +7109,23 @@ "drops": [ { "item": "minecraft:gravel", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:everstone", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [ @@ -6964,17 +7140,18 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -7006,17 +7183,18 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -7032,17 +7210,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [], @@ -7058,17 +7237,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -7116,17 +7296,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -7142,17 +7323,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -7167,17 +7349,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -7193,17 +7376,18 @@ "drops": [ { "item": "minecraft:pumpkin_seeds", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -7235,12 +7419,13 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -7260,7 +7445,7 @@ { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [], @@ -7276,22 +7461,23 @@ "drops": [ { "item": "minecraft:gravel", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:everstone", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -7310,17 +7496,18 @@ }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:candle", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 7.1 } ], "zones": [], @@ -7336,7 +7523,8 @@ "drops": [ { "item": "cobblemon:oran_berry", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [ @@ -7351,12 +7539,13 @@ "drops": [ { "item": "minecraft:pearlescent_froglight", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [ @@ -7371,17 +7560,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:black_sludge", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:toxic_orb", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -7412,7 +7602,8 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:miracle_seed", @@ -7437,7 +7628,7 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 10.0 + "chance": 34.4 } ], "zones": [ @@ -7452,12 +7643,13 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -7472,7 +7664,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:rawst_berry", @@ -7480,11 +7673,10 @@ "chance": 2.5 } ], - "zones": [], - "line": [ + "zones": [ { - "zone": "basalt", - "species": "cobblemon:arcanine" + "zone": "sunscorch", + "levels": "30-45" } ] }, @@ -7493,17 +7685,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:cell_battery", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -7522,12 +7715,13 @@ }, { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [ @@ -7560,12 +7754,12 @@ { "item": "cobblemon:muscle_band", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -7586,12 +7780,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 8.8 } ], "zones": [ @@ -7606,17 +7800,18 @@ "drops": [ { "item": "cobblemon:dragon_scale", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -7638,8 +7833,8 @@ ], "zones": [ { - "zone": "southwold", - "levels": "8-18" + "zone": "westmarch", + "levels": "15-25" } ] }, @@ -7649,17 +7844,17 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:kings_rock", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -7724,12 +7919,12 @@ { "item": "cobblemon:spell_tag", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -7746,17 +7941,17 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -7772,12 +7967,12 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -7793,17 +7988,17 @@ { "item": "cobblemon:flame_orb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -7834,7 +8029,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:blue_wool", @@ -7843,7 +8039,7 @@ { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -7858,17 +8054,18 @@ "drops": [ { "item": "minecraft:sand", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -7883,17 +8080,18 @@ "drops": [ { "item": "minecraft:sand", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -7909,12 +8107,12 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -7930,12 +8128,12 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -7951,12 +8149,12 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -7971,7 +8169,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -7980,7 +8179,7 @@ { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -7995,17 +8194,18 @@ "drops": [ { "item": "minecraft:iron_nugget", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:iron_sword", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:dusk_stone", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -8039,7 +8239,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -8048,12 +8249,12 @@ { "item": "cobblemon:wise_glasses", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -8084,11 +8285,13 @@ "drops": [ { "item": "minecraft:ink_sac", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:prismarine_shard", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:dragon_scale", @@ -8108,21 +8311,23 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 } ], "zones": [ @@ -8137,21 +8342,23 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -8171,12 +8378,13 @@ }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [ @@ -8207,12 +8415,13 @@ "drops": [ { "item": "minecraft:dragon_breath", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [], @@ -8245,17 +8454,17 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:air_balloon", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -8272,12 +8481,12 @@ { "item": "cobblemon:bright_powder", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -8310,12 +8519,12 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 25.0 + "chance": 35.5 } ], "zones": [], @@ -8332,12 +8541,12 @@ { "item": "cobblemon:room_service", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -8368,7 +8577,8 @@ "drops": [ { "item": "minecraft:ink_sac", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:tanga_berry", @@ -8376,10 +8586,15 @@ "chance": 2.5 } ], - "zones": [ + "zones": [], + "line": [ { - "zone": "shallows", - "levels": "5-20" + "zone": "deep_sea", + "species": "cobblemon:malamar" + }, + { + "zone": "the_end", + "species": "cobblemon:malamar" } ] }, @@ -8404,12 +8619,13 @@ "drops": [ { "item": "minecraft:melon_seeds", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -8424,17 +8640,18 @@ "drops": [ { "item": "cobblemon:dragon_scale", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:razor_claw", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -8449,12 +8666,13 @@ "drops": [ { "item": "minecraft:glow_ink_sac", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -8470,17 +8688,17 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:air_balloon", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -8496,12 +8714,12 @@ { "item": "cobblemon:thunder_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:magnet", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -8517,15 +8735,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:spider_eye", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:nanab_berry", @@ -8550,7 +8771,7 @@ { "item": "cobblemon:yache_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -8582,12 +8803,12 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -8603,12 +8824,12 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "minecraft:bone_meal", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -8624,17 +8845,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -8649,12 +8871,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -8717,7 +8940,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -8726,12 +8950,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [ @@ -8747,12 +8971,12 @@ { "item": "cobblemon:rocky_helmet", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -8768,16 +8992,18 @@ "drops": [ { "item": "minecraft:ink_sac", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:prismarine_shard", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 10.0 + "chance": 41.0 } ], "zones": [ @@ -8793,12 +9019,12 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -8814,22 +9040,23 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -8845,7 +9072,8 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -8877,12 +9105,13 @@ "drops": [ { "item": "minecraft:stone_axe", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -8914,7 +9143,8 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [], @@ -8930,7 +9160,8 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-3" + "count": "1-3", + "chance": 75.0 } ], "zones": [ @@ -8946,12 +9177,12 @@ { "item": "cobblemon:black_sludge", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:smoke_ball", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -8986,17 +9217,18 @@ "drops": [ { "item": "cobblemon:dragon_scale", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:razor_claw", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 2.5 + "chance": 8.8 } ], "zones": [], @@ -9013,12 +9245,12 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -9034,12 +9266,12 @@ { "item": "cobblemon:metronome", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -9055,12 +9287,12 @@ { "item": "cobblemon:metronome", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9076,12 +9308,12 @@ { "item": "cobblemon:black_glasses", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9097,12 +9329,12 @@ { "item": "cobblemon:black_glasses", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -9117,17 +9349,18 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -9147,12 +9380,12 @@ { "item": "cobblemon:dusk_stone", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9167,17 +9400,18 @@ "drops": [ { "item": "minecraft:prismarine_crystals", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:deep_sea_scale", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -9194,22 +9428,22 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "minecraft:heart_of_the_sea", "count": "1", - "chance": 5.0 + "chance": 17.0 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 16.2 } ], "zones": [ @@ -9224,22 +9458,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:silver_powder", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -9255,12 +9490,12 @@ { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -9305,12 +9540,12 @@ { "item": "cobblemon:leaf_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -9326,22 +9561,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:revival_herb", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [], @@ -9362,7 +9598,7 @@ { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -9410,17 +9646,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -9435,17 +9672,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -9460,12 +9698,13 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -9497,17 +9736,17 @@ { "item": "cobblemon:revival_herb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -9522,7 +9761,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:blue_wool", @@ -9563,17 +9803,18 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -9589,12 +9830,12 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9609,17 +9850,18 @@ "drops": [ { "item": "minecraft:candle", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:dusk_stone", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -9651,17 +9893,18 @@ "drops": [ { "item": "minecraft:lily_pad", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -9680,22 +9923,23 @@ }, { "item": "minecraft:rabbit_hide", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "minecraft:carrot", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -9711,17 +9955,18 @@ "drops": [ { "item": "minecraft:lily_pad", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -9737,12 +9982,12 @@ { "item": "cobblemon:throat_spray", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -9759,12 +10004,12 @@ { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9779,17 +10024,18 @@ "drops": [ { "item": "minecraft:lily_pad", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [], @@ -9824,17 +10070,17 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 }, { "item": "cobblemon:prism_scale", "count": "1", - "chance": 5.0 + "chance": 12.4 } ], "zones": [], @@ -9851,12 +10097,12 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9872,12 +10118,12 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -9910,12 +10156,12 @@ { "item": "cobblemon:quick_claw", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -9931,12 +10177,12 @@ { "item": "cobblemon:quick_claw", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -9951,21 +10197,23 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 } ], "zones": [ @@ -9980,16 +10228,18 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -10005,17 +10255,17 @@ { "item": "cobblemon:focus_band", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:muscle_band", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -10031,17 +10281,17 @@ { "item": "cobblemon:focus_band", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:muscle_band", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -10057,17 +10307,17 @@ { "item": "cobblemon:focus_band", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:muscle_band", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -10084,17 +10334,17 @@ { "item": "minecraft:blaze_powder", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:magmarizer", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -10110,7 +10360,8 @@ "drops": [ { "item": "minecraft:magma_cream", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:basalt", @@ -10119,7 +10370,7 @@ { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -10139,12 +10390,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 2.5 + "chance": 4.7 } ], "zones": [ @@ -10160,17 +10411,17 @@ { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:magmarizer", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -10187,17 +10438,17 @@ { "item": "minecraft:blaze_powder", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:magmarizer", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -10212,22 +10463,23 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:magnet", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -10242,22 +10494,23 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:magnet", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -10273,22 +10526,23 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:magnet", "count": "1", - "chance": 10.0 + "chance": 41.0 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 10.0 + "chance": 38.3 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 10.0 + "chance": 35.7 } ], "zones": [], @@ -10305,17 +10559,17 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:kings_rock", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -10331,15 +10585,20 @@ "drops": [ { "item": "minecraft:ink_sac", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ + { + "zone": "deep_sea", + "levels": "30-50" + }, { "zone": "the_end", "levels": "50-70" @@ -10360,12 +10619,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 10.0 + "chance": 46.9 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 10.0 + "chance": 44.1 } ], "zones": [ @@ -10380,16 +10639,18 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -10405,12 +10666,12 @@ { "item": "cobblemon:muscle_band", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -10426,12 +10687,13 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -10446,7 +10708,8 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:wacan_berry", @@ -10466,22 +10729,23 @@ "drops": [ { "item": "minecraft:cactus", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:grassy_seed", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:sticky_barb", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -10496,17 +10760,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -10530,7 +10795,7 @@ { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 2.5 + "chance": 7.3 } ], "zones": [ @@ -10581,12 +10846,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -10601,11 +10867,13 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:tanga_berry", @@ -10627,12 +10895,12 @@ { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -10647,12 +10915,13 @@ "drops": [ { "item": "minecraft:wheat_seeds", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -10668,17 +10937,17 @@ { "item": "cobblemon:razor_fang", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:iron_ball", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -10694,17 +10963,17 @@ { "item": "cobblemon:wise_glasses", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -10721,17 +10990,17 @@ { "item": "cobblemon:wise_glasses", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:black_belt", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:nanab_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -10794,23 +11063,24 @@ "drops": [ { "item": "minecraft:gold_nugget", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ { - "zone": "button_isle", - "levels": "4-10" + "zone": "southwold", + "levels": "8-18" } ] }, @@ -10819,12 +11089,13 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -10839,12 +11110,13 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -10859,12 +11131,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -10894,12 +11167,12 @@ { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -10916,12 +11189,12 @@ { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -10936,16 +11209,18 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -10960,7 +11235,8 @@ "drops": [ { "item": "minecraft:sugar", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -10976,12 +11252,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:prism_scale", "count": "1", - "chance": 5.0 + "chance": 8.8 } ], "zones": [ @@ -10996,7 +11272,8 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:beef", @@ -11005,7 +11282,7 @@ { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [ @@ -11021,12 +11298,12 @@ { "item": "cobblemon:light_clay", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -11043,12 +11320,12 @@ { "item": "cobblemon:spell_tag", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -11064,12 +11341,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -11101,17 +11378,17 @@ { "item": "cobblemon:magnet", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:cell_battery", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -11127,17 +11404,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:spell_tag", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -11153,17 +11430,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:spell_tag", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -11217,22 +11494,23 @@ "drops": [ { "item": "minecraft:brown_mushroom", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:luminous_moss", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:bright_powder", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -11281,12 +11559,12 @@ { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -11303,12 +11581,12 @@ { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -11339,21 +11617,23 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -11368,7 +11648,8 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mystic_water", @@ -11388,21 +11669,23 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 } ], "zones": [ @@ -11417,17 +11700,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:black_sludge", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:toxic_orb", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -11443,17 +11727,18 @@ "drops": [ { "item": "minecraft:apple", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:leftovers", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 2.5 + "chance": 9.4 } ], "zones": [ @@ -11484,7 +11769,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -11525,7 +11811,8 @@ "drops": [ { "item": "minecraft:calcite", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:passho_berry", @@ -11546,12 +11833,13 @@ "drops": [ { "item": "minecraft:calcite", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -11580,7 +11868,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -11589,12 +11878,12 @@ { "item": "cobblemon:wise_glasses", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -11614,12 +11903,12 @@ { "item": "minecraft:emerald", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 2.5 + "chance": 9.4 } ], "zones": [ @@ -11635,12 +11924,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -11657,12 +11946,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -11679,12 +11968,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -11700,12 +11989,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -11721,12 +12010,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -11742,12 +12031,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -11783,12 +12072,12 @@ { "item": "minecraft:charcoal", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 21.7 } ], "zones": [ @@ -11820,7 +12109,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -11829,12 +12119,12 @@ { "item": "cobblemon:wise_glasses", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -11851,18 +12141,18 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ { - "zone": "southwold", - "levels": "8-18" + "zone": "westmarch", + "levels": "15-25" } ] }, @@ -11872,18 +12162,18 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], "line": [ { - "zone": "southwold", + "zone": "westmarch", "species": "cobblemon:noibat" } ] @@ -11893,22 +12183,23 @@ "drops": [ { "item": "minecraft:flint", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:magnet", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -11925,12 +12216,12 @@ { "item": "minecraft:magma_cream", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -11945,12 +12236,13 @@ "drops": [ { "item": "minecraft:dark_oak_sapling", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -12004,7 +12296,7 @@ { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -12020,12 +12312,12 @@ { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -12045,7 +12337,7 @@ { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -12106,17 +12398,17 @@ { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 11.9 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 2.5 + "chance": 11.6 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 11.4 } ], "zones": [], @@ -12132,12 +12424,13 @@ "drops": [ { "item": "minecraft:iron_nugget", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -12153,12 +12446,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:shell_bell", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -12177,12 +12470,13 @@ }, { "item": "minecraft:prismarine_shard", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -12214,7 +12508,8 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -12230,17 +12525,18 @@ "drops": [ { "item": "minecraft:sand", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -12256,12 +12552,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -12276,17 +12573,18 @@ "drops": [ { "item": "minecraft:bamboo", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -12301,17 +12599,18 @@ "drops": [ { "item": "minecraft:bamboo", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -12328,17 +12627,17 @@ { "item": "cobblemon:water_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -12354,17 +12653,17 @@ { "item": "cobblemon:leaf_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -12380,17 +12679,17 @@ { "item": "cobblemon:fire_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -12405,12 +12704,13 @@ "drops": [ { "item": "minecraft:red_mushroom", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -12462,12 +12762,12 @@ { "item": "minecraft:iron_helmet", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -12482,7 +12782,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -12491,7 +12792,7 @@ { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -12508,18 +12809,18 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], "line": [ { - "zone": "button_isle", + "zone": "southwold", "species": "cobblemon:meowth" } ] @@ -12529,23 +12830,24 @@ "drops": [ { "item": "minecraft:gold_nugget", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], "line": [ { - "zone": "button_isle", + "zone": "southwold", "species": "cobblemon:meowth" } ] @@ -12556,17 +12858,17 @@ { "item": "cobblemon:revival_herb", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -12581,7 +12883,8 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:passho_berry", @@ -12601,17 +12904,18 @@ "drops": [ { "item": "minecraft:jack_o_lantern", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:spell_tag", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -12627,17 +12931,17 @@ { "item": "cobblemon:light_ball", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:thunder_stone", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -12652,7 +12956,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -12661,12 +12966,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 10.0 + "chance": 33.0 } ], "zones": [], @@ -12682,7 +12987,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -12691,12 +12997,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [ @@ -12711,7 +13017,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -12735,7 +13042,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -12764,7 +13072,7 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -12780,17 +13088,17 @@ { "item": "cobblemon:light_ball", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:thunder_stone", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -12805,7 +13113,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -12833,12 +13142,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 } ], "zones": [ @@ -12853,17 +13162,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:iron_ball", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -12894,7 +13204,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -12919,17 +13230,17 @@ { "item": "cobblemon:magnet", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:cell_battery", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -12963,12 +13274,12 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -12984,12 +13295,12 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -13005,12 +13316,12 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -13026,12 +13337,12 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -13078,17 +13389,18 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -13103,11 +13415,13 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:pecha_berry", @@ -13129,12 +13443,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:throat_spray", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -13184,12 +13498,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:throat_spray", "count": "1", - "chance": 25.0 + "chance": 35.5 } ], "zones": [ @@ -13205,12 +13519,12 @@ { "item": "cobblemon:muscle_band", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -13225,7 +13539,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -13234,7 +13549,7 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -13249,22 +13564,23 @@ "drops": [ { "item": "minecraft:flint", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "cobblemon:magnet", "count": "1", - "chance": 5.0 + "chance": 21.7 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 20.8 } ], "zones": [ @@ -13279,7 +13595,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -13303,17 +13620,18 @@ "drops": [ { "item": "minecraft:pumpkin_seeds", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -13329,12 +13647,12 @@ { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -13349,7 +13667,8 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:bluk_berry", @@ -13387,17 +13706,18 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -13412,7 +13732,8 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [ @@ -13427,12 +13748,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -13533,7 +13855,8 @@ }, { "item": "minecraft:prismarine_shard", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:poison_barb", @@ -13553,7 +13876,8 @@ "drops": [ { "item": "minecraft:rabbit_hide", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:rabbit", @@ -13562,12 +13886,12 @@ { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 24.9 } ], "zones": [ @@ -13598,17 +13922,17 @@ { "item": "cobblemon:light_ball", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:thunder_stone", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [], @@ -13624,22 +13948,23 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:twisted_spoon", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:kasib_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -13655,7 +13980,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -13671,17 +13997,18 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -13697,12 +14024,13 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -13718,7 +14046,8 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:chilan_berry", @@ -13795,12 +14124,12 @@ { "item": "cobblemon:deep_sea_scale", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -13836,12 +14165,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.7 } ], "zones": [ @@ -13856,12 +14185,13 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -13876,17 +14206,18 @@ "drops": [ { "item": "minecraft:iron_nugget", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:black_sludge", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -13902,12 +14233,12 @@ { "item": "cobblemon:protector", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -13923,12 +14254,12 @@ { "item": "cobblemon:protector", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -13945,12 +14276,12 @@ { "item": "cobblemon:protector", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -13965,12 +14296,13 @@ "drops": [ { "item": "minecraft:honey_bottle", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -13990,7 +14322,7 @@ { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 25.0 + "chance": 43.8 } ], "zones": [], @@ -14007,12 +14339,12 @@ { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -14028,21 +14360,23 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -14058,22 +14392,23 @@ "drops": [ { "item": "minecraft:raw_copper", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:hard_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:everstone", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -14089,17 +14424,18 @@ "drops": [ { "item": "minecraft:coal", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:black_augurite", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -14115,7 +14451,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -14140,22 +14477,23 @@ "drops": [ { "item": "minecraft:rose_bush", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -14175,17 +14513,17 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 10.0 + "chance": 31.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 10.0 + "chance": 29.5 } ], "zones": [ @@ -14200,7 +14538,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -14225,7 +14564,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -14267,27 +14607,28 @@ "drops": [ { "item": "minecraft:amethyst_shard", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:wide_lens", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "minecraft:diamond", "count": "1", - "chance": 5.0 + "chance": 21.7 }, { "item": "minecraft:emerald", "count": "1", - "chance": 5.0 + "chance": 20.8 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 19.9 } ], "zones": [ @@ -14303,17 +14644,17 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [], @@ -14329,17 +14670,18 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:smoke_ball", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -14354,17 +14696,18 @@ "drops": [ { "item": "minecraft:rotten_flesh", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:smoke_ball", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -14381,12 +14724,12 @@ { "item": "cobblemon:mystic_water", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:shell_bell", "count": "1", - "chance": 25.0 + "chance": 35.5 } ], "zones": [ @@ -14418,12 +14761,12 @@ { "item": "cobblemon:black_glasses", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -14439,25 +14782,30 @@ "drops": [ { "item": "minecraft:armadillo_scute", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:grip_claw", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ + { + "zone": "frostpeak", + "levels": "40-55" + }, { "zone": "sunscorch", "levels": "30-45" @@ -14469,22 +14817,23 @@ "drops": [ { "item": "minecraft:armadillo_scute", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:grip_claw", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -14499,17 +14848,18 @@ "drops": [ { "item": "minecraft:sand", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:soft_sand", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -14525,17 +14875,17 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -14550,12 +14900,13 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -14571,17 +14922,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:bright_powder", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -14596,12 +14948,13 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [], @@ -14635,12 +14988,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -14656,7 +15009,8 @@ "drops": [ { "item": "minecraft:rabbit_hide", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rabbit", @@ -14665,12 +15019,12 @@ { "item": "minecraft:rabbit_foot", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -14685,12 +15039,13 @@ "drops": [ { "item": "cobblemon:roasted_leek", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -14706,17 +15061,17 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -14732,17 +15087,17 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -14773,16 +15128,18 @@ "drops": [ { "item": "minecraft:ink_sac", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:prismarine_shard", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -14802,17 +15159,17 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 13.0 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 12.4 } ], "zones": [], @@ -14828,12 +15185,13 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -14848,7 +15206,8 @@ "drops": [ { "item": "minecraft:dark_oak_sapling", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:tanga_berry", @@ -14868,17 +15227,18 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -14893,12 +15253,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -14914,12 +15275,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -14968,22 +15329,22 @@ { "item": "cobblemon:razor_fang", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 17.0 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 16.2 } ], "zones": [ @@ -14998,22 +15359,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:revival_herb", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ @@ -15029,12 +15391,12 @@ { "item": "cobblemon:deep_sea_tooth", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -15068,17 +15430,17 @@ { "item": "cobblemon:dragon_fang", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:dragon_scale", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -15094,12 +15456,12 @@ { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:shell_bell", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -15114,7 +15476,8 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:rindo_berry", @@ -15150,7 +15513,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -15165,12 +15529,13 @@ "drops": [ { "item": "minecraft:dark_oak_sapling", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [], @@ -15186,22 +15551,23 @@ "drops": [ { "item": "minecraft:brown_mushroom", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:luminous_moss", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:bright_powder", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -15217,12 +15583,12 @@ { "item": "cobblemon:quick_claw", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -15254,7 +15620,8 @@ "drops": [ { "item": "minecraft:brown_mushroom", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:kebia_berry", @@ -15279,12 +15646,12 @@ { "item": "cobblemon:luminous_moss", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "minecraft:shulker_shell", "count": "1", - "chance": 10.0 + "chance": 18.1 } ], "zones": [ @@ -15300,12 +15667,12 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:spell_tag", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -15320,17 +15687,18 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -15349,12 +15717,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -15386,17 +15755,17 @@ { "item": "cobblemon:water_stone", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -15412,17 +15781,17 @@ { "item": "cobblemon:leaf_stone", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -15438,17 +15807,17 @@ { "item": "cobblemon:fire_stone", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -15495,7 +15864,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -15508,7 +15878,7 @@ { "item": "cobblemon:coba_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -15525,12 +15895,12 @@ { "item": "minecraft:blaze_powder", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -15547,17 +15917,17 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -15593,7 +15963,7 @@ { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [], @@ -15630,12 +16000,12 @@ { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -15651,12 +16021,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:bluk_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -15671,7 +16041,8 @@ "drops": [ { "item": "minecraft:kelp", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:pecha_berry", @@ -15708,7 +16079,8 @@ "drops": [ { "item": "cobblemon:oran_berry", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -15756,17 +16128,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -15783,21 +16156,25 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], "line": [ + { + "zone": "jungle", + "species": "cobblemon:slowpoke" + }, { "zone": "mire", "species": "cobblemon:slowpoke" @@ -15810,21 +16187,25 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [], "line": [ + { + "zone": "jungle", + "species": "cobblemon:slowpoke" + }, { "zone": "mire", "species": "cobblemon:slowpoke" @@ -15837,20 +16218,24 @@ { "item": "cobblemon:kings_rock", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [ + { + "zone": "jungle", + "levels": "18-30" + }, { "zone": "mire", "levels": "25-38" @@ -15862,7 +16247,8 @@ "drops": [ { "item": "minecraft:magma_cream", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:passho_berry", @@ -15883,17 +16269,18 @@ "drops": [ { "item": "minecraft:sugar", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:cake", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -15909,12 +16296,12 @@ { "item": "cobblemon:big_root", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -15947,22 +16334,22 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:grip_claw", "count": "1", - "chance": 2.5 + "chance": 9.4 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 2.5 + "chance": 9.2 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 2.5 + "chance": 9.0 } ], "zones": [ @@ -15978,17 +16365,17 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -16019,17 +16406,18 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:silver_powder", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -16045,21 +16433,18 @@ "drops": [ { "item": "minecraft:apple", - "count": "0-3" - }, - { - "item": "minecraft:apple", - "count": "0-3" + "count": "1-3", + "chance": 93.8 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 26.5 }, { "item": "cobblemon:leftovers", "count": "1", - "chance": 5.0 + "chance": 25.5 } ], "zones": [], @@ -16075,22 +16460,23 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:dawn_stone", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -16106,7 +16492,8 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:sweet_berries", @@ -16115,12 +16502,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 2.5 + "chance": 9.4 } ], "zones": [], @@ -16136,7 +16523,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:babiri_berry", @@ -16172,7 +16560,8 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:persim_berry", @@ -16193,12 +16582,12 @@ { "item": "cobblemon:sun_stone", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -16213,7 +16602,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -16222,12 +16612,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -16243,17 +16633,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:bright_powder", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 2.5 + "chance": 7.1 } ], "zones": [ @@ -16268,7 +16659,8 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:chesto_berry", @@ -16289,11 +16681,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:spider_eye", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [], @@ -16309,15 +16703,18 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:spider_eye", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:rotten_flesh", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:poison_barb", @@ -16337,12 +16734,13 @@ "drops": [ { "item": "minecraft:bamboo", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -16358,12 +16756,12 @@ { "item": "cobblemon:spell_tag", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:smoke_ball", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -16382,12 +16780,13 @@ }, { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:tanga_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [], @@ -16421,12 +16820,12 @@ { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -16442,7 +16841,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -16451,7 +16851,7 @@ { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -16466,7 +16866,8 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:mystic_water", @@ -16486,7 +16887,8 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:persim_berry", @@ -16506,7 +16908,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -16515,12 +16918,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 10.0 + "chance": 33.0 } ], "zones": [ @@ -16535,7 +16938,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -16544,12 +16948,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [], @@ -16565,7 +16969,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -16595,17 +17000,17 @@ { "item": "cobblemon:lagging_tail", "count": "1", - "chance": 5.0 + "chance": 26.5 }, { "item": "cobblemon:metal_coat", "count": "1", - "chance": 5.0 + "chance": 25.5 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 24.5 } ], "zones": [ @@ -16621,12 +17026,12 @@ { "item": "cobblemon:grassy_seed", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -16646,7 +17051,7 @@ { "item": "cobblemon:luminous_moss", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -16661,7 +17066,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:blue_wool", @@ -16670,7 +17076,7 @@ { "item": "cobblemon:chilan_berry", "count": "1", - "chance": 10.0 + "chance": 41.0 } ], "zones": [], @@ -16702,18 +17108,23 @@ "drops": [ { "item": "minecraft:mud", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ { "zone": "jungle", "levels": "22-30" + }, + { + "zone": "mire", + "levels": "25-38" } ] }, @@ -16739,12 +17150,12 @@ { "item": "cobblemon:hard_stone", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:passho_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -16801,7 +17212,8 @@ "drops": [ { "item": "minecraft:honey_bottle", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:wacan_berry", @@ -16821,7 +17233,8 @@ "drops": [ { "item": "minecraft:white_wool", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -16845,22 +17258,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mental_herb", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:revival_herb", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:coba_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [ @@ -16875,12 +17289,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [ @@ -16895,7 +17310,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -16904,12 +17320,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:wacan_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [ @@ -16924,7 +17340,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -16933,12 +17350,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [], @@ -16963,12 +17380,12 @@ { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -16984,17 +17401,18 @@ "drops": [ { "item": "minecraft:sugar", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:cake", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:babiri_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -17014,7 +17432,7 @@ { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -17030,12 +17448,12 @@ { "item": "cobblemon:shiny_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -17052,12 +17470,12 @@ { "item": "minecraft:ochre_froglight", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -17072,7 +17490,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -17096,7 +17515,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -17105,12 +17525,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 10.0 + "chance": 33.0 } ], "zones": [ @@ -17125,7 +17545,8 @@ "drops": [ { "item": "minecraft:wheat_seeds", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:chilan_berry", @@ -17145,7 +17566,8 @@ "drops": [ { "item": "minecraft:vine", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:big_root", @@ -17165,12 +17587,13 @@ "drops": [ { "item": "minecraft:vine", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:big_root", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -17185,11 +17608,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:spider_eye", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -17209,12 +17634,12 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -17229,7 +17654,8 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:beef", @@ -17240,6 +17666,14 @@ { "zone": "highlands", "levels": "25-35" + }, + { + "zone": "mire", + "levels": "25-38" + }, + { + "zone": "sunscorch", + "levels": "30-45" } ] }, @@ -17253,17 +17687,17 @@ { "item": "minecraft:honey_bottle", "count": "1", - "chance": 2.5 + "chance": 11.9 }, { "item": "cobblemon:peat_block", "count": "1", - "chance": 2.5 + "chance": 11.6 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 2.5 + "chance": 11.4 } ], "zones": [ @@ -17283,12 +17717,12 @@ { "item": "minecraft:glow_ink_sac", "count": "1-3", - "chance": 10.0 + "chance": 46.9 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 13.1 } ], "zones": [ @@ -17308,12 +17742,12 @@ { "item": "minecraft:glow_ink_sac", "count": "2-4", - "chance": 10.0 + "chance": 57.0 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 31.7 } ], "zones": [], @@ -17334,7 +17768,7 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -17354,12 +17788,12 @@ { "item": "minecraft:emerald", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 21.7 } ], "zones": [ @@ -17375,17 +17809,17 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -17400,12 +17834,13 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -17421,12 +17856,12 @@ { "item": "cobblemon:muscle_band", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -17441,7 +17876,8 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:razz_berry", @@ -17461,12 +17897,13 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [], @@ -17482,12 +17919,13 @@ "drops": [ { "item": "minecraft:raw_iron", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -17502,7 +17940,8 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [ @@ -17517,7 +17956,8 @@ "drops": [ { "item": "minecraft:brown_mushroom", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:yache_berry", @@ -17537,12 +17977,13 @@ "drops": [ { "item": "minecraft:brown_mushroom", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -17558,12 +17999,12 @@ { "item": "cobblemon:electric_seed", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -17579,17 +18020,17 @@ { "item": "cobblemon:lucky_egg", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:shiny_stone", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -17605,17 +18046,17 @@ { "item": "cobblemon:lucky_egg", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:shiny_stone", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -17632,17 +18073,17 @@ { "item": "cobblemon:lucky_egg", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shiny_stone", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:fairy_feather", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -17657,7 +18098,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -17681,27 +18123,28 @@ "drops": [ { "item": "minecraft:coal", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 5.0 + "chance": 22.6 }, { "item": "cobblemon:smoke_ball", "count": "1", - "chance": 5.0 + "chance": 21.7 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 20.8 }, { "item": "minecraft:blaze_rod", "count": "1-2", - "chance": 25.0 + "chance": 70.8 } ], "zones": [ @@ -17717,12 +18160,12 @@ { "item": "cobblemon:charcoal_stick", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:expert_belt", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -17737,12 +18180,13 @@ "drops": [ { "item": "minecraft:apple", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [ @@ -17773,7 +18217,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -17782,7 +18227,7 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -17797,17 +18242,18 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [], @@ -17840,12 +18286,12 @@ { "item": "cobblemon:black_sludge", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -17877,7 +18323,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -17886,12 +18333,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 13.9 } ], "zones": [], @@ -17908,12 +18355,12 @@ { "item": "cobblemon:soft_sand", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -17929,7 +18376,8 @@ "drops": [ { "item": "minecraft:stick", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:miracle_seed", @@ -17954,12 +18402,12 @@ { "item": "cobblemon:spell_tag", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -17975,7 +18423,8 @@ "drops": [ { "item": "cobblemon:nanab_berry", - "count": "0-2" + "count": "1-2", + "chance": 66.7 } ], "zones": [ @@ -17991,22 +18440,22 @@ { "item": "cobblemon:black_sludge", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:leftovers", "count": "1", - "chance": 2.5 + "chance": 9.4 }, { "item": "cobblemon:silk_scarf", "count": "1", - "chance": 2.5 + "chance": 9.2 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 9.0 } ], "zones": [ @@ -18021,7 +18470,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -18030,7 +18480,7 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 2.5 + "chance": 4.9 } ], "zones": [ @@ -18046,12 +18496,12 @@ { "item": "cobblemon:grassy_seed", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -18066,17 +18516,18 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:charcoal", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:haban_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -18111,7 +18562,8 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:persim_berry", @@ -18132,7 +18584,8 @@ "drops": [ { "item": "minecraft:slime_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -18165,12 +18618,12 @@ { "item": "cobblemon:hard_stone", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -18203,12 +18656,12 @@ { "item": "cobblemon:black_belt", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:payapa_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -18241,12 +18694,12 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:black_glasses", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -18262,7 +18715,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:chicken", @@ -18271,12 +18725,12 @@ { "item": "cobblemon:sharp_beak", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 10.0 + "chance": 33.0 } ], "zones": [], @@ -18292,7 +18746,8 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -18316,17 +18771,17 @@ { "item": "minecraft:honey_bottle", "count": "1", - "chance": 10.0 + "chance": 52.2 }, { "item": "cobblemon:peat_block", "count": "1", - "chance": 10.0 + "chance": 49.4 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 10.0 + "chance": 46.6 } ], "zones": [], @@ -18347,17 +18802,17 @@ { "item": "minecraft:honey_bottle", "count": "1", - "chance": 5.0 + "chance": 26.5 }, { "item": "cobblemon:peat_block", "count": "1", - "chance": 5.0 + "chance": 25.5 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 5.0 + "chance": 24.5 } ], "zones": [], @@ -18373,17 +18828,18 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -18398,17 +18854,18 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -18424,17 +18881,18 @@ "drops": [ { "item": "minecraft:snowball", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:never_melt_ice", "count": "1", - "chance": 10.0 + "chance": 34.4 }, { "item": "cobblemon:aspear_berry", "count": "1", - "chance": 10.0 + "chance": 31.9 } ], "zones": [ @@ -18450,12 +18908,12 @@ { "item": "cobblemon:water_stone", "count": "1", - "chance": 25.0 + "chance": 43.8 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 15.1 } ], "zones": [], @@ -18471,17 +18929,18 @@ "drops": [ { "item": "minecraft:iron_nugget", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:black_sludge", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:shuca_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [], @@ -18502,7 +18961,7 @@ { "item": "minecraft:bone_meal", "count": "1", - "chance": 5.0 + "chance": 14.3 } ], "zones": [ @@ -18518,12 +18977,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -18538,22 +18997,23 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 17.0 } ], "zones": [], @@ -18569,7 +19029,8 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:persim_berry", @@ -18589,12 +19050,13 @@ "drops": [ { "item": "minecraft:melon_seeds", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:miracle_seed", "count": "1", - "chance": 25.0 + "chance": 57.8 } ], "zones": [], @@ -18610,21 +19072,23 @@ "drops": [ { "item": "minecraft:honey_bottle", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "minecraft:honeycomb", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:poison_barb", "count": "1", - "chance": 10.0 + "chance": 46.9 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 10.0 + "chance": 44.1 } ], "zones": [], @@ -18641,12 +19105,12 @@ { "item": "cobblemon:soft_sand", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:yache_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -18662,12 +19126,12 @@ { "item": "cobblemon:big_root", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -18700,12 +19164,12 @@ { "item": "cobblemon:wepear_berry", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:cell_battery", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [], @@ -18722,12 +19186,12 @@ { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 10.0 + "chance": 19.0 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 10.0 + "chance": 17.3 } ], "zones": [ @@ -18743,17 +19207,17 @@ { "item": "cobblemon:bright_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:shed_shell", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -18770,12 +19234,12 @@ { "item": "cobblemon:bright_powder", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:razz_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -18791,17 +19255,17 @@ { "item": "minecraft:blaze_powder", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:silver_powder", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [], @@ -18817,7 +19281,8 @@ "drops": [ { "item": "minecraft:gunpowder", - "count": "0-1" + "count": "1", + "chance": 50.0 } ], "zones": [ @@ -18837,15 +19302,19 @@ { "item": "minecraft:charcoal", "count": "1", - "chance": 2.5 + "chance": 9.6 }, { "item": "cobblemon:rawst_berry", "count": "1", - "chance": 2.5 + "chance": 9.4 } ], "zones": [ + { + "zone": "frostpeak", + "levels": "40-55" + }, { "zone": "highlands", "levels": "25-35" @@ -18857,7 +19326,8 @@ "drops": [ { "item": "minecraft:bone_block", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:chesto_berry", @@ -18877,12 +19347,13 @@ "drops": [ { "item": "minecraft:bone_block", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -18897,12 +19368,13 @@ "drops": [ { "item": "minecraft:cod", - "count": "0-3" + "count": "1-3", + "chance": 75.0 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 10.0 + "chance": 27.1 } ], "zones": [ @@ -18917,12 +19389,13 @@ "drops": [ { "item": "minecraft:turtle_scute", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:mystic_water", "count": "1", - "chance": 10.0 + "chance": 19.0 } ], "zones": [ @@ -18954,7 +19427,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -18980,22 +19454,22 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:grip_claw", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 5.0 + "chance": 17.0 }, { "item": "cobblemon:chople_berry", "count": "1", - "chance": 5.0 + "chance": 16.2 } ], "zones": [], @@ -19011,7 +19485,8 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:pinap_berry", @@ -19032,12 +19507,12 @@ { "item": "cobblemon:big_root", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:pinap_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -19053,12 +19528,12 @@ { "item": "cobblemon:black_sludge", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:smoke_ball", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [], @@ -19079,17 +19554,17 @@ { "item": "cobblemon:kebia_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:absorb_bulb", "count": "1", - "chance": 5.0 + "chance": 17.8 }, { "item": "minecraft:breeze_rod", "count": "1", - "chance": 10.0 + "chance": 31.7 } ], "zones": [ @@ -19105,12 +19580,12 @@ { "item": "cobblemon:poison_barb", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -19125,12 +19600,13 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:rindo_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -19147,12 +19623,12 @@ { "item": "cobblemon:throat_spray", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:chesto_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -19168,17 +19644,17 @@ { "item": "cobblemon:moon_stone", "count": "1", - "chance": 10.0 + "chance": 27.1 }, { "item": "cobblemon:air_balloon", "count": "1", - "chance": 10.0 + "chance": 24.9 }, { "item": "cobblemon:oran_berry", "count": "1", - "chance": 10.0 + "chance": 22.8 } ], "zones": [ @@ -19209,7 +19685,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "minecraft:chicken", @@ -19310,7 +19787,8 @@ "drops": [ { "item": "minecraft:clay_ball", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:rindo_berry", @@ -19330,12 +19808,13 @@ "drops": [ { "item": "minecraft:string", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:occa_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [], @@ -19351,7 +19830,8 @@ "drops": [ { "item": "minecraft:string", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:pecha_berry", @@ -19387,12 +19867,13 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -19407,7 +19888,8 @@ "drops": [ { "item": "minecraft:feather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chicken", @@ -19416,12 +19898,12 @@ { "item": "cobblemon:wise_glasses", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 5.0 + "chance": 13.6 } ], "zones": [ @@ -19452,7 +19934,8 @@ "drops": [ { "item": "minecraft:bone", - "count": "0-1" + "count": "1", + "chance": 50.0 }, { "item": "cobblemon:wepear_berry", @@ -19473,12 +19956,12 @@ { "item": "cobblemon:wide_lens", "count": "1", - "chance": 2.5 + "chance": 4.9 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 2.5 + "chance": 4.8 } ], "zones": [ @@ -19494,12 +19977,12 @@ { "item": "cobblemon:wide_lens", "count": "1", - "chance": 5.0 + "chance": 9.8 }, { "item": "cobblemon:charti_berry", "count": "1", - "chance": 5.0 + "chance": 9.3 } ], "zones": [ @@ -19531,17 +20014,17 @@ { "item": "cobblemon:razor_claw", "count": "1", - "chance": 5.0 + "chance": 14.3 }, { "item": "cobblemon:quick_claw", "count": "1", - "chance": 5.0 + "chance": 13.6 }, { "item": "cobblemon:pecha_berry", "count": "1", - "chance": 5.0 + "chance": 13.0 } ], "zones": [ @@ -19578,12 +20061,13 @@ "drops": [ { "item": "minecraft:leather", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:cheri_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -19619,7 +20103,7 @@ { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 18.5 } ], "zones": [ @@ -19639,10 +20123,14 @@ { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 2.5 + "chance": 7.3 } ], "zones": [ + { + "zone": "frostpeak", + "levels": "40-55" + }, { "zone": "highlands", "levels": "25-35" @@ -19655,17 +20143,17 @@ { "item": "minecraft:phantom_membrane", "count": "1", - "chance": 2.5 + "chance": 7.3 }, { "item": "cobblemon:razor_fang", "count": "1", - "chance": 2.5 + "chance": 7.1 }, { "item": "cobblemon:persim_berry", "count": "1", - "chance": 2.5 + "chance": 7.0 } ], "zones": [], @@ -19681,12 +20169,13 @@ "drops": [ { "item": "minecraft:dragon_breath", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:roseli_berry", "count": "1", - "chance": 5.0 + "chance": 9.8 } ], "zones": [ @@ -19700,135 +20189,178 @@ "summons": [ { "species": "cobblemon:zapdos", + "pokemon": "cobblemon:zapdos", "name": "Zapdos", "zone": "westmarch", "level": 70 }, { "species": "cobblemon:regieleki", + "pokemon": "cobblemon:regieleki", "name": "Regieleki", "zone": "westmarch", "level": 70 }, { "species": "cobblemon:ironleaves", + "pokemon": "cobblemon:ironleaves", "name": "Iron Leaves", "zone": "jungle", "level": 70 }, { "species": "cobblemon:regirock", + "pokemon": "cobblemon:regirock", "name": "Regirock", "zone": "dripstone", "level": 70 }, { "species": "cobblemon:latias", + "pokemon": "cobblemon:latias", "name": "Latias", "zone": "highlands", "level": 70 }, { "species": "cobblemon:latios", + "pokemon": "cobblemon:latios", "name": "Latios", "zone": "highlands", "level": 70 }, { "species": "cobblemon:walkingwake", + "pokemon": "cobblemon:walkingwake", "name": "Walking Wake", "zone": "mire", "level": 70 }, { "species": "cobblemon:regidrago", + "pokemon": "cobblemon:regidrago", "name": "Regidrago", "zone": "sunscorch", "level": 70 }, { "species": "cobblemon:articuno", + "pokemon": "cobblemon:articuno", "name": "Articuno", "zone": "frostpeak", "level": 70 }, { "species": "cobblemon:regice", + "pokemon": "cobblemon:regice", "name": "Regice", "zone": "frostpeak", "level": 70 }, { "species": "cobblemon:registeel", + "pokemon": "cobblemon:registeel", "name": "Registeel", "zone": "deep_dark", "level": 70 }, { "species": "cobblemon:moltres", + "pokemon": "cobblemon:moltres", "name": "Moltres", "zone": "basalt", "level": 70 }, { "species": "cobblemon:poipole", + "pokemon": "cobblemon:poipole", "name": "Poipole", "zone": "the_end", "level": 70 }, { "species": "cobblemon:xerneas", + "pokemon": "cobblemon:xerneas", "name": "Xerneas", "zone": "jungle", "level": 80 }, { "species": "cobblemon:zarude", + "pokemon": "cobblemon:zarude", "name": "Zarude", "zone": "jungle", "level": 80 }, { "species": "cobblemon:mew", + "pokemon": "cobblemon:mew", "name": "Mew", "zone": "jungle", "level": 80 }, { "species": "cobblemon:hooh", + "pokemon": "cobblemon:hooh", "name": "Ho-Oh", "zone": "highlands", "level": 80 }, { "species": "cobblemon:lugia", + "pokemon": "cobblemon:lugia", "name": "Lugia", "zone": "deep_sea", "level": 80 }, { "species": "cobblemon:regigigas", + "pokemon": "cobblemon:regigigas", "name": "Regigigas", "zone": "deep_dark", "level": 80 }, { "species": "cobblemon:rayquaza", + "pokemon": "cobblemon:rayquaza", "name": "Rayquaza", "zone": "frostpeak", "level": 90 }, { "species": "cobblemon:mewtwo", + "pokemon": "cobblemon:mewtwo", "name": "Mewtwo", "zone": "deep_dark", "level": 90 }, { "species": "cobblemon:eternatus", + "pokemon": "cobblemon:eternatus", "name": "Eternatus", "zone": "the_end", "level": 90 + }, + { + "species": "cobblemon:zapdos_galarian", + "pokemon": "cobblemon:zapdos", + "name": "Galarian Zapdos", + "zone": "jungle", + "level": 80 + }, + { + "species": "cobblemon:articuno_galarian", + "pokemon": "cobblemon:articuno", + "name": "Galarian Articuno", + "zone": "highlands", + "level": 80 + }, + { + "species": "cobblemon:moltres_galarian", + "pokemon": "cobblemon:moltres", + "name": "Galarian Moltres", + "zone": "deep_dark", + "level": 80 } ], "spawn_drops": [ @@ -19838,21 +20370,23 @@ "drops": [ { "item": "minecraft:ender_pearl", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "minecraft:chorus_fruit", - "count": "0-2" + "count": "1-2", + "chance": 66.7 }, { "item": "cobblemon:light_clay", "count": "1", - "chance": 5.0 + "chance": 18.5 }, { "item": "cobblemon:colbur_berry", "count": "1", - "chance": 5.0 + "chance": 17.8 } ] } diff --git a/datapacks/core/data/cobblesurvival/recipe/summon_articuno_galarian.json b/datapacks/core/data/cobblesurvival/recipe/summon_articuno_galarian.json new file mode 100644 index 0000000..677c1af --- /dev/null +++ b/datapacks/core/data/cobblesurvival/recipe/summon_articuno_galarian.json @@ -0,0 +1,34 @@ +{ + "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "MRM", + "RCR", + "MRM" + ], + "key": { + "M": { + "item": "cobblemon:ice_stone" + }, + "R": { + "item": "minecraft:diamond" + }, + "C": { + "item": "minecraft:nether_star" + } + }, + "result": { + "id": "cobblesurvival:summon_sigil", + "count": 1, + "components": { + "minecraft:custom_data": { + "cobblesurvival_summon": "articuno_galarian" + }, + "minecraft:item_name": "\"Galarian Articuno Sigil\"", + "minecraft:lore": [ + "{\"text\": \"Use in Highland Meadows to summon a Lv 80 Galarian Articuno\", \"color\": \"gray\", \"italic\": false}" + ] + } + } +} diff --git a/datapacks/core/data/cobblesurvival/recipe/summon_moltres_galarian.json b/datapacks/core/data/cobblesurvival/recipe/summon_moltres_galarian.json new file mode 100644 index 0000000..6cc660e --- /dev/null +++ b/datapacks/core/data/cobblesurvival/recipe/summon_moltres_galarian.json @@ -0,0 +1,34 @@ +{ + "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "MRM", + "RCR", + "MRM" + ], + "key": { + "M": { + "item": "cobblemon:fire_stone" + }, + "R": { + "item": "minecraft:diamond" + }, + "C": { + "item": "minecraft:nether_star" + } + }, + "result": { + "id": "cobblesurvival:summon_sigil", + "count": 1, + "components": { + "minecraft:custom_data": { + "cobblesurvival_summon": "moltres_galarian" + }, + "minecraft:item_name": "\"Galarian Moltres Sigil\"", + "minecraft:lore": [ + "{\"text\": \"Use in Deep Dark to summon a Lv 80 Galarian Moltres\", \"color\": \"gray\", \"italic\": false}" + ] + } + } +} diff --git a/datapacks/core/data/cobblesurvival/recipe/summon_zapdos_galarian.json b/datapacks/core/data/cobblesurvival/recipe/summon_zapdos_galarian.json new file mode 100644 index 0000000..9bce084 --- /dev/null +++ b/datapacks/core/data/cobblesurvival/recipe/summon_zapdos_galarian.json @@ -0,0 +1,34 @@ +{ + "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "MRM", + "RCR", + "MRM" + ], + "key": { + "M": { + "item": "cobblemon:thunder_stone" + }, + "R": { + "item": "minecraft:diamond" + }, + "C": { + "item": "minecraft:nether_star" + } + }, + "result": { + "id": "cobblesurvival:summon_sigil", + "count": 1, + "components": { + "minecraft:custom_data": { + "cobblesurvival_summon": "zapdos_galarian" + }, + "minecraft:item_name": "\"Galarian Zapdos Sigil\"", + "minecraft:lore": [ + "{\"text\": \"Use in Verdant Jungle to summon a Lv 80 Galarian Zapdos\", \"color\": \"gray\", \"italic\": false}" + ] + } + } +} diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/button_isle.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/button_isle.json index 01d34e3..975a785 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/button_isle.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/button_isle.json @@ -789,276 +789,6 @@ "multiplier": 0.25 } }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_arid", - "#cobblemon:is_freezing", - "#cobblemon:is_taiga" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "isRaining": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "button_isle" - }, - "id": "button_isle-meowth-1-64", - "level": "4-10", - "pokemon": "meowth", - "presets": [ - "natural", - "urban" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 72.0, - "weightMultipliers": [ - { - "condition": { - "timeRange": "night" - }, - "multiplier": 1.5 - }, - { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - ] - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_arid", - "#cobblemon:is_freezing", - "#cobblemon:is_taiga" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "isRaining": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "structures": [ - "#cobblemon:spawns/is_civilization" - ], - "zone": "button_isle" - }, - "id": "button_isle-meowth-2-65", - "level": "4-10", - "pokemon": "meowth", - "presets": [ - "natural" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 72.0, - "weightMultipliers": [ - { - "condition": { - "timeRange": "night" - }, - "multiplier": 1.5 - }, - { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - ] - }, - { - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_arid" - ], - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "button_isle" - }, - "id": "button_isle-meowth-3-66", - "level": "4-10", - "pokemon": "meowth", - "presets": [ - "natural", - "urban" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 72.0, - "weightMultipliers": [ - { - "condition": { - "timeRange": "night" - }, - "multiplier": 1.5 - }, - { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - ] - }, - { - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_arid" - ], - "maxSkyLight": 15, - "minSkyLight": 8, - "structures": [ - "#cobblemon:spawns/is_civilization" - ], - "zone": "button_isle" - }, - "id": "button_isle-meowth-4-67", - "level": "4-10", - "pokemon": "meowth", - "presets": [ - "natural" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 72.0, - "weightMultipliers": [ - { - "condition": { - "timeRange": "night" - }, - "multiplier": 1.5 - }, - { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - ] - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_arid", - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "isRaining": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "minY": 62, - "structures": [ - "#cobblemon:spawns/is_illager_structure" - ], - "zone": "button_isle" - }, - "id": "button_isle-meowth-alolan-5-68", - "level": "4-10", - "pokemon": "meowth alolan", - "presets": [ - "natural" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 432.0, - "weightMultipliers": [ - { - "condition": { - "timeRange": "night" - }, - "multiplier": 1.5 - }, - { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - ] - }, - { - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_arid", - "#cobblemon:is_freezing" - ], - "maxSkyLight": 15, - "minSkyLight": 8, - "minY": 62, - "structures": [ - "#cobblemon:spawns/is_illager_structure" - ], - "zone": "button_isle" - }, - "id": "button_isle-meowth-alolan-6-69", - "level": "4-10", - "pokemon": "meowth alolan", - "presets": [ - "natural" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 432.0, - "weightMultipliers": [ - { - "condition": { - "timeRange": "night" - }, - "multiplier": 1.5 - }, - { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - ] - }, - { - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "canSeeSky": false, - "minY": 62, - "structures": [ - "#cobblemon:spawns/is_illager_structure" - ], - "zone": "button_isle" - }, - "id": "button_isle-meowth-alolan-7-70", - "level": "4-10", - "pokemon": "meowth alolan", - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 144.0, - "weightMultiplier": { - "condition": { - "isPokeSnack": true - }, - "multiplier": 1.25 - } - }, { "anticondition": { "biomes": [ diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/deep_sea.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/deep_sea.json index 8a4fae4..09aadc8 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/deep_sea.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/deep_sea.json @@ -4,6 +4,156 @@ "neededInstalledMods": [], "neededUninstalledMods": [], "spawns": [ + { + "anticondition": { + "biomes": [ + "#cobblemon:is_frozen_ocean" + ] + }, + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_deep_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-alomomola-1-0", + "level": "30-50", + "pokemon": "alomomola", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 48.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + }, + { + "anticondition": { + "minLureLevel": 1 + }, + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-alomomola-2-1", + "level": "30-50", + "pokemon": "alomomola", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 60.0 + }, + { + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "minLureLevel": 1, + "zone": "deep_sea" + }, + "id": "deep_sea-alomomola-3-2", + "level": "30-50", + "pokemon": "alomomola", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 20.0, + "weightMultiplier": { + "condition": { + "minLureLevel": 3 + }, + "multiplier": 3.0 + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_frozen_ocean" + ] + }, + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_deep_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-alomomola-4-3", + "level": "30-50", + "pokemon": "alomomola", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 48.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + }, + { + "anticondition": { + "minLureLevel": 1 + }, + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-alomomola-5-4", + "level": "30-50", + "pokemon": "alomomola", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 60.0 + }, + { + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minLureLevel": 1, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-alomomola-6-5", + "level": "30-50", + "pokemon": "alomomola", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 20.0, + "weightMultiplier": { + "condition": { + "minLureLevel": 3 + }, + "multiplier": 3.0 + } + }, { "bucket": "uncommon", "condition": { @@ -12,7 +162,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-barbaracle-2-87", + "id": "deep_sea-barbaracle-2-98", "level": "39-50", "pokemon": "barbaracle", "presets": [ @@ -40,7 +190,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-barbaracle-3-88", + "id": "deep_sea-barbaracle-3-99", "level": "39-50", "pokemon": "barbaracle", "spawnablePositionType": "fishing", @@ -57,7 +207,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-barbaracle-4-89", + "id": "deep_sea-barbaracle-4-100", "level": "39-50", "pokemon": "barbaracle", "spawnablePositionType": "fishing", @@ -70,6 +220,134 @@ "multiplier": 3.0 } }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_freezing" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_freshwater", + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-barraskewda-1-156", + "level": "30-50", + "pokemon": "barraskewda", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 1.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_freezing" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#aether:is_aether", + "#cobblemon:is_coast", + "#cobblemon:is_freshwater", + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-barraskewda-2-157", + "level": "30-50", + "pokemon": "barraskewda", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 10.0, + "weightMultiplier": { + "condition": { + "maxLureLevel": 1, + "minLureLevel": 0 + }, + "multiplier": 0.6 + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_freezing" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_freshwater", + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-barraskewda-3-158", + "level": "30-50", + "pokemon": "barraskewda", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 1.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_freezing" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#aether:is_aether", + "#cobblemon:is_coast", + "#cobblemon:is_freshwater", + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-barraskewda-4-159", + "level": "30-50", + "pokemon": "barraskewda", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 10.0, + "weightMultiplier": { + "condition": { + "maxLureLevel": 1, + "minLureLevel": 0 + }, + "multiplier": 0.6 + } + }, { "bucket": "uncommon", "condition": { @@ -78,7 +356,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-binacle-2-84", + "id": "deep_sea-binacle-2-95", "level": "30-50", "pokemon": "binacle", "presets": [ @@ -106,7 +384,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-binacle-3-85", + "id": "deep_sea-binacle-3-96", "level": "30-50", "pokemon": "binacle", "spawnablePositionType": "fishing", @@ -123,7 +401,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-binacle-4-86", + "id": "deep_sea-binacle-4-97", "level": "30-50", "pokemon": "binacle", "spawnablePositionType": "fishing", @@ -152,7 +430,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-brionne-3-107", + "id": "deep_sea-brionne-3-126", "level": "30-50", "pokemon": "brionne", "spawnablePositionType": "fishing", @@ -177,7 +455,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-brionne-5-108", + "id": "deep_sea-brionne-5-127", "level": "30-50", "pokemon": "brionne", "spawnablePositionType": "fishing", @@ -194,7 +472,7 @@ "maxY": 48, "zone": "deep_sea" }, - "id": "deep_sea-clamperl-1-0", + "id": "deep_sea-clamperl-1-6", "level": "30-50", "pokemon": "clamperl", "presets": [ @@ -204,6 +482,25 @@ "type": "pokemon", "weight": 92.0 }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_warm_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-clamperl-2-7", + "level": "30-50", + "pokemon": "clamperl", + "presets": [ + "water" + ], + "spawnablePositionType": "seafloor", + "type": "pokemon", + "weight": 87.5 + }, { "bucket": "rare", "condition": { @@ -213,7 +510,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-clamperl-3-1", + "id": "deep_sea-clamperl-3-8", "level": "30-50", "pokemon": "clamperl", "spawnablePositionType": "fishing", @@ -231,7 +528,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-clamperl-4-2", + "id": "deep_sea-clamperl-4-9", "level": "30-50", "pokemon": "clamperl", "spawnablePositionType": "fishing", @@ -247,7 +544,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-clauncher-1-90", + "id": "deep_sea-clauncher-1-101", "level": "30-50", "pokemon": "clauncher", "presets": [ @@ -267,7 +564,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-clauncher-2-91", + "id": "deep_sea-clauncher-2-102", "level": "30-50", "pokemon": "clauncher", "spawnablePositionType": "fishing", @@ -301,7 +598,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-clauncher-3-92", + "id": "deep_sea-clauncher-3-103", "level": "30-50", "pokemon": "clauncher", "spawnablePositionType": "fishing", @@ -332,7 +629,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-clawitzer-1-93", + "id": "deep_sea-clawitzer-1-104", "level": "37-50", "pokemon": "clawitzer", "presets": [ @@ -352,7 +649,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-clawitzer-2-94", + "id": "deep_sea-clawitzer-2-105", "level": "37-50", "pokemon": "clawitzer", "spawnablePositionType": "fishing", @@ -385,7 +682,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-clawitzer-3-95", + "id": "deep_sea-clawitzer-3-106", "level": "37-50", "pokemon": "clawitzer", "presets": [ @@ -407,7 +704,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-clawitzer-4-96", + "id": "deep_sea-clawitzer-4-107", "level": "37-50", "pokemon": "clawitzer", "spawnablePositionType": "fishing", @@ -444,7 +741,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-cloyster-2-114", + "id": "deep_sea-cloyster-2-133", "level": "30-50", "pokemon": "cloyster", "presets": [ @@ -476,7 +773,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-cloyster-4-115", + "id": "deep_sea-cloyster-4-134", "level": "30-50", "pokemon": "cloyster", "spawnablePositionType": "fishing", @@ -516,7 +813,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-cloyster-6-116", + "id": "deep_sea-cloyster-6-135", "level": "30-50", "pokemon": "cloyster", "spawnablePositionType": "fishing", @@ -539,7 +836,7 @@ ] }, { - "id": "deep_sea-dewgong-141", + "id": "deep_sea-dewgong-164", "type": "pokemon", "pokemon": "dewgong", "presets": [ @@ -570,7 +867,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-dewott-3-103", + "id": "deep_sea-dewott-3-122", "level": "30-50", "pokemon": "dewott", "spawnablePositionType": "fishing", @@ -590,7 +887,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dhelmise-1-11", + "id": "deep_sea-dhelmise-1-22", "level": "30-50", "pokemon": "dhelmise", "presets": [ @@ -613,7 +910,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dhelmise-2-12", + "id": "deep_sea-dhelmise-2-23", "level": "30-50", "pokemon": "dhelmise", "spawnablePositionType": "fishing", @@ -629,7 +926,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-dhelmise-3-13", + "id": "deep_sea-dhelmise-3-24", "level": "30-50", "pokemon": "dhelmise", "spawnablePositionType": "fishing", @@ -651,7 +948,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dhelmise-4-14", + "id": "deep_sea-dhelmise-4-25", "level": "30-50", "pokemon": "dhelmise", "presets": [ @@ -676,7 +973,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dhelmise-5-15", + "id": "deep_sea-dhelmise-5-26", "level": "30-50", "pokemon": "dhelmise", "spawnablePositionType": "fishing", @@ -694,7 +991,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-dhelmise-6-16", + "id": "deep_sea-dhelmise-6-27", "level": "30-50", "pokemon": "dhelmise", "spawnablePositionType": "fishing", @@ -714,7 +1011,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dragalge-1-121", + "id": "deep_sea-dragalge-1-140", "level": "48-50", "pokemon": "dragalge", "presets": [ @@ -739,7 +1036,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dragalge-2-122", + "id": "deep_sea-dragalge-2-141", "level": "48-50", "pokemon": "dragalge", "presets": [ @@ -762,7 +1059,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dragalge-4-123", + "id": "deep_sea-dragalge-4-142", "level": "48-50", "pokemon": "dragalge", "spawnablePositionType": "fishing", @@ -799,7 +1096,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-dragalge-5-124", + "id": "deep_sea-dragalge-5-143", "level": "48-50", "pokemon": "dragalge", "spawnablePositionType": "fishing", @@ -838,7 +1135,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-drakloak-1-97", + "id": "deep_sea-drakloak-1-108", "level": "50-50", "pokemon": "drakloak", "presets": [ @@ -877,7 +1174,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-drakloak-2-98", + "id": "deep_sea-drakloak-2-109", "level": "50-50", "pokemon": "drakloak", "spawnablePositionType": "grounded", @@ -915,7 +1212,7 @@ "timeRange": "dusk", "zone": "deep_sea" }, - "id": "deep_sea-drakloak-3-99", + "id": "deep_sea-drakloak-3-110", "level": "50-50", "pokemon": "drakloak", "presets": [ @@ -946,7 +1243,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-drakloak-4-100", + "id": "deep_sea-drakloak-4-111", "level": "50-50", "pokemon": "drakloak", "spawnablePositionType": "fishing", @@ -976,7 +1273,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-drakloak-5-101", + "id": "deep_sea-drakloak-5-112", "level": "50-50", "pokemon": "drakloak", "spawnablePositionType": "fishing", @@ -990,7 +1287,7 @@ } }, { - "id": "deep_sea-empoleon-139", + "id": "deep_sea-empoleon-162", "type": "pokemon", "pokemon": "empoleon", "presets": [ @@ -1015,7 +1312,7 @@ "maxY": 48, "zone": "deep_sea" }, - "id": "deep_sea-frillish-1-17", + "id": "deep_sea-frillish-1-28", "level": "30-50", "pokemon": "frillish", "presets": [ @@ -1046,7 +1343,7 @@ "timeRange": "night", "zone": "deep_sea" }, - "id": "deep_sea-frillish-2-18", + "id": "deep_sea-frillish-2-29", "level": "30-50", "pokemon": "frillish", "presets": [ @@ -1069,7 +1366,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-frillish-3-19", + "id": "deep_sea-frillish-3-30", "level": "30-50", "pokemon": "frillish", "presets": [ @@ -1096,7 +1393,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-frillish-5-20", + "id": "deep_sea-frillish-5-31", "level": "30-50", "pokemon": "frillish", "spawnablePositionType": "fishing", @@ -1131,7 +1428,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-frillish-6-21", + "id": "deep_sea-frillish-6-32", "level": "30-50", "pokemon": "frillish", "spawnablePositionType": "fishing", @@ -1165,7 +1462,7 @@ "maxY": 48, "zone": "deep_sea" }, - "id": "deep_sea-gorebyss-1-7", + "id": "deep_sea-gorebyss-1-16", "level": "30-50", "pokemon": "gorebyss", "presets": [ @@ -1181,6 +1478,31 @@ "multiplier": 2.0 } }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_warm_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-gorebyss-2-17", + "level": "30-50", + "pokemon": "gorebyss", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 3.125, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, { "bucket": "rare", "condition": { @@ -1190,7 +1512,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-gorebyss-3-8", + "id": "deep_sea-gorebyss-3-18", "level": "30-50", "pokemon": "gorebyss", "spawnablePositionType": "fishing", @@ -1209,7 +1531,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-gorebyss-4-9", + "id": "deep_sea-gorebyss-4-19", "level": "30-50", "pokemon": "gorebyss", "presets": [ @@ -1225,6 +1547,33 @@ "multiplier": 2.0 } }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_warm_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-gorebyss-5-20", + "level": "30-50", + "pokemon": "gorebyss", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 3.125, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, { "bucket": "rare", "condition": { @@ -1236,7 +1585,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-gorebyss-6-10", + "id": "deep_sea-gorebyss-6-21", "level": "30-50", "pokemon": "gorebyss", "spawnablePositionType": "fishing", @@ -1254,7 +1603,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-horsea-1-27", + "id": "deep_sea-horsea-1-38", "level": "30-50", "pokemon": "horsea", "presets": [ @@ -1277,7 +1626,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-horsea-2-28", + "id": "deep_sea-horsea-2-39", "level": "30-50", "pokemon": "horsea", "presets": [ @@ -1302,7 +1651,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-horsea-4-29", + "id": "deep_sea-horsea-4-40", "level": "30-50", "pokemon": "horsea", "spawnablePositionType": "fishing", @@ -1341,7 +1690,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-horsea-5-30", + "id": "deep_sea-horsea-5-41", "level": "30-50", "pokemon": "horsea", "spawnablePositionType": "fishing", @@ -1373,7 +1722,7 @@ "maxY": 48, "zone": "deep_sea" }, - "id": "deep_sea-huntail-1-3", + "id": "deep_sea-huntail-1-10", "level": "30-50", "pokemon": "huntail", "presets": [ @@ -1389,6 +1738,31 @@ "multiplier": 2.0 } }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_warm_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-huntail-2-11", + "level": "30-50", + "pokemon": "huntail", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 3.125, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, { "bucket": "rare", "condition": { @@ -1398,7 +1772,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-huntail-3-4", + "id": "deep_sea-huntail-3-12", "level": "30-50", "pokemon": "huntail", "spawnablePositionType": "fishing", @@ -1417,7 +1791,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-huntail-4-5", + "id": "deep_sea-huntail-4-13", "level": "30-50", "pokemon": "huntail", "presets": [ @@ -1433,6 +1807,33 @@ "multiplier": 2.0 } }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_warm_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-huntail-5-14", + "level": "30-50", + "pokemon": "huntail", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 3.125, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, { "bucket": "rare", "condition": { @@ -1444,7 +1845,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-huntail-6-6", + "id": "deep_sea-huntail-6-15", "level": "30-50", "pokemon": "huntail", "spawnablePositionType": "fishing", @@ -1462,7 +1863,7 @@ "maxY": 48, "zone": "deep_sea" }, - "id": "deep_sea-jellicent-1-22", + "id": "deep_sea-jellicent-1-33", "level": "40-50", "pokemon": "jellicent", "presets": [ @@ -1493,7 +1894,7 @@ "timeRange": "night", "zone": "deep_sea" }, - "id": "deep_sea-jellicent-2-23", + "id": "deep_sea-jellicent-2-34", "level": "40-50", "pokemon": "jellicent", "presets": [ @@ -1516,7 +1917,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-jellicent-3-24", + "id": "deep_sea-jellicent-3-35", "level": "40-50", "pokemon": "jellicent", "presets": [ @@ -1543,7 +1944,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-jellicent-5-25", + "id": "deep_sea-jellicent-5-36", "level": "40-50", "pokemon": "jellicent", "spawnablePositionType": "fishing", @@ -1578,7 +1979,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-jellicent-6-26", + "id": "deep_sea-jellicent-6-37", "level": "40-50", "pokemon": "jellicent", "spawnablePositionType": "fishing", @@ -1616,7 +2017,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-kilowattrel-1-79", + "id": "deep_sea-kilowattrel-1-90", "level": "30-50", "pokemon": "kilowattrel", "presets": [ @@ -1644,7 +2045,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-kilowattrel-2-80", + "id": "deep_sea-kilowattrel-2-91", "level": "30-50", "pokemon": "kilowattrel", "spawnablePositionType": "grounded", @@ -1677,7 +2078,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-kilowattrel-5-81", + "id": "deep_sea-kilowattrel-5-92", "level": "30-50", "pokemon": "kilowattrel", "presets": [ @@ -1711,7 +2112,7 @@ "timeRange": "day", "zone": "deep_sea" }, - "id": "deep_sea-kilowattrel-6-82", + "id": "deep_sea-kilowattrel-6-93", "level": "30-50", "pokemon": "kilowattrel", "spawnablePositionType": "fishing", @@ -1742,7 +2143,7 @@ "timeRange": "day", "zone": "deep_sea" }, - "id": "deep_sea-kilowattrel-7-83", + "id": "deep_sea-kilowattrel-7-94", "level": "30-50", "pokemon": "kilowattrel", "spawnablePositionType": "fishing", @@ -1774,7 +2175,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-kingdra-1-35", + "id": "deep_sea-kingdra-1-46", "level": "39-50", "pokemon": "kingdra", "presets": [ @@ -1797,7 +2198,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-kingdra-2-36", + "id": "deep_sea-kingdra-2-47", "level": "39-50", "pokemon": "kingdra", "presets": [ @@ -1822,7 +2223,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-kingdra-4-37", + "id": "deep_sea-kingdra-4-48", "level": "39-50", "pokemon": "kingdra", "spawnablePositionType": "fishing", @@ -1861,7 +2262,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-kingdra-5-38", + "id": "deep_sea-kingdra-5-49", "level": "39-50", "pokemon": "kingdra", "spawnablePositionType": "fishing", @@ -1899,7 +2300,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-lapras-2-39", + "id": "deep_sea-lapras-2-50", "level": "30-50", "pokemon": "lapras", "presets": [ @@ -1923,7 +2324,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-lapras-5-40", + "id": "deep_sea-lapras-5-51", "level": "30-50", "pokemon": "lapras", "spawnablePositionType": "fishing", @@ -1946,13 +2347,208 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-lapras-8-41", + "id": "deep_sea-lapras-8-52", "level": "30-50", "pokemon": "lapras", "spawnablePositionType": "fishing", "type": "pokemon", "weight": 100.0 }, + { + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_coast", + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "isPokeSnack": true, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-1-113", + "level": "30-50", + "pokemon": "malamar", + "presets": [ + "natural", + "wild" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 3.2 + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_beach" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_coast", + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minLureLevel": 1, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-10-120", + "level": "30-50", + "pokemon": "malamar", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 2.0, + "weightMultiplier": { + "condition": { + "minLureLevel": 3 + }, + "multiplier": 3.0 + } + }, + { + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_coast", + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "isPokeSnack": true, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-2-114", + "level": "30-50", + "pokemon": "malamar", + "presets": [ + "wild" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 3.2 + }, + { + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "isPokeSnack": true, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-4-115", + "level": "30-50", + "pokemon": "malamar", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 9.6 + }, + { + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "isPokeSnack": true, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-5-116", + "level": "30-50", + "pokemon": "malamar", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 9.6 + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_beach" + ], + "minLureLevel": 1 + }, + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_coast", + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-7-117", + "level": "30-50", + "pokemon": "malamar", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 9.6 + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_beach" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_coast", + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "minLureLevel": 1, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-8-118", + "level": "30-50", + "pokemon": "malamar", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 2.0, + "weightMultiplier": { + "condition": { + "minLureLevel": 3 + }, + "multiplier": 3.0 + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_beach" + ], + "minLureLevel": 1 + }, + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_coast", + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "deep_sea" + }, + "id": "deep_sea-malamar-9-119", + "level": "30-50", + "pokemon": "malamar", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 9.6 + }, { "bucket": "uncommon", "condition": { @@ -1965,7 +2561,7 @@ "minY": 48, "zone": "deep_sea" }, - "id": "deep_sea-mantine-1-42", + "id": "deep_sea-mantine-1-53", "level": "30-50", "pokemon": "mantine", "presets": [ @@ -1989,7 +2585,7 @@ "minY": 48, "zone": "deep_sea" }, - "id": "deep_sea-mantine-2-43", + "id": "deep_sea-mantine-2-54", "level": "30-50", "pokemon": "mantine", "presets": [ @@ -2015,7 +2611,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-mantine-3-44", + "id": "deep_sea-mantine-3-55", "level": "30-50", "pokemon": "mantine", "spawnablePositionType": "fishing", @@ -2038,7 +2634,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-mantine-4-45", + "id": "deep_sea-mantine-4-56", "level": "30-50", "pokemon": "mantine", "spawnablePositionType": "fishing", @@ -2070,7 +2666,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-mantine-5-46", + "id": "deep_sea-mantine-5-57", "level": "30-50", "pokemon": "mantine", "spawnablePositionType": "fishing", @@ -2095,7 +2691,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-mantine-6-47", + "id": "deep_sea-mantine-6-58", "level": "30-50", "pokemon": "mantine", "spawnablePositionType": "fishing", @@ -2121,7 +2717,7 @@ "minY": 48, "zone": "deep_sea" }, - "id": "deep_sea-mantyke-1-48", + "id": "deep_sea-mantyke-1-59", "level": "30-50", "pokemon": "mantyke", "presets": [ @@ -2145,7 +2741,7 @@ "minY": 48, "zone": "deep_sea" }, - "id": "deep_sea-mantyke-2-49", + "id": "deep_sea-mantyke-2-60", "level": "30-50", "pokemon": "mantyke", "presets": [ @@ -2171,7 +2767,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-mantyke-3-50", + "id": "deep_sea-mantyke-3-61", "level": "30-50", "pokemon": "mantyke", "spawnablePositionType": "fishing", @@ -2194,7 +2790,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-mantyke-4-51", + "id": "deep_sea-mantyke-4-62", "level": "30-50", "pokemon": "mantyke", "spawnablePositionType": "fishing", @@ -2226,7 +2822,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-mantyke-5-52", + "id": "deep_sea-mantyke-5-63", "level": "30-50", "pokemon": "mantyke", "spawnablePositionType": "fishing", @@ -2251,7 +2847,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-mantyke-6-53", + "id": "deep_sea-mantyke-6-64", "level": "30-50", "pokemon": "mantyke", "spawnablePositionType": "fishing", @@ -2274,7 +2870,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-octillery-1-58", + "id": "deep_sea-octillery-1-69", "level": "30-50", "pokemon": "octillery", "presets": [ @@ -2293,7 +2889,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-octillery-2-59", + "id": "deep_sea-octillery-2-70", "level": "30-50", "pokemon": "octillery", "spawnablePositionType": "fishing", @@ -2311,7 +2907,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-octillery-3-60", + "id": "deep_sea-octillery-3-71", "level": "30-50", "pokemon": "octillery", "spawnablePositionType": "fishing", @@ -2335,7 +2931,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-oshawott-3-102", + "id": "deep_sea-oshawott-3-121", "level": "30-50", "pokemon": "oshawott", "spawnablePositionType": "fishing", @@ -2343,7 +2939,7 @@ "weight": 60.0 }, { - "id": "deep_sea-piplup-137", + "id": "deep_sea-piplup-160", "type": "pokemon", "pokemon": "piplup", "presets": [ @@ -2373,7 +2969,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-popplio-3-105", + "id": "deep_sea-popplio-3-124", "level": "30-50", "pokemon": "popplio", "spawnablePositionType": "fishing", @@ -2398,7 +2994,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-popplio-5-106", + "id": "deep_sea-popplio-5-125", "level": "30-50", "pokemon": "popplio", "spawnablePositionType": "fishing", @@ -2421,7 +3017,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-primarina-3-109", + "id": "deep_sea-primarina-3-128", "level": "34-50", "pokemon": "primarina", "spawnablePositionType": "fishing", @@ -2446,7 +3042,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-primarina-5-110", + "id": "deep_sea-primarina-5-129", "level": "34-50", "pokemon": "primarina", "spawnablePositionType": "fishing", @@ -2454,7 +3050,7 @@ "weight": 4.0 }, { - "id": "deep_sea-prinplup-138", + "id": "deep_sea-prinplup-161", "type": "pokemon", "pokemon": "prinplup", "presets": [ @@ -2478,7 +3074,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-remoraid-1-54", + "id": "deep_sea-remoraid-1-65", "level": "30-50", "pokemon": "remoraid", "presets": [ @@ -2500,7 +3096,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-remoraid-2-55", + "id": "deep_sea-remoraid-2-66", "level": "30-50", "pokemon": "remoraid", "presets": [ @@ -2519,7 +3115,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-remoraid-4-56", + "id": "deep_sea-remoraid-4-67", "level": "30-50", "pokemon": "remoraid", "spawnablePositionType": "fishing", @@ -2537,7 +3133,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-remoraid-5-57", + "id": "deep_sea-remoraid-5-68", "level": "30-50", "pokemon": "remoraid", "spawnablePositionType": "fishing", @@ -2561,7 +3157,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-samurott-3-104", + "id": "deep_sea-samurott-3-123", "level": "36-50", "pokemon": "samurott", "spawnablePositionType": "fishing", @@ -2579,7 +3175,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-seadra-1-31", + "id": "deep_sea-seadra-1-42", "level": "32-50", "pokemon": "seadra", "presets": [ @@ -2602,7 +3198,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-seadra-2-32", + "id": "deep_sea-seadra-2-43", "level": "32-50", "pokemon": "seadra", "presets": [ @@ -2627,7 +3223,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-seadra-4-33", + "id": "deep_sea-seadra-4-44", "level": "32-50", "pokemon": "seadra", "spawnablePositionType": "fishing", @@ -2666,7 +3262,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-seadra-5-34", + "id": "deep_sea-seadra-5-45", "level": "32-50", "pokemon": "seadra", "spawnablePositionType": "fishing", @@ -2689,7 +3285,7 @@ ] }, { - "id": "deep_sea-sealeo-142", + "id": "deep_sea-sealeo-165", "type": "pokemon", "pokemon": "sealeo", "presets": [ @@ -2704,7 +3300,7 @@ } }, { - "id": "deep_sea-seel-140", + "id": "deep_sea-seel-163", "type": "pokemon", "pokemon": "seel", "presets": [ @@ -2733,7 +3329,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-shellder-2-111", + "id": "deep_sea-shellder-2-130", "level": "30-50", "pokemon": "shellder", "presets": [ @@ -2765,7 +3361,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-shellder-4-112", + "id": "deep_sea-shellder-4-131", "level": "30-50", "pokemon": "shellder", "spawnablePositionType": "fishing", @@ -2805,7 +3401,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-shellder-6-113", + "id": "deep_sea-shellder-6-132", "level": "30-50", "pokemon": "shellder", "spawnablePositionType": "fishing", @@ -2840,7 +3436,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-skrelp-1-117", + "id": "deep_sea-skrelp-1-136", "level": "30-50", "pokemon": "skrelp", "presets": [ @@ -2865,7 +3461,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-skrelp-2-118", + "id": "deep_sea-skrelp-2-137", "level": "30-50", "pokemon": "skrelp", "presets": [ @@ -2888,7 +3484,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-skrelp-4-119", + "id": "deep_sea-skrelp-4-138", "level": "30-50", "pokemon": "skrelp", "spawnablePositionType": "fishing", @@ -2925,7 +3521,7 @@ ], "zone": "deep_sea" }, - "id": "deep_sea-skrelp-5-120", + "id": "deep_sea-skrelp-5-139", "level": "30-50", "pokemon": "skrelp", "spawnablePositionType": "fishing", @@ -2956,7 +3552,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-starmie-2-131", + "id": "deep_sea-starmie-2-150", "level": "30-50", "pokemon": "starmie", "presets": [ @@ -2986,7 +3582,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-starmie-3-132", + "id": "deep_sea-starmie-3-151", "level": "30-50", "pokemon": "starmie", "spawnablePositionType": "fishing", @@ -3011,7 +3607,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-starmie-4-133", + "id": "deep_sea-starmie-4-152", "level": "30-50", "pokemon": "starmie", "spawnablePositionType": "fishing", @@ -3043,7 +3639,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-starmie-5-134", + "id": "deep_sea-starmie-5-153", "level": "30-50", "pokemon": "starmie", "presets": [ @@ -3075,7 +3671,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-starmie-6-135", + "id": "deep_sea-starmie-6-154", "level": "30-50", "pokemon": "starmie", "spawnablePositionType": "fishing", @@ -3102,7 +3698,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-starmie-7-136", + "id": "deep_sea-starmie-7-155", "level": "30-50", "pokemon": "starmie", "spawnablePositionType": "fishing", @@ -3132,7 +3728,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-staryu-2-125", + "id": "deep_sea-staryu-2-144", "level": "30-50", "pokemon": "staryu", "presets": [ @@ -3162,7 +3758,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-staryu-3-126", + "id": "deep_sea-staryu-3-145", "level": "30-50", "pokemon": "staryu", "spawnablePositionType": "fishing", @@ -3187,7 +3783,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-staryu-4-127", + "id": "deep_sea-staryu-4-146", "level": "30-50", "pokemon": "staryu", "spawnablePositionType": "fishing", @@ -3219,7 +3815,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-staryu-5-128", + "id": "deep_sea-staryu-5-147", "level": "30-50", "pokemon": "staryu", "presets": [ @@ -3251,7 +3847,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-staryu-6-129", + "id": "deep_sea-staryu-6-148", "level": "30-50", "pokemon": "staryu", "spawnablePositionType": "fishing", @@ -3278,7 +3874,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-staryu-7-130", + "id": "deep_sea-staryu-7-149", "level": "30-50", "pokemon": "staryu", "spawnablePositionType": "fishing", @@ -3309,7 +3905,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-veluza-1-61", + "id": "deep_sea-veluza-1-72", "level": "30-50", "pokemon": "veluza", "presets": [ @@ -3331,7 +3927,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-veluza-2-62", + "id": "deep_sea-veluza-2-73", "level": "30-50", "pokemon": "veluza", "presets": [ @@ -3353,7 +3949,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-veluza-4-63", + "id": "deep_sea-veluza-4-74", "level": "30-50", "pokemon": "veluza", "spawnablePositionType": "fishing", @@ -3370,7 +3966,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-veluza-5-64", + "id": "deep_sea-veluza-5-75", "level": "30-50", "pokemon": "veluza", "spawnablePositionType": "fishing", @@ -3397,7 +3993,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-veluza-6-65", + "id": "deep_sea-veluza-6-76", "level": "30-50", "pokemon": "veluza", "spawnablePositionType": "fishing", @@ -3416,7 +4012,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-veluza-7-66", + "id": "deep_sea-veluza-7-77", "level": "30-50", "pokemon": "veluza", "spawnablePositionType": "fishing", @@ -3439,7 +4035,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-wailmer-1-67", + "id": "deep_sea-wailmer-1-78", "level": "30-50", "pokemon": "wailmer", "presets": [ @@ -3461,7 +4057,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-wailmer-2-68", + "id": "deep_sea-wailmer-2-79", "level": "30-50", "pokemon": "wailmer", "presets": [ @@ -3483,7 +4079,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-wailmer-3-69", + "id": "deep_sea-wailmer-3-80", "level": "30-50", "pokemon": "wailmer", "spawnablePositionType": "fishing", @@ -3500,7 +4096,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-wailmer-4-70", + "id": "deep_sea-wailmer-4-81", "level": "30-50", "pokemon": "wailmer", "spawnablePositionType": "fishing", @@ -3527,7 +4123,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-wailmer-5-71", + "id": "deep_sea-wailmer-5-82", "level": "30-50", "pokemon": "wailmer", "spawnablePositionType": "fishing", @@ -3546,7 +4142,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-wailmer-6-72", + "id": "deep_sea-wailmer-6-83", "level": "30-50", "pokemon": "wailmer", "spawnablePositionType": "fishing", @@ -3569,7 +4165,7 @@ "isPokeSnack": true, "zone": "deep_sea" }, - "id": "deep_sea-wailord-1-73", + "id": "deep_sea-wailord-1-84", "level": "40-50", "pokemon": "wailord", "presets": [ @@ -3591,7 +4187,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-wailord-2-74", + "id": "deep_sea-wailord-2-85", "level": "40-50", "pokemon": "wailord", "presets": [ @@ -3613,7 +4209,7 @@ "canSeeSky": true, "zone": "deep_sea" }, - "id": "deep_sea-wailord-3-75", + "id": "deep_sea-wailord-3-86", "level": "40-50", "pokemon": "wailord", "spawnablePositionType": "fishing", @@ -3630,7 +4226,7 @@ "minLureLevel": 1, "zone": "deep_sea" }, - "id": "deep_sea-wailord-4-76", + "id": "deep_sea-wailord-4-87", "level": "40-50", "pokemon": "wailord", "spawnablePositionType": "fishing", @@ -3657,7 +4253,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-wailord-5-77", + "id": "deep_sea-wailord-5-88", "level": "40-50", "pokemon": "wailord", "spawnablePositionType": "fishing", @@ -3676,7 +4272,7 @@ "minSkyLight": 8, "zone": "deep_sea" }, - "id": "deep_sea-wailord-6-78", + "id": "deep_sea-wailord-6-89", "level": "40-50", "pokemon": "wailord", "spawnablePositionType": "fishing", @@ -3690,7 +4286,7 @@ } }, { - "id": "deep_sea-walrein-143", + "id": "deep_sea-walrein-166", "type": "pokemon", "pokemon": "walrein", "presets": [ diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/frostpeak.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/frostpeak.json index e3ed34e..e5383f1 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/frostpeak.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/frostpeak.json @@ -779,6 +779,21 @@ "type": "pokemon", "weight": 36.0 }, + { + "id": "frostpeak-darumaka-94", + "type": "pokemon", + "pokemon": "darumaka galarian", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "40-55", + "weight": 10, + "condition": { + "zone": "frostpeak" + } + }, { "anticondition": { "biomes": [ @@ -2003,6 +2018,21 @@ "type": "pokemon", "weight": 87.5 }, + { + "id": "frostpeak-sandshrew-92", + "type": "pokemon", + "pokemon": "sandshrew alolan", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "40-55", + "weight": 10, + "condition": { + "zone": "frostpeak" + } + }, { "bucket": "uncommon", "condition": { @@ -2494,6 +2524,21 @@ "multiplier": 1.25 } }, + { + "id": "frostpeak-vulpix-93", + "type": "pokemon", + "pokemon": "vulpix alolan", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "40-55", + "weight": 10, + "condition": { + "zone": "frostpeak" + } + }, { "id": "frostpeak-wyrdeer-89", "type": "pokemon", @@ -2509,6 +2554,22 @@ "condition": { "zone": "frostpeak" } + }, + { + "id": "frostpeak-zorua-95", + "type": "pokemon", + "pokemon": "zorua hisuian", + "presets": [ + "natural", + "wild" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "40-55", + "weight": 10, + "condition": { + "zone": "frostpeak" + } } ] } diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/highlands.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/highlands.json index bf49e8a..2124c86 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/highlands.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/highlands.json @@ -541,6 +541,21 @@ "multiplier": 2.0 } }, + { + "id": "highlands-diglett-132", + "type": "pokemon", + "pokemon": "diglett alolan", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "25-35", + "weight": 10, + "condition": { + "zone": "highlands" + } + }, { "id": "highlands-dodrio-131", "type": "pokemon", @@ -3463,6 +3478,21 @@ "multiplier": 0.25 } }, + { + "id": "highlands-tauros-133", + "type": "pokemon", + "pokemon": "tauros paldean bull_breed=combat", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "25-35", + "weight": 10, + "condition": { + "zone": "highlands" + } + }, { "bucket": "ultra-rare", "condition": { diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/jungle.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/jungle.json index 4ea66f7..c665550 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/jungle.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/jungle.json @@ -1004,6 +1004,21 @@ "type": "pokemon", "weight": 18.0 }, + { + "id": "jungle-slowpoke-85", + "type": "pokemon", + "pokemon": "slowpoke galarian", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "18-30", + "weight": 10, + "condition": { + "zone": "jungle" + } + }, { "bucket": "ultra-rare", "condition": { diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/mire.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/mire.json index e5996d1..dc8af83 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/mire.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/mire.json @@ -30,262 +30,6 @@ "multiplier": 5.0 } }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "zone": "mire" - }, - "id": "mire-arrokuda-1-74", - "level": "25-38", - "pokemon": "arrokuda", - "presets": [ - "water" - ], - "spawnablePositionType": "submerged", - "type": "pokemon", - "weight": 9.0, - "weightMultiplier": { - "condition": { - "isPokeSnack": true - }, - "multiplier": 2.0 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#aether:is_aether", - "#cobblemon:is_coast", - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "zone": "mire" - }, - "id": "mire-arrokuda-2-75", - "level": "25-38", - "pokemon": "arrokuda", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 90.0, - "weightMultiplier": { - "condition": { - "maxLureLevel": 1, - "minLureLevel": 0 - }, - "multiplier": 0.6 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "mire" - }, - "id": "mire-arrokuda-3-76", - "level": "25-38", - "pokemon": "arrokuda", - "presets": [ - "water" - ], - "spawnablePositionType": "submerged", - "type": "pokemon", - "weight": 9.0, - "weightMultiplier": { - "condition": { - "isPokeSnack": true - }, - "multiplier": 2.0 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#aether:is_aether", - "#cobblemon:is_coast", - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "mire" - }, - "id": "mire-arrokuda-4-77", - "level": "25-38", - "pokemon": "arrokuda", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 90.0, - "weightMultiplier": { - "condition": { - "maxLureLevel": 1, - "minLureLevel": 0 - }, - "multiplier": 0.6 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "zone": "mire" - }, - "id": "mire-barraskewda-1-78", - "level": "26-38", - "pokemon": "barraskewda", - "presets": [ - "water" - ], - "spawnablePositionType": "submerged", - "type": "pokemon", - "weight": 1.0, - "weightMultiplier": { - "condition": { - "isPokeSnack": true - }, - "multiplier": 2.0 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#aether:is_aether", - "#cobblemon:is_coast", - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "zone": "mire" - }, - "id": "mire-barraskewda-2-79", - "level": "26-38", - "pokemon": "barraskewda", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 10.0, - "weightMultiplier": { - "condition": { - "maxLureLevel": 1, - "minLureLevel": 0 - }, - "multiplier": 0.6 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "mire" - }, - "id": "mire-barraskewda-3-80", - "level": "26-38", - "pokemon": "barraskewda", - "presets": [ - "water" - ], - "spawnablePositionType": "submerged", - "type": "pokemon", - "weight": 1.0, - "weightMultiplier": { - "condition": { - "isPokeSnack": true - }, - "multiplier": 2.0 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_freezing" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#aether:is_aether", - "#cobblemon:is_coast", - "#cobblemon:is_freshwater", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "mire" - }, - "id": "mire-barraskewda-4-81", - "level": "26-38", - "pokemon": "barraskewda", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 10.0, - "weightMultiplier": { - "condition": { - "maxLureLevel": 1, - "minLureLevel": 0 - }, - "multiplier": 0.6 - } - }, { "anticondition": { "biomes": [ @@ -961,7 +705,7 @@ "weight": 4.0 }, { - "id": "mire-hatenna-82", + "id": "mire-hatenna-74", "type": "pokemon", "pokemon": "hatenna", "presets": [ @@ -977,7 +721,7 @@ } }, { - "id": "mire-hattrem-83", + "id": "mire-hattrem-75", "type": "pokemon", "pokemon": "hattrem", "presets": [ @@ -1729,6 +1473,21 @@ "type": "pokemon", "weight": 60.0 }, + { + "id": "mire-stunfisk-79", + "type": "pokemon", + "pokemon": "stunfisk galarian", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "25-38", + "weight": 10, + "condition": { + "zone": "mire" + } + }, { "anticondition": { "biomes": [ @@ -2148,7 +1907,22 @@ } }, { - "id": "mire-toedscool-84", + "id": "mire-tauros-78", + "type": "pokemon", + "pokemon": "tauros paldean bull_breed=aqua", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "25-38", + "weight": 10, + "condition": { + "zone": "mire" + } + }, + { + "id": "mire-toedscool-76", "type": "pokemon", "pokemon": "toedscool", "presets": [ @@ -2164,7 +1938,7 @@ } }, { - "id": "mire-toedscruel-85", + "id": "mire-toedscruel-77", "type": "pokemon", "pokemon": "toedscruel", "presets": [ diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/shallows.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/shallows.json index 437f163..aca12ec 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/shallows.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/shallows.json @@ -4,25 +4,6 @@ "neededInstalledMods": [], "neededUninstalledMods": [], "spawns": [ - { - "anticondition": { - "minLureLevel": 1 - }, - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "zone": "shallows" - }, - "id": "shallows-alomomola-2-26", - "level": "5-20", - "pokemon": "alomomola", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 60.0 - }, { "bucket": "uncommon", "condition": { @@ -58,7 +39,7 @@ "isPokeSnack": true, "zone": "shallows" }, - "id": "shallows-carvanha-1-73", + "id": "shallows-carvanha-1-72", "level": "6-20", "pokemon": "carvanha", "presets": [ @@ -80,7 +61,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-carvanha-2-74", + "id": "shallows-carvanha-2-73", "level": "6-20", "pokemon": "carvanha", "presets": [ @@ -99,7 +80,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-carvanha-6-75", + "id": "shallows-carvanha-6-74", "level": "6-20", "pokemon": "carvanha", "spawnablePositionType": "fishing", @@ -132,7 +113,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-carvanha-8-76", + "id": "shallows-carvanha-8-75", "level": "6-20", "pokemon": "carvanha", "spawnablePositionType": "fishing", @@ -154,6 +135,50 @@ } ] }, + { + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_deep_ocean" + ], + "canSeeSky": true, + "isPokeSnack": true, + "maxY": 48, + "zone": "shallows" + }, + "id": "shallows-chinchou-1-30", + "level": "8-20", + "pokemon": "chinchou", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 54.0 + }, + { + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_deep_ocean" + ], + "canSeeSky": false, + "isPokeSnack": true, + "maxSkyLight": 15, + "maxY": 48, + "minSkyLight": 8, + "zone": "shallows" + }, + "id": "shallows-chinchou-2-31", + "level": "8-20", + "pokemon": "chinchou", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 54.0 + }, { "bucket": "common", "condition": { @@ -163,7 +188,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-chinchou-4-27", + "id": "shallows-chinchou-4-32", "level": "8-20", "pokemon": "chinchou", "spawnablePositionType": "fishing", @@ -188,7 +213,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-chinchou-5-28", + "id": "shallows-chinchou-5-33", "level": "8-20", "pokemon": "chinchou", "spawnablePositionType": "fishing", @@ -212,7 +237,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-clobbopus-1-37", + "id": "shallows-clobbopus-1-44", "level": "6-20", "pokemon": "clobbopus", "presets": [ @@ -237,7 +262,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-clobbopus-2-38", + "id": "shallows-clobbopus-2-45", "level": "6-20", "pokemon": "clobbopus", "presets": [ @@ -264,7 +289,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-clobbopus-6-39", + "id": "shallows-clobbopus-6-46", "level": "6-20", "pokemon": "clobbopus", "spawnablePositionType": "fishing", @@ -288,7 +313,7 @@ "minLureLevel": 1, "zone": "shallows" }, - "id": "shallows-clobbopus-7-40", + "id": "shallows-clobbopus-7-47", "level": "6-20", "pokemon": "clobbopus", "spawnablePositionType": "fishing", @@ -320,7 +345,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-clobbopus-8-41", + "id": "shallows-clobbopus-8-48", "level": "6-20", "pokemon": "clobbopus", "spawnablePositionType": "fishing", @@ -346,7 +371,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-clobbopus-9-42", + "id": "shallows-clobbopus-9-49", "level": "6-20", "pokemon": "clobbopus", "spawnablePositionType": "fishing", @@ -397,7 +422,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-cramorant-1-77", + "id": "shallows-cramorant-1-76", "level": "5-20", "pokemon": "cramorant", "spawnablePositionType": "grounded", @@ -428,7 +453,7 @@ "isPokeSnack": true, "zone": "shallows" }, - "id": "shallows-finizen-1-29", + "id": "shallows-finizen-1-34", "level": "7-20", "pokemon": "finizen", "presets": [ @@ -450,7 +475,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-finizen-2-30", + "id": "shallows-finizen-2-35", "level": "7-20", "pokemon": "finizen", "presets": [ @@ -472,7 +497,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-finizen-3-31", + "id": "shallows-finizen-3-36", "level": "7-20", "pokemon": "finizen", "spawnablePositionType": "fishing", @@ -489,7 +514,7 @@ "minLureLevel": 1, "zone": "shallows" }, - "id": "shallows-finizen-4-32", + "id": "shallows-finizen-4-37", "level": "7-20", "pokemon": "finizen", "spawnablePositionType": "fishing", @@ -516,7 +541,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-finizen-5-33", + "id": "shallows-finizen-5-38", "level": "7-20", "pokemon": "finizen", "spawnablePositionType": "fishing", @@ -535,7 +560,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-finizen-6-34", + "id": "shallows-finizen-6-39", "level": "7-20", "pokemon": "finizen", "spawnablePositionType": "fishing", @@ -548,6 +573,50 @@ "multiplier": 3.0 } }, + { + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_deep_ocean" + ], + "canSeeSky": true, + "isPokeSnack": true, + "maxY": 48, + "zone": "shallows" + }, + "id": "shallows-finneon-1-40", + "level": "8-20", + "pokemon": "finneon", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 54.0 + }, + { + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_deep_ocean" + ], + "canSeeSky": false, + "isPokeSnack": true, + "maxSkyLight": 15, + "maxY": 48, + "minSkyLight": 8, + "zone": "shallows" + }, + "id": "shallows-finneon-2-41", + "level": "8-20", + "pokemon": "finneon", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 54.0 + }, { "bucket": "common", "condition": { @@ -557,7 +626,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-finneon-4-35", + "id": "shallows-finneon-4-42", "level": "8-20", "pokemon": "finneon", "spawnablePositionType": "fishing", @@ -575,208 +644,13 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-finneon-5-36", + "id": "shallows-finneon-5-43", "level": "8-20", "pokemon": "finneon", "spawnablePositionType": "fishing", "type": "pokemon", "weight": 90.0 }, - { - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_coast", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "isPokeSnack": true, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "shallows" - }, - "id": "shallows-inkay-1-43", - "level": "5-20", - "pokemon": "inkay", - "presets": [ - "natural", - "wild" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 16.8 - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_beach" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_coast", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "maxSkyLight": 15, - "minLureLevel": 1, - "minSkyLight": 8, - "zone": "shallows" - }, - "id": "shallows-inkay-10-50", - "level": "5-20", - "pokemon": "inkay", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 18.0, - "weightMultiplier": { - "condition": { - "minLureLevel": 3 - }, - "multiplier": 3.0 - } - }, - { - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_coast", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "isPokeSnack": true, - "zone": "shallows" - }, - "id": "shallows-inkay-2-44", - "level": "5-20", - "pokemon": "inkay", - "presets": [ - "wild" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 16.8 - }, - { - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "isPokeSnack": true, - "zone": "shallows" - }, - "id": "shallows-inkay-4-45", - "level": "5-20", - "pokemon": "inkay", - "presets": [ - "water" - ], - "spawnablePositionType": "submerged", - "type": "pokemon", - "weight": 50.4 - }, - { - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "isPokeSnack": true, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "shallows" - }, - "id": "shallows-inkay-5-46", - "level": "5-20", - "pokemon": "inkay", - "presets": [ - "water" - ], - "spawnablePositionType": "submerged", - "type": "pokemon", - "weight": 50.4 - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_beach" - ], - "minLureLevel": 1 - }, - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_coast", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "zone": "shallows" - }, - "id": "shallows-inkay-7-47", - "level": "5-20", - "pokemon": "inkay", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 50.4 - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_beach" - ] - }, - "bucket": "common", - "condition": { - "biomes": [ - "#cobblemon:is_coast", - "#cobblemon:is_ocean" - ], - "canSeeSky": true, - "minLureLevel": 1, - "zone": "shallows" - }, - "id": "shallows-inkay-8-48", - "level": "5-20", - "pokemon": "inkay", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 18.0, - "weightMultiplier": { - "condition": { - "minLureLevel": 3 - }, - "multiplier": 3.0 - } - }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_beach" - ], - "minLureLevel": 1 - }, - "bucket": "uncommon", - "condition": { - "biomes": [ - "#cobblemon:is_coast", - "#cobblemon:is_ocean" - ], - "canSeeSky": false, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "shallows" - }, - "id": "shallows-inkay-9-49", - "level": "5-20", - "pokemon": "inkay", - "spawnablePositionType": "fishing", - "type": "pokemon", - "weight": 50.4 - }, { "bucket": "common", "condition": { @@ -787,7 +661,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-krabby-1-51", + "id": "shallows-krabby-1-50", "level": "8-20", "pokemon": "krabby", "presets": [ @@ -813,7 +687,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-krabby-2-52", + "id": "shallows-krabby-2-51", "level": "8-20", "pokemon": "krabby", "presets": [ @@ -839,7 +713,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-krabby-3-53", + "id": "shallows-krabby-3-52", "level": "8-20", "pokemon": "krabby", "spawnablePositionType": "fishing", @@ -865,7 +739,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-krabby-4-54", + "id": "shallows-krabby-4-53", "level": "8-20", "pokemon": "krabby", "spawnablePositionType": "fishing", @@ -1122,7 +996,7 @@ ], "zone": "shallows" }, - "id": "shallows-pincurchin-1-55", + "id": "shallows-pincurchin-1-54", "level": "19-20", "pokemon": "pincurchin", "presets": [ @@ -1151,7 +1025,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-pincurchin-2-56", + "id": "shallows-pincurchin-2-55", "level": "19-20", "pokemon": "pincurchin", "spawnablePositionType": "fishing", @@ -1169,7 +1043,7 @@ "minLureLevel": 1, "zone": "shallows" }, - "id": "shallows-pincurchin-3-57", + "id": "shallows-pincurchin-3-56", "level": "19-20", "pokemon": "pincurchin", "spawnablePositionType": "fishing", @@ -1197,7 +1071,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-pincurchin-4-58", + "id": "shallows-pincurchin-4-57", "level": "19-20", "pokemon": "pincurchin", "spawnablePositionType": "fishing", @@ -1217,7 +1091,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-pincurchin-5-59", + "id": "shallows-pincurchin-5-58", "level": "19-20", "pokemon": "pincurchin", "spawnablePositionType": "fishing", @@ -1240,7 +1114,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-pyukumuku-1-60", + "id": "shallows-pyukumuku-1-59", "level": "16-20", "pokemon": "pyukumuku", "presets": [ @@ -1266,7 +1140,7 @@ "minY": 48, "zone": "shallows" }, - "id": "shallows-pyukumuku-2-61", + "id": "shallows-pyukumuku-2-60", "level": "16-20", "pokemon": "pyukumuku", "presets": [ @@ -1285,7 +1159,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-pyukumuku-3-62", + "id": "shallows-pyukumuku-3-61", "level": "16-20", "pokemon": "pyukumuku", "presets": [ @@ -1311,7 +1185,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-pyukumuku-4-63", + "id": "shallows-pyukumuku-4-62", "level": "16-20", "pokemon": "pyukumuku", "spawnablePositionType": "fishing", @@ -1342,7 +1216,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-pyukumuku-5-64", + "id": "shallows-pyukumuku-5-63", "level": "16-20", "pokemon": "pyukumuku", "spawnablePositionType": "fishing", @@ -1367,7 +1241,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-pyukumuku-6-65", + "id": "shallows-pyukumuku-6-64", "level": "16-20", "pokemon": "pyukumuku", "spawnablePositionType": "fishing", @@ -1400,7 +1274,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-pyukumuku-7-66", + "id": "shallows-pyukumuku-7-65", "level": "16-20", "pokemon": "pyukumuku", "spawnablePositionType": "fishing", @@ -1438,6 +1312,75 @@ "multiplier": 1.25 } }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_cold_ocean", + "#cobblemon:is_frozen_ocean" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "structures": [ + "#cobblemon:spawns/is_ocean_monument" + ], + "zone": "shallows" + }, + "id": "shallows-qwilfish-10-22", + "level": "19-20", + "pokemon": "qwilfish", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 1000.0, + "weightMultiplier": { + "condition": { + "maxLureLevel": 1, + "minLureLevel": 0 + }, + "multiplier": 0.6 + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_cold_ocean", + "#cobblemon:is_frozen_ocean" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "maxY": 62, + "structures": [ + "#cobblemon:spawns/is_ocean_monument" + ], + "zone": "shallows" + }, + "id": "shallows-qwilfish-2-14", + "level": "19-20", + "pokemon": "qwilfish", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 480.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + }, { "anticondition": { "minLureLevel": 1, @@ -1454,7 +1397,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-qwilfish-3-14", + "id": "shallows-qwilfish-3-15", "level": "19-20", "pokemon": "qwilfish", "spawnablePositionType": "fishing", @@ -1477,7 +1420,7 @@ "minLureLevel": 1, "zone": "shallows" }, - "id": "shallows-qwilfish-4-15", + "id": "shallows-qwilfish-4-16", "level": "19-20", "pokemon": "qwilfish", "spawnablePositionType": "fishing", @@ -1491,6 +1434,38 @@ "multiplier": 0.6 } }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_cold_ocean", + "#cobblemon:is_frozen_ocean" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": true, + "structures": [ + "#cobblemon:spawns/is_ocean_monument" + ], + "zone": "shallows" + }, + "id": "shallows-qwilfish-5-17", + "level": "19-20", + "pokemon": "qwilfish", + "spawnablePositionType": "fishing", + "type": "pokemon", + "weight": 1000.0, + "weightMultiplier": { + "condition": { + "maxLureLevel": 1, + "minLureLevel": 0 + }, + "multiplier": 0.6 + } + }, { "anticondition": { "structures": [ @@ -1508,7 +1483,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-qwilfish-6-16", + "id": "shallows-qwilfish-6-18", "level": "19-20", "pokemon": "qwilfish", "presets": [ @@ -1524,6 +1499,58 @@ "multiplier": 1.25 } }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_cold_ocean", + "#cobblemon:is_frozen_ocean" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_ocean" + ], + "canSeeSky": false, + "maxSkyLight": 15, + "maxY": 62, + "minSkyLight": 8, + "structures": [ + "#cobblemon:spawns/is_ocean_monument" + ], + "zone": "shallows" + }, + "id": "shallows-qwilfish-7-19", + "level": "19-20", + "pokemon": "qwilfish", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "type": "pokemon", + "weight": 480.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + }, + { + "id": "shallows-qwilfish-77", + "type": "pokemon", + "pokemon": "qwilfish hisuian", + "presets": [ + "water" + ], + "spawnablePositionType": "submerged", + "bucket": "rare", + "level": "19-20", + "weight": 10, + "condition": { + "zone": "shallows" + } + }, { "anticondition": { "minLureLevel": 1, @@ -1542,7 +1569,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-qwilfish-8-17", + "id": "shallows-qwilfish-8-20", "level": "19-20", "pokemon": "qwilfish", "spawnablePositionType": "fishing", @@ -1567,7 +1594,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-qwilfish-9-18", + "id": "shallows-qwilfish-9-21", "level": "19-20", "pokemon": "qwilfish", "spawnablePositionType": "fishing", @@ -1633,7 +1660,7 @@ "minX": 0, "zone": "shallows" }, - "id": "shallows-shellos-east-1-19", + "id": "shallows-shellos-east-1-23", "level": "8-20", "pokemon": "shellos sea=east", "presets": [ @@ -1660,7 +1687,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-shellos-west-4-20", + "id": "shallows-shellos-west-4-24", "level": "8-20", "pokemon": "shellos sea=west", "presets": [ @@ -1681,7 +1708,7 @@ "maxX": 0, "zone": "shallows" }, - "id": "shallows-shellos-west-5-21", + "id": "shallows-shellos-west-5-25", "level": "8-20", "pokemon": "shellos sea=west", "presets": [ @@ -1702,7 +1729,7 @@ "maxX": 0, "zone": "shallows" }, - "id": "shallows-shellos-west-6-22", + "id": "shallows-shellos-west-6-26", "level": "8-20", "pokemon": "shellos sea=west", "spawnablePositionType": "fishing", @@ -1729,7 +1756,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-shellos-west-8-23", + "id": "shallows-shellos-west-8-27", "level": "8-20", "pokemon": "shellos sea=west", "spawnablePositionType": "fishing", @@ -1758,7 +1785,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-wiglett-1-24", + "id": "shallows-wiglett-1-28", "level": "5-20", "pokemon": "wiglett", "presets": [ @@ -1784,7 +1811,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-wiglett-2-25", + "id": "shallows-wiglett-2-29", "level": "5-20", "pokemon": "wiglett", "presets": [ @@ -1816,7 +1843,7 @@ "timeRange": "day", "zone": "shallows" }, - "id": "shallows-wingull-1-67", + "id": "shallows-wingull-1-66", "level": "5-20", "pokemon": "wingull", "presets": [ @@ -1841,7 +1868,7 @@ "timeRange": "day", "zone": "shallows" }, - "id": "shallows-wingull-2-68", + "id": "shallows-wingull-2-67", "level": "5-20", "pokemon": "wingull", "presets": [ @@ -1861,7 +1888,7 @@ "isPokeSnack": true, "zone": "shallows" }, - "id": "shallows-wishiwashi-1-69", + "id": "shallows-wishiwashi-1-68", "level": "5-20", "pokemon": "wishiwashi", "presets": [ @@ -1883,7 +1910,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-wishiwashi-2-70", + "id": "shallows-wishiwashi-2-69", "level": "5-20", "pokemon": "wishiwashi", "presets": [ @@ -1903,7 +1930,7 @@ "canSeeSky": true, "zone": "shallows" }, - "id": "shallows-wishiwashi-3-71", + "id": "shallows-wishiwashi-3-70", "level": "5-20", "pokemon": "wishiwashi", "spawnablePositionType": "fishing", @@ -1922,7 +1949,7 @@ "minSkyLight": 8, "zone": "shallows" }, - "id": "shallows-wishiwashi-4-72", + "id": "shallows-wishiwashi-4-71", "level": "5-20", "pokemon": "wishiwashi", "spawnablePositionType": "fishing", diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/southwold.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/southwold.json index 5c6fc29..ec3cc54 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/southwold.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/southwold.json @@ -17,7 +17,7 @@ ], "zone": "southwold" }, - "id": "southwold-audino-2-40", + "id": "southwold-audino-2-44", "level": "10-18", "pokemon": "audino", "presets": [ @@ -37,7 +37,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-audino-3-41", + "id": "southwold-audino-3-45", "level": "10-18", "pokemon": "audino", "presets": [ @@ -320,62 +320,6 @@ "type": "pokemon", "weight": 90.0 }, - { - "bucket": "rare", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "southwold" - }, - "id": "southwold-chansey-1-120", - "level": "17-18", - "pokemon": "chansey", - "presets": [ - "natural", - "urban" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 62.6, - "weightMultiplier": { - "condition": { - "timeRange": "night" - }, - "multiplier": 0.25 - } - }, - { - "bucket": "rare", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "maxSkyLight": 15, - "minSkyLight": 8, - "structures": [ - "#cobblemon:spawns/is_civilization" - ], - "zone": "southwold" - }, - "id": "southwold-chansey-2-121", - "level": "17-18", - "pokemon": "chansey", - "presets": [ - "natural" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 62.6, - "weightMultiplier": { - "condition": { - "timeRange": "night" - }, - "multiplier": 0.25 - } - }, { "anticondition": { "structures": [ @@ -395,7 +339,7 @@ "timeRange": "night", "zone": "southwold" }, - "id": "southwold-chingling-1-46", + "id": "southwold-chingling-1-50", "level": "8-18", "pokemon": "chingling", "presets": [ @@ -423,7 +367,7 @@ "timeRange": "night", "zone": "southwold" }, - "id": "southwold-chingling-4-47", + "id": "southwold-chingling-4-51", "level": "8-18", "pokemon": "chingling", "spawnablePositionType": "grounded", @@ -455,7 +399,7 @@ ], "zone": "southwold" }, - "id": "southwold-corsola-2-101", + "id": "southwold-corsola-2-105", "level": "16-18", "pokemon": "corsola", "presets": [ @@ -476,7 +420,7 @@ ], "zone": "southwold" }, - "id": "southwold-corsola-galarian-6-102", + "id": "southwold-corsola-galarian-6-106", "level": "16-18", "pokemon": "corsola galarian", "presets": [ @@ -503,7 +447,7 @@ ], "zone": "southwold" }, - "id": "southwold-corsola-galarian-7-103", + "id": "southwold-corsola-galarian-7-107", "level": "16-18", "pokemon": "corsola galarian", "presets": [ @@ -538,7 +482,7 @@ "timeRange": "night", "zone": "southwold" }, - "id": "southwold-drifloon-1-76", + "id": "southwold-drifloon-1-80", "level": "10-18", "pokemon": "drifloon", "presets": [ @@ -564,7 +508,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-dunsparce-1-108", + "id": "southwold-dunsparce-1-112", "level": "17-18", "pokemon": "dunsparce", "presets": [ @@ -598,7 +542,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-eevee-1-109", + "id": "southwold-eevee-1-113", "level": "8-18", "pokemon": "eevee", "presets": [ @@ -625,7 +569,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-eevee-2-110", + "id": "southwold-eevee-2-114", "level": "8-18", "pokemon": "eevee", "presets": [ @@ -651,7 +595,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-eevee-3-111", + "id": "southwold-eevee-3-115", "level": "8-18", "pokemon": "eevee", "presets": [ @@ -681,7 +625,7 @@ ], "zone": "southwold" }, - "id": "southwold-eevee-4-112", + "id": "southwold-eevee-4-116", "level": "8-18", "pokemon": "eevee", "presets": [ @@ -711,7 +655,7 @@ ], "zone": "southwold" }, - "id": "southwold-farfetchd-1-99", + "id": "southwold-farfetchd-1-103", "level": "13-18", "pokemon": "farfetchd", "presets": [ @@ -744,7 +688,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-farfetchd-galarian-2-100", + "id": "southwold-farfetchd-galarian-2-104", "level": "13-18", "pokemon": "farfetchd galarian", "presets": [ @@ -779,7 +723,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-furfrou-1-50", + "id": "southwold-furfrou-1-54", "level": "8-18", "pokemon": "furfrou", "presets": [ @@ -831,7 +775,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-gastly-1-85", + "id": "southwold-gastly-1-89", "level": "8-18", "pokemon": "gastly", "presets": [ @@ -861,7 +805,7 @@ "canSeeSky": false, "zone": "southwold" }, - "id": "southwold-gastly-2-86", + "id": "southwold-gastly-2-90", "level": "8-18", "pokemon": "gastly", "presets": [ @@ -894,7 +838,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-glameow-1-42", + "id": "southwold-glameow-1-46", "level": "8-18", "pokemon": "glameow", "presets": [ @@ -931,7 +875,7 @@ ], "zone": "southwold" }, - "id": "southwold-glameow-2-43", + "id": "southwold-glameow-2-47", "level": "8-18", "pokemon": "glameow", "presets": [ @@ -1056,7 +1000,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-grimer-2-77", + "id": "southwold-grimer-2-81", "level": "8-18", "pokemon": "grimer", "presets": [ @@ -1099,7 +1043,7 @@ ], "zone": "southwold" }, - "id": "southwold-grimer-3-78", + "id": "southwold-grimer-3-82", "level": "8-18", "pokemon": "grimer", "presets": [ @@ -1137,7 +1081,7 @@ "canSeeSky": true, "zone": "southwold" }, - "id": "southwold-grimer-5-79", + "id": "southwold-grimer-5-83", "level": "8-18", "pokemon": "grimer", "presets": [ @@ -1180,7 +1124,7 @@ ], "zone": "southwold" }, - "id": "southwold-grimer-6-80", + "id": "southwold-grimer-6-84", "level": "8-18", "pokemon": "grimer", "presets": [ @@ -1221,7 +1165,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-grimer-8-81", + "id": "southwold-grimer-8-85", "level": "8-18", "pokemon": "grimer", "presets": [ @@ -1266,7 +1210,7 @@ ], "zone": "southwold" }, - "id": "southwold-grimer-9-82", + "id": "southwold-grimer-9-86", "level": "8-18", "pokemon": "grimer", "presets": [ @@ -1301,7 +1245,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-grimer-alolan-10-83", + "id": "southwold-grimer-alolan-10-87", "level": "8-18", "pokemon": "grimer alolan", "presets": [ @@ -1339,7 +1283,7 @@ ], "zone": "southwold" }, - "id": "southwold-grimer-alolan-11-84", + "id": "southwold-grimer-alolan-11-88", "level": "8-18", "pokemon": "grimer alolan", "presets": [ @@ -1376,7 +1320,7 @@ ], "zone": "southwold" }, - "id": "southwold-grubbin-2-94", + "id": "southwold-grubbin-2-98", "level": "8-18", "pokemon": "grubbin", "presets": [ @@ -1392,64 +1336,6 @@ "multiplier": 5.0 } }, - { - "bucket": "rare", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "isPokeSnack": true, - "maxSkyLight": 15, - "minSkyLight": 8, - "zone": "southwold" - }, - "id": "southwold-happiny-1-122", - "level": "8-18", - "pokemon": "happiny", - "presets": [ - "natural", - "urban" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 34.0, - "weightMultiplier": { - "condition": { - "timeRange": "night" - }, - "multiplier": 0.25 - } - }, - { - "bucket": "rare", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "isPokeSnack": true, - "maxSkyLight": 15, - "minSkyLight": 8, - "structures": [ - "#cobblemon:spawns/is_civilization" - ], - "zone": "southwold" - }, - "id": "southwold-happiny-2-123", - "level": "8-18", - "pokemon": "happiny", - "presets": [ - "natural" - ], - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 34.0, - "weightMultiplier": { - "condition": { - "timeRange": "night" - }, - "multiplier": 0.25 - } - }, { "anticondition": { "structures": [ @@ -1465,7 +1351,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-hawlucha-2-93", + "id": "southwold-hawlucha-2-97", "level": "8-18", "pokemon": "hawlucha", "presets": [ @@ -1501,7 +1387,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-heracross-1-88", + "id": "southwold-heracross-1-92", "level": "8-18", "pokemon": "heracross", "presets": [ @@ -1534,7 +1420,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-herdier-1-91", + "id": "southwold-herdier-1-95", "level": "16-18", "pokemon": "herdier", "presets": [ @@ -1569,7 +1455,7 @@ ], "zone": "southwold" }, - "id": "southwold-herdier-2-92", + "id": "southwold-herdier-2-96", "level": "16-18", "pokemon": "herdier", "presets": [ @@ -1601,7 +1487,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-koffing-1-68", + "id": "southwold-koffing-1-72", "level": "9-18", "pokemon": "koffing", "presets": [ @@ -1645,7 +1531,7 @@ ], "zone": "southwold" }, - "id": "southwold-koffing-2-69", + "id": "southwold-koffing-2-73", "level": "9-18", "pokemon": "koffing", "presets": [ @@ -1684,7 +1570,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-lillipup-1-89", + "id": "southwold-lillipup-1-93", "level": "8-18", "pokemon": "lillipup", "presets": [ @@ -1713,7 +1599,7 @@ ], "zone": "southwold" }, - "id": "southwold-lillipup-2-90", + "id": "southwold-lillipup-2-94", "level": "8-18", "pokemon": "lillipup", "presets": [ @@ -1741,7 +1627,7 @@ ], "zone": "southwold" }, - "id": "southwold-lombre-3-54", + "id": "southwold-lombre-3-58", "level": "14-18", "pokemon": "lombre", "presets": [ @@ -1769,7 +1655,7 @@ "isRaining": true, "zone": "southwold" }, - "id": "southwold-lombre-4-55", + "id": "southwold-lombre-4-59", "level": "14-18", "pokemon": "lombre", "spawnablePositionType": "fishing", @@ -1797,7 +1683,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-lombre-5-56", + "id": "southwold-lombre-5-60", "level": "14-18", "pokemon": "lombre", "spawnablePositionType": "fishing", @@ -1829,7 +1715,7 @@ ], "zone": "southwold" }, - "id": "southwold-lotad-3-51", + "id": "southwold-lotad-3-55", "level": "8-18", "pokemon": "lotad", "presets": [ @@ -1857,7 +1743,7 @@ "isRaining": true, "zone": "southwold" }, - "id": "southwold-lotad-4-52", + "id": "southwold-lotad-4-56", "level": "8-18", "pokemon": "lotad", "spawnablePositionType": "fishing", @@ -1885,7 +1771,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-lotad-5-53", + "id": "southwold-lotad-5-57", "level": "8-18", "pokemon": "lotad", "spawnablePositionType": "fishing", @@ -1913,7 +1799,7 @@ ], "zone": "southwold" }, - "id": "southwold-magnemite-1-116", + "id": "southwold-magnemite-1-120", "level": "8-18", "pokemon": "magnemite", "presets": [ @@ -1942,7 +1828,7 @@ ], "zone": "southwold" }, - "id": "southwold-magnemite-2-117", + "id": "southwold-magnemite-2-121", "level": "8-18", "pokemon": "magnemite", "spawnablePositionType": "grounded", @@ -2080,6 +1966,181 @@ "multiplier": 0.6 } }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_arid", + "#cobblemon:is_freezing", + "#cobblemon:is_taiga" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "isRaining": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "southwold" + }, + "id": "southwold-meowth-1-40", + "level": "8-18", + "pokemon": "meowth", + "presets": [ + "natural", + "urban" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 72.0, + "weightMultipliers": [ + { + "condition": { + "timeRange": "night" + }, + "multiplier": 1.5 + }, + { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + ] + }, + { + "id": "southwold-meowth-128", + "type": "pokemon", + "pokemon": "meowth galarian", + "presets": [ + "natural", + "urban" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "8-18", + "weight": 10, + "condition": { + "zone": "southwold" + } + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_arid", + "#cobblemon:is_freezing", + "#cobblemon:is_taiga" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "isRaining": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "structures": [ + "#cobblemon:spawns/is_civilization" + ], + "zone": "southwold" + }, + "id": "southwold-meowth-2-41", + "level": "8-18", + "pokemon": "meowth", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 72.0, + "weightMultipliers": [ + { + "condition": { + "timeRange": "night" + }, + "multiplier": 1.5 + }, + { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + ] + }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_arid", + "#cobblemon:is_freezing" + ] + }, + "bucket": "common", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "isRaining": false, + "maxSkyLight": 15, + "minSkyLight": 8, + "minY": 62, + "structures": [ + "#cobblemon:spawns/is_illager_structure" + ], + "zone": "southwold" + }, + "id": "southwold-meowth-alolan-5-42", + "level": "8-18", + "pokemon": "meowth alolan", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 432.0, + "weightMultipliers": [ + { + "condition": { + "timeRange": "night" + }, + "multiplier": 1.5 + }, + { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + ] + }, + { + "bucket": "uncommon", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "canSeeSky": false, + "minY": 62, + "structures": [ + "#cobblemon:spawns/is_illager_structure" + ], + "zone": "southwold" + }, + "id": "southwold-meowth-alolan-7-43", + "level": "8-18", + "pokemon": "meowth alolan", + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 144.0, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 1.25 + } + }, { "anticondition": { "biomes": [ @@ -2096,7 +2157,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-minccino-2-48", + "id": "southwold-minccino-2-52", "level": "8-18", "pokemon": "minccino", "presets": [ @@ -2132,7 +2193,7 @@ ], "zone": "southwold" }, - "id": "southwold-minccino-3-49", + "id": "southwold-minccino-3-53", "level": "8-18", "pokemon": "minccino", "presets": [ @@ -2203,7 +2264,7 @@ } }, { - "id": "southwold-nidoranf-124", + "id": "southwold-nidoranf-123", "type": "pokemon", "pokemon": "nidoranf", "presets": [ @@ -2219,7 +2280,7 @@ } }, { - "id": "southwold-nidoranm-126", + "id": "southwold-nidoranm-125", "type": "pokemon", "pokemon": "nidoranm", "presets": [ @@ -2235,7 +2296,7 @@ } }, { - "id": "southwold-nidorina-125", + "id": "southwold-nidorina-124", "type": "pokemon", "pokemon": "nidorina", "presets": [ @@ -2251,7 +2312,7 @@ } }, { - "id": "southwold-nidorino-127", + "id": "southwold-nidorino-126", "type": "pokemon", "pokemon": "nidorino", "presets": [ @@ -2266,35 +2327,6 @@ "zone": "southwold" } }, - { - "anticondition": { - "biomes": [ - "#cobblemon:is_deep_dark" - ] - }, - "bucket": "rare", - "condition": { - "biomes": [ - "#cobblemon:is_overworld" - ], - "maxSkyLight": 7, - "maxY": 0, - "minSkyLight": 0, - "zone": "southwold" - }, - "id": "southwold-noibat-2-119", - "level": "8-18", - "pokemon": "noibat", - "spawnablePositionType": "grounded", - "type": "pokemon", - "weight": 37.5, - "weightMultiplier": { - "condition": { - "isPokeSnack": true - }, - "multiplier": 2.0 - } - }, { "bucket": "common", "condition": { @@ -2334,7 +2366,7 @@ "timeRange": "day", "zone": "southwold" }, - "id": "southwold-pidove-1-61", + "id": "southwold-pidove-1-65", "level": "8-18", "pokemon": "pidove", "presets": [ @@ -2363,7 +2395,7 @@ "timeRange": "day", "zone": "southwold" }, - "id": "southwold-pidove-2-62", + "id": "southwold-pidove-2-66", "level": "8-18", "pokemon": "pidove", "presets": [ @@ -2395,7 +2427,7 @@ "timeRange": "day", "zone": "southwold" }, - "id": "southwold-pidove-3-63", + "id": "southwold-pidove-3-67", "level": "8-18", "pokemon": "pidove", "presets": [ @@ -2424,7 +2456,7 @@ ], "zone": "southwold" }, - "id": "southwold-pinsir-2-87", + "id": "southwold-pinsir-2-91", "level": "8-18", "pokemon": "pinsir", "presets": [ @@ -2505,7 +2537,7 @@ ], "zone": "southwold" }, - "id": "southwold-porygon-1-118", + "id": "southwold-porygon-1-122", "level": "15-18", "pokemon": "porygon", "spawnablePositionType": "grounded", @@ -2525,7 +2557,7 @@ "timeRange": "night", "zone": "southwold" }, - "id": "southwold-pumpkaboo-1-75", + "id": "southwold-pumpkaboo-1-79", "level": "9-18", "pokemon": "pumpkaboo", "presets": [ @@ -2559,7 +2591,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-relicanth-3-60", + "id": "southwold-relicanth-3-64", "level": "8-18", "pokemon": "relicanth", "presets": [ @@ -2610,7 +2642,7 @@ "timeRange": "night", "zone": "southwold" }, - "id": "southwold-shuppet-2-44", + "id": "southwold-shuppet-2-48", "level": "8-18", "pokemon": "shuppet", "presets": [ @@ -2641,7 +2673,7 @@ "timeRange": "night", "zone": "southwold" }, - "id": "southwold-shuppet-3-45", + "id": "southwold-shuppet-3-49", "level": "8-18", "pokemon": "shuppet", "presets": [ @@ -2658,7 +2690,7 @@ } }, { - "id": "southwold-smoliv-128", + "id": "southwold-smoliv-127", "type": "pokemon", "pokemon": "smoliv", "presets": [ @@ -2948,7 +2980,7 @@ "minY": 96, "zone": "southwold" }, - "id": "southwold-swablu-1-71", + "id": "southwold-swablu-1-75", "level": "8-18", "pokemon": "swablu", "presets": [ @@ -2985,7 +3017,7 @@ "minY": 192, "zone": "southwold" }, - "id": "southwold-swablu-2-72", + "id": "southwold-swablu-2-76", "level": "8-18", "pokemon": "swablu", "presets": [ @@ -3054,7 +3086,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-tentacool-2-104", + "id": "southwold-tentacool-2-108", "level": "9-18", "pokemon": "tentacool", "presets": [ @@ -3093,7 +3125,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-tentacool-5-105", + "id": "southwold-tentacool-5-109", "level": "9-18", "pokemon": "tentacool", "spawnablePositionType": "fishing", @@ -3123,7 +3155,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-timburr-1-97", + "id": "southwold-timburr-1-101", "level": "8-18", "pokemon": "timburr", "presets": [ @@ -3167,7 +3199,7 @@ ], "zone": "southwold" }, - "id": "southwold-timburr-2-98", + "id": "southwold-timburr-2-102", "level": "8-18", "pokemon": "timburr", "presets": [ @@ -3202,7 +3234,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-toxel-1-95", + "id": "southwold-toxel-1-99", "level": "8-18", "pokemon": "toxel", "presets": [ @@ -3223,7 +3255,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-toxel-2-96", + "id": "southwold-toxel-2-100", "level": "8-18", "pokemon": "toxel", "presets": [ @@ -3262,7 +3294,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-tynamo-2-106", + "id": "southwold-tynamo-2-110", "level": "8-18", "pokemon": "tynamo", "presets": [ @@ -3287,7 +3319,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-tynamo-5-107", + "id": "southwold-tynamo-5-111", "level": "8-18", "pokemon": "tynamo", "spawnablePositionType": "fishing", @@ -3401,7 +3433,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-voltorb-1-64", + "id": "southwold-voltorb-1-68", "level": "8-18", "pokemon": "voltorb", "presets": [ @@ -3439,7 +3471,7 @@ ], "zone": "southwold" }, - "id": "southwold-voltorb-2-65", + "id": "southwold-voltorb-2-69", "level": "8-18", "pokemon": "voltorb", "presets": [ @@ -3476,7 +3508,7 @@ ], "zone": "southwold" }, - "id": "southwold-voltorb-3-66", + "id": "southwold-voltorb-3-70", "level": "8-18", "pokemon": "voltorb", "spawnablePositionType": "grounded", @@ -3510,7 +3542,7 @@ ], "zone": "southwold" }, - "id": "southwold-voltorb-hisuian-4-67", + "id": "southwold-voltorb-hisuian-4-71", "level": "8-18", "pokemon": "voltorb hisuian", "presets": [ @@ -3551,7 +3583,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-whismur-2-70", + "id": "southwold-whismur-2-74", "level": "8-18", "pokemon": "whismur", "presets": [ @@ -3586,7 +3618,7 @@ ], "zone": "southwold" }, - "id": "southwold-wimpod-3-113", + "id": "southwold-wimpod-3-117", "level": "8-18", "pokemon": "wimpod", "presets": [ @@ -3618,7 +3650,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-wimpod-4-114", + "id": "southwold-wimpod-4-118", "level": "8-18", "pokemon": "wimpod", "presets": [ @@ -3649,7 +3681,7 @@ "minSkyLight": 0, "zone": "southwold" }, - "id": "southwold-wimpod-7-115", + "id": "southwold-wimpod-7-119", "level": "8-18", "pokemon": "wimpod", "spawnablePositionType": "fishing", @@ -3676,7 +3708,7 @@ ], "zone": "southwold" }, - "id": "southwold-yamask-2-57", + "id": "southwold-yamask-2-61", "level": "8-18", "pokemon": "yamask", "presets": [ @@ -3703,7 +3735,7 @@ ], "zone": "southwold" }, - "id": "southwold-yamask-galarian-3-58", + "id": "southwold-yamask-galarian-3-62", "level": "8-18", "pokemon": "yamask galarian", "spawnablePositionType": "grounded", @@ -3728,7 +3760,7 @@ ], "zone": "southwold" }, - "id": "southwold-yamask-galarian-4-59", + "id": "southwold-yamask-galarian-4-63", "level": "8-18", "pokemon": "yamask galarian", "spawnablePositionType": "grounded", @@ -3750,7 +3782,7 @@ "minSkyLight": 8, "zone": "southwold" }, - "id": "southwold-yamper-1-73", + "id": "southwold-yamper-1-77", "level": "8-18", "pokemon": "yamper", "presets": [ @@ -3785,7 +3817,7 @@ ], "zone": "southwold" }, - "id": "southwold-yamper-2-74", + "id": "southwold-yamper-2-78", "level": "8-18", "pokemon": "yamper", "presets": [ @@ -3862,6 +3894,22 @@ "multiplier": 2.0 } ] + }, + { + "id": "southwold-zigzagoon-129", + "type": "pokemon", + "pokemon": "zigzagoon galarian", + "presets": [ + "natural", + "wild" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "8-18", + "weight": 10, + "condition": { + "zone": "southwold" + } } ] } diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/sunscorch.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/sunscorch.json index f80adf2..797bcae 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/sunscorch.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/sunscorch.json @@ -780,6 +780,21 @@ "zone": "sunscorch" } }, + { + "id": "sunscorch-growlithe-83", + "type": "pokemon", + "pokemon": "growlithe hisuian", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "30-45", + "weight": 10, + "condition": { + "zone": "sunscorch" + } + }, { "bucket": "common", "condition": { @@ -2020,6 +2035,21 @@ "multiplier": 1.5 } }, + { + "id": "sunscorch-tauros-82", + "type": "pokemon", + "pokemon": "tauros paldean bull_breed=blaze", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "30-45", + "weight": 10, + "condition": { + "zone": "sunscorch" + } + }, { "bucket": "ultra-rare", "condition": { diff --git a/datapacks/core/data/cobblesurvival/spawn_pool_world/westmarch.json b/datapacks/core/data/cobblesurvival/spawn_pool_world/westmarch.json index 2cfa941..9f12191 100644 --- a/datapacks/core/data/cobblesurvival/spawn_pool_world/westmarch.json +++ b/datapacks/core/data/cobblesurvival/spawn_pool_world/westmarch.json @@ -23,7 +23,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-appletun-1-102", + "id": "westmarch-appletun-1-107", "level": "21-25", "pokemon": "appletun", "presets": [ @@ -51,7 +51,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-appletun-2-103", + "id": "westmarch-appletun-2-108", "level": "21-25", "pokemon": "appletun", "presets": [ @@ -80,7 +80,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-applin-1-98", + "id": "westmarch-applin-1-103", "level": "15-25", "pokemon": "applin", "presets": [ @@ -108,7 +108,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-applin-2-99", + "id": "westmarch-applin-2-104", "level": "15-25", "pokemon": "applin", "presets": [ @@ -350,6 +350,62 @@ "type": "pokemon", "weight": 27.0 }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "westmarch" + }, + "id": "westmarch-chansey-1-46", + "level": "17-25", + "pokemon": "chansey", + "presets": [ + "natural", + "urban" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 62.6, + "weightMultiplier": { + "condition": { + "timeRange": "night" + }, + "multiplier": 0.25 + } + }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "maxSkyLight": 15, + "minSkyLight": 8, + "structures": [ + "#cobblemon:spawns/is_civilization" + ], + "zone": "westmarch" + }, + "id": "westmarch-chansey-2-47", + "level": "17-25", + "pokemon": "chansey", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 62.6, + "weightMultiplier": { + "condition": { + "timeRange": "night" + }, + "multiplier": 0.25 + } + }, { "anticondition": { "biomes": [ @@ -482,7 +538,7 @@ ] }, { - "id": "westmarch-dedenne-142", + "id": "westmarch-dedenne-147", "type": "pokemon", "pokemon": "dedenne", "presets": [ @@ -715,7 +771,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-dipplin-1-104", + "id": "westmarch-dipplin-1-109", "level": "24-25", "pokemon": "dipplin", "presets": [ @@ -743,7 +799,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-dipplin-2-105", + "id": "westmarch-dipplin-2-110", "level": "24-25", "pokemon": "dipplin", "presets": [ @@ -771,7 +827,7 @@ "minY": -31, "zone": "westmarch" }, - "id": "westmarch-dratini-1-120", + "id": "westmarch-dratini-1-125", "level": "15-25", "pokemon": "dratini", "presets": [ @@ -805,7 +861,7 @@ "minY": -31, "zone": "westmarch" }, - "id": "westmarch-dratini-2-121", + "id": "westmarch-dratini-2-126", "level": "15-25", "pokemon": "dratini", "presets": [ @@ -840,7 +896,7 @@ "minY": -31, "zone": "westmarch" }, - "id": "westmarch-dratini-3-122", + "id": "westmarch-dratini-3-127", "level": "15-25", "pokemon": "dratini", "spawnablePositionType": "fishing", @@ -864,7 +920,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-dratini-4-123", + "id": "westmarch-dratini-4-128", "level": "15-25", "pokemon": "dratini", "presets": [ @@ -897,7 +953,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-dratini-5-124", + "id": "westmarch-dratini-5-129", "level": "15-25", "pokemon": "dratini", "presets": [ @@ -931,7 +987,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-dratini-6-125", + "id": "westmarch-dratini-6-130", "level": "15-25", "pokemon": "dratini", "spawnablePositionType": "fishing", @@ -939,7 +995,7 @@ "weight": 16.8 }, { - "id": "westmarch-emolga-143", + "id": "westmarch-emolga-148", "type": "pokemon", "pokemon": "emolga", "presets": [ @@ -968,7 +1024,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flabebe-blue-4-111", + "id": "westmarch-flabebe-blue-4-116", "level": "15-25", "pokemon": "flabebe flower=blue", "presets": [ @@ -998,7 +1054,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flabebe-orange-3-110", + "id": "westmarch-flabebe-orange-3-115", "level": "15-25", "pokemon": "flabebe flower=orange", "presets": [ @@ -1028,7 +1084,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flabebe-pink-6-113", + "id": "westmarch-flabebe-pink-6-118", "level": "15-25", "pokemon": "flabebe flower=pink", "presets": [ @@ -1058,7 +1114,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flabebe-red-1-108", + "id": "westmarch-flabebe-red-1-113", "level": "15-25", "pokemon": "flabebe flower=red", "presets": [ @@ -1088,7 +1144,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flabebe-white-5-112", + "id": "westmarch-flabebe-white-5-117", "level": "15-25", "pokemon": "flabebe flower=white", "presets": [ @@ -1118,7 +1174,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flabebe-yellow-2-109", + "id": "westmarch-flabebe-yellow-2-114", "level": "15-25", "pokemon": "flabebe flower=yellow", "presets": [ @@ -1153,7 +1209,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flapple-1-100", + "id": "westmarch-flapple-1-105", "level": "21-25", "pokemon": "flapple", "presets": [ @@ -1181,7 +1237,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-flapple-2-101", + "id": "westmarch-flapple-2-106", "level": "21-25", "pokemon": "flapple", "presets": [ @@ -1205,7 +1261,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-floette-blue-4-117", + "id": "westmarch-floette-blue-4-122", "level": "19-25", "pokemon": "floette flower=blue", "presets": [ @@ -1235,7 +1291,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-floette-orange-3-116", + "id": "westmarch-floette-orange-3-121", "level": "19-25", "pokemon": "floette flower=orange", "presets": [ @@ -1265,7 +1321,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-floette-pink-6-119", + "id": "westmarch-floette-pink-6-124", "level": "19-25", "pokemon": "floette flower=pink", "presets": [ @@ -1295,7 +1351,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-floette-red-1-114", + "id": "westmarch-floette-red-1-119", "level": "19-25", "pokemon": "floette flower=red", "presets": [ @@ -1325,7 +1381,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-floette-white-5-118", + "id": "westmarch-floette-white-5-123", "level": "19-25", "pokemon": "floette flower=white", "presets": [ @@ -1355,7 +1411,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-floette-yellow-2-115", + "id": "westmarch-floette-yellow-2-120", "level": "19-25", "pokemon": "floette flower=yellow", "presets": [ @@ -1383,7 +1439,7 @@ "minY": 0, "zone": "westmarch" }, - "id": "westmarch-gabite-1-130", + "id": "westmarch-gabite-1-135", "level": "24-25", "pokemon": "gabite", "presets": [ @@ -1404,7 +1460,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-gabite-2-131", + "id": "westmarch-gabite-2-136", "level": "24-25", "pokemon": "gabite", "presets": [ @@ -1437,7 +1493,7 @@ "minY": 0, "zone": "westmarch" }, - "id": "westmarch-gabite-3-132", + "id": "westmarch-gabite-3-137", "level": "24-25", "pokemon": "gabite", "presets": [ @@ -1469,7 +1525,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-gabite-4-133", + "id": "westmarch-gabite-4-138", "level": "24-25", "pokemon": "gabite", "presets": [ @@ -1479,6 +1535,21 @@ "type": "pokemon", "weight": 18.0 }, + { + "id": "westmarch-geodude-151", + "type": "pokemon", + "pokemon": "geodude alolan", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "bucket": "rare", + "level": "15-25", + "weight": 10, + "condition": { + "zone": "westmarch" + } + }, { "bucket": "rare", "condition": { @@ -1491,7 +1562,7 @@ "minY": 0, "zone": "westmarch" }, - "id": "westmarch-gible-1-126", + "id": "westmarch-gible-1-131", "level": "15-25", "pokemon": "gible", "presets": [ @@ -1512,7 +1583,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-gible-2-127", + "id": "westmarch-gible-2-132", "level": "15-25", "pokemon": "gible", "presets": [ @@ -1545,7 +1616,7 @@ "minY": 0, "zone": "westmarch" }, - "id": "westmarch-gible-3-128", + "id": "westmarch-gible-3-133", "level": "15-25", "pokemon": "gible", "presets": [ @@ -1577,7 +1648,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-gible-4-129", + "id": "westmarch-gible-4-134", "level": "15-25", "pokemon": "gible", "presets": [ @@ -1607,7 +1678,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-goomy-6-134", + "id": "westmarch-goomy-6-139", "level": "15-25", "pokemon": "goomy", "spawnablePositionType": "fishing", @@ -1633,7 +1704,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-12-137", + "id": "westmarch-goomy-hisui-12-142", "level": "15-25", "pokemon": "goomy region_bias=hisui", "spawnablePositionType": "fishing", @@ -1660,7 +1731,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-13-138", + "id": "westmarch-goomy-hisui-13-143", "level": "15-25", "pokemon": "goomy region_bias=hisui", "spawnablePositionType": "fishing", @@ -1686,7 +1757,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-14-139", + "id": "westmarch-goomy-hisui-14-144", "level": "15-25", "pokemon": "goomy region_bias=hisui", "spawnablePositionType": "fishing", @@ -1712,7 +1783,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-15-140", + "id": "westmarch-goomy-hisui-15-145", "level": "15-25", "pokemon": "goomy region_bias=hisui", "spawnablePositionType": "fishing", @@ -1738,7 +1809,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-16-141", + "id": "westmarch-goomy-hisui-16-146", "level": "15-25", "pokemon": "goomy region_bias=hisui", "spawnablePositionType": "fishing", @@ -1772,7 +1843,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-8-135", + "id": "westmarch-goomy-hisui-8-140", "level": "15-25", "pokemon": "goomy region_bias=hisui", "presets": [ @@ -1800,7 +1871,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-goomy-hisui-9-136", + "id": "westmarch-goomy-hisui-9-141", "level": "15-25", "pokemon": "goomy region_bias=hisui", "presets": [ @@ -1843,7 +1914,7 @@ "isPokeSnack": true, "zone": "westmarch" }, - "id": "westmarch-gyarados-1-91", + "id": "westmarch-gyarados-1-96", "level": "20-25", "pokemon": "gyarados", "presets": [ @@ -1866,7 +1937,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-gyarados-2-92", + "id": "westmarch-gyarados-2-97", "level": "20-25", "pokemon": "gyarados", "presets": [ @@ -1888,7 +1959,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-gyarados-3-93", + "id": "westmarch-gyarados-3-98", "level": "20-25", "pokemon": "gyarados", "presets": [ @@ -1908,7 +1979,7 @@ "canSeeSky": true, "zone": "westmarch" }, - "id": "westmarch-gyarados-4-94", + "id": "westmarch-gyarados-4-99", "level": "20-25", "pokemon": "gyarados", "spawnablePositionType": "fishing", @@ -1927,13 +1998,71 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-gyarados-5-95", + "id": "westmarch-gyarados-5-100", "level": "20-25", "pokemon": "gyarados", "spawnablePositionType": "fishing", "type": "pokemon", "weight": 10.0 }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "isPokeSnack": true, + "maxSkyLight": 15, + "minSkyLight": 8, + "zone": "westmarch" + }, + "id": "westmarch-happiny-1-48", + "level": "15-25", + "pokemon": "happiny", + "presets": [ + "natural", + "urban" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 34.0, + "weightMultiplier": { + "condition": { + "timeRange": "night" + }, + "multiplier": 0.25 + } + }, + { + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "isPokeSnack": true, + "maxSkyLight": 15, + "minSkyLight": 8, + "structures": [ + "#cobblemon:spawns/is_civilization" + ], + "zone": "westmarch" + }, + "id": "westmarch-happiny-2-49", + "level": "15-25", + "pokemon": "happiny", + "presets": [ + "natural" + ], + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 34.0, + "weightMultiplier": { + "condition": { + "timeRange": "night" + }, + "multiplier": 0.25 + } + }, { "anticondition": { "biomes": [ @@ -2016,7 +2145,7 @@ "isPokeSnack": true, "zone": "westmarch" }, - "id": "westmarch-magikarp-1-45", + "id": "westmarch-magikarp-1-50", "level": "15-25", "pokemon": "magikarp", "presets": [ @@ -2039,7 +2168,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-2-46", + "id": "westmarch-magikarp-2-51", "level": "15-25", "pokemon": "magikarp", "presets": [ @@ -2061,7 +2190,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-3-47", + "id": "westmarch-magikarp-3-52", "level": "15-25", "pokemon": "magikarp", "presets": [ @@ -2081,7 +2210,7 @@ "canSeeSky": true, "zone": "westmarch" }, - "id": "westmarch-magikarp-4-48", + "id": "westmarch-magikarp-4-53", "level": "15-25", "pokemon": "magikarp", "spawnablePositionType": "fishing", @@ -2100,7 +2229,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-5-49", + "id": "westmarch-magikarp-5-54", "level": "15-25", "pokemon": "magikarp", "spawnablePositionType": "fishing", @@ -2117,7 +2246,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-apricot-stripes-15-71", + "id": "westmarch-magikarp-apricot-stripes-15-76", "level": "15-25", "pokemon": "magikarp magikarp_jump=apricot-stripes", "spawnablePositionType": "fishing", @@ -2155,7 +2284,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-apricot-tiger-15-69", + "id": "westmarch-magikarp-apricot-tiger-15-74", "level": "15-25", "pokemon": "magikarp magikarp_jump=apricot-tiger", "spawnablePositionType": "fishing", @@ -2193,7 +2322,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-apricot-zebra-15-70", + "id": "westmarch-magikarp-apricot-zebra-15-75", "level": "15-25", "pokemon": "magikarp magikarp_jump=apricot-zebra", "spawnablePositionType": "fishing", @@ -2232,7 +2361,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-black-forehead-20-81", + "id": "westmarch-magikarp-black-forehead-20-86", "level": "15-25", "pokemon": "magikarp magikarp_jump=black-forehead", "spawnablePositionType": "fishing", @@ -2275,7 +2404,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-magikarp-black-forehead-21-83", + "id": "westmarch-magikarp-black-forehead-21-88", "level": "15-25", "pokemon": "magikarp magikarp_jump=black-forehead", "spawnablePositionType": "fishing", @@ -2295,7 +2424,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-black-forehead-22-85", + "id": "westmarch-magikarp-black-forehead-22-90", "level": "15-25", "pokemon": "magikarp magikarp_jump=black-forehead", "spawnablePositionType": "fishing", @@ -2332,7 +2461,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-black-mask-20-82", + "id": "westmarch-magikarp-black-mask-20-87", "level": "15-25", "pokemon": "magikarp magikarp_jump=black-mask", "spawnablePositionType": "fishing", @@ -2375,7 +2504,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-magikarp-black-mask-21-84", + "id": "westmarch-magikarp-black-mask-21-89", "level": "15-25", "pokemon": "magikarp magikarp_jump=black-mask", "spawnablePositionType": "fishing", @@ -2395,7 +2524,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-black-mask-22-86", + "id": "westmarch-magikarp-black-mask-22-91", "level": "15-25", "pokemon": "magikarp magikarp_jump=black-mask", "spawnablePositionType": "fishing", @@ -2431,7 +2560,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-blue-raindrops-23-88", + "id": "westmarch-magikarp-blue-raindrops-23-93", "level": "15-25", "pokemon": "magikarp magikarp_jump=blue-raindrops", "spawnablePositionType": "fishing", @@ -2468,7 +2597,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-blue-saucy-23-87", + "id": "westmarch-magikarp-blue-saucy-23-92", "level": "15-25", "pokemon": "magikarp magikarp_jump=blue-saucy", "spawnablePositionType": "fishing", @@ -2505,7 +2634,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-brown-stripes-16-74", + "id": "westmarch-magikarp-brown-stripes-16-79", "level": "15-25", "pokemon": "magikarp magikarp_jump=brown-stripes", "spawnablePositionType": "fishing", @@ -2543,7 +2672,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-brown-tiger-16-72", + "id": "westmarch-magikarp-brown-tiger-16-77", "level": "15-25", "pokemon": "magikarp magikarp_jump=brown-tiger", "spawnablePositionType": "fishing", @@ -2581,7 +2710,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-brown-zebra-16-73", + "id": "westmarch-magikarp-brown-zebra-16-78", "level": "15-25", "pokemon": "magikarp magikarp_jump=brown-zebra", "spawnablePositionType": "fishing", @@ -2619,7 +2748,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-calico-orange-gold-10-56", + "id": "westmarch-magikarp-calico-orange-gold-10-61", "level": "15-25", "pokemon": "magikarp magikarp_jump=calico-orange-gold", "spawnablePositionType": "fishing", @@ -2654,7 +2783,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-calico-orange-white-9-53", + "id": "westmarch-magikarp-calico-orange-white-9-58", "level": "15-25", "pokemon": "magikarp magikarp_jump=calico-orange-white", "spawnablePositionType": "fishing", @@ -2691,7 +2820,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-calico-orange-white-black-9-54", + "id": "westmarch-magikarp-calico-orange-white-black-9-59", "level": "15-25", "pokemon": "magikarp magikarp_jump=calico-orange-white-black", "spawnablePositionType": "fishing", @@ -2728,7 +2857,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-calico-white-orange-9-55", + "id": "westmarch-magikarp-calico-white-orange-9-60", "level": "15-25", "pokemon": "magikarp magikarp_jump=calico-white-orange", "spawnablePositionType": "fishing", @@ -2765,7 +2894,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-gray-bubbles-13-63", + "id": "westmarch-magikarp-gray-bubbles-13-68", "level": "15-25", "pokemon": "magikarp magikarp_jump=gray-bubbles", "spawnablePositionType": "fishing", @@ -2803,7 +2932,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-gray-diamonds-13-64", + "id": "westmarch-magikarp-gray-diamonds-13-69", "level": "15-25", "pokemon": "magikarp magikarp_jump=gray-diamonds", "spawnablePositionType": "fishing", @@ -2841,7 +2970,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-gray-patches-13-65", + "id": "westmarch-magikarp-gray-patches-13-70", "level": "15-25", "pokemon": "magikarp magikarp_jump=gray-patches", "spawnablePositionType": "fishing", @@ -2879,7 +3008,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-dapples-11-59", + "id": "westmarch-magikarp-orange-dapples-11-64", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-dapples", "spawnablePositionType": "fishing", @@ -2919,7 +3048,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-forehead-17-75", + "id": "westmarch-magikarp-orange-forehead-17-80", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-forehead", "spawnablePositionType": "fishing", @@ -2954,7 +3083,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-forehead-18-77", + "id": "westmarch-magikarp-orange-forehead-18-82", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-forehead", "spawnablePositionType": "fishing", @@ -2974,7 +3103,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-forehead-19-79", + "id": "westmarch-magikarp-orange-forehead-19-84", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-forehead", "spawnablePositionType": "fishing", @@ -3003,7 +3132,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-mask-17-76", + "id": "westmarch-magikarp-orange-mask-17-81", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-mask", "spawnablePositionType": "fishing", @@ -3038,7 +3167,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-mask-18-78", + "id": "westmarch-magikarp-orange-mask-18-83", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-mask", "spawnablePositionType": "fishing", @@ -3058,7 +3187,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-mask-19-80", + "id": "westmarch-magikarp-orange-mask-19-85", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-mask", "spawnablePositionType": "fishing", @@ -3086,7 +3215,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-orca-11-58", + "id": "westmarch-magikarp-orange-orca-11-63", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-orca", "spawnablePositionType": "fishing", @@ -3125,7 +3254,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-orange-two-tone-11-57", + "id": "westmarch-magikarp-orange-two-tone-11-62", "level": "15-25", "pokemon": "magikarp magikarp_jump=orange-two-tone", "spawnablePositionType": "fishing", @@ -3164,7 +3293,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-pink-dapples-12-62", + "id": "westmarch-magikarp-pink-dapples-12-67", "level": "15-25", "pokemon": "magikarp magikarp_jump=pink-dapples", "spawnablePositionType": "fishing", @@ -3202,7 +3331,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-pink-orca-12-61", + "id": "westmarch-magikarp-pink-orca-12-66", "level": "15-25", "pokemon": "magikarp magikarp_jump=pink-orca", "spawnablePositionType": "fishing", @@ -3240,7 +3369,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-pink-two-tone-12-60", + "id": "westmarch-magikarp-pink-two-tone-12-65", "level": "15-25", "pokemon": "magikarp magikarp_jump=pink-two-tone", "spawnablePositionType": "fishing", @@ -3278,7 +3407,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-purple-bubbles-14-66", + "id": "westmarch-magikarp-purple-bubbles-14-71", "level": "15-25", "pokemon": "magikarp magikarp_jump=purple-bubbles", "spawnablePositionType": "fishing", @@ -3316,7 +3445,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-purple-diamonds-14-67", + "id": "westmarch-magikarp-purple-diamonds-14-72", "level": "15-25", "pokemon": "magikarp magikarp_jump=purple-diamonds", "spawnablePositionType": "fishing", @@ -3354,7 +3483,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-purple-patches-14-68", + "id": "westmarch-magikarp-purple-patches-14-73", "level": "15-25", "pokemon": "magikarp magikarp_jump=purple-patches", "spawnablePositionType": "fishing", @@ -3393,7 +3522,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-skelly-6-50", + "id": "westmarch-magikarp-skelly-6-55", "level": "15-25", "pokemon": "magikarp magikarp_jump=skelly", "spawnablePositionType": "fishing", @@ -3425,7 +3554,7 @@ "minSkyLight": 0, "zone": "westmarch" }, - "id": "westmarch-magikarp-skelly-7-51", + "id": "westmarch-magikarp-skelly-7-56", "level": "15-25", "pokemon": "magikarp magikarp_jump=skelly", "spawnablePositionType": "fishing", @@ -3445,7 +3574,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-magikarp-skelly-8-52", + "id": "westmarch-magikarp-skelly-8-57", "level": "15-25", "pokemon": "magikarp magikarp_jump=skelly", "spawnablePositionType": "fishing", @@ -3470,7 +3599,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-violet-raindrops-24-90", + "id": "westmarch-magikarp-violet-raindrops-24-95", "level": "15-25", "pokemon": "magikarp magikarp_jump=violet-raindrops", "spawnablePositionType": "fishing", @@ -3506,7 +3635,7 @@ "minLureLevel": 1, "zone": "westmarch" }, - "id": "westmarch-magikarp-violet-saucy-24-89", + "id": "westmarch-magikarp-violet-saucy-24-94", "level": "15-25", "pokemon": "magikarp magikarp_jump=violet-saucy", "spawnablePositionType": "fishing", @@ -3670,7 +3799,7 @@ "minSkyLight": 8, "zone": "westmarch" }, - "id": "westmarch-munchlax-1-96", + "id": "westmarch-munchlax-1-101", "level": "24-25", "pokemon": "munchlax", "presets": [ @@ -3694,7 +3823,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-munchlax-2-97", + "id": "westmarch-munchlax-2-102", "level": "24-25", "pokemon": "munchlax", "presets": [ @@ -3759,6 +3888,35 @@ "multiplier": 1.25 } }, + { + "anticondition": { + "biomes": [ + "#cobblemon:is_deep_dark" + ] + }, + "bucket": "rare", + "condition": { + "biomes": [ + "#cobblemon:is_overworld" + ], + "maxSkyLight": 7, + "maxY": 0, + "minSkyLight": 0, + "zone": "westmarch" + }, + "id": "westmarch-noibat-2-45", + "level": "15-25", + "pokemon": "noibat", + "spawnablePositionType": "grounded", + "type": "pokemon", + "weight": 37.5, + "weightMultiplier": { + "condition": { + "isPokeSnack": true + }, + "multiplier": 2.0 + } + }, { "bucket": "common", "condition": { @@ -3969,7 +4127,7 @@ ] }, { - "id": "westmarch-pineco-144", + "id": "westmarch-pineco-149", "type": "pokemon", "pokemon": "pineco", "presets": [ @@ -3985,7 +4143,7 @@ } }, { - "id": "westmarch-rotom-145", + "id": "westmarch-rotom-150", "type": "pokemon", "pokemon": "rotom", "presets": [ @@ -4347,7 +4505,7 @@ "minY": 48, "zone": "westmarch" }, - "id": "westmarch-teddiursa-1-106", + "id": "westmarch-teddiursa-1-111", "level": "15-25", "pokemon": "teddiursa", "presets": [ @@ -4378,7 +4536,7 @@ ], "zone": "westmarch" }, - "id": "westmarch-teddiursa-2-107", + "id": "westmarch-teddiursa-2-112", "level": "15-25", "pokemon": "teddiursa", "presets": [ diff --git a/datapacks/core/data/cobblesurvival/summons/articuno.json b/datapacks/core/data/cobblesurvival/summons/articuno.json index b942284..fa28f35 100644 --- a/datapacks/core/data/cobblesurvival/summons/articuno.json +++ b/datapacks/core/data/cobblesurvival/summons/articuno.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "articuno", + "pokemon": "articuno", "level": 70, "zone": "frostpeak" } diff --git a/datapacks/core/data/cobblesurvival/summons/articuno_galarian.json b/datapacks/core/data/cobblesurvival/summons/articuno_galarian.json new file mode 100644 index 0000000..a98673d --- /dev/null +++ b/datapacks/core/data/cobblesurvival/summons/articuno_galarian.json @@ -0,0 +1,7 @@ +{ + "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", + "species": "articuno_galarian", + "pokemon": "articuno galarian", + "level": 80, + "zone": "highlands" +} diff --git a/datapacks/core/data/cobblesurvival/summons/eternatus.json b/datapacks/core/data/cobblesurvival/summons/eternatus.json index 65da57d..f1e6f84 100644 --- a/datapacks/core/data/cobblesurvival/summons/eternatus.json +++ b/datapacks/core/data/cobblesurvival/summons/eternatus.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "eternatus", + "pokemon": "eternatus", "level": 90, "zone": "the_end" } diff --git a/datapacks/core/data/cobblesurvival/summons/hooh.json b/datapacks/core/data/cobblesurvival/summons/hooh.json index 3a4a95d..9ab0a3b 100644 --- a/datapacks/core/data/cobblesurvival/summons/hooh.json +++ b/datapacks/core/data/cobblesurvival/summons/hooh.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "hooh", + "pokemon": "hooh", "level": 80, "zone": "highlands" } diff --git a/datapacks/core/data/cobblesurvival/summons/ironleaves.json b/datapacks/core/data/cobblesurvival/summons/ironleaves.json index d11dceb..24e0be6 100644 --- a/datapacks/core/data/cobblesurvival/summons/ironleaves.json +++ b/datapacks/core/data/cobblesurvival/summons/ironleaves.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "ironleaves", + "pokemon": "ironleaves", "level": 70, "zone": "jungle" } diff --git a/datapacks/core/data/cobblesurvival/summons/latias.json b/datapacks/core/data/cobblesurvival/summons/latias.json index 53a889d..44e87a7 100644 --- a/datapacks/core/data/cobblesurvival/summons/latias.json +++ b/datapacks/core/data/cobblesurvival/summons/latias.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "latias", + "pokemon": "latias", "level": 70, "zone": "highlands" } diff --git a/datapacks/core/data/cobblesurvival/summons/latios.json b/datapacks/core/data/cobblesurvival/summons/latios.json index bf92c22..d568786 100644 --- a/datapacks/core/data/cobblesurvival/summons/latios.json +++ b/datapacks/core/data/cobblesurvival/summons/latios.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "latios", + "pokemon": "latios", "level": 70, "zone": "highlands" } diff --git a/datapacks/core/data/cobblesurvival/summons/lugia.json b/datapacks/core/data/cobblesurvival/summons/lugia.json index 38ad4f6..37b120d 100644 --- a/datapacks/core/data/cobblesurvival/summons/lugia.json +++ b/datapacks/core/data/cobblesurvival/summons/lugia.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "lugia", + "pokemon": "lugia", "level": 80, "zone": "deep_sea" } diff --git a/datapacks/core/data/cobblesurvival/summons/mew.json b/datapacks/core/data/cobblesurvival/summons/mew.json index 5ab4a77..4fe8551 100644 --- a/datapacks/core/data/cobblesurvival/summons/mew.json +++ b/datapacks/core/data/cobblesurvival/summons/mew.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "mew", + "pokemon": "mew", "level": 80, "zone": "jungle" } diff --git a/datapacks/core/data/cobblesurvival/summons/mewtwo.json b/datapacks/core/data/cobblesurvival/summons/mewtwo.json index 215d568..3c8eb8e 100644 --- a/datapacks/core/data/cobblesurvival/summons/mewtwo.json +++ b/datapacks/core/data/cobblesurvival/summons/mewtwo.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "mewtwo", + "pokemon": "mewtwo", "level": 90, "zone": "deep_dark" } diff --git a/datapacks/core/data/cobblesurvival/summons/moltres.json b/datapacks/core/data/cobblesurvival/summons/moltres.json index 21f5de9..dd37feb 100644 --- a/datapacks/core/data/cobblesurvival/summons/moltres.json +++ b/datapacks/core/data/cobblesurvival/summons/moltres.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "moltres", + "pokemon": "moltres", "level": 70, "zone": "basalt" } diff --git a/datapacks/core/data/cobblesurvival/summons/moltres_galarian.json b/datapacks/core/data/cobblesurvival/summons/moltres_galarian.json new file mode 100644 index 0000000..a34bad4 --- /dev/null +++ b/datapacks/core/data/cobblesurvival/summons/moltres_galarian.json @@ -0,0 +1,7 @@ +{ + "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", + "species": "moltres_galarian", + "pokemon": "moltres galarian", + "level": 80, + "zone": "deep_dark" +} diff --git a/datapacks/core/data/cobblesurvival/summons/poipole.json b/datapacks/core/data/cobblesurvival/summons/poipole.json index 759ed82..1c117f4 100644 --- a/datapacks/core/data/cobblesurvival/summons/poipole.json +++ b/datapacks/core/data/cobblesurvival/summons/poipole.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "poipole", + "pokemon": "poipole", "level": 70, "zone": "the_end" } diff --git a/datapacks/core/data/cobblesurvival/summons/rayquaza.json b/datapacks/core/data/cobblesurvival/summons/rayquaza.json index 48e807b..9a2742e 100644 --- a/datapacks/core/data/cobblesurvival/summons/rayquaza.json +++ b/datapacks/core/data/cobblesurvival/summons/rayquaza.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "rayquaza", + "pokemon": "rayquaza", "level": 90, "zone": "frostpeak" } diff --git a/datapacks/core/data/cobblesurvival/summons/regice.json b/datapacks/core/data/cobblesurvival/summons/regice.json index 03af569..87e81df 100644 --- a/datapacks/core/data/cobblesurvival/summons/regice.json +++ b/datapacks/core/data/cobblesurvival/summons/regice.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "regice", + "pokemon": "regice", "level": 70, "zone": "frostpeak" } diff --git a/datapacks/core/data/cobblesurvival/summons/regidrago.json b/datapacks/core/data/cobblesurvival/summons/regidrago.json index a27c7c3..114612d 100644 --- a/datapacks/core/data/cobblesurvival/summons/regidrago.json +++ b/datapacks/core/data/cobblesurvival/summons/regidrago.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "regidrago", + "pokemon": "regidrago", "level": 70, "zone": "sunscorch" } diff --git a/datapacks/core/data/cobblesurvival/summons/regieleki.json b/datapacks/core/data/cobblesurvival/summons/regieleki.json index 8465e66..1d487dd 100644 --- a/datapacks/core/data/cobblesurvival/summons/regieleki.json +++ b/datapacks/core/data/cobblesurvival/summons/regieleki.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "regieleki", + "pokemon": "regieleki", "level": 70, "zone": "westmarch" } diff --git a/datapacks/core/data/cobblesurvival/summons/regigigas.json b/datapacks/core/data/cobblesurvival/summons/regigigas.json index b784ec3..edec645 100644 --- a/datapacks/core/data/cobblesurvival/summons/regigigas.json +++ b/datapacks/core/data/cobblesurvival/summons/regigigas.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "regigigas", + "pokemon": "regigigas", "level": 80, "zone": "deep_dark" } diff --git a/datapacks/core/data/cobblesurvival/summons/regirock.json b/datapacks/core/data/cobblesurvival/summons/regirock.json index 602af1b..7416a12 100644 --- a/datapacks/core/data/cobblesurvival/summons/regirock.json +++ b/datapacks/core/data/cobblesurvival/summons/regirock.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "regirock", + "pokemon": "regirock", "level": 70, "zone": "dripstone" } diff --git a/datapacks/core/data/cobblesurvival/summons/registeel.json b/datapacks/core/data/cobblesurvival/summons/registeel.json index 091ddd4..5fd068e 100644 --- a/datapacks/core/data/cobblesurvival/summons/registeel.json +++ b/datapacks/core/data/cobblesurvival/summons/registeel.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "registeel", + "pokemon": "registeel", "level": 70, "zone": "deep_dark" } diff --git a/datapacks/core/data/cobblesurvival/summons/walkingwake.json b/datapacks/core/data/cobblesurvival/summons/walkingwake.json index 412249b..373ee7e 100644 --- a/datapacks/core/data/cobblesurvival/summons/walkingwake.json +++ b/datapacks/core/data/cobblesurvival/summons/walkingwake.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "walkingwake", + "pokemon": "walkingwake", "level": 70, "zone": "mire" } diff --git a/datapacks/core/data/cobblesurvival/summons/xerneas.json b/datapacks/core/data/cobblesurvival/summons/xerneas.json index be848d6..68c4ba8 100644 --- a/datapacks/core/data/cobblesurvival/summons/xerneas.json +++ b/datapacks/core/data/cobblesurvival/summons/xerneas.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "xerneas", + "pokemon": "xerneas", "level": 80, "zone": "jungle" } diff --git a/datapacks/core/data/cobblesurvival/summons/zapdos.json b/datapacks/core/data/cobblesurvival/summons/zapdos.json index 9673f99..87d3535 100644 --- a/datapacks/core/data/cobblesurvival/summons/zapdos.json +++ b/datapacks/core/data/cobblesurvival/summons/zapdos.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "zapdos", + "pokemon": "zapdos", "level": 70, "zone": "westmarch" } diff --git a/datapacks/core/data/cobblesurvival/summons/zapdos_galarian.json b/datapacks/core/data/cobblesurvival/summons/zapdos_galarian.json new file mode 100644 index 0000000..e19b969 --- /dev/null +++ b/datapacks/core/data/cobblesurvival/summons/zapdos_galarian.json @@ -0,0 +1,7 @@ +{ + "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", + "species": "zapdos_galarian", + "pokemon": "zapdos galarian", + "level": 80, + "zone": "jungle" +} diff --git a/datapacks/core/data/cobblesurvival/summons/zarude.json b/datapacks/core/data/cobblesurvival/summons/zarude.json index 53f3a3f..5635363 100644 --- a/datapacks/core/data/cobblesurvival/summons/zarude.json +++ b/datapacks/core/data/cobblesurvival/summons/zarude.json @@ -1,6 +1,7 @@ { "_comment": "Generated by tools/summons.py from world/summons.json; do not edit by hand.", "species": "zarude", + "pokemon": "zarude", "level": 80, "zone": "jungle" } diff --git a/datapacks/core/data/cobblesurvival/tuning/server.json b/datapacks/core/data/cobblesurvival/tuning/server.json new file mode 100644 index 0000000..992204c --- /dev/null +++ b/datapacks/core/data/cobblesurvival/tuning/server.json @@ -0,0 +1,11 @@ +{ + "_comment": "Balance numbers the companion mod's server code reads (dev.cobblesurvival.Tuning). /reload applies them; see docs/balance.md.", + "boss_evs": 170, + "guardian_wake_range": 96.0, + "guardian_leash": 24.0, + "end_boss_wake_range": 160.0, + "end_boss_leash": 24.0, + "summon_spacing": 96.0, + "wanderer_range": 64.0, + "attack_battle_grace_ticks": 100 +} diff --git a/datapacks/core/data/cobblesurvival/zones/island.json b/datapacks/core/data/cobblesurvival/zones/island.json index 69f3a20..e547d3e 100644 --- a/datapacks/core/data/cobblesurvival/zones/island.json +++ b/datapacks/core/data/cobblesurvival/zones/island.json @@ -1 +1 @@ -{"_comment":"Generated by tools/zone_layout.py from world/zones.json; do not edit by hand.","seed":"isle-26","radius":1700,"step":24,"size":142,"zones":[{"id":"button_isle","name":"Button Isle","levels":[2,10]},{"id":"frostpeak","name":"Frostpeak Range","levels":[40,55]},{"id":"sunscorch","name":"Sunscorch","levels":[30,45]},{"id":"mire","name":"Mangrove Mire","levels":[25,38]},{"id":"jungle","name":"Verdant Jungle","levels":[18,30]},{"id":"highlands","name":"Highland Meadows","levels":[25,35]},{"id":"westmarch","name":"Westmarch","levels":[15,25]},{"id":"southwold","name":"Southwold","levels":[8,18]},{"id":"shallows","name":"Shallows","levels":[5,20]},{"id":"deep_sea","name":"Deep Sea","levels":[30,50]}],"caves":[{"id":"lush_caves","name":"Lush Caves","levels":[12,28],"biome":"minecraft:lush_caves"},{"id":"dripstone","name":"Dripstone Depths","levels":[22,38],"biome":"minecraft:dripstone_caves"},{"id":"deep_dark","name":"Deep Dark","levels":[45,60],"biome":"minecraft:deep_dark"},{"id":"basalt","name":"Basalt Furnace","levels":[55,70],"biome":"minecraft:basalt_deltas"}],"dimensions":[{"id":"the_end","name":"The End","levels":[50,70],"dimension":"minecraft:the_end"}],"level_pressure":{"grace_levels":5,"per_level":0.1,"minimum":0.1},"wanderers":{"grace_levels":10},"samples":{"button_isle":[-116,null,-92],"frostpeak":[628,null,-572],"sunscorch":[1372,null,-236],"mire":[652,null,1012],"jungle":[844,null,196],"highlands":[100,null,-1076],"westmarch":[-428,null,-1100],"southwold":[-116,null,1108],"shallows":[1468,null,4],"deep_sea":[-1316,null,4],"lush_caves":[-1028,0,292],"dripstone":[940,40,-212],"deep_dark":[484,-52,-1124],"basalt":[1252,0,508]},"biome_samples":{"frostpeak":[580,null,-524],"sunscorch":[-44,null,-452],"mire":[652,null,1012],"jungle":[844,null,196]},"grid_rle":[[9,912],[8,22],[9,115],[8,32],[9,106],[8,40],[9,99],[8,18],[5,13],[8,15],[9,96],[8,12],[6,1],[5,22],[1,2],[8,12],[9,92],[8,9],[6,5],[5,27],[1,1],[8,10],[9,90],[8,8],[6,6],[5,29],[1,1],[8,10],[9,85],[8,7],[6,10],[5,21],[1,3],[5,7],[1,1],[5,1],[8,10],[9,80],[8,6],[6,1],[8,1],[6,11],[5,20],[1,8],[5,2],[1,2],[5,2],[8,11],[9,76],[8,5],[6,2],[8,1],[6,13],[5,19],[1,11],[5,5],[8,1],[5,2],[8,8],[9,73],[8,5],[6,2],[8,1],[6,15],[5,18],[1,11],[5,12],[8,7],[9,60],[8,2],[9,7],[8,5],[6,1],[8,2],[6,17],[5,18],[1,9],[5,15],[8,8],[9,57],[8,3],[9,5],[8,5],[6,2],[2,4],[6,16],[5,18],[1,6],[5,20],[8,7],[9,55],[8,12],[6,5],[2,2],[6,17],[5,46],[8,7],[9,52],[8,12],[6,6],[2,1],[6,19],[5,47],[8,6],[9,49],[8,12],[6,8],[2,1],[6,19],[5,25],[1,5],[5,18],[8,6],[9,47],[8,11],[6,1],[8,1],[6,27],[5,26],[1,6],[5,19],[8,5],[9,45],[8,10],[2,1],[8,2],[2,1],[6,27],[5,24],[1,8],[5,20],[8,6],[9,42],[8,9],[2,7],[6,26],[5,24],[1,9],[5,20],[8,6],[9,40],[8,9],[2,8],[6,26],[5,24],[1,11],[5,19],[8,6],[9,39],[8,8],[2,9],[6,26],[5,23],[1,5],[5,1],[1,5],[5,21],[8,5],[9,40],[8,6],[2,10],[6,26],[5,23],[1,12],[5,21],[8,5],[9,39],[8,5],[2,10],[6,27],[5,23],[1,13],[5,21],[8,5],[9,37],[8,5],[2,12],[6,26],[5,26],[1,10],[5,22],[8,5],[9,35],[8,5],[2,11],[6,28],[5,27],[1,7],[5,25],[8,5],[9,34],[8,5],[2,10],[6,29],[5,28],[1,5],[5,27],[8,5],[9,32],[8,5],[2,1],[6,2],[2,4],[6,33],[5,29],[1,3],[5,29],[8,4],[9,31],[8,5],[6,41],[5,62],[8,4],[9,30],[8,4],[6,42],[5,20],[1,1],[5,42],[8,4],[9,28],[8,5],[6,42],[5,16],[1,3],[5,1],[1,5],[5,38],[8,4],[9,27],[8,5],[6,43],[5,12],[1,18],[5,11],[1,1],[5,22],[8,4],[9,26],[8,5],[6,43],[5,12],[1,17],[5,3],[1,4],[5,2],[1,1],[5,2],[1,1],[5,22],[8,4],[9,25],[8,5],[6,44],[5,12],[1,18],[5,1],[1,5],[5,1],[1,3],[5,1],[1,1],[5,23],[8,4],[9,24],[8,4],[6,45],[5,12],[1,11],[5,1],[1,6],[5,1],[1,3],[5,2],[1,4],[5,25],[8,4],[9,23],[8,5],[6,44],[5,5],[1,1],[5,7],[1,13],[5,1],[1,2],[5,7],[1,2],[5,1],[1,2],[5,26],[8,4],[9,22],[8,4],[6,45],[5,4],[1,4],[5,5],[1,9],[5,2],[1,2],[5,9],[1,8],[5,24],[8,4],[9,21],[8,4],[2,3],[6,44],[5,1],[1,8],[5,3],[1,7],[5,4],[1,1],[5,9],[1,9],[5,24],[8,5],[9,20],[8,4],[2,4],[6,43],[5,1],[1,8],[5,4],[1,5],[5,3],[1,3],[5,9],[1,9],[5,25],[8,4],[9,19],[8,4],[2,5],[6,43],[1,9],[5,4],[1,10],[5,10],[1,9],[5,25],[8,5],[9,1],[8,1],[9,16],[8,4],[6,48],[1,10],[5,4],[1,3],[5,2],[1,3],[5,10],[1,10],[5,26],[8,6],[9,16],[8,4],[6,48],[1,10],[5,3],[2,1],[5,1],[2,2],[5,15],[1,9],[5,27],[8,7],[9,14],[8,4],[6,49],[1,9],[2,7],[5,16],[1,9],[5,4],[1,3],[5,21],[8,6],[9,14],[8,4],[6,48],[1,9],[2,8],[5,16],[1,9],[5,3],[1,4],[5,21],[8,6],[9,14],[8,3],[6,49],[1,7],[2,10],[5,16],[1,9],[5,3],[1,5],[5,20],[2,1],[8,6],[9,12],[8,4],[6,50],[1,5],[2,11],[5,16],[1,9],[5,3],[1,5],[5,19],[2,2],[8,6],[9,12],[8,4],[6,50],[5,2],[1,2],[2,13],[5,15],[1,10],[5,3],[1,4],[5,18],[2,3],[8,6],[9,12],[8,3],[6,51],[5,3],[2,12],[1,4],[5,14],[1,10],[5,23],[2,4],[8,7],[9,10],[8,4],[6,51],[5,3],[2,11],[1,5],[5,15],[1,9],[5,23],[2,5],[8,6],[9,10],[8,3],[6,52],[5,3],[2,11],[1,1],[5,2],[1,3],[5,15],[1,10],[5,20],[2,6],[8,6],[9,10],[8,3],[6,52],[5,3],[2,3],[8,3],[9,3],[8,2],[1,1],[5,3],[1,1],[5,16],[1,12],[5,17],[2,7],[8,6],[9,12],[8,1],[4,2],[6,50],[5,3],[2,1],[8,6],[9,2],[8,5],[5,1],[1,1],[5,16],[1,3],[5,5],[1,5],[5,15],[2,8],[5,1],[8,1],[9,1],[8,3],[9,7],[8,3],[9,2],[8,1],[4,5],[6,47],[5,1],[8,1],[9,2],[8,6],[9,3],[8,6],[5,6],[4,1],[5,9],[1,2],[5,7],[1,2],[5,1],[1,1],[5,15],[2,9],[8,1],[9,2],[8,3],[9,6],[8,4],[9,1],[4,7],[6,46],[9,5],[8,5],[9,2],[8,8],[9,1],[5,3],[4,3],[5,8],[1,1],[5,8],[1,2],[5,2],[1,1],[5,13],[2,10],[8,1],[9,4],[8,1],[9,6],[8,5],[4,7],[6,45],[9,7],[8,4],[9,1],[0,1],[8,8],[9,2],[5,1],[4,5],[5,3],[4,3],[5,1],[1,1],[5,7],[1,3],[5,14],[2,12],[8,1],[9,11],[8,5],[4,8],[6,43],[9,7],[8,1],[0,9],[8,4],[9,3],[8,1],[4,6],[5,1],[4,4],[5,1],[1,1],[5,6],[1,2],[5,14],[2,1],[5,1],[2,11],[5,2],[8,1],[9,10],[8,5],[4,8],[6,42],[9,6],[8,1],[0,13],[9,4],[8,3],[4,9],[5,2],[1,2],[5,2],[1,2],[5,16],[2,14],[5,2],[8,1],[9,10],[8,5],[4,8],[6,41],[8,1],[9,5],[8,1],[0,15],[9,2],[8,4],[4,9],[5,2],[1,5],[5,2],[4,2],[5,10],[2,17],[5,2],[8,1],[9,9],[8,6],[4,8],[6,12],[3,2],[6,27],[9,5],[8,1],[0,17],[8,6],[4,8],[5,3],[1,3],[5,2],[4,5],[5,5],[2,19],[5,3],[8,1],[9,9],[8,5],[6,1],[4,7],[6,12],[3,3],[6,27],[9,4],[8,1],[0,19],[8,5],[4,9],[5,2],[1,3],[5,1],[4,6],[5,6],[2,18],[5,3],[8,1],[9,9],[8,5],[4,8],[6,9],[3,6],[6,26],[9,5],[0,20],[8,6],[4,11],[1,1],[5,2],[4,6],[5,7],[2,16],[5,5],[9,9],[8,5],[4,7],[6,9],[3,6],[6,27],[9,4],[8,1],[0,21],[8,5],[4,21],[5,6],[2,15],[5,6],[9,9],[8,5],[4,6],[6,10],[3,5],[6,27],[8,1],[9,4],[0,22],[8,5],[4,22],[5,6],[2,13],[5,7],[8,1],[9,8],[8,1],[9,3],[8,1],[4,1],[8,1],[9,42],[8,4],[9,5],[0,23],[9,1],[8,2],[9,2],[8,1],[9,1],[8,7],[9,22],[8,15],[5,1],[8,5],[9,4],[8,1],[9,3],[8,1],[9,53],[0,23],[9,1],[8,3],[9,1],[8,15],[9,19],[8,18],[9,4],[8,1],[9,3],[8,2],[9,51],[0,24],[9,1],[8,26],[9,15],[8,15],[9,6],[8,4],[9,51],[8,1],[0,23],[9,2],[8,30],[9,13],[8,12],[9,6],[8,4],[9,51],[8,1],[0,23],[8,1],[9,1],[8,29],[9,14],[8,12],[9,6],[8,4],[9,46],[8,1],[9,5],[0,23],[8,30],[9,16],[8,11],[9,6],[8,3],[7,6],[8,41],[7,1],[9,5],[0,23],[8,5],[4,3],[8,22],[9,16],[8,2],[4,4],[8,5],[9,6],[8,4],[7,47],[8,1],[9,4],[0,22],[8,5],[4,48],[8,5],[9,6],[8,4],[7,47],[8,1],[9,4],[8,1],[0,21],[9,1],[8,4],[4,34],[7,1],[4,9],[7,2],[4,2],[8,5],[9,6],[8,3],[7,49],[9,5],[8,1],[0,19],[9,2],[8,4],[4,42],[7,6],[8,5],[9,6],[8,4],[7,49],[9,5],[0,19],[9,5],[4,43],[7,6],[8,5],[9,7],[8,3],[7,49],[9,6],[0,17],[9,6],[4,42],[7,6],[8,6],[9,7],[8,3],[7,50],[9,6],[0,15],[9,6],[7,1],[4,14],[7,2],[4,27],[7,5],[8,6],[9,7],[8,3],[7,50],[9,7],[8,1],[0,11],[9,7],[7,2],[4,42],[7,6],[8,5],[9,8],[8,3],[7,51],[9,8],[8,1],[0,7],[9,8],[7,5],[4,41],[7,5],[8,5],[9,8],[8,4],[7,51],[9,22],[8,1],[7,6],[4,41],[7,4],[8,5],[9,8],[8,4],[7,52],[8,1],[9,19],[7,8],[4,42],[7,2],[8,6],[9,9],[8,3],[7,54],[9,17],[7,9],[4,44],[8,6],[9,9],[8,3],[7,56],[9,13],[7,11],[4,44],[8,5],[9,10],[8,4],[7,58],[9,4],[8,1],[9,1],[8,1],[7,15],[4,42],[8,6],[9,11],[8,3],[7,81],[4,38],[7,3],[8,3],[9,14],[8,3],[7,81],[4,36],[7,5],[8,1],[9,16],[8,4],[7,81],[4,1],[3,1],[4,32],[7,5],[8,1],[9,18],[8,3],[7,79],[3,3],[4,6],[3,1],[4,24],[7,7],[8,1],[9,18],[8,3],[7,79],[3,3],[4,6],[3,3],[4,21],[7,8],[8,1],[9,18],[8,4],[7,76],[3,5],[4,7],[3,3],[4,20],[7,7],[8,1],[9,20],[8,3],[7,72],[3,10],[4,6],[3,4],[4,19],[7,7],[8,1],[9,20],[8,4],[7,67],[3,15],[4,5],[3,5],[4,18],[7,7],[9,22],[8,3],[7,66],[3,17],[4,4],[3,7],[4,16],[7,6],[8,1],[9,22],[8,4],[7,64],[3,32],[4,13],[7,6],[9,24],[8,3],[7,63],[3,33],[4,13],[7,5],[8,1],[9,24],[8,4],[7,62],[3,35],[4,11],[7,5],[9,26],[8,3],[7,62],[3,38],[4,7],[7,5],[8,1],[9,26],[8,4],[7,58],[3,44],[4,4],[7,4],[8,1],[9,28],[8,3],[7,58],[3,44],[4,3],[7,5],[8,1],[9,28],[8,4],[7,56],[3,45],[4,2],[7,5],[8,1],[9,30],[8,3],[7,56],[3,45],[7,7],[8,1],[9,31],[8,3],[7,55],[3,7],[7,3],[3,34],[7,7],[8,1],[9,32],[8,4],[7,54],[3,6],[7,4],[3,34],[7,7],[9,34],[8,3],[7,54],[3,6],[7,3],[3,34],[7,7],[8,1],[9,35],[8,3],[7,53],[3,6],[7,2],[3,7],[7,3],[3,25],[7,6],[8,1],[9,36],[8,4],[7,52],[3,15],[7,3],[3,27],[7,3],[8,1],[9,38],[8,4],[7,52],[3,16],[7,1],[3,27],[7,2],[8,1],[9,40],[8,3],[7,52],[3,43],[7,3],[8,1],[9,40],[8,4],[7,52],[3,43],[7,1],[8,1],[9,42],[8,4],[7,51],[3,43],[8,1],[9,44],[8,4],[7,51],[3,41],[8,7],[9,40],[8,4],[7,50],[3,30],[7,1],[3,9],[8,7],[9,42],[8,4],[7,48],[3,26],[7,7],[3,7],[8,7],[9,44],[8,4],[7,48],[3,24],[7,9],[3,5],[8,7],[9,46],[8,4],[7,47],[3,24],[7,7],[4,1],[3,5],[8,8],[9,47],[8,4],[7,46],[3,21],[7,9],[4,3],[3,2],[8,9],[9,49],[8,4],[7,45],[3,17],[7,13],[4,3],[3,1],[8,9],[9,51],[8,5],[7,43],[3,15],[7,14],[4,3],[3,1],[8,9],[9,53],[8,5],[7,38],[3,2],[7,1],[3,15],[7,16],[4,2],[8,8],[9,56],[8,6],[7,36],[3,15],[7,19],[4,1],[8,8],[9,59],[8,5],[7,35],[3,12],[7,21],[8,9],[9,61],[8,6],[7,33],[3,10],[7,22],[8,9],[9,63],[8,7],[7,32],[3,9],[7,20],[8,10],[9,66],[8,6],[7,34],[3,3],[7,21],[8,10],[9,69],[8,7],[7,55],[8,10],[9,72],[8,7],[7,51],[8,11],[9,75],[8,7],[7,47],[8,7],[9,2],[8,2],[9,79],[8,8],[7,41],[8,8],[9,4],[8,1],[9,81],[8,9],[7,26],[2,4],[7,6],[8,9],[9,90],[8,10],[7,21],[2,7],[7,3],[8,9],[9,95],[8,10],[7,14],[8,4],[2,2],[8,1],[2,2],[8,12],[9,99],[8,13],[7,8],[8,19],[9,105],[8,34],[9,111],[8,28],[9,118],[8,19],[9,488]]} +{"_comment":"Generated by tools/zone_layout.py from world/zones.json; do not edit by hand.","seed":"isle-26","radius":1700,"step":24,"size":142,"zones":[{"id":"button_isle","name":"Button Isle","levels":[2,10]},{"id":"frostpeak","name":"Frostpeak Range","levels":[40,55]},{"id":"sunscorch","name":"Sunscorch","levels":[30,45]},{"id":"mire","name":"Mangrove Mire","levels":[25,38]},{"id":"jungle","name":"Verdant Jungle","levels":[18,30]},{"id":"highlands","name":"Highland Meadows","levels":[25,35]},{"id":"westmarch","name":"Westmarch","levels":[15,25]},{"id":"southwold","name":"Southwold","levels":[8,18]},{"id":"deep_sea","name":"Deep Sea","levels":[30,50]},{"id":"shallows","name":"Shallows","levels":[5,20]}],"caves":[{"id":"lush_caves","name":"Lush Caves","levels":[12,28],"biome":"minecraft:lush_caves"},{"id":"dripstone","name":"Dripstone Depths","levels":[22,38],"biome":"minecraft:dripstone_caves"},{"id":"deep_dark","name":"Deep Dark","levels":[45,60],"biome":"minecraft:deep_dark"},{"id":"basalt","name":"Basalt Furnace","levels":[55,70],"biome":"minecraft:basalt_deltas"}],"dimensions":[{"id":"the_end","name":"The End","levels":[50,70],"dimension":"minecraft:the_end"}],"level_pressure":{"grace_levels":5,"per_level":0.1,"minimum":0.1},"wanderers":{"grace_levels":10},"samples":{"button_isle":[-116,null,-92],"frostpeak":[628,null,-572],"sunscorch":[1372,null,-236],"mire":[652,null,1012],"jungle":[844,null,196],"highlands":[100,null,-1076],"westmarch":[-428,null,-1100],"southwold":[-116,null,1108],"deep_sea":[1540,null,-20],"shallows":[-500,null,4],"lush_caves":[-1028,0,292],"dripstone":[940,40,-212],"deep_dark":[484,-52,-1124],"basalt":[1252,0,508]},"biome_samples":{"frostpeak":[580,null,-524],"sunscorch":[-44,null,-452],"mire":[652,null,1012],"jungle":[844,null,196]},"grid_rle":[[8,1199],[9,16],[8,120],[9,9],[5,13],[9,6],[8,110],[9,7],[6,1],[5,22],[1,2],[9,4],[8,102],[9,7],[6,5],[5,27],[1,1],[9,4],[8,96],[9,8],[6,6],[5,29],[1,1],[9,4],[8,91],[9,7],[6,10],[5,21],[1,3],[5,7],[1,1],[5,1],[9,4],[8,86],[9,6],[6,1],[9,1],[6,11],[5,20],[1,8],[5,2],[1,2],[5,2],[9,5],[8,82],[9,5],[6,2],[9,1],[6,13],[5,19],[1,11],[5,5],[9,1],[5,2],[9,3],[8,78],[9,5],[6,2],[9,1],[6,15],[5,18],[1,11],[5,12],[9,2],[8,74],[9,5],[6,1],[9,2],[6,17],[5,18],[1,9],[5,15],[9,3],[8,70],[9,5],[6,2],[2,4],[6,16],[5,18],[1,6],[5,20],[9,3],[8,67],[9,4],[6,5],[2,2],[6,17],[5,46],[9,2],[8,64],[9,5],[6,6],[2,1],[6,19],[5,47],[9,2],[8,61],[9,4],[6,8],[2,1],[6,19],[5,25],[1,5],[5,18],[9,2],[8,58],[9,4],[6,1],[9,1],[6,27],[5,26],[1,6],[5,19],[9,2],[8,55],[9,3],[2,1],[9,2],[2,1],[6,27],[5,24],[1,8],[5,20],[9,2],[8,53],[9,2],[2,7],[6,26],[5,24],[1,9],[5,20],[9,2],[8,51],[9,2],[2,8],[6,26],[5,24],[1,11],[5,19],[9,2],[8,49],[9,2],[2,9],[6,26],[5,23],[1,5],[5,1],[1,5],[5,21],[9,2],[8,47],[9,2],[2,10],[6,26],[5,23],[1,12],[5,21],[9,2],[8,45],[9,2],[2,10],[6,27],[5,23],[1,13],[5,21],[9,2],[8,43],[9,2],[2,12],[6,26],[5,26],[1,10],[5,22],[9,2],[8,41],[9,2],[2,11],[6,28],[5,27],[1,7],[5,25],[9,2],[8,40],[9,2],[2,10],[6,29],[5,28],[1,5],[5,27],[9,2],[8,38],[9,2],[2,1],[6,2],[2,4],[6,33],[5,29],[1,3],[5,29],[9,1],[8,37],[9,2],[6,41],[5,62],[9,1],[8,35],[9,2],[6,42],[5,20],[1,1],[5,42],[9,1],[8,34],[9,2],[6,42],[5,16],[1,3],[5,1],[1,5],[5,38],[9,1],[8,33],[9,2],[6,43],[5,12],[1,18],[5,11],[1,1],[5,22],[9,1],[8,32],[9,2],[6,43],[5,12],[1,17],[5,3],[1,4],[5,2],[1,1],[5,2],[1,1],[5,22],[9,2],[8,30],[9,2],[6,44],[5,12],[1,18],[5,1],[1,5],[5,1],[1,3],[5,1],[1,1],[5,23],[9,1],[8,29],[9,2],[6,45],[5,12],[1,11],[5,1],[1,6],[5,1],[1,3],[5,2],[1,4],[5,25],[9,2],[8,28],[9,2],[6,44],[5,5],[1,1],[5,7],[1,13],[5,1],[1,2],[5,7],[1,2],[5,1],[1,2],[5,26],[9,1],[8,27],[9,2],[6,45],[5,4],[1,4],[5,5],[1,9],[5,2],[1,2],[5,9],[1,8],[5,24],[9,2],[8,26],[9,1],[2,3],[6,44],[5,1],[1,8],[5,3],[1,7],[5,4],[1,1],[5,9],[1,9],[5,24],[9,2],[8,25],[9,2],[2,4],[6,43],[5,1],[1,8],[5,4],[1,5],[5,3],[1,3],[5,9],[1,9],[5,25],[9,2],[8,24],[9,1],[2,5],[6,43],[1,9],[5,4],[1,10],[5,10],[1,9],[5,25],[9,2],[8,24],[9,1],[6,48],[1,10],[5,4],[1,3],[5,2],[1,3],[5,10],[1,10],[5,26],[9,1],[8,23],[9,2],[6,48],[1,10],[5,3],[2,1],[5,1],[2,2],[5,15],[1,9],[5,27],[9,2],[8,22],[9,1],[6,49],[1,9],[2,7],[5,16],[1,9],[5,4],[1,3],[5,21],[9,1],[8,21],[9,2],[6,48],[1,9],[2,8],[5,16],[1,9],[5,3],[1,4],[5,21],[9,1],[8,21],[9,1],[6,49],[1,7],[2,10],[5,16],[1,9],[5,3],[1,5],[5,20],[2,1],[9,1],[8,20],[9,1],[6,50],[1,5],[2,11],[5,16],[1,9],[5,3],[1,5],[5,19],[2,2],[9,1],[8,20],[9,1],[6,50],[5,2],[1,2],[2,13],[5,15],[1,10],[5,3],[1,4],[5,18],[2,3],[9,1],[8,19],[9,1],[6,51],[5,3],[2,12],[1,4],[5,14],[1,10],[5,23],[2,4],[9,2],[8,18],[9,1],[6,51],[5,3],[2,11],[1,5],[5,15],[1,9],[5,23],[2,5],[9,1],[8,18],[6,52],[5,3],[2,11],[1,1],[5,2],[1,3],[5,15],[1,10],[5,20],[2,6],[9,1],[8,17],[9,1],[6,52],[5,3],[2,3],[9,8],[1,1],[5,3],[1,1],[5,16],[1,12],[5,17],[2,7],[9,2],[8,16],[9,1],[4,2],[6,50],[5,3],[2,1],[9,13],[5,1],[1,1],[5,16],[1,3],[5,5],[1,5],[5,15],[2,8],[5,1],[9,1],[8,16],[9,1],[4,5],[6,47],[5,1],[9,18],[5,6],[4,1],[5,9],[1,2],[5,7],[1,2],[5,1],[1,1],[5,15],[2,9],[9,1],[8,16],[4,7],[6,46],[9,21],[5,3],[4,3],[5,8],[1,1],[5,8],[1,2],[5,2],[1,1],[5,13],[2,10],[9,1],[8,16],[4,7],[6,45],[9,12],[0,1],[9,10],[5,1],[4,5],[5,3],[4,3],[5,1],[1,1],[5,7],[1,3],[5,14],[2,12],[9,1],[8,15],[9,1],[4,8],[6,43],[9,8],[0,9],[9,8],[4,6],[5,1],[4,4],[5,1],[1,1],[5,6],[1,2],[5,14],[2,1],[5,1],[2,11],[5,2],[9,1],[8,14],[9,1],[4,8],[6,42],[9,7],[0,13],[9,7],[4,9],[5,2],[1,2],[5,2],[1,2],[5,16],[2,14],[5,2],[9,1],[8,14],[9,1],[4,8],[6,41],[9,7],[0,15],[9,6],[4,9],[5,2],[1,5],[5,2],[4,2],[5,10],[2,17],[5,2],[9,1],[8,14],[9,1],[4,8],[6,12],[3,2],[6,27],[9,6],[0,17],[9,6],[4,8],[5,3],[1,3],[5,2],[4,5],[5,5],[2,19],[5,3],[9,1],[8,14],[6,1],[4,7],[6,12],[3,3],[6,27],[9,5],[0,19],[9,5],[4,9],[5,2],[1,3],[5,1],[4,6],[5,6],[2,18],[5,3],[9,1],[8,14],[4,8],[6,9],[3,6],[6,26],[9,5],[0,20],[9,6],[4,11],[1,1],[5,2],[4,6],[5,7],[2,16],[5,5],[8,14],[4,7],[6,9],[3,6],[6,27],[9,5],[0,21],[9,5],[4,21],[5,6],[2,15],[5,6],[8,13],[9,1],[4,6],[6,10],[3,5],[6,27],[9,5],[0,22],[9,5],[4,22],[5,6],[2,13],[5,7],[9,1],[8,12],[9,1],[4,1],[9,52],[0,23],[9,51],[5,1],[9,1],[8,12],[9,1],[8,2],[9,51],[0,23],[9,51],[8,14],[9,1],[8,2],[9,50],[0,24],[9,51],[8,14],[9,1],[8,2],[9,51],[0,23],[9,51],[8,14],[9,1],[8,2],[9,51],[0,23],[9,51],[8,14],[9,1],[8,2],[9,51],[0,23],[9,51],[8,14],[9,1],[7,6],[9,41],[7,1],[9,5],[0,23],[9,5],[4,3],[9,40],[4,4],[9,1],[8,12],[9,2],[7,47],[9,5],[0,22],[9,5],[4,48],[9,1],[8,13],[9,1],[7,47],[9,6],[0,21],[9,5],[4,34],[7,1],[4,9],[7,2],[4,2],[8,14],[7,49],[9,6],[0,19],[9,6],[4,42],[7,6],[8,14],[9,1],[7,49],[9,5],[0,19],[9,5],[4,43],[7,6],[8,14],[9,1],[7,49],[9,6],[0,17],[9,6],[4,42],[7,6],[9,1],[8,14],[9,1],[7,50],[9,6],[0,15],[9,6],[7,1],[4,14],[7,2],[4,27],[7,5],[9,1],[8,14],[9,1],[7,50],[9,8],[0,11],[9,7],[7,2],[4,42],[7,6],[9,1],[8,14],[9,1],[7,51],[9,9],[0,7],[9,8],[7,5],[4,41],[7,5],[9,1],[8,15],[9,1],[7,51],[9,23],[7,6],[4,41],[7,4],[8,16],[9,1],[7,52],[9,20],[7,8],[4,42],[7,2],[9,1],[8,16],[9,1],[7,54],[9,17],[7,9],[4,44],[9,1],[8,16],[9,1],[7,56],[9,13],[7,11],[4,44],[9,1],[8,17],[9,1],[7,58],[9,7],[7,15],[4,42],[9,1],[8,18],[9,1],[7,81],[4,38],[7,3],[9,1],[8,18],[9,1],[7,81],[4,36],[7,5],[9,1],[8,19],[9,1],[7,81],[4,1],[3,1],[4,32],[7,5],[9,1],[8,20],[9,1],[7,79],[3,3],[4,6],[3,1],[4,24],[7,7],[9,1],[8,21],[7,79],[3,3],[4,6],[3,3],[4,21],[7,8],[9,1],[8,21],[9,1],[7,76],[3,5],[4,7],[3,3],[4,20],[7,7],[9,1],[8,22],[9,1],[7,72],[3,10],[4,6],[3,4],[4,19],[7,7],[9,1],[8,23],[9,1],[7,67],[3,15],[4,5],[3,5],[4,18],[7,7],[8,24],[9,1],[7,66],[3,17],[4,4],[3,7],[4,16],[7,6],[9,1],[8,25],[9,1],[7,64],[3,32],[4,13],[7,6],[8,26],[9,1],[7,63],[3,33],[4,13],[7,5],[9,1],[8,27],[9,1],[7,62],[3,35],[4,11],[7,5],[8,28],[9,1],[7,62],[3,38],[4,7],[7,5],[9,1],[8,29],[9,1],[7,58],[3,44],[4,4],[7,4],[9,1],[8,30],[9,1],[7,58],[3,44],[4,3],[7,5],[9,1],[8,31],[9,1],[7,56],[3,45],[4,2],[7,5],[9,1],[8,33],[7,56],[3,45],[7,7],[9,1],[8,33],[9,1],[7,55],[3,7],[7,3],[3,34],[7,7],[9,1],[8,35],[9,1],[7,54],[3,6],[7,4],[3,34],[7,7],[8,37],[7,54],[3,6],[7,3],[3,34],[7,7],[9,1],[8,37],[9,1],[7,53],[3,6],[7,2],[3,7],[7,3],[3,25],[7,6],[9,1],[8,39],[9,1],[7,52],[3,15],[7,3],[3,27],[7,3],[9,1],[8,41],[9,1],[7,52],[3,16],[7,1],[3,27],[7,2],[9,1],[8,43],[7,52],[3,43],[7,3],[9,1],[8,43],[9,1],[7,52],[3,43],[7,1],[9,1],[8,45],[9,1],[7,51],[3,43],[9,1],[8,47],[9,1],[7,51],[3,41],[9,1],[8,49],[9,1],[7,50],[3,30],[7,1],[3,9],[9,1],[8,51],[9,1],[7,48],[3,26],[7,7],[3,7],[9,1],[8,53],[9,1],[7,48],[3,24],[7,9],[3,5],[9,1],[8,55],[9,1],[7,47],[3,24],[7,7],[4,1],[3,5],[9,1],[8,57],[9,1],[7,46],[3,21],[7,9],[4,3],[3,2],[9,2],[8,59],[9,1],[7,45],[3,17],[7,13],[4,3],[3,1],[9,2],[8,62],[9,1],[7,43],[3,15],[7,14],[4,3],[3,1],[9,2],[8,64],[9,1],[7,38],[3,2],[7,1],[3,15],[7,16],[4,2],[9,2],[8,66],[9,2],[7,36],[3,15],[7,19],[4,1],[9,1],[8,70],[9,1],[7,35],[3,12],[7,21],[9,2],[8,72],[9,2],[7,33],[3,10],[7,22],[9,2],[8,74],[9,3],[7,32],[3,9],[7,20],[9,2],[8,78],[9,2],[7,34],[3,3],[7,21],[9,2],[8,82],[9,2],[7,55],[9,2],[8,85],[9,2],[7,51],[9,2],[8,89],[9,2],[7,47],[9,2],[8,93],[9,3],[7,41],[9,3],[8,97],[9,3],[7,26],[2,4],[7,6],[9,3],[8,102],[9,4],[7,21],[2,7],[7,3],[9,3],[8,107],[9,4],[7,14],[9,4],[2,2],[9,1],[2,2],[9,5],[8,113],[9,6],[7,8],[9,11],[8,122],[9,15],[8,774]]} diff --git a/docs/addon-status.md b/docs/addon-status.md index 831456d..e04fc1d 100644 --- a/docs/addon-status.md +++ b/docs/addon-status.md @@ -62,6 +62,7 @@ JEI declares Minecraft `[1.21, 1.21.1)` in every 1.21.1 build, which a strict re | Cobblemon Info for REI / JEI / EMI | 8 | 2.32.14+neoforge (MR `bxd0xXZI`) | MR | ✅ Declares Cobblemon `[1.7.1,)`. **In the pack** (2026-11-03, Adrian), on both sides: it reads the server's live spawn pool (the pack's zone pools); a client on a server without it falls back to Cobblemon's own spawn files. Shows spawns, drops, evolutions; doesn't know the pack's zone rule, so it lists a spawn's biomes, not its zone. Self-test `jei_addon_shows_island_spawns` | | Quests & Teams Fixes (flexible-mode soft-lock fix) | 8 | — | MR | ❌ Only 1.20.1 builds exist. Test the soft-lock on FTB Quests 2101.1.37 ourselves | | Iris Shaders | 9 | 1.8.14-beta.1+1.21.1-neoforge (MR `KduFYu4t`) | MR + CF | n/a (no Cobblemon dependency). **In the pack** (2026-11-09), client only. A beta, and the only NeoForge 1.21.1 build for Sodium 0.8; built against the pack's Sodium 0.8.13 | +| spark | 9 | 1.10.124 (MR `v5qtqRQi`, CF file `6225208`) | MR + CF | n/a (no Cobblemon dependency). **In the pack** (2026-11-09), server only: `tools/perf_test.py` and profiling during playtests | | Complementary Reimagined (shader pack) | 9 | r5.9.3 (MR `Bqen1mJX`) | MR + CF | n/a. **In the pack** (2026-11-09), off by default; client only | | spark | 9 | 1.10.124 (MR `v5qtqRQi`, CF `6225208`) | MR + CF | n/a | diff --git a/docs/balance.md b/docs/balance.md index 2c5820f..d06dba8 100644 --- a/docs/balance.md +++ b/docs/balance.md @@ -1,6 +1,6 @@ # Balance values -Every tunable lives in a config file or in this table. **Placeholder** means guessed and not yet approved by Adrian; never treat a placeholder as decided. +Every tunable lives in a config file or in this table. **Placeholder** means guessed and not yet approved by Adrian; never treat a placeholder as decided. Anything applied in `datapacks/core`, `config/` or a KubeJS server script can be changed on a running server without players updating: see "Balancing on a running server" in the README. | Value | Current | Status | Where it is applied | Notes | | --- | --- | --- | --- | --- | @@ -20,7 +20,7 @@ Every tunable lives in a config file or in this table. **Placeholder** means gue | Lines pinned to a zone | Durant, Torkoal, Heatmor → Basalt Furnace; Ditto → Deep Dark, rare bucket in slime chunks and ultra-rare elsewhere (Placeholder; Adrian, 2026-10-31: rare, in an endgame area) | Decided (Adrian, 2026-10-30) | `world/zones.json` → `species` | Basalt's own lines were all too big for its caves. Ditto breeds with anything, so it's an endgame find; Deep Dark target 21 lines, Button Isle 19, so nothing else moved | | Comfortable temperature range | 0.25–1.51 (Cold Sweat units; Cold Sweat: 0.4–1.51) | Decided (Adrian, 2026-10-30) | `config/coldsweat/main.toml` | Keeps the lowlands' nights livable without gear | | Windswept hills temperature | 45–72 °F (Cold Sweat: 24–58 °F) | Decided (Adrian, 2026-10-30) | `config/coldsweat/world.toml` | They lie in the starter lowlands too | -| Insulating armour | fur set (cold 10/14/12/10), hide set (heat 10/14/12/10), as Cold Sweat; leather armour none (Cold Sweat: 5/7/6/5 both) | Decided (Adrian, 2026-10-30) | `config/coldsweat/item.toml` | Frostpeak at noon: about 1 min bare, 14 min in fur; Sunscorch at noon: about 2 min bare, 25 min in hide | +| Insulating armour | fur set (cold 20/28/24/20), hide set (heat 20/28/24/20), twice Cold Sweat's, to keep the protected time when body temperature went ×3 (2026-11-09); leather armour none (Cold Sweat: 5/7/6/5 both) | Decided (Adrian, 2026-10-30) | `config/coldsweat/item.toml` | Frostpeak at noon: about 1 min bare, 14 min in fur; Sunscorch at noon: about 2 min bare, 25 min in hide | | Sewn-in insulation | goat fur 2 cold, hoglin hide 2 heat, wool 0.5 cold, leather 0.5/0.5 (Cold Sweat: wool 1.5, leather 1/1, rabbit hide 1.5 heat) | Decided (Adrian, 2026-10-30) | `config/coldsweat/item.toml` | | | Goat Fur / Hoglin Hide recipes | 8 wool + 1 Heat Rock → 8 Goat Fur; 8 leather + 1 Icy Rock → 8 Hoglin Hide (a set takes 24) | Decided (Adrian, 2026-10-30) | `kubejs/server_scripts/insulation.js` | Heat and Icy Rocks come from the guardians before Frostpeak and Sunscorch (archaeology finds too) | | Guardian respawn | 5 hours of game time after being beaten | Decided (Adrian, 2026-10-29) | `world/zones.json` → `guardian_respawn_hours` | Fixed spots | @@ -82,3 +82,14 @@ Every tunable lives in a config file or in this table. **Placeholder** means gue | Dev client heap (Prism) | 6 GB | Tooling | `tools/prism_instance.py --memory` | Not a gameplay value | Sections to fill as phases land: hazard damage (Phase 3), field-move cooldowns and caps (Phase 5), machine output (Phase 6), boss attack damage and telegraph times (Phase 7). +| Boss training | 170 EVs each in HP, Defense, Sp. Def | Placeholder | `tuning/server.json` → `boss_evs` | | +| Guardian and End boss wake range, leash | guardians 96 / 24 blocks, End boss 160 / 24 | Placeholder | `tuning/server.json` | | +| Summon spacing | one summoned legend per 96 blocks | Placeholder | `tuning/server.json` → `summon_spacing` | | +| Wanderer range | 64 blocks | Placeholder | `tuning/server.json` → `wanderer_range` | | +| Battle XP | ×1 (Cobblemon: ×2), half of before (Adrian, 2026-11-09) | Placeholder | `config/cobblemon/main.json` → `experienceMultiplier` | | +| Body temperature speed | ×3 (Cold Sweat: ×1), so heat and cold bite sooner (Adrian, 2026-11-09) | Placeholder | `config/coldsweat/main.toml` → `Rate Multiplier` | | +| Attacked by a wild Pokémon | starts a battle instead of hurting; a player with no Pokémon able to fight is hurt (Adrian, 2026-11-09) | Decided | `catching/AttackBattles.kt`; after fleeing 5 s of grace: `tuning/server.json` → `attack_battle_grace_ticks` | | +| Bosses' damage | only from battles; players, fire, falls and drowning do nothing (Adrian, 2026-11-09) | Decided | `boss/BossToughness.kt` | | +| Sea levels | channels between the islands are Shallows (Lv 5–20), everything beyond 1,500 blocks from the centre is Deep Sea (Lv 30–50) (Adrian, 2026-11-09) | Decided | `world/zones.json` → `deep_sea.rule.beyond` | Run `tools/zone_layout.py`, `zone_spawns.py`, `zone_bosses.py`, `zone_ores.py` after changing it | +| Starter | only faints: never removed, can't be released or sacrificed, a Revival Charm on it isn't used up (Adrian, 2026-11-09) | Decided | `permadeath/Permadeath.kt`, `mixin/HardcorePartyMixin.java` | Cobblemon's own record of each player's starter | +| Regional forms | a rare spawn (`homeless`) unless a line or an evolution brings them; Galarian Zapdos, Articuno, Moltres from Sigils, tier 2 (Adrian, 2026-11-09) | Placeholder | `world/zones.json` → `homeless.zones`, `world/summons.json` | Five regional evolutions got an island biome: `data/cobblemon/tags/worldgen/biome/evolution/regional/` | diff --git a/docs/checklists/phase-9.md b/docs/checklists/phase-9.md index 6d4e58f..f9aa357 100644 --- a/docs/checklists/phase-9.md +++ b/docs/checklists/phase-9.md @@ -12,8 +12,27 @@ - **Shaders:** Iris and Complementary Reimagined are installed, off by default. - **Left-out Pokémon:** 31 lines (67 species) spawn rarely in fitting zones (`docs/zone-species.md`). Automated: `spawn_pools_are_zoned`, `drop_sources_match_the_server`. +- **Reproducible build:** `tools/check_reproducible.py` compares two clean builds byte for byte. +- **Balance on the server:** `tools/server_update.py` updates a server without touching clients. Automated: `tools/check_server_update.py`, `drop_sources_reach_the_client`. +- **Performance:** `docs/performance.md`, from `tools/perf_test.py`. + +- **Adrian's list of 2026-11-09:** shortcuts, drop pages link to Cobblemon Info, real drop chances, bosses only hurt in battles, half the battle XP, low channels, quicker hazards, no item dots on the map, attacks start battles. Automated: `drop_chances_match_cobblemon`, `starter_only_faints`, `regional_forms_are_obtainable`, `new_players_get_the_quest_book`, `bosses_only_take_battle_damage`, `wild_attack_starts_a_battle`, `wild_attack_hurts_without_a_party`, `mire_poisons_without_waders`. + ## In game (Prism instance) +- [ ] Let your starter faint: it stays, fainted, and a Healing Machine wakes it. Try to release it and sacrifice it: both are refused. Any other Pokémon is still lost. +- [ ] A new player spawns with the quest book. Its first page walks through the basics; the second lists every HM. +- [ ] Are the regional forms' zones and rarity right? They're in `docs/zone-species.md`. +- [ ] R on an item shows recipes, U its uses, J the map, § the quest book (left of 1 on a Swiss keyboard). +- [ ] On JEI's Island Drops, click the Pokémon in the corner: Cobblemon Info's pages for it open. +- [ ] Hit a guardian with a sword, set it on fire: nothing happens. +- [ ] Anger a wild Pokémon: its attack starts a battle, you lose no hearts. With no Pokémon able to fight it hurts you. +- [ ] Walk into Sunscorch or Frostpeak: temperature moves about three times as fast. Into the Mire: poison starts within half a second. +- [ ] Dropped items show no dot on the minimap. +- [ ] The channels between the islands have Lv 5–20 Pokémon, the open sea around the island Lv 30–50. + +- [ ] Join a dedicated server with this pack: JEI's Island Drops, Boss Rewards and the rest are filled in. Change a drop, run `tools/server_update.py --install`, `/reload`: the page changes without relogging. (The client side of this can't be tested without a game window.) + - [ ] In the new save, mine into an ore node or vein: the mined blocks turn into faint glass, and you can keep aiming and mining the ore behind them. Sneak and use one: its info still shows. - [ ] Do nodes and veins feel right: fewer, bigger? The island has 1.5–3× the old ore; tell me if that's too much. - [ ] Give yourself a Sigil from JEI (creative) and use it outside its zone: it refuses and says where it works. Use it in its zone: the legend appears with a sound and particles. Fight it: area attacks, at most a quarter of its HP per attack. Weaken it and catch it; afterwards it's an ordinary Pokémon in your party (no quarter-HP limit in later battles). diff --git a/docs/design.md b/docs/design.md index 45c2526..9fb7451 100644 --- a/docs/design.md +++ b/docs/design.md @@ -81,8 +81,8 @@ A zone decides **which Pokémon spawn** and **at what levels**: Cobblemon's own | Highland Meadows | north-east around the peaks (20 %) | plains, forest, cherry grove | 25–35 | none | leather (Ponyta) for heat insulation, Hard Stone (Larvitar) | Rapidash, Lv 40 | | Sunscorch | the desert and badlands pockets: north of the ring channel, the north-east and north-west coasts (3.4 %) | desert, badlands | 30–45 | **heat** (Cold Sweat): heat insulation, Fire Resistance potions | armadillo scutes (Sandshrew), Soft Sand, magma cream (Numel) | Hippowdon, Lv 50 | | Frostpeak Range | the jagged peaks plus the windswept hills and cherry groves right next to them (6 %) | jagged peaks | 40–55 | **cold** (Cold Sweat): wool insulation; warming food and potions | Never-Melt Ice (Snover), Razor Claw (Sneasel) | Abomasnow, Lv 60 | -| Shallows | coast and beaches | ocean, lukewarm and warm ocean, beach | 5–20 | none | fish, kelp | none | -| Deep Sea | ring and band channels, outer sea | deep ocean | 30–50 | none | Heart Scale-type rarities | Lapras or Wailord, Lv 55 | +| Shallows | coast, beaches and the channels between the islands | ocean within 1,500 blocks, beach | 5–20 | none | fish, kelp | none | +| Deep Sea | the sea surrounding the island (Adrian, 2026-11-09: the ring and band channels moved to the Shallows) | ocean beyond 1,500 blocks | 30–50 | none | Heart Scale-type rarities | Lapras or Wailord, Lv 55 | | Lush Caves | under the whole island | lush caves | 12–28 | none | glow berries, mushrooms (Paras) | none | | Dripstone Depths | under the whole island | dripstone caves | 22–38 | none | Dragon Fang (Bagon, Gible) | none | | Deep Dark | under the cold and temperate land, deep (since 2026-10-30) | deep dark | 45–60 | darkness (vanilla sculk; no Warden) | | Sableye or Spiritomb, Lv 62 | @@ -306,7 +306,7 @@ Adrian's choices: Cobblemon tasks come from **Cobblemon Quests Reloaded** (a mai **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: `) 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). +- **Chapters** (20 with the HMs page of 2026-11-09, listing all 39 field moves): Getting Started (welcome, keys, the starter, battling, 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: `) 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/`, `guardian/`, `machine/` 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 ` 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. @@ -320,7 +320,7 @@ Adrian's choices: Cobblemon tasks come from **Cobblemon Quests Reloaded** (a mai The pages sit next to Cobblemon Info's own, and Adrian likes having both, so they share its look (2026-11-09): the same dark panel with a thin border, a header with icon, white title, warm tag on the right and a divider, the same text colours and spacing. Long text wraps. JEI gives all pages of a category the height of the tallest. -JEI runs on the client, which on a dedicated server doesn't have the server's data, so the pages are built from `assets/cobblesurvival/jei/drop_sources.json` inside the mod, written by `tools/jei_sources.py` from the pack's own files (Cobblemon's species drops with the pack's species additions, the zone spawn pools, guardians, the End boss, the machines, `world/zones.json` ores, Cobblebase's zone tables). Which ore a vein gives now lives in `world/zones.json` → `ores` → `item` (the quest book reads it too). Self-tests: `drop_sources_match_the_server` compares the file with the live server (every listed Pokémon's drops and zones, spawns with own drops, guardians, the End boss, altar tiers) and fails when it's stale; `jei_pages_build` builds every page with the same code JEI calls and checks every item exists. +JEI runs on the client, which on a dedicated server doesn't have the server's data, so the server sends the pages' data to each player on joining and after `/reload`: `data/cobblesurvival/drop_sources/pages.json`, written by `tools/jei_sources.py` from the pack's own files (Cobblemon's species drops with the pack's species additions, the zone spawn pools, guardians, the End boss, the machines, `world/zones.json` ores, Cobblebase's zone tables). Which ore a vein gives now lives in `world/zones.json` → `ores` → `item` (the quest book reads it too). Self-tests: `drop_sources_match_the_server` compares the file with the live server (every listed Pokémon's drops and zones, spawns with own drops, guardians, the End boss, altar tiers) and fails when it's stale; `jei_pages_build` builds every page with the same code JEI calls and checks every item exists. ## Phase 9: balancing and release (Adrian, 2026-11-09) @@ -341,6 +341,18 @@ Self-tests: `every_implemented_pokemon_is_obtainable` (every implemented species **The respawn block** (Regenerating Ore Veins' regenerator, the placeholder where a mined vein block grows back) no longer stops the player's aim, so the ore behind it can be mined; it never had collision. While sneaking the player can still target it, which is how its info opens. A mixin returns an empty outline shape (`RegeneratorBlockMixin.java`, the mod's only one, targeting the class by name). Its model and glass come from `pack/kubejs/assets/regenerating_ore_veins/`, much fainter than the stained glass it had. Self-test `regenerator_lets_the_aim_through` casts a real ray at it. +### Drop chances on the JEI pages (Adrian, 2026-11-09) + +The pages first showed each table's raw percentage, which isn't what a player gets. Cobblemon's `DropTable.getDrops` makes `amount` picks; in each it walks the table in order and takes the first entry that passes its percentage, so later entries are rarer than written. A count of 0 gives nothing. `tools/jei_sources.py` now works out the real chance of getting at least one, and the self-test `drop_chances_match_cobblemon` rolls Cobblemon's own code 4,000 times for every Pokémon and compares. The Pokémon in a page's corner is Cobblemon Info's own JEI ingredient, so clicking it opens that mod's pages. + +### Balancing without a client update (Adrian, 2026-11-09) + +Playtesters shouldn't have to reinstall for a number change. The server is the authority for everything that isn't drawn: Cobblemon, recipes, quests and Cold Sweat send clients what they need, and the pack's data pack now does too. A server can hold `config/cobblesurvival/datapack.zip`, which the companion mod loads in place of the copy in its jar, under the same pack id, so a world keeps it enabled. One file, so nothing left over from an older version; `/reload` applies it. + +The JEI pages were the one thing clients took from the jar. Their data moved into the data pack; the server gzips it and sends it on joining and on `/reload` (`DropSources`). JEI can start before or after that packet, so the plugin both builds from what has arrived and swaps pages in the running JEI (`hideRecipes` and `addRecipes`). Numbers that only lived in Kotlin moved to `data/cobblesurvival/tuning/server.json` (`Tuning`). + +`tools/server_update.py` packages this. It hashes what clients run or draw against `tools/client-baseline.json`, the last pack handed out, and refuses when they differ, rather than letting players find out from a crash or a missing texture. + ## Open decisions for Adrian (proceeding with the default, flagged) | Decision | Default used for now | diff --git a/docs/licenses.md b/docs/licenses.md index 0d5adb4..98a1bab 100644 --- a/docs/licenses.md +++ b/docs/licenses.md @@ -46,6 +46,7 @@ Read each license before adding a mod, and add a row here in the same change. | Cobbreeding | Ludichat, Fuzuki | "MIT, no AI, no reupload" ([text](https://fuzuki.dev/~fuzuki/mit-no-ai-no-reupload.txt)): MIT terms, but the mod may not be used to train or improve machine-learning models, and may not be reuploaded unchanged to CurseForge or Modrinth except bundled in a modpack | [Modrinth](https://modrinth.com/mod/cobbreeding), [source](https://gitlab.com/ludichat/Cobbreeding) | Phase 5: breeding (both). Referenced only, never copied. Not on CurseForge by the authors' choice | | Cloth Config API | shedaniel | LGPL-3.0-only | [Modrinth](https://modrinth.com/mod/cloth-config) | Cobbreeding dependency (client) | | Iris Shaders | IrisShaders (coderbot, IMS and contributors) | LGPL-3.0-only | [Modrinth](https://modrinth.com/mod/iris) | Phase 9: runs shader packs (client) | +| spark | lucko and contributors | GPL-3.0-only | [Modrinth](https://modrinth.com/mod/spark) | Phase 9: server profiler for playtests (server only) | | Complementary Shaders - Reimagined | EminGT (Complementary Development) | [Complementary License Agreement](https://github.com/ComplementaryDevelopment/ComplementaryReimagined/blob/main/License.txt) | [Modrinth](https://modrinth.com/shader/complementary-reimagined) | Phase 9: the included shader pack, off by default (client). Allowed in modpacks unmodified and only through Modrinth's or CurseForge's own systems, never as an uploaded file | | Cobblemon Quests Reloaded | WinterWolfSV (original); community fork | CC-BY-NC-4.0 (jar metadata; the CurseForge page says "custom", the fork keeps the original's non-commercial license) | [CurseForge](https://www.curseforge.com/minecraft/mc-mods/cobblemon-quest-reloaded) | Phase 8: Cobblemon task types for FTB Quests (both). Not on Modrinth. Non-commercial: fine for this free pack | | Cobblemon Info for REI / JEI / EMI | Akkiruk | MIT | [Modrinth](https://modrinth.com/project/qekxLrOP) | Phase 8: spawns, drops and evolutions in JEI (both) | diff --git a/docs/performance.md b/docs/performance.md new file mode 100644 index 0000000..2e0a13e --- /dev/null +++ b/docs/performance.md @@ -0,0 +1,75 @@ +# Performance + +Generated by `tools/perf_test.py`: the island world template, a 6G heap, 120 s to settle, then 180 s measured tick by tick with spark profiling the server thread. +Players are the self-tests' fake clients: the server ticks them, loads their chunks and spawns Pokémon around them. One walks a long ring round the island when there are several. They send and encode no packets and fight no battles, so read this as the cost of the world, not of the network. + +A tick has 50 ms; over that, the server falls behind. + +| Scenario | Players | Pastures × Pokémon each | Machines each | Mean tick | p95 | p99 | Worst | Ticks over 50 ms | Pokémon pastured / wild | Working machines | Loaded chunks | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| solo | 1 | 0 × 0 | 0 | 4.6 ms | 6.4 ms | 9.8 ms | 216 ms | 1 of 3900 | 0 / 18 | 0 of 0 | 2731 | +| group | 5 | 4 × 8 | 5 | 19.2 ms | 25.7 ms | 33.3 ms | 269 ms | 2 of 3900 | 113 / 175 | 16 of 25 | 8704 | +| stress | 8 | 6 × 16 | 10 | 38.3 ms | 50.4 ms | 54.9 ms | 322 ms | 215 of 3900 | 558 / 246 | 46 of 80 | 10763 | + +## Where the server thread's busy time goes: solo + +| Part | Share | +| --- | --- | +| Minecraft | 46.2 % | +| Other mods | 39.0 % | +| JVM and Kotlin | 11.4 % | +| Cobblemon | 3.1 % | +| Companion mod | 0.3 % | + +Companion mod, heaviest methods including what they call: + +- `dev.cobblesurvival.selftest.PerfLoad$$Lambda.0x000000080138d638.accept`: 2.02 % +- `dev.cobblesurvival.selftest.PerfLoad.register$onTickDone`: 2.00 % +- `dev.cobblesurvival.selftest.PerfLoad.onTickDone`: 2.00 % +- `dev.cobblesurvival.progress.HmsGate$$Lambda.0x0000000801380c60.accept`: 0.12 % +- `dev.cobblesurvival.progress.HmsGate.register$onServerTick`: 0.10 % +- `dev.cobblesurvival.progress.HmsGate.onServerTick`: 0.10 % +- `dev.cobblesurvival.progress.HmsGate.check`: 0.07 % +- `dev.cobblesurvival.progress.QuestEvents$$Lambda.0x000000080137b338.accept`: 0.07 % + +## Where the server thread's busy time goes: group + +| Part | Share | +| --- | --- | +| Minecraft | 61.4 % | +| Other mods | 20.6 % | +| JVM and Kotlin | 13.2 % | +| Cobblemon | 4.5 % | +| Companion mod | 0.2 % | + +Companion mod, heaviest methods including what they call: + +- `dev.cobblesurvival.selftest.PerfLoad$$Lambda.0x0000000801394200.accept`: 1.34 % +- `dev.cobblesurvival.selftest.PerfLoad.register$onTickDone`: 1.32 % +- `dev.cobblesurvival.selftest.PerfLoad.onTickDone`: 1.32 % +- `dev.cobblesurvival.selftest.PerfLoad.walk`: 0.24 % +- `dev.cobblesurvival.machine.MachineBlock$$Lambda.0x00000008022acee8.tick`: 0.13 % +- `dev.cobblesurvival.machine.MachineBlock.getTicker$lambda$1`: 0.13 % +- `dev.cobblesurvival.machine.MachineBlockEntity.serverTick`: 0.13 % +- `dev.cobblesurvival.progress.CobblebaseGate$Gate.invoke`: 0.08 % + +## Where the server thread's busy time goes: stress + +| Part | Share | +| --- | --- | +| Minecraft | 58.4 % | +| Other mods | 18.9 % | +| JVM and Kotlin | 17.0 % | +| Cobblemon | 5.5 % | +| Companion mod | 0.2 % | + +Companion mod, heaviest methods including what they call: + +- `dev.cobblesurvival.selftest.PerfLoad$$Lambda.0x0000000801386618.accept`: 1.02 % +- `dev.cobblesurvival.selftest.PerfLoad.register$onTickDone`: 1.02 % +- `dev.cobblesurvival.selftest.PerfLoad.onTickDone`: 1.02 % +- `dev.cobblesurvival.machine.MachineBlock$$Lambda.0x00000008022c2988.tick`: 0.31 % +- `dev.cobblesurvival.machine.MachineBlock.getTicker$lambda$1`: 0.30 % +- `dev.cobblesurvival.machine.MachineBlockEntity.serverTick`: 0.30 % +- `dev.cobblesurvival.selftest.PerfLoad.walk`: 0.27 % +- `dev.cobblesurvival.machine.MachineWork.tick`: 0.15 % diff --git a/docs/quests.yaml b/docs/quests.yaml index b0a42c5..dc3db3f 100644 --- a/docs/quests.yaml +++ b/docs/quests.yaml @@ -83,16 +83,50 @@ chapters: 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. + This book suggests what to do next. Nothing in it is locked and it gives no rewards: do things in any order you like. This first page walks through how the island works; the next one lists every field move your Pokémon can lend you. tasks: - checkmark: true title: Read this - - id: first_partner - title: A Partner + - id: keys + title: Keys Worth Knowing + icon: minecraft:tripwire_hook + after: [welcome] + text: | + § (left of 1) opens this book. J opens the map. + R sends out the Pokémon selected on the left of your screen, or calls it back. Up and down arrows pick another. N opens its summary. + Over an item in your inventory or JEI, R shows how to get it and U what it's used for. + V shows more detail on what you're looking at. M switches shaders on and off. Everything can be changed in Options > Controls. + tasks: + - checkmark: true + title: Got it + - id: starter + title: Your First Partner icon: cobblemon:poke_ball after: [welcome] text: | - Weaken a wild Pokémon in battle, then throw a Poké Ball at it. + When you first arrive you choose a starter. Look after it: it is the only Pokémon on the island that can never be lost. + When it faints it stays with you, fainted, until you heal it. It can't be released or sacrificed. + Every other Pokémon is gone for good when it faints. + tasks: + - checkmark: true + title: Read this + - id: battling + title: Battling + icon: minecraft:iron_sword + after: [starter] + text: | + Look at a wild Pokémon and press R: your Pokémon goes out and the battle starts. + Wild Pokémon can also come to you. One that attacks you starts a battle instead of hurting you, unless none of your Pokémon can fight: then you take the hit yourself. + Pokémon stronger than your team hunt you; weaker ones keep their distance. In a battle you can run, and you get a few seconds' head start. + tasks: + - cobblemon: defeat + amount: 1 + - id: first_partner + title: Your First Catch + icon: cobblemon:poke_ball + after: [battling] + text: | + Weaken a wild Pokémon in battle, then throw a Poké Ball at it. The weaker it is, the easier it is to catch, and a Pokémon far above your team's level is much harder. tasks: - cobblemon: catch amount: 1 @@ -105,6 +139,15 @@ chapters: tasks: - item: cobblemon:poke_ball count: 16 + - id: pc_pasture + title: PC and Pastures + icon: cobblemon:pasture + after: [first_partner] + text: | + A PC holds the Pokémon that don't fit in your party. A Pasture Block lets them out to roam around your base. + Pastured Pokémon also work: open the pasture and give them a skill, such as mining or gathering, and they bring in items. What they can find depends on the zone the pasture stands in, and JEI's Pasture Finds pages list it. + tasks: + - item: cobblemon:pasture - id: full_team title: A Full Team icon: cobblemon:great_ball @@ -119,8 +162,8 @@ chapters: 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. + Apart from your starter, 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. Your starter doesn't need one. tasks: - item: cobblesurvival:revival_charm - id: healing @@ -128,7 +171,7 @@ chapters: 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. + Sleeping doesn't heal your Pokémon. A Healing Machine does, and it also wakes a fainted starter, but it is expensive and recharges slowly; potions and berries help in between. tasks: - item: cobblemon:healing_machine - id: level_10 @@ -158,6 +201,46 @@ chapters: tasks: - cobblemon: evolve amount: 1 + - id: zones + title: Zones and Guardians + icon: minecraft:filled_map + after: [level_10] + text: | + Each zone has its own Pokémon and level range; the book has a page for each. The channels between the islands are gentle, the open sea around them is not. + Most zones have a guardian: a giant Pokémon with a health bar at the top of your screen when you are near. Only a battle can hurt it, and it can lose at most a quarter of its health to one attack. Beat it for its rewards; it comes back hours later. + tasks: + - checkmark: true + title: Read this + - id: hazards + title: Heat, Cold and Poison + icon: minecraft:leather_chestplate + after: [zones] + text: | + Some zones hurt to be in. Sunscorch is hot and Frostpeak is cold: your body temperature climbs or falls quickly there, so wear hide against heat and fur against cold. + The Mangrove Mire poisons you unless you wear Mire Waders. Look these up in JEI with R. + tasks: + - checkmark: true + title: Read this + - id: ores + title: Ore Comes from Veins + icon: minecraft:raw_iron + after: [zones] + text: | + There is no ore in ordinary stone. Each zone has its own nodes and underground veins, which grow back after you mine them. JEI's Ore Veins pages show what grows where. + A Pokémon that knows Rock Smash can mine a whole vein with one punch: see the HMs page of this book. + tasks: + - checkmark: true + title: Read this + - id: machines + title: Pokémon at Work + icon: cobblesurvival:heat_core + after: [zones] + text: | + Machines are small buildings with a Pokémon inside: a Large Furnace, a Generator, a Drop Synthesizer, a Sacrifice Altar and a Rebirth Chamber. Craft a core, use it, and ghost blocks show how to build around it. + JEI lists each core's recipe, and each machine's own page says what it makes. + tasks: + - checkmark: true + title: Read this - id: beyond title: Beyond Button Isle icon: minecraft:compass @@ -168,6 +251,127 @@ chapters: - event: zone/southwold title: Reach Southwold + - id: hms + title: HMs + subtitle: Every field move your Pokémon can lend you + icon: minecraft:iron_pickaxe + quests: + - id: how + title: How HMs Work + icon: minecraft:iron_pickaxe + size: 1.5 + text: | + Any Pokémon of yours that has learned one of these moves can use it for you outside battle. There is nothing to craft or learn yourself. + Send the Pokémon out, sneak and right-click it, and pick Field moves. It lists what that Pokémon can do; hover over one to read about it. The top left of your screen shows what is active. + + Partner HMs go to your empty hand: one per Pokémon, fired with a click. + Auras and weather work on you while the Pokémon is out and within 24 blocks. + Mount toggles help the Pokémon itself while you ride it. + + Working makes a Pokémon hungry. Right-click it with any berry to feed it. If it works on an empty stomach it loses friendship, and at none it refuses. + tasks: + - checkmark: true + title: Read this + - id: gathering + title: Gathering and Building + icon: minecraft:iron_axe + after: [how] + text: | + Cut: fells a whole tree, or clears the plants in front of you. + Rock Smash: breaks a stone block, or mines up to 32 connected ore in one punch, and veins still grow back. + Dig: takes dirt, sand, gravel, clay and snow in one hit. + Leafage: grows nearby crops, saplings and berry trees at once, and covers bare ground in flowers. Sneak to till soil instead. + Stockpile: drinks water or lava, then spits it back out where you aim. + Strength: pushes the block you aim at one block, in any direction, along with anything inside it. + Tail Whip: sweeps suspicious sand or gravel clean in one go. + tasks: + - checkmark: true + title: Read this + - id: handy + title: Handy Tricks + icon: minecraft:ender_pearl + after: [how] + text: | + Teleport: blinks you up to 30 blocks to where you look (30 seconds to recharge). + Charge: turns a block into a lasting redstone power source. Use it again to switch it off. + Camouflage: makes you look like the creature you aim at for 15 minutes. + Celebrate: fireworks over your head, for no reason at all. + tasks: + - checkmark: true + title: Read this + - id: changing + title: Changing a Pokémon + icon: minecraft:nether_star + after: [how] + text: | + Growth: makes the Pokémon you aim at one size bigger for good; aim elsewhere and you grow for 5 minutes. + Minimize: the same, but smaller. + Outrage: turns an XL Pokémon of yours into an Alpha. + Calm Mind: settles an Alpha of yours back into an ordinary Pokémon. + Decorate: one roll at making the Pokémon you aim at shiny for good, once an hour. + tasks: + - checkmark: true + title: Read this + - id: exploring + title: Exploring Auras + icon: minecraft:spyglass + after: [how] + text: | + Flash: lets you see in the dark. Needs the Dripstone gate. + Dive: breathe, walk and mine at full speed underwater. Needs the Mire gate. + Rock Climb: walls work like ladders, on foot or riding. Needs the Highlands gate. + Magnet Rise: slow flight for building. Double-tap jump to lift off. Needs the Sunscorch gate. + Lava Plume: the same as Dive, for lava, with fire immunity. Needs the Deep Dark gate. + Jump: jump higher and land safely. Comes from Splash. + Shadow Sneak: walk silently, unseen by pressure plates and sculk, at a reduced speed. + Snowscape: snow under your feet, and still water freezes as you walk across it. + + A gate means the Pokémon must have reached the top level of that zone, or hold one of its materials: its ore, evolution stone or guardian's drop. + tasks: + - checkmark: true + title: Read this + - id: helping + title: Helping Auras + icon: minecraft:honey_bottle + after: [how] + text: | + Absorb: loose items drift toward you. + Lucky Chant: more from what you break and fish. Needs the Frostpeak gate. + Sweet Scent: draws a wild Pokémon of the area about once a minute, like a Poké Snack. What the Pokémon holds works as seasoning. + tasks: + - checkmark: true + title: Read this + - id: weather + title: Weather + icon: minecraft:snowball + after: [how] + text: | + Only one weather runs at a time: the last one switched on wins. + Rain Dance: real rain around you, anywhere; it puts out fires and counts for rain evolutions and spawns. + Thunder: a thunderstorm around you. + Sunny Day: keeps the sky clear. + Blizzard: real snow falls and settles around you. + Sandstorm: soul sand and honey don't slow you, and sand, gravel and clay break four times as fast. + Mist: anything hunting you loses you once you're 8 blocks away. Needs the Mire gate. + tasks: + - checkmark: true + title: Read this + - id: mounts + title: Mount Toggles + icon: minecraft:saddle + after: [how] + text: | + Switch these on from the Field moves of the Pokémon you ride. They stay on for that Pokémon. + Surf: much faster through water. + Tailwind: faster through the air. + Agility: faster on land. + Swift: reaches top speed twice as quickly. + U-turn: turns far more sharply. + Endure: double the stamina. + tasks: + - checkmark: true + title: Read this + - id: button_isle zone: button_isle title: Button Isle @@ -359,3 +563,14 @@ chapters: 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 + +layout: + getting_started/beyond: [6.0, 0.75] + getting_started/drops: [4.0, 3.0] + getting_started/evolve: [6.0, -0.75] + getting_started/first_partner: [2.0, -0.75] + getting_started/full_team: [4.0, -3.0] + getting_started/healing: [4.0, 0.0] + getting_started/level_10: [4.0, 1.5] + getting_started/permadeath: [4.0, -1.5] + getting_started/poke_balls: [2.0, 0.75] diff --git a/docs/roadmap.md b/docs/roadmap.md index 3d1a66e..a619f4f 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -193,6 +193,8 @@ Goal: a quest book that points players onward, laid out like a research tree who - **Every implemented Pokémon is obtainable** (Adrian, 2026-11-09). Every species Cobblemon has a model for must be reachable somewhere in the world, even if rarely or through crafting: a wild spawn, evolving a wild line, a fossil, or a crafted or summoned encounter. Legendaries and the like count too; they can be very rare or expensive. Checked on 2026-11-09: 95 of 905 implemented species are not reachable by a wild spawn or by evolving a wild line (legendaries, fossils, and lines the zone assignment left out, such as Aron, Litwick and Piplup). Report what is missing with a tool or self-test so new Cobblemon versions can't reopen the gap. - **A shader pack included** (Adrian, 2026-11-09). Ship [Iris](https://modrinth.com/mod/iris) (client only) and [Complementary Reimagined](https://modrinth.com/shader/complementary-reimagined), installed but off by default; players switch it on with a key or in Video Settings. Iris 1.8.14-beta.1+1.21.1-neoforge (MR `KduFYu4t`) is built against Sodium 0.8.13, which the pack already pins; it is the only NeoForge 1.21.1 build for Sodium 0.8, and a beta. Complementary r5.9.3 (MR `Bqen1mJX`) has the most downloads of the common shader packs and keeps a vanilla-like look, which suits Cobblemon's models. Its license allows modpacks if it is left unmodified, credited where the pack is described when it's on by default (it isn't; it's credited anyway), and added through Modrinth or CurseForge's own systems, never as an uploaded file: the private pack has to download it from Modrinth. Check that Cobblemon's models, the machine and boss particles and the see-through blocks render properly with it on, and measure the frame-rate cost. - **Performance.** Profile with spark on a server with realistic pen and machine counts; cap entity density through pasture config if needed. +- **Reproducible builds** (Adrian, 2026-11-09). The same commit gives the same bytes: pinned JDK, packwiz, Gradle plugins and Python packages; `tools/check_reproducible.py` proves it. +- **Balancing on the server** (Adrian, 2026-11-09). Balance changes reach playtesters without a client update: `tools/server_update.py`, a server-held data pack, JEI pages sent by the server. - **Multiplayer test** with Adrian's group. - **Release.** Final `docs/licenses.md`, credits and non-affiliation disclaimer; publish client and server packs on Modrinth and CurseForge as dependency-based packs. diff --git a/docs/zone-species.md b/docs/zone-species.md index f22fceb..c2f19fd 100644 --- a/docs/zone-species.md +++ b/docs/zone-species.md @@ -2,45 +2,45 @@ Generated by `tools/zone_spawns.py` from Cobblemon's spawn data and `world/zones.json`; do not edit by hand. Each evolution line spawns in one zone of the island; the stages listed are the ones whose levels reach the zone's band. Pin a line to another zone in `world/zones.json` → `species`. The End's lines spawn there as well as in their island zone. -## Button Isle (Lv 2–10, 25 lines) +## Button Isle (Lv 2–10, 24 lines) -Bidoof, Bonsly, Caterpie (Butterfree, Caterpie, Metapod), Combee, Gimmighoul, Hoothoot, Kricketot (Kricketot, Kricketune), Ledyba, Meditite, Meowth, Morpeko, Nincada, Pachirisu, Rattata, Sableye, Scatterbug (Scatterbug, Spewpa), Skitty, Smeargle, Spinarak, Sunkern, Tarountula, Weedle (Beedrill, Kakuna, Weedle), Wooper, Wurmple (Beautifly, Cascoon, Dustox, Silcoon, Wurmple), Wynaut +Bidoof, Bonsly, Caterpie (Butterfree, Caterpie, Metapod), Combee, Gimmighoul, Hoothoot, Kricketot (Kricketot, Kricketune), Ledyba, Meditite, Morpeko, Nincada, Pachirisu, Rattata, Sableye, Scatterbug (Scatterbug, Spewpa), Skitty, Smeargle, Spinarak, Sunkern, Tarountula, Weedle (Beedrill, Kakuna, Weedle), Wooper, Wurmple (Beautifly, Cascoon, Dustox, Silcoon, Wurmple), Wynaut -## Frostpeak Range (Lv 40–55, 49 lines) +## Frostpeak Range (Lv 40–55, 53 lines) -Axew (Fraxure, Haxorus), Basculin (Basculegion, Basculin), Bergmite (Avalugg), Budew (Roselia, Roserade), Cetoddle (Cetitan), Cherubi (Cherrim), Chespin (Chesnaught, Quilladin), Chikorita (Bayleef, Meganium), Chimchar (Infernape, Monferno), Cryogonal, Cubchoo (Beartic), Cufant (Copperajah), Delibird, Duraludon (Archaludon, Duraludon), Eiscue, Elekid (Electabuzz, Electivire), Gossifleur (Eldegoss), Larvitar (Pupitar, Tyranitar), Machop (Machamp, Machoke), Makuhita (Hariyama), Mankey (Annihilape, Primeape), Mienfoo (Mienshao), Minior, Rhyhorn (Rhydon, Rhyperior), Riolu (Lucario), Rockruff (Lycanroc), Rowlet (Dartrix, Decidueye), Rufflet (Braviary), Salandit, Sawk, Skiddo (Gogoat), Smoochum (Jynx), Sneasel (Sneasel, Sneasler), Snom (Frosmoth), Snorunt (Froslass, Glalie), Snover (Abomasnow), Spinda, Spoink (Grumpig), Sprigatito (Floragato, Meowscarada), Spritzee (Aromatisse), Stantler (Stantler, Wyrdeer), Starly (Staraptor), Swinub (Mamoswine, Piloswine), Throh, Togedemaru, Togepi (Togekiss, Togetic), Tyrogue (Hitmonchan, Hitmonlee, Hitmontop), Vanillite (Vanillish, Vanilluxe), Wooloo (Dubwool) +Alolan Sandshrew (Sandshrew), Alolan Vulpix (Vulpix), Axew (Fraxure, Haxorus), Basculin (Basculegion, Basculin), Bergmite (Avalugg), Budew (Roselia, Roserade), Cetoddle (Cetitan), Cherubi (Cherrim), Chespin (Chesnaught, Quilladin), Chikorita (Bayleef, Meganium), Chimchar (Infernape, Monferno), Cryogonal, Cubchoo (Beartic), Cufant (Copperajah), Delibird, Duraludon (Archaludon, Duraludon), Eiscue, Elekid (Electabuzz, Electivire), Galarian Darumaka (Darumaka), Gossifleur (Eldegoss), Hisuian Zorua (Zorua), Larvitar (Pupitar, Tyranitar), Machop (Machamp, Machoke), Makuhita (Hariyama), Mankey (Annihilape, Primeape), Mienfoo (Mienshao), Minior, Rhyhorn (Rhydon, Rhyperior), Riolu (Lucario), Rockruff (Lycanroc), Rowlet (Dartrix, Decidueye), Rufflet (Braviary), Salandit, Sawk, Skiddo (Gogoat), Smoochum (Jynx), Sneasel (Sneasel, Sneasler), Snom (Frosmoth), Snorunt (Froslass, Glalie), Snover (Abomasnow), Spinda, Spoink (Grumpig), Sprigatito (Floragato, Meowscarada), Spritzee (Aromatisse), Stantler (Stantler, Wyrdeer), Starly (Staraptor), Swinub (Mamoswine, Piloswine), Throh, Togedemaru, Togepi (Togekiss, Togetic), Tyrogue (Hitmonchan, Hitmonlee, Hitmontop), Vanillite (Vanillish, Vanilluxe), Wooloo (Dubwool) -## Sunscorch (Lv 30–45, 36 lines) +## Sunscorch (Lv 30–45, 38 lines) -Bramblin (Brambleghast), Cacnea (Cacnea, Cacturne), Capsakid (Capsakid, Scovillain), Cubone (Cubone, Marowak), Drampa, Dwebble (Crustle, Dwebble), Ekans (Arbok), Falinks, Fennekin (Braixen, Delphox, Fennekin), Flittle (Espathra), Fuecoco (Crocalor, Fuecoco, Skeledirge), Girafarig (Farigiraf, Girafarig), Helioptile (Heliolisk), Hippopotas (Hippopotas, Hippowdon), Kangaskhan, Klawf, Larvesta, Litleo (Litleo, Pyroar), Maractus, Nacli (Garganacl, Naclstack), Numel (Camerupt, Numel), Pawniard, Phanpy (Donphan, Phanpy), Poltchageist (Poltchageist, Sinistcha), Rellor (Rabsca), Sandile (Krokorok, Krookodile), Sandshrew (Sandshrew, Sandslash), Scraggy (Scrafty, Scraggy), Shinx (Luxio, Luxray), Silicobra (Sandaconda, Silicobra), Skarmory, Skorupi (Drapion, Skorupi), Spearow (Fearow), Totodile (Croconaw, Feraligatr, Totodile), Trapinch (Flygon, Vibrava), Tympole (Palpitoad, Seismitoad) +Bramblin (Brambleghast), Cacnea (Cacnea, Cacturne), Capsakid (Capsakid, Scovillain), Cubone (Cubone, Marowak), Drampa, Dwebble (Crustle, Dwebble), Ekans (Arbok), Falinks, Fennekin (Braixen, Delphox, Fennekin), Flittle (Espathra), Fuecoco (Crocalor, Fuecoco, Skeledirge), Girafarig (Farigiraf, Girafarig), Helioptile (Heliolisk), Hippopotas (Hippopotas, Hippowdon), Hisuian Growlithe (Growlithe), Kangaskhan, Klawf, Larvesta, Litleo (Litleo, Pyroar), Maractus, Nacli (Garganacl, Naclstack), Numel (Camerupt, Numel), Paldean Tauros (Tauros), Pawniard, Phanpy (Donphan, Phanpy), Poltchageist (Poltchageist, Sinistcha), Rellor (Rabsca), Sandile (Krokorok, Krookodile), Sandshrew (Sandshrew, Sandslash), Scraggy (Scrafty, Scraggy), Shinx (Luxio, Luxray), Silicobra (Sandaconda, Silicobra), Skarmory, Skorupi (Drapion, Skorupi), Spearow (Fearow), Totodile (Croconaw, Feraligatr, Totodile), Trapinch (Flygon, Vibrava), Tympole (Palpitoad, Seismitoad) -## Mangrove Mire (Lv 25–38, 20 lines) +## Mangrove Mire (Lv 25–38, 21 lines) -Arrokuda (Arrokuda, Barraskewda), Croagunk (Croagunk, Toxicroak), Dondozo, Ducklett (Ducklett, Swanna), Flamigo, Froakie (Froakie, Frogadier, Greninja), Hatenna (Hatenna, Hattrem), Illumise, Karrablast (Escavalier, Karrablast), Misdreavus, Mudkip (Marshtomp, Mudkip, Swampert), Shelmet (Accelgor, Shelmet), Slowpoke, Sobble (Drizzile, Inteleon, Sobble), Surskit (Masquerain, Surskit), Tadbulb (Bellibolt, Tadbulb), Tatsugiri, Toedscool (Toedscool, Toedscruel), Volbeat, Yanma (Yanma, Yanmega) +Croagunk (Croagunk, Toxicroak), Dondozo, Ducklett (Ducklett, Swanna), Flamigo, Froakie (Froakie, Frogadier, Greninja), Galarian Stunfisk (Stunfisk), Hatenna (Hatenna, Hattrem), Illumise, Karrablast (Escavalier, Karrablast), Misdreavus, Mudkip (Marshtomp, Mudkip, Swampert), Paldean Tauros (Tauros), Shelmet (Accelgor, Shelmet), Slowpoke, Sobble (Drizzile, Inteleon, Sobble), Surskit (Masquerain, Surskit), Tadbulb (Bellibolt, Tadbulb), Tatsugiri, Toedscool (Toedscool, Toedscruel), Volbeat, Yanma (Yanma, Yanmega) -## Verdant Jungle (Lv 18–30, 29 lines) +## Verdant Jungle (Lv 18–30, 30 lines) -Aipom, Bellsprout (Bellsprout, Weepinbell), Bounsweet (Bounsweet, Steenee, Tsareena), Bulbasaur (Bulbasaur, Ivysaur), Chatot, Darumaka, Exeggcute (Exeggcute, Exeggutor), Fomantis, Grookey (Grookey, Thwackey), Jangmo-o, Kecleon, Komala, Litten (Litten, Torracat), Natu (Natu, Xatu), Pancham, Panpour (Panpour, Simipour), Pansage (Pansage, Simisage), Pansear (Pansear, Simisear), Pikipek (Pikipek, Toucannon, Trumbeak), Shroodle (Grafaiai, Shroodle), Slakoth (Slakoth, Vigoroth), Snivy (Servine, Snivy), Stufful (Bewear, Stufful), Stunfisk, Tangela (Tangela, Tangrowth), Treecko (Grovyle, Treecko), Tropius, Unown, Woobat (Swoobat, Woobat) +Aipom, Bellsprout (Bellsprout, Weepinbell), Bounsweet (Bounsweet, Steenee, Tsareena), Bulbasaur (Bulbasaur, Ivysaur), Chatot, Darumaka, Exeggcute (Exeggcute, Exeggutor), Fomantis, Galarian Slowpoke (Slowpoke), Grookey (Grookey, Thwackey), Jangmo-o, Kecleon, Komala, Litten (Litten, Torracat), Natu (Natu, Xatu), Pancham, Panpour (Panpour, Simipour), Pansage (Pansage, Simisage), Pansear (Pansear, Simisear), Pikipek (Pikipek, Toucannon, Trumbeak), Shroodle (Grafaiai, Shroodle), Slakoth (Slakoth, Vigoroth), Snivy (Servine, Snivy), Stufful (Bewear, Stufful), Stunfisk, Tangela (Tangela, Tangrowth), Treecko (Grovyle, Treecko), Tropius, Unown, Woobat (Swoobat, Woobat) -## Highland Meadows (Lv 25–35, 41 lines) +## Highland Meadows (Lv 25–35, 43 lines) -Abra (Abra, Alakazam, Kadabra), Blitzle (Blitzle, Zebstrika), Bouffalant, Buizel (Buizel, Floatzel), Chewtle (Chewtle, Drednaw), Cottonee (Cottonee, Whimsicott), Cyclizar, Cyndaquil (Cyndaquil, Quilava), Doduo (Dodrio, Doduo), Electrike (Electrike, Manectric), Fletchling (Fletchinder, Fletchling, Talonflame), Golett, Hoppip (Hoppip, Jumpluff, Skiploom), Igglybuff (Jigglypuff, Wigglytuff), Lechonk (Lechonk, Oinkologne), Lickitung (Lickilicky, Lickitung), Mareep (Ampharos, Flaaffy, Mareep), Miltank, Mudbray (Mudbray, Mudsdale), Nymble (Lokix), Oddish (Bellossom, Gloom, Oddish, Vileplume), Pidgey (Pidgeotto, Pidgey), Poliwag (Politoed, Poliwag, Poliwhirl, Poliwrath), Ponyta, Poochyena (Mightyena), Psyduck (Golduck, Psyduck), Quaxly (Quaxly, Quaxwell), Scorbunny (Cinderace, Raboot, Scorbunny), Seviper, Sinistea (Polteageist, Sinistea), Spiritomb, Squirtle (Squirtle, Wartortle), Stonjourner, Tauros, Tepig (Pignite, Tepig), Tinkatink (Tinkatink, Tinkatuff), Torchic (Combusken, Torchic), Turtwig (Grotle, Torterra, Turtwig), Vulpix (Ninetales, Vulpix), Zangoose, Zorua (Zoroark, Zorua) +Abra (Abra, Alakazam, Kadabra), Alolan Diglett (Diglett), Blitzle (Blitzle, Zebstrika), Bouffalant, Buizel (Buizel, Floatzel), Chewtle (Chewtle, Drednaw), Cottonee (Cottonee, Whimsicott), Cyclizar, Cyndaquil (Cyndaquil, Quilava), Doduo (Dodrio, Doduo), Electrike (Electrike, Manectric), Fletchling (Fletchinder, Fletchling, Talonflame), Golett, Hoppip (Hoppip, Jumpluff, Skiploom), Igglybuff (Jigglypuff, Wigglytuff), Lechonk (Lechonk, Oinkologne), Lickitung (Lickilicky, Lickitung), Mareep (Ampharos, Flaaffy, Mareep), Miltank, Mudbray (Mudbray, Mudsdale), Nymble (Lokix), Oddish (Bellossom, Gloom, Oddish, Vileplume), Paldean Tauros (Tauros), Pidgey (Pidgeotto, Pidgey), Poliwag (Politoed, Poliwag, Poliwhirl, Poliwrath), Ponyta, Poochyena (Mightyena), Psyduck (Golduck, Psyduck), Quaxly (Quaxly, Quaxwell), Scorbunny (Cinderace, Raboot, Scorbunny), Seviper, Sinistea (Polteageist, Sinistea), Spiritomb, Squirtle (Squirtle, Wartortle), Stonjourner, Tauros, Tepig (Pignite, Tepig), Tinkatink (Tinkatink, Tinkatuff), Torchic (Combusken, Torchic), Turtwig (Grotle, Torterra, Turtwig), Vulpix (Ninetales, Vulpix), Zangoose, Zorua (Zoroark, Zorua) -## Westmarch (Lv 15–25, 27 lines) +## Westmarch (Lv 15–25, 30 lines) -Applin (Appletun, Applin, Dipplin, Flapple), Buneary, Corphish, Dedenne, Deerling, Dewpider (Araquanid, Dewpider), Dratini, Emolga, Flabébé (Flabébé, Floette), Gible (Gabite, Gible), Goomy, Magikarp (Gyarados, Magikarp), Munchlax, Nickit (Nickit, Thievul), Petilil (Lilligant, Petilil), Phantump, Pichu (Pichu, Pikachu), Pineco, Rotom, Scyther, Seedot (Nuzleaf, Seedot), Sewaddle (Sewaddle, Swadloon), Shroomish (Breloom, Shroomish), Skwovet (Greedent, Skwovet), Stunky, Tandemaus (Maushold, Tandemaus), Teddiursa +Alolan Geodude (Geodude), Applin (Appletun, Applin, Dipplin, Flapple), Buneary, Corphish, Dedenne, Deerling, Dewpider (Araquanid, Dewpider), Dratini, Emolga, Flabébé (Flabébé, Floette), Gible (Gabite, Gible), Goomy, Happiny (Chansey, Happiny), Magikarp (Gyarados, Magikarp), Munchlax, Nickit (Nickit, Thievul), Noibat, Petilil (Lilligant, Petilil), Phantump, Pichu (Pichu, Pikachu), Pineco, Rotom, Scyther, Seedot (Nuzleaf, Seedot), Sewaddle (Sewaddle, Swadloon), Shroomish (Breloom, Shroomish), Skwovet (Greedent, Skwovet), Stunky, Tandemaus (Maushold, Tandemaus), Teddiursa -## Southwold (Lv 8–18, 53 lines) +## Southwold (Lv 8–18, 54 lines) -Audino, Azurill (Azumarill, Azurill, Marill), Bunnelby, Burmy, Chingling, Corsola, Drifloon, Dunsparce, Eevee, Farfetch'd, Furfrou, Gastly, Glameow, Goldeen, Grimer, Grubbin, Happiny (Chansey, Happiny), Hawlucha, Heracross, Koffing, Lillipup (Herdier, Lillipup), Lotad (Lombre, Lotad), Magnemite, Minccino, Minun, Nidoran♀ (Nidoran♀, Nidorina), Nidoran♂ (Nidoran♂, Nidorino), Noibat, Patrat, Pidove, Pinsir, Plusle, Porygon, Pumpkaboo, Relicanth, Sentret (Furret, Sentret), Shuppet, Smoliv, Squawkabilly, Swablu, Taillow, Tentacool, Timburr, Toxel, Tynamo, Venonat, Voltorb, Whismur, Wimpod, Yamask, Yamper, Yungoos, Zigzagoon +Audino, Azurill (Azumarill, Azurill, Marill), Bunnelby, Burmy, Chingling, Corsola, Drifloon, Dunsparce, Eevee, Farfetch'd, Furfrou, Galarian Meowth (Meowth), Galarian Zigzagoon (Zigzagoon), Gastly, Glameow, Goldeen, Grimer, Grubbin, Hawlucha, Heracross, Koffing, Lillipup (Herdier, Lillipup), Lotad (Lombre, Lotad), Magnemite, Meowth, Minccino, Minun, Nidoran♀ (Nidoran♀, Nidorina), Nidoran♂ (Nidoran♂, Nidorino), Patrat, Pidove, Pinsir, Plusle, Porygon, Pumpkaboo, Relicanth, Sentret (Furret, Sentret), Shuppet, Smoliv, Squawkabilly, Swablu, Taillow, Tentacool, Timburr, Toxel, Tynamo, Venonat, Voltorb, Whismur, Wimpod, Yamask, Yamper, Yungoos, Zigzagoon -## Shallows (Lv 5–20, 21 lines) +## Deep Sea (Lv 30–50, 24 lines) -Alomomola, Bruxish, Carvanha, Chinchou, Clobbopus, Crabrawler, Cramorant, Finizen, Finneon, Inkay, Krabby, Luvdisc, Mareanie, Pincurchin, Pyukumuku, Qwilfish, Sandygast, Shellos, Wiglett, Wingull, Wishiwashi +Alomomola, Arrokuda (Barraskewda), Binacle (Barbaracle, Binacle), Clamperl (Clamperl, Gorebyss, Huntail), Clauncher (Clauncher, Clawitzer), Dhelmise, Dreepy (Drakloak), Frillish (Frillish, Jellicent), Horsea (Horsea, Kingdra, Seadra), Inkay (Malamar), Lapras, Mantyke (Mantine, Mantyke), Oshawott (Dewott, Oshawott, Samurott), Piplup (Empoleon, Piplup, Prinplup), Popplio (Brionne, Popplio, Primarina), Remoraid (Octillery, Remoraid), Seel (Dewgong, Seel), Shellder (Cloyster, Shellder), Skrelp (Dragalge, Skrelp), Spheal (Sealeo, Walrein), Staryu (Starmie, Staryu), Veluza, Wailmer (Wailmer, Wailord), Wattrel (Kilowattrel) -## Deep Sea (Lv 30–50, 21 lines) +## Shallows (Lv 5–20, 20 lines) -Binacle (Barbaracle, Binacle), Clamperl (Clamperl, Gorebyss, Huntail), Clauncher (Clauncher, Clawitzer), Dhelmise, Dreepy (Drakloak), Frillish (Frillish, Jellicent), Horsea (Horsea, Kingdra, Seadra), Lapras, Mantyke (Mantine, Mantyke), Oshawott (Dewott, Oshawott, Samurott), Piplup (Empoleon, Piplup, Prinplup), Popplio (Brionne, Popplio, Primarina), Remoraid (Octillery, Remoraid), Seel (Dewgong, Seel), Shellder (Cloyster, Shellder), Skrelp (Dragalge, Skrelp), Spheal (Sealeo, Walrein), Staryu (Starmie, Staryu), Veluza, Wailmer (Wailmer, Wailord), Wattrel (Kilowattrel) +Bruxish, Carvanha, Chinchou, Clobbopus, Crabrawler, Cramorant, Finizen, Finneon, Hisuian Qwilfish (Qwilfish), Krabby, Luvdisc, Mareanie, Pincurchin, Pyukumuku, Qwilfish, Sandygast, Shellos, Wiglett, Wingull, Wishiwashi ## Lush Caves (Lv 12–28, 22 lines) diff --git a/mod/build.gradle.kts b/mod/build.gradle.kts index c63dc1f..7cd23fc 100644 --- a/mod/build.gradle.kts +++ b/mod/build.gradle.kts @@ -1,7 +1,7 @@ plugins { id("java") - id("dev.architectury.loom") version ("1.11-SNAPSHOT") - id("architectury-plugin") version ("3.4-SNAPSHOT") + id("dev.architectury.loom") version ("1.11.458") + id("architectury-plugin") version ("3.4.164") // Must read the stdlib that Kotlin for Forge ships (5.12.0 -> Kotlin 2.4.0). kotlin("jvm") version ("2.4.0") } @@ -62,6 +62,12 @@ kotlin { } tasks { + // Same sources, same bytes (tools/check_reproducible.py). + withType().configureEach { + isPreserveFileTimestamps = false + isReproducibleFileOrder = true + } + test { useJUnitPlatform() } diff --git a/mod/src/main/java/dev/cobblesurvival/mixin/HardcorePartyMixin.java b/mod/src/main/java/dev/cobblesurvival/mixin/HardcorePartyMixin.java new file mode 100644 index 0000000..0f931e0 --- /dev/null +++ b/mod/src/main/java/dev/cobblesurvival/mixin/HardcorePartyMixin.java @@ -0,0 +1,33 @@ +package dev.cobblesurvival.mixin; + +import com.cobblemon.mod.common.pokemon.Pokemon; +import dev.cobblesurvival.permadeath.Permadeath; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * A player's starter only faints, it is never removed (Adrian, 2026-11-09). CobbleHardcoreMon has no exception of its + * own: this leaves its Revival Charm alone and skips its removal. Named by string, so the companion mod needs it only at run time. + */ +@Pseudo +@Mixin(targets = "dev.matthiesen.cobblehardcoremon.common.handlers.PlayerPokeParty", remap = false) +abstract class HardcorePartyMixin { + @Inject(method = "popPokemonTotem", at = @At("HEAD"), cancellable = true) + private void cobblesurvival$keepCharm(Pokemon pokemon, CallbackInfoReturnable result) { + if (Permadeath.INSTANCE.isStarter(pokemon)) result.setReturnValue(false); + } + + @Inject(method = "alertPlayerAndRemovedPokemon(Lcom/cobblemon/mod/common/pokemon/Pokemon;)V", at = @At("HEAD"), cancellable = true) + private void cobblesurvival$keepStarter(Pokemon pokemon, CallbackInfo info) { + if (Permadeath.INSTANCE.isStarter(pokemon)) info.cancel(); + } + + @Inject(method = "alertPlayerAndRemovedPokemon(Lcom/cobblemon/mod/common/pokemon/Pokemon;ZLjava/lang/String;)V", at = @At("HEAD"), cancellable = true) + private void cobblesurvival$keepStarter(Pokemon pokemon, boolean soulLink, String partner, CallbackInfo info) { + if (Permadeath.INSTANCE.isStarter(pokemon)) info.cancel(); + } +} diff --git a/mod/src/main/kotlin/dev/cobblesurvival/CobbleSurvival.kt b/mod/src/main/kotlin/dev/cobblesurvival/CobbleSurvival.kt index 314e7a3..3aeb08a 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/CobbleSurvival.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/CobbleSurvival.kt @@ -1,5 +1,14 @@ package dev.cobblesurvival +import dev.cobblesurvival.catching.AttackBattles +import dev.cobblesurvival.jei.DropSources +import net.neoforged.fml.loading.FMLPaths +import net.minecraft.server.packs.PackSelectionConfig +import net.minecraft.server.packs.PackLocationInfo +import net.minecraft.server.packs.FilePackResources +import java.util.Optional +import java.nio.file.Path +import java.nio.file.Files import com.cobblemon.mod.common.Cobblemon import com.cobblemon.mod.common.api.pokemon.PokemonSpecies import com.mojang.logging.LogUtils @@ -17,6 +26,7 @@ import dev.cobblesurvival.machine.MachineShowcase import dev.cobblesurvival.machine.Machines import dev.cobblesurvival.party.ShoulderPassives import dev.cobblesurvival.progress.Gates +import dev.cobblesurvival.selftest.PerfLoad import dev.cobblesurvival.selftest.SelfTest import dev.cobblesurvival.world.OnlyPokemon import dev.cobblesurvival.world.SharedLoot @@ -54,6 +64,7 @@ import thedarkcolour.kotlinforforge.neoforge.forge.MOD_BUS class CobbleSurvival { companion object { const val MOD_ID = "cobblesurvival" + private val serverData: Path by lazy { FMLPaths.CONFIGDIR.get().resolve("cobblesurvival/datapack.zip") } val LOGGER: Logger = LogUtils.getLogger() val version: String @@ -61,6 +72,11 @@ class CobbleSurvival { .map { it.modInfo.version.toString() } .orElse("unknown") + /** Which balance is live: `/cobblesurvival data`, read over RCON by tools/check_server_update.py. */ + fun dataLine() = "data ${if (Files.isRegularFile(serverData)) "server" else "jar"}; " + + "pages ${Integer.toHexString(DropSources.packed.contentHashCode())}; " + + "boss_evs ${Tuning.values.boss_evs}; pokemon_pages ${DropSources.data.pokemon.size}" + /** One line the server smoke test reads over RCON to confirm the mod is live. */ fun statusLine() = "$MOD_ID $version ok; cobblemon ${Cobblemon.VERSION}; species ${PokemonSpecies.count()}" @@ -69,6 +85,7 @@ class CobbleSurvival { init { LOGGER.info("Cobblemon Survival companion {} loaded (Cobblemon {})", version, Cobblemon.VERSION) MOD_BUS.addListener(::onAddPackFinders) + DropSources.register(MOD_BUS) InZoneCondition.register(MOD_BUS) Machines.register(MOD_BUS) Summons.register(MOD_BUS) @@ -78,6 +95,7 @@ class CobbleSurvival { NeoForge.EVENT_BUS.addListener(OnlyPokemon::onChunkLoad) NeoForge.EVENT_BUS.addListener(OnlyPokemon::onEntityJoin) NeoForge.EVENT_BUS.addListener(OnlyPokemon::onServerTick) + Tuning.register() Permadeath.register() ZoneCondition.register() NeoForge.EVENT_BUS.addListener(Zones::onAddReloadListeners) @@ -92,12 +110,14 @@ class CobbleSurvival { OreNodes.register() BaseLoot.register() Catching.register() + AttackBattles.register() Wanderers.register() SharedLoot.register() SpecialPokemon.register() ZoneHazards.register() LevelPressure.register() SelfTest.register() + PerfLoad.register() } /** The island world type has no Nether, so a lit obsidian frame must not turn into a dead portal. */ @@ -108,16 +128,27 @@ class CobbleSurvival { } } - /** Ships datapacks/core from the repo as a built-in data pack that is always on, in every world. */ + /** + * Ships datapacks/core from the repo as a built-in data pack that is always on, in every world. A server with + * `config/cobblesurvival/datapack.zip` (tools/server_update.py; Adrian, 2026-11-09) loads that instead, under the + * same pack id: balance changes need no new jar for the server or anybody's client, and `/reload` applies them. + */ private fun onAddPackFinders(event: AddPackFindersEvent) { - event.addPackFinders( - ResourceLocation.fromNamespaceAndPath(MOD_ID, "datapacks/core"), - PackType.SERVER_DATA, - Component.literal("Cobblemon Survival core data"), - PackSource.BUILT_IN, - true, - Pack.Position.TOP, - ) + val title = Component.literal("Cobblemon Survival core data") + val core = ResourceLocation.fromNamespaceAndPath(MOD_ID, "datapacks/core") + if (event.packType != PackType.SERVER_DATA || !Files.isRegularFile(serverData)) { + event.addPackFinders(core, PackType.SERVER_DATA, title, PackSource.BUILT_IN, true, Pack.Position.TOP) + return + } + LOGGER.info("Loading the core data pack from {} instead of the mod jar", serverData) + event.addRepositorySource { packs -> + Pack.readMetaAndCreate( + PackLocationInfo("mod/$core", title, PackSource.BUILT_IN, Optional.empty()), + FilePackResources.FileResourcesSupplier(serverData), + PackType.SERVER_DATA, + PackSelectionConfig(true, Pack.Position.TOP, false), + )?.let { packs.accept(it) } + } } private fun onRegisterCommands(event: RegisterCommandsEvent) { @@ -127,6 +158,11 @@ class CobbleSurvival { context.source.sendSuccess({ Component.literal(statusLine()) }, false) 1 }) + .then(Commands.literal("data").executes { context -> + context.source.sendSuccess({ Component.literal(dataLine()) }, false) + 1 + }) + .then(PerfLoad.command()) .then(BiomePreview.command()) .then(OreVeins.command()) .then(MachineShowcase.command()) diff --git a/mod/src/main/kotlin/dev/cobblesurvival/Tuning.kt b/mod/src/main/kotlin/dev/cobblesurvival/Tuning.kt new file mode 100644 index 0000000..466f720 --- /dev/null +++ b/mod/src/main/kotlin/dev/cobblesurvival/Tuning.kt @@ -0,0 +1,42 @@ +package dev.cobblesurvival + +import com.google.gson.Gson +import com.google.gson.JsonElement +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener +import net.minecraft.util.profiling.ProfilerFiller +import net.neoforged.neoforge.common.NeoForge +import net.neoforged.neoforge.event.AddReloadListenerEvent + +/** + * The balance numbers the server's code reads that have no data file of their own: `data/cobblesurvival/tuning/server.json`. + * In the data pack so a server can change them without a new jar for anybody (tools/server_update.py); `/reload` applies them. + * A field the file leaves out keeps its default here. + */ +object Tuning : SimpleJsonResourceReloadListener(Gson(), "tuning") { + class Values( + val boss_evs: Int = 170, + val guardian_wake_range: Double = 96.0, + val guardian_leash: Double = 24.0, + val end_boss_wake_range: Double = 160.0, + val end_boss_leash: Double = 24.0, + val summon_spacing: Double = 96.0, + val wanderer_range: Double = 64.0, + val attack_battle_grace_ticks: Int = 100, + ) + + private val FILE = ResourceLocation.fromNamespaceAndPath(CobbleSurvival.MOD_ID, "server") + + @Volatile + var values = Values() + private set + + fun register() { + NeoForge.EVENT_BUS.addListener { it.addListener(this) } + } + + override fun apply(files: Map, manager: ResourceManager, profiler: ProfilerFiller) { + values = files[FILE]?.let { Gson().fromJson(it, Values::class.java) } ?: Values() + } +} diff --git a/mod/src/main/kotlin/dev/cobblesurvival/boss/BossToughness.kt b/mod/src/main/kotlin/dev/cobblesurvival/boss/BossToughness.kt index 90f075e..b0eea35 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/boss/BossToughness.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/boss/BossToughness.kt @@ -10,8 +10,12 @@ import com.cobblemon.mod.common.battles.pokemon.BattlePokemon import com.cobblemon.mod.common.entity.pokemon.PokemonEntity import com.cobblemon.mod.common.pokemon.IVs import com.cobblemon.mod.common.pokemon.Pokemon +import dev.cobblesurvival.Tuning import dev.cobblesurvival.zone.Guardians import net.minecraft.network.chat.Component +import net.minecraft.tags.DamageTypeTags +import net.neoforged.neoforge.common.NeoForge +import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent /** * Bosses are big and tough, not strong (Adrian, 2026-11-02: Eternatus was too small and too easy; guardians should be @@ -25,10 +29,19 @@ import net.minecraft.network.chat.Component */ object BossToughness : HeldItemManager { const val WARD = "guardiansward" - const val EVS = 170 + val EVS get() = Tuning.values.boss_evs private val DEFENSIVE = listOf(Stats.HP, Stats.DEFENCE, Stats.SPECIAL_DEFENCE) - fun register() = HeldItemProvider.register(this, Priority.HIGHEST) + fun register() { + HeldItemProvider.register(this, Priority.HIGHEST) + NeoForge.EVENT_BUS.addListener(::onDamage) + } + + /** Only a battle may hurt a boss (Adrian, 2026-11-09): no players, Pokémon outside battle, fire, falls or drowning. `/kill` still works. */ + private fun onDamage(event: LivingIncomingDamageEvent) { + val entity = event.entity as? PokemonEntity ?: return + if (isBoss(entity.pokemon) && !event.source.`is`(DamageTypeTags.BYPASSES_INVULNERABILITY)) event.isCanceled = true + } fun isBoss(pokemon: Pokemon): Boolean { val data = pokemon.persistentData diff --git a/mod/src/main/kotlin/dev/cobblesurvival/boss/EndBoss.kt b/mod/src/main/kotlin/dev/cobblesurvival/boss/EndBoss.kt index 791b24d..fcff12d 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/boss/EndBoss.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/boss/EndBoss.kt @@ -1,5 +1,6 @@ package dev.cobblesurvival.boss +import dev.cobblesurvival.Tuning import com.cobblemon.mod.common.api.Priority import com.cobblemon.mod.common.api.events.CobblemonEvents import com.cobblemon.mod.common.api.events.battles.BattleFaintedEvent @@ -38,8 +39,8 @@ object EndBoss { /** Its entry in [GuardianState]. */ private const val STATE = "the_end" private const val CHECK_TICKS = 40 - private const val NEAR = 160.0 - private const val LEASH = 24.0 + private val NEAR get() = Tuning.values.end_boss_wake_range + private val LEASH get() = Tuning.values.end_boss_leash private const val TICKS_PER_HOUR = 72000.0 /** Where it stands: south of the exit portal, on the island's top. */ private val SPOT_XZ = BlockPos(0, 0, 24) diff --git a/mod/src/main/kotlin/dev/cobblesurvival/catching/AttackBattles.kt b/mod/src/main/kotlin/dev/cobblesurvival/catching/AttackBattles.kt new file mode 100644 index 0000000..5498826 --- /dev/null +++ b/mod/src/main/kotlin/dev/cobblesurvival/catching/AttackBattles.kt @@ -0,0 +1,50 @@ +package dev.cobblesurvival.catching + +import com.cobblemon.mod.common.api.events.CobblemonEvents +import com.cobblemon.mod.common.battles.BattleBuilder +import com.cobblemon.mod.common.battles.BattleRegistry +import com.cobblemon.mod.common.battles.ErroredBattleStart +import com.cobblemon.mod.common.entity.pokemon.PokemonEntity +import dev.cobblesurvival.Tuning +import dev.cobblesurvival.boss.BossToughness +import net.minecraft.server.level.ServerPlayer +import net.neoforged.neoforge.common.NeoForge +import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent +import java.util.UUID + +/** + * A wild Pokémon that attacks a player starts a battle instead of hurting them (Adrian, 2026-11-09). A player with no + * Pokémon able to fight still takes the hit, so the wilds stay dangerous to them. After fleeing, a moment's grace + * (`tuning/server.json` → `attack_battle_grace_ticks`) to get away, or the same Pokémon would pull them straight back. + * A boss in a battle hits through: those are its area attacks. + */ +object AttackBattles { + /** Game time until which a hit on this player does nothing: a battle is being set up, or they have just fled. */ + private val graceUntil = HashMap() + + fun register() { + NeoForge.EVENT_BUS.addListener(::onDamage) + CobblemonEvents.BATTLE_FLED.subscribe { event -> + event.battle.players.forEach { graceUntil[it.uuid] = it.serverLevel().gameTime + Tuning.values.attack_battle_grace_ticks } + } + } + + private fun onDamage(event: LivingIncomingDamageEvent) { + val player = event.entity as? ServerPlayer ?: return + val attacker = event.source.entity as? PokemonEntity ?: return + if (attacker.pokemon.isPlayerOwned() || (attacker.isBattling && BossToughness.isBoss(attacker.pokemon))) return + if (BattleRegistry.getBattleByParticipatingPlayer(player) != null) { + event.isCanceled = true + return + } + val now = player.serverLevel().gameTime + if (now < (graceUntil[player.uuid] ?: 0L)) { + event.isCanceled = true + return + } + if (BattleBuilder.pve(player, attacker) !is ErroredBattleStart) { + graceUntil[player.uuid] = now + Tuning.values.attack_battle_grace_ticks + event.isCanceled = true + } + } +} diff --git a/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSources.kt b/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSources.kt index e33e30b..581b3a1 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSources.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSources.kt @@ -1,18 +1,40 @@ package dev.cobblesurvival.jei import com.google.gson.Gson +import com.google.gson.JsonElement +import dev.cobblesurvival.CobbleSurvival +import io.netty.buffer.ByteBuf import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.network.codec.ByteBufCodecs +import net.minecraft.network.codec.StreamCodec +import net.minecraft.network.protocol.common.custom.CustomPacketPayload import net.minecraft.resources.ResourceLocation +import net.minecraft.server.packs.resources.ResourceManager +import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener +import net.minecraft.util.profiling.ProfilerFiller import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items +import net.neoforged.bus.api.IEventBus +import net.neoforged.neoforge.common.NeoForge +import net.neoforged.neoforge.event.AddReloadListenerEvent +import net.neoforged.neoforge.event.OnDatapackSyncEvent +import net.neoforged.neoforge.network.PacketDistributor +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent +import net.neoforged.neoforge.network.handling.IPayloadContext +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.util.zip.GZIPInputStream +import java.util.zip.GZIPOutputStream /** * Where items come from on the island (roadmap Phase 8), for the pack's JEI pages ([DropSourcesJei]): - * `assets/cobblesurvival/jei/drop_sources.json`, written by tools/jei_sources.py from the pack's data. It ships inside - * the mod because JEI runs on the client, which on a dedicated server has none of the server's data; the self-test - * `drop_sources_match_the_server` checks it against the live server instead. Fields as tools/jei_sources.py writes them. + * `data/cobblesurvival/drop_sources/pages.json`, written by tools/jei_sources.py from the pack's data. JEI runs on the + * client, which on a dedicated server has none of the server's data, so the server sends this file to each player who + * joins and again after `/reload`: the pages show the server's balance whatever version a player installed (Adrian, + * 2026-11-09). The self-test `drop_sources_match_the_server` checks it against the live server. Fields as + * tools/jei_sources.py writes them. */ -object DropSources { +object DropSources : SimpleJsonResourceReloadListener(Gson(), "drop_sources") { class Drop(val item: String, val count: String?, val chance: Double?) class Reward(val item: String, val count: Int) class Spawned(val zone: String, val levels: String) @@ -45,11 +67,65 @@ object DropSources { val pasture_finds: List, ) - const val PATH = "/assets/cobblesurvival/jei/drop_sources.json" + /** The file's text, gzipped, as sent to clients. */ + class Payload(val packed: ByteArray) : CustomPacketPayload { + override fun type() = TYPE + } - val data: Data by lazy { - val stream = DropSources::class.java.getResourceAsStream(PATH) ?: error("$PATH is missing from the mod") - stream.reader(Charsets.UTF_8).use { Gson().fromJson(it, Data::class.java) } + val TYPE = CustomPacketPayload.Type(ResourceLocation.fromNamespaceAndPath(CobbleSurvival.MOD_ID, "drop_sources")) + private val CODEC: StreamCodec = ByteBufCodecs.BYTE_ARRAY.map(::Payload, Payload::packed) + private val FILE = ResourceLocation.fromNamespaceAndPath(CobbleSurvival.MOD_ID, "pages") + private val NOTHING = Data(emptyMap(), emptyList(), emptyList(), emptyList(), emptyList(), + EndBoss("", 0, 0, 0, 0.0, emptyList()), Altar(emptyList(), emptyList()), emptyList(), emptyList(), emptyList()) + + /** What the pages show: on a server, its data pack; on a client, what the server last sent. */ + @Volatile + var data: Data = NOTHING + private set + + /** The current data as sent to clients. */ + var packed = ByteArray(0) + private set + + /** Set by the JEI plugin while it runs; called on the client thread after the server sent data. */ + var onReceived: (() -> Unit)? = null + + fun register(modBus: IEventBus) { + modBus.addListener { + // Optional: a client from before this change can still join, it only misses the pages. + it.registrar("1").optional().playToClient(TYPE, CODEC, ::receive) + } + NeoForge.EVENT_BUS.addListener { it.addListener(this) } + NeoForge.EVENT_BUS.addListener(::sync) + } + + override fun apply(files: Map, manager: ResourceManager, profiler: ProfilerFiller) { + val file = files[FILE] ?: return + packed = pack(file.toString()) + data = parse(packed) + } + + /** On joining and after `/reload`. */ + private fun sync(event: OnDatapackSyncEvent) { + val payload = Payload(packed) + event.relevantPlayers.filter { it.connection.hasChannel(TYPE) }.forEach { PacketDistributor.sendToPlayer(it, payload) } + } + + private fun receive(payload: Payload, context: IPayloadContext) { + // On a singleplayer client the integrated server has already put the same bytes here. + if (!payload.packed.contentEquals(packed)) { + packed = payload.packed + data = parse(packed) + } + onReceived?.invoke() + } + + fun pack(text: String): ByteArray = ByteArrayOutputStream().also { out -> + GZIPOutputStream(out).use { it.write(text.toByteArray(Charsets.UTF_8)) } + }.toByteArray() + + fun parse(packed: ByteArray): Data = GZIPInputStream(ByteArrayInputStream(packed)).reader(Charsets.UTF_8).use { + Gson().fromJson(it, Data::class.java) } fun zoneName(zone: String?): String = zone?.let { data.zones[it]?.name ?: it } ?: "anywhere" diff --git a/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSourcesJei.kt b/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSourcesJei.kt index 6c239a7..ab8c595 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSourcesJei.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/jei/DropSourcesJei.kt @@ -7,9 +7,11 @@ import dev.cobblesurvival.CobbleSurvival import dev.cobblesurvival.summon.Summons import mezz.jei.api.IModPlugin import mezz.jei.api.JeiPlugin +import mezz.jei.api.constants.VanillaTypes import mezz.jei.api.gui.builder.IRecipeLayoutBuilder import mezz.jei.api.gui.drawable.IDrawable import mezz.jei.api.gui.ingredient.IRecipeSlotsView +import mezz.jei.api.ingredients.IIngredientType import mezz.jei.api.ingredients.subtypes.ISubtypeInterpreter import mezz.jei.api.ingredients.subtypes.UidContext import mezz.jei.api.recipe.IFocusGroup @@ -21,6 +23,7 @@ import mezz.jei.api.registration.IRecipeCategoryRegistration import mezz.jei.api.registration.IExtraIngredientRegistration import mezz.jei.api.registration.IRecipeRegistration import mezz.jei.api.registration.ISubtypeRegistration +import mezz.jei.api.runtime.IJeiRuntime import net.minecraft.ChatFormatting import net.minecraft.client.Minecraft import net.minecraft.client.gui.Font @@ -46,16 +49,20 @@ import net.minecraft.world.item.component.ItemLore @JeiPlugin class DropSourcesJei : IModPlugin { /** One page: an icon and title with a short [tag], rows of text, and the items it gives. */ - class Page(val icon: ItemStack, val title: Component, val tag: String, val rows: List, val outputs: List) + class Page(val icon: ItemStack, val title: Component, val tag: String, val rows: List, val outputs: List, val species: String? = null) /** A line of text, wrapped if long, with optional [right]-aligned text on its first line. */ class Row(val left: Component, val right: Component? = null) class Output(val stack: ItemStack, val notes: List) private class Kind(val path: String, val title: String, val icon: String, val catalysts: List, val pages: () -> List) { val type: RecipeType = RecipeType.create(CobbleSurvival.MOD_ID, path, Page::class.java) - val built by lazy(pages) + var built: List = emptyList() } + private var runtime: IJeiRuntime? = null + /** The server data [Kind.built] was made from. */ + private var builtFrom: DropSources.Data? = null + private val kinds = listOf( Kind("pokemon_drops", "Island Drops", "cobblemon:poke_ball", listOf("cobblesurvival:synthesis_core"), ::pokemonPages), Kind("boss_rewards", "Boss Rewards", "minecraft:netherite_sword", emptyList(), ::bossPages), @@ -82,8 +89,10 @@ class DropSourcesJei : IModPlugin { override fun registerCategories(registration: IRecipeCategoryRegistration) { val gui = registration.jeiHelpers.guiHelper + builtFrom = DropSources.data + kinds.forEach { it.built = it.pages() } registration.addRecipeCategories(*kinds.map { kind -> - PageCategory(kind.type, Component.literal(kind.title), gui.createDrawableItemStack(DropSources.stack(kind.icon)), kind.built) + PageCategory(kind.type, Component.literal(kind.title), gui.createDrawableItemStack(DropSources.stack(kind.icon))) { kind.built } }.toTypedArray()) } @@ -95,15 +104,65 @@ class DropSourcesJei : IModPlugin { kinds.forEach { kind -> kind.catalysts.forEach { registration.addRecipeCatalyst(DropSources.stack(it), kind.type) } } } - class PageCategory(private val type: RecipeType, private val title: Component, private val icon: IDrawable, pages: List) : IRecipeCategory { + override fun onRuntimeAvailable(jeiRuntime: IJeiRuntime) { + runtime = jeiRuntime + DropSources.onReceived = ::refresh + refresh() + } + + override fun onRuntimeUnavailable() { + runtime = null + DropSources.onReceived = null + } + + /** The server's data can arrive after JEI has started, and changes with `/reload`: swaps the pages in the running JEI. */ + private fun refresh() { + val jei = runtime ?: return + if (builtFrom === DropSources.data) return + builtFrom = DropSources.data + val listed = jei.ingredientManager.getAllIngredients(VanillaTypes.ITEM_STACK).mapNotNull { Summons.speciesOf(it) }.toSet() + val newSigils = sigils().filter { Summons.speciesOf(it) !in listed } + if (newSigils.isNotEmpty()) jei.ingredientManager.addIngredientsAtRuntime(VanillaTypes.ITEM_STACK, newSigils) + for (kind in kinds) { + jei.recipeManager.hideRecipes(kind.type, kind.built) + kind.built = kind.pages() + jei.recipeManager.addRecipes(kind.type, kind.built) + } + } + + /** Cobblemon Info's JEI ingredient for a Pokémon, by reflection: the add-on is a separate download, not a dependency. */ + private object CobbledexLink { + @Suppress("UNCHECKED_CAST") + val type: IIngredientType? by lazy { + runCatching { Class.forName("com.cobbledex.jei.PokemonIngredientType").getField("INSTANCE").get(null) as IIngredientType }.getOrNull() + } + private val constructor by lazy { + runCatching { Class.forName("com.cobbledex.jei.PokemonIngredient").getConstructor(String::class.java, Set::class.java) }.getOrNull() + } + + fun of(species: String): Any? = constructor?.takeIf { type != null }?.newInstance(species.substringAfter(':'), emptySet()) + } + + class PageCategory(private val type: RecipeType, private val title: Component, private val icon: IDrawable, private val pages: () -> List) : IRecipeCategory { + private var measured: List? = null + private var tallest = 0 + /** JEI gives every page of a category the same size: that of its tallest. */ - private val height = pages.maxOf { slotsTop(it) + (it.outputs.size + PER_ROW - 1) / PER_ROW * SLOT } + PADDING - 2 + private val pageHeight: Int + get() { + val now = pages() + if (now !== measured) { + measured = now + tallest = (now.maxOfOrNull { slotsTop(it) + (it.outputs.size + PER_ROW - 1) / PER_ROW * SLOT } ?: BODY_TOP) + PADDING - 2 + } + return tallest + } override fun getRecipeType() = type override fun getTitle() = title override fun getIcon() = icon override fun getWidth() = WIDTH - override fun getHeight() = height + override fun getHeight() = pageHeight private val font: Font get() = Minecraft.getInstance().font @@ -117,7 +176,10 @@ class DropSourcesJei : IModPlugin { } override fun setRecipe(builder: IRecipeLayoutBuilder, page: Page, focuses: IFocusGroup) { - builder.addSlot(RecipeIngredientRole.RENDER_ONLY, PADDING, ICON_TOP).addItemStack(page.icon) + val linked = page.species?.let(CobbledexLink::of) + // As Cobblemon Info's own ingredient the Pokémon opens that mod's pages when clicked (Adrian, 2026-11-09). + if (linked != null) builder.addSlot(RecipeIngredientRole.INPUT, PADDING, ICON_TOP).addIngredient(CobbledexLink.type!!, linked) + else builder.addSlot(RecipeIngredientRole.RENDER_ONLY, PADDING, ICON_TOP).addItemStack(page.icon) val top = slotsTop(page) page.outputs.forEachIndexed { i, out -> builder.addSlot(RecipeIngredientRole.OUTPUT, PADDING + 1 + (i % PER_ROW) * SLOT, top + 1 + (i / PER_ROW) * SLOT) @@ -128,11 +190,11 @@ class DropSourcesJei : IModPlugin { override fun draw(page: Page, view: IRecipeSlotsView, graphics: GuiGraphics, mouseX: Double, mouseY: Double) { // An opaque panel of our own, so the text reads the same whatever JEI's theme is. - graphics.fill(0, 0, WIDTH, height, SURFACE) + graphics.fill(0, 0, WIDTH, pageHeight, SURFACE) graphics.fill(0, 0, WIDTH, 1, BORDER) - graphics.fill(0, height - 1, WIDTH, height, BORDER) - graphics.fill(0, 0, 1, height, BORDER) - graphics.fill(WIDTH - 1, 0, WIDTH, height, BORDER) + graphics.fill(0, pageHeight - 1, WIDTH, pageHeight, BORDER) + graphics.fill(0, 0, 1, pageHeight, BORDER) + graphics.fill(WIDTH - 1, 0, WIDTH, pageHeight, BORDER) val right = WIDTH - PADDING val tagWidth = font.width(page.tag) @@ -220,26 +282,27 @@ class DropSourcesJei : IModPlugin { } else { listOf(Row(muted("Not wild. Its line lives in:"))) + p.line.orEmpty().map { Row(text(DropSources.zoneName(it.zone)), speciesName(it.species)) } } - Page(picture(p.species), speciesName(p.species), "Drops", rows, p.drops.filter { DropSources.exists(it.item) }.map(::dropOutput)) + Page(picture(p.species), speciesName(p.species), "Drops", rows, p.drops.filter { DropSources.exists(it.item) }.map(::dropOutput), p.species) } val special = data.spawn_drops.map { s -> - Page(picture(s.species), speciesName(s.species), "Drops here", listOf(Row(text(DropSources.zoneName(s.zone)), text("instead"))), s.drops.filter { DropSources.exists(it.item) }.map(::dropOutput)) + Page(picture(s.species), speciesName(s.species), "Drops here", listOf(Row(text(DropSources.zoneName(s.zone)), text("instead"))), s.drops.filter { DropSources.exists(it.item) }.map(::dropOutput), s.species) } return wild + special } fun bossPages(): List { val data = DropSources.data + if (data.guardians.isEmpty()) return emptyList() val guardians = data.guardians.map { g -> val hours = g.respawn_hours.let { if (it % 1.0 == 0.0) it.toInt() else it } Page(picture(g.species), speciesName(g.species), "Guardian", listOf( Row(text(DropSources.zoneName(g.zone)), text("Lv ${g.level}")), Row(muted("Back $hours hours after a win")), - ), rewardOutputs(g.drops, gray("for everyone in the winning battle"))) + ), rewardOutputs(g.drops, gray("for everyone in the winning battle")), g.species) } val end = data.end_boss val boss = Page(picture(end.species), speciesName(end.species), "End boss", listOf( Row(text("The End"), text("Lv ${end.level}")), Row(muted("${end.xp_first_win} XP the first time, ${end.xp} after")), - ), rewardOutputs(end.first_win, gray("first win only"))) + ), rewardOutputs(end.first_win, gray("first win only")), end.species) return guardians + boss } diff --git a/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineShowcase.kt b/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineShowcase.kt index e029439..888589e 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineShowcase.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineShowcase.kt @@ -30,7 +30,7 @@ import java.util.UUID */ object MachineShowcase { val OWNER: UUID = UUID.nameUUIDFromBytes("cobblesurvival:showcase".toByteArray()) - private const val SPACING = 10 + const val SPACING = 10 private const val ROW = 12 private class Entry(val core: String, val casing: Block, val species: String, val level: Int, val sign: List) @@ -60,6 +60,14 @@ object MachineShowcase { return level.getBlockEntity(core) as? MachineBlockEntity ?: error("no machine at $core") } + /** One working machine, the [index]th kind of the showcase, at ground level [at]: used by the load test. */ + fun working(level: ServerLevel, at: BlockPos, index: Int) { + val entry = ENTRIES[index % ENTRIES.size] + val core = at.above() + build(level, core, entry.core, entry.casing, glass = true).fill(level, PokemonSpecies.getByName(entry.species)!!.create(entry.level), OWNER, "Showcase") + extras(level, entry, core) + } + private fun placeCore(level: ServerLevel, core: BlockPos, name: String) = level.setBlockAndUpdate(core, BuiltInRegistries.BLOCK.get(id(name)).defaultBlockState().setValue(MachineBlock.FACING, Direction.SOUTH)) diff --git a/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineWork.kt b/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineWork.kt index 0cdfe77..898e554 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineWork.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/machine/MachineWork.kt @@ -1,5 +1,6 @@ package dev.cobblesurvival.machine +import dev.cobblesurvival.permadeath.Permadeath import com.cobblemon.mod.common.api.drop.ItemDropEntry import com.cobblemon.mod.common.api.pokemon.stats.Stats import com.cobblemon.mod.common.pokemon.FormData @@ -177,6 +178,11 @@ object MachineWork { } fun altarUse(core: MachineBlockEntity, level: ServerLevel, def: MachineDefs.Def, player: ServerPlayer, pokemon: Pokemon) { + if (Permadeath.isStarter(pokemon)) { + MachineBlockEntity.tell(player, Component.translatableWithFallback("message.cobblesurvival.machine.starter_sacrifice", + "%s is your first partner: it can't be sacrificed.", pokemon.getDisplayName()).withStyle(ChatFormatting.YELLOW)) + return + } val rules = def.altar!! val rewards = altarRewards(rules, pokemon) if (core.confirmBy == player.uuid && level.gameTime <= core.confirmUntil) { diff --git a/mod/src/main/kotlin/dev/cobblesurvival/permadeath/Permadeath.kt b/mod/src/main/kotlin/dev/cobblesurvival/permadeath/Permadeath.kt index 54a2871..de8b118 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/permadeath/Permadeath.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/permadeath/Permadeath.kt @@ -34,7 +34,8 @@ import java.util.concurrent.ConcurrentLinkedQueue * - once a second, every online player's party and PC are swept for fainted Pokémon (one whose trainer was offline * or in a battle when it fainted). * Settling: a Pokémon holding an item from `#cobblesurvival:revival_charms` is healed and the charm is used up; - * any other is removed from its party or PC. + * any other is removed from its party or PC. The one exception is the player's starter (Adrian, 2026-11-09): it only + * faints, and can't be released or sacrificed either ([isStarter]; CobbleHardcoreMon's side is mixin/HardcorePartyMixin). */ object Permadeath { val REVIVAL_CHARMS: TagKey = @@ -50,6 +51,18 @@ object Permadeath { // CobbleHardcoreMon settles the battle at NORMAL priority; it has to see the revived Pokémon fainted. CobblemonEvents.BATTLE_ENDED.subscribe(Priority.HIGHEST, ::onBattleEnded) NeoForge.EVENT_BUS.addListener(::onServerTick) + CobblemonEvents.POKEMON_RELEASED_EVENT_PRE.subscribe(Priority.NORMAL) { event -> + if (!isStarter(event.pokemon)) return@subscribe + event.cancel() + event.player.sendSystemMessage(Component.translatableWithFallback("message.cobblesurvival.permadeath.starter_release", + "%s is your first partner: it can't be released.", event.pokemon.getDisplayName(false)).withStyle(ChatFormatting.YELLOW)) + } + } + + /** The Pokémon this player chose as a starter, which Cobblemon remembers for each player. */ + fun isStarter(pokemon: Pokemon): Boolean { + val owner = pokemon.getOwnerUUID() ?: return false + return Cobblemon.playerDataManager.getGenericData(owner).starterUUID == pokemon.uuid } private fun onBattleFainted(event: BattleFaintedEvent) { @@ -85,7 +98,7 @@ object Permadeath { private fun settle(player: ServerPlayer, pokemon: Pokemon) { val store = pokemon.storeCoordinates.get()?.store - if (!pokemon.isFainted() || (store !is PlayerPartyStore && store !is PCStore)) return + if (!pokemon.isFainted() || isStarter(pokemon) || (store !is PlayerPartyStore && store !is PCStore)) return // Faints during a battle are settled when it ends (above, and by CobbleHardcoreMon). if (player.isInBattle()) return try { diff --git a/mod/src/main/kotlin/dev/cobblesurvival/selftest/BossTests.kt b/mod/src/main/kotlin/dev/cobblesurvival/selftest/BossTests.kt index fe001df..5a7d9e7 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/selftest/BossTests.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/selftest/BossTests.kt @@ -33,6 +33,7 @@ object BossTests { fun all() = listOf( SelfTestCase("bosses_cover_every_guardian", 20, ::coverage), SelfTestCase("boss_attack_shapes", 20, ::shapes), + SelfTestCase("bosses_only_take_battle_damage", 40, ::onlyBattleDamage), SelfTestCase("boss_attacks_land_and_stop_with_the_battle", 400, ::landAndStop), SelfTestCase("boss_arena_leaving_loses", 400, ::arena), SelfTestCase("end_boss_replaces_the_dragon", 200, ::endBoss), @@ -109,6 +110,19 @@ object BossTests { s.helper.succeed() } + private fun onlyBattleDamage(s: Scenario) { + val player = s.player() + val boss = s.wild(s.pokemon("snorlax", 40), s.at(5.5, 1.0, 5.5)) + boss.pokemon.persistentData.putBoolean(Guardians.TAG, true) + val health = boss.health + val sources = boss.damageSources() + s.check(!boss.hurt(sources.playerAttack(player), 8f)) { "a player's hit hurt a guardian" } + s.check(!boss.hurt(sources.inFire(), 8f)) { "fire hurt a guardian" } + s.check(!boss.hurt(sources.drown(), 8f)) { "drowning hurt a guardian" } + s.check(boss.health == health) { "the guardian lost health" } + s.helper.succeed() + } + private fun shapes(s: Scenario) { val o = Vec3(0.0, 64.0, 0.0) val circle = Area.Circle(o, 3.0) diff --git a/mod/src/main/kotlin/dev/cobblesurvival/selftest/CatchingTests.kt b/mod/src/main/kotlin/dev/cobblesurvival/selftest/CatchingTests.kt index f2ca6a5..bdea331 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/selftest/CatchingTests.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/selftest/CatchingTests.kt @@ -1,5 +1,6 @@ package dev.cobblesurvival.selftest +import com.cobblemon.mod.common.battles.BattleRegistry import com.cobblemon.mod.common.api.events.CobblemonEvents import com.cobblemon.mod.common.api.events.pokeball.PokeBallCaptureCalculatedEvent import com.cobblemon.mod.common.api.events.pokeball.PokemonCatchRateEvent @@ -19,9 +20,14 @@ import kotlin.math.abs * scan switched on only there (other tests put weak trainers next to wild Pokémon). */ object CatchingTests { + /** A player who has just joined can't be hurt for this long. */ + private const val SPAWN_PROTECTION_TICKS = 70 + fun all() = listOf( SelfTestCase("catch_rate_falls_with_level_gap", 20, ::catchRate, batch = "catching"), SelfTestCase("failed_catch_enrages", 400, ::failedCatch, batch = "catching"), + SelfTestCase("wild_attack_starts_a_battle", 300, ::attackBattle, batch = "attack_battle"), + SelfTestCase("wild_attack_hurts_without_a_party", 120, ::attackHurts, batch = "attack_battle"), SelfTestCase("strong_wild_pokemon_hunt_weak_trainers", 400, { s -> hostility(s, strongest = 5, hostile = true) }, batch = "catching_weak"), SelfTestCase("wild_pokemon_ignore_stronger_trainers", 120, { s -> hostility(s, strongest = 50, hostile = false) }, @@ -44,6 +50,37 @@ object CatchingTests { s.helper.succeed() } + private fun attackBattle(s: Scenario) { + val player = s.player() + s.give(player, s.pokemon("charizard", 50, "ember")) + val wild = s.wild(s.pokemon("rattata", 5, "tackle"), s.at(5.5, 1.0, 5.5)) + val health = player.health + s.helper.startSequence() + .thenWaitUntil { s.check(wild.pokemon.entity === wild) { "the wild Pokémon has not ticked yet" } } + .thenIdle(SPAWN_PROTECTION_TICKS) + .thenExecute { + s.check(!player.hurt(wild.damageSources().mobAttack(wild), 6f)) { "the hit went through" } + // A second hit while the Pokémon is still being sent out doesn't hurt either. + s.check(!player.hurt(wild.damageSources().mobAttack(wild), 6f)) { "the second hit went through" } + s.check(player.health == health) { "the player lost health" } + } + .thenWaitUntil { s.check(BattleRegistry.getBattleByParticipatingPlayer(player) != null) { "no battle started" } } + .thenSucceed() + } + + private fun attackHurts(s: Scenario) { + val player = s.player() + val wild = s.wild(s.pokemon("rattata", 5, "tackle"), s.at(5.5, 1.0, 5.5)) + val health = player.health + s.helper.startSequence() + .thenIdle(SPAWN_PROTECTION_TICKS) + .thenExecute { + s.check(player.hurt(wild.damageSources().mobAttack(wild), 6f)) { "the hit was cancelled for a player with no Pokémon" } + s.check(player.health < health) { "the player lost no health" } + } + .thenSucceed() + } + private fun failedCatch(s: Scenario) { val player = s.player() s.give(player, s.pokemon("pidgeot", 60)) // stronger than the wild one: only the failed catch angers it diff --git a/mod/src/main/kotlin/dev/cobblesurvival/selftest/PerfLoad.kt b/mod/src/main/kotlin/dev/cobblesurvival/selftest/PerfLoad.kt new file mode 100644 index 0000000..4a07240 --- /dev/null +++ b/mod/src/main/kotlin/dev/cobblesurvival/selftest/PerfLoad.kt @@ -0,0 +1,188 @@ +package dev.cobblesurvival.selftest + +import com.cobblemon.mod.common.Cobblemon +import com.cobblemon.mod.common.CobblemonBlocks +import com.cobblemon.mod.common.api.pokemon.PokemonSpecies +import com.cobblemon.mod.common.block.PastureBlock +import com.cobblemon.mod.common.block.entity.PokemonPastureBlockEntity +import com.cobblemon.mod.common.entity.pokemon.PokemonEntity +import com.mojang.brigadier.arguments.IntegerArgumentType +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import dev.cobblesurvival.machine.MachineBlock +import dev.cobblesurvival.machine.MachineBlockEntity +import dev.cobblesurvival.machine.MachineShowcase +import io.netty.channel.embedded.EmbeddedChannel +import net.minecraft.commands.CommandSourceStack +import net.minecraft.commands.Commands +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.network.chat.Component +import net.minecraft.server.MinecraftServer +import net.minecraft.server.level.ServerLevel +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.level.levelgen.Heightmap +import net.neoforged.neoforge.common.NeoForge +import net.neoforged.neoforge.event.tick.ServerTickEvent +import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.sin + +/** + * A realistic load for tools/perf_test.py (roadmap Phase 9): `/cobblesurvival perf start ` + * puts that many players on the island, each with a base of full pastures and working machines. They are the self-tests' + * fake clients, so the server ticks them as real players: Cobblemon spawns around them and their chunks load, while the + * first walks a long way, as an explorer would. Only there with -Dcobblesurvival.selftest=true. + */ +object PerfLoad { + private class Bot(val player: ServerPlayer, val channel: EmbeddedChannel, val home: BlockPos, val explorer: Boolean) + + private const val PASTURE_LEVEL = 30 + private const val PASTURE_SPACING = 14 + private const val MACHINE_ROW = 24 + private const val BOT_DISTANCE = 420.0 + private const val EXPLORER_RING = 900.0 + private const val EXPLORER_BLOCKS_PER_SECOND = 5.0 + private const val WALK_RADIUS = 18.0 + private const val SPIKE_NANOS = 50_000_000L + private const val BUILD_DELAY_TICKS = 200 + private val SPECIES = listOf("pidgey", "rattata", "geodude", "oddish", "ponyta", "magnemite", "eevee", "snorlax", + "machop", "slowpoke", "psyduck", "growlithe", "abra", "gastly", "onix", "scyther") + + private val bots = ArrayList() + private var tethered = 0 + private val machineCores = ArrayList() + /** The bases, built once the players' chunks are active: a Pokémon added to a chunk about to unload is lost with it. */ + private var pendingBases: (() -> Unit)? = null + private var buildAtTick = 0 + private var tickStarted = 0L + private val samples = ArrayList() + + fun register() { + if (!SelfTest.enabled) return + NeoForge.EVENT_BUS.addListener { tickStarted = System.nanoTime() } + NeoForge.EVENT_BUS.addListener(::onTickDone) + } + + fun command(): LiteralArgumentBuilder = + Commands.literal("perf") + .requires { it.hasPermission(4) } + .then(Commands.literal("start").then(Commands.argument("players", IntegerArgumentType.integer(1)).then( + Commands.argument("pastures", IntegerArgumentType.integer(0)).then(Commands.argument("pokemon", IntegerArgumentType.integer(0)).then( + Commands.argument("machines", IntegerArgumentType.integer(0)).executes { context -> + val reply = start(context.source.server, IntegerArgumentType.getInteger(context, "players"), + IntegerArgumentType.getInteger(context, "pastures"), IntegerArgumentType.getInteger(context, "pokemon"), + IntegerArgumentType.getInteger(context, "machines")) + context.source.sendSuccess({ Component.literal(reply) }, false) + 1 + }))))) + .then(Commands.literal("measure").executes { context -> + samples.clear() + context.source.sendSuccess({ Component.literal("measuring") }, false) + 1 + }) + .then(Commands.literal("report").executes { context -> + context.source.sendSuccess({ Component.literal(report(context.source.server)) }, false) + 1 + }) + + private fun start(server: MinecraftServer, players: Int, pastures: Int, pokemon: Int, machineCount: Int): String { + val level = server.overworld() + repeat(players) { i -> + val home = land(level, i) + val (player, channel) = FakeClient.join(server, level, "perf_$i") + player.abilities.invulnerable = true + player.teleportTo(level, home.x + 0.5, home.y + 1.0, home.z + 0.5, 0f, 0f) + level.chunkSource.move(player) // a client's movement packets would do this: it's what activates the chunks around a player + bots += Bot(player, channel, home, i == 0 && players > 1) + } + pendingBases = { + for (bot in bots) { + repeat(pastures) { p -> pasture(level, bot.player, surface(level, bot.home.x + p * PASTURE_SPACING, bot.home.z - PASTURE_SPACING), pokemon, p) } + repeat(machineCount) { m -> + val ground = surface(level, bot.home.x + m * MachineShowcase.SPACING, bot.home.z + MACHINE_ROW) + MachineShowcase.working(level, ground, m) + machineCores += ground.above() + } + } + } + buildAtTick = server.tickCount + BUILD_DELAY_TICKS + return "perf started: ${bots.size} players, bases follow in ${BUILD_DELAY_TICKS / 20} s" + } + + private fun pasture(level: ServerLevel, player: ServerPlayer, at: BlockPos, count: Int, index: Int) { + val pos = at.above() + val block = CobblemonBlocks.PASTURE.defaultBlockState() + level.setBlockAndUpdate(pos, block.setValue(PastureBlock.PART, PastureBlock.PasturePart.BOTTOM)) + level.setBlockAndUpdate(pos.above(), block.setValue(PastureBlock.PART, PastureBlock.PasturePart.TOP)) + val entity = level.getBlockEntity(pos) as? PokemonPastureBlockEntity ?: return + val pc = Cobblemon.storage.getPC(player) + repeat(count) { i -> + val pokemon = PokemonSpecies.getByName(SPECIES[(index * 5 + i) % SPECIES.size])!!.create(PASTURE_LEVEL) + pc.add(pokemon) + if (entity.tether(player, pokemon, Direction.NORTH)) tethered++ + } + } + + private fun surface(level: ServerLevel, x: Int, z: Int): BlockPos { + level.getChunk(x shr 4, z shr 4) + return BlockPos(x, level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z), z) + } + + /** Dry land for the [index]th player: the first of the points around spawn that isn't water. */ + private fun land(level: ServerLevel, index: Int): BlockPos { + val spawn = level.sharedSpawnPos + for (attempt in 0 until 16) { + val angle = 2 * PI * (index + attempt / 16.0) / 8 + val candidate = surface(level, spawn.x + (cos(angle) * BOT_DISTANCE).toInt(), spawn.z + (sin(angle) * BOT_DISTANCE).toInt()) + if (level.getFluidState(candidate.below()).isEmpty && level.getFluidState(candidate).isEmpty) return candidate + } + return surface(level, spawn.x, spawn.z) + } + + private fun onTickDone(event: ServerTickEvent.Post) { + samples += System.nanoTime() - tickStarted + val server = event.server + if (pendingBases != null && server.tickCount >= buildAtTick) { + pendingBases?.invoke() + pendingBases = null + } + bots.removeIf { it.player.hasDisconnected() } + for ((i, bot) in bots.withIndex()) { + bot.player.doTick() + bot.player.connection.chunkSender.onChunkBatchReceivedByClient(25f) + bot.channel.releaseOutbound() + if (server.tickCount % 20 == 0) walk(server, bot, i) + } + } + + private fun walk(server: MinecraftServer, bot: Bot, index: Int) { + val level = bot.player.serverLevel() + val seconds = server.tickCount / 20.0 + val spawn = level.sharedSpawnPos + val (x, z) = if (bot.explorer) { + val angle = seconds * EXPLORER_BLOCKS_PER_SECOND / EXPLORER_RING + spawn.x + cos(angle) * EXPLORER_RING to spawn.z + sin(angle) * EXPLORER_RING + } else { + val angle = seconds * 0.2 + index + bot.home.x + cos(angle) * WALK_RADIUS to bot.home.z + sin(angle) * WALK_RADIUS + } + val y = surface(level, x.toInt(), z.toInt()).y + 1.0 + bot.player.teleportTo(level, x, y, z, 0f, 0f) + level.chunkSource.move(bot.player) + } + + private fun report(server: MinecraftServer): String { + val sorted = samples.sorted() + fun at(share: Double) = if (sorted.isEmpty()) 0.0 else sorted[((sorted.size - 1) * share).toInt()] / 1e6 + val pokemon = server.allLevels.flatMap { level -> level.allEntities.filterIsInstance() } + val pastured = pokemon.count { it.tethering != null } + val overworld = server.overworld() + val working = machineCores.count { core -> (overworld.getBlockEntity(core) is MachineBlockEntity) && overworld.getBlockState(core).getValue(MachineBlock.ACTIVE) } + val entityTicking = bots.count { overworld.isPositionEntityTicking(it.player.blockPosition()) } + val entities = server.allLevels.sumOf { it.allEntities.count() } + val chunks = server.allLevels.sumOf { it.chunkSource.loadedChunksCount } + return "perf ticks=${sorted.size} mean_ms=%.2f p50_ms=%.2f p95_ms=%.2f p99_ms=%.2f max_ms=%.2f spikes_over_50ms=${sorted.count { it > SPIKE_NANOS }} " + .format(sorted.average().takeIf { !it.isNaN() }?.div(1e6) ?: 0.0, at(.5), at(.95), at(.99), at(1.0)) + + "bots=${bots.size} tethered=$tethered pastured=$pastured wild=${pokemon.size - pastured} machines=${machineCores.size} working=$working entities=$entities chunks=$chunks entity_ticking=$entityTicking" + } +} diff --git a/mod/src/main/kotlin/dev/cobblesurvival/selftest/PermadeathTests.kt b/mod/src/main/kotlin/dev/cobblesurvival/selftest/PermadeathTests.kt index 69cf915..b812917 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/selftest/PermadeathTests.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/selftest/PermadeathTests.kt @@ -26,6 +26,7 @@ object PermadeathTests { fun all() = listOf( SelfTestCase("no_healing_or_auto_revive", 40, ::noHealingOrAutoRevive), + SelfTestCase("starter_only_faints", 120, ::starterOnlyFaints), SelfTestCase("faint_outside_battle", 5, ::faintOutsideBattle), SelfTestCase("fall", 200, ::fall), SelfTestCase("lava", 300, ::lava), @@ -39,6 +40,23 @@ object PermadeathTests { ) /** Cobblemon heals the party while the player sleeps and wakes fainted Pokémon after a while; both are off. */ + /** Adrian, 2026-11-09: the starter is the one Pokémon that is never removed, and a charm it holds isn't used up. */ + private fun starterOnlyFaints(s: Scenario) { + val player = s.player() + val starter = s.give(player, s.pokemon("bulbasaur", 5)) + val other = s.give(player, s.pokemon("rattata", 5)) + starter.swapHeldItem(ItemStack(s.charm())) + Cobblemon.playerDataManager.getGenericData(player).starterUUID = starter.uuid + starter.currentHealth = 0 + other.currentHealth = 0 + s.helper.startSequence().thenExecuteAfter(80) { + s.assertGone(player, other) + s.check(Cobblemon.storage.getParty(player).any { it.uuid == starter.uuid }) { "the starter was removed" } + s.check(starter.isFainted()) { "the starter was healed" } + s.check(starter.heldItem().`is`(s.charm())) { "the starter's charm was used up" } + }.thenSucceed() + } + private fun noHealingOrAutoRevive(s: Scenario) { val config = Cobblemon.config s.check(config.healPercent == 0.0) { "healPercent is ${config.healPercent}, so sleeping heals the party" } diff --git a/mod/src/main/kotlin/dev/cobblesurvival/selftest/QuestTests.kt b/mod/src/main/kotlin/dev/cobblesurvival/selftest/QuestTests.kt index 7685f9d..5e00d14 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/selftest/QuestTests.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/selftest/QuestTests.kt @@ -1,5 +1,9 @@ package dev.cobblesurvival.selftest +import com.cobblemon.mod.common.api.pokemon.PokemonProperties +import com.cobblemon.mod.common.pokemon.requirements.BiomeRequirement +import com.cobblemon.mod.common.pokemon.FormData +import com.cobblemon.mod.common.api.pokemon.evolution.Evolution import com.cobblemon.mod.common.api.drop.DropTable import com.cobblemon.mod.common.api.drop.ItemDropEntry import com.cobblemon.mod.common.api.fossil.Fossils @@ -40,6 +44,10 @@ object QuestTests { SelfTestCase("quest_events_mark_zones", 200, ::zoneEvent), SelfTestCase("drop_sources_match_the_server", 20, ::dropSources), SelfTestCase("jei_pages_build", 20, ::jeiPages), + SelfTestCase("drop_sources_reach_the_client", 20, ::dropSourcesPacked), + SelfTestCase("drop_chances_match_cobblemon", 20, ::dropChances), + SelfTestCase("regional_forms_are_obtainable", 20, ::regionalForms, islandOnly = true), + SelfTestCase("new_players_get_the_quest_book", 20, ::questBook), SelfTestCase("every_implemented_pokemon_is_obtainable", 20, ::obtainable), SelfTestCase("sigil_summons_a_catchable_legend", 200, ::summon), ) @@ -113,6 +121,79 @@ object QuestTests { * Every JEI page builds (the same code JEI calls on the client), one per Pokémon, guardian, altar tier, vein zone * and pasture list, and every item on them exists (an unknown id would show as a barrier). */ + private val REGIONAL = setOf("alolan", "galarian", "hisuian", "paldean") + + /** + * Adrian, 2026-11-09: the regional forms JEI lists can be had too: from a wild spawn, a Sigil, or by evolving + * something obtainable where a biome the evolution asks for exists on the island, or by breeding back down a line. Battle-only forms (Zen Mode) don't count. Other species count with any form; Shedinja comes with Nincada's evolution, which no requirement names. + */ + private fun regionalForms(s: Scenario) { + val biomes = s.level.chunkSource.generator.biomeSource.possibleBiomes() + fun possible(evolution: Evolution) = evolution.requirements.filterIsInstance().all { r -> + biomes.any { b -> r.biomeCondition?.fits(b) != false && r.biomeAnticondition?.fits(b) != true } + } + val reached = HashSet() + for (d in CobblemonSpawnPools.WORLD_SPAWN_POOL.details.filterIsInstance()) { + val species = d.pokemon.species?.let { PokemonSpecies.getByName(it.substringAfter(':')) } ?: continue + reached += if (d.pokemon.originalString.lowercase().split(' ').any { it in REGIONAL }) d.pokemon.create().form else species.standardForm + } + reached += Fossils.all().mapNotNull { it.result.species }.mapNotNull { PokemonSpecies.getByName(it.substringAfter(':'))?.standardForm } + reached += Summons.defs.values.map { PokemonProperties.parse(it.pokemon).create().form } + val queue = ArrayDeque(reached) + while (queue.isNotEmpty()) { + val current = queue.removeFirst() + // Breeding (Cobbreeding) brings the start of a line from any of its stages. + current.preEvolution?.form?.let { if (reached.add(it)) queue += it } + for (evolution in current.evolutions.filter(::possible)) { + val form = evolution.result.create().form + if (reached.add(form)) queue += form + } + } + val missing = PokemonSpecies.implemented.flatMap { species -> + species.forms.filter { f -> f.aspects.any { it in REGIONAL } && "zen-mode" !in f.aspects && f !in reached }.map { "${it.name} ${species.name}" } + + listOfNotNull(species.name.takeIf { species.forms.none(reached::contains) && species.standardForm !in reached && it != "Shedinja" }) + } + s.check(missing.isEmpty()) { "${missing.size} forms can't be obtained: ${missing.take(15)}" } + s.helper.succeed() + } + + private fun questBook(s: Scenario) { + val player = s.player() + val book = BuiltInRegistries.ITEM.get(ResourceLocation.parse("ftbquests:book")) + s.check(player.inventory.items.any { it.`is`(book) }) { "a new player has no quest book" } + s.helper.succeed() + } + + /** The chance on each JEI page is what Cobblemon's own roll gives (Adrian, 2026-11-09): rolled here, for every Pokémon. */ + private fun dropChances(s: Scenario) { + val rolls = 4000 + val problems = mutableListOf() + for (p in DropSources.data.pokemon) { + val species = PokemonSpecies.getByIdentifier(ResourceLocation.parse(p.species)) ?: continue + val got = HashMap() + repeat(rolls) { + species.drops.getDrops().filterIsInstance().filter { (it.quantityRange?.random() ?: it.quantity) > 0 } + .map { it.item.toString() }.toSet().forEach { got.merge(it, 1, Int::plus) } + } + for (d in p.drops) { + val seen = 100.0 * (got[d.item] ?: 0) / rolls + if (kotlin.math.abs(seen - (d.chance ?: 100.0)) > 4.0) problems += "${p.species}: ${d.item} page ${d.chance ?: 100.0}, rolled ${"%.1f".format(seen)}" + } + } + s.check(problems.isEmpty()) { "${problems.size} wrong chances: ${problems.take(5)}" } + s.helper.succeed() + } + + /** What the server sends players on joining unpacks to what the server has (Adrian, 2026-11-09: balance without a client update). */ + private fun dropSourcesPacked(s: Scenario) { + val sent = DropSources.parse(DropSources.packed) + val data = DropSources.data + s.check(data.pokemon.isNotEmpty()) { "the server has no drop sources" } + s.check(sent.pokemon.size == data.pokemon.size && sent.guardians.size == data.guardians.size && sent.summons.size == data.summons.size) { "the packed drop sources differ" } + s.check(DropSources.packed.size < 1_000_000) { "the drop sources are ${DropSources.packed.size} bytes packed, too long for one packet" } + s.helper.succeed() + } + private fun jeiPages(s: Scenario) { val data = DropSources.data val pages = mapOf( @@ -129,14 +210,11 @@ object QuestTests { } /** A drop as "item chance% ×count", the same way from the JEI data and from Cobblemon's live tables. */ - private fun dropKey(item: String, chance: Double?, count: String?) = "$item ${"%.2f".format(chance ?: 100.0)}% ×${count ?: "1"}" - private fun liveDrops(table: DropTable?): Set = table?.entries.orEmpty().filterIsInstance().map { e -> - dropKey(e.item.toString(), e.percentage.toDouble().takeIf { it < 100.0 }, e.quantityRange?.let { if (it.first == it.last) "${it.first}" else "${it.first}-${it.last}" } ?: e.quantity.toString()) - }.toSet() + private fun liveDrops(table: DropTable?): Set = table?.entries.orEmpty().filterIsInstance().map { it.item.toString() }.toSet() /** - * The JEI pages' data (assets/cobblesurvival/jei/drop_sources.json, tools/jei_sources.py) still says what the + * The JEI pages' data (data/cobblesurvival/drop_sources/pages.json, tools/jei_sources.py) still says what the * server does: every Pokémon's drops and zones, the spawns with drops of their own, the guardians, the End boss * and the Sacrifice Altar. When this fails, run tools/jei_sources.py and rebuild. */ @@ -147,7 +225,7 @@ object QuestTests { val zonesOf = details.groupBy({ "cobblemon:${it.pokemon.species?.lowercase()}" }, { it.id.substringBefore('-') }).mapValues { it.value.toSet() } for (p in data.pokemon) { val species = PokemonSpecies.getByIdentifier(ResourceLocation.parse(p.species)) ?: continue.also { problems += "no species ${p.species}" } - val shown = p.drops.map { dropKey(it.item, it.chance, it.count) }.toSet() + val shown = p.drops.map { it.item }.toSet() if (shown != liveDrops(species.drops)) problems += "${p.species} drops ${liveDrops(species.drops)}, the JEI data says $shown" if (p.zones.map { it.zone }.toSet() != zonesOf[p.species].orEmpty()) problems += "${p.species} spawns in ${zonesOf[p.species]}, the JEI data says ${p.zones.map { it.zone }}" } diff --git a/mod/src/main/kotlin/dev/cobblesurvival/selftest/Scenario.kt b/mod/src/main/kotlin/dev/cobblesurvival/selftest/Scenario.kt index 5d10159..2abc616 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/selftest/Scenario.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/selftest/Scenario.kt @@ -25,6 +25,7 @@ import net.minecraft.gametest.framework.GameTestSequence import net.minecraft.network.Connection import net.minecraft.network.protocol.PacketFlow import net.minecraft.resources.ResourceLocation +import net.minecraft.server.MinecraftServer import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer import net.minecraft.server.network.CommonListenerCookie @@ -67,14 +68,7 @@ class Scenario(val case: SelfTestCase, private val index: Int) : GameTestListene */ fun player(): ServerPlayer { val server = level.server - val cookie = CommonListenerCookie.createInitial(GameProfile(UUID.randomUUID(), "selftest_${index}_${players++}"), false) - val player = ServerPlayer(server, level, cookie.gameProfile(), cookie.clientInformation()) - val connection = Connection(PacketFlow.SERVERBOUND) - EmbeddedChannel(connection) - ChannelAttributes.setPayloadSetup(connection, NetworkPayloadSetup.empty()) - ChannelAttributes.setConnectionType(connection, ConnectionType.NEOFORGE) - connection.channel().attr(ChannelAttributes.ADHOC_CHANNELS).set(EveryChannel()) - server.playerList.placeNewPlayer(connection, player, cookie) + val (player, _) = FakeClient.join(server, level, "selftest_${index}_${players++}") val pos = at(3.5, 0.0, 7.5) player.teleportTo(level, pos.x, pos.y, pos.z, 0f, 0f) cleanups += { server.playerList.remove(player) } @@ -220,8 +214,23 @@ class Scenario(val case: SelfTestCase, private val index: Int) : GameTestListene if (passed) CobbleSurvival.LOGGER.info("selftest PASS {}", case.name) else CobbleSurvival.LOGGER.error("selftest FAIL {}: {}", case.name, failure) } +} +/** A client as the server sees one: its connection goes nowhere and accepts every mod's network channel, since NeoForge refuses to send mod packets on an unnegotiated one. */ +internal object FakeClient { private class EveryChannel : HashSet() { override fun contains(element: ResourceLocation) = true } + + fun join(server: MinecraftServer, level: ServerLevel, name: String): Pair { + val cookie = CommonListenerCookie.createInitial(GameProfile(UUID.randomUUID(), name), false) + val player = ServerPlayer(server, level, cookie.gameProfile(), cookie.clientInformation()) + val connection = Connection(PacketFlow.SERVERBOUND) + val channel = EmbeddedChannel(connection) + ChannelAttributes.setPayloadSetup(connection, NetworkPayloadSetup.empty()) + ChannelAttributes.setConnectionType(connection, ConnectionType.NEOFORGE) + connection.channel().attr(ChannelAttributes.ADHOC_CHANNELS).set(EveryChannel()) + server.playerList.placeNewPlayer(connection, player, cookie) + return player to channel + } } diff --git a/mod/src/main/kotlin/dev/cobblesurvival/summon/Summons.kt b/mod/src/main/kotlin/dev/cobblesurvival/summon/Summons.kt index 3b5642e..7ff3fc0 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/summon/Summons.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/summon/Summons.kt @@ -1,5 +1,6 @@ package dev.cobblesurvival.summon +import dev.cobblesurvival.Tuning import com.cobblemon.mod.common.api.Priority import com.cobblemon.mod.common.api.events.CobblemonEvents import com.cobblemon.mod.common.api.pokemon.PokemonProperties @@ -54,11 +55,11 @@ object Summons : SimpleJsonResourceReloadListener(Gson(), "summons") { /** How far ahead of the player it appears. */ private const val DISTANCE = 6.0 /** Only one at a time within this many blocks, so sigils can't be stacked into one place. */ - private const val NEARBY = 96.0 + private val NEARBY get() = Tuning.values.summon_spacing private const val FLOOR_ABOVE = 4 private const val FLOOR_BELOW = 8 - class Def(val species: String, val level: Int, val zone: String) + class Def(val species: String, val pokemon: String, val level: Int, val zone: String) var defs: Map = emptyMap() private set @@ -74,7 +75,7 @@ object Summons : SimpleJsonResourceReloadListener(Gson(), "summons") { override fun apply(files: Map, resources: ResourceManager, profiler: ProfilerFiller) { defs = files.values.map { it.asJsonObject }.associate { - it.get("species").asString to Def(it.get("species").asString, it.get("level").asInt, it.get("zone").asString) + it.get("species").asString to Def(it.get("species").asString, it.get("pokemon")?.asString ?: it.get("species").asString, it.get("level").asInt, it.get("zone").asString) } CobbleSurvival.LOGGER.info("Loaded {} summons", defs.size) } @@ -118,7 +119,7 @@ object Summons : SimpleJsonResourceReloadListener(Gson(), "summons") { tell(player, Component.translatableWithFallback("message.cobblesurvival.summon.busy", "Another legend is already here.").withStyle(ChatFormatting.RED)) return false } - val pokemon = PokemonProperties.parse("${def.species} level=${def.level}").create() + val pokemon = PokemonProperties.parse("${def.pokemon} level=${def.level}").create() pokemon.persistentData.putBoolean(TAG, true) pokemon.persistentData.putString(BossFights.TAG, "${CobbleSurvival.MOD_ID}:summon_${def.species}") val entity = PokemonEntity(level, pokemon) diff --git a/mod/src/main/kotlin/dev/cobblesurvival/zone/Guardians.kt b/mod/src/main/kotlin/dev/cobblesurvival/zone/Guardians.kt index a8c82ec..d92d4d1 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/zone/Guardians.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/zone/Guardians.kt @@ -1,5 +1,6 @@ package dev.cobblesurvival.zone +import dev.cobblesurvival.Tuning import com.cobblemon.mod.common.api.Priority import com.cobblemon.mod.common.api.events.CobblemonEvents import com.cobblemon.mod.common.api.events.battles.BattleFaintedEvent @@ -48,8 +49,8 @@ object Guardians : SimpleJsonResourceReloadListener(Gson(), "guardians") { /** Key in the guardian Pokémon's persistent data; its value is the zone id. */ const val TAG = "cobblesurvival_guardian" private const val CHECK_TICKS = 40 - private const val NEAR = 96.0 - private const val LEASH = 24.0 + private val NEAR get() = Tuning.values.guardian_wake_range + private val LEASH get() = Tuning.values.guardian_leash private const val TICKS_PER_HOUR = 72_000L /** How far (blocks, each way) a cave guardian's spot may lie from the zone's sample point. */ private const val CAVE_SEARCH = 24 diff --git a/mod/src/main/kotlin/dev/cobblesurvival/zone/Wanderers.kt b/mod/src/main/kotlin/dev/cobblesurvival/zone/Wanderers.kt index ede08f8..2fba955 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/zone/Wanderers.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/zone/Wanderers.kt @@ -1,5 +1,6 @@ package dev.cobblesurvival.zone +import dev.cobblesurvival.Tuning import com.cobblemon.mod.common.entity.pokemon.PokemonEntity import dev.cobblesurvival.world.SpecialPokemon import net.minecraft.server.level.ServerLevel @@ -18,7 +19,7 @@ import java.util.UUID */ object Wanderers { private const val EVERY_TICKS = 100 - private const val RANGE = 64.0 + private val RANGE get() = Tuning.values.wanderer_range /** The self-tests switch this off, except in their own batch: other tests put strong wild Pokémon on the platform. */ var paused = false diff --git a/mod/src/main/kotlin/dev/cobblesurvival/zone/ZoneHazards.kt b/mod/src/main/kotlin/dev/cobblesurvival/zone/ZoneHazards.kt index 085cc7e..ab6788d 100644 --- a/mod/src/main/kotlin/dev/cobblesurvival/zone/ZoneHazards.kt +++ b/mod/src/main/kotlin/dev/cobblesurvival/zone/ZoneHazards.kt @@ -29,6 +29,8 @@ import java.util.UUID * apples still work against it. Definitions: `data/cobblesurvival/zone_hazards/.json`. */ object ZoneHazards : SimpleJsonResourceReloadListener(Gson(), "zone_hazards") { + private const val CHECK_TICKS = 10 + class Hazard( val zone: String, val effect: Holder, @@ -72,7 +74,7 @@ object ZoneHazards : SimpleJsonResourceReloadListener(Gson(), "zone_hazards") { private fun onServerTick(event: ServerTickEvent.Post) { if (hazards.isEmpty()) return - val tick = event.server.tickCount + if (event.server.tickCount % CHECK_TICKS != 0) return for (player in event.server.playerList.players) { if (player.isCreative || player.isSpectator) continue val zone = Zones.at(player.serverLevel(), player.blockPosition())?.id @@ -81,7 +83,10 @@ object ZoneHazards : SimpleJsonResourceReloadListener(Gson(), "zone_hazards") { continue } for (hazard in hazards) { - if (hazard.zone != zone || tick % hazard.everyTicks != 0 || isProtected(player, hazard)) continue + if (hazard.zone != zone || isProtected(player, hazard)) continue + // At once on entering the zone (Adrian, 2026-11-09), then renewed every every_ticks. + val current = player.getEffect(hazard.effect) + if (current != null && current.duration > hazard.durationTicks - hazard.everyTicks) continue player.addEffect(MobEffectInstance(hazard.effect, hazard.durationTicks, hazard.amplifier)) if (hazard.warning != null && warned[player.uuid] != zone) { warned[player.uuid] = zone diff --git a/mod/src/main/resources/cobblesurvival.mixins.json b/mod/src/main/resources/cobblesurvival.mixins.json index ed14262..b5c3742 100644 --- a/mod/src/main/resources/cobblesurvival.mixins.json +++ b/mod/src/main/resources/cobblesurvival.mixins.json @@ -3,6 +3,6 @@ "minVersion": "0.8", "package": "dev.cobblesurvival.mixin", "compatibilityLevel": "JAVA_21", - "mixins": ["RegeneratorBlockMixin"], + "mixins": ["HardcorePartyMixin", "RegeneratorBlockMixin"], "injectors": {"defaultRequire": 1} } diff --git a/pack/config/cobblemon/main.json b/pack/config/cobblemon/main.json index 945c1eb..73de027 100644 --- a/pack/config/cobblemon/main.json +++ b/pack/config/cobblemon/main.json @@ -38,7 +38,7 @@ "awardExperienceOnBattleLoss": false, "luckyEggMultiplier": 1.5, "allowSpectating": true, - "experienceMultiplier": 2.0, + "experienceMultiplier": 1.0, "predationChance": 0.05, "pokemonPerChunk": 1.0, "pokeSnackPokemonPerChunk": 2.0, diff --git a/pack/config/coldsweat/item.toml b/pack/config/coldsweat/item.toml index b271c4f..045e327 100644 --- a/pack/config/coldsweat/item.toml +++ b/pack/config/coldsweat/item.toml @@ -125,14 +125,14 @@ # i.e. if an item has 5 insulation slots and gives one slot of cold insulation by default, it will only have 4 free slots left # ⌄ "Insulating Armor" = [ - ["cold_sweat:hoglin_helmet", 0, 10], - ["cold_sweat:hoglin_chestplate", 0, 14], - ["cold_sweat:hoglin_leggings", 0, 12], - ["cold_sweat:hoglin_boots", 0, 10], - ["cold_sweat:goat_fur_helmet", 10, 0], - ["cold_sweat:goat_fur_chestplate", 14, 0], - ["cold_sweat:goat_fur_leggings", 12, 0], - ["cold_sweat:goat_fur_boots", 10, 0], + ["cold_sweat:hoglin_helmet", 0, 20], + ["cold_sweat:hoglin_chestplate", 0, 28], + ["cold_sweat:hoglin_leggings", 0, 24], + ["cold_sweat:hoglin_boots", 0, 20], + ["cold_sweat:goat_fur_helmet", 20, 0], + ["cold_sweat:goat_fur_chestplate", 28, 0], + ["cold_sweat:goat_fur_leggings", 24, 0], + ["cold_sweat:goat_fur_boots", 20, 0], ["cold_sweat:chameleon_helmet", 10, 0.0085, "adaptive"], ["cold_sweat:chameleon_chestplate", 14, 0.0085, "adaptive"], ["cold_sweat:chameleon_leggings", 12, 0.0085, "adaptive"], diff --git a/pack/config/coldsweat/main.toml b/pack/config/coldsweat/main.toml index 5057aec..aff084e 100644 --- a/pack/config/coldsweat/main.toml +++ b/pack/config/coldsweat/main.toml @@ -26,7 +26,7 @@ # Rate at which the player's body temperature changes (default: 1.0 (100%)) # Default: 1.0 # Range: 0.0 ~ Infinity - "Rate Multiplier" = 1.0 + "Rate Multiplier" = 3.0 #───────────────────────────────────────────────────────────────────────── # Damage dealt to the player when they are too hot or too cold # Default: 2.0 diff --git a/pack/config/defaultoptions/keybindings.txt b/pack/config/defaultoptions/keybindings.txt index 7fa1e70..9e59f98 100644 --- a/pack/config/defaultoptions/keybindings.txt +++ b/pack/config/defaultoptions/keybindings.txt @@ -1,15 +1,18 @@ key_key.cobblemon.summary:key.keyboard.n key_key.cobblemon.hideparty:key.keyboard.y -key_gui.xaero_waypoints_key:key.keyboard.j +key_gui.xaero_open_map:key.keyboard.j +key_gui.xaero_waypoints_key:key.keyboard.unknown key_gui.xaero_minimap_settings:key.keyboard.unknown key_key.jade.show_details:key.keyboard.v -key_key.jei.showRecipe:key.keyboard.g +key_key.jei.showRecipe:key.keyboard.r +key_key.jei.showUses:key.keyboard.u key_key.jei.bookmark:key.keyboard.k key_key.jei.focusSearch:key.keyboard.h:CONTROL key_key.jei.pauseRecipeCycling:key.keyboard.right.control key_key.jei.nextSearch:key.keyboard.unknown key_key.jei.previousSearch:key.keyboard.unknown key_key.kubejs.kubedex:key.keyboard.unknown +key_key.ftbquests.quests:key.keyboard.grave.accent key_key.ftbquests.gui.recenter:key.keyboard.home key_key.ftbquests.gui.next_chapter:key.keyboard.period key_key.ftbquests.gui.prev_chapter:key.keyboard.comma diff --git a/pack/config/ftbquests/quests/chapters/basalt.snbt b/pack/config/ftbquests/quests/chapters/basalt.snbt index ee5e7be..c14dc88 100644 --- a/pack/config/ftbquests/quests/chapters/basalt.snbt +++ b/pack/config/ftbquests/quests/chapters/basalt.snbt @@ -7,7 +7,7 @@ id: "minecraft:magma_block" } id: "1AB2113B8D294817" - order_index: 14 + order_index: 15 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/base.snbt b/pack/config/ftbquests/quests/chapters/base.snbt index c692d62..9547769 100644 --- a/pack/config/ftbquests/quests/chapters/base.snbt +++ b/pack/config/ftbquests/quests/chapters/base.snbt @@ -7,7 +7,7 @@ id: "cobblemon:pasture" } id: "5B1F192C5A22F0B9" - order_index: 18 + order_index: 19 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/button_isle.snbt b/pack/config/ftbquests/quests/chapters/button_isle.snbt index db48895..26e1d5d 100644 --- a/pack/config/ftbquests/quests/chapters/button_isle.snbt +++ b/pack/config/ftbquests/quests/chapters/button_isle.snbt @@ -7,7 +7,7 @@ id: "cobblemon:poke_ball" } id: "5B1E1FC28AA13DF0" - order_index: 1 + order_index: 2 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ 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: "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: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 diff --git a/pack/config/ftbquests/quests/chapters/deep_dark.snbt b/pack/config/ftbquests/quests/chapters/deep_dark.snbt index c96f971..07e63dc 100644 --- a/pack/config/ftbquests/quests/chapters/deep_dark.snbt +++ b/pack/config/ftbquests/quests/chapters/deep_dark.snbt @@ -7,7 +7,7 @@ id: "minecraft:sculk" } id: "3D9DA7F91C127569" - order_index: 13 + order_index: 14 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/deep_sea.snbt b/pack/config/ftbquests/quests/chapters/deep_sea.snbt index df972e8..2a6fde8 100644 --- a/pack/config/ftbquests/quests/chapters/deep_sea.snbt +++ b/pack/config/ftbquests/quests/chapters/deep_sea.snbt @@ -7,7 +7,7 @@ id: "cobblemon:mystic_water" } id: "720F052C0D14A813" - order_index: 11 + order_index: 12 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ min_level: 0 natures: "" poke_ball_used: "" - pokemon: "cobblemon:barbaracle,cobblemon:binacle,cobblemon:brionne,cobblemon:clamperl,cobblemon:clauncher,cobblemon:clawitzer,cobblemon:cloyster,cobblemon:dewgong,cobblemon:dewott,cobblemon:dhelmise,cobblemon:dragalge,cobblemon:drakloak,cobblemon:empoleon,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:piplup,cobblemon:popplio,cobblemon:primarina,cobblemon:prinplup,cobblemon:remoraid,cobblemon:samurott,cobblemon:seadra,cobblemon:sealeo,cobblemon:seel,cobblemon:shellder,cobblemon:skrelp,cobblemon:starmie,cobblemon:staryu,cobblemon:veluza,cobblemon:wailmer,cobblemon:wailord,cobblemon:walrein" + pokemon: "cobblemon:alomomola,cobblemon:barbaracle,cobblemon:barraskewda,cobblemon:binacle,cobblemon:brionne,cobblemon:clamperl,cobblemon:clauncher,cobblemon:clawitzer,cobblemon:cloyster,cobblemon:dewgong,cobblemon:dewott,cobblemon:dhelmise,cobblemon:dragalge,cobblemon:drakloak,cobblemon:empoleon,cobblemon:frillish,cobblemon:gorebyss,cobblemon:horsea,cobblemon:huntail,cobblemon:jellicent,cobblemon:kilowattrel,cobblemon:kingdra,cobblemon:lapras,cobblemon:malamar,cobblemon:mantine,cobblemon:mantyke,cobblemon:octillery,cobblemon:oshawott,cobblemon:piplup,cobblemon:popplio,cobblemon:primarina,cobblemon:prinplup,cobblemon:remoraid,cobblemon:samurott,cobblemon:seadra,cobblemon:sealeo,cobblemon:seel,cobblemon:shellder,cobblemon:skrelp,cobblemon:starmie,cobblemon:staryu,cobblemon:veluza,cobblemon:wailmer,cobblemon:wailord,cobblemon:walrein" pokemon_type: "" region: "" shiny: false diff --git a/pack/config/ftbquests/quests/chapters/dripstone.snbt b/pack/config/ftbquests/quests/chapters/dripstone.snbt index 974261b..ceb825d 100644 --- a/pack/config/ftbquests/quests/chapters/dripstone.snbt +++ b/pack/config/ftbquests/quests/chapters/dripstone.snbt @@ -7,7 +7,7 @@ id: "minecraft:pointed_dripstone" } id: "1CC462D3533A24CB" - order_index: 7 + order_index: 8 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/frostpeak.snbt b/pack/config/ftbquests/quests/chapters/frostpeak.snbt index 53de8e4..faeb369 100644 --- a/pack/config/ftbquests/quests/chapters/frostpeak.snbt +++ b/pack/config/ftbquests/quests/chapters/frostpeak.snbt @@ -7,7 +7,7 @@ id: "cobblemon:ice_stone" } id: "5FFC982FA1DF927B" - order_index: 12 + order_index: 13 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ min_level: 0 natures: "" poke_ball_used: "" - pokemon: "cobblemon:abomasnow,cobblemon:annihilape,cobblemon:archaludon,cobblemon:aromatisse,cobblemon:avalugg,cobblemon:basculegion,cobblemon:basculin,cobblemon:bayleef,cobblemon:beartic,cobblemon:braviary,cobblemon:cetitan,cobblemon:cherrim,cobblemon:chesnaught,cobblemon:copperajah,cobblemon:cryogonal,cobblemon:dartrix,cobblemon:decidueye,cobblemon:delibird,cobblemon:dubwool,cobblemon:duraludon,cobblemon:eiscue,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:mamoswine,cobblemon:meganium,cobblemon:meowscarada,cobblemon:mienshao,cobblemon:minior,cobblemon:monferno,cobblemon:piloswine,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:stantler,cobblemon:staraptor,cobblemon:throh,cobblemon:togedemaru,cobblemon:togekiss,cobblemon:togetic,cobblemon:tyranitar,cobblemon:vanillish,cobblemon:vanilluxe,cobblemon:wyrdeer" + pokemon: "cobblemon:abomasnow,cobblemon:annihilape,cobblemon:archaludon,cobblemon:aromatisse,cobblemon:avalugg,cobblemon:basculegion,cobblemon:basculin,cobblemon:bayleef,cobblemon:beartic,cobblemon:braviary,cobblemon:cetitan,cobblemon:cherrim,cobblemon:chesnaught,cobblemon:copperajah,cobblemon:cryogonal,cobblemon:dartrix,cobblemon:darumaka,cobblemon:decidueye,cobblemon:delibird,cobblemon:dubwool,cobblemon:duraludon,cobblemon:eiscue,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:mamoswine,cobblemon:meganium,cobblemon:meowscarada,cobblemon:mienshao,cobblemon:minior,cobblemon:monferno,cobblemon:piloswine,cobblemon:primeape,cobblemon:pupitar,cobblemon:quilladin,cobblemon:rhydon,cobblemon:rhyperior,cobblemon:roselia,cobblemon:roserade,cobblemon:salandit,cobblemon:sandshrew,cobblemon:sawk,cobblemon:sneasel,cobblemon:sneasler,cobblemon:spinda,cobblemon:stantler,cobblemon:staraptor,cobblemon:throh,cobblemon:togedemaru,cobblemon:togekiss,cobblemon:togetic,cobblemon:tyranitar,cobblemon:vanillish,cobblemon:vanilluxe,cobblemon:vulpix,cobblemon:wyrdeer,cobblemon:zorua" pokemon_type: "" region: "" shiny: false diff --git a/pack/config/ftbquests/quests/chapters/getting_started.snbt b/pack/config/ftbquests/quests/chapters/getting_started.snbt index 334624a..e79bdf1 100644 --- a/pack/config/ftbquests/quests/chapters/getting_started.snbt +++ b/pack/config/ftbquests/quests/chapters/getting_started.snbt @@ -27,6 +27,68 @@ } { dependencies: ["692C224D099307BA"] + icon: { + id: "minecraft:tripwire_hook" + } + id: "3E981E279A76CEC0" + tasks: [ + { + id: "79A62C2E20551202" + type: "checkmark" + } + ] + x: 2.0d + y: -1.5d + } + { + dependencies: ["692C224D099307BA"] + icon: { + id: "cobblemon:poke_ball" + } + id: "20A91DB2D922F503" + tasks: [ + { + id: "180A6D1BC999F7D4" + type: "checkmark" + } + ] + x: 2.0d + y: 0.0d + } + { + dependencies: ["20A91DB2D922F503"] + icon: { + id: "minecraft:iron_sword" + } + id: "47A58B466F15469C" + tasks: [ + { + action: "defeat" + amount: 1L + biome: "" + dex_progress: "" + dimension: "" + form: "" + gender: "" + id: "023CD014C314A448" + 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: 0.0d + } + { + dependencies: ["47A58B466F15469C"] icon: { id: "cobblemon:poke_ball" } @@ -77,6 +139,25 @@ x: 2.0d y: 0.75d } + { + dependencies: ["662D0BC3B032EA6A"] + icon: { + id: "cobblemon:pasture" + } + id: "7426375BD8FE75B4" + tasks: [ + { + id: "0EF1735FF82BF64A" + item: { + count: 1 + id: "cobblemon:pasture" + } + type: "item" + } + ] + x: 8.0d + y: -3.75d + } { dependencies: ["662D0BC3B032EA6A"] icon: { @@ -243,6 +324,66 @@ x: 6.0d y: -0.75d } + { + dependencies: ["734F4C633D8946E3"] + icon: { + id: "minecraft:filled_map" + } + id: "60FEC6A879706B6D" + tasks: [ + { + id: "7AF22D9FB20998A9" + type: "checkmark" + } + ] + x: 10.0d + y: 0.0d + } + { + dependencies: ["60FEC6A879706B6D"] + icon: { + id: "minecraft:leather_chestplate" + } + id: "2CD942BD947AD220" + tasks: [ + { + id: "72EC56D3618A6550" + type: "checkmark" + } + ] + x: 12.0d + y: -1.5d + } + { + dependencies: ["60FEC6A879706B6D"] + icon: { + id: "minecraft:raw_iron" + } + id: "2E30721826656889" + tasks: [ + { + id: "330E52B7A4CDB749" + type: "checkmark" + } + ] + x: 12.0d + y: 0.0d + } + { + dependencies: ["60FEC6A879706B6D"] + icon: { + id: "cobblesurvival:heat_core" + } + id: "64D6151FAA5792B2" + tasks: [ + { + id: "66630E973B974C93" + type: "checkmark" + } + ] + x: 12.0d + y: 1.5d + } { dependencies: ["734F4C633D8946E3", "4E95F2B6B144DACB"] icon: { diff --git a/pack/config/ftbquests/quests/chapters/highlands.snbt b/pack/config/ftbquests/quests/chapters/highlands.snbt index 7350326..7d75d6c 100644 --- a/pack/config/ftbquests/quests/chapters/highlands.snbt +++ b/pack/config/ftbquests/quests/chapters/highlands.snbt @@ -7,7 +7,7 @@ id: "cobblemon:sun_stone" } id: "26CC78ED0BC7D785" - order_index: 8 + order_index: 9 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ min_level: 0 natures: "" poke_ball_used: "" - pokemon: "cobblemon:abra,cobblemon:alakazam,cobblemon:ampharos,cobblemon:bellossom,cobblemon:blitzle,cobblemon:bouffalant,cobblemon:buizel,cobblemon:chewtle,cobblemon:cinderace,cobblemon:combusken,cobblemon:cottonee,cobblemon:cyclizar,cobblemon:cyndaquil,cobblemon:dodrio,cobblemon:doduo,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:zebstrika,cobblemon:zoroark,cobblemon:zorua" + pokemon: "cobblemon:abra,cobblemon:alakazam,cobblemon:ampharos,cobblemon:bellossom,cobblemon:blitzle,cobblemon:bouffalant,cobblemon:buizel,cobblemon:chewtle,cobblemon:cinderace,cobblemon:combusken,cobblemon:cottonee,cobblemon:cyclizar,cobblemon:cyndaquil,cobblemon:diglett,cobblemon:dodrio,cobblemon:doduo,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:zebstrika,cobblemon:zoroark,cobblemon:zorua" pokemon_type: "" region: "" shiny: false diff --git a/pack/config/ftbquests/quests/chapters/hms.snbt b/pack/config/ftbquests/quests/chapters/hms.snbt new file mode 100644 index 0000000..5363b80 --- /dev/null +++ b/pack/config/ftbquests/quests/chapters/hms.snbt @@ -0,0 +1,134 @@ +{ + default_hide_dependency_lines: false + default_quest_shape: "" + filename: "hms" + group: "" + icon: { + id: "minecraft:iron_pickaxe" + } + id: "15B6062D067ECE6C" + order_index: 1 + quest_links: [ ] + quests: [ + { + icon: { + id: "minecraft:iron_pickaxe" + } + id: "5662DCFF3C494207" + size: 1.5d + tasks: [ + { + id: "1E3E3883C5B3D807" + type: "checkmark" + } + ] + x: 0.0d + y: 0.0d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:iron_axe" + } + id: "136DBA5479235C7C" + tasks: [ + { + id: "27978949A669D5C5" + type: "checkmark" + } + ] + x: 2.0d + y: -4.5d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:ender_pearl" + } + id: "2CE94666160FA049" + tasks: [ + { + id: "68A914F71CB2AC6B" + type: "checkmark" + } + ] + x: 2.0d + y: -3.0d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:nether_star" + } + id: "14426F35CDAB120B" + tasks: [ + { + id: "44F75B6501B37EE0" + type: "checkmark" + } + ] + x: 2.0d + y: -1.5d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:spyglass" + } + id: "14A663D7085B96EF" + tasks: [ + { + id: "12874838083C1D42" + type: "checkmark" + } + ] + x: 2.0d + y: 0.0d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:honey_bottle" + } + id: "22D0F5E8ADD14B3C" + tasks: [ + { + id: "54E90B9B1AF4C46C" + type: "checkmark" + } + ] + x: 2.0d + y: 1.5d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:snowball" + } + id: "0364A4D8EA904F6E" + tasks: [ + { + id: "4F3BC1526B0D54EB" + type: "checkmark" + } + ] + x: 2.0d + y: 3.0d + } + { + dependencies: ["5662DCFF3C494207"] + icon: { + id: "minecraft:saddle" + } + id: "0C98431E89D63AA8" + tasks: [ + { + id: "37E7DC548E1504B2" + type: "checkmark" + } + ] + x: 2.0d + y: 4.5d + } + ] +} diff --git a/pack/config/ftbquests/quests/chapters/jungle.snbt b/pack/config/ftbquests/quests/chapters/jungle.snbt index fadf5c6..de3b886 100644 --- a/pack/config/ftbquests/quests/chapters/jungle.snbt +++ b/pack/config/ftbquests/quests/chapters/jungle.snbt @@ -7,7 +7,7 @@ id: "cobblemon:leaf_stone" } id: "0F763138AA0551CF" - order_index: 6 + order_index: 7 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ min_level: 0 natures: "" poke_ball_used: "" - pokemon: "cobblemon:aipom,cobblemon:bellsprout,cobblemon:bewear,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:komala,cobblemon:litten,cobblemon:natu,cobblemon:pancham,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:stufful,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: "cobblemon:aipom,cobblemon:bellsprout,cobblemon:bewear,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:komala,cobblemon:litten,cobblemon:natu,cobblemon:pancham,cobblemon:panpour,cobblemon:pansage,cobblemon:pansear,cobblemon:pikipek,cobblemon:servine,cobblemon:shroodle,cobblemon:simipour,cobblemon:simisage,cobblemon:simisear,cobblemon:slakoth,cobblemon:slowpoke,cobblemon:snivy,cobblemon:steenee,cobblemon:stufful,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 diff --git a/pack/config/ftbquests/quests/chapters/legends.snbt b/pack/config/ftbquests/quests/chapters/legends.snbt index 6477dd1..cf6a615 100644 --- a/pack/config/ftbquests/quests/chapters/legends.snbt +++ b/pack/config/ftbquests/quests/chapters/legends.snbt @@ -7,7 +7,7 @@ id: "cobblesurvival:summon_sigil" } id: "0217ED8D82F11BE4" - order_index: 16 + order_index: 17 quest_links: [ ] quests: [ { @@ -729,5 +729,101 @@ x: 6.5d y: 4.5d } + { + dependencies: ["73A150C1A7221BD0"] + icon: { + id: "cobblesurvival:summon_sigil" + } + id: "027E3B8E614FA133" + tasks: [ + { + action: "catch" + amount: 1L + biome: "" + dex_progress: "" + dimension: "" + form: "" + gender: "" + id: "2424A0A7C316243A" + max_level: 0 + min_level: 0 + natures: "" + poke_ball_used: "" + pokemon: "cobblemon:zapdos" + pokemon_type: "" + region: "" + shiny: false + time_max: 0L + time_min: 0L + type: "cobblemon_tasks:cobblemon_task" + } + ] + x: 8.0d + y: 4.5d + } + { + dependencies: ["73A150C1A7221BD0"] + icon: { + id: "cobblesurvival:summon_sigil" + } + id: "3B2B92B85F91AABA" + tasks: [ + { + action: "catch" + amount: 1L + biome: "" + dex_progress: "" + dimension: "" + form: "" + gender: "" + id: "3A1DA041487A4346" + max_level: 0 + min_level: 0 + natures: "" + poke_ball_used: "" + pokemon: "cobblemon:articuno" + pokemon_type: "" + region: "" + shiny: false + time_max: 0L + time_min: 0L + type: "cobblemon_tasks:cobblemon_task" + } + ] + x: 9.5d + y: 4.5d + } + { + dependencies: ["73A150C1A7221BD0"] + icon: { + id: "cobblesurvival:summon_sigil" + } + id: "1DADE103D473A8DB" + tasks: [ + { + action: "catch" + amount: 1L + biome: "" + dex_progress: "" + dimension: "" + form: "" + gender: "" + id: "2FCDD8BF421D688F" + max_level: 0 + min_level: 0 + natures: "" + poke_ball_used: "" + pokemon: "cobblemon:moltres" + pokemon_type: "" + region: "" + shiny: false + time_max: 0L + time_min: 0L + type: "cobblemon_tasks:cobblemon_task" + } + ] + x: 2.0d + y: 6.0d + } ] } diff --git a/pack/config/ftbquests/quests/chapters/lush_caves.snbt b/pack/config/ftbquests/quests/chapters/lush_caves.snbt index 3ef615b..9c456ed 100644 --- a/pack/config/ftbquests/quests/chapters/lush_caves.snbt +++ b/pack/config/ftbquests/quests/chapters/lush_caves.snbt @@ -7,7 +7,7 @@ id: "minecraft:glow_berries" } id: "5FD07FF070099857" - order_index: 4 + order_index: 5 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/machines.snbt b/pack/config/ftbquests/quests/chapters/machines.snbt index 3bffc77..8280c63 100644 --- a/pack/config/ftbquests/quests/chapters/machines.snbt +++ b/pack/config/ftbquests/quests/chapters/machines.snbt @@ -7,7 +7,7 @@ id: "cobblesurvival:heat_core" } id: "5170190C30A58C4C" - order_index: 17 + order_index: 18 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/mire.snbt b/pack/config/ftbquests/quests/chapters/mire.snbt index 3374f14..a32f556 100644 --- a/pack/config/ftbquests/quests/chapters/mire.snbt +++ b/pack/config/ftbquests/quests/chapters/mire.snbt @@ -7,7 +7,7 @@ id: "cobblesurvival:mire_waders" } id: "44799AD1E5B5CCB8" - order_index: 9 + order_index: 10 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ 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:hatenna,cobblemon:hattrem,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:toedscool,cobblemon:toedscruel,cobblemon:toxicroak,cobblemon:volbeat,cobblemon:yanma,cobblemon:yanmega" + pokemon: "cobblemon:accelgor,cobblemon:bellibolt,cobblemon:croagunk,cobblemon:dondozo,cobblemon:drizzile,cobblemon:ducklett,cobblemon:escavalier,cobblemon:flamigo,cobblemon:froakie,cobblemon:frogadier,cobblemon:greninja,cobblemon:hatenna,cobblemon:hattrem,cobblemon:illumise,cobblemon:inteleon,cobblemon:karrablast,cobblemon:marshtomp,cobblemon:masquerain,cobblemon:misdreavus,cobblemon:mudkip,cobblemon:shelmet,cobblemon:slowpoke,cobblemon:sobble,cobblemon:stunfisk,cobblemon:surskit,cobblemon:swampert,cobblemon:swanna,cobblemon:tadbulb,cobblemon:tatsugiri,cobblemon:tauros,cobblemon:toedscool,cobblemon:toedscruel,cobblemon:toxicroak,cobblemon:volbeat,cobblemon:yanma,cobblemon:yanmega" pokemon_type: "" region: "" shiny: false diff --git a/pack/config/ftbquests/quests/chapters/shallows.snbt b/pack/config/ftbquests/quests/chapters/shallows.snbt index aa57452..666a095 100644 --- a/pack/config/ftbquests/quests/chapters/shallows.snbt +++ b/pack/config/ftbquests/quests/chapters/shallows.snbt @@ -7,7 +7,7 @@ id: "minecraft:kelp" } id: "1B23BCD483E3F9CE" - order_index: 2 + order_index: 3 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ 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: "cobblemon:bruxish,cobblemon:carvanha,cobblemon:chinchou,cobblemon:clobbopus,cobblemon:crabrawler,cobblemon:cramorant,cobblemon:finizen,cobblemon:finneon,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 diff --git a/pack/config/ftbquests/quests/chapters/southwold.snbt b/pack/config/ftbquests/quests/chapters/southwold.snbt index f0dec9f..250f781 100644 --- a/pack/config/ftbquests/quests/chapters/southwold.snbt +++ b/pack/config/ftbquests/quests/chapters/southwold.snbt @@ -7,7 +7,7 @@ id: "minecraft:raw_copper" } id: "39B2B675E1F194C2" - order_index: 3 + order_index: 4 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ 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:nidoranf,cobblemon:nidoranm,cobblemon:nidorina,cobblemon:nidorino,cobblemon:noibat,cobblemon:patrat,cobblemon:pidove,cobblemon:pinsir,cobblemon:plusle,cobblemon:porygon,cobblemon:pumpkaboo,cobblemon:relicanth,cobblemon:sentret,cobblemon:shuppet,cobblemon:smoliv,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: "cobblemon:audino,cobblemon:azumarill,cobblemon:azurill,cobblemon:bunnelby,cobblemon:burmy,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:hawlucha,cobblemon:heracross,cobblemon:herdier,cobblemon:koffing,cobblemon:lillipup,cobblemon:lombre,cobblemon:lotad,cobblemon:magnemite,cobblemon:marill,cobblemon:meowth,cobblemon:minccino,cobblemon:minun,cobblemon:nidoranf,cobblemon:nidoranm,cobblemon:nidorina,cobblemon:nidorino,cobblemon:patrat,cobblemon:pidove,cobblemon:pinsir,cobblemon:plusle,cobblemon:porygon,cobblemon:pumpkaboo,cobblemon:relicanth,cobblemon:sentret,cobblemon:shuppet,cobblemon:smoliv,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 diff --git a/pack/config/ftbquests/quests/chapters/sunscorch.snbt b/pack/config/ftbquests/quests/chapters/sunscorch.snbt index d41a5e6..1d14144 100644 --- a/pack/config/ftbquests/quests/chapters/sunscorch.snbt +++ b/pack/config/ftbquests/quests/chapters/sunscorch.snbt @@ -7,7 +7,7 @@ id: "cobblemon:fire_stone" } id: "683F9A3EE54CFAEB" - order_index: 10 + order_index: 11 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ 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:farigiraf,cobblemon:fearow,cobblemon:fennekin,cobblemon:feraligatr,cobblemon:flygon,cobblemon:fuecoco,cobblemon:garganacl,cobblemon:girafarig,cobblemon:heliolisk,cobblemon:hippopotas,cobblemon:hippowdon,cobblemon:kangaskhan,cobblemon:klawf,cobblemon:krokorok,cobblemon:krookodile,cobblemon:larvesta,cobblemon:litleo,cobblemon:luxio,cobblemon:luxray,cobblemon:maractus,cobblemon:marowak,cobblemon:naclstack,cobblemon:numel,cobblemon:palpitoad,cobblemon:pawniard,cobblemon:phanpy,cobblemon:poltchageist,cobblemon:pyroar,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: "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:farigiraf,cobblemon:fearow,cobblemon:fennekin,cobblemon:feraligatr,cobblemon:flygon,cobblemon:fuecoco,cobblemon:garganacl,cobblemon:girafarig,cobblemon:growlithe,cobblemon:heliolisk,cobblemon:hippopotas,cobblemon:hippowdon,cobblemon:kangaskhan,cobblemon:klawf,cobblemon:krokorok,cobblemon:krookodile,cobblemon:larvesta,cobblemon:litleo,cobblemon:luxio,cobblemon:luxray,cobblemon:maractus,cobblemon:marowak,cobblemon:naclstack,cobblemon:numel,cobblemon:palpitoad,cobblemon:pawniard,cobblemon:phanpy,cobblemon:poltchageist,cobblemon:pyroar,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:tauros,cobblemon:totodile,cobblemon:vibrava" pokemon_type: "" region: "" shiny: false diff --git a/pack/config/ftbquests/quests/chapters/the_end.snbt b/pack/config/ftbquests/quests/chapters/the_end.snbt index f5543e9..b8cdc10 100644 --- a/pack/config/ftbquests/quests/chapters/the_end.snbt +++ b/pack/config/ftbquests/quests/chapters/the_end.snbt @@ -7,7 +7,7 @@ id: "minecraft:end_stone" } id: "523B743FE073F7FE" - order_index: 15 + order_index: 16 quest_links: [ ] quests: [ { diff --git a/pack/config/ftbquests/quests/chapters/westmarch.snbt b/pack/config/ftbquests/quests/chapters/westmarch.snbt index 8da5492..13efdd8 100644 --- a/pack/config/ftbquests/quests/chapters/westmarch.snbt +++ b/pack/config/ftbquests/quests/chapters/westmarch.snbt @@ -7,7 +7,7 @@ id: "cobblemon:thunder_stone" } id: "59ECDC0F93A836A2" - order_index: 5 + order_index: 6 quest_links: [ ] quests: [ { @@ -46,7 +46,7 @@ min_level: 0 natures: "" poke_ball_used: "" - pokemon: "cobblemon:appletun,cobblemon:applin,cobblemon:araquanid,cobblemon:breloom,cobblemon:buneary,cobblemon:corphish,cobblemon:dedenne,cobblemon:deerling,cobblemon:dewpider,cobblemon:dipplin,cobblemon:dratini,cobblemon:emolga,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:pineco,cobblemon:rotom,cobblemon:scyther,cobblemon:seedot,cobblemon:sewaddle,cobblemon:shroomish,cobblemon:skwovet,cobblemon:stunky,cobblemon:swadloon,cobblemon:tandemaus,cobblemon:teddiursa,cobblemon:thievul" + pokemon: "cobblemon:appletun,cobblemon:applin,cobblemon:araquanid,cobblemon:breloom,cobblemon:buneary,cobblemon:chansey,cobblemon:corphish,cobblemon:dedenne,cobblemon:deerling,cobblemon:dewpider,cobblemon:dipplin,cobblemon:dratini,cobblemon:emolga,cobblemon:flabebe,cobblemon:flapple,cobblemon:floette,cobblemon:gabite,cobblemon:geodude,cobblemon:gible,cobblemon:goomy,cobblemon:greedent,cobblemon:gyarados,cobblemon:happiny,cobblemon:lilligant,cobblemon:magikarp,cobblemon:maushold,cobblemon:munchlax,cobblemon:nickit,cobblemon:noibat,cobblemon:nuzleaf,cobblemon:petilil,cobblemon:phantump,cobblemon:pichu,cobblemon:pikachu,cobblemon:pineco,cobblemon:rotom,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 diff --git a/pack/config/ftbquests/quests/lang/en_us.snbt b/pack/config/ftbquests/quests/lang/en_us.snbt index da44c5e..3d120dc 100644 --- a/pack/config/ftbquests/quests/lang/en_us.snbt +++ b/pack/config/ftbquests/quests/lang/en_us.snbt @@ -2,6 +2,8 @@ "chapter.0217ED8D82F11BE4.chapter_subtitle": ["What never spawns on its own"] "chapter.0217ED8D82F11BE4.title": "Legends" "chapter.0F763138AA0551CF.title": "Verdant Jungle" + "chapter.15B6062D067ECE6C.chapter_subtitle": ["Every field move your Pokémon can lend you"] + "chapter.15B6062D067ECE6C.title": "HMs" "chapter.1AB2113B8D294817.title": "Basalt Furnace" "chapter.1B23BCD483E3F9CE.title": "Shallows" "chapter.1CC462D3533A24CB.title": "Dripstone Depths" @@ -23,10 +25,24 @@ "chapter.683F9A3EE54CFAEB.title": "Sunscorch" "chapter.720F052C0D14A813.title": "Deep Sea" "file.0000000000000001.title": "Cobblemon Survival" + "quest.027E3B8E614FA133.quest_desc": [ + "Craft the Galarian Zapdos Sigil and use it in Verdant Jungle. Catch the Lv 80 Galarian Zapdos that answers." + ] + "quest.027E3B8E614FA133.title": "Galarian Zapdos" "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.0364A4D8EA904F6E.quest_desc": [ + "Only one weather runs at a time: the last one switched on wins." + "Rain Dance: real rain around you, anywhere; it puts out fires and counts for rain evolutions and spawns." + "Thunder: a thunderstorm around you." + "Sunny Day: keeps the sky clear." + "Blizzard: real snow falls and settles around you." + "Sandstorm: soul sand and honey don't slow you, and sand, gravel and clay break four times as fast." + "Mist: anything hunting you loses you once you're 8 blocks away. Needs the Mire gate." + ] + "quest.0364A4D8EA904F6E.title": "Weather" "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." @@ -71,6 +87,16 @@ "Craft the Latios Sigil and use it in Highland Meadows. Catch the Lv 70 Latios that answers." ] "quest.0BCD6F1DF120EEF0.title": "Latios" + "quest.0C98431E89D63AA8.quest_desc": [ + "Switch these on from the Field moves of the Pokémon you ride. They stay on for that Pokémon." + "Surf: much faster through water." + "Tailwind: faster through the air." + "Agility: faster on land." + "Swift: reaches top speed twice as quickly." + "U-turn: turns far more sharply." + "Endure: double the stamina." + ] + "quest.0C98431E89D63AA8.title": "Mount Toggles" "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." @@ -96,11 +122,42 @@ "Craft the Zapdos Sigil and use it in Westmarch. Catch the Lv 70 Zapdos that answers." ] "quest.1334D8BDB02D0027.title": "Zapdos" + "quest.136DBA5479235C7C.quest_desc": [ + "Cut: fells a whole tree, or clears the plants in front of you." + "Rock Smash: breaks a stone block, or mines up to 32 connected ore in one punch, and veins still grow back." + "Dig: takes dirt, sand, gravel, clay and snow in one hit." + "Leafage: grows nearby crops, saplings and berry trees at once, and covers bare ground in flowers. Sneak to till soil instead." + "Stockpile: drinks water or lava, then spits it back out where you aim." + "Strength: pushes the block you aim at one block, in any direction, along with anything inside it." + "Tail Whip: sweeps suspicious sand or gravel clean in one go." + ] + "quest.136DBA5479235C7C.title": "Gathering and Building" "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.14426F35CDAB120B.quest_desc": [ + "Growth: makes the Pokémon you aim at one size bigger for good; aim elsewhere and you grow for 5 minutes." + "Minimize: the same, but smaller." + "Outrage: turns an XL Pokémon of yours into an Alpha." + "Calm Mind: settles an Alpha of yours back into an ordinary Pokémon." + "Decorate: one roll at making the Pokémon you aim at shiny for good, once an hour." + ] + "quest.14426F35CDAB120B.title": "Changing a Pokémon" + "quest.14A663D7085B96EF.quest_desc": [ + "Flash: lets you see in the dark. Needs the Dripstone gate." + "Dive: breathe, walk and mine at full speed underwater. Needs the Mire gate." + "Rock Climb: walls work like ladders, on foot or riding. Needs the Highlands gate." + "Magnet Rise: slow flight for building. Double-tap jump to lift off. Needs the Sunscorch gate." + "Lava Plume: the same as Dive, for lava, with fire immunity. Needs the Deep Dark gate." + "Jump: jump higher and land safely. Comes from Splash." + "Shadow Sneak: walk silently, unseen by pressure plates and sculk, at a reduced speed." + "Snowscape: snow under your feet, and still water freezes as you walk across it." + "" + "A gate means the Pokémon must have reached the top level of that zone, or hold one of its materials: its ore, evolution stone or guardian's drop." + ] + "quest.14A663D7085B96EF.title": "Exploring Auras" "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." @@ -137,6 +194,10 @@ "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.1DADE103D473A8DB.quest_desc": [ + "Craft the Galarian Moltres Sigil and use it in Deep Dark. Catch the Lv 80 Galarian Moltres that answers." + ] + "quest.1DADE103D473A8DB.title": "Galarian Moltres" "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." ] @@ -145,12 +206,24 @@ "Craft the Eternatus Sigil and use it in The End. Catch the Lv 90 Eternatus that answers." ] "quest.1F0FBB6BF2F87AA2.title": "Eternatus" + "quest.20A91DB2D922F503.quest_desc": [ + "When you first arrive you choose a starter. Look after it: it is the only Pokémon on the island that can never be lost." + "When it faints it stays with you, fainted, until you heal it. It can't be released or sacrificed." + "Every other Pokémon is gone for good when it faints." + ] + "quest.20A91DB2D922F503.title": "Your First Partner" "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.22D0F5E8ADD14B3C.quest_desc": [ + "Absorb: loose items drift toward you." + "Lucky Chant: more from what you break and fish. Needs the Frostpeak gate." + "Sweet Scent: draws a wild Pokémon of the area about once a minute, like a Poké Snack. What the Pokémon holds works as seasoning." + ] + "quest.22D0F5E8ADD14B3C.title": "Helping Auras" "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." @@ -191,6 +264,23 @@ "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.2CD942BD947AD220.quest_desc": [ + "Some zones hurt to be in. Sunscorch is hot and Frostpeak is cold: your body temperature climbs or falls quickly there, so wear hide against heat and fur against cold." + "The Mangrove Mire poisons you unless you wear Mire Waders. Look these up in JEI with R." + ] + "quest.2CD942BD947AD220.title": "Heat, Cold and Poison" + "quest.2CE94666160FA049.quest_desc": [ + "Teleport: blinks you up to 30 blocks to where you look (30 seconds to recharge)." + "Charge: turns a block into a lasting redstone power source. Use it again to switch it off." + "Camouflage: makes you look like the creature you aim at for 15 minutes." + "Celebrate: fireworks over your head, for no reason at all." + ] + "quest.2CE94666160FA049.title": "Handy Tricks" + "quest.2E30721826656889.quest_desc": [ + "There is no ore in ordinary stone. Each zone has its own nodes and underground veins, which grow back after you mine them. JEI's Ore Veins pages show what grows where." + "A Pokémon that knows Rock Smash can mine a whole vein with one punch: see the HMs page of this book." + ] + "quest.2E30721826656889.title": "Ore Comes from Veins" "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." @@ -230,6 +320,10 @@ "Craft the Moltres Sigil and use it in Basalt Furnace. Catch the Lv 70 Moltres that answers." ] "quest.3A7416794209F29E.title": "Moltres" + "quest.3B2B92B85F91AABA.quest_desc": [ + "Craft the Galarian Articuno Sigil and use it in Highland Meadows. Catch the Lv 80 Galarian Articuno that answers." + ] + "quest.3B2B92B85F91AABA.title": "Galarian Articuno" "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." ] @@ -245,6 +339,13 @@ "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.3E981E279A76CEC0.quest_desc": [ + "§ (left of 1) opens this book. J opens the map." + "R sends out the Pokémon selected on the left of your screen, or calls it back. Up and down arrows pick another. N opens its summary." + "Over an item in your inventory or JEI, R shows how to get it and U what it's used for." + "V shows more detail on what you're looking at. M switches shaders on and off. Everything can be changed in Options > Controls." + ] + "quest.3E981E279A76CEC0.title": "Keys Worth Knowing" "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." @@ -260,6 +361,12 @@ "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.47A58B466F15469C.quest_desc": [ + "Look at a wild Pokémon and press R: your Pokémon goes out and the battle starts." + "Wild Pokémon can also come to you. One that attacks you starts a battle instead of hurting you, unless none of your Pokémon can fight: then you take the hit yourself." + "Pokémon stronger than your team hunt you; weaker ones keep their distance. In a battle you can run, and you get a few seconds' head start." + ] + "quest.47A58B466F15469C.title": "Battling" "quest.47CC5F3E473D3ADA.quest_desc": [ "Craft the Regidrago Sigil and use it in Sunscorch. Catch the Lv 70 Regidrago that answers." ] @@ -294,7 +401,7 @@ ] "quest.4CA0BE77C607EFF4.title": "Registeel" "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." + "Sleeping doesn't heal your Pokémon. A Healing Machine does, and it also wakes a fainted starter, but it is expensive and recharges slowly; potions and berries help in between." ] "quest.4CCE497681B71AB5.title": "Healing" "quest.4D8A9AAC3492BF6A.quest_desc": [ @@ -329,6 +436,17 @@ ] "quest.55ECFCF6F71DD9EA.quest_subtitle": "Lv 30–45" "quest.55ECFCF6F71DD9EA.title": "Sunscorch" + "quest.5662DCFF3C494207.quest_desc": [ + "Any Pokémon of yours that has learned one of these moves can use it for you outside battle. There is nothing to craft or learn yourself." + "Send the Pokémon out, sneak and right-click it, and pick Field moves. It lists what that Pokémon can do; hover over one to read about it. The top left of your screen shows what is active." + "" + "Partner HMs go to your empty hand: one per Pokémon, fired with a click." + "Auras and weather work on you while the Pokémon is out and within 24 blocks." + "Mount toggles help the Pokémon itself while you ride it." + "" + "Working makes a Pokémon hungry. Right-click it with any berry to feed it. If it works on an empty stomach it loses friendship, and at none it refuses." + ] + "quest.5662DCFF3C494207.title": "How HMs Work" "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." @@ -356,6 +474,11 @@ "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.60FEC6A879706B6D.quest_desc": [ + "Each zone has its own Pokémon and level range; the book has a page for each. The channels between the islands are gentle, the open sea around them is not." + "Most zones have a guardian: a giant Pokémon with a health bar at the top of your screen when you are near. Only a battle can hurt it, and it can lose at most a quarter of its health to one attack. Beat it for its rewards; it comes back hours later." + ] + "quest.60FEC6A879706B6D.title": "Zones and Guardians" "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." @@ -368,17 +491,24 @@ "Beat it for 3 Exp Candy Xl, 2 Netherite Scrap. It returns 5 hours later." ] "quest.64893157D81592CD.title": "Guardian of Basalt Furnace" + "quest.64D6151FAA5792B2.quest_desc": [ + "Machines are small buildings with a Pokémon inside: a Large Furnace, a Generator, a Drop Synthesizer, a Sacrifice Altar and a Rebirth Chamber. Craft a core, use it, and ghost blocks show how to build around it." + "JEI lists each core's recipe, and each machine's own page says what it makes." + ] + "quest.64D6151FAA5792B2.title": "Pokémon at Work" "quest.65A44ABB757D8EC9.quest_desc": [ "Craft the Latias Sigil and use it in Highland Meadows. Catch the Lv 70 Latias that answers." ] "quest.65A44ABB757D8EC9.title": "Latias" "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." + "Apart from your starter, 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. Your starter doesn't need one." ] "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.662D0BC3B032EA6A.quest_desc": [ + "Weaken a wild Pokémon in battle, then throw a Poké Ball at it. The weaker it is, the easier it is to catch, and a Pokémon far above your team's level is much harder." + ] + "quest.662D0BC3B032EA6A.title": "Your First Catch" "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." @@ -398,7 +528,7 @@ "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." + "This book suggests what to do next. Nothing in it is locked and it gives no rewards: do things in any order you like. This first page walks through how the island works; the next one lists every field move your Pokémon can lend you." ] "quest.692C224D099307BA.title": "Welcome to the Island" "quest.69D3A6622A0EE729.quest_desc": [ @@ -467,6 +597,11 @@ ] "quest.74149A0BF939C15E.quest_subtitle": "Lv 2–10" "quest.74149A0BF939C15E.title": "Button Isle" + "quest.7426375BD8FE75B4.quest_desc": [ + "A PC holds the Pokémon that don't fit in your party. A Pasture Block lets them out to roam around your base." + "Pastured Pokémon also work: open the pasture and give them a skill, such as mining or gathering, and they bring in items. What they can find depends on the zone the pasture stands in, and JEI's Pasture Finds pages list it." + ] + "quest.7426375BD8FE75B4.title": "PC and Pastures" "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." ] @@ -497,28 +632,37 @@ "task.011FDF522119676D.title": "Beat Eternatus" "task.03F5C5D2587C6503.title": "Reach Westmarch" "task.0988A335BEF29999.title": "Reach Basalt Furnace" + "task.12874838083C1D42.title": "Read this" "task.16DC8BE1DDE7B0D7.title": "Beat Scyther" + "task.180A6D1BC999F7D4.title": "Read this" "task.1AD94715DD267878.title": "Reach Lush Caves" "task.1DC91BD8BFFFEDA9.title": "Put a Pokémon into a Drop Synthesizer" + "task.1E3E3883C5B3D807.title": "Read this" "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.27978949A669D5C5.title": "Read this" "task.29BC1DB51DDFA453.title": "Put an Electric type into a Generator" "task.2B27F35809CBDD44.title": "Read this" "task.2D2320863A33D6F6.title": "Reach Highland Meadows" + "task.330E52B7A4CDB749.title": "Read this" "task.34B8D43E572277D5.title": "Reach The End" "task.3733FBDB6C485FA5.title": "Start a rebirth" "task.3760C53D7E826E9F.title": "Beat Moltres" + "task.37E7DC548E1504B2.title": "Read this" "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.44F75B6501B37EE0.title": "Read this" "task.48FAAD6D76831C55.title": "Beat Swampert" + "task.4F3BC1526B0D54EB.title": "Read this" "task.541704C98A1EFEFD.title": "Reach Dripstone Depths" + "task.54E90B9B1AF4C46C.title": "Read this" "task.574F9217F1F28CA1.title": "Reach Deep Sea" "task.58EAEDE25DA7FDA3.title": "Reach Southwold" "task.601AABB55A476514.title": "Beat Morpeko" @@ -526,8 +670,13 @@ "task.6120ECDE48C04063.title": "Read this" "task.63B77EE998527582.title": "Beat Flygon" "task.643C68559D41888A.title": "Beat Pinsir" + "task.66630E973B974C93.title": "Read this" + "task.68A914F71CB2AC6B.title": "Read this" "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" + "task.72EC56D3618A6550.title": "Read this" + "task.79A62C2E20551202.title": "Got it" + "task.7AF22D9FB20998A9.title": "Read this" } diff --git a/pack/config/xaero/minimap/default_radar_categories_client.json b/pack/config/xaero/minimap/default_radar_categories_client.json new file mode 100644 index 0000000..3c2c0b0 --- /dev/null +++ b/pack/config/xaero/minimap/default_radar_categories_client.json @@ -0,0 +1,192 @@ +{ + "hardInclude": "anything", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [ + "minecraft:glow_item_frame", + "minecraft:item_frame" + ], + "name": "gui.xaero_entity_category_root", + "protection": true, + "settingOverrides": { + "displayHeight": 0.0, + "displayed": true, + "heightBasedFade": true, + "renderOrder": 0.0, + "color": 13.0, + "displayNameWhenIconFails": true, + "entityNumber": 1000.0, + "alwaysDisplayNametags": false, + "dotSize": 2.0, + "startFadingAt": 0.0, + "renderOverMinimapFrame": 1.0, + "icons": 1.0, + "heightLimit": 20.0, + "names": 0.0, + "iconScale": 1.0 + }, + "subCategories": [ + { + "hardInclude": "living", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [ + "minecraft:armor_stand" + ], + "name": "gui.xaero_entity_category_living", + "protection": true, + "settingOverrides": { + "renderOrder": 2.0, + "color": 14.0 + }, + "subCategories": [ + { + "hardInclude": "players", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_players", + "protection": true, + "settingOverrides": { + "renderOrder": 6.0, + "heightLimit": 2050.0, + "color": 15.0 + }, + "subCategories": [ + { + "hardInclude": "nothing", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_friend", + "protection": true, + "settingOverrides": {}, + "subCategories": [] + }, + { + "hardInclude": "tracked", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_tracked", + "protection": true, + "settingOverrides": { + "icons": 2.0 + }, + "subCategories": [] + }, + { + "hardInclude": "same-team", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_same_team", + "protection": true, + "settingOverrides": {}, + "subCategories": [] + }, + { + "hardInclude": "anything", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_other_teams", + "protection": true, + "settingOverrides": { + "renderOrder": 7.0 + }, + "subCategories": [] + } + ] + }, + { + "hardInclude": "hostile", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_hostile", + "protection": true, + "settingOverrides": { + "renderOrder": 3.0 + }, + "subCategories": [ + { + "hardInclude": "tamed", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_hostile_tamed", + "protection": true, + "settingOverrides": { + "renderOrder": 5.0 + }, + "subCategories": [] + } + ] + }, + { + "hardInclude": "anything", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_friendly", + "protection": true, + "settingOverrides": {}, + "subCategories": [ + { + "hardInclude": "tamed", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_friendly_tamed", + "protection": true, + "settingOverrides": { + "renderOrder": 4.0 + }, + "subCategories": [] + } + ] + } + ] + }, + { + "hardInclude": "items", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_items", + "protection": true, + "settingOverrides": { + "renderOrder": 1.0, + "color": 12.0, + "displayed": false + }, + "subCategories": [] + }, + { + "hardInclude": "anything", + "includeList": [], + "includeListInSuperCategory": true, + "excludeMode": "ONLY", + "excludeList": [], + "name": "gui.xaero_entity_category_other_entities", + "protection": true, + "settingOverrides": { + "color": 5.0 + }, + "subCategories": [] + } + ] +} diff --git a/pack/index.toml b/pack/index.toml index 0ae0592..0080616 100644 --- a/pack/index.toml +++ b/pack/index.toml @@ -6,15 +6,15 @@ hash = "5cf75685938ffd7771c204ee1603214319f33dd2a40df99cedc8d92c76304854" [[files]] file = "config/cobblemon/main.json" -hash = "95777507e9ca8aecb024db1cf25688592914b6e7c75b48d52d41893d5bfc821a" +hash = "7ab2350905d11f7d03204159ab5a17c11d902168f8b633299b1f735fe317dba1" [[files]] file = "config/coldsweat/item.toml" -hash = "59f8eecb7209098c08ee73e811cc185ebf027f9b52898e63d05f900a82c8af92" +hash = "7c400318f03d8d9db08176c872ed1f70d34f7ee4dd9eb5025ef8dbde7480bbc8" [[files]] file = "config/coldsweat/main.toml" -hash = "4cc39db96807a4714dd5417d2f065ee6784bc60349fd3c0dc92bcd8fe737b6ea" +hash = "8ee6371ee5f4212899f08efba6e2f7760d44df2e0a5328ecbde468e2f05af943" [[files]] file = "config/coldsweat/world.toml" @@ -26,7 +26,7 @@ hash = "3866233ba2035bd6ffe6e06cf74c7b1f16869184c274276ca0bd546f1e8bf003" [[files]] file = "config/defaultoptions/keybindings.txt" -hash = "236b4b59f48947317c50215ff7ad4e707d727594498eabd8cc805ec1998ee92e" +hash = "515362c7a71b203b8ba3ea9d125c6b8cafc2abdb480df5936b9af6a3632d865b" [[files]] file = "config/fightorflight.json5" @@ -38,79 +38,83 @@ hash = "e57d8311aec9f524911ed1313cabf138bb7fa5a2d3ba985a00a2a267ff35ef78" [[files]] file = "config/ftbquests/quests/chapters/basalt.snbt" -hash = "8a7eab2ca30f47109add6cfbf4eeb4717e3704bc85902ee8f4c5307b2b2eeb3c" +hash = "8512f3134b0ec73b5732f28be63daadae5104871e038daf59f2fc84ab4b3bef2" [[files]] file = "config/ftbquests/quests/chapters/base.snbt" -hash = "555564da7dd44e375664b94a51b2334c636d7c5d72db164b03c6fe9196d06de0" +hash = "1a450cd4303cb834b43c8df30b07d59bbaa8e2e0c590497cf998ba3264d018fd" [[files]] file = "config/ftbquests/quests/chapters/button_isle.snbt" -hash = "ce24fccd748e805ec617f7b571263c1af91377644a3fc17146bf38963e8b54ab" +hash = "73bcbcacc9df9b445912857a97983a31e7ee1e858d794c36d1f52f577c334da3" [[files]] file = "config/ftbquests/quests/chapters/deep_dark.snbt" -hash = "7208cd9166e11beed91086cd0a897f49cf31ecadd65acaa3b798169c86b0ae34" +hash = "f5527a20dbc9b3ab1ab78d50cb37b95142d39fce1f2f7d7a64f94d00307da3a1" [[files]] file = "config/ftbquests/quests/chapters/deep_sea.snbt" -hash = "bd87d38b3ec40b408e1710d641ac9ce57824e2ebfd7cf3674a166521482acb76" +hash = "25222720545d502779d409898de568d96d52e200b6eca4920a81c30ee6c3ef2c" [[files]] file = "config/ftbquests/quests/chapters/dripstone.snbt" -hash = "56886a1f390e9379672bde9190a0823cffdb3bb42cde043b4c772a1d0fa54e47" +hash = "851c5514d74e3c88f28cb02f3f0dce2ca68986e99de26dbde4c5b097e82a985f" [[files]] file = "config/ftbquests/quests/chapters/frostpeak.snbt" -hash = "150e60db7c18fbdb3c882cadc894813e3bc951c8adbfe42a30c38fc657c79a70" +hash = "314b8c10c1179cefb7b3b17d0c5354b21939423a08ccdc91f25eef018908a8f1" [[files]] file = "config/ftbquests/quests/chapters/getting_started.snbt" -hash = "829aa67db8a39f6f43aa6076090c0040e4324be70abe0b30e0edcce48d924ab9" +hash = "408f1fc46e46edef88e1b1f86bd72789d7e9a7d1e1fb1e623d1856bb0051be96" [[files]] file = "config/ftbquests/quests/chapters/highlands.snbt" -hash = "3724fa8a038561cc8965e6dfe5bc62718872d04f385bb636e984988762046670" +hash = "d98f934be41c10efe0031af1cb387e856600db161fe16d2860f3a7b21f4df75a" + +[[files]] +file = "config/ftbquests/quests/chapters/hms.snbt" +hash = "a2843ac93232699b771ad0d6075089d843a875227e7b0be048c04101963f95c6" [[files]] file = "config/ftbquests/quests/chapters/jungle.snbt" -hash = "5afa0885dbd853ea973fb61881a14b97a98af4d0dd26b66d837541ba1b09c8c8" +hash = "77b87b15cf25f406e520c8f7f4e262ae7387ff096c16ea0fe476c4094f6ace2d" [[files]] file = "config/ftbquests/quests/chapters/legends.snbt" -hash = "faed84fa13b7ea26305e2c07e23d6be0d4198cbee177042279776864387c4d97" +hash = "d9b802768540907ff80f4e48fcfe0e7f1dd0486d4490bd902e81c714a226b51a" [[files]] file = "config/ftbquests/quests/chapters/lush_caves.snbt" -hash = "bd5734f9df4e1dc1caa989c32b5dac797f5104a4c6c0987801d3650e12d1e491" +hash = "6a5c517410bce3d986999bb308d918eff32bae092000ff1a2c6db125ba251eab" [[files]] file = "config/ftbquests/quests/chapters/machines.snbt" -hash = "f747805848fc39fa30293baebc3bce75742663c5f30a6439b0318ac4cf9657f0" +hash = "a9fa3e034e86942e6aba2fde08d09592c6c9a81b2740ffda64c99d209ffe8f01" [[files]] file = "config/ftbquests/quests/chapters/mire.snbt" -hash = "c540889e8fe5432723f16c8cd8dbe63117e2b3b5523793b9872902d1837b4459" +hash = "97415b060f9fe611d9a58015e16e926d7ef4f2aa80ef12f486d84ea9520e40db" [[files]] file = "config/ftbquests/quests/chapters/shallows.snbt" -hash = "1f3829f5f40e853673645d7ea250e646f97bbd79b3235bc6f2b119defb573423" +hash = "ccb4c5c9bc33ea741aa820937fe6820bb05529109c90884765585b51e615e987" [[files]] file = "config/ftbquests/quests/chapters/southwold.snbt" -hash = "b3efaa514904c55f711c6c2565825bdd4866ce291e4810d975d1afc31d167f97" +hash = "a3e4f9446c94e415c5d9c02b5d2bd0d00bff42b6565b44d49cd26ad37edc2e37" [[files]] file = "config/ftbquests/quests/chapters/sunscorch.snbt" -hash = "f936a44de913816a869f29797f82f43c65f57e3f8b78cbe1d69aa1e98b76d136" +hash = "59a029a71dc6aa522cdfe60edaee9454656b46d1db42c91c1e0b159bf903ed61" [[files]] file = "config/ftbquests/quests/chapters/the_end.snbt" -hash = "4a3aa5f1e3bed52e6c844284dec549367af01d4341aeefa460cdc135e2fba660" +hash = "6bda6a06b81c15ed441fe0a02b024d70346a9c64cc92154dac74d299ca9fbb8c" [[files]] file = "config/ftbquests/quests/chapters/westmarch.snbt" -hash = "8d9922fce0f84d0a3192eefb6924a17849c875a52144f6f032951e2d1137b4b5" +hash = "7fb9777ca66f93688606fdc51aab7cc5e402078e6fce84b7de3e197bd8b8c23a" [[files]] file = "config/ftbquests/quests/data.snbt" @@ -118,7 +122,7 @@ hash = "35b6760d4c56b02f2ff77dd5ba2f0e634c7f68238ce2809cddb22d9c61c6f943" [[files]] file = "config/ftbquests/quests/lang/en_us.snbt" -hash = "f06c0b3fd853aed231d9d72b0634da737b930f4a51db3eb17bf29c14ef548a35" +hash = "aa487a7deeac4d0d693804c6efc5f0a09ea3dad0081c88cf932f142e9f1bf6c3" [[files]] file = "config/lootr-common.toml" @@ -156,6 +160,10 @@ hash = "73cfb1e126bf49dc6c9fa52fb137e8fe9bfb945535701fd542639202ed24704f" file = "config/worldgen_editor/worldgen_editor.json" hash = "ff92c8b83a303441c81835a1ab22dfc42599fd58d43a920452257bb1c6b39d9d" +[[files]] +file = "config/xaero/minimap/default_radar_categories_client.json" +hash = "e0a234797b1063dd91a6fec8ebdd3828b93dc39ee4c134d11175aa6d1f26fc20" + [[files]] file = "defaultconfigs/cobblehardcoremon/server.toml" hash = "5e68c4bc93fcc06f85cabc6c587c1b70cb2a22da01ad9653d678ac9131c0003b" @@ -184,6 +192,10 @@ hash = "6b1b127b16a87b846a5abdbdb442edb8cbd9386562081309a3808eed1325ed1e" file = "kubejs/server_scripts/insulation.js" hash = "026dc5ab98cb13c906d5b6974ea7624014e804c58141f01ec57e077e1e8bb339" +[[files]] +file = "kubejs/server_scripts/quest_book_on_join.js" +hash = "14e6edaaa36267bcd449027110a07b1d883de5bbfd25b193a8ceed0c35208204" + [[files]] file = "kubejs/server_scripts/revival_charm.js" hash = "68c23da4ab4daa0687f0c367c4cf837a9c26c18c4034bd3fbdedbcc6d3b716f6" @@ -391,6 +403,11 @@ file = "mods/sodium.pw.toml" hash = "85b08670f3768dbb22477f04339fdda9907769bc1c875cc45352f82c4dece324" metafile = true +[[files]] +file = "mods/spark.pw.toml" +hash = "0602d8dec45b4af9b6e4d829ea7183894c0a06244f2f455bef64e0491c63519d" +metafile = true + [[files]] file = "mods/worldgen-editor.pw.toml" hash = "311a5bebcb7bd0b2b98cc6c4a8c344befaa69d0c958c3bf2ce8048f0b958faf1" diff --git a/pack/kubejs/server_scripts/quest_book_on_join.js b/pack/kubejs/server_scripts/quest_book_on_join.js new file mode 100644 index 0000000..937ca31 --- /dev/null +++ b/pack/kubejs/server_scripts/quest_book_on_join.js @@ -0,0 +1,6 @@ +// Every player starts with the quest book (Adrian, 2026-11-09). The stage remembers it, so it is given once. +PlayerEvents.loggedIn(event => { + if (event.player.stages.has('cobblesurvival_got_quest_book')) return + event.player.stages.add('cobblesurvival_got_quest_book') + event.player.give('ftbquests:book') +}) diff --git a/pack/mods/spark.pw.toml b/pack/mods/spark.pw.toml new file mode 100644 index 0000000..75625ad --- /dev/null +++ b/pack/mods/spark.pw.toml @@ -0,0 +1,17 @@ +name = "spark" +filename = "spark-1.10.124-neoforge.jar" +side = "server" + +[download] +url = "https://cdn.modrinth.com/data/l6YH9Als/versions/v5qtqRQi/spark-1.10.124-neoforge.jar" +hash-format = "sha512" +hash = "f86ce34f2759c69df82578c397ff55b666c84626229a98f598458b960c21b38c95d6bfef4772af7f963c4f4868e5e2d9aef6b99c1d51bab55bf45e0e6e6b5ed4" + +[update] +[update.modrinth] +mod-id = "l6YH9Als" +version = "v5qtqRQi" + +[update.curseforge] +file-id = 6225208 +project-id = 361579 diff --git a/pack/pack.toml b/pack/pack.toml index 48eedfc..a8f3025 100644 --- a/pack/pack.toml +++ b/pack/pack.toml @@ -6,7 +6,7 @@ pack-format = "packwiz:1.1.0" [index] file = "index.toml" hash-format = "sha256" -hash = "72d088fe084f47754358b2ac5d723323f70779850de3e7135470bb1f45bcb3f4" +hash = "54a1e96b8b1da6cfc3ed545e05acd730dce5d34a3080f186ad1447c8708d5fe3" [versions] minecraft = "1.21.1" diff --git a/tools/build-lock.toml b/tools/build-lock.toml new file mode 100644 index 0000000..abf8ea0 --- /dev/null +++ b/tools/build-lock.toml @@ -0,0 +1,26 @@ +# Every tool the pack's build runs, pinned. tools/lock.py checks each download against its hash and refuses a mismatch. +# Mods are pinned by hash in pack/mods/*.pw.toml, Python packages in tools/requirements.txt, Gradle's in mod/. +python = "3.14" + +[packwiz] +module = "github.com/packwiz/packwiz" +version = "v0.0.0-20261014010756-170b22d78595" +go = "go1.25.1" + +[jdk] +version = "21.0.7+6" +platform = "linux-x86_64" +url = "https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.7%2B6/OpenJDK21U-jdk_x64_linux_hotspot_21.0.7_6.tar.gz" +sha256 = "974d3acef0b7193f541acb61b76e81670890551366625d4f6ca01b91ac152ce0" + +[downloads."packwiz-installer-0.5.14.jar"] +url = "https://github.com/packwiz/packwiz-installer/releases/download/v0.5.14/packwiz-installer.jar" +sha256 = "c9f646908d340d84773948a9a7d98bc1dae250d35e1016dc6e2b8459760b5598" + +[downloads."packwiz-installer-bootstrap-0.0.3.jar"] +url = "https://github.com/packwiz/packwiz-installer-bootstrap/releases/download/v0.0.3/packwiz-installer-bootstrap.jar" +sha256 = "a8fbb24dc604278e97f4688e82d3d91a318b98efc08d5dbfcbcbcab6443d116c" + +[downloads."neoforge-21.1.265-installer.jar"] +url = "https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.265/neoforge-21.1.265-installer.jar" +sha256 = "a547ccc30a80a675d1c61d04b55d10c45c39a86971e09731482c50a24399d1a2" diff --git a/tools/build.py b/tools/build.py index e8213d2..1e66bd1 100644 --- a/tools/build.py +++ b/tools/build.py @@ -6,6 +6,11 @@ Outputs, all under build/: instance and the server smoke test install this -.mrpack Modrinth pack --curseforge.zip CurseForge pack + SHA256SUMS what the build produced + +Reproducible: the same commit gives the same bytes, whatever the machine has +installed and wherever the repo is. Every tool is pinned (tools/lock.py), and +tools/check_reproducible.py proves it with two builds from clean copies. Each platform export only lists mods that platform hosts. A mod hosted on just one platform is left out of the other export and reported; it is never copied @@ -15,6 +20,7 @@ companion mod is our own work, so it is the one jar allowed in overrides/. Usage: tools/build.py [--skip-mod] """ import argparse +import json import os import shutil import subprocess @@ -23,6 +29,8 @@ import tomllib import zipfile from pathlib import Path +import lock + ROOT = Path(__file__).resolve().parent.parent PACK = ROOT / "pack" BUILD = ROOT / "build" @@ -36,28 +44,37 @@ def run(cmd, cwd): def packwiz(*args, cwd): - run([shutil.which("packwiz") or "packwiz", *args, "-y"], cwd) + run([lock.packwiz(), *args, "-y"], cwd) -def java_home(): - """Gradle 8.14 cannot run on Java 25, so prefer an explicit Java 21.""" - for candidate in (os.environ.get("JAVA21_HOME"), os.environ.get("JAVA_HOME"), - Path.home() / ".var/app/org.prismlauncher.PrismLauncher/data/PrismLauncher/java/java-runtime-delta"): - if candidate and (Path(candidate) / "bin" / "java").exists(): - return str(candidate) - return None +def gradle_properties(): + return dict(line.split("=", 1) for line in (ROOT / "mod/gradle.properties").read_text().splitlines() + if "=" in line and not line.startswith("#")) + + +def check_versions(): + """mod/gradle.properties compiles against the versions the pack installs.""" + props = gradle_properties() + if props["neoforge_version"] != tomllib.loads((PACK / "pack.toml").read_text())["versions"]["neoforge"]: + sys.exit("mod/gradle.properties and pack/pack.toml name different NeoForge versions") + for slug, prop in (("cobblemon", "cobblemon_version"), ("kotlin-for-forge", "kotlinforforge_version"), ("jei", "jei_version")): + filename = tomllib.loads((PACK / f"mods/{slug}.pw.toml").read_text())["filename"] + if props[prop] not in filename: + sys.exit(f"mod/gradle.properties says {prop}={props[prop]}, the pack installs {filename}") def build_mod(): - env = dict(os.environ) - if home := java_home(): - env["JAVA_HOME"] = home - subprocess.run(["./gradlew", "build", "--console=plain"], cwd=ROOT / "mod", env=env, check=True) + """From clean, with only the pinned JDK to compile against (an incremental build can differ from a full one).""" + jdk = lock.jdk() + subprocess.run(["./gradlew", "clean", "build", "--console=plain", "--no-build-cache", + f"-Porg.gradle.java.installations.paths={jdk}", + "-Porg.gradle.java.installations.auto-detect=false", + "-Porg.gradle.java.installations.auto-download=false"], + cwd=ROOT / "mod", env=os.environ | {"JAVA_HOME": str(jdk)}, check=True) def companion_jar(): - props = dict(line.split("=", 1) for line in (ROOT / "mod/gradle.properties").read_text().splitlines() - if "=" in line and not line.startswith("#")) + props = gradle_properties() jar = ROOT / "mod/build/libs" / f"{props['mod_id']}-{props['mod_version']}.jar" if not jar.exists(): sys.exit(f"companion jar not found: {jar} (run without --skip-mod)") @@ -105,16 +122,44 @@ def check_default_shader(): sys.exit(f"config/defaultoptions/extra/config/iris.properties names {named}, the pack has {files}") +def normalise_export(archive): + """packwiz writes an export's entries, the manifest's file list and the mod list in a random order: sort them.""" + with zipfile.ZipFile(archive) as z: + files = {i.filename: z.read(i.filename) for i in z.infolist() if not i.is_dir()} + if "manifest.json" in files: + manifest = json.loads(files["manifest.json"]) + manifest["files"].sort(key=lambda f: (f["projectID"], f["fileID"])) + files["manifest.json"] = (json.dumps(manifest, indent=2, ensure_ascii=False) + "\n").encode() + if "modlist.html" in files: + lines = files["modlist.html"].decode().splitlines() + items = sorted(line for line in lines if line.lstrip().startswith("
  • ")) + files["modlist.html"] = "\n".join(["
      ", *items, "
    ", ""]).encode() + with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as z: + for name in sorted(files): + info = zipfile.ZipInfo(name, (1980, 1, 1, 0, 0, 0)) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = 0o644 << 16 + z.writestr(info, files[name]) + + +def write_checksums(paths): + (BUILD / "SHA256SUMS").write_text("".join(f"{lock.digest(p)} {p.relative_to(ROOT).as_posix()}\n" for p in sorted(paths))) + + def main(): + lock.enter_venv() parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("--skip-mod", action="store_true", help="reuse the last companion mod build") args = parser.parse_args() + check_versions() + check_default_shader() + # Written from the pack's data, so these go first: the drop pages ship in the data pack the mod embeds. + run([sys.executable, str(ROOT / "tools/jei_sources.py")], ROOT) + run([sys.executable, str(ROOT / "tools/quests.py")], ROOT) # the quest book (Phase 8) from docs/quests.yaml if not args.skip_mod: build_mod() jar = companion_jar() - check_default_shader() - 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']}" @@ -127,9 +172,11 @@ def main(): out = BUILD / f"{base}{suffix}" out.unlink(missing_ok=True) packwiz(command, "export", "-o", str(out), cwd=dest) + normalise_export(out) check_overrides(out, jar) report[out.name] = left_out + write_checksums([jar, BUILD / "stage/full/pack.toml", BUILD / "stage/full/index.toml", *(BUILD / name for name in report)]) print("\nExports (no third-party jars in overrides):") for name, left_out in report.items(): print(f" build/{name}") diff --git a/tools/check_keybinds.py b/tools/check_keybinds.py index 634a607..eded985 100644 --- a/tools/check_keybinds.py +++ b/tools/check_keybinds.py @@ -20,6 +20,8 @@ from pathlib import Path ROOT = Path(__file__).resolve().parent.parent DEFAULTS = ROOT / "pack/config/defaultoptions/keybindings.txt" +# Share a key on purpose (Adrian, 2026-11-09): JEI's only works in a screen, Cobblemon's sends out a Pokémon in the world. +BY_DESIGN = [{"key.jei.showRecipe", "key.cobblemon.throwpartypokemon"}] INSTANCE = (Path.home() / ".var/app/org.prismlauncher.PrismLauncher/data/PrismLauncher/instances" / "Cobblemon Survival Pack (dev)/minecraft/options.txt") @@ -52,6 +54,8 @@ def main(): def clashes(entries): # One mod's binds share a context, so distinct modifiers keep them apart (e.g. JEI's # Page Down and Shift+Page Down). Anything else on the same key shows as a conflict. + if {name for name, _ in entries} in BY_DESIGN: + return False mods = {name.rsplit(".", 1)[0] for name, _ in entries} return len(entries) > 1 and not (len(mods) == 1 and len({m for _, m in entries}) == len(entries)) diff --git a/tools/check_reproducible.py b/tools/check_reproducible.py new file mode 100755 index 0000000..3fd9b31 --- /dev/null +++ b/tools/check_reproducible.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +"""Prove the build reproducible: build the working tree twice from clean copies in different folders, compare the bytes. + +Copies every tracked and untracked file (not what .gitignore hides) to build/reproducible/a and build/reproducible/the/other/b, +so a leaked path shows up. Each build gets its own Gradle home with --fresh-gradle (slower: Loom sets up Minecraft +twice); the pinned tools are shared, since they're checked by hash. On a mismatch it names the jar or pack entries that differ. + +Usage: tools/check_reproducible.py [--fresh-gradle] +""" +import argparse +import os +import shutil +import subprocess +import sys +import zipfile +from pathlib import Path + +import lock + +ROOT = lock.ROOT +WORK = ROOT / "build/reproducible" + + +def build(copy, fresh_gradle): + shutil.rmtree(copy, ignore_errors=True) + files = subprocess.run(["git", "ls-files", "-co", "--exclude-standard", "-z"], cwd=ROOT, check=True, + capture_output=True, text=True).stdout.split("\0") + for name in filter(None, files): + if (ROOT / name).is_file(): + target = copy / name + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(ROOT / name, target) + env = os.environ | {"COBBLESURVIVAL_CACHE": str(lock.CACHE)} + if fresh_gradle: + env["GRADLE_USER_HOME"] = str(copy.parent / f"{copy.name}-gradle") + with open(copy.parent / f"{copy.name}.log", "w") as log: + subprocess.run([sys.executable, str(copy / "tools/build.py")], cwd=copy, env=env, stdout=log, stderr=subprocess.STDOUT, check=True) + return dict(reversed(line.split(" ", 1)) for line in (copy / "build/SHA256SUMS").read_text().splitlines()) + + +def entries(path): + with zipfile.ZipFile(path) as z: + return {i.filename: (i.CRC, i.date_time, i.external_attr) for i in z.infolist()} + + +def explain(a, b, name): + if not name.endswith((".jar", ".mrpack", ".zip")): + return + ea, eb = entries(a / name), entries(b / name) + for entry in sorted(ea.keys() | eb.keys()): + if ea.get(entry) != eb.get(entry): + print(f" {entry}: {ea.get(entry)} / {eb.get(entry)}") + if list(ea) != list(eb): + print(" entries are in a different order") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--fresh-gradle", action="store_true", help="give each build its own empty Gradle home") + args = parser.parse_args() + a, b = WORK / "a", WORK / "the/other/b" + first, second = build(a, args.fresh_gradle), build(b, args.fresh_gradle) + different = [name for name in sorted(first.keys() | second.keys()) if first.get(name) != second.get(name)] + for name in sorted(first): + print(f"{'DIFFERENT' if name in different else 'same '} {first[name][:16]} {name}") + for name in different: + print(f" {name}:") + explain(a, b, name) + if different: + sys.exit(f"{len(different)} of {len(first)} outputs differ") + print(f"All {len(first)} outputs are byte-identical.") + + +if __name__ == "__main__": + main() diff --git a/tools/check_server_update.py b/tools/check_server_update.py new file mode 100755 index 0000000..e78c729 --- /dev/null +++ b/tools/check_server_update.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +"""Check on the test server that a balance change goes live with tools/server_update.py alone (Adrian, 2026-11-09): +the server loads the update's data instead of the copy in its jar, `/reload` picks up a changed file while it runs, +and without the update the jar's copy is used again. + +Usage: tools/check_server_update.py (needs eula.txt from tools/selftest.py --accept-eula) +""" +import json +import subprocess +import sys +import time +import zipfile +from io import BytesIO +from pathlib import Path + +from mcserver import ROOT, SERVER, Server, eula_accepted, prepare + +ZIP = SERVER / "config/cobblesurvival/datapack.zip" +TUNING = "data/cobblesurvival/tuning/server.json" +LEVEL = "world-update-check" +FLAT = {"level-name": LEVEL, "level-type": "minecraft:flat", + "generator-settings": '{"layers":[{"block":"minecraft:stone","height":4}],"biome":"minecraft:plains"}'} + + +def expect(line, *parts): + missing = [p for p in parts if p not in line] + if missing: + sys.exit(f"expected {missing} in: {line}") + print(f"ok: {line.strip()}") + + +def set_boss_evs(value): + with zipfile.ZipFile(ZIP) as z: + items = [(i, z.read(i.filename)) for i in z.infolist()] + out = BytesIO() + with zipfile.ZipFile(out, "w", zipfile.ZIP_DEFLATED) as z: + for info, content in items: + if info.filename == TUNING: + content = json.dumps(json.loads(content) | {"boss_evs": value}).encode() + z.writestr(info, content) + part = ZIP.with_name(ZIP.name + ".part") + part.write_bytes(out.getvalue()) + part.replace(ZIP) # as an update does, with the server running + + +def main(): + if not eula_accepted(): + sys.exit("build/server/eula.txt does not accept the Minecraft EULA yet (see tools/selftest.py --accept-eula).") + args_file = prepare() + subprocess.run([sys.executable, str(ROOT / "tools/server_update.py"), "--install", str(SERVER), "--level", LEVEL, "--force"], check=True) + try: + with Server(args_file, FLAT, stdout_name="update-check-stdout.log") as server: + server.wait_ready() + first = server.command("cobblesurvival data") + expect(first, "data server;", "boss_evs 170;") + set_boss_evs(150) + server.command("reload") + for _ in range(60): + time.sleep(2) + line = server.command("cobblesurvival data") + if "boss_evs 150" in line: + break + expect(line, "data server;", "boss_evs 150;") + server.stop() + ZIP.unlink() + with Server(args_file, FLAT, stdout_name="update-check-stdout.log") as server: + server.wait_ready() + expect(server.command("cobblesurvival data"), "data jar;", "boss_evs 170;") + server.stop() + finally: + ZIP.unlink(missing_ok=True) + print("SERVER UPDATE CHECK PASSED") + + +if __name__ == "__main__": + main() diff --git a/tools/client-baseline.json b/tools/client-baseline.json new file mode 100644 index 0000000..34ed1f8 --- /dev/null +++ b/tools/client-baseline.json @@ -0,0 +1,113 @@ +{ + "mod/gradle.properties": "981e881361121f4109d87b3292eadec054fd73945e24249a29134dcc174045c1", + "mod/src/main/java/dev/cobblesurvival/mixin/HardcorePartyMixin.java": "7dc3158882fa6baf04409493505d5e91f56c6e112f69bd9f095772a72b31e6e4", + "mod/src/main/java/dev/cobblesurvival/mixin/RegeneratorBlockMixin.java": "84706a42b2a6d5359993831e17f886680decb76e027c451c64463d009e36acae", + "mod/src/main/kotlin/dev/cobblesurvival/jei/DropSources.kt": "9437c1dac38c1c236067d661379b02b04657cee231ccdf4035183c6639c2e0f9", + "mod/src/main/kotlin/dev/cobblesurvival/jei/DropSourcesJei.kt": "89e7e6dc3b8ef4aac3e095887c63ceb95f3214270e2d91e0322074c09f41ac55", + "mod/src/main/kotlin/dev/cobblesurvival/machine/MachineTooltips.kt": "cadf0f01673700779f0f893986a03d0030ce057084b95fe36aa341a3ed5b326b", + "mod/src/main/kotlin/dev/cobblesurvival/machine/Machines.kt": "9c468e5578aa4d357c8e09c622d22d6f1a69c2dcf065b32baf13ac1c64845225", + "mod/src/main/kotlin/dev/cobblesurvival/summon/Summons.kt": "2df4a11b33a36d63111d2e92595fb01143ae9917dc82ebee5a682d5bdd64727e", + "mod/src/main/kotlin/dev/cobblesurvival/zone/InZoneCondition.kt": "20ab5c4266fc603bc08e66f27dd9685dc96c0d1b2d61b089e6d61960e89a7e7f", + "mod/src/main/resources/META-INF/neoforge.mods.toml": "6c1a320fb16ce37c7dfb9faf0525ec48880f7b4480ce24f30630599846e61730", + "mod/src/main/resources/assets/cobblesurvival/blockstates/altar_core.json": "57b74639738a3576d15063af1848624ec5b031fdc1837033cff0400efcd2f706", + "mod/src/main/resources/assets/cobblesurvival/blockstates/dynamo_core.json": "9aa37f891c2ca32d66be875ac18b9ab2cc58d5c7ed8a043c9f3978892a455588", + "mod/src/main/resources/assets/cobblesurvival/blockstates/heat_core.json": "292a281a1566be3ccf0e296bb5615c821aed154fdfac396f84cef87084fdc80d", + "mod/src/main/resources/assets/cobblesurvival/blockstates/rebirth_core.json": "079141fc87870499fd3ee783b7185cc3aba70101b8431bc17f2dc7d3afcff6af", + "mod/src/main/resources/assets/cobblesurvival/blockstates/synthesis_core.json": "f42e0504367e9cea748fe6f2b470cb42d7c3035239f5e1179dcdafd9eb074612", + "mod/src/main/resources/assets/cobblesurvival/lang/en_us.json": "cddf978aef708e01207414563c30bda7d1c21db38f039804bfbb0ac29953ea8b", + "mod/src/main/resources/assets/cobblesurvival/models/block/altar_core.json": "da7bdfa2847aeda52989f59654d5eca2ae8905083cb434819068dbe91ff14134", + "mod/src/main/resources/assets/cobblesurvival/models/block/altar_core_on.json": "f63d9474e7eb2215d72727bd236ed10e2624e018d9f7d744d8b5ec2791761bfd", + "mod/src/main/resources/assets/cobblesurvival/models/block/dynamo_core.json": "5e54173692d983cede7c3f15f33199e602e431a8d813e020efb44dbff7918c88", + "mod/src/main/resources/assets/cobblesurvival/models/block/dynamo_core_on.json": "5a58d14ffb75656c988ab0f862861c7bf25816099f34fc53c72cfc15d03b29c3", + "mod/src/main/resources/assets/cobblesurvival/models/block/heat_core.json": "b0787387105981ffcd5db139a0396e185e846a366c365cf875dc1b3facea53b5", + "mod/src/main/resources/assets/cobblesurvival/models/block/heat_core_on.json": "c40bf57cee6b7bf94bc5bd60bf00bfc48953aa1b3492b5a324e9c159be2238bc", + "mod/src/main/resources/assets/cobblesurvival/models/block/rebirth_core.json": "e190fd0ead67f4bf812a20e14dcd2d831feffe4fb290142c16a5d5c64e7dd505", + "mod/src/main/resources/assets/cobblesurvival/models/block/rebirth_core_on.json": "d4c96795b8237d70b1e7e9cee7644ea8006a44622d3b6a03eb12d6b9dd317607", + "mod/src/main/resources/assets/cobblesurvival/models/block/synthesis_core.json": "9bf74b06602ed26979fc24bab4cea638f41e62942ed06f22ea1245309ff94632", + "mod/src/main/resources/assets/cobblesurvival/models/block/synthesis_core_on.json": "c93d8f9d0bd7edc8787f27851127e6f901b35781393ddea4630046a1514562a4", + "mod/src/main/resources/assets/cobblesurvival/models/item/altar_core.json": "93e215f9216fa98c40e94e4e43ea6b6a4134330f64463c86269f97527cfe6305", + "mod/src/main/resources/assets/cobblesurvival/models/item/dynamo_core.json": "361f79c2482a693942365018a5c25aa92776a00ce3040d0cf9788ef3f5369f2d", + "mod/src/main/resources/assets/cobblesurvival/models/item/heat_core.json": "95501c83502ad086d65b8e2c8cd92f291af86cb1cd9d472c924c532bed935b0a", + "mod/src/main/resources/assets/cobblesurvival/models/item/rebirth_core.json": "fc7b8a1c542443cf4cc8865245f18bceaa9b5600d159cc5a1b52f8b583331f5b", + "mod/src/main/resources/assets/cobblesurvival/models/item/summon_sigil.json": "49030496139683753061379efc58921f22c4a0aa6c83bb63a076dd5a66025328", + "mod/src/main/resources/assets/cobblesurvival/models/item/synthesis_core.json": "561a5991627f1191b3f3dc4bfb8bc6a87476ecb620ba17b212fdd89245713232", + "mod/src/main/resources/assets/cobblesurvival/textures/block/altar_core_front.png": "a16647d24710eee6bf68d06ea4a1259dc5bbb8fd3fb1dc9d3f3f43258997caa5", + "mod/src/main/resources/assets/cobblesurvival/textures/block/altar_core_front_on.png": "463556ab8451cc5dc320772c192821ff6f35784e2b9f78720baddd6256602808", + "mod/src/main/resources/assets/cobblesurvival/textures/block/altar_core_front_on.png.mcmeta": "eff55807164fe4f0db2f60ab8a75f03b75489abb0a3c89598e84a65db429ddb3", + "mod/src/main/resources/assets/cobblesurvival/textures/block/altar_core_side.png": "7e551e598fcec62ed041076d13f792b05d01f7e6c64998cd5e36e9957bf6b1cb", + "mod/src/main/resources/assets/cobblesurvival/textures/block/altar_core_top.png": "b78f1ac851f903c73a20cac25a566b973f3984e9c4a06c16d4eaf0545722f9a7", + "mod/src/main/resources/assets/cobblesurvival/textures/block/dynamo_core_front.png": "0dbd458fa47da1531ddd182c11d7cc4c0a077267fa9d89637fa63dc5a6aaa608", + "mod/src/main/resources/assets/cobblesurvival/textures/block/dynamo_core_front_on.png": "e6ad3abce9474434577f132ad80a15cbe162ed151c663cc92244ab66ae8d5d7c", + "mod/src/main/resources/assets/cobblesurvival/textures/block/dynamo_core_front_on.png.mcmeta": "eff55807164fe4f0db2f60ab8a75f03b75489abb0a3c89598e84a65db429ddb3", + "mod/src/main/resources/assets/cobblesurvival/textures/block/dynamo_core_side.png": "8eeaa40b87fe284f13a7d58c0b7cbf2dd1d77c2276300ff549413c12be715690", + "mod/src/main/resources/assets/cobblesurvival/textures/block/dynamo_core_top.png": "e94049677a8136d3c8597cb4aeea856521cb8c7fd5793ef9c156d220a5df6603", + "mod/src/main/resources/assets/cobblesurvival/textures/block/heat_core_front.png": "38e46b92c05861468adc8c100fc788525c4e3d6ee3dd200660e8a1cff1c12203", + "mod/src/main/resources/assets/cobblesurvival/textures/block/heat_core_front_on.png": "404b331722df27013507b825b97306af1d2947c5aee6e9716bc86b8e70c4c26a", + "mod/src/main/resources/assets/cobblesurvival/textures/block/heat_core_front_on.png.mcmeta": "eff55807164fe4f0db2f60ab8a75f03b75489abb0a3c89598e84a65db429ddb3", + "mod/src/main/resources/assets/cobblesurvival/textures/block/heat_core_side.png": "6ce92e298906d3992aeda8f71b65b5c9aa82137698933af5f8a6da5a387aebb2", + "mod/src/main/resources/assets/cobblesurvival/textures/block/heat_core_top.png": "a277c1a81d7e471c1f9a6c97a6c462589f888e9797816444f08667c261812346", + "mod/src/main/resources/assets/cobblesurvival/textures/block/rebirth_core_front.png": "3a4feebf9cb51b287bdedfa81ad3aa623b249e27f6f390ff30ced0fbf781312c", + "mod/src/main/resources/assets/cobblesurvival/textures/block/rebirth_core_front_on.png": "67a87560d9b0476b8208934dc8e16dff4ea39c656817309c0e8564cf1d7c722c", + "mod/src/main/resources/assets/cobblesurvival/textures/block/rebirth_core_front_on.png.mcmeta": "eff55807164fe4f0db2f60ab8a75f03b75489abb0a3c89598e84a65db429ddb3", + "mod/src/main/resources/assets/cobblesurvival/textures/block/rebirth_core_side.png": "aa851a2b6775849c752eaa40e01c31bf8c7b6c311b828256d5702b895bc6fada", + "mod/src/main/resources/assets/cobblesurvival/textures/block/rebirth_core_top.png": "539826b19c9a9aa7c5833f94817b7f905a6cf04f1c93d63d3c591b9c0d773a5a", + "mod/src/main/resources/assets/cobblesurvival/textures/block/synthesis_core_front.png": "c58583bab198bf38fa1f2e7fd785c247be9e709cf0d72cf5d9a0af38e3e03e1f", + "mod/src/main/resources/assets/cobblesurvival/textures/block/synthesis_core_front_on.png": "185cba132cdb71c29300fd87ae433027dc8dddb5910a38372c173c5a636e0864", + "mod/src/main/resources/assets/cobblesurvival/textures/block/synthesis_core_front_on.png.mcmeta": "eff55807164fe4f0db2f60ab8a75f03b75489abb0a3c89598e84a65db429ddb3", + "mod/src/main/resources/assets/cobblesurvival/textures/block/synthesis_core_side.png": "b7d289800824b16a0e1a961c042b40d688ae33d64bc5c7081d16d3d2d3a0825f", + "mod/src/main/resources/assets/cobblesurvival/textures/block/synthesis_core_top.png": "fd1ee6c550f0a7fe7ea97022b32a046ad69563727dc05e31aa339c9b8647aa64", + "mod/src/main/resources/assets/cobblesurvival/textures/item/summon_sigil.png": "8b7e9bea51f529c250f03fcd8816aadf1e6b9cf4a53a439c16650b6767c71f56", + "mod/src/main/resources/cobblesurvival.mixins.json": "aae2a4db2673be681e3b8389682a89b79a60462a3e157ab11e1dd70b48e79f95", + "pack/config/defaultoptions/extra/config/iris.properties": "3866233ba2035bd6ffe6e06cf74c7b1f16869184c274276ca0bd546f1e8bf003", + "pack/config/defaultoptions/keybindings.txt": "515362c7a71b203b8ba3ea9d125c6b8cafc2abdb480df5936b9af6a3632d865b", + "pack/config/xaero/minimap/default_radar_categories_client.json": "e0a234797b1063dd91a6fec8ebdd3828b93dc39ee4c134d11175aa6d1f26fc20", + "pack/kubejs/assets/cobblesurvival/textures/item/mire_waders.png": "37f7469789d281cbd2ab40f483914eec29f5c82e2c3575854cd276f3296ebb24", + "pack/kubejs/assets/cobblesurvival/textures/item/revival_charm.png": "084c0a7b17bb429c317843a7c45096dc8cb1ab61c748293475c1f3d6a5984086", + "pack/kubejs/assets/regenerating_ore_veins/models/block/regenerator_block.json": "1ae6a922c225ec2e41778055975fb1b2f2fe1d72e6fa150c07a282743dd7531d", + "pack/kubejs/assets/regenerating_ore_veins/textures/block/regenerator_glass.png": "a92836513b16f1d5b872c8a3f888c5f340762bb2a9a3d54b56d5ef2a3fe44426", + "pack/kubejs/startup_scripts/mire_waders.js": "946be2db734646167fe55ba83b57c6f310ba40313a18a959b84c0952e2302112", + "pack/kubejs/startup_scripts/revival_charm.js": "a93eb4401ca303c9aab15ef8cd1edcb34cc7242cbb3501e6703f32e9b3f57e2b", + "pack/mods/appleskin.pw.toml": "7e4f29bab7da458bdc022467188b586aa92b4dec60660342df9d9829d129a0c4", + "pack/mods/architectury-api.pw.toml": "e8f28975e00df5584ba171e81252c4f3fd3955225a46ae14bb9d5ca43dfb22b8", + "pack/mods/balm.pw.toml": "603cdc47142b5aa5729cbbf265a473574c9e2b55561de4318e9842d3d4b3b995", + "pack/mods/cloth-config.pw.toml": "66b2e57fad1d958893206d82ff878159b7fdfef64ccb74fe1232b71012409953", + "pack/mods/cobblebase.pw.toml": "d5f55b1134cd34a2dead81b3790a2e7104cb05dd1f3936abff6188b55297ef7b", + "pack/mods/cobbledex-rei-emi-jei.pw.toml": "45c76954469169c0bf17f7fdbd418c4e90c8362818dfdbd4ea65c661bb61a971", + "pack/mods/cobblehardcoremon.pw.toml": "1ec1dbf7caf20e38c7fe0ffa8ac8697f8dbfe431a31683119f43b81d27c6b41a", + "pack/mods/cobblemon-fight-or-flight-reborn.pw.toml": "227eea45819938ae2e0911d825e9ccf0e0236b1a36e46627204d8aa53becc9e7", + "pack/mods/cobblemon-hms.pw.toml": "6f4a03d49d8a3df16414a00b3c4feb1a859ef6d1ab024a31b734c3829cbcda5b", + "pack/mods/cobblemon-poke-power.pw.toml": "29ccd4c39e5af1a2fb63a40bf67ecd03bcced42e9e1edf296b26fd1847740a54", + "pack/mods/cobblemon-quest-reloaded.pw.toml": "fed165481433c2dc8c0c9af939957e9b9852883c1307ca3aef9e1c4e6faf14b4", + "pack/mods/cobblemon.pw.toml": "e6bed1ffe881690add7bc456fd8a71c136b01ea4f39683648ae7b0e404329d83", + "pack/mods/cobblemon_tp_pastures.pw.toml": "2cb849c31c6c51e394b254850243112c6a1a93a3b3534de1ebb9add05a90dd2d", + "pack/mods/cobbreeding.pw.toml": "aa8f86c0deec2e5ff6a20360be15748c5281faaa0acf45f15044eff42f182ad9", + "pack/mods/cold-sweat.pw.toml": "96b2b071c1669e5f71237adc77d9474d0dc5544509cebc0b242478e40915a4d4", + "pack/mods/controlling.pw.toml": "2a1c6846800a0302a133e77e454888f86302a60bbfbcc9aafc462dc9260cd847", + "pack/mods/default-options.pw.toml": "b3b7c128653cb40352af979f54e1865cecf050e58f47573381e6dc0214405ae1", + "pack/mods/entityculling.pw.toml": "426238488c9ffd843f661f8bc74aa8e585fa6b4d342c43c4ba4cb8451298b725", + "pack/mods/ferrite-core.pw.toml": "73360e397134d238ee8fd21d33fd7f9275e9441f74f8f1b6ed92278877c0b9f1", + "pack/mods/ftb-library-forge.pw.toml": "df64ca595f6f0f79e3a4a844fd0a887b44f5e007f5deb9ac011b5cf67b3a2127", + "pack/mods/ftb-quests-forge.pw.toml": "45d3bc7051ed6546e492e5be236f0271031dd0e45328cf8eecbb035d521e345c", + "pack/mods/ftb-teams-forge.pw.toml": "c21c2308684a75cda7dd9d557d129c9f89f49be527da3d5aa675fff444c11f5e", + "pack/mods/immediatelyfast.pw.toml": "b399e5e2392f947d59e68c944c7e48d8a5cc2c06db900dce582aa0c48cd46abc", + "pack/mods/inventory-profiles-next.pw.toml": "ab503e89461dff879ee793253e173625b6ab868f570a371323ef725e567cf5ea", + "pack/mods/iris.pw.toml": "db1c1e6382878b78e994dba1b9026935f8d1c5ca685c89d2437858e0a0dcab58", + "pack/mods/jade.pw.toml": "f26cc6ba7ab8da7e027f2466e2e16c61cb8e2e3e640523d20c23257de927e772", + "pack/mods/jei.pw.toml": "e7d8e13fb4e1bfe1c0cf18fedfea14cb2027a635c9f5812c4eb6bccb221c21c3", + "pack/mods/kotlin-for-forge.pw.toml": "f0875fb7da8a6ce7f4fa69ef1ac015e79c723ae69ac227942df8b3997af7a381", + "pack/mods/kubejs.pw.toml": "d18969eaa4eaa509816b272489f4621f625000c44370a58f428788c324510d20", + "pack/mods/libipn.pw.toml": "0d2a00252d64ed7d2d9b19994f7accb780304be61f3903d36e810714b414c6cb", + "pack/mods/lootr.pw.toml": "6353e846dff3e2899ddce9459d276b09610aa406755ea27c8af3a674b2c86e2f", + "pack/mods/matthiesen-core.pw.toml": "863ac987299be54dd902b4db055b1f52823d2c852c7086183adf71cf6f2eeda1", + "pack/mods/mezzconfig.pw.toml": "af54d9d538d47d23cbceecfbd74c13f3b214a4fca7e8177c307fc5d04af53e39", + "pack/mods/modernfix.pw.toml": "c285056590179db67fd1a37256048a6e1b9b408cdcab3f3b3bb203095d79ca81", + "pack/mods/mouse-tweaks.pw.toml": "39cee4df36d04a7530cde51b55154f76fb8954341728be08c3b2ee24b07ed742", + "pack/mods/regenerating-ore-veins.pw.toml": "e3be05bd89ad1091014025fe45abd2dcb4318930486597ee3daf02d9eb30648d", + "pack/mods/rhino.pw.toml": "8be16680efb71ff64ebd5881943d58f7ef6ce36a95c7a4a856d7dc62b82231ef", + "pack/mods/searchables.pw.toml": "0474af66efaf73fd9103e38bd639e547e2928d29ae3ea95c321c9eb1a1c91734", + "pack/mods/sodium.pw.toml": "85b08670f3768dbb22477f04339fdda9907769bc1c875cc45352f82c4dece324", + "pack/mods/worldgen-editor.pw.toml": "311a5bebcb7bd0b2b98cc6c4a8c344befaa69d0c958c3bf2ce8048f0b958faf1", + "pack/mods/xaeros-minimap.pw.toml": "41d879f70cc4d6aead3db959865bd69ead6a3fd8be4ae3aed33963a98f3172e4", + "pack/mods/xaeros-world-map.pw.toml": "d90210a531e4c53f9698399bd1d5e733657b5e1eefa236269a4f77962e4c74db", + "pack/shaderpacks/complementary-reimagined.pw.toml": "75d1d2488a0c332a9a58af7e57f980a1b006c02b3a1c580fbd50443088e4eab0" +} diff --git a/tools/cobblebase_loot.py b/tools/cobblebase_loot.py index b5248fd..e52bbea 100755 --- a/tools/cobblebase_loot.py +++ b/tools/cobblebase_loot.py @@ -19,6 +19,8 @@ import sys import zipfile from pathlib import Path +import lock + ROOT = Path(__file__).resolve().parent.parent OUT = ROOT / "datapacks/core/data/cobblebase/loot_table" CONDITION = "cobblesurvival:in_zone" @@ -48,10 +50,7 @@ FAMILIES = { def cobblebase_jar(): - jars = sorted((ROOT / "build/server/mods").glob("cobblebase-*.jar")) - if not jars: - sys.exit("no Cobblebase jar in build/server/mods: run tools/build.py and tools/selftest.py (or the quick check) first") - return jars[-1] + return lock.mod_jar("cobblebase") def zone_items(): diff --git a/tools/jei_sources.py b/tools/jei_sources.py index c092f1c..80be371 100644 --- a/tools/jei_sources.py +++ b/tools/jei_sources.py @@ -3,8 +3,8 @@ a JEI page naming its sources; 2026-11-03: alongside the Cobblemon Info add-on, which shows spawns and drops but not the island's zones). -JEI runs on the client, which on a dedicated server doesn't have the pack's server data, so the pages are built from -this file inside the companion mod: mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json. It holds: +JEI runs on the client, which on a dedicated server doesn't have the pack's server data, so the server sends each player +this file (dev.cobblesurvival.jei.DropSources): datapacks/core/data/cobblesurvival/drop_sources/pages.json. It holds: pokemon every species of a line that lives on the island: its drops (as the Drop Synthesizer rolls them) and the zones it spawns in, or the zones where its line lives @@ -18,9 +18,8 @@ this file inside the companion mod: mod/src/main/resources/assets/cobblesurvival pasture_finds per Cobblebase skill and zone, what a pasture's Pokémon can find (the pack's zone-bound tables) The self-test drop_sources_match_the_server compares it with the live server, so run this after changing species -drops, spawns, guardians, the End boss, the altar, ore veins or Cobblebase's tables, then rebuild the mod. - -Needs the Cobblemon jar in build/server/mods (any test-server run). +drops, spawns, guardians, the End boss, the altar, ore veins or Cobblebase's tables (tools/build.py and +tools/server_update.py run it). Usage: tools/jei_sources.py """ @@ -30,21 +29,86 @@ import zipfile from collections import defaultdict from pathlib import Path +import lock + ROOT = Path(__file__).resolve().parent.parent DATA = ROOT / "datapacks/core/data" -OUT = ROOT / "mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json" +OUT = DATA / "cobblesurvival/drop_sources/pages.json" SKILLS = {"mining": "mining", "finder_ore": "ore_finder", "finder_evo": "evolution_item_finder"} +def amount_range(drops): + a, _, b = str(drops.get("amount", 1)).partition("-") + return range(int(a), int(b or a) + 1) + + +def yield_chance(entry): + """The chance a picked entry gives at least one item: a count of 0 gives nothing.""" + low, _, high = str(entry.get("quantityRange", entry.get("quantity", 1))).partition("-") + low, high = int(low), int(high or low) + return 1.0 if low > 0 else high / (high + 1) + + +def selection_odds(entries, chosen): + """{item: the chance one drop roll for [chosen] picks gives at least one}, as DropTable.getDrops works: in table + order, the first entry that passes its percentage is picked; a round with none uses up a pick. A table can list + one item twice (Snorlax's apples), so this follows items, not entries.""" + percent = [float(e.get("percentage", 100)) / 100 for e in entries] + quantity = [int(e.get("quantity", 1)) for e in entries] + limit = [int(e.get("maxSelectableTimes", 1)) for e in entries] + start = (tuple(i for i in range(len(entries)) if quantity[i] <= chosen), 0, tuple(0 for _ in entries), frozenset()) + states, odds = {start: 1.0}, defaultdict(float) + while states: + following = defaultdict(float) + def advance(possible, count, times, have, p): + if count < chosen and possible: + following[(possible, count, times, have)] += p + for (possible, count, times, have), p in states.items(): + miss = 1.0 + for i in possible: + hit = miss * percent[i] + miss *= 1 - percent[i] + if hit <= 0: + continue + now = count + quantity[i] + picked = times[:i] + (times[i] + 1,) + times[i + 1:] + left = tuple(j for j in possible if not (j == i and picked[j] >= limit[j]) and quantity[j] <= chosen - now) + item, gives = entries[i].get("item"), yield_chance(entries[i]) + if item is None or item in have: + advance(left, now, picked, have, p * hit) + continue + odds[item] += p * hit * gives + advance(left, now, picked, have | {item}, p * hit * gives) + if gives < 1: + advance(left, now, picked, have, p * hit * (1 - gives)) + if miss > 0: + advance(possible, count + 1, times, have, p * miss) + states = following + return odds + + def drop_entries(drops): - """Cobblemon drop table → [{item, chance (percent, absent = always), count ("a-b")}].""" + """Cobblemon drop table → [{item, chance (percent that a roll gives at least one, absent = always), count ("a-b")}].""" + drops = drops or {} + entries = drops.get("entries", []) + picks = amount_range(drops) + odds = defaultdict(float) + if entries: + for chosen in picks: + for item, chance in selection_odds(entries, chosen).items(): + odds[item] += chance / len(picks) + counts = {} + for e in entries: + if "item" in e: + low, _, high = str(e.get("quantityRange", e.get("quantity", 1))).partition("-") + low, high = max(int(low), 1), int(high or low) + a, b = counts.get(e["item"], (low, high)) + counts[e["item"]] = (min(a, low), max(b, high)) out = [] - for e in (drops or {}).get("entries", []): - if "item" not in e: - continue - entry = {"item": e["item"], "count": str(e.get("quantityRange", e.get("quantity", 1)))} - if "percentage" in e and float(e["percentage"]) < 100: - entry["chance"] = float(e["percentage"]) + for item, (low, high) in counts.items(): + entry = {"item": item, "count": str(low) if low == high else f"{low}-{high}"} + if odds[item] < 0.9995: + entry["chance"] = round(odds[item] * 100, 1) out.append(entry) return out @@ -79,8 +143,7 @@ def root_of(sid, species): def main(): - jar = next((ROOT / "build/server/mods").glob("Cobblemon-*.jar")) - species = species_data(jar) + species = species_data(lock.mod_jar("cobblemon")) plan = json.loads((ROOT / "world/zones.json").read_text()) zones = {z["id"]: z for z in plan["zones"] + plan["caves"] + plan.get("dimensions", [])} @@ -107,8 +170,13 @@ def main(): line_zones[root_of(sid, species)].setdefault(zid, sid) table = json.loads((ROOT / "world/summons.json").read_text()) - summoned = {f"cobblemon:{k}": {"zone": v["zone"], "level": table["tiers"][str(v["tier"])]["level"]} for k, v in table["summons"].items()} - summons = [{"species": sid, "name": species[sid]["name"], **s} for sid, s in summoned.items()] + level_of = lambda v: table["tiers"][str(v["tier"])]["level"] + summoned = {f"cobblemon:{k}": {"zone": v["zone"], "level": level_of(v)} for k, v in table["summons"].items() if "form" not in v} + def sigil(key, v): + base = f"cobblemon:{v.get('species', key)}" + name = f"{v['form'].title()} {species[base]['name']}" if "form" in v else species[base]["name"] + return {"species": f"cobblemon:{key}", "pokemon": base, "name": name, "zone": v["zone"], "level": level_of(v)} + summons = [sigil(k, v) for k, v in table["summons"].items()] pokemon = [] for sid, s in sorted(species.items()): @@ -163,9 +231,9 @@ def main(): for (skill, zid), items in sorted(finds.items(), key=lambda kv: (kv[0][0], kv[0][1] != "*", kv[0][1]))] data = { - "_comment": "Generated by tools/jei_sources.py from the pack's data; do not edit by hand. Read by the companion " - "mod's JEI plugin (jei/DropSourcesJei.kt); checked against the live server by the self-test " - "drop_sources_match_the_server.", + "_comment": "Generated by tools/jei_sources.py from the pack's data; do not edit by hand. The server sends it to " + "players for the companion mod's JEI pages (jei/DropSources.kt); checked against the live server by the " + "self-test drop_sources_match_the_server.", "zones": {zid: {"name": z["name"], "levels": z["levels"]} for zid, z in zones.items()}, "pokemon": pokemon, "summons": summons, "spawn_drops": spawn_drops, "guardians": guardians, "end_boss": end_boss, "altar": {"tiers": altar["tiers"], "specials": altar.get("specials", [])}, "rebirth": rebirth.get("extra", []), diff --git a/tools/lock.py b/tools/lock.py new file mode 100644 index 0000000..3062da4 --- /dev/null +++ b/tools/lock.py @@ -0,0 +1,103 @@ +"""The build's pinned tools (tools/build-lock.toml, tools/requirements.txt) and the environment it runs in. + +Each tool is downloaded once into build/.cache and checked against its hash, so what a build runs depends on the +repo, not on what the machine has installed. COBBLESURVIVAL_CACHE moves the cache (tools/check_reproducible.py shares +one between its builds: everything in it is checked by hash, so it can't change their result). +""" +import hashlib +import os +import platform +import shutil +import subprocess +import sys +import tarfile +import tomllib +import urllib.request +import venv +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +LOCK = tomllib.loads((ROOT / "tools/build-lock.toml").read_text()) +CACHE = Path(os.environ.get("COBBLESURVIVAL_CACHE", ROOT / "build/.cache")) +# Nothing the build writes may depend on the machine's clock zone, language or Python's per-run hash seed. +BUILD_ENV = {"TZ": "UTC", "LC_ALL": "C.UTF-8", "PYTHONHASHSEED": "0", "PYTHONUTF8": "1"} + + +def digest(path, algorithm="sha256"): + return hashlib.new(algorithm, Path(path).read_bytes()).hexdigest() + + +def fetch(url, dest, expected, algorithm="sha256"): + """[dest], downloaded from [url] if it isn't there yet; exits if the file is not the one pinned.""" + if dest.exists() and digest(dest, algorithm) == expected: + return dest + dest.parent.mkdir(parents=True, exist_ok=True) + part = dest.with_name(dest.name + ".part") + request = urllib.request.Request(url, headers={"User-Agent": "cobblemon-survival-pack build"}) + with urllib.request.urlopen(request, timeout=300) as response, open(part, "wb") as out: + shutil.copyfileobj(response, out) + if digest(part, algorithm) != expected: + part.unlink() + sys.exit(f"{url} does not match the pinned {algorithm} {expected}") + part.replace(dest) + return dest + + +def download(name): + """A file listed under [downloads] in tools/build-lock.toml.""" + entry = LOCK["downloads"][name] + return fetch(entry["url"], CACHE / name, entry["sha256"]) + + +def mod_jar(slug): + """A mod's jar as pack/mods/.pw.toml pins it, for the tools that read a mod's own data.""" + meta = tomllib.loads((ROOT / f"pack/mods/{slug}.pw.toml").read_text()) + file = meta["download"] + return fetch(file["url"], CACHE / "mods" / meta["filename"], file["hash"], file["hash-format"]) + + +def jdk(): + """The pinned JDK's home, the only one Gradle gets to compile with.""" + pin = LOCK["jdk"] + here = f"{platform.system().lower()}-{platform.machine()}" + if here != pin["platform"]: + sys.exit(f"tools/build-lock.toml pins a JDK for {pin['platform']}, this machine is {here}") + home = CACHE / f"jdk-{pin['version']}" + if not (home / "bin/javac").exists(): + archive = fetch(pin["url"], CACHE / f"jdk-{pin['version']}.tar.gz", pin["sha256"]) + unpacking = home.with_name(home.name + ".part") + shutil.rmtree(unpacking, ignore_errors=True) + unpacking.mkdir(parents=True) + with tarfile.open(archive) as tar: + tar.extractall(unpacking, filter="tar") + shutil.rmtree(home, ignore_errors=True) + next(unpacking.iterdir()).rename(home) + unpacking.rmdir() + return home + + +def packwiz(): + """The pinned packwiz, built from its pinned commit with the pinned Go.""" + pin = LOCK["packwiz"] + binary = CACHE / f"packwiz-{pin['version']}" / "packwiz" + if not binary.exists(): + if not shutil.which("go"): + sys.exit("building the pinned packwiz needs Go (https://go.dev/dl/)") + env = os.environ | {"GOBIN": str(binary.parent), "GOTOOLCHAIN": pin["go"], "GOFLAGS": "-trimpath"} + subprocess.run(["go", "install", f"{pin['module']}@{pin['version']}"], env=env, check=True) + return binary + + +def enter_venv(): + """Re-runs the calling script in a private venv with exactly tools/requirements.txt and the build's environment.""" + requirements = ROOT / "tools/requirements.txt" + home = CACHE / f"venv-{digest(requirements)[:12]}" + if Path(sys.prefix) == home and all(os.environ.get(k) == v for k, v in BUILD_ENV.items()): + return + if f"{sys.version_info[0]}.{sys.version_info[1]}" != LOCK["python"]: + print(f"warning: tools/build-lock.toml pins Python {LOCK['python']}, this is {sys.version.split()[0]}", file=sys.stderr) + python = home / "bin/python" + if not python.exists(): + venv.create(home, with_pip=True) + subprocess.run([python, "-m", "pip", "install", "--quiet", "--require-hashes", "-r", requirements], check=True) + os.execve(python, [str(python), sys.argv[0], *sys.argv[1:]], os.environ | BUILD_ENV) diff --git a/tools/mcserver.py b/tools/mcserver.py index 9b70081..51225f2 100644 --- a/tools/mcserver.py +++ b/tools/mcserver.py @@ -15,6 +15,7 @@ import tomllib import urllib.request from pathlib import Path +import lock from packwiz_sync import java, sync ROOT = Path(__file__).resolve().parent.parent @@ -82,8 +83,7 @@ def prepare(): SERVER.mkdir(parents=True, exist_ok=True) args_file = SERVER / "libraries/net/neoforged/neoforge" / version / "unix_args.txt" if not args_file.exists(): - installer = download(f"https://maven.neoforged.net/releases/net/neoforged/neoforge/{version}/" - f"neoforge-{version}-installer.jar", CACHE / f"neoforge-{version}-installer.jar") + installer = lock.download(f"neoforge-{version}-installer.jar") subprocess.run([java(), "-jar", str(installer), "--install-server", str(SERVER)], cwd=SERVER, check=True, stdout=subprocess.DEVNULL) sync("server", SERVER, BUILD / "stage" / "full") diff --git a/tools/packwiz_sync.py b/tools/packwiz_sync.py index c086c29..a517dd0 100644 --- a/tools/packwiz_sync.py +++ b/tools/packwiz_sync.py @@ -14,27 +14,11 @@ import shutil import subprocess import sys import threading -import urllib.request from pathlib import Path +import lock + ROOT = Path(__file__).resolve().parent.parent -CACHE = ROOT / "build" / ".cache" -# Pinned; the bootstrap runs with --bootstrap-no-update so neither self-updates. -TOOLS = { - "packwiz-installer-0.5.14.jar": - "https://github.com/packwiz/packwiz-installer/releases/download/v0.5.14/packwiz-installer.jar", - "packwiz-installer-bootstrap-0.0.3.jar": - "https://github.com/packwiz/packwiz-installer-bootstrap/releases/download/v0.0.3/packwiz-installer-bootstrap.jar", -} - - -def cached(name): - jar = CACHE / name - if not jar.exists(): - CACHE.mkdir(parents=True, exist_ok=True) - with urllib.request.urlopen(TOOLS[name], timeout=120) as r, open(jar, "wb") as f: - shutil.copyfileobj(r, f) - return jar def java(): @@ -56,9 +40,9 @@ def sync(side, target, pack_dir): threading.Thread(target=server.serve_forever, daemon=True).start() try: url = f"http://127.0.0.1:{server.server_port}/pack.toml" - subprocess.run([java(), "-jar", str(cached("packwiz-installer-bootstrap-0.0.3.jar")), + subprocess.run([java(), "-jar", str(lock.download("packwiz-installer-bootstrap-0.0.3.jar")), "--bootstrap-no-update", - "--bootstrap-main-jar", str(cached("packwiz-installer-0.5.14.jar")), + "--bootstrap-main-jar", str(lock.download("packwiz-installer-0.5.14.jar")), "-g", "-s", side, url], cwd=target, check=True) finally: diff --git a/tools/perf_test.py b/tools/perf_test.py new file mode 100755 index 0000000..0c004bc --- /dev/null +++ b/tools/perf_test.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python3 +"""Measure the server under a realistic load with spark (roadmap Phase 9). + +Boots the test server on the island world template once per scenario, adds the fake players and bases of +`/cobblesurvival perf` (mod: selftest/PerfLoad.kt), lets things settle and records every tick, while spark profiles the +server thread. Writes build/perf/.json and .sparkprofile (open that in spark's viewer if you want to look closer) and docs/performance.md. + +What it can't show: fake clients send no packets and encode none, so network cost is left out, and no battles are fought. + +Usage: tools/perf_test.py [--scenarios solo group stress] [--settle 120] [--measure 180] [--no-doc] +""" +import argparse +import gzip +import json +import re +import shutil +import sys +import time +from collections import defaultdict +from pathlib import Path + +from mcserver import BUILD, ROOT, SELFTEST_JVM_ARGS, SERVER, Server, eula_accepted, prepare, scan_log + +TEMPLATE = BUILD / "world-template" +OUT = BUILD / "perf" +# players, pastures each, Pokémon per pasture, machines each +SCENARIOS = {"solo": (1, 0, 0, 0), "group": (5, 4, 8, 5), "stress": (8, 6, 16, 10)} +HEAP = "6G" + + +def fields(buf): + """Protobuf wire format: (field number, wire type, value).""" + i, n = 0, len(buf) + + def varint(): + nonlocal i + shift = result = 0 + while True: + b = buf[i] + i += 1 + result |= (b & 0x7f) << shift + if not b & 0x80: + return result + shift += 7 + + while i < n: + key = varint() + number, wire = key >> 3, key & 7 + if wire == 0: + yield number, wire, varint() + elif wire == 1: + yield number, wire, buf[i:i + 8] + i += 8 + elif wire == 2: + length = varint() + yield number, wire, buf[i:i + length] + i += length + elif wire == 5: + yield number, wire, buf[i:i + 4] + i += 4 + else: + raise ValueError(f"wire type {wire}") + + +def doubles(value): + import struct + return struct.unpack(f"<{len(value) // 8}d", value) + + +def varints(value): + return [v for v in iter_varints(value)] + + +def iter_varints(value): + i, n = 0, len(value) + while i < n: + shift = result = 0 + while True: + b = value[i] + i += 1 + result |= (b & 0x7f) << shift + if not b & 0x80: + break + shift += 7 + yield result + + +def read_profile(path): + """spark's sampler data: {class.method: self ms}, inclusive per method, total ms of the server thread.""" + raw = path.read_bytes() + if raw[:2] == b"\x1f\x8b": + raw = gzip.decompress(raw) + nodes, roots = [], [] + for number, _, value in fields(raw): + if number != 2: + continue + flat, children, time_ms = [], [], 0.0 + for n, _, v in fields(value): + if n == 3: # children: every stack frame, flattened + node = {"class": "", "method": "", "time": 0.0, "kids": []} + for fn, wire, fv in fields(v): + if fn == 3: + node["class"] = fv.decode() + elif fn == 4: + node["method"] = fv.decode() + elif fn == 8: + node["time"] += sum(doubles(fv)) if wire == 2 else doubles(fv)[0] + elif fn == 9: + node["kids"] += varints(fv) if wire == 2 else [fv] + flat.append(node) + elif n == 4: + time_ms += sum(doubles(v)) + elif n == 5: + children += varints(v) + nodes.append(flat) + roots.append((time_ms, children)) + self_ms, inclusive = defaultdict(float), defaultdict(float) + total = 0.0 + for flat, (time_ms, children) in zip(nodes, roots): + total += time_ms + def walk(index, path_seen): + node = flat[index] + name = f"{node['class']}.{node['method']}" + self_ms[name] += node["time"] - sum(flat[k]["time"] for k in node["kids"]) + fresh = name not in path_seen + if fresh: + inclusive[name] += node["time"] + path_seen.add(name) + for k in node["kids"]: + walk(k, path_seen) + if fresh: + path_seen.discard(name) + sys.setrecursionlimit(20000) + for c in children: + walk(c, set()) + return self_ms, inclusive, total + + +def group_of(name): + if name.startswith("libc.so") or ".park" in name or "waitUntilNextTick" in name or "managedBlock" in name: + return "Waiting for the next tick" + if name.startswith("dev.cobblesurvival"): + return "Companion mod" + if name.startswith(("com.cobblemon", "com.cobbledex")): + return "Cobblemon" + if name.startswith(("net.minecraft", "com.mojang", "it.unimi")): + return "Minecraft" + if name.startswith(("java.", "jdk.", "sun.", "kotlin.")): + return "JVM and Kotlin" + return "Other mods" + + +def summarise(profile): + self_ms, inclusive, total = read_profile(profile) + groups = defaultdict(float) + for name, ms in self_ms.items(): + groups[group_of(name)] += ms + pick = lambda prefix: sorted(((n, ms) for n, ms in inclusive.items() if n.startswith(prefix)), key=lambda kv: -kv[1])[:8] + return {"total_ms": total, "groups": dict(sorted(groups.items(), key=lambda kv: -kv[1])), + "companion_top": pick("dev.cobblesurvival"), "cobblemon_top": pick("com.cobblemon"), + "self_top": sorted(self_ms.items(), key=lambda kv: -kv[1])[:10]} + + +def parse_report(line): + return {k: float(v) for k, v in re.findall(r"(\w+)=([\d.]+)", line)} + + +def run(name, config, args_file, recipe, settle, measure): + players, pastures, pokemon, machines = config + world = SERVER / "world" + shutil.rmtree(world, ignore_errors=True) + shutil.copytree(TEMPLATE, world) + for old in SERVER.glob("config/spark/**/*.sparkprofile"): + old.unlink() + with Server(args_file, {"level-type": recipe["level_type"], "level-seed": recipe["seed"]}, heap=HEAP, + stdout_name=f"perf-{name}-stdout.log", jvm_args=SELFTEST_JVM_ARGS) as server: + boot = server.wait_ready() + print(f"[{name}] booted in {boot:.0f}s: {server.command(f'cobblesurvival perf start {players} {pastures} {pokemon} {machines}').strip()}", flush=True) + time.sleep(settle) + server.command("cobblesurvival perf measure") + print(f"[{name}] {server.command(f'spark profiler start --timeout {measure} --save-to-file').strip()[:120]}", flush=True) + time.sleep(measure + 15) + report = server.command("cobblesurvival perf report").strip() + tps = re.sub(r"§.", "", server.command("spark tps")) + health = re.sub(r"§.", "", server.command("spark health")) + print(f"[{name}] {report}", flush=True) + for _ in range(30): + profiles = sorted(SERVER.glob("config/spark/**/*.sparkprofile")) + if profiles: + break + time.sleep(2) + server.stop() + errors = [line[:200] for line in scan_log(server.log)][:30] + result = {"scenario": name, "players": players, "pastures_each": pastures, "pokemon_each": pokemon, "machines_each": machines, + "heap": HEAP, "report": parse_report(report), "raw_report": report, "tps": tps, "health": health, "log_errors": errors} + if profiles: + kept = OUT / f"{name}.sparkprofile" + shutil.copy2(profiles[-1], kept) + result["profile"] = summarise(kept) + (OUT / f"{name}.json").write_text(json.dumps(result, indent=1)) + return result + + +def write_doc(results, settle, measure): + lines = ["# Performance", "", + f"Generated by `tools/perf_test.py`: the island world template, a {HEAP} heap, {settle} s to settle, then {measure} s measured tick by tick with spark profiling the server thread.", + "Players are the self-tests' fake clients: the server ticks them, loads their chunks and spawns Pokémon around them. One walks a long ring round the island when there are several. They send and encode no packets and fight no battles, so read this as the cost of the world, not of the network.", "", + "A tick has 50 ms; over that, the server falls behind.", "", + "| Scenario | Players | Pastures × Pokémon each | Machines each | Mean tick | p95 | p99 | Worst | Ticks over 50 ms | Pokémon pastured / wild | Working machines | Loaded chunks |", + "| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |"] + for r in results: + p = r["report"] + lines.append(f"| {r['scenario']} | {r['players']} | {r['pastures_each']} × {r['pokemon_each']} | {r['machines_each']} | {p['mean_ms']:.1f} ms | {p['p95_ms']:.1f} ms | {p['p99_ms']:.1f} ms | " + f"{p['max_ms']:.0f} ms | {int(p['spikes_over_50ms'])} of {int(p['ticks'])} | {int(p['pastured'])} / {int(p['wild'])} | {int(p['working'])} of {int(p['machines'])} | {int(p['chunks'])} |") + for r in results: + if "profile" not in r: + continue + prof = r["profile"] + total = sum(ms for g, ms in prof["groups"].items() if g != "Waiting for the next tick") or 1 + prof["groups"].pop("Waiting for the next tick", None) + lines += ["", f"## Where the server thread's busy time goes: {r['scenario']}", "", "| Part | Share |", "| --- | --- |"] + lines += [f"| {g} | {ms / total * 100:.1f} % |" for g, ms in prof["groups"].items()] + lines += ["", "Companion mod, heaviest methods including what they call:", ""] + lines += [f"- `{n}`: {ms / total * 100:.2f} %" for n, ms in prof["companion_top"]] + (ROOT / "docs/performance.md").write_text("\n".join(lines) + "\n") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--scenarios", nargs="+", default=list(SCENARIOS), choices=list(SCENARIOS)) + parser.add_argument("--settle", type=int, default=120) + parser.add_argument("--measure", type=int, default=180) + parser.add_argument("--no-doc", action="store_true") + args = parser.parse_args() + if not eula_accepted(): + sys.exit("build/server/eula.txt does not accept the Minecraft EULA yet (see tools/selftest.py --accept-eula).") + if not (TEMPLATE / "level.dat").exists(): + sys.exit("no build/world-template: run tools/make_world.py first") + OUT.mkdir(parents=True, exist_ok=True) + recipe = json.loads((ROOT / "world/world.json").read_text()) + args_file = prepare() + results = [run(name, SCENARIOS[name], args_file, recipe, args.settle, args.measure) for name in args.scenarios] + if not args.no_doc: + write_doc(results, args.settle, args.measure) + print("PERF TEST DONE") + + +if __name__ == "__main__": + main() diff --git a/tools/quests.py b/tools/quests.py index 2b80b47..db49de8 100644 --- a/tools/quests.py +++ b/tools/quests.py @@ -232,12 +232,12 @@ def chapter_quests(chapter, book, zones): q["tasks"] = [{k: v for k, v in t.items() if k != "each"} for t in tasks] # One quest per Sigil: craft it, use it, catch what comes (world/summons.json; names from the JEI data). if chapter.get("summons"): - sigils = json.loads((ROOT / "mod/src/main/resources/assets/cobblesurvival/jei/drop_sources.json").read_text())["summons"] + sigils = json.loads((ROOT / "datapacks/core/data/cobblesurvival/drop_sources/pages.json").read_text())["summons"] for s in sigils: quests.append({ "id": s["species"].split(":")[1], "title": s["name"], "icon": "cobblesurvival:summon_sigil", "after": ["about"], "text": f"Craft the {s['name']} Sigil and use it in {zones[s['zone']]['name']}. Catch the Lv {s['level']} {s['name']} that answers.", - "tasks": [{"cobblemon": "catch", "pokemon": [s["species"]]}], + "tasks": [{"cobblemon": "catch", "pokemon": [s["pokemon"]]}], }) # "Catch Pokémon of a zone": its spawn pool's species (Cobblemon Quests' own biome filter knows no zones). for q in quests: diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 0000000..8e6721b --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1,13 @@ +# Exact packages for tools/ (tools/lock.py installs them into a private venv). Hashes: Linux x86_64 wheels for Python 3.14, and the source archive. +numpy==2.4.6 \ + --hash=sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8 \ + --hash=sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e \ + --hash=sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda +pillow==12.3.0 \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce +PyYAML==6.0.3 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f diff --git a/tools/server_update.py b/tools/server_update.py new file mode 100755 index 0000000..0f0c0ce --- /dev/null +++ b/tools/server_update.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +"""Package a balance change for a running server, so players keep the client they have (Adrian, 2026-11-09). + +Everything the server decides goes in: the core data pack as one file (config/cobblesurvival/datapack.zip, which the +companion mod loads instead of the copy in its jar), the mods' configs, KubeJS's server scripts and the quest book. +The server sends what clients need of these when they join. + +Writes build/server-update-.zip; unzip it into the server's folder. --install puts the files straight into a +server folder on this machine and removes what the pack no longer has. + +What can't be done this way is any change clients run or draw: mods, textures, lang, startup scripts, new items or +blocks, the companion mod's client code. This compares those files with the last client pack handed out +(tools/client-baseline.json) and refuses when they differ; hand out a new pack, then record it with --mark-client-release. + +Usage: tools/server_update.py [--install SERVER_DIR] [--level WORLD_FOLDER] [--with-jar] [--force] + tools/server_update.py --mark-client-release +""" +import argparse +import fnmatch +import json +import re +import shutil +import subprocess +import sys +import tomllib +import zipfile +from io import BytesIO +from pathlib import Path + +import lock + +ROOT = lock.ROOT +PACK = ROOT / "pack" +BASELINE = ROOT / "tools/client-baseline.json" +# Fixed so the same data gives the same zip. +ZIP_DATE = (1980, 1, 1, 0, 0, 0) +# What the server owns under pack/; the rest of the pack only matters on a client. +SERVER_FILES = ["config/**", "kubejs/server_scripts/**"] +CLIENT_ONLY = ["config/defaultoptions/**", "config/xaero/**"] +# What a client runs or draws. +CLIENT_INPUTS = ["pack/shaderpacks/*", "pack/config/defaultoptions/**", "pack/config/xaero/**", "pack/kubejs/assets/**", "pack/kubejs/startup_scripts/**", + "pack/kubejs/client_scripts/**", "mod/src/main/resources/assets/**", "mod/src/main/resources/META-INF/**", + "mod/src/main/resources/*.mixins.json", "mod/gradle.properties"] +# Companion mod sources that run on clients or define what both sides must agree on (registries, packets). +CLIENT_CODE = re.compile(r"net\.minecraft\.client|mezz\.jei|ItemTooltipEvent|animateTick|DeferredRegister|Registry\.register|" + r"RegisterPayloadHandlersEvent|StreamCodec|@Mixin") + + +def tree(root, pattern): + return sorted(p for p in root.glob(pattern) if p.is_file()) + + +def client_files(): + files = [p for p in tree(ROOT, "pack/mods/*.pw.toml") if tomllib.loads(p.read_text()).get("side") != "server"] + for pattern in CLIENT_INPUTS: + files += tree(ROOT, pattern) + for source in [*tree(ROOT, "mod/src/main/kotlin/**/*.kt"), *tree(ROOT, "mod/src/main/java/**/*.java")]: + if "/selftest/" not in source.as_posix() and CLIENT_CODE.search(source.read_text()): + files.append(source) + return {p.relative_to(ROOT).as_posix(): lock.digest(p) for p in files} + + +def client_changes(): + old = json.loads(BASELINE.read_text()) if BASELINE.exists() else {} + new = client_files() + return sorted(name for name in old.keys() | new.keys() if old.get(name) != new.get(name)) + + +def zip_bytes(files): + """{name in zip: bytes} as a zip that only depends on its contents.""" + out = BytesIO() + with zipfile.ZipFile(out, "w", zipfile.ZIP_DEFLATED) as z: + for name in sorted(files): + info = zipfile.ZipInfo(name, ZIP_DATE) + info.compress_type = zipfile.ZIP_DEFLATED + info.external_attr = 0o644 << 16 + z.writestr(info, files[name]) + return out.getvalue() + + +def update_files(level, with_jar): + core = ROOT / "datapacks/core" + data = {p.relative_to(core).as_posix(): p.read_bytes() for p in tree(core, "**/*")} + files = {"config/cobblesurvival/datapack.zip": zip_bytes(data)} + for pattern in SERVER_FILES: + for path in tree(PACK, pattern): + name = path.relative_to(PACK).as_posix() + if not any(fnmatch.fnmatch(name, skip) for skip in CLIENT_ONLY): + files[name] = path.read_bytes() + # defaultconfigs only reach new worlds; a running server reads its world's serverconfig. + for path in tree(PACK / "defaultconfigs", "**/*"): + relative = path.relative_to(PACK / "defaultconfigs").as_posix() + files[f"defaultconfigs/{relative}"] = path.read_bytes() + files[f"{level}/serverconfig/{relative}"] = path.read_bytes() + if with_jar: + props = dict(line.split("=", 1) for line in (ROOT / "mod/gradle.properties").read_text().splitlines() + if "=" in line and not line.startswith("#")) + jar = ROOT / "mod/build/libs" / f"{props['mod_id']}-{props['mod_version']}.jar" + if not jar.exists(): + sys.exit(f"{jar} is missing: run tools/build.py first") + files[f"mods/{jar.name}"] = jar.read_bytes() + return files + + +def install(files, server): + if not (server / "mods").is_dir(): + sys.exit(f"{server} has no mods folder, so it doesn't look like the server") + # The folders this owns entirely, so what left the pack leaves the server too. + shutil.rmtree(server / "kubejs/server_scripts", ignore_errors=True) + shutil.rmtree(server / "config/ftbquests/quests", ignore_errors=True) + for name, content in files.items(): + target = server / name + target.parent.mkdir(parents=True, exist_ok=True) + part = target.with_name(target.name + ".part") + part.write_bytes(content) + part.replace(target) # the running server can be reading the old file + + +def main(): + lock.enter_venv() + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument("--install", type=Path, help="put the update into this server folder") + parser.add_argument("--level", default="world", help="the server's world folder (level-name), default world") + parser.add_argument("--with-jar", action="store_true", help="also update the server's companion mod (code that only the server runs)") + parser.add_argument("--force", action="store_true", help="build it although clients would need a new pack too") + parser.add_argument("--mark-client-release", action="store_true", help="record the current client files as handed out to players") + args = parser.parse_args() + + if args.mark_client_release: + BASELINE.write_text(json.dumps(client_files(), indent=1, sort_keys=True) + "\n") + print(f"Recorded {len(client_files())} client files in {BASELINE.relative_to(ROOT)}") + return + changed = client_changes() + if changed and not args.force: + print("Players would need a new client pack for these changes, so a server update isn't enough:", file=sys.stderr) + print("".join(f" {name}\n" for name in changed), file=sys.stderr, end="") + sys.exit("Hand out a new pack and run --mark-client-release, or pass --force if you know these are harmless.") + + subprocess.run([sys.executable, str(ROOT / "tools/jei_sources.py")], check=True) + subprocess.run([sys.executable, str(ROOT / "tools/quests.py")], check=True) + files = update_files(args.level, args.with_jar) + version = tomllib.loads((PACK / "pack.toml").read_text())["version"] + out = ROOT / f"build/server-update-{version}.zip" + out.parent.mkdir(exist_ok=True) + out.write_bytes(zip_bytes(files)) + print(f"{len(files)} files in {out.relative_to(ROOT)}") + if args.install: + install(files, args.install) + print(f"Installed into {args.install}") + print("Then on the server: /reload (data pack, recipes), /ftbquests reload (quest book); changed mod configs need a restart.") + print("/cobblesurvival data shows what is live.") + + +if __name__ == "__main__": + main() diff --git a/tools/summons.py b/tools/summons.py index 6edbb29..02e4b6c 100644 --- a/tools/summons.py +++ b/tools/summons.py @@ -12,7 +12,6 @@ writes, under datapacks/core/data/cobblesurvival/: and the sigil's texture and item model in the companion mod. The fights are written by tools/zone_bosses.py, so run that afterwards, and tools/jei_sources.py and tools/quests.py after it. -Needs the Cobblemon jar in build/server/mods (any test-server run), for the names. Usage: tools/summons.py """ @@ -23,6 +22,8 @@ from pathlib import Path from PIL import Image +import lock + ROOT = Path(__file__).resolve().parent.parent DATA = ROOT / "datapacks/core/data/cobblesurvival" ASSETS = ROOT / "mod/src/main/resources/assets/cobblesurvival" @@ -65,7 +66,7 @@ def main(): table = json.loads((ROOT / "world/summons.json").read_text()) plan = json.loads((ROOT / "world/zones.json").read_text()) zones = {z["id"]: z["name"] for z in plan["zones"] + plan["caves"] + plan.get("dimensions", [])} - species_names = names(next((ROOT / "build/server/mods").glob("Cobblemon-*.jar"))) + species_names = names(lock.mod_jar("cobblemon")) summons, recipes = DATA / "summons", DATA / "recipe" summons.mkdir(parents=True, exist_ok=True) @@ -74,9 +75,10 @@ def main(): comment = "Generated by tools/summons.py from world/summons.json; do not edit by hand." for species, s in table["summons"].items(): tier = table["tiers"][str(s["tier"])] - name = species_names[species] + form = s.get("form") + name = f"{form.title()} {species_names[s['species']]}" if form else species_names[species] (summons / f"{species}.json").write_text(json.dumps( - {"_comment": comment, "species": species, "level": tier["level"], "zone": s["zone"]}, indent=1) + "\n") + {"_comment": comment, "species": species, "pokemon": f"{s['species']} {form}" if form else species, "level": tier["level"], "zone": s["zone"]}, indent=1) + "\n") lore = f"Use in {zones[s['zone']]} to summon a Lv {tier['level']} {name}" (recipes / f"summon_{species}.json").write_text(json.dumps({ "_comment": comment, "type": "minecraft:crafting_shaped", "category": "misc", diff --git a/tools/zone_bosses.py b/tools/zone_bosses.py index bff8d21..91fccef 100644 --- a/tools/zone_bosses.py +++ b/tools/zone_bosses.py @@ -7,7 +7,6 @@ datapacks/core/data/cobblesurvival/bosses/.json, and bosses/end.json for t guardian's level (TIERS): which patterns it uses, how long they telegraph, how often they come; damage grows with level; a Fire, Ice or Poison guardian burns, freezes or poisons. Placeholder numbers, see docs/balance.md. -Needs the Cobblemon jar in build/server/mods (any test-server run) for the guardians' types. Usage: tools/zone_bosses.py """ @@ -15,10 +14,11 @@ import json import zipfile from pathlib import Path +import lock + ROOT = Path(__file__).resolve().parent.parent DATA = ROOT / "datapacks/core/data/cobblesurvival" OUT = DATA / "bosses" -MODS = ROOT / "build/server/mods" ARENA = 24 ARENA_BY_ZONE = {"basalt": 32} @@ -79,8 +79,7 @@ def species_data(jar): def main(): - jar = next(MODS.glob("Cobblemon-*.jar")) - types, heights = species_data(jar) + types, heights = species_data(lock.mod_jar("cobblemon")) OUT.mkdir(parents=True, exist_ok=True) for old in OUT.glob("*.json"): old.unlink() @@ -99,7 +98,7 @@ def main(): print(f"end: {END['species']} Lv {END['level']}, {len(end['patterns'])} patterns") table = json.loads((ROOT / "world/summons.json").read_text()) for species, s in table["summons"].items(): - fight = boss(table["tiers"][str(s["tier"])]["level"], types.get(species, set()), SUMMON_ARENA, summon=species) + fight = boss(table["tiers"][str(s["tier"])]["level"], types.get(s.get("species", species), set()), SUMMON_ARENA, summon=species) (OUT / f"summon_{species}.json").write_text(json.dumps({"_comment": comment, **fight}, indent=1) + "\n") print(f"{len(table['summons'])} summoned legendaries") diff --git a/tools/zone_layout.py b/tools/zone_layout.py index fd93cd8..9b9d53a 100755 --- a/tools/zone_layout.py +++ b/tools/zone_layout.py @@ -127,6 +127,8 @@ def assign(preview, plan): elif "water" in rule: inherit_from_land(zone, biome_mask(plan["inherit"])) mask = ~land & (zone == -1) & biome_mask(rule["water"]) + if "beyond" in rule: + mask &= dist > rule["beyond"] else: sys.exit(f"zone {spec['id']}: unknown rule {rule}") zone[mask] = index diff --git a/tools/zone_spawns.py b/tools/zone_spawns.py index 6d14298..fd179aa 100755 --- a/tools/zone_spawns.py +++ b/tools/zone_spawns.py @@ -57,6 +57,8 @@ import sys import zipfile from pathlib import Path +import lock + ROOT = Path(__file__).resolve().parent.parent OUT = ROOT / "datapacks/core/data/cobblesurvival/spawn_pool_world" GUARDIANS = ROOT / "datapacks/core/data/cobblesurvival/guardians" @@ -83,10 +85,7 @@ HIGH_ZONE_LEVEL = 30 def cobblemon_jar(): - jars = sorted((ROOT / "build/server/mods").glob("Cobblemon-*.jar")) - if not jars: - sys.exit("no Cobblemon jar in build/server/mods: run tools/build.py and tools/selftest.py (or the quick check) first") - return jars[-1] + return lock.mod_jar("cobblemon") def load_entries(jar): @@ -388,8 +387,9 @@ def main(): lo, hi = zones[zid]["levels"] kinds = {"submerged", "surface"} if "water" in zones[zid].get("rule", {}) else {"grounded"} for name in roots: - root = f"cobblemon:{name}" - items = [i for i in raw_lines[root] if i[0].get("spawnablePositionType") in kinds] + base, _, form = name.partition(" ") + root = f"cobblemon:{base}" + items = [i for i in raw_lines[root] if i[0].get("spawnablePositionType") in kinds and (not form or i[0]["pokemon"].lower() == name)] if not items: # No usable spawn data at all: one plain entry across the band. items = [({"type": "pokemon", "pokemon": name, "presets": ["natural"], "spawnablePositionType": "grounded"}, root, (lo, hi))] @@ -416,8 +416,10 @@ def main(): "level": f"{a}-{b}", "weight": homeless["weight"], "condition": condition, }) names = sorted({species[m]["name"] for _, m, _, _ in fitting if m in species}) - report[zid].append((species.get(root, {}).get("name", root), names)) - homeless_roots.add(root) + label = species.get(root, {}).get("name", root) + report[zid].append((f"{form.split()[0].title()} {label}" if form else label, names)) + if not form: # a regional form comes on top of its line, which keeps its own home + homeless_roots.add(root) low_flyers = [(zid, s["pokemon"]) for zid, spawns in pools.items() for s in spawns if zones[zid]["levels"][0] < HIGH_ZONE_LEVEL and f"cobblemon:{s['pokemon'].split()[0].lower()}" in strong_flyers] diff --git a/world/summons.json b/world/summons.json index 129989f..5399659 100644 --- a/world/summons.json +++ b/world/summons.json @@ -27,6 +27,9 @@ "regigigas": {"zone": "deep_dark", "tier": 2, "material": "minecraft:echo_shard"}, "rayquaza": {"zone": "frostpeak", "tier": 3, "material": "minecraft:emerald_block"}, "mewtwo": {"zone": "deep_dark", "tier": 3, "material": "cobblemon:dusk_stone"}, - "eternatus": {"zone": "the_end", "tier": 3, "material": "minecraft:ender_eye"} + "eternatus": {"zone": "the_end", "tier": 3, "material": "minecraft:ender_eye"}, + "zapdos_galarian": {"species": "zapdos", "form": "galarian", "zone": "jungle", "tier": 2, "material": "cobblemon:thunder_stone"}, + "articuno_galarian": {"species": "articuno", "form": "galarian", "zone": "highlands", "tier": 2, "material": "cobblemon:ice_stone"}, + "moltres_galarian": {"species": "moltres", "form": "galarian", "zone": "deep_dark", "tier": 2, "material": "cobblemon:fire_stone"} } } diff --git a/world/zones.json b/world/zones.json index 4475f33..e997965 100644 --- a/world/zones.json +++ b/world/zones.json @@ -1,106 +1,1055 @@ { - "_comment": "Zone plan for Phase 3 (model approved by Adrian 2026-10-29; levels are placeholders, see docs/balance.md). tools/zone_layout.py assigns each surface cell of the island to the first zone whose rule matches, in this order, and renders build/zone-map.png. Rules: 'within' = distance from 0,0 in blocks; 'biomes' = cells of these biomes, clusters smaller than min_cells dropped, plus 'absorb' = cells of other biomes within that many blocks of the cluster; 'region' = what is left, by half-plane (x/z bounds in blocks); 'water' = sea cells of these biomes. Biomes in 'inherit' (rivers) take the zone of the land around them. Cave zones follow the cave biome everywhere under the island and are not drawn. 'lines' = how many evolution lines tools/zone_spawns.py aims to give the zone (scaled to the lines available); 'species' pins a line to a zone by hand. 'guardian': the zone's Alpha guardian (tools/zone_spawns.py picks the strongest Pokémon spawning in the zone unless 'species' is given, at the band's top level + 5) and its drops, which help with the next zone; it stands at the zone's sample point and returns guardian_respawn_hours after it is beaten (Adrian, 2026-10-29: fixed spots, 5 hours). 'ores': Phase 4 ore tiers (tools/zone_ores.py writes Regenerating Ore Veins' config and the companion mod's node table from them). Each tier lives in exactly one zone, higher tiers in higher zones; Cobblemon's evolution stones are tiers too. Adrian (2026-10-30): small nodes on the surface, larger veins underground that are harder to find, and the cave zones' ores as nodes on the cave floor, not in the walls. 'nodes': 'chance' per chunk, 'radius' in blocks (0 = one block); cave tiers also 'tries' (columns searched per chunk) and 'y' (where their cave biome lies). 'veins' (surface tiers only, underground): 'radius', 'y', 'spacing' in chunks between candidate chunks, 'attempts'; 'stone'/'deepslate' split them into an upper vein (y >= 0) and a lower one, 'blocks' is a weighted list. 'regen_minutes' of real time, plus 'jitter', 'fill' (veins) and 'node_fill' (nodes bigger than one block) from 'ore_defaults'. 'wanderers': a wild Pokémon more than 'grace_levels' above the band of the zone it stands in despawns (Adrian, 2026-10-30: a Lv 61 from the Basalt Furnace turned up in the Lush Caves); not in battles, not while angry at someone, never a guardian. 'level_pressure': a Pokémon more than grace_levels above the band of the zone its trainer stands in gets per_level less experience per extra level, down to minimum (Exp. Candy and commands excepted).", + "_comment": "Zone plan for Phase 3 (model approved by Adrian 2026-10-29; levels are placeholders, see docs/balance.md). tools/zone_layout.py assigns each surface cell of the island to the first zone whose rule matches, in this order, and renders build/zone-map.png. Rules: 'within' = distance from 0,0 in blocks; 'biomes' = cells of these biomes, clusters smaller than min_cells dropped, plus 'absorb' = cells of other biomes within that many blocks of the cluster; 'region' = what is left, by half-plane (x/z bounds in blocks); 'water' = sea cells of these biomes, with 'beyond' only that many blocks or more from 0,0 (Adrian, 2026-11-09: the channels between the islands stay low level, the surrounding sea is high). Biomes in 'inherit' (rivers) take the zone of the land around them. Cave zones follow the cave biome everywhere under the island and are not drawn. 'lines' = how many evolution lines tools/zone_spawns.py aims to give the zone (scaled to the lines available); 'species' pins a line to a zone by hand. 'guardian': the zone's Alpha guardian (tools/zone_spawns.py picks the strongest Pokémon spawning in the zone unless 'species' is given, at the band's top level + 5) and its drops, which help with the next zone; it stands at the zone's sample point and returns guardian_respawn_hours after it is beaten (Adrian, 2026-10-29: fixed spots, 5 hours). 'ores': Phase 4 ore tiers (tools/zone_ores.py writes Regenerating Ore Veins' config and the companion mod's node table from them). Each tier lives in exactly one zone, higher tiers in higher zones; Cobblemon's evolution stones are tiers too. Adrian (2026-10-30): small nodes on the surface, larger veins underground that are harder to find, and the cave zones' ores as nodes on the cave floor, not in the walls. 'nodes': 'chance' per chunk, 'radius' in blocks (0 = one block); cave tiers also 'tries' (columns searched per chunk) and 'y' (where their cave biome lies). 'veins' (surface tiers only, underground): 'radius', 'y', 'spacing' in chunks between candidate chunks, 'attempts'; 'stone'/'deepslate' split them into an upper vein (y >= 0) and a lower one, 'blocks' is a weighted list. 'regen_minutes' of real time, plus 'jitter', 'fill' (veins) and 'node_fill' (nodes bigger than one block) from 'ore_defaults'. 'wanderers': a wild Pokémon more than 'grace_levels' above the band of the zone it stands in despawns (Adrian, 2026-10-30: a Lv 61 from the Basalt Furnace turned up in the Lush Caves); not in battles, not while angry at someone, never a guardian. 'level_pressure': a Pokémon more than grace_levels above the band of the zone its trainer stands in gets per_level less experience per extra level, down to minimum (Exp. Candy and commands excepted).", "min_cells": 6, - "inherit": ["minecraft:river"], + "inherit": [ + "minecraft:river" + ], "guardian_respawn_hours": 5, - "level_pressure": {"grace_levels": 5, "per_level": 0.1, "minimum": 0.1}, - "wanderers": {"grace_levels": 10}, - "ore_defaults": {"fill": 0.7, "node_fill": 0.8, "attempts": 1, "jitter": 0.1}, + "level_pressure": { + "grace_levels": 5, + "per_level": 0.1, + "minimum": 0.1 + }, + "wanderers": { + "grace_levels": 10 + }, + "ore_defaults": { + "fill": 0.7, + "node_fill": 0.8, + "attempts": 1, + "jitter": 0.1 + }, "ores": { - "coal": {"zone": "button_isle", "item": "minecraft:coal", "stone": "minecraft:coal_ore", "deepslate": "minecraft:deepslate_coal_ore", "regen_minutes": 20, "nodes": {"chance": 0.3, "radius": [1, 2]}, "veins": {"radius": [3, 5], "y": [-32, 100], "spacing": 8, "attempts": 2}}, - "copper": {"zone": "southwold", "item": "minecraft:raw_copper", "stone": "minecraft:copper_ore", "deepslate": "minecraft:deepslate_copper_ore", "regen_minutes": 30, "nodes": {"chance": 0.12, "radius": [1, 2]}, "veins": {"radius": [3, 5], "y": [-32, 100], "spacing": 10, "attempts": 2}}, - "iron": {"zone": "westmarch", "item": "minecraft:raw_iron", "stone": "minecraft:iron_ore", "deepslate": "minecraft:deepslate_iron_ore", "regen_minutes": 40, "nodes": {"chance": 0.12, "radius": [1, 2]}, "veins": {"radius": [3, 5], "y": [-48, 90], "spacing": 10, "attempts": 2}}, - "redstone": {"zone": "jungle", "item": "minecraft:redstone", "stone": "minecraft:redstone_ore", "deepslate": "minecraft:deepslate_redstone_ore", "regen_minutes": 45, "nodes": {"chance": 0.12, "radius": [1, 2]}, "veins": {"radius": [3, 4], "y": [-56, 60], "spacing": 12, "attempts": 1}}, - "lapis": {"zone": "highlands", "item": "minecraft:lapis_lazuli", "stone": "minecraft:lapis_ore", "deepslate": "minecraft:deepslate_lapis_ore", "regen_minutes": 45, "nodes": {"chance": 0.09, "radius": [1, 2]}, "veins": {"radius": [3, 4], "y": [-56, 80], "spacing": 12, "attempts": 1}}, - "gold": {"zone": "sunscorch", "item": "minecraft:raw_gold", "stone": "minecraft:gold_ore", "deepslate": "minecraft:deepslate_gold_ore", "regen_minutes": 60, "nodes": {"chance": 0.18, "radius": [1, 2]}, "veins": {"radius": [3, 4], "y": [-48, 120], "spacing": 9, "attempts": 2}}, - "emerald": {"zone": "frostpeak", "item": "minecraft:emerald", "stone": "minecraft:emerald_ore", "deepslate": "minecraft:deepslate_emerald_ore", "regen_minutes": 75, "nodes": {"chance": 0.09, "radius": [1, 2]}, "veins": {"radius": [2, 3], "y": [-16, 320], "spacing": 10, "attempts": 2}}, - "amethyst": {"zone": "dripstone", "item": "minecraft:amethyst_shard", "blocks": [["minecraft:amethyst_block", 3], ["minecraft:budding_amethyst", 1]], "regen_minutes": 120, "nodes": {"chance": 0.3, "tries": 8, "radius": [1, 2], "y": [0, 40]}}, - "diamond": {"zone": "deep_dark", "item": "minecraft:diamond", "deepslate": "minecraft:deepslate_diamond_ore", "regen_minutes": 90, "nodes": {"chance": 0.09, "tries": 8, "radius": [1, 2], "y": [-64, -24]}}, - "quartz": {"zone": "basalt", "item": "minecraft:quartz", "blocks": [["minecraft:nether_quartz_ore", 1]], "regen_minutes": 60, "nodes": {"chance": 0.3, "tries": 8, "radius": [1, 2], "y": [-64, 40]}}, - "netherite": {"zone": "basalt", "item": "minecraft:ancient_debris", "blocks": [["minecraft:ancient_debris", 1]], "regen_minutes": 180, "nodes": {"chance": 0.036, "tries": 8, "radius": [0, 1], "y": [-64, 40]}}, - "thunder_stone": {"zone": "westmarch", "item": "cobblemon:thunder_stone", "stone": "cobblemon:thunder_stone_ore", "deepslate": "cobblemon:deepslate_thunder_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.018, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-48, 100], "spacing": 14, "attempts": 1}}, - "shiny_stone": {"zone": "lush_caves", "item": "cobblemon:shiny_stone", "stone": "cobblemon:shiny_stone_ore", "deepslate": "cobblemon:deepslate_shiny_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.09, "tries": 8, "radius": [1, 2], "y": [-16, 40]}}, - "leaf_stone": {"zone": "jungle", "item": "cobblemon:leaf_stone", "stone": "cobblemon:leaf_stone_ore", "deepslate": "cobblemon:deepslate_leaf_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.024, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-48, 100], "spacing": 14, "attempts": 1}}, - "water_stone": {"zone": "mire", "item": "cobblemon:water_stone", "stone": "cobblemon:water_stone_ore", "deepslate": "cobblemon:deepslate_water_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.024, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-48, 100], "spacing": 14, "attempts": 1}}, - "moon_stone": {"zone": "dripstone", "item": "cobblemon:moon_stone", "blocks": [["cobblemon:dripstone_moon_stone_ore", 1], ["cobblemon:moon_stone_ore", 1], ["cobblemon:deepslate_moon_stone_ore", 1]], "regen_minutes": 60, "nodes": {"chance": 0.15, "tries": 8, "radius": [1, 2], "y": [0, 40]}}, - "sun_stone": {"zone": "highlands", "item": "cobblemon:sun_stone", "stone": "cobblemon:sun_stone_ore", "deepslate": "cobblemon:deepslate_sun_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.012, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-48, 100], "spacing": 14, "attempts": 1}}, - "fire_stone": {"zone": "sunscorch", "item": "cobblemon:fire_stone", "stone": "cobblemon:fire_stone_ore", "deepslate": "cobblemon:deepslate_fire_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.048, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-48, 120], "spacing": 12, "attempts": 2}}, - "ice_stone": {"zone": "frostpeak", "item": "cobblemon:ice_stone", "stone": "cobblemon:ice_stone_ore", "deepslate": "cobblemon:deepslate_ice_stone_ore", "regen_minutes": 60, "nodes": {"chance": 0.036, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-16, 320], "spacing": 12, "attempts": 2}}, - "dawn_stone": {"zone": "frostpeak", "item": "cobblemon:dawn_stone", "stone": "cobblemon:dawn_stone_ore", "deepslate": "cobblemon:deepslate_dawn_stone_ore", "regen_minutes": 75, "nodes": {"chance": 0.024, "radius": [0, 1]}, "veins": {"radius": [2, 3], "y": [-16, 320], "spacing": 13, "attempts": 2}}, - "dusk_stone": {"zone": "deep_dark", "item": "cobblemon:dusk_stone", "deepslate": "cobblemon:deepslate_dusk_stone_ore", "regen_minutes": 75, "nodes": {"chance": 0.06, "tries": 8, "radius": [1, 2], "y": [-64, -24]}} + "coal": { + "zone": "button_isle", + "item": "minecraft:coal", + "stone": "minecraft:coal_ore", + "deepslate": "minecraft:deepslate_coal_ore", + "regen_minutes": 20, + "nodes": { + "chance": 0.3, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 3, + 5 + ], + "y": [ + -32, + 100 + ], + "spacing": 8, + "attempts": 2 + } + }, + "copper": { + "zone": "southwold", + "item": "minecraft:raw_copper", + "stone": "minecraft:copper_ore", + "deepslate": "minecraft:deepslate_copper_ore", + "regen_minutes": 30, + "nodes": { + "chance": 0.12, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 3, + 5 + ], + "y": [ + -32, + 100 + ], + "spacing": 10, + "attempts": 2 + } + }, + "iron": { + "zone": "westmarch", + "item": "minecraft:raw_iron", + "stone": "minecraft:iron_ore", + "deepslate": "minecraft:deepslate_iron_ore", + "regen_minutes": 40, + "nodes": { + "chance": 0.12, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 3, + 5 + ], + "y": [ + -48, + 90 + ], + "spacing": 10, + "attempts": 2 + } + }, + "redstone": { + "zone": "jungle", + "item": "minecraft:redstone", + "stone": "minecraft:redstone_ore", + "deepslate": "minecraft:deepslate_redstone_ore", + "regen_minutes": 45, + "nodes": { + "chance": 0.12, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 3, + 4 + ], + "y": [ + -56, + 60 + ], + "spacing": 12, + "attempts": 1 + } + }, + "lapis": { + "zone": "highlands", + "item": "minecraft:lapis_lazuli", + "stone": "minecraft:lapis_ore", + "deepslate": "minecraft:deepslate_lapis_ore", + "regen_minutes": 45, + "nodes": { + "chance": 0.09, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 3, + 4 + ], + "y": [ + -56, + 80 + ], + "spacing": 12, + "attempts": 1 + } + }, + "gold": { + "zone": "sunscorch", + "item": "minecraft:raw_gold", + "stone": "minecraft:gold_ore", + "deepslate": "minecraft:deepslate_gold_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.18, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 3, + 4 + ], + "y": [ + -48, + 120 + ], + "spacing": 9, + "attempts": 2 + } + }, + "emerald": { + "zone": "frostpeak", + "item": "minecraft:emerald", + "stone": "minecraft:emerald_ore", + "deepslate": "minecraft:deepslate_emerald_ore", + "regen_minutes": 75, + "nodes": { + "chance": 0.09, + "radius": [ + 1, + 2 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -16, + 320 + ], + "spacing": 10, + "attempts": 2 + } + }, + "amethyst": { + "zone": "dripstone", + "item": "minecraft:amethyst_shard", + "blocks": [ + [ + "minecraft:amethyst_block", + 3 + ], + [ + "minecraft:budding_amethyst", + 1 + ] + ], + "regen_minutes": 120, + "nodes": { + "chance": 0.3, + "tries": 8, + "radius": [ + 1, + 2 + ], + "y": [ + 0, + 40 + ] + } + }, + "diamond": { + "zone": "deep_dark", + "item": "minecraft:diamond", + "deepslate": "minecraft:deepslate_diamond_ore", + "regen_minutes": 90, + "nodes": { + "chance": 0.09, + "tries": 8, + "radius": [ + 1, + 2 + ], + "y": [ + -64, + -24 + ] + } + }, + "quartz": { + "zone": "basalt", + "item": "minecraft:quartz", + "blocks": [ + [ + "minecraft:nether_quartz_ore", + 1 + ] + ], + "regen_minutes": 60, + "nodes": { + "chance": 0.3, + "tries": 8, + "radius": [ + 1, + 2 + ], + "y": [ + -64, + 40 + ] + } + }, + "netherite": { + "zone": "basalt", + "item": "minecraft:ancient_debris", + "blocks": [ + [ + "minecraft:ancient_debris", + 1 + ] + ], + "regen_minutes": 180, + "nodes": { + "chance": 0.036, + "tries": 8, + "radius": [ + 0, + 1 + ], + "y": [ + -64, + 40 + ] + } + }, + "thunder_stone": { + "zone": "westmarch", + "item": "cobblemon:thunder_stone", + "stone": "cobblemon:thunder_stone_ore", + "deepslate": "cobblemon:deepslate_thunder_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.018, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -48, + 100 + ], + "spacing": 14, + "attempts": 1 + } + }, + "shiny_stone": { + "zone": "lush_caves", + "item": "cobblemon:shiny_stone", + "stone": "cobblemon:shiny_stone_ore", + "deepslate": "cobblemon:deepslate_shiny_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.09, + "tries": 8, + "radius": [ + 1, + 2 + ], + "y": [ + -16, + 40 + ] + } + }, + "leaf_stone": { + "zone": "jungle", + "item": "cobblemon:leaf_stone", + "stone": "cobblemon:leaf_stone_ore", + "deepslate": "cobblemon:deepslate_leaf_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.024, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -48, + 100 + ], + "spacing": 14, + "attempts": 1 + } + }, + "water_stone": { + "zone": "mire", + "item": "cobblemon:water_stone", + "stone": "cobblemon:water_stone_ore", + "deepslate": "cobblemon:deepslate_water_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.024, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -48, + 100 + ], + "spacing": 14, + "attempts": 1 + } + }, + "moon_stone": { + "zone": "dripstone", + "item": "cobblemon:moon_stone", + "blocks": [ + [ + "cobblemon:dripstone_moon_stone_ore", + 1 + ], + [ + "cobblemon:moon_stone_ore", + 1 + ], + [ + "cobblemon:deepslate_moon_stone_ore", + 1 + ] + ], + "regen_minutes": 60, + "nodes": { + "chance": 0.15, + "tries": 8, + "radius": [ + 1, + 2 + ], + "y": [ + 0, + 40 + ] + } + }, + "sun_stone": { + "zone": "highlands", + "item": "cobblemon:sun_stone", + "stone": "cobblemon:sun_stone_ore", + "deepslate": "cobblemon:deepslate_sun_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.012, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -48, + 100 + ], + "spacing": 14, + "attempts": 1 + } + }, + "fire_stone": { + "zone": "sunscorch", + "item": "cobblemon:fire_stone", + "stone": "cobblemon:fire_stone_ore", + "deepslate": "cobblemon:deepslate_fire_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.048, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -48, + 120 + ], + "spacing": 12, + "attempts": 2 + } + }, + "ice_stone": { + "zone": "frostpeak", + "item": "cobblemon:ice_stone", + "stone": "cobblemon:ice_stone_ore", + "deepslate": "cobblemon:deepslate_ice_stone_ore", + "regen_minutes": 60, + "nodes": { + "chance": 0.036, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -16, + 320 + ], + "spacing": 12, + "attempts": 2 + } + }, + "dawn_stone": { + "zone": "frostpeak", + "item": "cobblemon:dawn_stone", + "stone": "cobblemon:dawn_stone_ore", + "deepslate": "cobblemon:deepslate_dawn_stone_ore", + "regen_minutes": 75, + "nodes": { + "chance": 0.024, + "radius": [ + 0, + 1 + ] + }, + "veins": { + "radius": [ + 2, + 3 + ], + "y": [ + -16, + 320 + ], + "spacing": 13, + "attempts": 2 + } + }, + "dusk_stone": { + "zone": "deep_dark", + "item": "cobblemon:dusk_stone", + "deepslate": "cobblemon:deepslate_dusk_stone_ore", + "regen_minutes": 75, + "nodes": { + "chance": 0.06, + "tries": 8, + "radius": [ + 1, + 2 + ], + "y": [ + -64, + -24 + ] + } + } + }, + "species": { + "durant": "basalt", + "torkoal": "basalt", + "heatmor": "basalt", + "ditto": { + "zone": "deep_dark", + "all_entries": true + } }, - "species": {"durant": "basalt", "torkoal": "basalt", "heatmor": "basalt", - "ditto": {"zone": "deep_dark", "all_entries": true}}, "zones": [ { - "id": "button_isle", "guardian": {"drops": [["cobblemon:poke_ball", 10], ["cobblemon:potion", 4]]}, "lines": 19, "name": "Button Isle", "levels": [2, 10], "hazard": "none", "color": "#a6d96a", - "rule": {"within": 300} + "id": "button_isle", + "guardian": { + "drops": [ + [ + "cobblemon:poke_ball", + 10 + ], + [ + "cobblemon:potion", + 4 + ] + ] + }, + "lines": 19, + "name": "Button Isle", + "levels": [ + 2, + 10 + ], + "hazard": "none", + "color": "#a6d96a", + "rule": { + "within": 300 + } }, { - "id": "frostpeak", "guardian": {"species": "abomasnow", "drops": [["cobblemon:icy_rock", 3], ["cobblemon:exp_candy_l", 2]]}, "lines": 30, "name": "Frostpeak Range", "levels": [40, 55], "hazard": "cold (Cold Sweat): needs wool insulation", "color": "#f2f7ff", - "rule": {"biomes": ["minecraft:jagged_peaks"], "absorb": {"minecraft:windswept_hills": 96, "minecraft:cherry_grove": 144}} + "id": "frostpeak", + "guardian": { + "species": "abomasnow", + "drops": [ + [ + "cobblemon:icy_rock", + 3 + ], + [ + "cobblemon:exp_candy_l", + 2 + ] + ] + }, + "lines": 30, + "name": "Frostpeak Range", + "levels": [ + 40, + 55 + ], + "hazard": "cold (Cold Sweat): needs wool insulation", + "color": "#f2f7ff", + "rule": { + "biomes": [ + "minecraft:jagged_peaks" + ], + "absorb": { + "minecraft:windswept_hills": 96, + "minecraft:cherry_grove": 144 + } + } }, { - "id": "sunscorch", "guardian": {"species": "flygon", "drops": [["cobblemon:heat_rock", 3], ["cobblemon:exp_candy_l", 2]]}, "lines": 25, "name": "Sunscorch", "levels": [30, 45], "hazard": "heat (Cold Sweat): needs heat insulation", "color": "#f4a443", - "rule": {"biomes": ["minecraft:desert", "minecraft:badlands"]} + "id": "sunscorch", + "guardian": { + "species": "flygon", + "drops": [ + [ + "cobblemon:heat_rock", + 3 + ], + [ + "cobblemon:exp_candy_l", + 2 + ] + ] + }, + "lines": 25, + "name": "Sunscorch", + "levels": [ + 30, + 45 + ], + "hazard": "heat (Cold Sweat): needs heat insulation", + "color": "#f4a443", + "rule": { + "biomes": [ + "minecraft:desert", + "minecraft:badlands" + ] + } }, { - "id": "mire", "guardian": {"drops": [["cobblemon:icy_rock", 3], ["cobblemon:super_potion", 4]]}, "lines": 25, "name": "Mangrove Mire", "levels": [25, 38], "hazard": "poison area effect (companion mod)", "color": "#3cb5a0", - "rule": {"biomes": ["minecraft:mangrove_swamp"]} + "id": "mire", + "guardian": { + "drops": [ + [ + "cobblemon:icy_rock", + 3 + ], + [ + "cobblemon:super_potion", + 4 + ] + ] + }, + "lines": 25, + "name": "Mangrove Mire", + "levels": [ + 25, + 38 + ], + "hazard": "poison area effect (companion mod)", + "color": "#3cb5a0", + "rule": { + "biomes": [ + "minecraft:mangrove_swamp" + ] + } }, { - "id": "jungle", "guardian": {"drops": [["cobblesurvival:mire_waders", 1], ["cobblemon:pecha_berry", 4], ["cobblemon:exp_candy_m", 2]]}, "lines": 30, "name": "Verdant Jungle", "levels": [18, 30], "hazard": "none (warm and humid, below Cold Sweat's damage)", "color": "#5a8f1e", - "rule": {"biomes": ["minecraft:jungle"]} + "id": "jungle", + "guardian": { + "drops": [ + [ + "cobblesurvival:mire_waders", + 1 + ], + [ + "cobblemon:pecha_berry", + 4 + ], + [ + "cobblemon:exp_candy_m", + 2 + ] + ] + }, + "lines": 30, + "name": "Verdant Jungle", + "levels": [ + 18, + 30 + ], + "hazard": "none (warm and humid, below Cold Sweat's damage)", + "color": "#5a8f1e", + "rule": { + "biomes": [ + "minecraft:jungle" + ] + } }, { - "id": "highlands", "guardian": {"species": "mudsdale", "drops": [["cobblemon:icy_rock", 3], ["cobblemon:super_potion", 4]]}, "lines": 35, "name": "Highland Meadows", "levels": [25, 35], "hazard": "none", "color": "#e3b7d6", - "rule": {"region": {"z_max": 0, "x_min": -250}} + "id": "highlands", + "guardian": { + "species": "mudsdale", + "drops": [ + [ + "cobblemon:icy_rock", + 3 + ], + [ + "cobblemon:super_potion", + 4 + ] + ] + }, + "lines": 35, + "name": "Highland Meadows", + "levels": [ + 25, + 35 + ], + "hazard": "none", + "color": "#e3b7d6", + "rule": { + "region": { + "z_max": 0, + "x_min": -250 + } + } }, { - "id": "westmarch", "guardian": {"drops": [["cobblesurvival:mire_waders", 1], ["cobblemon:pecha_berry", 4], ["cobblemon:exp_candy_m", 2]]}, "lines": 35, "name": "Westmarch", "levels": [15, 25], "hazard": "none", "color": "#2f8f4e", - "rule": {"region": {"z_max": 0, "x_max": -250}} + "id": "westmarch", + "guardian": { + "drops": [ + [ + "cobblesurvival:mire_waders", + 1 + ], + [ + "cobblemon:pecha_berry", + 4 + ], + [ + "cobblemon:exp_candy_m", + 2 + ] + ] + }, + "lines": 35, + "name": "Westmarch", + "levels": [ + 15, + 25 + ], + "hazard": "none", + "color": "#2f8f4e", + "rule": { + "region": { + "z_max": 0, + "x_max": -250 + } + } }, { - "id": "southwold", "guardian": {"species": "pinsir", "drops": [["cobblemon:great_ball", 6], ["cobblemon:exp_candy_s", 4]]}, "lines": 35, "name": "Southwold", "levels": [8, 18], "hazard": "none", "color": "#7cc576", - "rule": {"region": {"z_min": 0}} + "id": "southwold", + "guardian": { + "species": "pinsir", + "drops": [ + [ + "cobblemon:great_ball", + 6 + ], + [ + "cobblemon:exp_candy_s", + 4 + ] + ] + }, + "lines": 35, + "name": "Southwold", + "levels": [ + 8, + 18 + ], + "hazard": "none", + "color": "#7cc576", + "rule": { + "region": { + "z_min": 0 + } + } }, { - "id": "shallows", "lines": 30, "name": "Shallows", "levels": [5, 20], "hazard": "none", "color": "#5aa9e6", - "rule": {"water": ["minecraft:river", "minecraft:beach", "minecraft:ocean", "minecraft:lukewarm_ocean", "minecraft:warm_ocean"]} + "id": "deep_sea", + "guardian": { + "drops": [ + [ + "cobblemon:mystic_water", + 1 + ], + [ + "cobblemon:exp_candy_m", + 3 + ] + ] + }, + "lines": 20, + "name": "Deep Sea", + "levels": [ + 30, + 50 + ], + "hazard": "none", + "color": "#1f4e8c", + "rule": { + "water": [ + "minecraft:ocean", + "minecraft:lukewarm_ocean", + "minecraft:warm_ocean", + "minecraft:deep_ocean", + "minecraft:deep_lukewarm_ocean" + ], + "beyond": 1500 + } }, { - "id": "deep_sea", "guardian": {"drops": [["cobblemon:mystic_water", 1], ["cobblemon:exp_candy_m", 3]]}, "lines": 20, "name": "Deep Sea", "levels": [30, 50], "hazard": "none", "color": "#1f4e8c", - "rule": {"water": ["minecraft:deep_ocean", "minecraft:deep_lukewarm_ocean"]} + "id": "shallows", + "lines": 30, + "name": "Shallows", + "levels": [ + 5, + 20 + ], + "hazard": "none", + "color": "#5aa9e6", + "rule": { + "water": [ + "minecraft:river", + "minecraft:beach", + "minecraft:ocean", + "minecraft:lukewarm_ocean", + "minecraft:warm_ocean", + "minecraft:deep_ocean", + "minecraft:deep_lukewarm_ocean" + ] + } } ], "caves": [ - {"id": "lush_caves", "types": ["grass", "bug", "fairy", "poison", "water"], "lines": 20, "name": "Lush Caves", "biome": "minecraft:lush_caves", "levels": [12, 28], "hazard": "none"}, - {"id": "dripstone", "types": ["rock", "ground", "steel", "fairy", "psychic", "dragon"], "lines": 20, "name": "Dripstone Depths", "biome": "minecraft:dripstone_caves", "levels": [22, 38], "hazard": "none"}, - {"id": "deep_dark", "types": ["ghost", "dark", "steel", "poison", "psychic", "rock"], "guardian": {"species": "regigigas", "drops": [["cobblemon:icy_rock", 3], ["cobblemon:exp_candy_l", 2]]}, "lines": 21, "name": "Deep Dark", "biome": "minecraft:deep_dark", "levels": [45, 60], "hazard": "darkness (vanilla sculk; no Warden)"}, - {"id": "basalt", "types": ["fire", "rock", "ground", "steel", "dark"], "guardian": {"species": "moltres", "drops": [["cobblemon:exp_candy_xl", 3], ["minecraft:netherite_scrap", 2]]}, "lines": 15, "name": "Basalt Furnace", "biome": "minecraft:basalt_deltas", "levels": [55, 70], "hazard": "heat (Cold Sweat)"} + { + "id": "lush_caves", + "types": [ + "grass", + "bug", + "fairy", + "poison", + "water" + ], + "lines": 20, + "name": "Lush Caves", + "biome": "minecraft:lush_caves", + "levels": [ + 12, + 28 + ], + "hazard": "none" + }, + { + "id": "dripstone", + "types": [ + "rock", + "ground", + "steel", + "fairy", + "psychic", + "dragon" + ], + "lines": 20, + "name": "Dripstone Depths", + "biome": "minecraft:dripstone_caves", + "levels": [ + 22, + 38 + ], + "hazard": "none" + }, + { + "id": "deep_dark", + "types": [ + "ghost", + "dark", + "steel", + "poison", + "psychic", + "rock" + ], + "guardian": { + "species": "regigigas", + "drops": [ + [ + "cobblemon:icy_rock", + 3 + ], + [ + "cobblemon:exp_candy_l", + 2 + ] + ] + }, + "lines": 21, + "name": "Deep Dark", + "biome": "minecraft:deep_dark", + "levels": [ + 45, + 60 + ], + "hazard": "darkness (vanilla sculk; no Warden)" + }, + { + "id": "basalt", + "types": [ + "fire", + "rock", + "ground", + "steel", + "dark" + ], + "guardian": { + "species": "moltres", + "drops": [ + [ + "cobblemon:exp_candy_xl", + 3 + ], + [ + "minecraft:netherite_scrap", + 2 + ] + ] + }, + "lines": 15, + "name": "Basalt Furnace", + "biome": "minecraft:basalt_deltas", + "levels": [ + 55, + 70 + ], + "hazard": "heat (Cold Sweat)" + } ], "homeless": { - "_comment": "Adrian, 2026-11-09: every implemented Pokemon must be obtainable. These lines only spawn in biomes the island doesn't have (savanna, frozen ocean, mushroom fields, ...), or not at all (Rotom). Each gets a home in the zone closest to its habitat, as a rare spawn at the zone's levels, on top of the zone's own lines (tools/zone_spawns.py).", - "bucket": "rare", "weight": 10, + "_comment": "Adrian, 2026-11-09: every implemented Pokemon must be obtainable. These lines only spawn in biomes the island doesn't have (savanna, frozen ocean, mushroom fields, ...), or not at all (Rotom). Each gets a home in the zone closest to its habitat, as a rare spawn at the zone's levels, on top of the zone's own lines (tools/zone_spawns.py). An entry with a form ('vulpix alolan') is a regional form that no line of the island brings (Adrian, 2026-11-09: those must be obtainable too).", + "bucket": "rare", + "weight": 10, "zones": { - "southwold": ["nidoranf", "nidoranm", "smoliv"], - "lush_caves": ["foongus"], - "westmarch": ["dedenne", "emolga", "pineco", "rotom"], - "jungle": ["komala", "pancham", "stufful"], - "dripstone": ["aron"], - "highlands": ["blitzle", "doduo"], - "mire": ["hatenna", "toedscool"], - "sunscorch": ["girafarig", "kangaskhan", "litleo"], - "deep_sea": ["piplup", "seel", "spheal"], - "frostpeak": ["bergmite", "cetoddle", "cubchoo", "eiscue", "stantler", "swinub"], - "deep_dark": ["impidimp", "litwick"], - "basalt": ["charcadet"] + "southwold": [ + "nidoranf", + "nidoranm", + "smoliv", + "meowth galarian", + "zigzagoon galarian" + ], + "lush_caves": [ + "foongus" + ], + "westmarch": [ + "dedenne", + "emolga", + "pineco", + "rotom", + "geodude alolan" + ], + "jungle": [ + "komala", + "pancham", + "stufful", + "slowpoke galarian" + ], + "dripstone": [ + "aron" + ], + "highlands": [ + "blitzle", + "doduo", + "diglett alolan", + "tauros paldean bull_breed=combat" + ], + "mire": [ + "hatenna", + "toedscool", + "tauros paldean bull_breed=aqua", + "stunfisk galarian" + ], + "sunscorch": [ + "girafarig", + "kangaskhan", + "litleo", + "tauros paldean bull_breed=blaze", + "growlithe hisuian" + ], + "deep_sea": [ + "piplup", + "seel", + "spheal" + ], + "frostpeak": [ + "bergmite", + "cetoddle", + "cubchoo", + "eiscue", + "stantler", + "swinub", + "sandshrew alolan", + "vulpix alolan", + "darumaka galarian", + "zorua hisuian" + ], + "deep_dark": [ + "impidimp", + "litwick" + ], + "basalt": [ + "charcadet" + ], + "shallows": [ + "qwilfish hisuian" + ] } }, "dimensions": [ - {"id": "the_end", "name": "The End", "dimension": "minecraft:the_end", "levels": [50, 70], "hazard": "none", - "biome_tags": ["#cobblemon:is_end", "#minecraft:is_end"], - "bucket": "common", "line_weight": 10, "rare_factor": 0.2, - "_comment": "Adrian, 2026-11-02: the End was barren. Every line Cobblemon spawns in End biomes spawns there too, at this band, on top of its island home (tools/zone_spawns.py). Cobblemon has them all uncommon or rare, and it rolls the bucket before the Pokemon, so they move to `bucket`; each line's heaviest entry weighs `line_weight`, Cobblemon's rare ones `rare_factor` of that."} + { + "id": "the_end", + "name": "The End", + "dimension": "minecraft:the_end", + "levels": [ + 50, + 70 + ], + "hazard": "none", + "biome_tags": [ + "#cobblemon:is_end", + "#minecraft:is_end" + ], + "bucket": "common", + "line_weight": 10, + "rare_factor": 0.2, + "_comment": "Adrian, 2026-11-02: the End was barren. Every line Cobblemon spawns in End biomes spawns there too, at this band, on top of its island home (tools/zone_spawns.py). Cobblemon has them all uncommon or rare, and it rolls the bucket before the Pokemon, so they move to `bucket`; each line's heaviest entry weighs `line_weight`, Cobblemon's rare ones `rare_factor` of that." + } ] }