
Icy's Better Horses
Better Horses reworks horses into long-term companions through better traversal, progression, and utility systems.
Список изменений
Icy's Better Horses — 2026-05-19 Change Log
A consolidated summary of every change made today. Mod target: Minecraft 1.21.11 / 26.1.2 (Fabric).
1. New per-horse traits
Each AbstractHorse now persists three new pieces of data in addition to the existing bond:
| Trait | Type | Notes |
|---|---|---|
| Gender | MALE / FEMALE | Synched + saved to NBT. Donkeys/mules also get a gender. |
| Breed | one of 15 breeds, or a species placeholder | Only real horses (Horse.class) use real breeds; donkeys/mules/skeleton/zombie horses get a species label. |
| Mixed-breed flag | boolean | True when a child inherits from two different-breed parents — display gets a (mix) suffix. |
Files: HorseGender.java, HorseBreed.java, IHorseData.java, AbstractHorseMixin.java.
2. Horse Info Screen (P key while mounted)
Pressing P while riding a horse now opens a screen showing the horse's full profile. Pressing P while NOT mounted still whistles other horses as before.
The screen shows:
- Gender
- Breed (with
(mix)suffix if cross-bred) - Coat (color + markings, e.g. Brown + White Field)
- Bond — raw value
X / 100with bar - Speed —
X.X blk/swith bar - Jump —
X.XX blkwith bar - Health —
X.X HPwith bar
Bars are zero-baselined (fill = value / max) and use mod-attainable ceilings derived from the bond multiplier:
| Stat | Min | Max (full bond) |
|---|---|---|
| Speed | 0 blk/s | 25.52 blk/s (0.3375 × 1.75 × 43.2) |
| Jump | 0 blk | 9.50 blk (1.0 × 1.75 × 6 − 1) |
| Health | 0 HP | 30 HP |
Files: HorseInfoScreen.java, IcysBetterHorsesClient.java.
3. Upgraded-saddle HUD now shows Breed + Gender
When you hold the upgraded saddle and look at a horse, the in-world stats HUD shows four lines under the title:
Horse Stats
Gender: <m/f>
Breed: <breed>
Speed: <blk/s>
Jump: <blk>
File: GuiMixin.java.
4. Gender-gated breeding
- A new mixin (
AnimalMixin) makesAnimal.canMatereturn false when both sides areAbstractHorseand share a gender. - If you feed a golden apple to a horse whose neighbor is already in love mode and same gender, the apple is still consumed, love mode is reset on this horse, and the player gets
"These horses are the same gender and can't breed."in chat.
File: AnimalMixin.java, plus the existing fedFood RETURN hook in AbstractHorseMixin.
5. Child inheritance
When two horses successfully breed:
- Gender — random 50/50 for the child.
- Breed —
- Same-breed parents → child gets that breed (no mix suffix).
- Different breeds → child gets one parent's breed at 50/50 + (mix) suffix.
- Cross-species (e.g. horse + donkey) → child gets the appropriate species placeholder.
- Stat inheritance for HP / speed / jump:
child = max(parent1, parent2) + deltadeltais a uniform random in display units:-0.5 to +1.0(HP, blk/s, blk).- Clamped at the vanilla base ceiling (HP 30, raw speed 0.3375, raw jump 1.0) so no amount of breeding can push past the mod-attainable max.
- Coat — re-rolled from the child breed's allowed coat list.
File: AnimalMixin.java.
6. Breed → Coat binding
Each real breed has its own list of allowed vanilla coats (Variant × Markings). Coats follow breed:
- New horses — coat is forced from the breed's allowed list when the horse spawns.
- Pre-existing horses (already in the world before this update) — keep their current coat and the mod infers a breed from that coat. Fallback breed if no match: Mustang.
- Bred children — coat re-rolled from the child's inherited breed.
Mapping:
| Breed | Allowed coats |
|---|---|
| Thoroughbred | Brown · Chestnut · Black · Dark Brown · Brown+White · Chestnut+White |
| Arabian | Gray · Gray+White · White · Chestnut · Brown · Black |
| Quarter | Chestnut · Chestnut+White · Brown · Brown+White · Black+White · Creamy+White |
| Friesian | Black |
| Andalusian | Gray · White · Black · Chestnut |
| Percheron | Gray · Black · White |
| Clydesdale | Brown+White Field · Black+White Field · Dark Brown+White Field · Chestnut+White Field |
| Shire | Black+White Field · Brown+White Field · Gray+White Field · Dark Brown+White Field |
| Belgian | Chestnut · Chestnut+White · Creamy · Creamy+White |
| Icelandic | Chestnut+White Field · Brown+White Field · Black+White · Gray+White Field · Creamy+White Field · Dark Brown+White |
| Mustang | Dark Brown · Brown · Chestnut · Black · Dark Brown+White · Chestnut+White Field |
| Haflinger | Chestnut+White · Chestnut · Creamy+White |
| Morgan | Brown · Chestnut · Black · Dark Brown · Brown+White |
| American Paint | Brown+White Field · Black+White Field · Chestnut+White Field · Dark Brown+White Field · White+White Field · Creamy+White Field |
| Appaloosa | White+Black Dots · Gray+Black Dots · Chestnut+White Dots · Brown+White Dots · Black+White Dots · Dark Brown+White Dots |
Files: HorseBreed.java, HorseAccessor.java (Invoker for Horse.setVariantAndMarkings).
7. Spawn-group same-breed + biome-locked breeds
- Same-breed spawn groups — all horses that spawn together as a natural group share one breed. Implemented by a custom
BhHorseGroupData : SpawnGroupDatathat is passed between siblings insidefinalizeSpawn. - Biome-locked breeds — the breed chosen for a fresh spawn group is picked at random from the list of breeds that are allowed in that biome. If the biome has no entry in the table, fallback to a random breed.
| Breed | Allowed biomes |
|---|---|
| Thoroughbred | Plains · Sunflower Plains · Meadow · Forest · Birch Forest |
| Arabian | Desert · Badlands · Eroded Badlands · Savanna · Savanna Plateau · Windswept Savanna |
| Quarter | Plains · Sunflower Plains · Savanna · Savanna Plateau · Windswept Savanna |
| Friesian | Dark Forest · Forest · Pale Garden · Old Growth Spruce Taiga · Taiga |
| Andalusian | Meadow · Cherry Grove · Flower Forest · Plains · Forest |
| Percheron | Old Growth Spruce Taiga · Forest · Meadow · Plains |
| Clydesdale | Windswept Hills · Windswept Gravelly Hills · Windswept Forest · Old Growth Pine Taiga |
| Shire | Forest · Birch Forest · Old Growth Birch Forest · Windswept Forest · Dark Forest |
| Belgian | Taiga · Old Growth Spruce Taiga · Old Growth Pine Taiga · Forest |
| Icelandic | Snowy Plains · Snowy Taiga · Ice Spikes · Frozen Peaks · Jagged Peaks · Snowy Slopes · Grove |
| Mustang | Plains · Savanna · Windswept Hills · Badlands · Wooded Badlands · Sparse Jungle |
| Haflinger | Snowy Slopes · Grove · Meadow · Frozen Peaks · Jagged Peaks · Stony Peaks |
| Morgan | Plains · Sunflower Plains · Forest · Birch Forest · Meadow |
| American Paint | Plains · Sunflower Plains · Savanna · Sparse Jungle |
| Appaloosa | Plains · Wooded Badlands · Savanna Plateau · Sunflower Plains |
Files: HorseBreed.java, BhHorseGroupData.java, AbstractHorseMixin.java.
8. Translations added
assets/icys-better-horses/lang/en_us.json now contains keys for:
- Info-screen labels:
screen.icys-better-horses.info.{gender,breed,coat,bond,speed,jump,health} - HUD lines:
hud.icys-better-horses.{gender,breed} - Genders:
gender.icys-better-horses.{male,female} - All 15 breeds + 5 species placeholders +
mix_format - Coat colors (7) + markings (4) +
combinedformatter - Message:
message.icys-better-horses.same_gender_breed
9. Mixin registration changes
icys-better-horses.mixins.json now also references:
AnimalMixin(server-side)HorseAccessor(server-side; Invoker)
