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 + "]";
}
}引用的其他类
-
- 引用位置:
参数/实现/返回值
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数/字段/方法调用 - 关联成员:
ResourceKey.create()
- 引用位置: