package net.minecraft.world.entity.animal; import java.util.List; import java.util.Optional; import net.minecraft.advancements.critereon.MinMaxBounds; import net.minecraft.core.ClientAsset; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.RegistryAccess; import net.minecraft.core.Holder.Reference; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.StructureTags; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.variant.MoonBrightnessCheck; import net.minecraft.world.entity.variant.PriorityProvider; import net.minecraft.world.entity.variant.SpawnContext; import net.minecraft.world.entity.variant.SpawnPrioritySelectors; import net.minecraft.world.entity.variant.StructureCheck; import net.minecraft.world.level.levelgen.structure.Structure; public interface CatVariants { ResourceKey TABBY = createKey("tabby"); ResourceKey BLACK = createKey("black"); ResourceKey RED = createKey("red"); ResourceKey SIAMESE = createKey("siamese"); ResourceKey BRITISH_SHORTHAIR = createKey("british_shorthair"); ResourceKey CALICO = createKey("calico"); ResourceKey PERSIAN = createKey("persian"); ResourceKey RAGDOLL = createKey("ragdoll"); ResourceKey WHITE = createKey("white"); ResourceKey JELLIE = createKey("jellie"); ResourceKey ALL_BLACK = createKey("all_black"); private static ResourceKey createKey(String name) { return ResourceKey.create(Registries.CAT_VARIANT, ResourceLocation.withDefaultNamespace(name)); } static void bootstrap(BootstrapContext context) { HolderGetter holderGetter = context.lookup(Registries.STRUCTURE); registerForAnyConditions(context, TABBY, "entity/cat/tabby"); registerForAnyConditions(context, BLACK, "entity/cat/black"); registerForAnyConditions(context, RED, "entity/cat/red"); registerForAnyConditions(context, SIAMESE, "entity/cat/siamese"); registerForAnyConditions(context, BRITISH_SHORTHAIR, "entity/cat/british_shorthair"); registerForAnyConditions(context, CALICO, "entity/cat/calico"); registerForAnyConditions(context, PERSIAN, "entity/cat/persian"); registerForAnyConditions(context, RAGDOLL, "entity/cat/ragdoll"); registerForAnyConditions(context, WHITE, "entity/cat/white"); registerForAnyConditions(context, JELLIE, "entity/cat/jellie"); register( context, ALL_BLACK, "entity/cat/all_black", new SpawnPrioritySelectors( List.of( new PriorityProvider.Selector<>(new StructureCheck(holderGetter.getOrThrow(StructureTags.CATS_SPAWN_AS_BLACK)), 1), new PriorityProvider.Selector<>(new MoonBrightnessCheck(MinMaxBounds.Doubles.atLeast(0.9)), 0) ) ) ); } private static void registerForAnyConditions(BootstrapContext context, ResourceKey key, String name) { register(context, key, name, SpawnPrioritySelectors.fallback(0)); } private static void register(BootstrapContext context, ResourceKey key, String name, SpawnPrioritySelectors spawnConditions) { context.register(key, new CatVariant(new ClientAsset(ResourceLocation.withDefaultNamespace(name)), spawnConditions)); } static Optional> selectVariantToSpawn(RandomSource random, RegistryAccess registryAccess, SpawnContext context) { return PriorityProvider.pick(registryAccess.lookupOrThrow(Registries.CAT_VARIANT).listElements(), Holder::value, random, context); } }