Skip to main content
Version: 3.1 · MC 1.21.1

Changelog

3.1.5​

Fixed​

  • Fabric no longer crashes the server (AbstractMethodError in NativeTrainerBattleService.isCurrentGymTrainer) when a player starts a trainer battle. TrainerEntityRef.isRemoved() / discard() shared names with vanilla final methods, so production Fabric (intermediary names) left them without an implementation. They are now isEntityRemoved() / discardEntity().
  • Same defect in the Gym Linker and controller-link paths: the gym block entities inherited getBlockPos() / getLevel() / setChanged() for ControllerLinkable and GymLinkerInteractable from vanilla, so linking gym blocks on production Fabric would crash the same way. Each block entity now redeclares them so the remapper renames the interfaces to match.
  • Affected Fabric since at least 3.0; NeoForge was unaffected. Added a unit test that rejects any mod interface method satisfied only by an inherited vanilla method, since dev and GameTest runs use Mojang names on both loaders and cannot catch this.

Testing​

  • Dev and GameTest runs use Mojang names on both loaders, which is why both 3.1.x Fabric crashes shipped. Builds now statically link-check the shipped Fabric jar, including the nested Brecher Core, against production (intermediary) Minecraft and dependencies. gameTest and release also run the GameTest suite with that jar on a production Fabric server, against Cobblemon 1.8.0 and 1.8.2. Against the released 3.1.3 and 3.1.4 jars these gates reproduce both crashes.

3.1.4​

Fixed​

  • Fabric no longer crashes at startup ("Critical injection failure" in LegacyItemConditionWrapperAdapterMixin). The mixin's target descriptor names a Minecraft class but was marked remap = false, so production Fabric (intermediary names) never matched it. Affected every Fabric install of 3.1.1 through 3.1.3; NeoForge was unaffected.
  • Added a unit test that rejects unremapped mixins naming Minecraft types, since dev and GameTest runs use Mojang names on both loaders and cannot catch this.

3.1.3​

Compatibility​

  • Qualified Fabric and NeoForge against Cobblemon's 1.8.2 snapshot while retaining the 1.8.0 compile baseline. Both manifests now explicitly accept Cobblemon [1.8.0,1.9.0).
  • Updated the Core dependency and both bundled Core jars to Brecher Core 0.4.3.

3.1.2​

Compatibility​

  • Qualified both loaders on Cobblemon 1.8.1. The build still compiles against the 1.8.0 API and runs development, GameTest, and live-test processes on 1.8.1. The 1.8.2 snapshot changes no API this mod consumes.
  • Both loader manifests now declare Cobblemon 1.8.0 as the minimum (previously 1.7.0, which predates the verified mixin targets).
  • NeoForge now declares Kotlin for Forge 5.10 or newer, which Cobblemon 1.8.1 requires.

Changed​

  • Brecher Core 0.4.2 is now nested inside both loader jars (NeoForge negotiated JarJar in the 0.4.x range, Fabric include), completing the packaging that 3.1.1's README and manifests already described. Core remains declared as a required dependency so an incompatible external copy is still reported.

3.1.1​

Compatibility​

  • Updated to Cobblemon 1.8.0 and Brecher Core 0.4.2 on Minecraft 1.21.1.

3.1.0​

Breaking changes​

  • BrecherCore 0.4.1 is now a required, separately installed mod on both clients and servers. It is declared in both loader manifests and is not bundled inside the Brecher Trainers jars.
  • Raised the network protocol from 9 to 10 for synchronized badge definitions, badge ledgers, and Gym Controller badge configuration. Linked PlayerSync backends must be upgraded in lockstep: an older backend will silently discard the new EarnedBadges player attachment field when it round-trips player data.

Added​

  • Migrated the production Trainer screens and menus to BrecherCore's declarative UI framework with shared responsive layouts on Fabric and NeoForge.
  • Extensible physical gym badges with datapack definitions, resource-pack models, per-gym assignment and operator-bumpable generations, offline completion snapshots, an earned-badge gallery, and operator reissue commands.

3.0.0​

Breaking changes​

  • Raised the network protocol from 6 to 9. Mixed-version clients and servers are rejected during configuration.
  • Replaced whole-registry Badge Box synchronization with request-correlated, server-filtered and sorted pages of 50 entries (hard maximum 100).
  • Removed the RCT and RCT API runtime dependencies, integrations, mixins, and manifest requirements. Trainers now use the first-party BrecherTrainerEntity and native Cobblemon battle actor.
  • Active gym sessions always settle before player data is saved at logout. The former resume-after-relog behavior and settle_sessions_on_logout setting are retired.

Added​

  • STANDALONE, PROXY_AUTHORITY, and PROXY_SATELLITE deployment modes with authority-only mutation and teleport enforcement.
  • League configuration schema 2, immutable installed snapshots, atomic reload, validation diagnostics, migration backups, and future-schema rejection.
  • Tier catalog schema/hash persistence and proxy-login rejection when transferred player data was created against a different catalog.
  • Native versioned trainer templates, standalone legacy JSON/NBT conversion, migration backups, and /trainer migration report.
  • Canonical gym metrics shared by ranking, rewards, commands, and screens.
  • Bounded packet codecs: 4,096 cooldowns, 256 shop trades, and 2,048 purchase history records.
  • Public Badge Box snapshots no longer disclose exact controller or anchor locations; teleport destinations remain server-authoritative.
  • Fabric play payloads preserve connection ordering, and its protocol gate uses a race-free monotonic reply timeout.
  • Challenge and reward-dispenser requests have replay bounds; controller unlink no longer force-loads linked child chunks.
  • Deployment role, configuration schema, catalog identity/hash, and authority status in /league info.

Migration​

  • Unversioned league configuration migrates to schema 2 with a sidecar backup.
  • Existing gym identity, classification, ownership, location, operational state, metrics, and creator rewards migrate idempotently into canonical registry records. Controller block entities retain only live spatial configuration, links, and presentation state.
  • Legacy RCT-shaped trainer resources and spawner NBT are translated without linking third-party classes. The legacy spawner payload is retained through the first successful native save.

See the 3.0 upgrade guide before starting a tracked world.

Support the Community

Help keep our servers running and support future projects!