package net.minecraft.server; import com.mojang.datafixers.util.Pair; import com.mojang.logging.LogUtils; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.stream.Stream; import net.minecraft.commands.Commands; import net.minecraft.core.HolderLookup; import net.minecraft.core.LayeredRegistryAccess; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; import net.minecraft.resources.RegistryDataLoader; import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.packs.resources.CloseableResourceManager; import net.minecraft.server.packs.resources.MultiPackResourceManager; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.tags.TagLoader; import net.minecraft.world.level.WorldDataConfiguration; import org.slf4j.Logger; public class WorldLoader { private static final Logger LOGGER = LogUtils.getLogger(); public static CompletableFuture load( WorldLoader.InitConfig p_214363_, WorldLoader.WorldDataSupplier p_214364_, WorldLoader.ResultFactory p_214365_, Executor p_214366_, Executor p_214367_ ) { try { Pair pair = p_214363_.packConfig.createResourceManager(); CloseableResourceManager closeableresourcemanager = pair.getSecond(); LayeredRegistryAccess layeredregistryaccess = RegistryLayer.createRegistryAccess(); List> list = TagLoader.loadTagsForExistingRegistries(closeableresourcemanager, layeredregistryaccess.getLayer(RegistryLayer.STATIC)); RegistryAccess.Frozen registryaccess$frozen = layeredregistryaccess.getAccessForLoading(RegistryLayer.WORLDGEN); List> list1 = TagLoader.buildUpdatedLookups(registryaccess$frozen, list); RegistryAccess.Frozen registryaccess$frozen1 = RegistryDataLoader.load(closeableresourcemanager, list1, RegistryDataLoader.WORLDGEN_REGISTRIES); List> list2 = Stream.concat(list1.stream(), registryaccess$frozen1.listRegistries()).toList(); RegistryAccess.Frozen registryaccess$frozen2 = RegistryDataLoader.load(closeableresourcemanager, list2, RegistryDataLoader.DIMENSION_REGISTRIES); WorldDataConfiguration worlddataconfiguration = pair.getFirst(); HolderLookup.Provider holderlookup$provider = HolderLookup.Provider.create(list2.stream()); WorldLoader.DataLoadOutput dataloadoutput = p_214364_.get( new WorldLoader.DataLoadContext(closeableresourcemanager, worlddataconfiguration, holderlookup$provider, registryaccess$frozen2) ); LayeredRegistryAccess layeredregistryaccess1 = layeredregistryaccess.replaceFrom( RegistryLayer.WORLDGEN, registryaccess$frozen1, dataloadoutput.finalDimensions ); return ReloadableServerResources.loadResources( closeableresourcemanager, layeredregistryaccess1, list, worlddataconfiguration.enabledFeatures(), p_214363_.commandSelection(), p_214363_.functionCompilationLevel(), p_214366_, p_214367_ ) .whenComplete((p_214370_, p_214371_) -> { if (p_214371_ != null) { closeableresourcemanager.close(); } }) .thenApplyAsync(p_358549_ -> { p_358549_.updateStaticRegistryTags(); return p_214365_.create(closeableresourcemanager, p_358549_, layeredregistryaccess1, dataloadoutput.cookie); }, p_214367_); } catch (Exception exception) { return CompletableFuture.failedFuture(exception); } } public static record DataLoadContext( ResourceManager resources, WorldDataConfiguration dataConfiguration, HolderLookup.Provider datapackWorldgen, RegistryAccess.Frozen datapackDimensions ) { } public static record DataLoadOutput(D cookie, RegistryAccess.Frozen finalDimensions) { } public static record InitConfig(WorldLoader.PackConfig packConfig, Commands.CommandSelection commandSelection, int functionCompilationLevel) { } public static record PackConfig(PackRepository packRepository, WorldDataConfiguration initialDataConfig, boolean safeMode, boolean initMode) { public Pair createResourceManager() { WorldDataConfiguration worlddataconfiguration = MinecraftServer.configurePackRepository(this.packRepository, this.initialDataConfig, this.initMode, this.safeMode); List list = this.packRepository.openAllSelected(); CloseableResourceManager closeableresourcemanager = new MultiPackResourceManager(PackType.SERVER_DATA, list); return Pair.of(worlddataconfiguration, closeableresourcemanager); } } @FunctionalInterface public interface ResultFactory { R create(CloseableResourceManager p_214408_, ReloadableServerResources p_214409_, LayeredRegistryAccess p_248844_, D p_214411_); } @FunctionalInterface public interface WorldDataSupplier { WorldLoader.DataLoadOutput get(WorldLoader.DataLoadContext p_251042_); } }