RegistryDataCollector.java
net.minecraft.client.multiplayer.RegistryDataCollector
信息
- 全限定名:net.minecraft.client.multiplayer.RegistryDataCollector
- 类型:public class
- 包:net.minecraft.client.multiplayer
- 源码路径:src/main/java/net/minecraft/client/multiplayer/RegistryDataCollector.java
- 起始行号:L33
- 职责:
TODO
字段/常量
-
LOGGER- 类型:
Logger - 修饰符:
private static final - 源码定位:
L34 - 说明:
TODO
- 类型:
-
contentsCollector- 类型:
RegistryDataCollector.ContentsCollector - 修饰符:
private - 源码定位:
L35 - 说明:
TODO
- 类型:
-
tagCollector- 类型:
RegistryDataCollector.TagCollector - 修饰符:
private - 源码定位:
L36 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.client.multiplayer.RegistryDataCollector.ContentsCollector- 类型:
class - 修饰符:
private static - 源码定位:
L181 - 说明:
TODO
- 类型:
-
net.minecraft.client.multiplayer.RegistryDataCollector.TagCollector- 类型:
class - 修饰符:
private static - 源码定位:
L190 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
public void appendContents(ResourceKey<?extends Registry<?>> registry, List<RegistrySynchronization.PackedRegistryEntry> elementData) @ L38
- 方法名:appendContents
- 源码定位:L38
- 返回类型:void
- 修饰符:public
参数:
- registry: ResourceKey>
- elementData: List<RegistrySynchronization.PackedRegistryEntry>
说明:
TODO
public void appendTags(Map<ResourceKey<?extends Registry<?>>,TagNetworkSerialization.NetworkPayload> data) @ L46
- 方法名:appendTags
- 源码定位:L46
- 返回类型:void
- 修饰符:public
参数:
- data: Map<ResourceKey>,TagNetworkSerialization.NetworkPayload>
说明:
TODO
private static <T> Registry.PendingTags<T> resolveRegistryTags(RegistryAccess.Frozen context, ResourceKey<?extends Registry<?extends T>> registryKey, TagNetworkSerialization.NetworkPayload tags) @ L54
- 方法名:resolveRegistryTags
- 源码定位:L54
- 返回类型:
Registry.PendingTags - 修饰符:private static
参数:
- context: RegistryAccess.Frozen
- registryKey: ResourceKey<?extends Registry<?extends T>>
- tags: TagNetworkSerialization.NetworkPayload
说明:
TODO
private RegistryAccess loadNewElementsAndTags(ResourceProvider knownDataSource, RegistryDataCollector.ContentsCollector contentsCollector, boolean tagsForSynchronizedRegistriesOnly) @ L61
- 方法名:loadNewElementsAndTags
- 源码定位:L61
- 返回类型:RegistryAccess
- 修饰符:private
参数:
- knownDataSource: ResourceProvider
- contentsCollector: RegistryDataCollector.ContentsCollector
- tagsForSynchronizedRegistriesOnly: boolean
说明:
TODO
private static void addCrashDetails(CrashReport report, Map<ResourceKey<?extends Registry<?>>,RegistryDataLoader.NetworkedRegistryData> dynamicRegistries, List<Registry.PendingTags<?>> staticRegistries) @ L114
- 方法名:addCrashDetails
- 源码定位:L114
- 返回类型:void
- 修饰符:private static
参数:
- report: CrashReport
- dynamicRegistries: Map<ResourceKey>,RegistryDataLoader.NetworkedRegistryData>
- staticRegistries: List<Registry.PendingTags<?>>
说明:
TODO
private static void loadOnlyTags(RegistryDataCollector.TagCollector tagCollector, RegistryAccess.Frozen originalRegistries, boolean includeSharedRegistries) @ L145
- 方法名:loadOnlyTags
- 源码定位:L145
- 返回类型:void
- 修饰符:private static
参数:
- tagCollector: RegistryDataCollector.TagCollector
- originalRegistries: RegistryAccess.Frozen
- includeSharedRegistries: boolean
说明:
TODO
private static void updateComponents(RegistryAccess.Frozen frozenRegistries, boolean includeSharedRegistries) @ L153
- 方法名:updateComponents
- 源码定位:L153
- 返回类型:void
- 修饰符:private static
参数:
- frozenRegistries: RegistryAccess.Frozen
- includeSharedRegistries: boolean
说明:
TODO
public RegistryAccess.Frozen collectGameRegistries(ResourceProvider knownDataSource, RegistryAccess.Frozen originalRegistries, boolean tagsAndComponentsForSynchronizedRegistriesOnly) @ L161
- 方法名:collectGameRegistries
- 源码定位:L161
- 返回类型:RegistryAccess.Frozen
- 修饰符:public
参数:
- knownDataSource: ResourceProvider
- originalRegistries: RegistryAccess.Frozen
- tagsAndComponentsForSynchronizedRegistriesOnly: boolean
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class RegistryDataCollector {
private static final Logger LOGGER = LogUtils.getLogger();
private RegistryDataCollector.@Nullable ContentsCollector contentsCollector;
private RegistryDataCollector.@Nullable TagCollector tagCollector;
public void appendContents(ResourceKey<? extends Registry<?>> registry, List<RegistrySynchronization.PackedRegistryEntry> elementData) {
if (this.contentsCollector == null) {
this.contentsCollector = new RegistryDataCollector.ContentsCollector();
}
this.contentsCollector.append(registry, elementData);
}
public void appendTags(Map<ResourceKey<? extends Registry<?>>, TagNetworkSerialization.NetworkPayload> data) {
if (this.tagCollector == null) {
this.tagCollector = new RegistryDataCollector.TagCollector();
}
data.forEach(this.tagCollector::append);
}
private static <T> Registry.PendingTags<T> resolveRegistryTags(
RegistryAccess.Frozen context, ResourceKey<? extends Registry<? extends T>> registryKey, TagNetworkSerialization.NetworkPayload tags
) {
Registry<T> staticRegistry = context.lookupOrThrow(registryKey);
return staticRegistry.prepareTagReload(tags.resolve(staticRegistry));
}
private RegistryAccess loadNewElementsAndTags(
ResourceProvider knownDataSource, RegistryDataCollector.ContentsCollector contentsCollector, boolean tagsForSynchronizedRegistriesOnly
) {
LayeredRegistryAccess<ClientRegistryLayer> base = ClientRegistryLayer.createRegistryAccess();
RegistryAccess.Frozen loadingContext = base.getAccessForLoading(ClientRegistryLayer.REMOTE);
Map<ResourceKey<? extends Registry<?>>, RegistryDataLoader.NetworkedRegistryData> entriesToLoad = new HashMap<>();
contentsCollector.elements
.forEach(
(registryKey, elements) -> entriesToLoad.put(
(ResourceKey<? extends Registry<?>>)registryKey,
new RegistryDataLoader.NetworkedRegistryData(
(List<RegistrySynchronization.PackedRegistryEntry>)elements, TagNetworkSerialization.NetworkPayload.EMPTY
)
)
);
List<Registry.PendingTags<?>> pendingStaticTags = new ArrayList<>();
if (this.tagCollector != null) {
this.tagCollector.forEach((registryKey, tags) -> {
if (!tags.isEmpty()) {
if (RegistrySynchronization.isNetworkable((ResourceKey<? extends Registry<?>>)registryKey)) {
entriesToLoad.compute((ResourceKey<? extends Registry<?>>)registryKey, (key, previousData) -> {
List<RegistrySynchronization.PackedRegistryEntry> elements = previousData != null ? previousData.elements() : List.of();
return new RegistryDataLoader.NetworkedRegistryData(elements, tags);
});
} else if (!tagsForSynchronizedRegistriesOnly) {
pendingStaticTags.add(resolveRegistryTags(loadingContext, (ResourceKey<? extends Registry<?>>)registryKey, tags));
}
}
});
}
List<HolderLookup.RegistryLookup<?>> contextRegistriesWithTags = TagLoader.buildUpdatedLookups(loadingContext, pendingStaticTags);
RegistryAccess.Frozen receivedRegistries;
try {
long start = Util.getMillis();
receivedRegistries = RegistryDataLoader.load(
entriesToLoad, knownDataSource, contextRegistriesWithTags, RegistryDataLoader.SYNCHRONIZED_REGISTRIES, Util.backgroundExecutor()
)
.join();
long end = Util.getMillis();
LOGGER.debug("Loading network data took {} ms", end - start);
} catch (Exception var15) {
CrashReport report = CrashReport.forThrowable(var15, "Network Registry Load");
addCrashDetails(report, entriesToLoad, pendingStaticTags);
throw new ReportedException(report);
}
RegistryAccess registries = base.replaceFrom(ClientRegistryLayer.REMOTE, receivedRegistries).compositeAccess();
pendingStaticTags.forEach(Registry.PendingTags::apply);
return registries;
}
private static void addCrashDetails(
CrashReport report,
Map<ResourceKey<? extends Registry<?>>, RegistryDataLoader.NetworkedRegistryData> dynamicRegistries,
List<Registry.PendingTags<?>> staticRegistries
) {
CrashReportCategory details = report.addCategory("Received Elements and Tags");
details.setDetail(
"Dynamic Registries",
() -> dynamicRegistries.entrySet()
.stream()
.sorted(Comparator.comparing(entry -> entry.getKey().identifier()))
.map(
entry -> String.format(
Locale.ROOT,
"\n\t\t%s: elements=%d tags=%d",
entry.getKey().identifier(),
entry.getValue().elements().size(),
entry.getValue().tags().size()
)
)
.collect(Collectors.joining())
);
details.setDetail(
"Static Registries",
() -> staticRegistries.stream()
.sorted(Comparator.comparing(entry -> entry.key().identifier()))
.map(entry -> String.format(Locale.ROOT, "\n\t\t%s: tags=%d", entry.key().identifier(), entry.size()))
.collect(Collectors.joining())
);
}
private static void loadOnlyTags(RegistryDataCollector.TagCollector tagCollector, RegistryAccess.Frozen originalRegistries, boolean includeSharedRegistries) {
tagCollector.forEach((registryKey, tags) -> {
if (includeSharedRegistries || RegistrySynchronization.isNetworkable((ResourceKey<? extends Registry<?>>)registryKey)) {
resolveRegistryTags(originalRegistries, (ResourceKey<? extends Registry<?>>)registryKey, tags).apply();
}
});
}
private static void updateComponents(RegistryAccess.Frozen frozenRegistries, boolean includeSharedRegistries) {
BuiltInRegistries.DATA_COMPONENT_INITIALIZERS.build(frozenRegistries).forEach(pendingComponents -> {
if (includeSharedRegistries || RegistrySynchronization.isNetworkable(pendingComponents.key())) {
pendingComponents.apply();
}
});
}
public RegistryAccess.Frozen collectGameRegistries(
ResourceProvider knownDataSource, RegistryAccess.Frozen originalRegistries, boolean tagsAndComponentsForSynchronizedRegistriesOnly
) {
RegistryAccess registries;
if (this.contentsCollector != null) {
registries = this.loadNewElementsAndTags(knownDataSource, this.contentsCollector, tagsAndComponentsForSynchronizedRegistriesOnly);
} else {
if (this.tagCollector != null) {
loadOnlyTags(this.tagCollector, originalRegistries, !tagsAndComponentsForSynchronizedRegistriesOnly);
}
registries = originalRegistries;
}
RegistryAccess.Frozen frozenRegistries = registries.freeze();
updateComponents(frozenRegistries, !tagsAndComponentsForSynchronizedRegistriesOnly);
return frozenRegistries;
}
@OnlyIn(Dist.CLIENT)
private static class ContentsCollector {
private final Map<ResourceKey<? extends Registry<?>>, List<RegistrySynchronization.PackedRegistryEntry>> elements = new HashMap<>();
public void append(ResourceKey<? extends Registry<?>> registry, List<RegistrySynchronization.PackedRegistryEntry> elementData) {
this.elements.computeIfAbsent(registry, ignore -> new ArrayList<>()).addAll(elementData);
}
}
@OnlyIn(Dist.CLIENT)
private static class TagCollector {
private final Map<ResourceKey<? extends Registry<?>>, TagNetworkSerialization.NetworkPayload> tags = new HashMap<>();
public void append(ResourceKey<? extends Registry<?>> registry, TagNetworkSerialization.NetworkPayload tagData) {
this.tags.put(registry, tagData);
}
public void forEach(BiConsumer<? super ResourceKey<? extends Registry<?>>, ? super TagNetworkSerialization.NetworkPayload> action) {
this.tags.forEach(action);
}
}
}引用的其他类
-
- 引用位置:
参数/方法调用 - 关联成员:
CrashReport.forThrowable()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ReportedException()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ClientRegistryLayer.createRegistryAccess()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
参数/方法调用 - 关联成员:
RegistrySynchronization.isNetworkable()
- 引用位置:
-
- 引用位置:
参数/方法调用/构造调用 - 关联成员:
NetworkedRegistryData(), RegistryDataLoader.NetworkedRegistryData(), RegistryDataLoader.load()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
TagLoader.buildUpdatedLookups()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.backgroundExecutor(), Util.getMillis()
- 引用位置: