WorldLoader.java

net.minecraft.server.WorldLoader

信息

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

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.server.WorldLoader.DataLoadContext

    • 类型: record
    • 修饰符: public
    • 源码定位: L94
    • 说明:

      TODO

  • net.minecraft.server.WorldLoader.DataLoadOutput

    • 类型: record
    • 修饰符: public
    • 源码定位: L99
    • 说明:

      TODO

  • net.minecraft.server.WorldLoader.InitConfig

    • 类型: record
    • 修饰符: public
    • 源码定位: L102
    • 说明:

      TODO

  • net.minecraft.server.WorldLoader.PackConfig

    • 类型: record
    • 修饰符: public
    • 源码定位: L105
    • 说明:

      TODO

  • net.minecraft.server.WorldLoader.ResultFactory

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

      TODO

  • net.minecraft.server.WorldLoader.WorldDataSupplier

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

      TODO

构造器

方法

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

public static <D,R> CompletableFuture<R> load(WorldLoader.InitConfig config, WorldLoader.WorldDataSupplier<D> worldDataSupplier, WorldLoader.ResultFactory<D,R> resultFactory, Executor backgroundExecutor, Executor mainThreadExecutor) @ L25

  • 方法名:load
  • 源码定位:L25
  • 返回类型:<D,R> CompletableFuture
  • 修饰符:public static

参数:

  • config: WorldLoader.InitConfig
  • worldDataSupplier: WorldLoader.WorldDataSupplier
  • resultFactory: WorldLoader.ResultFactory<D,R>
  • backgroundExecutor: Executor
  • mainThreadExecutor: Executor

说明:

TODO

代码

public class WorldLoader {
    public static <D, R> CompletableFuture<R> load(
        WorldLoader.InitConfig config,
        WorldLoader.WorldDataSupplier<D> worldDataSupplier,
        WorldLoader.ResultFactory<D, R> resultFactory,
        Executor backgroundExecutor,
        Executor mainThreadExecutor
    ) {
        return CompletableFuture.supplyAsync(config.packConfig::createResourceManager, mainThreadExecutor)
            .thenComposeAsync(
                packsAndResourceManager -> {
                    CloseableResourceManager resources = packsAndResourceManager.getSecond();
                    LayeredRegistryAccess<RegistryLayer> initialLayers = RegistryLayer.createRegistryAccess();
                    List<Registry.PendingTags<?>> staticLayerTags = TagLoader.loadTagsForExistingRegistries(
                        resources, initialLayers.getLayer(RegistryLayer.STATIC)
                    );
                    RegistryAccess.Frozen worldgenLoadContext = initialLayers.getAccessForLoading(RegistryLayer.WORLDGEN);
                    List<HolderLookup.RegistryLookup<?>> worldgenContextRegistries = TagLoader.buildUpdatedLookups(worldgenLoadContext, staticLayerTags);
                    return RegistryDataLoader.load(resources, worldgenContextRegistries, RegistryDataLoader.WORLDGEN_REGISTRIES, backgroundExecutor)
                        .thenComposeAsync(
                            loadedWorldgenRegistries -> {
                                List<HolderLookup.RegistryLookup<?>> dimensionContextRegistries = Stream.concat(
                                        worldgenContextRegistries.stream(), loadedWorldgenRegistries.listRegistries()
                                    )
                                    .toList();
                                return RegistryDataLoader.load(
                                        resources, dimensionContextRegistries, RegistryDataLoader.DIMENSION_REGISTRIES, backgroundExecutor
                                    )
                                    .thenComposeAsync(
                                        initialWorldgenDimensions -> {
                                            WorldDataConfiguration worldDataConfiguration = (WorldDataConfiguration)packsAndResourceManager.getFirst();
                                            HolderLookup.Provider dimensionContextProvider = HolderLookup.Provider.create(dimensionContextRegistries.stream());
                                            WorldLoader.DataLoadOutput<D> worldDataAndRegistries = worldDataSupplier.get(
                                                new WorldLoader.DataLoadContext(
                                                    resources, worldDataConfiguration, dimensionContextProvider, initialWorldgenDimensions
                                                )
                                            );
                                            LayeredRegistryAccess<RegistryLayer> resourcesLoadContext = initialLayers.replaceFrom(
                                                RegistryLayer.WORLDGEN, loadedWorldgenRegistries, worldDataAndRegistries.finalDimensions
                                            );
                                            return ReloadableServerResources.loadResources(
                                                    resources,
                                                    resourcesLoadContext,
                                                    staticLayerTags,
                                                    worldDataConfiguration.enabledFeatures(),
                                                    config.commandSelection(),
                                                    config.functionCompilationPermissions(),
                                                    backgroundExecutor,
                                                    mainThreadExecutor
                                                )
                                                .whenComplete((managers, throwable) -> {
                                                    if (throwable != null) {
                                                        resources.close();
                                                    }
                                                })
                                                .thenApplyAsync(managers -> {
                                                    managers.updateComponentsAndStaticRegistryTags();
                                                    return resultFactory.create(resources, managers, resourcesLoadContext, worldDataAndRegistries.cookie);
                                                }, mainThreadExecutor);
                                        },
                                        backgroundExecutor
                                    );
                            },
                            backgroundExecutor
                        );
                },
                backgroundExecutor
            );
    }
 
    public record DataLoadContext(
        ResourceManager resources, WorldDataConfiguration dataConfiguration, HolderLookup.Provider datapackWorldgen, RegistryAccess.Frozen datapackDimensions
    ) {
    }
 
    public record DataLoadOutput<D>(D cookie, RegistryAccess.Frozen finalDimensions) {
    }
 
    public record InitConfig(WorldLoader.PackConfig packConfig, Commands.CommandSelection commandSelection, PermissionSet functionCompilationPermissions) {
    }
 
    public record PackConfig(PackRepository packRepository, WorldDataConfiguration initialDataConfig, boolean safeMode, boolean initMode) {
        public Pair<WorldDataConfiguration, CloseableResourceManager> createResourceManager() {
            WorldDataConfiguration newPackConfig = MinecraftServer.configurePackRepository(
                this.packRepository, this.initialDataConfig, this.initMode, this.safeMode
            );
            List<PackResources> openedPacks = this.packRepository.openAllSelected();
            CloseableResourceManager resources = new MultiPackResourceManager(PackType.SERVER_DATA, openedPacks);
            return Pair.of(newPackConfig, resources);
        }
    }
 
    @FunctionalInterface
    public interface ResultFactory<D, R> {
        R create(CloseableResourceManager resources, ReloadableServerResources managers, LayeredRegistryAccess<RegistryLayer> registries, D cookie);
    }
 
    @FunctionalInterface
    public interface WorldDataSupplier<D> {
        WorldLoader.DataLoadOutput<D> get(WorldLoader.DataLoadContext context);
    }
}

引用的其他类

  • HolderLookup

    • 引用位置: 方法调用
    • 关联成员: HolderLookup.Provider.create()
  • RegistryDataLoader

    • 引用位置: 方法调用
    • 关联成员: RegistryDataLoader.load()
  • MinecraftServer

    • 引用位置: 方法调用
    • 关联成员: MinecraftServer.configurePackRepository()
  • RegistryLayer

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

    • 引用位置: 方法调用
    • 关联成员: ReloadableServerResources.loadResources()
  • MultiPackResourceManager

    • 引用位置: 构造调用
    • 关联成员: MultiPackResourceManager()
  • TagLoader

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