RegistryFileCodec.java

net.minecraft.resources.RegistryFileCodec

信息

  • 全限定名:net.minecraft.resources.RegistryFileCodec
  • 类型:public final class
  • 包:net.minecraft.resources
  • 源码路径:src/main/java/net/minecraft/resources/RegistryFileCodec.java
  • 起始行号:L14
  • 实现:Codec<Holder>
  • 职责:

    TODO

字段/常量

  • registryKey

    • 类型: ResourceKey<?extends Registry<E>>
    • 修饰符: private final
    • 源码定位: L15
    • 说明:

      TODO

  • elementCodec

    • 类型: Codec<E>
    • 修饰符: private final
    • 源码定位: L16
    • 说明:

      TODO

  • allowInline

    • 类型: boolean
    • 修饰符: private final
    • 源码定位: L17
    • 说明:

      TODO

内部类/嵌套类型

构造器

private RegistryFileCodec(ResourceKey<?extends Registry<E>> registryKey, Codec<E> elementCodec, boolean allowInline) @ L27

  • 构造器名:RegistryFileCodec
  • 源码定位:L27
  • 修饰符:private

参数:

  • registryKey: ResourceKey<?extends Registry>
  • elementCodec: Codec
  • allowInline: boolean

说明:

TODO

方法

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

public static <E> RegistryFileCodec<E> create(ResourceKey<?extends Registry<E>> registryKey, Codec<E> elementCodec) @ L19

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

参数:

  • registryKey: ResourceKey<?extends Registry>
  • elementCodec: Codec

说明:

TODO

public static <E> RegistryFileCodec<E> create(ResourceKey<?extends Registry<E>> registryKey, Codec<E> elementCodec, boolean allowInline) @ L23

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

参数:

  • registryKey: ResourceKey<?extends Registry>
  • elementCodec: Codec
  • allowInline: boolean

说明:

TODO

public <T> DataResult<T> encode(Holder<E> input, DynamicOps<T> ops, T prefix) @ L33

  • 方法名:encode
  • 源码定位:L33
  • 返回类型: DataResult
  • 修饰符:public

参数:

  • input: Holder
  • ops: DynamicOps
  • prefix: T

说明:

TODO

public <T> DataResult<Pair<Holder<E>,T>> decode(DynamicOps<T> ops, T input) @ L49

  • 方法名:decode
  • 源码定位:L49
  • 返回类型: DataResult<Pair<Holder,T>>
  • 修饰符:public

参数:

  • ops: DynamicOps
  • input: T

说明:

TODO

public String toString() @ L77

  • 方法名:toString
  • 源码定位:L77
  • 返回类型:String
  • 修饰符:public

参数:

说明:

TODO

代码

public final class RegistryFileCodec<E> implements Codec<Holder<E>> {
    private final ResourceKey<? extends Registry<E>> registryKey;
    private final Codec<E> elementCodec;
    private final boolean allowInline;
 
    public static <E> RegistryFileCodec<E> create(ResourceKey<? extends Registry<E>> registryKey, Codec<E> elementCodec) {
        return create(registryKey, elementCodec, true);
    }
 
    public static <E> RegistryFileCodec<E> create(ResourceKey<? extends Registry<E>> registryKey, Codec<E> elementCodec, boolean allowInline) {
        return new RegistryFileCodec<>(registryKey, elementCodec, allowInline);
    }
 
    private RegistryFileCodec(ResourceKey<? extends Registry<E>> registryKey, Codec<E> elementCodec, boolean allowInline) {
        this.registryKey = registryKey;
        this.elementCodec = elementCodec;
        this.allowInline = allowInline;
    }
 
    public <T> DataResult<T> encode(Holder<E> input, DynamicOps<T> ops, T prefix) {
        if (ops instanceof RegistryOps<?> registryOps) {
            Optional<HolderOwner<E>> maybeOwner = registryOps.owner(this.registryKey);
            if (maybeOwner.isPresent()) {
                if (!input.canSerializeIn(maybeOwner.get())) {
                    return DataResult.error(() -> "Element " + input + " is not valid in current registry set");
                }
 
                return input.unwrap()
                    .map(id -> Identifier.CODEC.encode(id.identifier(), ops, prefix), value -> this.elementCodec.encode((E)value, ops, prefix));
            }
        }
 
        return this.elementCodec.encode(input.value(), ops, prefix);
    }
 
    @Override
    public <T> DataResult<Pair<Holder<E>, T>> decode(DynamicOps<T> ops, T input) {
        if (ops instanceof RegistryOps<?> registryOps) {
            Optional<HolderGetter<E>> maybeLookup = registryOps.getter(this.registryKey);
            if (maybeLookup.isEmpty()) {
                return DataResult.error(() -> "Registry does not exist: " + this.registryKey);
            } else {
                HolderGetter<E> lookup = maybeLookup.get();
                DataResult<Pair<Identifier, T>> decoded = Identifier.CODEC.decode(ops, input);
                if (decoded.result().isEmpty()) {
                    return !this.allowInline
                        ? DataResult.error(() -> "Inline definitions not allowed here")
                        : this.elementCodec.decode(ops, input).map(p -> p.mapFirst(Holder::direct));
                } else {
                    Pair<Identifier, T> pair = decoded.result().get();
                    ResourceKey<E> elementKey = ResourceKey.create(this.registryKey, pair.getFirst());
                    return lookup.get(elementKey)
                        .map(DataResult::success)
                        .orElseGet(() -> DataResult.error(() -> "Failed to get element " + elementKey))
                        .<Pair<Holder<E>, T>>map(h -> Pair.of(h, pair.getSecond()))
                        .setLifecycle(Lifecycle.stable());
                }
            }
        } else {
            return this.elementCodec.decode(ops, input).map(p -> p.mapFirst(Holder::direct));
        }
    }
 
    @Override
    public String toString() {
        return "RegistryFileCodec[" + this.registryKey + " " + this.elementCodec + "]";
    }
}

引用的其他类

  • Holder

    • 引用位置: 参数/实现/返回值
  • Registry

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

    • 引用位置: 参数/字段/方法调用
    • 关联成员: ResourceKey.create()