LayeredRegistryAccess.java

net.minecraft.core.LayeredRegistryAccess

信息

  • 全限定名:net.minecraft.core.LayeredRegistryAccess
  • 类型:public class
  • 包:net.minecraft.core
  • 源码路径:src/main/java/net/minecraft/core/LayeredRegistryAccess.java
  • 起始行号:L12
  • 职责:

    TODO

字段/常量

  • keys

    • 类型: List<T>
    • 修饰符: private final
    • 源码定位: L13
    • 说明:

      TODO

  • values

    • 类型: List<RegistryAccess.Frozen>
    • 修饰符: private final
    • 源码定位: L14
    • 说明:

      TODO

  • composite

    • 类型: RegistryAccess.Frozen
    • 修饰符: private final
    • 源码定位: L15
    • 说明:

      TODO

内部类/嵌套类型

构造器

public LayeredRegistryAccess(List<T> keys) @ L17

  • 构造器名:LayeredRegistryAccess
  • 源码定位:L17
  • 修饰符:public

参数:

  • keys: List

说明:

TODO

private LayeredRegistryAccess(List<T> keys, List<RegistryAccess.Frozen> values) @ L25

  • 构造器名:LayeredRegistryAccess
  • 源码定位:L25
  • 修饰符:private

参数:

  • keys: List
  • values: List<RegistryAccess.Frozen>

说明:

TODO

方法

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

private int getLayerIndexOrThrow(T layer) @ L31

  • 方法名:getLayerIndexOrThrow
  • 源码定位:L31
  • 返回类型:int
  • 修饰符:private

参数:

  • layer: T

说明:

TODO

public RegistryAccess.Frozen getLayer(T layer) @ L40

  • 方法名:getLayer
  • 源码定位:L40
  • 返回类型:RegistryAccess.Frozen
  • 修饰符:public

参数:

  • layer: T

说明:

TODO

public RegistryAccess.Frozen getAccessForLoading(T forLayer) @ L45

  • 方法名:getAccessForLoading
  • 源码定位:L45
  • 返回类型:RegistryAccess.Frozen
  • 修饰符:public

参数:

  • forLayer: T

说明:

TODO

public RegistryAccess.Frozen getAccessFrom(T forLayer) @ L50

  • 方法名:getAccessFrom
  • 源码定位:L50
  • 返回类型:RegistryAccess.Frozen
  • 修饰符:public

参数:

  • forLayer: T

说明:

TODO

private RegistryAccess.Frozen getCompositeAccessForLayers(int from, int to) @ L55

  • 方法名:getCompositeAccessForLayers
  • 源码定位:L55
  • 返回类型:RegistryAccess.Frozen
  • 修饰符:private

参数:

  • from: int
  • to: int

说明:

TODO

public LayeredRegistryAccess<T> replaceFrom(T fromLayer, RegistryAccess.Frozen... layers) @ L59

  • 方法名:replaceFrom
  • 源码定位:L59
  • 返回类型:LayeredRegistryAccess
  • 修饰符:public

参数:

  • fromLayer: T
  • layers: RegistryAccess.Frozen…

说明:

TODO

public LayeredRegistryAccess<T> replaceFrom(T fromLayer, List<RegistryAccess.Frozen> layers) @ L63

  • 方法名:replaceFrom
  • 源码定位:L63
  • 返回类型:LayeredRegistryAccess
  • 修饰符:public

参数:

  • fromLayer: T
  • layers: List<RegistryAccess.Frozen>

说明:

TODO

public RegistryAccess.Frozen compositeAccess() @ L84

  • 方法名:compositeAccess
  • 源码定位:L84
  • 返回类型:RegistryAccess.Frozen
  • 修饰符:public

参数:

说明:

TODO

private static Map<ResourceKey<?extends Registry<?>>,Registry<?>> collectRegistries(Stream<?extends RegistryAccess> registries) @ L88

  • 方法名:collectRegistries
  • 源码定位:L88
  • 返回类型:Map<ResourceKey>,Registry<?>>
  • 修饰符:private static

