package net.minecraft.core; import com.mojang.datafixers.DataFixUtils; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Keyable; import com.mojang.serialization.Lifecycle; import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.Map.Entry; import java.util.stream.Stream; import java.util.stream.StreamSupport; import javax.annotation.Nullable; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.tags.TagLoader; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.RandomSource; public interface Registry extends Keyable, HolderLookup.RegistryLookup, IdMap { @Override ResourceKey> key(); default Codec byNameCodec() { return this.referenceHolderWithLifecycle().flatComapMap(Holder.Reference::value, p_325680_ -> this.safeCastToReference(this.wrapAsHolder((T)p_325680_))); } default Codec> holderByNameCodec() { return this.referenceHolderWithLifecycle().flatComapMap(p_325683_ -> (Holder)p_325683_, this::safeCastToReference); } private Codec> referenceHolderWithLifecycle() { Codec> codec = ResourceLocation.CODEC .comapFlatMap( p_358093_ -> this.get(p_358093_) .map(DataResult::success) .orElseGet(() -> DataResult.error(() -> "Unknown registry key in " + this.key() + ": " + p_358093_)), p_325675_ -> p_325675_.key().location() ); return ExtraCodecs.overrideLifecycle(codec, p_325682_ -> this.registrationInfo(p_325682_.key()).map(RegistrationInfo::lifecycle).orElse(Lifecycle.experimental())); } private DataResult> safeCastToReference(Holder p_329506_) { return p_329506_ instanceof Holder.Reference reference ? DataResult.success(reference) : DataResult.error(() -> "Unregistered holder in " + this.key() + ": " + p_329506_); } @Override default Stream keys(DynamicOps p_123030_) { return this.keySet().stream().map(p_235784_ -> p_123030_.createString(p_235784_.toString())); } @Nullable ResourceLocation getKey(T p_123006_); Optional> getResourceKey(T p_123008_); @Override int getId(@Nullable T p_122977_); @Nullable T getValue(@Nullable ResourceKey p_362147_); @Nullable T getValue(@Nullable ResourceLocation p_364352_); Optional registrationInfo(ResourceKey p_333179_); default Optional getOptional(@Nullable ResourceLocation p_123007_) { return Optional.ofNullable(this.getValue(p_123007_)); } default Optional getOptional(@Nullable ResourceKey p_123010_) { return Optional.ofNullable(this.getValue(p_123010_)); } Optional> getAny(); default T getValueOrThrow(ResourceKey p_367641_) { T t = this.getValue(p_367641_); if (t == null) { throw new IllegalStateException("Missing key in " + this.key() + ": " + p_367641_); } else { return t; } } Set keySet(); Set, T>> entrySet(); Set> registryKeySet(); Optional> getRandom(RandomSource p_235781_); default Stream stream() { return StreamSupport.stream(this.spliterator(), false); } boolean containsKey(ResourceLocation p_123011_); boolean containsKey(ResourceKey p_175475_); static T register(Registry p_122962_, String p_122963_, T p_122964_) { return register(p_122962_, ResourceLocation.parse(p_122963_), p_122964_); } static T register(Registry p_122966_, ResourceLocation p_122967_, T p_122968_) { return register(p_122966_, ResourceKey.create(p_122966_.key(), p_122967_), p_122968_); } static T register(Registry p_194580_, ResourceKey p_194581_, T p_194582_) { ((WritableRegistry)p_194580_).register(p_194581_, (V)p_194582_, RegistrationInfo.BUILT_IN); return p_194582_; } static Holder.Reference registerForHolder(Registry p_263347_, ResourceKey p_263355_, T p_263428_) { return ((WritableRegistry)p_263347_).register(p_263355_, p_263428_, RegistrationInfo.BUILT_IN); } static Holder.Reference registerForHolder(Registry p_263351_, ResourceLocation p_263363_, T p_263423_) { return registerForHolder(p_263351_, ResourceKey.create(p_263351_.key(), p_263363_), p_263423_); } Registry freeze(); Holder.Reference createIntrusiveHolder(T p_206068_); Optional> get(int p_367150_); Optional> get(ResourceLocation p_370108_); Holder wrapAsHolder(T p_263382_); default Iterable> getTagOrEmpty(TagKey p_206059_) { return DataFixUtils.orElse((Optional)(Optional)this.get(p_206059_), List.of()); } default Optional> getRandomElementOf(TagKey p_332242_, RandomSource p_335036_) { return this.get(p_332242_).flatMap(p_325677_ -> p_325677_.getRandomElement(p_335036_)); } Stream> getTags(); default IdMap> asHolderIdMap() { return new IdMap>() { public int getId(Holder p_259992_) { return Registry.this.getId(p_259992_.value()); } @Nullable public Holder byId(int p_259972_) { return (Holder)Registry.this.get(p_259972_).orElse(null); } @Override public int size() { return Registry.this.size(); } @Override public Iterator> iterator() { return Registry.this.listElements().map(p_260061_ -> (Holder)p_260061_).iterator(); } }; } Registry.PendingTags prepareTagReload(TagLoader.LoadResult p_364537_); public interface PendingTags { ResourceKey> key(); HolderLookup.RegistryLookup lookup(); void apply(); int size(); } }