Cobblemon Catch Rate Display
Wondering whether that Ultra Ball is worth throwing? This shows the catch chance Cobblemon will use before you commit.
In battle, hold a Poké Ball to bring up the HUD. It accounts for the target’s current HP and status, the ball in your hand, turn count, and any special ball rules. Heavy Balls, Timer Balls, Net Balls, and the rest will show what is affecting their odds.
Hold G to compare balls. You’ll see how each one performs against the Pokémon you’re fighting, with the strongest options at the top. Outside battle, point at a wild Pokémon while holding a ball to check it there too.
Use K to hide the HUD. You can move it around the screen or change its colors in config/catchrate-display.json. The mod includes translations for 28 languages.
It runs entirely on your client using data Cobblemon already syncs to you, so servers do not need to install anything.
Compatibility
| Loaders | Fabric, NeoForge |
| Minecraft | 1.21.x |
| Cobblemon | 1.6.0+ |
Fabric needs Fabric API and Fabric Language Kotlin. NeoForge needs KotlinForForge.
Found something wrong? Open an issue on GitHub.
Mod developer? Register your own custom Poké Balls or catch-rate boosts with CatchRateDisplay. See the compat API guide.
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 | ||||
|
R
v1.2.33
|
2d ago | 1 | |||
|
R
v1.2.33
|
2d ago | 1 | |||
|
R
v1.2.32
|
2d ago | 1 | |||
|
R
v1.2.32
|
2d ago | 1 | |||
|
R
v1.2.32
|
2d ago | 1 | |||
|
R
v1.2.32
|
2d ago | 1 | |||
|
R
v1.2.31
|
2d ago | 1 | |||
|
R
v1.2.30
|
2d ago | 1 | |||
|
R
v1.2.30
|
2d ago | 1 | |||
|
R
v1.2.29
|
2d ago | 1 | |||
|
R
v1.2.29
|
2d ago | 1 | |||
|
R
v1.2.28
|
2d ago | 1 | |||
|
R
v1.2.28
|
2d ago | 1 | |||
|
R
v1.2.27
|
2d ago | 1 |
### Fixed
- Timer Ball, Beast Ball, Moon Ball, and Love Ball now calculate correctly on Cobblemon 1.8.1+, while staying accurate for 1.8.0 and earlier.** Cobblemon fixed all four of these in 1.8.1: Timer Ball's formula gained a missing
+1base term, Beast Ball's non-Ultra-Beast penalty (previously a no-op due to commented-out code) now really applies at 0.1×, Moon Ball's gate now checks actual time-of-day instead of a world's total elapsed ticks (previously permanently "open" past the first in-game day), and Love Ball no longer requires a species match just to get the base 2.5× opposite-gender bonus. This mod now detects the running Cobblemon version at runtime and calculates each ball using whichever ruleset is actually loaded, so players on either side of the 1.8.1 boundary see accurate odds. - Completed missing/stale translations across all 25 non-English locales**, found while making the above version-gated fix:
catchrate.ball.love.need_same_specieswas missing from every non-English locale, andcatchrate.ball.moon.gate_closedhad been renamed fromcatchrate.ball.moon.not_nightin English only — every other language was still on the old key with an inaccurate "only works at night" translation.
### Fixed
- Timer Ball, Beast Ball, Moon Ball, and Love Ball now calculate correctly on Cobblemon 1.8.1+, while staying accurate for 1.8.0 and earlier.** Cobblemon fixed all four of these in 1.8.1: Timer Ball's formula gained a missing
+1base term, Beast Ball's non-Ultra-Beast penalty (previously a no-op due to commented-out code) now really applies at 0.1×, Moon Ball's gate now checks actual time-of-day instead of a world's total elapsed ticks (previously permanently "open" past the first in-game day), and Love Ball no longer requires a species match just to get the base 2.5× opposite-gender bonus. This mod now detects the running Cobblemon version at runtime and calculates each ball using whichever ruleset is actually loaded, so players on either side of the 1.8.1 boundary see accurate odds. - Completed missing/stale translations across all 25 non-English locales**, found while making the above version-gated fix:
catchrate.ball.love.need_same_specieswas missing from every non-English locale, andcatchrate.ball.moon.gate_closedhad been renamed fromcatchrate.ball.moon.not_nightin English only — every other language was still on the old key with an inaccurate "only works at night" translation.
### Fixed
- Ditto (and other Transform users) now actually keeps its true catch rate after transforming.** 2.12.1 attempted this by feeding the existing "disguise" fallback earlier, but that fallback's detection (
entity.effects.mockEffect) is set only by Cobblemon's server-side battle interpreter and is never networked to observing clients — it always read as "not disguised" on the client, so the fallback never actually engaged and the every-tick observation kept overwriting the remembered species with whatever was currently visible, including the transformed one. The fix now freezes each battle Pokémon's species the first time it's observed for that battle UUID (write-once, before any Transform can occur) and always prefers that over the live, post-transformspeciesfield, instead of depending on the unusable disguise signal.
### Fixed
- Ditto (and other Transform users) now actually keeps its true catch rate after transforming.** 2.12.1 attempted this by feeding the existing "disguise" fallback earlier, but that fallback's detection (
entity.effects.mockEffect) is set only by Cobblemon's server-side battle interpreter and is never networked to observing clients — it always read as "not disguised" on the client, so the fallback never actually engaged and the every-tick observation kept overwriting the remembered species with whatever was currently visible, including the transformed one. The fix now freezes each battle Pokémon's species the first time it's observed for that battle UUID (write-once, before any Transform can occur) and always prefers that over the live, post-transformspeciesfield, instead of depending on the unusable disguise signal.
### Fixed
- Ditto (and other Transform users) now keep their true catch rate after transforming.** The HUD previously switched to showing the transformed-into Pokémon's name and catch rate as soon as Transform resolved, because the existing "remembered species" fallback (originally built for Illusion) was only ever fed from the HUD-render and capture-throw code paths — both gated on the player holding a Pokéball. If Ditto transformed before a ball was drawn, its true species was never observed and there was nothing to fall back to. The opponent's species is now observed every client tick regardless of held item, so Ditto is always captured in its true form before it can transform.
### Fixed
- Ditto (and other Transform users) now keep their true catch rate after transforming.** The HUD previously switched to showing the transformed-into Pokémon's name and catch rate as soon as Transform resolved, because the existing "remembered species" fallback (originally built for Illusion) was only ever fed from the HUD-render and capture-throw code paths — both gated on the player holding a Pokéball. If Ditto transformed before a ball was drawn, its true species was never observed and there was nothing to fall back to. The opponent's species is now observed every client tick regardless of held item, so Ditto is always captured in its true form before it can transform.
### Added
- Public API for third-party custom balls.** Other mods can now register a
CatchRateBallProviderwithcom.catchrate.api.CatchRateBallRegistry, keyed by their ball item's ownResourceLocation, to teach this mod about a custom Cobblemon ball's multiplier and display reason — no compat work from us required. A registered ball automatically appears in the ball comparison panel whenever the item is installed, and its result takes priority over our own hardcoded compat (e.g. All the Mods balls) for the same ID. Mirrors the existingCatchRateModifierRegistryAPI added in 2.9.1. Previously, an unrecognized custom ball silently showed a flat, likely-wrong 1x multiplier with no indication anything was off.
### Added
- Public API for third-party custom balls.** Other mods can now register a
CatchRateBallProviderwithcom.catchrate.api.CatchRateBallRegistry, keyed by their ball item's ownResourceLocation, to teach this mod about a custom Cobblemon ball's multiplier and display reason — no compat work from us required. A registered ball automatically appears in the ball comparison panel whenever the item is installed, and its result takes priority over our own hardcoded compat (e.g. All the Mods balls) for the same ID. Mirrors the existingCatchRateModifierRegistryAPI added in 2.9.1. Previously, an unrecognized custom ball silently showed a flat, likely-wrong 1x multiplier with no indication anything was off.
### Fixed
- Version detection now actually reads the running Cobblemon jar.** The Cobblemon version check was reading a Kotlin
const val, which the compiler inlines as a literal at build time — this mod always reported whatever version it happened to be compiled against, never what's actually loaded on your game. It's now read via reflection at runtime, so ancient ball behavior (see below) correctly detects mismatched Cobblemon versions instead of assuming the build-time one. - Beast Ball no longer shows a fake penalty.** Non-Ultra-Beast catches showed a 0.1× multiplier; Cobblemon's own penalty modifier for this has been commented out in its source for a long time, so the real behavior is a neutral 1× with no penalty at all.
- Love Ball now requires a species match for any bonus.** It previously gave a 2.5× boost to any opposite-gender wild Pokémon regardless of species — Cobblemon's actual formula requires species to match before any bonus applies (1× otherwise), then 8× for a matching species.
- Nest Ball no longer shows a bonus at exactly level 30.** Cobblemon's condition is a strict "level < 30"; level 30 itself gets no bonus, not the ~1.1× the raw formula would otherwise produce.
- Moon Ball now matches Cobblemon's actual (unintuitive) capture math.** Cobblemon's real guard checks a world's total elapsed ticks against a fixed window near world creation, not the time of day — meaning in any world older than about a day, the real capture calculation applies the moon-phase bonus during the day too. This mod now reflects that instead of gating strictly on nighttime, so displayed odds match what actually happens when you throw the ball.
### Fixed
- Version detection now actually reads the running Cobblemon jar.** The Cobblemon version check was reading a Kotlin
const val, which the compiler inlines as a literal at build time — this mod always reported whatever version it happened to be compiled against, never what's actually loaded on your game. It's now read via reflection at runtime, so ancient ball behavior (see below) correctly detects mismatched Cobblemon versions instead of assuming the build-time one. - Beast Ball no longer shows a fake penalty.** Non-Ultra-Beast catches showed a 0.1× multiplier; Cobblemon's own penalty modifier for this has been commented out in its source for a long time, so the real behavior is a neutral 1× with no penalty at all.
- Love Ball now requires a species match for any bonus.** It previously gave a 2.5× boost to any opposite-gender wild Pokémon regardless of species — Cobblemon's actual formula requires species to match before any bonus applies (1× otherwise), then 8× for a matching species.
- Nest Ball no longer shows a bonus at exactly level 30.** Cobblemon's condition is a strict "level < 30"; level 30 itself gets no bonus, not the ~1.1× the raw formula would otherwise produce.
- Moon Ball now matches Cobblemon's actual (unintuitive) capture math.** Cobblemon's real guard checks a world's total elapsed ticks against a fixed window near world creation, not the time of day — meaning in any world older than about a day, the real capture calculation applies the moon-phase bonus during the day too. This mod now reflects that instead of gating strictly on nighttime, so displayed odds match what actually happens when you throw the ball.
### Fixed
- Compatibility with Cobblemon 1.8.0.** Cobblemon 1.8.0 renamed the Pokédex knowledge states (
CAUGHT→OWNED,NONE→UNREGISTERED). Catch rate and HUD visibility checks now compare by enum name instead of the constant itself, so this build works unmodified on both pre-1.8.0 and 1.8.0+ Cobblemon.
### Fixed
- Compatibility with Cobblemon 1.8.0.** Cobblemon 1.8.0 renamed the Pokédex knowledge states (
CAUGHT→OWNED,NONE→UNREGISTERED). Catch rate and HUD visibility checks now compare by enum name instead of the constant itself, so this build works unmodified on both pre-1.8.0 and 1.8.0+ Cobblemon.
### Fixed
- Dusk Ball used the player's light level instead of the target Pokémon's.** Cobblemon's own Dusk Ball logic samples
getMaxLocalRawBrightnessat the wild/battling Pokémon's block position, not the thrower's, so a player standing in a lit area next to a Pokémon in a dark corner (or vice versa) was seeing the wrong multiplier. Both the battle and overworld context builders now sample light level at the target Pokémon's position. - "Need darkness" no longer hides the actual light level.** The Dusk Ball tooltip now always shows the current light level (e.g. "Need darkness (L12)") instead of a bare "Need darkness" when the bonus isn't active, across all languages.
### Fixed
- Dusk Ball used the player's light level instead of the target Pokémon's.** Cobblemon's own Dusk Ball logic samples
getMaxLocalRawBrightnessat the wild/battling Pokémon's block position, not the thrower's, so a player standing in a lit area next to a Pokémon in a dark corner (or vice versa) was seeing the wrong multiplier. Both the battle and overworld context builders now sample light level at the target Pokémon's position. - "Need darkness" no longer hides the actual light level.** The Dusk Ball tooltip now always shows the current light level (e.g. "Need darkness (L12)") instead of a bare "Need darkness" when the bonus isn't active, across all languages.
### Added
- Public API for third-party catch-rate compat.** Other mods can now register a
CatchRateModifierProviderwithcom.catchrate.api.CatchRateModifierRegistryto add their own catch-rate boosts (e.g. a food or item effect) without needing dedicated compat work from this mod. Each active modifier gets its own row on the HUD and is folded into the displayed percentage the same way ball, status, and level bonuses already are. The HUD looks identical to before when nothing is registered.
### Fixed
- Cleaned up leftover formatting artifacts (stray multiplier text duplicated from the ball line, trailing exclamation marks, leftover placeholder syntax) across the non-English translation files.
### Added
- Public API for third-party catch-rate compat.** Other mods can now register a
CatchRateModifierProviderwithcom.catchrate.api.CatchRateModifierRegistryto add their own catch-rate boosts (e.g. a food or item effect) without needing dedicated compat work from this mod. Each active modifier gets its own row on the HUD and is folded into the displayed percentage the same way ball, status, and level bonuses already are. The HUD looks identical to before when nothing is registered.
### Fixed
- Cleaned up leftover formatting artifacts (stray multiplier text duplicated from the ball line, trailing exclamation marks, leftover placeholder syntax) across the non-English translation files.
### Changed
- Catch rates now come from Cobblemon's own species registry whenever it is trustworthy.** Cobblemon never sends
catchRateover the network, so a client on a dedicated server sees the default 45 for every species — but it also skips its data sync entirely for memory connections, which means singleplayer and LAN hosts keep the real datapack-loaded values. Catch Rate Display now detects this and reads the registry directly in that case, exactly like the Pokedex mods do. Custom species from any datapack or mod resolve correctly regardless of how their files are laid out.
### Fixed
- Park Ball always showed 1x.** It had no bonus logic at all and silently fell through to the generic "no effect" case. It now boosts 2.5x in temperate biomes (forest/plains, matching Cobblemon's own
cobblemon:is_temperatebiome tag), same as vanilla Cobblemon. - Custom/fake Pokemon in non-standard folders now resolve.** The previous file lookup only checked eleven hardcoded
generationNfolders pluscustom/andaddon/inside mod JARs, so a species in any other subfolder silently fell back to a guess — while the same species shipped in a datapack worked, because datapacks were scanned recursively. Mod JARs are now scanned recursively too, so layout no longer matters. species_additionsare now read.** Packs that adjust a catch rate throughdata/<namespace>/species_additions/were previously invisible, leaving the base value on screen.- Species files can no longer collide across packs.** The file index was keyed by bare filename, so two packs shipping the same filename in different namespaces overwrote each other. Entries are now keyed by full
namespace:path, and a datapack correctly outranks a mod JAR for the same species. - Unrelated local worlds could no longer leak into the result.** The local-file fallback (remote-server play) scanned
datapacks/under every save folder on the machine, not just the world being played, so an old test world's datapack could silently outrank the correct value. It now only reads the active world's own datapacks, and skips local saves entirely during genuine remote play. - Same-priority conflicts are now reproducible.** Mod JAR and datapack directory listings weren't guaranteed to come back in a consistent order, so which of two same-rank sources won a conflict on the same species could vary between launches. Listings are now sorted before scanning.
- Classpath fallback no longer risks a render-thread stall.** It could previously run inline before the background file scan finished, doing several file-stream opens on the render thread — the same class of stall the mod-JAR scan was fixed to avoid. It now only runs once the background scan has completed.
### Removed
- Unresolvable catch rates no longer display a fabricated number.** The fallback used to be a hardcoded
3, which is a plausible real catch rate — an unresolved species rendered as a confident ~1% that was indistinguishable from a correct answer. The HUD and comparison panel now show the rate as unknown instead, and never claim GUARANTEED from a value that was never resolved. Ball multipliers, HP and status are still shown, since those remain accurate.
### Added
/catchrate infoand the debug log now report which source is answering lookups and how many species andspecies_additionsare indexed from files./catchrate export-ratesgainedis_knownandregistry_trustedcolumns for comparing resolved values against the registry.
### Known limitation
- A datapack that exists **only** on a remote server still cannot be resolved, because the client has neither the registry values nor the files. Those species now report as unknown rather than showing a wrong number. Fixing this would require a server-side component, which this mod deliberately does not have.
### Changed
- Catch rates now come from Cobblemon's own species registry whenever it is trustworthy.** Cobblemon never sends
catchRateover the network, so a client on a dedicated server sees the default 45 for every species — but it also skips its data sync entirely for memory connections, which means singleplayer and LAN hosts keep the real datapack-loaded values. Catch Rate Display now detects this and reads the registry directly in that case, exactly like the Pokedex mods do. Custom species from any datapack or mod resolve correctly regardless of how their files are laid out.
### Fixed
- Park Ball always showed 1x.** It had no bonus logic at all and silently fell through to the generic "no effect" case. It now boosts 2.5x in temperate biomes (forest/plains, matching Cobblemon's own
cobblemon:is_temperatebiome tag), same as vanilla Cobblemon. - Custom/fake Pokemon in non-standard folders now resolve.** The previous file lookup only checked eleven hardcoded
generationNfolders pluscustom/andaddon/inside mod JARs, so a species in any other subfolder silently fell back to a guess — while the same species shipped in a datapack worked, because datapacks were scanned recursively. Mod JARs are now scanned recursively too, so layout no longer matters. species_additionsare now read.** Packs that adjust a catch rate throughdata/<namespace>/species_additions/were previously invisible, leaving the base value on screen.- Species files can no longer collide across packs.** The file index was keyed by bare filename, so two packs shipping the same filename in different namespaces overwrote each other. Entries are now keyed by full
namespace:path, and a datapack correctly outranks a mod JAR for the same species. - Unrelated local worlds could no longer leak into the result.** The local-file fallback (remote-server play) scanned
datapacks/under every save folder on the machine, not just the world being played, so an old test world's datapack could silently outrank the correct value. It now only reads the active world's own datapacks, and skips local saves entirely during genuine remote play. - Same-priority conflicts are now reproducible.** Mod JAR and datapack directory listings weren't guaranteed to come back in a consistent order, so which of two same-rank sources won a conflict on the same species could vary between launches. Listings are now sorted before scanning.
- Classpath fallback no longer risks a render-thread stall.** It could previously run inline before the background file scan finished, doing several file-stream opens on the render thread — the same class of stall the mod-JAR scan was fixed to avoid. It now only runs once the background scan has completed.
### Removed
- Unresolvable catch rates no longer display a fabricated number.** The fallback used to be a hardcoded
3, which is a plausible real catch rate — an unresolved species rendered as a confident ~1% that was indistinguishable from a correct answer. The HUD and comparison panel now show the rate as unknown instead, and never claim GUARANTEED from a value that was never resolved. Ball multipliers, HP and status are still shown, since those remain accurate.
### Added
/catchrate infoand the debug log now report which source is answering lookups and how many species andspecies_additionsare indexed from files./catchrate export-ratesgainedis_knownandregistry_trustedcolumns for comparing resolved values against the registry.
### Known limitation
- A datapack that exists **only** on a remote server still cannot be resolved, because the client has neither the registry values nor the files. Those species now report as unknown rather than showing a wrong number. Fixing this would require a server-side component, which this mod deliberately does not have.
### Fixed
- Catch rates no longer get stuck after switching your active Pokemon.** The 2.8.23 caching change only invalidated on target, held ball, HP, and status changes, so inputs that come from your own side of the battle never triggered a refresh. Switching party members now updates Love Ball and Level Ball rates immediately.
- Turn-dependent balls now update every turn.** Timer Ball and Quick Ball rates were held in the cache across turn advances and Quick Ball bonus consumption; both are now part of the cache key.
- Form changes, aspect changes, and water state now refresh the HUD.** Mega evolution, form swaps, and the player entering or leaving water previously kept a stale rate on screen.
- Cached rates now expire after 500ms as a backstop.** Inputs too expensive to sample every frame (target underwater state, light level, late Pokedex sync, external catch-rate buffs) can no longer leave a stale rate on screen indefinitely.
### Fixed
- Catch rates no longer get stuck after switching your active Pokemon.** The 2.8.23 caching change only invalidated on target, held ball, HP, and status changes, so inputs that come from your own side of the battle never triggered a refresh. Switching party members now updates Love Ball and Level Ball rates immediately.
- Turn-dependent balls now update every turn.** Timer Ball and Quick Ball rates were held in the cache across turn advances and Quick Ball bonus consumption; both are now part of the cache key.
- Form changes, aspect changes, and water state now refresh the HUD.** Mega evolution, form swaps, and the player entering or leaving water previously kept a stale rate on screen.
- Cached rates now expire after 500ms as a backstop.** Inputs too expensive to sample every frame (target underwater state, light level, late Pokedex sync, external catch-rate buffs) can no longer leave a stale rate on screen indefinitely.
### Changed
- Reduced redundant HUD recalculation.** In-battle single-ball catch calculations now stay cached until the target, held ball, HP, or status actually changes instead of being refreshed on a fixed timer.
- Reduced redundant comparison-panel recalculation.** Battle and wild comparison panels now rebuild only when relevant catch-state inputs change, which cuts repeated per-ball multiplier and percentage work while the panel is held open.
- Cached localized ball display names.** Ball-name translation results are now memoized instead of being rebuilt every comparison refresh.
### Changed
- Reduced redundant HUD recalculation.** In-battle single-ball catch calculations now stay cached until the target, held ball, HP, or status actually changes instead of being refreshed on a fixed timer.
- Reduced redundant comparison-panel recalculation.** Battle and wild comparison panels now rebuild only when relevant catch-state inputs change, which cuts repeated per-ball multiplier and percentage work while the panel is held open.
- Cached localized ball display names.** Ball-name translation results are now memoized instead of being rebuilt every comparison refresh.
### Fixed
- Form-specific catch rates now override the base species rate in the HUD and ball comparison panel.** Catch Rate Display now resolves the active form from visible aspects and applies local JSON
forms[].catchRateoverrides instead of always using the top-level species catch rate, which fixes false guarantees like Meteor-form Minior being shown as 255 catch rate instead of its real 30.
### Fixed
- Form-specific catch rates now override the base species rate in the HUD and ball comparison panel.** Catch Rate Display now resolves the active form from visible aspects and applies local JSON
forms[].catchRateoverrides instead of always using the top-level species catch rate, which fixes false guarantees like Meteor-form Minior being shown as 255 catch rate instead of its real 30.
### Fixed
- Dive Ball battle catch rates now follow Cobblemon's actual target-entity check.** Decompiling Cobblemon 1.7.3 confirmed Dive Ball uses the wild Pokemon entity's
isUnderWater()state, not the thrower's/player's water state, so in-battle HUD and comparison rates now resolve the active wild battle entity before applying the 3.5x bonus.
### Fixed
- Dive Ball battle catch rates now follow Cobblemon's actual target-entity check.** Decompiling Cobblemon 1.7.3 confirmed Dive Ball uses the wild Pokemon entity's
isUnderWater()state, not the thrower's/player's water state, so in-battle HUD and comparison rates now resolve the active wild battle entity before applying the 3.5x bonus.
### Fixed
- Soul Lava Ball reason text no longer claims a capture effect.** The ATM Soul Lava balls still use their real Fire/Water conditional multipliers, but the HUD and comparison panel no longer show the generic
Special effect on capturelabel for them. - Unobtainium ball wording stays aligned with other real capture-effect balls.** The ATM Unobtainium balls keep the same generic capture-effect wording path used by Heal Ball, since upstream actually gives them Cobblemon's
FULL_RESTOREcapture effect.
### Fixed
- Soul Lava Ball reason text no longer claims a capture effect.** The ATM Soul Lava balls still use their real Fire/Water conditional multipliers, but the HUD and comparison panel no longer show the generic
Special effect on capturelabel for them. - Unobtainium ball wording stays aligned with other real capture-effect balls.** The ATM Unobtainium balls keep the same generic capture-effect wording path used by Heal Ball, since upstream actually gives them Cobblemon's
FULL_RESTOREcapture effect.
### Added
- Added optional AllTheMons custom ball compatibility.** Catch Rate Display now recognizes supported AllTheMons balls by item ID without adding a hard dependency, applies their custom multipliers in the shared ball calculator, and only adds them to the comparison panel when those item IDs actually exist in the loaded item registry.
### Added
- Added optional AllTheMons custom ball compatibility.** Catch Rate Display now recognizes supported AllTheMons balls by item ID without adding a hard dependency, applies their custom multipliers in the shared ball calculator, and only adds them to the comparison panel when those item IDs actually exist in the loaded item registry.