参数:

  • registries: Stream<?extends RegistryAccess>

说明:

TODO

代码

public class LayeredRegistryAccess<T> {
    private final List<T> keys;
    private final List<RegistryAccess.Frozen> values;
    private final RegistryAccess.Frozen composite;
 
    public LayeredRegistryAccess(List<T> keys) {
        this(keys, Util.make(() -> {
            RegistryAccess.Frozen[] layers = new RegistryAccess.Frozen[keys.size()];
            Arrays.fill(layers, RegistryAccess.EMPTY);
            return Arrays.asList(layers);
        }));
    }
 
    private LayeredRegistryAccess(List<T> keys, List<RegistryAccess.Frozen> values) {
        this.keys = List.copyOf(keys);
        this.values = List.copyOf(values);
        this.composite = new RegistryAccess.ImmutableRegistryAccess(collectRegistries(values.stream())).freeze();
    }
 
    private int getLayerIndexOrThrow(T layer) {
        int index = this.keys.indexOf(layer);
        if (index == -1) {
            throw new IllegalStateException("Can't find " + layer + " inside " + this.keys);
        } else {
            return index;
        }
    }
 
    public RegistryAccess.Frozen getLayer(T layer) {
        int index = this.getLayerIndexOrThrow(layer);
        return this.values.get(index);
    }
 
    public RegistryAccess.Frozen getAccessForLoading(T forLayer) {
        int index = this.getLayerIndexOrThrow(forLayer);
        return this.getCompositeAccessForLayers(0, index);
    }
 
    public RegistryAccess.Frozen getAccessFrom(T forLayer) {
        int index = this.getLayerIndexOrThrow(forLayer);
        return this.getCompositeAccessForLayers(index, this.values.size());
    }
 
    private RegistryAccess.Frozen getCompositeAccessForLayers(int from, int to) {
        return new RegistryAccess.ImmutableRegistryAccess(collectRegistries(this.values.subList(from, to).stream())).freeze();
    }
 
    public LayeredRegistryAccess<T> replaceFrom(T fromLayer, RegistryAccess.Frozen... layers) {
        return this.replaceFrom(fromLayer, Arrays.asList(layers));
    }
 
    public LayeredRegistryAccess<T> replaceFrom(T fromLayer, List<RegistryAccess.Frozen> layers) {
        int index = this.getLayerIndexOrThrow(fromLayer);
        if (layers.size() > this.values.size() - index) {
            throw new IllegalStateException("Too many values to replace");
        } else {
            List<RegistryAccess.Frozen> newValues = new ArrayList<>();
 
            for (int i = 0; i < index; i++) {
                newValues.add(this.values.get(i));
            }
 
            newValues.addAll(layers);
 
            while (newValues.size() < this.values.size()) {
                newValues.add(RegistryAccess.EMPTY);
            }
 
            return new LayeredRegistryAccess<>(this.keys, newValues);
        }
    }
 
    public RegistryAccess.Frozen compositeAccess() {
        return this.composite;
    }
 
    private static Map<ResourceKey<? extends Registry<?>>, Registry<?>> collectRegistries(Stream<? extends RegistryAccess> registries) {
        Map<ResourceKey<? extends Registry<?>>, Registry<?>> result = new HashMap<>();
        registries.forEach(access -> access.registries().forEach(e -> {
            if (result.put(e.key(), e.value()) != null) {
                throw new IllegalStateException("Duplicated registry " + e.key());
            }
        }));
        return result;
    }
}

引用的其他类

  • Registry

    • 引用位置: 返回值
  • RegistryAccess

    • 引用位置: 参数/字段/方法调用/构造调用/返回值
    • 关联成员: ImmutableRegistryAccess(), RegistryAccess.ImmutableRegistryAccess()
  • ResourceKey

    • 引用位置: 返回值
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.make()