PlaceholderLookupProvider.java

net.minecraft.util.PlaceholderLookupProvider

信息

  • 全限定名:net.minecraft.util.PlaceholderLookupProvider
  • 类型:public class
  • 包:net.minecraft.util
  • 源码路径:src/main/java/net/minecraft/util/PlaceholderLookupProvider.java
  • 起始行号:L22
  • 实现:HolderGetter.Provider
  • 职责:

    TODO

字段/常量

  • context

    • 类型: HolderLookup.Provider
    • 修饰符: private final
    • 源码定位: L23
    • 说明:

      TODO

  • lookup

    • 类型: PlaceholderLookupProvider.UniversalLookup
    • 修饰符: private final
    • 源码定位: L24
    • 说明:

      TODO

  • holders

    • 类型: Map<ResourceKey<Object>,Holder.Reference<Object>>
    • 修饰符: private final
    • 源码定位: L25
    • 说明:

      TODO

  • holderSets

    • 类型: Map<TagKey<Object>,HolderSet.Named<Object>>
    • 修饰符: private final
    • 源码定位: L26
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.PlaceholderLookupProvider.UniversalLookup
    • 类型: class
    • 修饰符: private
    • 源码定位: L82
    • 说明:

      TODO

构造器

public PlaceholderLookupProvider(HolderLookup.Provider context) @ L28

  • 构造器名:PlaceholderLookupProvider
  • 源码定位:L28
  • 修饰符:public

参数:

  • context: HolderLookup.Provider

说明:

TODO

方法

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

public <T> Optional<?extends HolderGetter<T>> lookup(ResourceKey<?extends Registry<?extends T>> key) @ L32

  • 方法名:lookup
  • 源码定位:L32
  • 返回类型: Optional<?extends HolderGetter>
  • 修饰符:public

参数:

  • key: ResourceKey<?extends Registry<?extends T>>

说明:

TODO

public <V> RegistryOps<V> createSerializationContext(DynamicOps<V> parent) @ L37

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

参数:

  • parent: DynamicOps

说明:

TODO

public RegistryContextSwapper createSwapper() @ L64

  • 方法名:createSwapper
  • 源码定位:L64
  • 返回类型:RegistryContextSwapper
  • 修饰符:public

参数:

说明:

TODO

public boolean hasRegisteredPlaceholders() @ L78

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

参数:

说明:

TODO

代码

public class PlaceholderLookupProvider implements HolderGetter.Provider {
    private final HolderLookup.Provider context;
    private final PlaceholderLookupProvider.UniversalLookup lookup = new PlaceholderLookupProvider.UniversalLookup();
    private final Map<ResourceKey<Object>, Holder.Reference<Object>> holders = new HashMap<>();
    private final Map<TagKey<Object>, HolderSet.Named<Object>> holderSets = new HashMap<>();
 
    public PlaceholderLookupProvider(HolderLookup.Provider context) {
        this.context = context;
    }
 
    @Override
    public <T> Optional<? extends HolderGetter<T>> lookup(ResourceKey<? extends Registry<? extends T>> key) {
        return Optional.of(this.lookup.castAsLookup());
    }
 
    public <V> RegistryOps<V> createSerializationContext(DynamicOps<V> parent) {
        return RegistryOps.create(
            parent,
            new RegistryOps.RegistryInfoLookup() {
                {
                    Objects.requireNonNull(PlaceholderLookupProvider.this);
                }
 
                @Override
                public <T> Optional<RegistryOps.RegistryInfo<T>> lookup(ResourceKey<? extends Registry<? extends T>> registryKey) {
                    return PlaceholderLookupProvider.this.context
                        .lookup(registryKey)
                        .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() {
            {
                Objects.requireNonNull(PlaceholderLookupProvider.this);
            }
 
            @Override
            public <T> DataResult<T> swapTo(Codec<T> codec, T value, HolderLookup.Provider newContext) {
                return codec.encodeStart(PlaceholderLookupProvider.this.createSerializationContext(JavaOps.INSTANCE), value)
                    .flatMap(v -> codec.parse(newContext.createSerializationContext(JavaOps.INSTANCE), v));
            }
        };
    }
 
    public boolean hasRegisteredPlaceholders() {
        return !this.holders.isEmpty() || !this.holderSets.isEmpty();
    }
 
    private class UniversalLookup implements HolderGetter<Object>, HolderOwner<Object> {
        private UniversalLookup() {
            Objects.requireNonNull(PlaceholderLookupProvider.this);
            super();
        }
 
        @Override
        public Optional<Holder.Reference<Object>> get(ResourceKey<Object> id) {
            return Optional.of(this.getOrCreate(id));
        }
 
        @Override
        public Holder.Reference<Object> getOrThrow(ResourceKey<Object> id) {
            return this.getOrCreate(id);
        }
 
        private Holder.Reference<Object> getOrCreate(ResourceKey<Object> id) {
            return PlaceholderLookupProvider.this.holders.computeIfAbsent(id, k -> Holder.Reference.createStandAlone(this, (ResourceKey<Object>)k));
        }
 
        @Override
        public Optional<HolderSet.Named<Object>> get(TagKey<Object> id) {
            return Optional.of(this.getOrCreate(id));
        }
 
        @Override
        public HolderSet.Named<Object> getOrThrow(TagKey<Object> id) {
            return this.getOrCreate(id);
        }
 
        private HolderSet.Named<Object> getOrCreate(TagKey<Object> id) {
            return PlaceholderLookupProvider.this.holderSets.computeIfAbsent(id, k -> HolderSet.emptyNamed(this, (TagKey<Object>)k));
        }
 
        public <T> HolderGetter<T> castAsLookup() {
            return (HolderGetter<T>)this;
        }
 
        public <T> HolderOwner<T> castAsOwner() {
            return (HolderOwner<T>)this;
        }
    }
}

引用的其他类

  • Holder

    • 引用位置: 字段/方法调用
    • 关联成员: Holder.Reference.createStandAlone()
  • HolderGetter

    • 引用位置: 实现/返回值
  • HolderLookup

    • 引用位置: 参数/字段
  • HolderSet

    • 引用位置: 字段/方法调用
    • 关联成员: HolderSet.emptyNamed()
  • Registry

    • 引用位置: 参数
  • RegistryOps

    • 引用位置: 方法调用/构造调用/返回值
    • 关联成员: RegistryInfoLookup(), RegistryOps.RegistryInfoLookup(), RegistryOps.create()
  • ResourceKey

    • 引用位置: 参数/字段
  • TagKey

    • 引用位置: 字段
  • RegistryContextSwapper

    • 引用位置: 构造调用/返回值
    • 关联成员: RegistryContextSwapper()