41 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.world.entity.variant;
 | |
| 
 | |
| import java.util.Optional;
 | |
| import java.util.stream.Stream;
 | |
| import net.minecraft.core.Holder;
 | |
| import net.minecraft.core.Registry;
 | |
| import net.minecraft.core.RegistryAccess;
 | |
| import net.minecraft.resources.ResourceKey;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| import net.minecraft.world.level.ServerLevelAccessor;
 | |
| import net.minecraft.world.level.storage.ValueInput;
 | |
| import net.minecraft.world.level.storage.ValueOutput;
 | |
| 
 | |
| public class VariantUtils {
 | |
| 	public static final String TAG_VARIANT = "variant";
 | |
| 
 | |
| 	public static <T> Holder<T> getDefaultOrAny(RegistryAccess registryAccess, ResourceKey<T> key) {
 | |
| 		Registry<T> registry = registryAccess.lookupOrThrow(key.registryKey());
 | |
| 		return (Holder<T>)registry.get(key).or(registry::getAny).orElseThrow();
 | |
| 	}
 | |
| 
 | |
| 	public static <T> Holder<T> getAny(RegistryAccess registryAccess, ResourceKey<? extends Registry<T>> registryKey) {
 | |
| 		return (Holder<T>)registryAccess.lookupOrThrow(registryKey).getAny().orElseThrow();
 | |
| 	}
 | |
| 
 | |
| 	public static <T> void writeVariant(ValueOutput output, Holder<T> variant) {
 | |
| 		variant.unwrapKey().ifPresent(resourceKey -> output.store("variant", ResourceLocation.CODEC, resourceKey.location()));
 | |
| 	}
 | |
| 
 | |
| 	public static <T> Optional<Holder<T>> readVariant(ValueInput input, ResourceKey<? extends Registry<T>> registryKey) {
 | |
| 		return input.read("variant", ResourceLocation.CODEC).map(resourceLocation -> ResourceKey.create(registryKey, resourceLocation)).flatMap(input.lookup()::get);
 | |
| 	}
 | |
| 
 | |
| 	public static <T extends PriorityProvider<SpawnContext, ?>> Optional<Holder.Reference<T>> selectVariantToSpawn(
 | |
| 		SpawnContext context, ResourceKey<Registry<T>> registryKey
 | |
| 	) {
 | |
| 		ServerLevelAccessor serverLevelAccessor = context.level();
 | |
| 		Stream<Holder.Reference<T>> stream = serverLevelAccessor.registryAccess().lookupOrThrow(registryKey).listElements();
 | |
| 		return PriorityProvider.pick(stream, Holder::value, serverLevelAccessor.getRandom(), context);
 | |
| 	}
 | |
| }
 |