Variants

Variants allow you to customize the appearance and spawn conditions of various entities and paintings in Minecraft. Kore provides type-safe DSL builders for creating custom variants for cats, cows, chickens, frogs, pigs, wolves, zombie nautiluses, paintings and decorated pot patterns.

Entity Variants

Spawn Conditions

Most entity variants support spawn conditions that control when and where the variant appears. Available condition types:

  • add(priority): Base condition with just a priority
  • biome(priority, biomes...): Spawn in specific biomes or biome tags
  • moonBrightness(priority, value): Spawn based on moon brightness (single value)
  • moonBrightness(priority, min, max): Spawn based on moon brightness (range)
  • structures(priority, structures...): Spawn near specific structures or structure tags

Higher priority values take precedence when multiple conditions match.

Cat Variants

Cat variants define the texture and spawn conditions for cats. You can specify biomes, moon brightness, and structures as spawn conditions.

The game requires a kitten texture too. babyAssetId defaults to the adult texture suffixed with _baby, the vanilla naming, so only pass it when your kitten texture is named differently. Cow, chicken and pig variants work the same way.

catVariant("test_cat_variant", Textures.Entity.Cat.CAT_TABBY) {
	spawnConditions {
		add(10)
		biome(5, Biomes.PLAINS)
		biome(2, Tags.Worldgen.Biome.IS_OVERWORLD)
		moonBrightness(1, 1.0)
		moonBrightness(1, 0.5, 0.75)
		structures(0, ConfiguredStructures.VILLAGE_PLAINS)
	}
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:entity/cat/cat_tabby",
	"baby_asset_id": "minecraft:entity/cat/cat_tabby_baby",
	"spawn_conditions": [
		{
			"priority": 10
		},
		{
			"priority": 5,
			"condition": {
				"type": "minecraft:biome",
				"biomes": "minecraft:plains"
			}
		},
		{
			"priority": 2,
			"condition": {
				"type": "minecraft:biome",
				"biomes": "#minecraft:is_overworld"
			}
		},
		{
			"priority": 1,
			"condition": {
				"type": "minecraft:moon_brightness",
				"range": 1.0
			}
		},
		{
			"priority": 1,
			"condition": {
				"type": "minecraft:moon_brightness",
				"range": {
					"min": 0.5,
					"max": 0.75
				}
			}
		},
		{
			"priority": 0,
			"condition": {
				"type": "minecraft:structure",
				"structures": "minecraft:village_plains"
			}
		}
	]
}
JSON

Cow Variants

Cow variants define the texture, model, and spawn conditions for cows.

cowVariant("test_cow_variant", Textures.Entity.Cow.COW_COLD, CowModel.COLD) {
	spawnConditions {
		structures(0, Tags.Worldgen.Structure.MINESHAFT)
	}
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:entity/cow/cow_cold",
	"baby_asset_id": "minecraft:entity/cow/cow_cold_baby",
	"model": "cold",
	"spawn_conditions": [
		{
			"priority": 0,
			"condition": {
				"type": "minecraft:structure",
				"structures": "#minecraft:mineshaft"
			}
		}
	]
}
JSON

Chicken Variants

Chicken variants define the texture, model, and spawn conditions for chickens.

chickenVariant("test_chicken_variant", Textures.Entity.Chicken.CHICKEN_TEMPERATE, ChickenModel.NORMAL) {
	spawnConditions {
		structures(0, Tags.Worldgen.Structure.VILLAGE)
	}
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:entity/chicken/chicken_temperate",
	"baby_asset_id": "minecraft:entity/chicken/chicken_temperate_baby",
	"model": "normal",
	"spawn_conditions": [
		{
			"priority": 0,
			"condition": {
				"type": "minecraft:structure",
				"structures": "#minecraft:village"
			}
		}
	]
}
JSON

Frog Variants

Frog variants define the texture and spawn conditions for frogs.

frogVariant("test_frog_variant", Textures.Entity.Frog.FROG_TEMPERATE) {
	spawnConditions {
		add(10)
		biome(5, Biomes.SNOWY_PLAINS)
		biome(2, Tags.Worldgen.Biome.SPAWNS_COLD_VARIANT_FROGS)
		moonBrightness(1, 1.0)
		moonBrightness(1, 0.5, 0.75)
		structures(0, ConfiguredStructures.END_CITY)
	}
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:entity/frog/frog_temperate",
	"spawn_conditions": [
		{
			"priority": 10
		},
		{
			"priority": 5,
			"condition": {
				"type": "minecraft:biome",
				"biomes": "minecraft:snowy_plains"
			}
		},
		{
			"priority": 2,
			"condition": {
				"type": "minecraft:biome",
				"biomes": "#minecraft:spawns_cold_variant_frogs"
			}
		},
		{
			"priority": 1,
			"condition": {
				"type": "minecraft:moon_brightness",
				"range": 1.0
			}
		},
		{
			"priority": 1,
			"condition": {
				"type": "minecraft:moon_brightness",
				"range": {
					"min": 0.5,
					"max": 0.75
				}
			}
		},
		{
			"priority": 0,
			"condition": {
				"type": "minecraft:structure",
				"structures": "minecraft:end_city"
			}
		}
	]
}
JSON

