0.3.0
Compatibility
Changes
[0.3.0] - Individual Animals & Interface Rework
Highlights
- Animal Pens now retain every animal as an individual instead of representing the entire pen with one shared NBT template
- Sheep of different colors retain their own color and produce the correct wool when sheared or killed
- The Animal Pen information screen has been redesigned into a compact, coherent, responsive interface
Added
-
Individual Animal Storage
- Stores complete NBT, health, age, appearance, name, ownership, and variant data for every animal in a pen
- Preserves differently colored sheep and other same-type animal variants in one pen
- Includes migration support for existing count-based Animal Pen saves
- Uses compact client update data so full NBT for all 64 animals is not sent with every visual update
-
Per-Animal Sheep Drops
- Shearing evaluates every stored adult sheep individually
- Mixed-color pens produce the corresponding wool colors rather than copying the front sheep's color
- Wool of matching colors is merged into stacks before being given to the player
- Baby sheep are excluded from shearing
-
Improved Capture Safety
- Prevents players from capturing another player's owned animals
- Prevents capture while an animal is mounted, carrying passengers, or leashed
- Keeps the animal in the world if the captured item cannot be inserted or spawned safely
- Validates captured entity data before deposit or release
- Prevents releasing animals into obstructed spaces
-
Passive Resource Collection
- Empty-hand right-click now collects stored passive resources
- Resource changes synchronize to the Animal Pen screen
- Resource icons in the screen include counts and hover tooltips
Changed
-
Breeding Rework
- Breeding now feeds at most two pairs (2-4 animals) per cycle
- Baby capacity is reserved when food is consumed, preventing deposits from filling those slots mid-cycle
- Full pens no longer consume breeding food without producing offspring
- Breeding creates real offspring NBT from individual parents instead of incrementing a shared adult count
- Stored babies continue growing inside the pen
- Individual vanilla age and post-breeding cooldown values continue ticking while stored
- Breeding timing now uses level game time for consistent server/client progress and unload behavior
-
Combat Rework
- Sneak-attack targets the front animal while ordinary attacks remain available for breaking the pen
- Sneak-attacking an occupied pen no longer progresses block mining
- Damage is calculated from the player's attack-damage attribute and attack strength
- Loot tables receive the actual killed animal and its individual NBT state
-
Tool Interactions
- Bucket interactions dispatch directly to chickens or milkable animals without contradictory messages
- Buckets, bottles, and bowls now use vanilla-style filled-container handling
- Creative-mode interactions no longer consume captured animals or empty containers
- Milking, stewing, shearing, and brushing respect the targeted animal's adult state
- Tool failures are treated as handled pen interactions and no longer fall through to unrelated item behavior
-
Animal Pen Screen
- Replaced the oversized split overlay with one centered, bounded panel
- Added consistent preview, pen status, breeding, and stored-resource cards
- Improved spacing, alignment, typography hierarchy, progress bars, and footer controls
- Added responsive sizing for different window and GUI scales
- Reduced the animal preview size and refreshes it when the front animal changes
- Moved all screen text to localization keys
-
Captured Animal Rendering
- Captured items are cached by entity type and individual NBT instead of entity type alone
- Different sheep colors and other variants now render correctly in inventories, hands, item frames, and as dropped items
- Added a bounded render cache that is cleared when changing worlds
Fixed
- Same-type animals losing or duplicating names, colors, owners, ages, health, and variant data
- Damaged animals using their current health as their permanent maximum health
- Extracting a damaged animal restoring health from an unrelated shared template
- Stale breeding state carrying across extraction, death, or replacement with another species
- Breeding progress and passive resources appearing stale in the client screen
- Passive honey and other generated resources being inaccessible without breaking the pen
- Chicken egg collection showing an incorrect "cannot milk" message first
- Entity loot conditions evaluating against the attacking player instead of the killed animal
- Client and server disagreeing about whether arbitrary held-item interactions succeeded
- Client-only ghost resource drops when an Animal Pen was removed
- Partial inventory insertion potentially duplicating passive resource drops
- Item removal utilities removing incorrect quantities across multiple stacks
- Captured Animal items reusing the first-rendered animal's appearance
- Renderer shadow state remaining disabled after a rendering exception
Technical
- Replaced deprecated item client-extension initialization with
RegisterClientExtensionsEvent - Added per-animal save serialization with backward-compatible legacy migration
- Added compact front-animal serialization for block entity update packets
- Centralized entity validation and safer NBT copying
- Improved render entity cleanup when caches, screens, block entities, or worlds are removed
[0.2.1] - Polish & Improvements
Added
-
GUI Screen Interface
- Detailed Animal Pen screen accessible via Sneak + Right-click (empty hand)
- 3D rotating entity preview with proper scaling and lighting
- Real-time health display with color-coded health bar
- Breeding progress indicator with visual progress bar
- Breeding cooldown timer (minutes:seconds format)
- Passive resource inventory display with item icons
- ClientProxy for handling client-side screen operations
-
Enhanced Sound System
- Ambient animal sounds play periodically from occupied pens
- Distinct feedback sounds for all tool interactions:
- Milking sounds for cows/goats
- Egg collection sounds for chickens
- Honey/honeycomb collection sounds for bees
- Shearing sounds for sheep
- Brushing sounds for armadillos
- Mushroom stew sounds for mooshrooms
- Expanded AnimalSoundUtils with ambient sound mappings
- Volume and pitch variation for more natural audio feedback
-
Breeding Visual Progress
- Heart particles spawn during 3-second breeding process
- Happy villager particles at regular intervals while breeding
- Celebration particles when breeding completes successfully
- Visual progress tracking in both world and GUI
Changed
- Breeding system now only requires feeding 2-4 animals instead of all animals
- Each breeding pair needs 2 food items (one per animal in the pair)
- Breeding progress shown with continuous particle effects
- Improved feedback messaging when insufficient animals/food for breeding
- Block interaction logic refactored for GUI access
- Entity rendering scale increased for better visibility in GUI
Fixed
- Critical: Entity render memory leaks that caused performance degradation over time
- Render entities now properly cached and reused
- Cached entities cleared when entity type changes
- Improved cleanup in AnimalPenRenderer
- Critical: Resource depletion exploit when spam-clicking with tools
- Added proper cooldown enforcement before resource checks
- Prevents item duplication and resource loss
- Breeding timers now properly reset when breeding is not active
- Particle timers synchronized with breeding progress
- Debug logging removed from production code
Technical
- Added ClientProxy for proper client-side operation separation
- Improved NBT data persistence for particle and breeding timers
- Enhanced entity render caching strategy in AnimalPenBlockEntity
- Better separation of client/server logic in block interactions
- New getter methods for GUI data access (breeding progress, cooldown seconds)
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:MEeVjOFS:qodgooH9"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:MEeVjOFS:qodgooH9"
}

