package net.minecraft.core; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Lifecycle; import java.util.Map; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.flag.FeatureElement; import net.minecraft.world.flag.FeatureFlagSet; public interface HolderLookup extends HolderGetter { Stream> listElements(); default Stream> listElementIds() { return this.listElements().map(Holder.Reference::key); } Stream> listTags(); default Stream> listTagIds() { return this.listTags().map(HolderSet.Named::key); } public interface Provider extends HolderGetter.Provider { Stream>> listRegistryKeys(); default Stream> listRegistries() { return this.listRegistryKeys().map(this::lookupOrThrow); } @Override Optional> lookup(ResourceKey> p_256285_); default HolderLookup.RegistryLookup lookupOrThrow(ResourceKey> p_255957_) { return this.lookup(p_255957_).orElseThrow(() -> new IllegalStateException("Registry " + p_255957_.location() + " not found")); } default RegistryOps createSerializationContext(DynamicOps p_330698_) { return RegistryOps.create(p_330698_, this); } static HolderLookup.Provider create(Stream> p_256054_) { final Map>, HolderLookup.RegistryLookup> map = p_256054_.collect( Collectors.toUnmodifiableMap(HolderLookup.RegistryLookup::key, p_256335_ -> p_256335_) ); return new HolderLookup.Provider() { @Override public Stream>> listRegistryKeys() { return map.keySet().stream(); } @Override public Optional> lookup(ResourceKey> p_256379_) { return Optional.ofNullable((HolderLookup.RegistryLookup)map.get(p_256379_)); } }; } default Lifecycle allRegistriesLifecycle() { return this.listRegistries().map(HolderLookup.RegistryLookup::registryLifecycle).reduce(Lifecycle.stable(), Lifecycle::add); } } public interface RegistryLookup extends HolderLookup, HolderOwner { ResourceKey> key(); Lifecycle registryLifecycle(); default HolderLookup.RegistryLookup filterFeatures(FeatureFlagSet p_249397_) { return FeatureElement.FILTERED_REGISTRIES.contains(this.key()) ? this.filterElements(p_250240_ -> ((FeatureElement)p_250240_).isEnabled(p_249397_)) : this; } default HolderLookup.RegistryLookup filterElements(final Predicate p_334671_) { return new HolderLookup.RegistryLookup.Delegate() { @Override public HolderLookup.RegistryLookup parent() { return RegistryLookup.this; } @Override public Optional> get(ResourceKey p_330384_) { return this.parent().get(p_330384_).filter(p_330697_ -> p_334671_.test(p_330697_.value())); } @Override public Stream> listElements() { return this.parent().listElements().filter(p_331718_ -> p_334671_.test(p_331718_.value())); } }; } public interface Delegate extends HolderLookup.RegistryLookup { HolderLookup.RegistryLookup parent(); @Override default ResourceKey> key() { return this.parent().key(); } @Override default Lifecycle registryLifecycle() { return this.parent().registryLifecycle(); } @Override default Optional> get(ResourceKey p_255619_) { return this.parent().get(p_255619_); } @Override default Stream> listElements() { return this.parent().listElements(); } @Override default Optional> get(TagKey p_256245_) { return this.parent().get(p_256245_); } @Override default Stream> listTags() { return this.parent().listTags(); } } } }