package net.minecraft.util; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.JavaOps; import com.mojang.serialization.Lifecycle; import java.util.HashMap; import java.util.Map; import java.util.Optional; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderOwner; import net.minecraft.core.HolderSet; import net.minecraft.core.Registry; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; public class PlaceholderLookupProvider implements HolderGetter.Provider { final HolderLookup.Provider context; final PlaceholderLookupProvider.UniversalLookup lookup = new PlaceholderLookupProvider.UniversalLookup(); final Map, Holder.Reference> holders = new HashMap<>(); final Map, HolderSet.Named> holderSets = new HashMap<>(); public PlaceholderLookupProvider(HolderLookup.Provider p_396424_) { this.context = p_396424_; } @Override public Optional> lookup(ResourceKey> p_392313_) { return Optional.of(this.lookup.castAsLookup()); } public RegistryOps createSerializationContext(DynamicOps p_396800_) { return RegistryOps.create( p_396800_, new RegistryOps.RegistryInfoLookup() { @Override public Optional> lookup(ResourceKey> p_391738_) { return PlaceholderLookupProvider.this.context .lookup(p_391738_) .map(RegistryOps.RegistryInfo::fromRegistryLookup) .or( () -> Optional.of( new RegistryOps.RegistryInfo<>( PlaceholderLookupProvider.this.lookup.castAsOwner(), PlaceholderLookupProvider.this.lookup.castAsLookup(), Lifecycle.experimental() ) ) ); } } ); } public RegistryContextSwapper createSwapper() { return new RegistryContextSwapper() { @Override public DataResult swapTo(Codec p_394376_, T p_394056_, HolderLookup.Provider p_397457_) { return p_394376_.encodeStart(PlaceholderLookupProvider.this.createSerializationContext(JavaOps.INSTANCE), p_394056_) .flatMap(p_395467_ -> p_394376_.parse(p_397457_.createSerializationContext(JavaOps.INSTANCE), p_395467_)); } }; } public boolean hasRegisteredPlaceholders() { return !this.holders.isEmpty() || !this.holderSets.isEmpty(); } class UniversalLookup implements HolderGetter, HolderOwner { @Override public Optional> get(ResourceKey p_394615_) { return Optional.of(this.getOrCreate(p_394615_)); } @Override public Holder.Reference getOrThrow(ResourceKey p_392521_) { return this.getOrCreate(p_392521_); } private Holder.Reference getOrCreate(ResourceKey p_392885_) { return PlaceholderLookupProvider.this.holders .computeIfAbsent(p_392885_, p_393201_ -> Holder.Reference.createStandAlone(this, (ResourceKey)p_393201_)); } @Override public Optional> get(TagKey p_395754_) { return Optional.of(this.getOrCreate(p_395754_)); } @Override public HolderSet.Named getOrThrow(TagKey p_396896_) { return this.getOrCreate(p_396896_); } private HolderSet.Named getOrCreate(TagKey p_397236_) { return PlaceholderLookupProvider.this.holderSets.computeIfAbsent(p_397236_, p_391551_ -> HolderSet.emptyNamed(this, (TagKey)p_391551_)); } public HolderGetter castAsLookup() { return (HolderGetter)this; } public HolderOwner castAsOwner() { return (HolderOwner)this; } } }