Spaces:
Build error
Build error
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<T> extends DelegatingOps<T> { | |
private final RegistryOps.RegistryInfoLookup lookupProvider; | |
public static <T> RegistryOps<T> create(DynamicOps<T> p_256342_, HolderLookup.Provider p_255950_) { | |
return create(p_256342_, new RegistryOps.HolderLookupAdapter(p_255950_)); | |
} | |
public static <T> RegistryOps<T> create(DynamicOps<T> p_256278_, RegistryOps.RegistryInfoLookup p_256479_) { | |
return new RegistryOps<>(p_256278_, p_256479_); | |
} | |
public static <T> Dynamic<T> injectRegistryContext(Dynamic<T> p_331489_, HolderLookup.Provider p_331408_) { | |
return new Dynamic<>(p_331408_.createSerializationContext(p_331489_.getOps()), p_331489_.getValue()); | |
} | |
private RegistryOps(DynamicOps<T> p_256313_, RegistryOps.RegistryInfoLookup p_255799_) { | |
super(p_256313_); | |
this.lookupProvider = p_255799_; | |
} | |
public <U> RegistryOps<U> withParent(DynamicOps<U> p_332969_) { | |
return (RegistryOps<U>)(p_332969_ == this.delegate ? this : new RegistryOps<>(p_332969_, this.lookupProvider)); | |
} | |
public <E> Optional<HolderOwner<E>> owner(ResourceKey<? extends Registry<? extends E>> p_255757_) { | |
return this.lookupProvider.lookup(p_255757_).map(RegistryOps.RegistryInfo::owner); | |
} | |
public <E> Optional<HolderGetter<E>> getter(ResourceKey<? extends Registry<? extends E>> p_256031_) { | |
return this.lookupProvider.lookup(p_256031_).map(RegistryOps.RegistryInfo::getter); | |
} | |
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; | |
} | |
} | |
public int hashCode() { | |
return this.delegate.hashCode() * 31 + this.lookupProvider.hashCode(); | |
} | |
public static <E, O> RecordCodecBuilder<O, HolderGetter<E>> retrieveGetter(ResourceKey<? extends Registry<? extends E>> 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 <E, O> RecordCodecBuilder<O, Holder.Reference<E>> retrieveElement(ResourceKey<E> p_256347_) { | |
ResourceKey<? extends Registry<E>> 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<ResourceKey<? extends Registry<?>>, Optional<? extends RegistryOps.RegistryInfo<?>>> lookups = new ConcurrentHashMap<>(); | |
public HolderLookupAdapter(HolderLookup.Provider p_335468_) { | |
this.lookupProvider = p_335468_; | |
} | |
public <E> Optional<RegistryOps.RegistryInfo<E>> lookup(ResourceKey<? extends Registry<? extends E>> p_330389_) { | |
return (Optional<RegistryOps.RegistryInfo<E>>)this.lookups.computeIfAbsent(p_330389_, this::createLookup); | |
} | |
private Optional<RegistryOps.RegistryInfo<Object>> createLookup(ResourceKey<? extends Registry<?>> p_335602_) { | |
return this.lookupProvider.lookup(p_335602_).map(RegistryOps.RegistryInfo::fromRegistryLookup); | |
} | |
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; | |
} | |
} | |
public int hashCode() { | |
return this.lookupProvider.hashCode(); | |
} | |
} | |
public static record RegistryInfo<T>(HolderOwner<T> owner, HolderGetter<T> getter, Lifecycle elementsLifecycle) { | |
public static <T> RegistryOps.RegistryInfo<T> fromRegistryLookup(HolderLookup.RegistryLookup<T> p_329148_) { | |
return new RegistryOps.RegistryInfo<>(p_329148_, p_329148_, p_329148_.registryLifecycle()); | |
} | |
} | |
public interface RegistryInfoLookup { | |
<T> Optional<RegistryOps.RegistryInfo<T>> lookup(ResourceKey<? extends Registry<? extends T>> p_256623_); | |
} | |
} |