A full UI overhaul, the long-awaited per-pasture settings, and an end-to-end NeoForge port. Everything since 1.5 has been consolidated into one release to mark the shift from "growing helper mod" to "feature-complete platform."
The biggest single addition. Each pasture owner now controls their own working radius and downward-scan reach inside admin-defined caps, plus a new access mode that gates who else can interact with their pasture's UI.
<world>/cobblebase_pasture_settings.json.
Re-clamped automatically when the admin tightens the caps.ownerId (or an
OP) can mutate settings. Server-side BaseManager.canEditPasture revalidates
every C2S packet, so a tampered client can't write.[min, max];
legacy single-value behaviour preserved by defaulting overrides to MAX.RadiusVisible is the new server-side set of pastures whose wireframe is
currently shown. Toggling the Show-Radius button sends a C2S packet; the
server validates ownership and broadcasts the new set to every connected
player. Result: when a pasture owner enables their radius box, every
nearby player sees it simultaneously instead of just themselves. In-memory
only — cleared on server restart, since wireframes are diagnostic, not
world state.
for (y in 0..radius)), which hid apricorns and berries on
cliff-edge or stair-garden trees that grow a few blocks below the
pasture block.radius upward (tall berry bushes,
hanging apricorns), but only belowPastureReach downward — admin- and
owner-configurable, default 6. Enough for stairs and small cliffs;
nowhere near deep enough to drag mons into caves under the base.The admin's Pasture Range slider is now the hard cap for everything an active job does — scan range AND idle wander AND safety-teleport floor. Auras / passive buffs are intentionally exempt so balance-tuned effects keep their JSON-defined reach. The Show-Radius wireframe is now the literal truth of where work happens, not an approximation.
The Pokemon → Pasture sub-tab was rebuilt around three goals: see more rows without scrolling, kill the "ragged silhouette" from variable-width chips, and bring the active-skill stand-out front and centre.
Every chip in the Skills view got rebuilt:
BOTTOM_BAR_H = 14 (was 20). Sub-panels' 18-px dead zone above the
bottom bar is gone.Cobblebase 2.0 ships in full feature parity on NeoForge. Every Fabric panel, packet codec, mixin equivalent, and renderer has a NeoForge counterpart wired through the same common code path. NeoForge users get the same Pasture redesign, Base Settings modal, per-pasture overrides, admin GUI, and Workshop / Hatchery panels.
ItemDisplay entities surviving across restarts are now purged
whenever the world re-loads, matching by display custom-name or by
held ItemStack type. No more pile-up of un-pickupable eggs in the
overworld.JobColors is the single source of truth).
Each job's chip BG, Buffs name colour, and Logs row tint share the
same hue.renderIconByName 16 px) in 14-px rows —
Pokemon are recognisable at a glance instead of a tiny 11-px badge.New UiTokens.kt centralises sizes that used to be scattered across
every panel. Three text scales replace the previous six; row heights,
button heights, cell paddings, and bottom-bar geometry all flow from
one file.
lastScanTime heartbeat updated every tick.escapeLeaves now clears
brain memory every tick (not only on the 1s sweep), has a wider
scan radius, and re-registers leaf blocks dynamically when modded
packs add new ones.PokemonEntity.tick head so we don't fight Cobblemon's sleep state.Cobblebase.LOGGER.info calls have been removed or downgraded to debug.
Server consoles at default log level no longer get the per-scan
Harvester radius readouts or the orphan-egg-purge tally. Errors and
warnings stay informational.
A full UI overhaul, the long-awaited per-pasture settings, and an end-to-end NeoForge port. Everything since 1.5 has been consolidated into one release to mark the shift from "growing helper mod" to "feature-complete platform."
The biggest single addition. Each pasture owner now controls their own working radius and downward-scan reach inside admin-defined caps, plus a new access mode that gates who else can interact with their pasture's UI.
<world>/cobblebase_pasture_settings.json.
Re-clamped automatically when the admin tightens the caps.ownerId (or an
OP) can mutate settings. Server-side BaseManager.canEditPasture revalidates
every C2S packet, so a tampered client can't write.[min, max];
legacy single-value behaviour preserved by defaulting overrides to MAX.RadiusVisible is the new server-side set of pastures whose wireframe is
currently shown. Toggling the Show-Radius button sends a C2S packet; the
server validates ownership and broadcasts the new set to every connected
player. Result: when a pasture owner enables their radius box, every
nearby player sees it simultaneously instead of just themselves. In-memory
only — cleared on server restart, since wireframes are diagnostic, not
world state.
for (y in 0..radius)), which hid apricorns and berries on
cliff-edge or stair-garden trees that grow a few blocks below the
pasture block.radius upward (tall berry bushes,
hanging apricorns), but only belowPastureReach downward — admin- and
owner-configurable, default 6. Enough for stairs and small cliffs;
nowhere near deep enough to drag mons into caves under the base.The admin's Pasture Range slider is now the hard cap for everything an active job does — scan range AND idle wander AND safety-teleport floor. Auras / passive buffs are intentionally exempt so balance-tuned effects keep their JSON-defined reach. The Show-Radius wireframe is now the literal truth of where work happens, not an approximation.
The Pokemon → Pasture sub-tab was rebuilt around three goals: see more rows without scrolling, kill the "ragged silhouette" from variable-width chips, and bring the active-skill stand-out front and centre.
Every chip in the Skills view got rebuilt:
BOTTOM_BAR_H = 14 (was 20). Sub-panels' 18-px dead zone above the
bottom bar is gone.Cobblebase 2.0 ships in full feature parity on NeoForge. Every Fabric panel, packet codec, mixin equivalent, and renderer has a NeoForge counterpart wired through the same common code path. NeoForge users get the same Pasture redesign, Base Settings modal, per-pasture overrides, admin GUI, and Workshop / Hatchery panels.
ItemDisplay entities surviving across restarts are now purged
whenever the world re-loads, matching by display custom-name or by
held ItemStack type. No more pile-up of un-pickupable eggs in the
overworld.JobColors is the single source of truth).
Each job's chip BG, Buffs name colour, and Logs row tint share the
same hue.renderIconByName 16 px) in 14-px rows —
Pokemon are recognisable at a glance instead of a tiny 11-px badge.New UiTokens.kt centralises sizes that used to be scattered across
every panel. Three text scales replace the previous six; row heights,
button heights, cell paddings, and bottom-bar geometry all flow from
one file.
lastScanTime heartbeat updated every tick.escapeLeaves now clears
brain memory every tick (not only on the 1s sweep), has a wider
scan radius, and re-registers leaf blocks dynamically when modded
packs add new ones.PokemonEntity.tick head so we don't fight Cobblemon's sleep state.Cobblebase.LOGGER.info calls have been removed or downgraded to debug.
Server consoles at default log level no longer get the per-scan
Harvester radius readouts or the orphan-egg-purge tally. Errors and
warnings stay informational.
Bug fixes, Legendary Recruiter rework, and species skill rebalancing.
Pokemon with Proficiency 5 Friend Recruiter will now summon random Legendary, Mythical, or Ultra Beast Pokemon instead of regular type-matched species. The legendary summon ignores the recruiter's type — any legendary can appear.
Cooldown: 30 minutes (fixed, not reduced by proficiency). This is intentionally high to prevent legendary spam.
Notification: Players see a special "summoned a Legendary" message with a level-up sound effect.
The [LeafMixin] Pokemon vs leaf at ... isPastureLeaf=... message was still logging at INFO level despite the 1.5.2 debug log cleanup. This was in a Java mixin file that was missed during the Kotlin-only sweep. Now correctly uses LOGGER.debug().
The container detection filter introduced in 1.5.2 (LockableContainerBlockEntity) correctly blocked vanilla non-storage blocks, but modded crafting tables that expose Fabric Transfer API or NeoForge IItemHandler capabilities still passed the secondary check. Added a minimum slot count requirement (>= 9 slots) for modded containers detected via platform APIs. Crafting tables typically have fewer slots and are now excluded.
The Gatherer had no item type filtering — it would pick up any dropped item, including container items (backpacks, shulker boxes) from mods like Traveler's Backpack. When the Gatherer removed the container item entity and the source mod respawned it, an infinite pickup-deposit loop created millions of duplicated items.
Fix: The Gatherer now skips container-type items during pickup. Items are classified as containers if they are Shulker Boxes or contain inventory NBT data (BlockEntityTag, Inventory, or Items components). This prevents the dupe loop while still allowing all normal item pickups.
Five additional LOGGER.info() calls that fired during gameplay (NavigationHelper unstick, GathererExecutor recovery, RecruiterExecutor type map, BaseManager load, PastureLeavesTracker) were demoted to LOGGER.debug(). The production console is now completely clean.
| Change | Type | Impact |
|---|---|---|
| Legendary Recruiter (Prof 5) | Feature | 6 cute legendaries can summon any legendary with 30min cooldown |
| Species rebalancing | Balance | Prof 5 recruiter restricted, Arceus recruiter removed |
| LeafMixin spam | Fix | Zero console spam from leaf collision checks |
| Visual Workbench deposits | Fix | Gatherer ignores small modded inventories (< 9 slots) |
| Traveler's Backpack dupe | Fix | Gatherer skips container-type items |
| Debug log cleanup | Fix | All runtime logs demoted to DEBUG level |

Palworld-style Pokemon base management for Cobblemon. Job system with unique per-Pokemon skills, abilities, and base mechanics.