DataComponentInitializers.java

net.minecraft.core.component.DataComponentInitializers

信息

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

    TODO

字段/常量

  • initializers
    • 类型: List<DataComponentInitializers.InitializerEntry<?>>
    • 修饰符: private final
    • 源码定位: L17
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.core.component.DataComponentInitializers.BakedEntry

    • 类型: record
    • 修饰符: private
    • 源码定位: L100
    • 说明:

      TODO

  • net.minecraft.core.component.DataComponentInitializers.Initializer

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

      TODO

  • net.minecraft.core.component.DataComponentInitializers.InitializerEntry

    • 类型: record
    • 修饰符: private
    • 源码定位: L122
    • 说明:

      TODO

  • net.minecraft.core.component.DataComponentInitializers.PendingComponentBuilders

    • 类型: record
    • 修饰符: private
    • 源码定位: L128
    • 说明:

      TODO

  • net.minecraft.core.component.DataComponentInitializers.PendingComponents

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

      TODO

  • net.minecraft.core.component.DataComponentInitializers.SingleComponentInitializer

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

      TODO

构造器

方法

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

public <T> void add(ResourceKey<T> key, DataComponentInitializers.Initializer<T> initializer) @ L19

  • 方法名:add
  • 源码定位:L19
  • 返回类型: void
  • 修饰符:public

参数:

  • key: ResourceKey
  • initializer: DataComponentInitializers.Initializer

说明:

TODO

private Map<ResourceKey<?>,DataComponentMap.Builder> runInitializers(HolderLookup.Provider context) @ L23

  • 方法名:runInitializers
  • 源码定位:L23
  • 返回类型:Map<ResourceKey<?>,DataComponentMap.Builder>
  • 修饰符:private

参数:

  • context: HolderLookup.Provider

说明:

TODO

private static <T> void registryEmpty(Map<ResourceKey<?extends Registry<?>>,DataComponentInitializers.PendingComponentBuilders<?>> buildersByRegistry, ResourceKey<?extends Registry<?extends T>> registryKey) @ L34

  • 方法名:registryEmpty
  • 源码定位:L34
  • 返回类型: void
  • 修饰符:private static

参数:

  • buildersByRegistry: Map<ResourceKey>,DataComponentInitializers.PendingComponentBuilders<?>>
  • registryKey: ResourceKey<?extends Registry<?extends T>>

说明:

TODO

private static <T> void addBuilder(Map<ResourceKey<?extends Registry<?>>,DataComponentInitializers.PendingComponentBuilders<?>> buildersByRegistry, ResourceKey<T> key, DataComponentMap.Builder builder) @ L41

  • 方法名:addBuilder
  • 源码定位:L41
  • 返回类型: void
  • 修饰符:private static

参数:

  • buildersByRegistry: Map<ResourceKey>,DataComponentInitializers.PendingComponentBuilders<?>>
  • key: ResourceKey
  • builder: DataComponentMap.Builder

说明:

TODO

public List<DataComponentInitializers.PendingComponents<?>> build(HolderLookup.Provider context) @ L52

  • 方法名:build
  • 源码定位:L52
  • 返回类型:List<DataComponentInitializers.PendingComponents<?>>
  • 修饰符:public

参数:

  • context: HolderLookup.Provider

说明:

TODO

private static <T> DataComponentInitializers.PendingComponents<T> createInitializerForRegistry(HolderLookup.Provider context, DataComponentInitializers.PendingComponentBuilders<T> elementBuilders) @ L62

  • 方法名:createInitializerForRegistry
  • 源码定位:L62
  • 返回类型: DataComponentInitializers.PendingComponents
  • 修饰符:private static

参数:

  • context: HolderLookup.Provider
  • elementBuilders: DataComponentInitializers.PendingComponentBuilders

说明:

TODO

代码

public class DataComponentInitializers {
    private final List<DataComponentInitializers.InitializerEntry<?>> initializers = new ArrayList<>();
 
    public <T> void add(ResourceKey<T> key, DataComponentInitializers.Initializer<T> initializer) {
        this.initializers.add(new DataComponentInitializers.InitializerEntry<>(key, initializer));
    }
 
    private Map<ResourceKey<?>, DataComponentMap.Builder> runInitializers(HolderLookup.Provider context) {
        Map<ResourceKey<?>, DataComponentMap.Builder> results = new HashMap<>();
 
        for (DataComponentInitializers.InitializerEntry<?> initializer : this.initializers) {
            DataComponentMap.Builder builder = results.computeIfAbsent(initializer.key, k -> DataComponentMap.builder());
            initializer.run(builder, context);
        }
 
        return results;
    }
 
    private static <T> void registryEmpty(
        Map<ResourceKey<? extends Registry<?>>, DataComponentInitializers.PendingComponentBuilders<?>> buildersByRegistry,
        ResourceKey<? extends Registry<? extends T>> registryKey
    ) {
        buildersByRegistry.put(registryKey, new DataComponentInitializers.PendingComponentBuilders<>((ResourceKey<? extends Registry<T>>)registryKey, new HashMap<>()));
    }
 
    private static <T> void addBuilder(
        Map<ResourceKey<? extends Registry<?>>, DataComponentInitializers.PendingComponentBuilders<?>> buildersByRegistry,
        ResourceKey<T> key,
        DataComponentMap.Builder builder
    ) {
        DataComponentInitializers.PendingComponentBuilders<T> buildersForRegistry = (DataComponentInitializers.PendingComponentBuilders<T>)buildersByRegistry.get(
            key.registryKey()
        );
        buildersForRegistry.builders.put(key, builder);
    }
 
    public List<DataComponentInitializers.PendingComponents<?>> build(HolderLookup.Provider context) {
        Map<ResourceKey<? extends Registry<?>>, DataComponentInitializers.PendingComponentBuilders<?>> buildersByRegistry = new HashMap<>();
        context.listRegistryKeys().forEach(registryKey -> registryEmpty(buildersByRegistry, (ResourceKey<? extends Registry<?>>)registryKey));
        this.runInitializers(context).forEach((key, builder) -> addBuilder(buildersByRegistry, (ResourceKey<?>)key, builder));
        return buildersByRegistry.values()
            .stream()
            .map(elementBuilders -> createInitializerForRegistry(context, (DataComponentInitializers.PendingComponentBuilders<?>)elementBuilders))
            .collect(Collectors.toUnmodifiableList());
    }
 
    private static <T> DataComponentInitializers.PendingComponents<T> createInitializerForRegistry(
        HolderLookup.Provider context, DataComponentInitializers.PendingComponentBuilders<T> elementBuilders
    ) {
        final List<DataComponentInitializers.BakedEntry<T>> entries = new ArrayList<>();
        final ResourceKey<? extends Registry<T>> registryKey = elementBuilders.registryKey;
        HolderLookup.RegistryLookup<T> registry = context.lookupOrThrow(registryKey);
        Set<Holder.Reference<T>> elementsWithComponents = Sets.newIdentityHashSet();
        elementBuilders.builders.forEach((elementKey, elementBuilder) -> {
            Holder.Reference<T> element = registry.getOrThrow((ResourceKey<T>)elementKey);
            DataComponentMap components = elementBuilder.build();
            entries.add(new DataComponentInitializers.BakedEntry<>(element, components));
            elementsWithComponents.add(element);
        });
        registry.listElements()
            .filter(e -> !elementsWithComponents.contains(e))
            .forEach(
                elementWithoutComponents -> entries.add(
                    new DataComponentInitializers.BakedEntry<>((Holder.Reference<T>)elementWithoutComponents, DataComponentMap.EMPTY)
                )
            );
        return new DataComponentInitializers.PendingComponents<T>() {
            @Override
            public ResourceKey<? extends Registry<? extends T>> key() {
                return registryKey;
            }
 
            @Override
            public void forEach(BiConsumer<Holder.Reference<T>, DataComponentMap> output) {
                entries.forEach(e -> output.accept(e.element, e.components));
            }
 
            @Override
            public void apply() {
                entries.forEach(DataComponentInitializers.BakedEntry::apply);
            }
        };
    }
 
    private record BakedEntry<T>(Holder.Reference<T> element, DataComponentMap components) {
        public void apply() {
            this.element.bindComponents(this.components);
        }
    }
 
    @FunctionalInterface
    public interface Initializer<T> {
        void run(DataComponentMap.Builder components, HolderLookup.Provider context, ResourceKey<T> key);
 
        default DataComponentInitializers.Initializer<T> andThen(DataComponentInitializers.Initializer<T> other) {
            return (components, context, key) -> {
                this.run(components, context, key);
                other.run(components, context, key);
            };
        }
 
        default <C> DataComponentInitializers.Initializer<T> add(DataComponentType<C> type, C value) {
            return this.andThen((components, context, key) -> components.set(type, value));
        }
    }
 
    private record InitializerEntry<T>(ResourceKey<T> key, DataComponentInitializers.Initializer<T> initializer) {
        public void run(DataComponentMap.Builder components, HolderLookup.Provider context) {
            this.initializer.run(components, context, this.key);
        }
    }
 
    private record PendingComponentBuilders<T>(ResourceKey<? extends Registry<T>> registryKey, Map<ResourceKey<T>, DataComponentMap.Builder> builders) {
    }
 
    public interface PendingComponents<T> {
        ResourceKey<? extends Registry<? extends T>> key();
 
        void forEach(BiConsumer<Holder.Reference<T>, DataComponentMap> output);
 
        void apply();
    }
 
    @FunctionalInterface
    public interface SingleComponentInitializer<C> {
        C create(HolderLookup.Provider context);
 
        default <T> DataComponentInitializers.Initializer<T> asInitializer(DataComponentType<C> type) {
            return (components, context, key) -> components.set(type, this.create(context));
        }
    }
}

引用的其他类