Pig Variants

Pig variants define the texture, model, and spawn conditions for pigs.

pigVariant("test_pig_variant", Textures.Entity.Pig.PIG_COLD, PigModel.COLD) {
	spawnConditions {
		structures(0, Tags.Worldgen.Structure.ON_TREASURE_MAPS)
	}
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:entity/pig/pig_cold",
	"baby_asset_id": "minecraft:entity/pig/pig_cold_baby",
	"model": "cold",
	"spawn_conditions": [
		{
			"priority": 0,
			"condition": {
				"type": "minecraft:structure",
				"structures": "#minecraft:on_treasure_maps"
			}
		}
	]
}
JSON

Wolf Variants

Wolf variants define separate textures for angry, tame, and wild states, for adults and puppies, along with spawn conditions. The puppy textures are required by the game and default to the vanilla ones.

wolfVariant("test_wolf_variant") {
	assets(
		angry = Textures.Entity.Wolf.WOLF_STRIPED,
		tame = Textures.Entity.Wolf.WOLF_RUSTY_ANGRY,
		wild = Textures.Entity.Wolf.WOLF_BLACK,
	)
	babyAssets(
		angry = Textures.Entity.Wolf.WOLF_BLACK_ANGRY_BABY,
		tame = Textures.Entity.Wolf.WOLF_BLACK_TAME_BABY,
		wild = Textures.Entity.Wolf.WOLF_BLACK_BABY,
	)
	spawnConditions {
		biome(5, Biomes.OCEAN, Biomes.SNOWY_SLOPES)
	}
}
Kotlin

Produces JSON:

{
	"assets": {
		"angry": "minecraft:entity/wolf/wolf_striped",
		"tame": "minecraft:entity/wolf/wolf_rusty_angry",
		"wild": "minecraft:entity/wolf/wolf_black"
	},
	"baby_assets": {
		"angry": "minecraft:entity/wolf/wolf_black_angry_baby",
		"tame": "minecraft:entity/wolf/wolf_black_tame_baby",
		"wild": "minecraft:entity/wolf/wolf_black_baby"
	},
	"spawn_conditions": [
		{
			"priority": 5,
			"condition": {
				"type": "minecraft:biome",
				"biomes": [
					"minecraft:ocean",
					"minecraft:snowy_slopes"
				]
			}
		}
	]
}
JSON

Zombie Nautilus Variants

Zombie nautilus variants define the texture, model, and spawn conditions for zombie nautiluses.

zombieNautilusVariant(
	"test_zombie_nautilus_variant",
	Textures.Entity.Nautilus.ZOMBIE_NAUTILUS_CORAL,
	ZombieNautilusModel.WARM,
) {
	spawnConditions {
		structures(0, Tags.Worldgen.Structure.ON_TREASURE_MAPS)
	}
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:entity/nautilus/zombie_nautilus_coral",
	"model": "warm",
	"spawn_conditions": [
		{
			"priority": 0,
			"condition": {
				"type": "minecraft:structure",
				"structures": "#minecraft:on_treasure_maps"
			}
		}
	]
}
JSON

Sound Variants

Cat Sound Variants

Cat sound variants define custom sounds for cats. Sounds are split into adultSounds and babySounds, both required by the game. When babySounds is left unset, Kore writes adultSounds in its place.

catSoundVariant("funny") {
	adultSounds {
		ambientSound = SoundEvents.Entity.Cat.AMBIENT
		begForFoodSound = SoundEvents.Entity.Cat.BEG_FOR_FOOD
		deathSound = SoundEvents.Entity.Cat.DEATH
		eatSound = SoundEvents.Entity.Cat.EAT
		hissSound = SoundEvents.Entity.Cat.HISS
		hurtSound = SoundEvents.Entity.Cat.HURT
		purreowSound = SoundEvents.Entity.Cat.PURREOW
		purrSound = SoundEvents.Entity.Cat.PURR
		strayAmbientSound = SoundEvents.Entity.Cat.STRAY_AMBIENT
	}
}
Kotlin

Produces JSON:

{
  "adult_sounds": {
    "ambient_sound": "minecraft:entity.cat.ambient",
    "beg_for_food_sound": "minecraft:entity.cat.beg_for_food",
    "death_sound": "minecraft:entity.cat.death",
    "eat_sound": "minecraft:entity.cat.eat",
    "hiss_sound": "minecraft:entity.cat.hiss",
    "hurt_sound": "minecraft:entity.cat.hurt",
    "purreow_sound": "minecraft:entity.cat.purreow",
    "purr_sound": "minecraft:entity.cat.purr",
    "stray_ambient_sound": "minecraft:entity.cat.stray_ambient"
  },
  "baby_sounds": {
    "ambient_sound": "minecraft:entity.cat.ambient",
    "beg_for_food_sound": "minecraft:entity.cat.beg_for_food",
    "death_sound": "minecraft:entity.cat.death",
    "eat_sound": "minecraft:entity.cat.eat",
    "hiss_sound": "minecraft:entity.cat.hiss",
    "hurt_sound": "minecraft:entity.cat.hurt",
    "purreow_sound": "minecraft:entity.cat.purreow",
    "purr_sound": "minecraft:entity.cat.purr",
    "stray_ambient_sound": "minecraft:entity.cat.stray_ambient"
  }
}
JSON

Chicken Sound Variants

Chicken sound variants define custom sounds for chickens. Sounds are split into adultSounds and babySounds, both required by the game. When babySounds is left unset, Kore writes adultSounds in its place.

chickenSoundVariant("clucky") {
	adultSounds {
		ambientSound = SoundEvents.Entity.Chicken.AMBIENT
		deathSound = SoundEvents.Entity.Chicken.DEATH
		hurtSound = SoundEvents.Entity.Chicken.HURT
		stepSound = SoundEvents.Entity.Chicken.STEP
	}
}
Kotlin

Produces JSON:

{
  "adult_sounds": {
    "ambient_sound": "minecraft:entity.chicken.ambient",
    "death_sound": "minecraft:entity.chicken.death",
    "hurt_sound": "minecraft:entity.chicken.hurt",
    "step_sound": "minecraft:entity.chicken.step"
  },
  "baby_sounds": {
    "ambient_sound": "minecraft:entity.chicken.ambient",
    "death_sound": "minecraft:entity.chicken.death",
    "hurt_sound": "minecraft:entity.chicken.hurt",
    "step_sound": "minecraft:entity.chicken.step"
  }
}
JSON

Cow Sound Variants

Cow sound variants define custom sounds for cows. Unlike other sound variants, cows use a flat structure without age-group nesting.

cowSoundVariant("moody") {
	ambientSound = SoundEvents.Entity.Cow.AMBIENT
	deathSound = SoundEvents.Entity.Cow.DEATH
	hurtSound = SoundEvents.Entity.Cow.HURT
	stepSound = SoundEvents.Entity.Cow.STEP
}
Kotlin

Produces JSON:

{
  "ambient_sound": "minecraft:entity.cow.ambient",
  "death_sound": "minecraft:entity.cow.death",
  "hurt_sound": "minecraft:entity.cow.hurt",
  "step_sound": "minecraft:entity.cow.step"
}
JSON

Pig Sound Variants

Pig sound variants define custom sounds for pigs. Sounds are split into adultSounds and babySounds, both required by the game. When babySounds is left unset, Kore writes adultSounds in its place.

pigSoundVariant("oinking") {
	adultSounds {
		ambientSound = SoundEvents.Entity.Pig.AMBIENT
		deathSound = SoundEvents.Entity.Pig.DEATH
		eatSound = SoundEvents.Entity.Pig.AMBIENT
		hurtSound = SoundEvents.Entity.Pig.HURT
		stepSound = SoundEvents.Entity.Pig.STEP
	}
}
Kotlin

Produces JSON:

{
  "adult_sounds": {
    "ambient_sound": "minecraft:entity.pig.ambient",
    "death_sound": "minecraft:entity.pig.death",
    "eat_sound": "minecraft:entity.pig.ambient",
    "hurt_sound": "minecraft:entity.pig.hurt",
    "step_sound": "minecraft:entity.pig.step"
  },
  "baby_sounds": {
    "ambient_sound": "minecraft:entity.pig.ambient",
    "death_sound": "minecraft:entity.pig.death",
    "eat_sound": "minecraft:entity.pig.ambient",
    "hurt_sound": "minecraft:entity.pig.hurt",
    "step_sound": "minecraft:entity.pig.step"
  }
}
JSON

Wolf Sound Variants

Wolf sound variants define custom sounds for wolves. Sound variants are independent of color variants and spawning biome. Wolves make the sounds associated with their variant when they bark, pant, whine, growl, step, die, or get hurt.

Sounds are split into adultSounds and babySounds, both required by the game. When babySounds is left unset, Kore writes adultSounds in its place.

wolfSoundVariant("funny") {
	adultSounds {
		ambientSound = SoundEvents.Entity.Pig.AMBIENT
		deathSound = SoundEvents.Entity.Creeper.DEATH
		growlSound = SoundEvents.Entity.Player.LEVELUP
		hurtSound = SoundEvents.Entity.Zombie.HURT
		pantSound = SoundEvents.Entity.EnderDragon.FLAP
		whineSound = SoundEvents.Entity.Cat.PURR
	}
}
Kotlin

Produces JSON:

{
  "adult_sounds": {
    "ambient_sound": "minecraft:entity.pig.ambient",
    "death_sound": "minecraft:entity.creeper.death",
    "growl_sound": "minecraft:entity.player.levelup",
    "hurt_sound": "minecraft:entity.zombie.hurt",
    "pant_sound": "minecraft:entity.ender_dragon.flap",
    "step_sound": "minecraft:entity.wolf.step",
    "whine_sound": "minecraft:entity.cat.purr"
  },
  "baby_sounds": {
    "ambient_sound": "minecraft:entity.pig.ambient",
    "death_sound": "minecraft:entity.creeper.death",
    "growl_sound": "minecraft:entity.player.levelup",
    "hurt_sound": "minecraft:entity.zombie.hurt",
    "pant_sound": "minecraft:entity.ender_dragon.flap",
    "step_sound": "minecraft:entity.wolf.step",
    "whine_sound": "minecraft:entity.cat.purr"
  }
}
JSON

With separate baby sounds:

wolfSoundVariant("funny") {
	adultSounds {
		ambientSound = SoundEvents.Entity.Wolf.AMBIENT
		deathSound = SoundEvents.Entity.Wolf.DEATH
		growlSound = SoundEvents.Entity.Wolf.GROWL
		hurtSound = SoundEvents.Entity.Wolf.HURT
		pantSound = SoundEvents.Entity.Wolf.PANT
		whineSound = SoundEvents.Entity.Wolf.WHINE
	}
	babySounds {
		ambientSound = SoundEvents.Entity.Pig.AMBIENT
		deathSound = SoundEvents.Entity.Pig.DEATH
		hurtSound = SoundEvents.Entity.Pig.HURT
	}
}
Kotlin

Produces JSON:

{
  "adult_sounds": {
    "ambient_sound": "minecraft:entity.wolf.ambient",
    "death_sound": "minecraft:entity.wolf.death",
    "growl_sound": "minecraft:entity.wolf.growl",
    "hurt_sound": "minecraft:entity.wolf.hurt",
    "pant_sound": "minecraft:entity.wolf.pant",
    "step_sound": "minecraft:entity.wolf.step",
    "whine_sound": "minecraft:entity.wolf.whine"
  },
  "baby_sounds": {
    "ambient_sound": "minecraft:entity.pig.ambient",
    "death_sound": "minecraft:entity.pig.death",
    "growl_sound": "minecraft:entity.wolf.growl",
    "hurt_sound": "minecraft:entity.pig.hurt",
    "pant_sound": "minecraft:entity.wolf.pant",
    "step_sound": "minecraft:entity.wolf.step",
    "whine_sound": "minecraft:entity.wolf.whine"
  }
}
JSON

Other Variants

Painting Variants

Painting variants define custom paintings with dimensions and optional metadata like author and title.

// Basic painting variant
paintingVariant(
	assetId = Textures.Painting.KEBAB,
	height = 16,
	width = 16
)
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:kebab",
	"height": 16,
	"width": 16
}
JSON

With default dimensions (1x1):

paintingVariant(
	assetId = Textures.Painting.AZTEC
)
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:aztec",
	"height": 1,
	"width": 1
}
JSON

With author and title:

paintingVariant(
	assetId = Textures.Painting.AZTEC,
) {
	author = textComponent("Ayfri")
	title = textComponent("Aztec")
}
Kotlin

Produces JSON:

{
	"asset_id": "minecraft:aztec",
	"height": 1,
	"width": 1,
	"author": "Ayfri",
	"title": "Aztec"
}
JSON

Decorated Pot Patterns

A decorated pot pattern is the texture a pottery sherd shows on a face of a decorated pot, read from textures/entity/decorated_pot/<path>.png. An item shows it through its providesPotteryPattern component:

val star = decoratedPotPattern("star", DecoratedPotPatternAssetArgument("star_pottery_pattern", "my_pack"))

val sherd = Items.BRICK {
	providesPotteryPattern(star)
}
Kotlin

Produces JSON:

{
	"asset_id": "my_pack:star_pottery_pattern"
}
JSON

The vanilla textures are typed, like Textures.Entity.DecoratedPot.ANGLER_POTTERY_PATTERN.

See Also

  • Chat Components - For painting title and author text formatting
  • Tags - Use variant tags for spawn conditions