RegistryOps.java

net.minecraft.resources.RegistryOps

信息

  • 全限定名:net.minecraft.resources.RegistryOps
  • 类型:public class
  • 包:net.minecraft.resources
  • 源码路径:src/main/java/net/minecraft/resources/RegistryOps.java
  • 起始行号:L18
  • 继承:DelegatingOps
  • 职责:

    TODO

字段/常量

  • lookupProvider
    • 类型: RegistryOps.RegistryInfoLookup
    • 修饰符: private final
    • 源码定位: L19
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.resources.RegistryOps.HolderLookupAdapter

    • 类型: class
    • 修饰符: private static final
    • 源码定位: L93
    • 说明:

      TODO

  • net.minecraft.resources.RegistryOps.RegistryInfo

    • 类型: record
    • 修饰符: public
    • 源码定位: L121
    • 说明:

      TODO

  • net.minecraft.resources.RegistryOps.RegistryInfoLookup

    • 类型: interface
    • 修饰符: public
    • 源码定位: L127
    • 说明:

      TODO

构造器

private RegistryOps(DynamicOps<T> parent, RegistryOps.RegistryInfoLookup lookupProvider) @ L33

  • 构造器名:RegistryOps
  • 源码定位:L33
  • 修饰符:private

参数:

  • parent: DynamicOps
  • lookupProvider: RegistryOps.RegistryInfoLookup

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static <T> RegistryOps<T> create(DynamicOps<T> parent, HolderLookup.Provider lookupProvider) @ L21

  • 方法名:create
  • 源码定位:L21
  • 返回类型: RegistryOps
  • 修饰符:public static

参数:

  • parent: DynamicOps
  • lookupProvider: HolderLookup.Provider

说明:

TODO

public static <T> RegistryOps<T> create(DynamicOps<T> parent, RegistryOps.RegistryInfoLookup lookupProvider) @ L25

  • 方法名:create
  • 源码定位:L25
  • 返回类型: RegistryOps
  • 修饰符:public static

参数:

  • parent: DynamicOps
  • lookupProvider: RegistryOps.RegistryInfoLookup

说明:

TODO

public static <T> Dynamic<T> injectRegistryContext(Dynamic<T> dynamic, HolderLookup.Provider lookupProvider) @ L29

  • 方法名:injectRegistryContext
  • 源码定位:L29
  • 返回类型: Dynamic
  • 修饰符:public static

参数:

  • dynamic: Dynamic
  • lookupProvider: HolderLookup.Provider

说明:

TODO

public <U> RegistryOps<U> withParent(DynamicOps<U> parent) @ L38

  • 方法名:withParent
  • 源码定位:L38
  • 返回类型: RegistryOps
  • 修饰符:public

参数:

  • parent: DynamicOps

说明:

TODO

public <E> Optional<HolderOwner<E>> owner(ResourceKey<?extends Registry<?extends E>> registryKey) @ L42

  • 方法名:owner
  • 源码定位:L42
  • 返回类型: Optional<HolderOwner>
  • 修饰符:public

参数:

  • registryKey: ResourceKey<?extends Registry<?extends E>>

说明:

TODO

public <E> Optional<HolderGetter<E>> getter(ResourceKey<?extends Registry<?extends E>> registryKey) @ L46

  • 方法名:getter
  • 源码定位:L46
  • 返回类型: Optional<HolderGetter>
  • 修饰符:public

参数:

  • registryKey: ResourceKey<?extends Registry<?extends E>>

说明:

TODO

public boolean equals(Object obj) @ L50

  • 方法名:equals
  • 源码定位:L50
  • 返回类型:boolean
  • 修饰符:public

参数:

  • obj: Object

说明:

TODO

public int hashCode() @ L62

  • 方法名:hashCode
  • 源码定位:L62
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public static <E,O> RecordCodecBuilder<O,HolderGetter<E>> retrieveGetter(ResourceKey<?extends Registry<?extends E>> registryKey) @ L67

  • 方法名:retrieveGetter
  • 源码定位:L67
  • 返回类型:<E,O> RecordCodecBuilder<O,HolderGetter>
  • 修饰符:public static

参数:

  • registryKey: ResourceKey<?extends Registry<?extends E>>

说明:

TODO

public static <E,O> RecordCodecBuilder<O,Holder.Reference<E>> retrieveElement(ResourceKey<E> key) @ L79

  • 方法名:retrieveElement
  • 源码定位:L79
  • 返回类型:<E,O> RecordCodecBuilder<O,Holder.Reference>
  • 修饰符:public static

参数:

  • key: ResourceKey

说明:

TODO

代码

public class RegistryOps<T> extends DelegatingOps<T> {
    private final RegistryOps.RegistryInfoLookup lookupProvider;
 
