Cobblemon Info lives inside the item viewer your pack already uses. It supports REI, JEI, and EMI.
Click a Pokémon to open its Cobblemon Info pages. The idea is simple: when you want to know where something spawns, what it evolves into, or whether it can learn a move, the answer is already in-game.
Pokémon pages
The spawn page shows the conditions behind a spawn instead of just giving you a biome name. That includes level range, time, weather, moon phase, dimension, nearby structures, block and fluid checks, light, Y level, lures, exclusions, and spawn weight.
Evolution pages lay out a family as a tree. Branches, requirements, items, and major form changes are shown together, and you can click through the related Pokémon and items.
There are pages for drops, stats, moves, Pokédex data, flavor text, fossils, type matchups, natures, alternate forms, and riding.
Moves include level-up, egg, tutor, and TM sources. Their tooltips show the usual battle details like type, category, power, accuracy, PP, and description.
The Pokédex data page covers abilities, egg groups, gender ratio, catch rate, friendship, experience data, height, weight, EV yield, and where the species comes from. Form pages keep their own sprites, typing, abilities, and base-stat total, with links to sibling forms.
For rideable Pokémon, Cobblemon Info shows mount style, seats, and the speed, acceleration, skill, jump, and stamina ranges.
Your pack’s data
Cobblemon Info reads Cobblemon content from your current installation. Addon mods, datapacks, ZIP datapacks, form-specific species data, and synced multiplayer data can all appear in the pages.
That matters for modpacks that add their own Pokémon, change spawn rules, or adjust forms and moves.
Looking things up
Search Pokémon through REI, JEI, or EMI as usual.
You can also work backward from an item:
- Open a TM to see which Pokémon learn its move.
- Open a fossil to see what it can revive.
- Open a drop item to see which Pokémon carry it.
Pokémon tooltips can include their Pokédex number and quick counts for spawns, evolutions, drops, and obtainment entries.
Multiplayer and exports
Cobblemon Info runs on your client, including in singleplayer, LAN worlds, and dedicated servers.
For pack documentation or balance work, run:
/cobbledex export
It creates a multi-sheet .xlsx workbook from the data Cobblemon Info has collected.
Icon art by Sunchlax.
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 | ||||
| 2d ago | 1 |
EMI and JEI+EMI support pass: tooltips, duplicate entries, favorites, and a round of reliability
fixes for EMI.
### Fixed
- Pokémon had no tooltip in EMI.** Hovering a Pokémon in the EMI item list or in a recipe page
mod or datapack that added them.
- Every Pokémon appeared twice when JEI and EMI were installed together.** One copy had the
now lives only in EMI, so there is a single entry per Pokémon (TooManyRecipeViewers setups were
affected the same way).
- Hovering a cell in the move-learners and item-droppers grids showed the generic species
tooltip is now shown.
- Pokémon and moves couldn't be favorited or bookmarked in EMI**, and didn't show in EMI's
carry over, since that entry no longer exists.)
- Clicking an evolved or regional form's icon inside a recipe in EMI found no recipes.** Pressing
- In EMI without JEI, pressing U on a TM disc listed the Pokémon for every TM instead of just
- EMI could come up with missing or empty CobbleDex pages after joining a world.** EMI builds the
used the same unprotected cache - when they overlapped, the build could fail and EMI would show
no CobbleDex recipes until the next reload. Each page set is now built once and shared safely.
- EMI could keep showing out-of-date recipes after the dex data changed during a rebuild** (for
built from the older data, so it never refreshed until you relogged. It now refreshes.
- Tall pages got cut off at the bottom in EMI after the window or GUI scale was made smaller.**
screen couldn't show. EMI now re-registers once the new size settles, and only when a page would
really be cut off.
- EMI drew an extra slot frame and hover highlight around Pokémon icons on pages where REI
- Add-on Pokémon didn't show up under their mod in EMI's mod filter** (searching
@modname
or datapack that added them, as in JEI.
### Changed
- With EMI installed, the JEI side of the mod now stays idle instead of building recipes EMI
- Joining a world with EMI no longer does a hidden build-everything pass on the game thread.**
could stall the game for about a second while EMI built the same pages. It now only runs when REI
or JEI is installed, and never waits on a page another thread is already building.
EMI and JEI+EMI support pass: tooltips, duplicate entries, favorites, and a round of reliability
fixes for EMI.
### Fixed
- Pokémon had no tooltip in EMI.** Hovering a Pokémon in the EMI item list or in a recipe page
mod or datapack that added them.
- Every Pokémon appeared twice when JEI and EMI were installed together.** One copy had the
now lives only in EMI, so there is a single entry per Pokémon (TooManyRecipeViewers setups were
affected the same way).
- Hovering a cell in the move-learners and item-droppers grids showed the generic species
tooltip is now shown.
- Pokémon and moves couldn't be favorited or bookmarked in EMI**, and didn't show in EMI's
carry over, since that entry no longer exists.)
- Clicking an evolved or regional form's icon inside a recipe in EMI found no recipes.** Pressing
- In EMI without JEI, pressing U on a TM disc listed the Pokémon for every TM instead of just
- EMI could come up with missing or empty CobbleDex pages after joining a world.** EMI builds the
used the same unprotected cache - when they overlapped, the build could fail and EMI would show
no CobbleDex recipes until the next reload. Each page set is now built once and shared safely.
- EMI could keep showing out-of-date recipes after the dex data changed during a rebuild** (for
built from the older data, so it never refreshed until you relogged. It now refreshes.
- Tall pages got cut off at the bottom in EMI after the window or GUI scale was made smaller.**
screen couldn't show. EMI now re-registers once the new size settles, and only when a page would
really be cut off.
- EMI drew an extra slot frame and hover highlight around Pokémon icons on pages where REI
- Add-on Pokémon didn't show up under their mod in EMI's mod filter** (searching
@modname
or datapack that added them, as in JEI.
### Changed
- With EMI installed, the JEI side of the mod now stays idle instead of building recipes EMI
- Joining a world with EMI no longer does a hidden build-everything pass on the game thread.**
could stall the game for about a second while EMI built the same pages. It now only runs when REI
or JEI is installed, and never waits on a page another thread is already building.
### Fixed
- The "Added by" mod/datapack tag on the Overview page was showing "cobblemon" for every
that figures out which mod ships each species file was tripping over a Java access restriction
and silently failing for every single mod at once - so the dex had no idea any add-on/datapack
content existed at all, and every species fell back to showing the base game as its source. Fixed
by resolving that lookup the correct way; mod/datapack attribution now works again.
### Fixed
- The "Added by" mod/datapack tag on the Overview page was showing "cobblemon" for every
that figures out which mod ships each species file was tripping over a Java access restriction
and silently failing for every single mod at once - so the dex had no idea any add-on/datapack
content existed at all, and every species fell back to showing the base game as its source. Fixed
by resolving that lookup the correct way; mod/datapack attribution now works again.
### Fixed
- JEI opened to the wrong tab by default.** REI and EMI already opened a Pokémon's page on the
JEI - unlike REI/EMI - ignores the order tabs are registered in and sorts them itself. JEI now
opens on Overview like the other two.
- A Pokémon's dark info-card background could cut off the "N form(s)" line at the bottom of the
- The Moves table's Egg/Tutor/TM/Legacy columns all used the same mark**, so there was no way to
(already used elsewhere on the same page), matching the column header.
- Hovering a hidden ability could show "((HA))" with a doubled parenthesis.** It now reads "(Hidden
- A Pokémon with no Pokédex flavor text still showed an empty "Pokédex Entry" tab.** The tab is
- The Overview page's description snippet could cut off mid-sentence with no indication there was
page already handles long entries.
- Renamed the Riding page's "Skill" stat to "Maneuver."** Nothing in Cobblemon's own riding system
code) is turning responsiveness - "Skill" was renamed since it didn't communicate that.
### Fixed
- JEI opened to the wrong tab by default.** REI and EMI already opened a Pokémon's page on the
JEI - unlike REI/EMI - ignores the order tabs are registered in and sorts them itself. JEI now
opens on Overview like the other two.
- A Pokémon's dark info-card background could cut off the "N form(s)" line at the bottom of the
- The Moves table's Egg/Tutor/TM/Legacy columns all used the same mark**, so there was no way to
(already used elsewhere on the same page), matching the column header.
- Hovering a hidden ability could show "((HA))" with a doubled parenthesis.** It now reads "(Hidden
- A Pokémon with no Pokédex flavor text still showed an empty "Pokédex Entry" tab.** The tab is
- The Overview page's description snippet could cut off mid-sentence with no indication there was
page already handles long entries.
- Renamed the Riding page's "Skill" stat to "Maneuver."** Nothing in Cobblemon's own riding system
code) is turning responsiveness - "Skill" was renamed since it didn't communicate that.
### Fixed
- Long pages (Moves, Spawn, Evolution, and more) that used to get cut off at the bottom with no
anymore.
- JEI's search tooltip for a Pokémon could balloon into a huge wall of text that covered the
ability, and region.
- "Source" / "Added by" on the Pokédex pages, and JEI's own "added by" tag, now correctly credit
### Fixed
- Long pages (Moves, Spawn, Evolution, and more) that used to get cut off at the bottom with no
anymore.
- JEI's search tooltip for a Pokémon could balloon into a huge wall of text that covered the
ability, and region.
- "Source" / "Added by" on the Pokédex pages, and JEI's own "added by" tag, now correctly credit
### Fixed
- The shipped sprite atlas was stale for two months (2026-07-07 to 2026-09-16) and never showed
Fungalith Substitute-doll fix) checks against the same constant as the atlas *shipped in the
jar*, and the shipped one was never re-baked to match. It was silently rejected on every load
since, with every player instead depending entirely on their own local bake - no crash, no log
line, nothing to notice. Re-baked and re-committed; a new test (
ShippedAtlasTest) now fails thebuild if the shipped atlas and the loader's required version ever drift apart again.
- Sprite baking failed completely on any Cobblemon version other than the one CobbleDex compiles
call only binds to one of them - so on Cobblemon 1.7.3 (this build targets 1.8.0) every single
sprite capture threw
NoSuchMethodError, silently producing an empty atlas. Sprites don't carewhich Cobblemon version rendered them, so the call is now bound at runtime instead of compile
time and adapts to whichever signature is actually installed.
- A failed sprite bake could permanently hide every shipped sprite and block the automatic
empty) file, which was being treated as good; that alone was enough to make ~1400 Pokémon icons
fall back to Cobblemon's plain item-model rendering instead of CobbleDex's own sprites, with
nothing on screen indicating it wasn't intentional. Sprite sources are now a fallback chain
(shipped atlas, then a local bake for anything the shipped one doesn't cover) instead of one
all-or-nothing pick, so a bad local cache can no longer take shipped sprites away - only fail to
add to them.
- Type chart overrides from rebalance packs (e.g. Project Lazuli) now apply when the pack is
once at launch, before any world existed, and could never see a world's own
datapacks/ folderor anything served by a loader mod like OpenLoader. Type charts are now re-read on world join
through the game's own resolved pack list, which already reflects every source the server
actually loaded - including loader mods that don't exist yet. Singleplayer/LAN only; a remote
server's packs are still unreachable from the client, same as before.
### Added
/cobbledex icons** - reports whether each Pokémon in the browse panel is drawn from
can draw. This is what surfaced the stale-atlas bug above.
/cobbledex datasources** - diffs CobbleDex's data-pack scanning against what the loaded world
the type chart fix addresses.
ShippedAtlasTestandMANUAL_TASKS.mdnow enforce and document the sprite-atlas re-bake step
### Fixed
- The shipped sprite atlas was stale for two months (2026-07-07 to 2026-09-16) and never showed
Fungalith Substitute-doll fix) checks against the same constant as the atlas *shipped in the
jar*, and the shipped one was never re-baked to match. It was silently rejected on every load
since, with every player instead depending entirely on their own local bake - no crash, no log
line, nothing to notice. Re-baked and re-committed; a new test (
ShippedAtlasTest) now fails thebuild if the shipped atlas and the loader's required version ever drift apart again.
- Sprite baking failed completely on any Cobblemon version other than the one CobbleDex compiles
call only binds to one of them - so on Cobblemon 1.7.3 (this build targets 1.8.0) every single
sprite capture threw
NoSuchMethodError, silently producing an empty atlas. Sprites don't carewhich Cobblemon version rendered them, so the call is now bound at runtime instead of compile
time and adapts to whichever signature is actually installed.
- A failed sprite bake could permanently hide every shipped sprite and block the automatic
empty) file, which was being treated as good; that alone was enough to make ~1400 Pokémon icons
fall back to Cobblemon's plain item-model rendering instead of CobbleDex's own sprites, with
nothing on screen indicating it wasn't intentional. Sprite sources are now a fallback chain
(shipped atlas, then a local bake for anything the shipped one doesn't cover) instead of one
all-or-nothing pick, so a bad local cache can no longer take shipped sprites away - only fail to
add to them.
- Type chart overrides from rebalance packs (e.g. Project Lazuli) now apply when the pack is
once at launch, before any world existed, and could never see a world's own
datapacks/ folderor anything served by a loader mod like OpenLoader. Type charts are now re-read on world join
through the game's own resolved pack list, which already reflects every source the server
actually loaded - including loader mods that don't exist yet. Singleplayer/LAN only; a remote
server's packs are still unreachable from the client, same as before.
### Added
/cobbledex icons** - reports whether each Pokémon in the browse panel is drawn from
can draw. This is what surfaced the stale-atlas bug above.
/cobbledex datasources** - diffs CobbleDex's data-pack scanning against what the loaded world
the type chart fix addresses.
ShippedAtlasTestandMANUAL_TASKS.mdnow enforce and document the sprite-atlas re-bake step
### Fixed
- 2.27.0's type chart override scan had an undefined collision order** if two sources both shipped
together) - whichever file the filesystem walk happened to visit last silently won, with no
guarantee that matched what the battle engine actually resolves. Now deterministic (mod jars, then
loose datapacks, then zip datapacks, matching the rest of
JarDataCache's local-file precedence)and logs a warning naming both sources whenever a collision happens, instead of resolving silently.
- Deduplicated the mod-jar/datapack/zip-datapack traversal between the JSON-file scanner
forEachDataFile) and the new text-file scanner added for type chart scripts - both now shareone
collectNamespaceDirs/forEachZipDatapack implementation instead of two near-identical copies.### Added
- New
applyTypeChartOverridesconfig option (on by default) to fall back to the plain vanilla type
parsed wrong for a given pack.
### Fixed
- 2.27.0's type chart override scan had an undefined collision order** if two sources both shipped
together) - whichever file the filesystem walk happened to visit last silently won, with no
guarantee that matched what the battle engine actually resolves. Now deterministic (mod jars, then
loose datapacks, then zip datapacks, matching the rest of
JarDataCache's local-file precedence)and logs a warning naming both sources whenever a collision happens, instead of resolving silently.
- Deduplicated the mod-jar/datapack/zip-datapack traversal between the JSON-file scanner
forEachDataFile) and the new text-file scanner added for type chart scripts - both now shareone
collectNamespaceDirs/forEachZipDatapack implementation instead of two near-identical copies.### Added
- New
applyTypeChartOverridesconfig option (on by default) to fall back to the plain vanilla type
parsed wrong for a given pack.
### Fixed
- Hardened 2.26.13's Evolution/Obtainment/Spawn panel-sizing sample against under-measurement.**
sizeHint those categories use to pick which recipes to actually measure was originally a rawmethod/route/item *count* - a weak proxy, since panel width is driven by *text length*, not item
count (a single long requirement sentence sizes wider than several short ones). Evolution and
Obtainment now weight
sizeHint by the length of their already-resolved display text(
requirementText, obtainment.description/notes) instead, directly targeting the "very longrequirement list" risk the original sizing code warned about. Spawn's proxy still can't avoid this
perfectly without paying back the translation cost 2.26.13 removed, so its sample size grew
16 -> 24 as a wider safety margin.
- Added real regression coverage for 2.26.13's fusion-detection rewrite**, which had none - the code
so nothing previously exercised it. The word-matching logic is now a separately-testable function
(
DerivedDataBuilder.findMentionedSpecies), checked against the exact old per-name-Regex logicacross representative fusion-description shapes (multi-species mentions, punctuation/case
variation, whole-word-boundary edge cases) to confirm the rewrite changed nothing but performance.
### Fixed
- Hardened 2.26.13's Evolution/Obtainment/Spawn panel-sizing sample against under-measurement.**
sizeHint those categories use to pick which recipes to actually measure was originally a rawmethod/route/item *count* - a weak proxy, since panel width is driven by *text length*, not item
count (a single long requirement sentence sizes wider than several short ones). Evolution and
Obtainment now weight
sizeHint by the length of their already-resolved display text(
requirementText, obtainment.description/notes) instead, directly targeting the "very longrequirement list" risk the original sizing code warned about. Spawn's proxy still can't avoid this
perfectly without paying back the translation cost 2.26.13 removed, so its sample size grew
16 -> 24 as a wider safety margin.
- Added real regression coverage for 2.26.13's fusion-detection rewrite**, which had none - the code
so nothing previously exercised it. The word-matching logic is now a separately-testable function
(
DerivedDataBuilder.findMentionedSpecies), checked against the exact old per-name-Regex logicacross representative fusion-description shapes (multi-species mentions, punctuation/case
variation, whole-word-boundary edge cases) to confirm the rewrite changed nothing but performance.
### Added
- REI: all 1000+ Pokémon entries now collapse into one "Cobblemon" group in the item panel**, the
species/form; the search bar still finds individual Pokémon directly, ungrouped. New config toggle
collapsePokemonEntries (default true) to opt back into the flat list. JEI/EMI are unaffected -neither has a native grouping API for the ingredient list.
### Added
- REI: all 1000+ Pokémon entries now collapse into one "Cobblemon" group in the item panel**, the
species/form; the search bar still finds individual Pokémon directly, ungrouped. New config toggle
collapsePokemonEntries (default true) to opt back into the flat list. JEI/EMI are unaffected -neither has a native grouping API for the ingredient list.
### Fixed
- Every Cobblemon move showed up as a blank icon in JEI's ingredient list**, interleaved with real
ItemStack, so they were only ever meant to work as aninvisible lookup key (for the Moves page's "who can learn this move" navigation) - but
registerIngredients() was handing the full move list to JEI's normal register() call, whichalways surfaces every entry in the visible ingredient panel regardless of how it's used elsewhere.
Moves are now registered with an empty ingredient list instead, keeping the invisible-ingredient and
focus-navigation uses (which don't require the list to be non-empty) working exactly as before. REI
and EMI were unaffected - they never added moves to their visible panels in the first place.
### Fixed
- Every Cobblemon move showed up as a blank icon in JEI's ingredient list**, interleaved with real
ItemStack, so they were only ever meant to work as aninvisible lookup key (for the Moves page's "who can learn this move" navigation) - but
registerIngredients() was handing the full move list to JEI's normal register() call, whichalways surfaces every entry in the visible ingredient panel regardless of how it's used elsewhere.
Moves are now registered with an empty ingredient list instead, keeping the invisible-ingredient and
focus-navigation uses (which don't require the list to be non-empty) working exactly as before. REI
and EMI were unaffected - they never added moves to their visible panels in the first place.
### Removed
- Stripped the temporary diagnostic timing added in 2.26.4/2.26.9 (JEI category/recipe registration,
(2.26.7), the accidental O(n^2) in evolution recipes (2.26.6), and the Moves-page layout/validation
cost (2.26.9). No behavior change, just quieter logs.
### Removed
- Stripped the temporary diagnostic timing added in 2.26.4/2.26.9 (JEI category/recipe registration,
(2.26.7), the accidental O(n^2) in evolution recipes (2.26.6), and the Moves-page layout/validation
cost (2.26.9). No behavior change, just quieter logs.
### Changed
- Every species' Moves page was fully laid out just to be measured and validated, never actually
given (the move-learner grid already had a cheap formula; the per-species overview page didn't) -
giving it one closes most of that gap, but
ViewerParityGuard's once-per-load validation passindependently touches every handle's
slots too, and that page's only reason to need the fulllayout there was to read
moveLinks (only actually needed when a player clicks a move name on analready-rendered page).
moveLinks is now its own independently-lazy property, so validation nolonger forces the same expensive build the sizing pass now avoids. Measured (JEI's own diagnostic
timing) at ~742ms saved on a 1400-species pack, cutting
Starting JEI further after 2.26.6/2.26.7'sfixes. No visible change - same pages, same sizes, same click behavior.
### Changed
- Every species' Moves page was fully laid out just to be measured and validated, never actually
given (the move-learner grid already had a cheap formula; the per-species overview page didn't) -
giving it one closes most of that gap, but
ViewerParityGuard's once-per-load validation passindependently touches every handle's
slots too, and that page's only reason to need the fulllayout there was to read
moveLinks (only actually needed when a player clicks a move name on analready-rendered page).
moveLinks is now its own independently-lazy property, so validation nolonger forces the same expensive build the sizing pass now avoids. Measured (JEI's own diagnostic
timing) at ~742ms saved on a 1400-species pack, cutting
Starting JEI further after 2.26.6/2.26.7'sfixes. No visible change - same pages, same sizes, same click behavior.
### Changed
- The shared recipe-build cache (2.26.7) now also covers REI and EMI**, not just JEI. EMI eagerly
buildAllRecipes() directlyinstead of through the shared cache - on a pack running EMI alongside JEI, that meant a *third*
independent build of categories like Moves/Evolution. REI's registration is already lazy for almost
every category (built only when a player opens that category's "view all" page, not at startup) -
wired the two places it does build eagerly (the small
NatureDex special case, and that lazy"view all" build itself) through the same cache too, so whichever viewer builds a category first,
for a given data version, the others reuse it instead of rebuilding.
- Looking up every move's list of learners was re-scanning each learner's entire moveset from
buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() onceper move in the pack (800+) - and for every learner species on every one of those calls, it linearly
rescanned that species' full level-up/TM/egg/tutor/legacy lists just to find the one move being
asked about. Each species' learn-methods are now indexed once (by move name) and reused across every
move that asks about it, instead of being rescanned per move. Same output, same order - just not
redone hundreds of times over for the same species.
### Changed
- The shared recipe-build cache (2.26.7) now also covers REI and EMI**, not just JEI. EMI eagerly
buildAllRecipes() directlyinstead of through the shared cache - on a pack running EMI alongside JEI, that meant a *third*
independent build of categories like Moves/Evolution. REI's registration is already lazy for almost
every category (built only when a player opens that category's "view all" page, not at startup) -
wired the two places it does build eagerly (the small
NatureDex special case, and that lazy"view all" build itself) through the same cache too, so whichever viewer builds a category first,
for a given data version, the others reuse it instead of rebuilding.
- Looking up every move's list of learners was re-scanning each learner's entire moveset from
buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() onceper move in the pack (800+) - and for every learner species on every one of those calls, it linearly
rescanned that species' full level-up/TM/egg/tutor/legacy lists just to find the one move being
asked about. Each species' learn-methods are now indexed once (by move name) and reused across every
move that asks about it, instead of being rescanned per move. Same output, same order - just not
redone hundreds of times over for the same species.
### Changed
- The shared recipe-build cache (2.26.7) now also covers REI and EMI**, not just JEI. EMI eagerly
buildAllRecipes() directlyinstead of through the shared cache - on a pack running EMI alongside JEI, that meant a *third*
independent build of categories like Moves/Evolution. REI's registration is already lazy for almost
every category (built only when a player opens that category's "view all" page, not at startup) -
wired the two places it does build eagerly (the small
NatureDex special case, and that lazy"view all" build itself) through the same cache too, so whichever viewer builds a category first,
for a given data version, the others reuse it instead of rebuilding.
- Looking up every move's list of learners was re-scanning each learner's entire moveset from
buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() onceper move in the pack (800+) - and for every learner species on every one of those calls, it linearly
rescanned that species' full level-up/TM/egg/tutor/legacy lists just to find the one move being
asked about. Each species' learn-methods are now indexed once (by move name) and reused across every
move that asks about it, instead of being rescanned per move. Same output, same order - just not
redone hundreds of times over for the same species.
### Changed
- The shared recipe-build cache (2.26.7) now also covers REI and EMI**, not just JEI. EMI eagerly
buildAllRecipes() directlyinstead of through the shared cache - on a pack running EMI alongside JEI, that meant a *third*
independent build of categories like Moves/Evolution. REI's registration is already lazy for almost
every category (built only when a player opens that category's "view all" page, not at startup) -
wired the two places it does build eagerly (the small
NatureDex special case, and that lazy"view all" build itself) through the same cache too, so whichever viewer builds a category first,
for a given data version, the others reuse it instead of rebuilding.
- Looking up every move's list of learners was re-scanning each learner's entire moveset from
buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() onceper move in the pack (800+) - and for every learner species on every one of those calls, it linearly
rescanned that species' full level-up/TM/egg/tutor/legacy lists just to find the one move being
asked about. Each species' learn-methods are now indexed once (by move name) and reused across every
move that asks about it, instead of being rescanned per move. Same output, same order - just not
redone hundreds of times over for the same species.
### Changed
- Every category's recipes were being built twice on every world join.** JEI's own
addRecipeCategories() calls getWidth()/getHeight() on each category as a sanity check beforeit'll accept it - which resolves to
CategorySizer measuring the category, which builds its fullrecipe list just to measure it.
registerRecipes() then built the exact same list again fromscratch moments later, unaware the first build had just happened. Confirmed via JEI's own
diagnostic timing (2.26.4): "moves" (11104 recipes) was costing ~1.5s in *each* phase - the whole
category, built twice, every join. Both call sites now share one cached build per data version
(
RecipeBuildCache), so whichever asks first pays the cost and the second reuses it.### Changed
- Every category's recipes were being built twice on every world join.** JEI's own
addRecipeCategories() calls getWidth()/getHeight() on each category as a sanity check beforeit'll accept it - which resolves to
CategorySizer measuring the category, which builds its fullrecipe list just to measure it.
registerRecipes() then built the exact same list again fromscratch moments later, unaware the first build had just happened. Confirmed via JEI's own
diagnostic timing (2.26.4): "moves" (11104 recipes) was costing ~1.5s in *each* phase - the whole
category, built twice, every join. Both call sites now share one cached build per data version
(
RecipeBuildCache), so whichever asks first pays the cost and the second reuses it.### Changed
- Building the Evolution category's recipes was accidentally quadratic.**
buildAllEvolutionRecipes()
CobbleDexDataQueries per species instead of sharing one across the whole pass -getFormsOf() caches per-instance, so every one of ~1400 species re-scanned the *entire* specieslist from scratch just to check for mega/gmax-style sibling forms. Measured at ~1.4s of JEI's
~3.7s "registerRecipes" cost on a 1400-species pack (JEI's own diagnostic timing, added in 2.26.4).
Now shares one
CobbleDexDataQueries across the whole build. No behavior change - same recipes,same data, just without redoing the same species scan 1400 times over.
### Changed
- Building the Evolution category's recipes was accidentally quadratic.**
buildAllEvolutionRecipes()
CobbleDexDataQueries per species instead of sharing one across the whole pass -getFormsOf() caches per-instance, so every one of ~1400 species re-scanned the *entire* specieslist from scratch just to check for mega/gmax-style sibling forms. Measured at ~1.4s of JEI's
~3.7s "registerRecipes" cost on a 1400-species pack (JEI's own diagnostic timing, added in 2.26.4).
Now shares one
CobbleDexDataQueries across the whole build. No behavior change - same recipes,same data, just without redoing the same species scan 1400 times over.