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.Provider.create()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
RegistryDataLoader.load()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
MinecraftServer.configurePackRepository()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
RegistryLayer.createRegistryAccess()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ReloadableServerResources.loadResources()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
MultiPackResourceManager()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
TagLoader.buildUpdatedLookups(), TagLoader.loadTagsForExistingRegistries()
- 引用位置: