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

    • 引用位置: 参数/方法调用
    • 关联成员: CrashReport.forThrowable()
  • ReportedException

    • 引用位置: 构造调用
    • 关联成员: ReportedException()
  • ClientRegistryLayer

    • 引用位置: 方法调用
    • 关联成员: ClientRegistryLayer.createRegistryAccess()
  • Registry

    • 引用位置: 参数/返回值
  • RegistryAccess

    • 引用位置: 参数/返回值
  • RegistrySynchronization

    • 引用位置: 参数/方法调用
    • 关联成员: RegistrySynchronization.isNetworkable()
  • RegistryDataLoader

    • 引用位置: 参数/方法调用/构造调用
    • 关联成员: NetworkedRegistryData(), RegistryDataLoader.NetworkedRegistryData(), RegistryDataLoader.load()
  • ResourceKey

    • 引用位置: 参数
  • ResourceProvider

    • 引用位置: 参数
  • TagLoader

    • 引用位置: 方法调用
    • 关联成员: TagLoader.buildUpdatedLookups()
  • TagNetworkSerialization

    • 引用位置: 参数
  • Util

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