All Mods Resource Packs Data Packs Shaders Modpacks Plugins
Cobblemon Info for REI / JEI / EMI

Cobblemon Info for REI / JEI / EMI

by Akkiruk • Downloads: 0 • Followers: 0
Description
Gallery
Changelog
Versions

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
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
2d ago 1
1.21.x
Neoforge
2d ago 1
1.21.x
Fabric
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
showed nothing at all. They now show the same species tooltip as in JEI and REI, including the
mod or datapack that added them.
  • Every Pokémon appeared twice when JEI and EMI were installed together.** One copy had the
recipe tabs but no tooltip, the other had a tooltip but no recipes. With EMI installed, the dex
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 in EMI instead of the per-cell info** ("learns via Legacy TM", "drops 12%"). The per-cell
tooltip is now shown.
  • Pokémon and moves couldn't be favorited or bookmarked in EMI**, and didn't show in EMI's
lookup history. They can now. (Favorites previously made on the duplicate JEI-sourced entry can't
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
R or U on those icons now opens their pages.
  • In EMI without JEI, pressing U on a TM disc listed the Pokémon for every TM instead of just
that move.** Each disc is now its own entry.
  • EMI could come up with missing or empty CobbleDex pages after joining a world.** EMI builds the
dex on its own background thread while the game was measuring pages on the main thread, and both
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
example when a server sync finished mid-load) - it was marked up to date even though it had been
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.**
EMI splits long pages to fit your window when it loads, so shrinking afterwards left pages the
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
shows them bare.** EMI now follows the same slot settings as REI.
  • Add-on Pokémon didn't show up under their mod in EMI's mod filter** (searching @modname
found nothing, because every Pokémon was filed under Cobblemon). They are now filed under the mod
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
discards, which trims load time on large modpacks.
  • Joining a world with EMI no longer does a hidden build-everything pass on the game thread.**
The idle pre-measuring of every category only serves REI and JEI, but it ran for everyone and
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
showed nothing at all. They now show the same species tooltip as in JEI and REI, including the
mod or datapack that added them.
  • Every Pokémon appeared twice when JEI and EMI were installed together.** One copy had the
recipe tabs but no tooltip, the other had a tooltip but no recipes. With EMI installed, the dex
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 in EMI instead of the per-cell info** ("learns via Legacy TM", "drops 12%"). The per-cell
tooltip is now shown.
  • Pokémon and moves couldn't be favorited or bookmarked in EMI**, and didn't show in EMI's
lookup history. They can now. (Favorites previously made on the duplicate JEI-sourced entry can't
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
R or U on those icons now opens their pages.
  • In EMI without JEI, pressing U on a TM disc listed the Pokémon for every TM instead of just
that move.** Each disc is now its own entry.
  • EMI could come up with missing or empty CobbleDex pages after joining a world.** EMI builds the
dex on its own background thread while the game was measuring pages on the main thread, and both
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
example when a server sync finished mid-load) - it was marked up to date even though it had been
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.**
EMI splits long pages to fit your window when it loads, so shrinking afterwards left pages the
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
shows them bare.** EMI now follows the same slot settings as REI.
  • Add-on Pokémon didn't show up under their mod in EMI's mod filter** (searching @modname
found nothing, because every Pokémon was filed under Cobblemon). They are now filed under the mod
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
discards, which trims load time on large modpacks.
  • Joining a world with EMI no longer does a hidden build-everything pass on the game thread.**
The idle pre-measuring of every category only serves REI and JEI, but it ran for everyone and
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
species, on some setups, no matter what actually added it.** On a newer Fabric Loader, the code
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
species, on some setups, no matter what actually added it.** On a newer Fabric Loader, the code
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
Overview tab; JEI opened on Drops (or whichever tab happened to sort first alphabetically), since
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
Alternate Forms tab**, slicing through the middle of the text instead of ending below it.
  • The Moves table's Egg/Tutor/TM/Legacy columns all used the same mark**, so there was no way to
tell which method taught a move without hovering every row. Each method now gets its own symbol
(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
Ability)".
  • A Pokémon with no Pokédex flavor text still showed an empty "Pokédex Entry" tab.** The tab is
gone entirely when there's nothing to show.
  • The Overview page's description snippet could cut off mid-sentence with no indication there was
more.** It now ends with "…" and hovering shows the rest, the same way the full Pokédex Entry
page already handles long entries.
  • Renamed the Riding page's "Skill" stat to "Maneuver."** Nothing in Cobblemon's own riding system
explains what "Skill" means, and its one confirmed effect (found by checking Cobblemon's own
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
Overview tab; JEI opened on Drops (or whichever tab happened to sort first alphabetically), since
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
Alternate Forms tab**, slicing through the middle of the text instead of ending below it.
  • The Moves table's Egg/Tutor/TM/Legacy columns all used the same mark**, so there was no way to
tell which method taught a move without hovering every row. Each method now gets its own symbol
(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
Ability)".
  • A Pokémon with no Pokédex flavor text still showed an empty "Pokédex Entry" tab.** The tab is
gone entirely when there's nothing to show.
  • The Overview page's description snippet could cut off mid-sentence with no indication there was
more.** It now ends with "…" and hovering shows the rest, the same way the full Pokédex Entry
page already handles long entries.
  • Renamed the Riding page's "Skill" stat to "Maneuver."** Nothing in Cobblemon's own riding system
explains what "Skill" means, and its one confirmed effect (found by checking Cobblemon's own
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
way to scroll now split into pages you flip through, in REI, JEI, and EMI - nothing is missing
anymore.
  • JEI's search tooltip for a Pokémon could balloon into a huge wall of text that covered the
Pokémon's own name. It's now a short, focused list: type, riding style, base species, rarity,
ability, and region.
  • "Source" / "Added by" on the Pokédex pages, and JEI's own "added by" tag, now correctly credit
the mod or datapack that actually added a Pokémon instead of always saying Cobblemon.



### Fixed
  • Long pages (Moves, Spawn, Evolution, and more) that used to get cut off at the bottom with no
way to scroll now split into pages you flip through, in REI, JEI, and EMI - nothing is missing
anymore.
  • JEI's search tooltip for a Pokémon could balloon into a huge wall of text that covered the
Pokémon's own name. It's now a short, focused list: type, riding style, base species, rarity,
ability, and region.
  • "Source" / "Added by" on the Pokédex pages, and JEI's own "added by" tag, now correctly credit
the mod or datapack that actually added a Pokémon instead of always saying Cobblemon.



### Fixed
  • The shipped sprite atlas was stale for two months (2026-07-07 to 2026-09-16) and never showed
up as an error.** A version bump meant to force-invalidate *players'* cached atlases (for the
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 the
build 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
against.** Cobblemon's model-drawing method's signature differs release to release, and a direct
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 care
which 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
rebuild that would fix it.** A bake that fails partway still writes a structurally valid (but
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
installed as a per-world datapack, not just when installed as a mod.** The prior scan only ran
once at launch, before any world existed, and could never see a world's own datapacks/ folder
or 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
CobbleDex's own sprite atlas or Cobblemon's item-model fallback, and lists anything neither path
can draw. This is what surfaced the stale-atlas bug above.
  • /cobbledex datasources** - diffs CobbleDex's data-pack scanning against what the loaded world
actually has installed, folder by folder, to catch the same "can't see this pack" class of bug
the type chart fix addresses.
  • ShippedAtlasTest and MANUAL_TASKS.md now enforce and document the sprite-atlas re-bake step
as a required part of ever bumping its version, so this can't regress silently again.



### Fixed
  • The shipped sprite atlas was stale for two months (2026-07-07 to 2026-09-16) and never showed
up as an error.** A version bump meant to force-invalidate *players'* cached atlases (for the
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 the
build 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
against.** Cobblemon's model-drawing method's signature differs release to release, and a direct
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 care
which 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
rebuild that would fix it.** A bake that fails partway still writes a structurally valid (but
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
installed as a per-world datapack, not just when installed as a mod.** The prior scan only ran
once at launch, before any world existed, and could never see a world's own datapacks/ folder
or 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
CobbleDex's own sprite atlas or Cobblemon's item-model fallback, and lists anything neither path
can draw. This is what surfaced the stale-atlas bug above.
  • /cobbledex datasources** - diffs CobbleDex's data-pack scanning against what the loaded world
actually has installed, folder by folder, to catch the same "can't see this pack" class of bug
the type chart fix addresses.
  • ShippedAtlasTest and MANUAL_TASKS.md now enforce and document the sprite-atlas re-bake step
as a required part of ever bumping its version, so this can't regress silently again.



### Fixed
  • 2.27.0's type chart override scan had an undefined collision order** if two sources both shipped
overrides for the same defending type (e.g. two mega_showdown-based rebalance packs installed
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 share
one collectNamespaceDirs/forEachZipDatapack implementation instead of two near-identical copies.

### Added
  • New applyTypeChartOverrides config option (on by default) to fall back to the plain vanilla type
chart even when a mega_showdown-based rebalance pack is installed, in case an override is ever
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
overrides for the same defending type (e.g. two mega_showdown-based rebalance packs installed
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 share
one collectNamespaceDirs/forEachZipDatapack implementation instead of two near-identical copies.

### Added
  • New applyTypeChartOverrides config option (on by default) to fall back to the plain vanilla type
chart even when a mega_showdown-based rebalance pack is installed, in case an override is ever
parsed wrong for a given pack.



### Fixed
  • Hardened 2.26.13's Evolution/Obtainment/Spawn panel-sizing sample against under-measurement.**
The sizeHint those categories use to pick which recipes to actually measure was originally a raw
method/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 long
requirement 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
path depends on Minecraft's translation system, unavailable in this project's plain-JVM unit tests,
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 logic
across 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.**
The sizeHint those categories use to pick which recipes to actually measure was originally a raw
method/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 long
requirement 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
path depends on Minecraft's translation system, unavailable in this project's plain-JVM unit tests,
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 logic
across 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
same way TM discs already collapse into "Cobblemon TMs". Click the group icon to see every
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
same way TM discs already collapse into "Cobblemon TMs". Click the group icon to see every
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
items like TM discs and eggs. Moves have no ItemStack, so they were only ever meant to work as an
invisible 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, which
always 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
items like TM discs and eggs. Moves have no ItemStack, so they were only ever meant to work as an
invisible 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, which
always 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,
CategorySizer build/measure split) now that it's done its job - it found the redundant double-build
(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,
CategorySizer build/measure split) now that it's done its job - it found the redundant double-build
(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
shown.** A page's width/height falls back to building its real layout when nothing cheaper is
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 pass
independently touches every handle's slots too, and that page's only reason to need the full
layout there was to read moveLinks (only actually needed when a player clicks a move name on an
already-rendered page). moveLinks is now its own independently-lazy property, so validation no
longer 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's
fixes. 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
shown.** A page's width/height falls back to building its real layout when nothing cheaper is
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 pass
independently touches every handle's slots too, and that page's only reason to need the full
layout there was to read moveLinks (only actually needed when a player clicks a move name on an
already-rendered page). moveLinks is now its own independently-lazy property, so validation no
longer 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's
fixes. 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
builds every category up front the same way JEI does, but was calling buildAllRecipes() directly
instead 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
scratch, once per move.** buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() once
per 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
builds every category up front the same way JEI does, but was calling buildAllRecipes() directly
instead 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
scratch, once per move.** buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() once
per 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
builds every category up front the same way JEI does, but was calling buildAllRecipes() directly
instead 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
scratch, once per move.** buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() once
per 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
builds every category up front the same way JEI does, but was calling buildAllRecipes() directly
instead 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
scratch, once per move.** buildAllMoveLearnerRecipes() calls buildMoveLearnersForMove() once
per 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 before
it'll accept it - which resolves to CategorySizer measuring the category, which builds its full
recipe list just to measure it. registerRecipes() then built the exact same list again from
scratch 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 before
it'll accept it - which resolves to CategorySizer measuring the category, which builds its full
recipe list just to measure it. registerRecipes() then built the exact same list again from
scratch 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()
built one fresh 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* species
list 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()
built one fresh 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* species
list 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.


Cobblemon Info for REI / JEI / EMI Icon
Download Cobblemon Info for REI / JEI / EMI
Select game version
Select platform