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 { Stream>> listRegistries(); Optional> lookup(ResourceKey> registryKey); default HolderLookup.RegistryLookup lookupOrThrow(ResourceKey> registryKey) { return (HolderLookup.RegistryLookup)this.lookup(registryKey) .orElseThrow(() -> new IllegalStateException("Registry " + registryKey.location() + " not found")); } default RegistryOps createSerializationContext(DynamicOps ops) { return RegistryOps.create(ops, this); } default HolderGetter.Provider asGetterLookup() { return new HolderGetter.Provider() { @Override public Optional> lookup(ResourceKey> registryKey) { return Provider.this.lookup(registryKey).map(registryLookup -> registryLookup); } }; } static HolderLookup.Provider create(Stream> lookupStream) { final Map>, HolderLookup.RegistryLookup> map = (Map>, HolderLookup.RegistryLookup>)lookupStream.collect( Collectors.toUnmodifiableMap(HolderLookup.RegistryLookup::key, registryLookup -> registryLookup) ); return new HolderLookup.Provider() { @Override public Stream>> listRegistries() { return map.keySet().stream(); } @Override public Optional> lookup(ResourceKey> registryKey) { return Optional.ofNullable((HolderLookup.RegistryLookup)map.get(registryKey)); } }; } } public interface RegistryLookup extends HolderLookup, HolderOwner { ResourceKey> key(); Lifecycle registryLifecycle(); default HolderLookup.RegistryLookup filterFeatures(FeatureFlagSet enabledFeatures) { return FeatureElement.FILTERED_REGISTRIES.contains(this.key()) ? this.filterElements(object -> ((FeatureElement)object).isEnabled(enabledFeatures)) : this; } default HolderLookup.RegistryLookup filterElements(Predicate predicate) { return new HolderLookup.RegistryLookup.Delegate() { @Override public HolderLookup.RegistryLookup parent() { return RegistryLookup.this; } @Override public Optional> get(ResourceKey resourceKey) { return this.parent().get(resourceKey).filter(reference -> predicate.test(reference.value())); } @Override public Stream> listElements() { return this.parent().listElements().filter(reference -> predicate.test(reference.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 resourceKey) { return this.parent().get(resourceKey); } @Override default Stream> listElements() { return this.parent().listElements(); } @Override default Optional> get(TagKey tagKey) { return this.parent().get(tagKey); } @Override default Stream> listTags() { return this.parent().listTags(); } } } }