    public static <T> RegistryOps<T> create(DynamicOps<T> parent, HolderLookup.Provider lookupProvider) {
        return create(parent, new RegistryOps.HolderLookupAdapter(lookupProvider));
    }
 
    public static <T> RegistryOps<T> create(DynamicOps<T> parent, RegistryOps.RegistryInfoLookup lookupProvider) {
        return new RegistryOps<>(parent, lookupProvider);
    }
 
    public static <T> Dynamic<T> injectRegistryContext(Dynamic<T> dynamic, HolderLookup.Provider lookupProvider) {
        return new Dynamic<>(lookupProvider.createSerializationContext(dynamic.getOps()), dynamic.getValue());
    }
 
    private RegistryOps(DynamicOps<T> parent, RegistryOps.RegistryInfoLookup lookupProvider) {
        super(parent);
        this.lookupProvider = lookupProvider;
    }
 
    public <U> RegistryOps<U> withParent(DynamicOps<U> parent) {
        return (RegistryOps<U>)(parent == this.delegate ? this : new RegistryOps<>(parent, this.lookupProvider));
    }
 
    public <E> Optional<HolderOwner<E>> owner(ResourceKey<? extends Registry<? extends E>> registryKey) {
        return this.lookupProvider.lookup(registryKey).map(RegistryOps.RegistryInfo::owner);
    }
 
    public <E> Optional<HolderGetter<E>> getter(ResourceKey<? extends Registry<? extends E>> registryKey) {
        return this.lookupProvider.lookup(registryKey).map(RegistryOps.RegistryInfo::getter);
    }
 
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        } else if (obj != null && this.getClass() == obj.getClass()) {
            RegistryOps<?> ops = (RegistryOps<?>)obj;
            return this.delegate.equals(ops.delegate) && this.lookupProvider.equals(ops.lookupProvider);
        } else {
            return false;
        }
    }
 
    @Override
    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>> registryKey) {
        return ExtraCodecs.retrieveContext(
                ops -> ops instanceof RegistryOps<?> registryOps
                    ? registryOps.lookupProvider
                        .lookup(registryKey)
                        .map(r -> DataResult.success(r.getter(), r.elementsLifecycle()))
                        .orElseGet(() -> DataResult.error(() -> "Unknown registry: " + registryKey))
                    : DataResult.error(() -> "Not a registry ops")
            )
            .forGetter(e -> null);
    }
 
    public static <E, O> RecordCodecBuilder<O, Holder.Reference<E>> retrieveElement(ResourceKey<E> key) {
        ResourceKey<? extends Registry<E>> registryKey = ResourceKey.createRegistryKey(key.registry());
        return ExtraCodecs.retrieveContext(
                ops -> ops instanceof RegistryOps<?> registryOps
                    ? registryOps.lookupProvider
                        .lookup(registryKey)
                        .flatMap(r -> r.getter().get(key))
                        .map(DataResult::success)
                        .orElseGet(() -> DataResult.error(() -> "Can't find value: " + key))
                    : DataResult.error(() -> "Not a registry ops")
            )
            .forGetter(e -> null);
    }
 
    private 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 lookupProvider) {
            this.lookupProvider = lookupProvider;
        }
 
        @Override
        public <E> Optional<RegistryOps.RegistryInfo<E>> lookup(ResourceKey<? extends Registry<? extends E>> registryKey) {
            return (Optional<RegistryOps.RegistryInfo<E>>)this.lookups.computeIfAbsent(registryKey, this::createLookup);
        }
 
        private Optional<RegistryOps.RegistryInfo<Object>> createLookup(ResourceKey<? extends Registry<?>> key) {
            return this.lookupProvider.lookup(key).map(RegistryOps.RegistryInfo::fromRegistryLookup);
        }
 
        @Override
        public boolean equals(Object obj) {
            return this == obj ? true : obj instanceof RegistryOps.HolderLookupAdapter adapter && this.lookupProvider.equals(adapter.lookupProvider);
        }
 
        @Override
        public int hashCode() {
            return this.lookupProvider.hashCode();
        }
    }
 
    public record RegistryInfo<T>(HolderOwner<T> owner, HolderGetter<T> getter, Lifecycle elementsLifecycle) {
        public static <T> RegistryOps.RegistryInfo<T> fromRegistryLookup(HolderLookup.RegistryLookup<T> registry) {
            return new RegistryOps.RegistryInfo<>(registry, registry, registry.registryLifecycle());
        }
    }
 
    public interface RegistryInfoLookup {
        <T> Optional<RegistryOps.RegistryInfo<T>> lookup(ResourceKey<? extends Registry<? extends T>> registryKey);
    }
}

引用的其他类