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));
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/方法调用/返回值 - 关联成员:
DataComponentMap.builder()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置: