package net.minecraft.resources; import com.mojang.serialization.DataResult; import com.mojang.serialization.Dynamic; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Lifecycle; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderOwner; import net.minecraft.core.Registry; import net.minecraft.util.ExtraCodecs; public class RegistryOps extends DelegatingOps { private final RegistryOps.RegistryInfoLookup lookupProvider; public static RegistryOps create(DynamicOps p_256342_, HolderLookup.Provider p_255950_) { return create(p_256342_, new RegistryOps.HolderLookupAdapter(p_255950_)); } public static RegistryOps create(DynamicOps p_256278_, RegistryOps.RegistryInfoLookup p_256479_) { return new RegistryOps<>(p_256278_, p_256479_); } public static Dynamic injectRegistryContext(Dynamic p_331489_, HolderLookup.Provider p_331408_) { return new Dynamic<>(p_331408_.createSerializationContext(p_331489_.getOps()), p_331489_.getValue()); } private RegistryOps(DynamicOps p_256313_, RegistryOps.RegistryInfoLookup p_255799_) { super(p_256313_); this.lookupProvider = p_255799_; } public RegistryOps withParent(DynamicOps p_332969_) { return (RegistryOps)(p_332969_ == this.delegate ? this : new RegistryOps<>(p_332969_, this.lookupProvider)); } public Optional> owner(ResourceKey> p_255757_) { return this.lookupProvider.lookup(p_255757_).map(RegistryOps.RegistryInfo::owner); } public Optional> getter(ResourceKey> p_256031_) { return this.lookupProvider.lookup(p_256031_).map(RegistryOps.RegistryInfo::getter); } @Override public boolean equals(Object p_332753_) { if (this == p_332753_) { return true; } else if (p_332753_ != null && this.getClass() == p_332753_.getClass()) { RegistryOps registryops = (RegistryOps)p_332753_; return this.delegate.equals(registryops.delegate) && this.lookupProvider.equals(registryops.lookupProvider); } else { return false; } } @Override public int hashCode() { return this.delegate.hashCode() * 31 + this.lookupProvider.hashCode(); } public static RecordCodecBuilder> retrieveGetter(ResourceKey> p_206833_) { return ExtraCodecs.retrieveContext( p_274811_ -> p_274811_ instanceof RegistryOps registryops ? registryops.lookupProvider .lookup(p_206833_) .map(p_255527_ -> DataResult.success(p_255527_.getter(), p_255527_.elementsLifecycle())) .orElseGet(() -> DataResult.error(() -> "Unknown registry: " + p_206833_)) : DataResult.error(() -> "Not a registry ops") ) .forGetter(p_255526_ -> null); } public static RecordCodecBuilder> retrieveElement(ResourceKey p_256347_) { ResourceKey> resourcekey = ResourceKey.createRegistryKey(p_256347_.registry()); return ExtraCodecs.retrieveContext( p_274808_ -> p_274808_ instanceof RegistryOps registryops ? registryops.lookupProvider .lookup(resourcekey) .flatMap(p_255518_ -> p_255518_.getter().get(p_256347_)) .map(DataResult::success) .orElseGet(() -> DataResult.error(() -> "Can't find value: " + p_256347_)) : DataResult.error(() -> "Not a registry ops") ) .forGetter(p_255524_ -> null); } static final class HolderLookupAdapter implements RegistryOps.RegistryInfoLookup { private final HolderLookup.Provider lookupProvider; private final Map>, Optional>> lookups = new ConcurrentHashMap<>(); public HolderLookupAdapter(HolderLookup.Provider p_335468_) { this.lookupProvider = p_335468_; } @Override public Optional> lookup(ResourceKey> p_330389_) { return (Optional>)this.lookups.computeIfAbsent(p_330389_, this::createLookup); } private Optional> createLookup(ResourceKey> p_335602_) { return this.lookupProvider.lookup(p_335602_).map(RegistryOps.RegistryInfo::fromRegistryLookup); } @Override public boolean equals(Object p_330775_) { if (this == p_330775_) { return true; } else { if (p_330775_ instanceof RegistryOps.HolderLookupAdapter registryops$holderlookupadapter && this.lookupProvider.equals(registryops$holderlookupadapter.lookupProvider)) { return true; } return false; } } @Override public int hashCode() { return this.lookupProvider.hashCode(); } } public static record RegistryInfo(HolderOwner owner, HolderGetter getter, Lifecycle elementsLifecycle) { public static RegistryOps.RegistryInfo fromRegistryLookup(HolderLookup.RegistryLookup p_329148_) { return new RegistryOps.RegistryInfo<>(p_329148_, p_329148_, p_329148_.registryLifecycle()); } } public interface RegistryInfoLookup { Optional> lookup(ResourceKey> p_256623_); } }