package net.minecraft.server; import com.mojang.logging.LogUtils; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.Commands; import net.minecraft.core.HolderLookup; import net.minecraft.core.LayeredRegistryAccess; import net.minecraft.core.Registry; import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.SimpleReloadInstance; import net.minecraft.util.Unit; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.crafting.RecipeManager; import org.slf4j.Logger; public class ReloadableServerResources { private static final Logger LOGGER = LogUtils.getLogger(); private static final CompletableFuture DATA_RELOAD_INITIAL_TASK = CompletableFuture.completedFuture(Unit.INSTANCE); private final ReloadableServerRegistries.Holder fullRegistryHolder; private final Commands commands; private final RecipeManager recipes; private final ServerAdvancementManager advancements; private final ServerFunctionLibrary functionLibrary; private final List> postponedTags; private ReloadableServerResources( LayeredRegistryAccess p_368059_, HolderLookup.Provider p_363207_, FeatureFlagSet p_250695_, Commands.CommandSelection p_206858_, List> p_364269_, int p_206859_ ) { this.fullRegistryHolder = new ReloadableServerRegistries.Holder(p_368059_.compositeAccess()); this.postponedTags = p_364269_; this.recipes = new RecipeManager(p_363207_); this.commands = new Commands(p_206858_, CommandBuildContext.simple(p_363207_, p_250695_)); this.advancements = new ServerAdvancementManager(p_363207_); this.functionLibrary = new ServerFunctionLibrary(p_206859_, this.commands.getDispatcher()); } public ServerFunctionLibrary getFunctionLibrary() { return this.functionLibrary; } public ReloadableServerRegistries.Holder fullRegistries() { return this.fullRegistryHolder; } public RecipeManager getRecipeManager() { return this.recipes; } public Commands getCommands() { return this.commands; } public ServerAdvancementManager getAdvancements() { return this.advancements; } public List listeners() { return List.of(this.recipes, this.functionLibrary, this.advancements); } public static CompletableFuture loadResources( ResourceManager p_248588_, LayeredRegistryAccess p_330376_, List> p_366334_, FeatureFlagSet p_250212_, Commands.CommandSelection p_249301_, int p_251126_, Executor p_249136_, Executor p_249601_ ) { return ReloadableServerRegistries.reload(p_330376_, p_366334_, p_248588_, p_249136_) .thenCompose( p_358539_ -> { ReloadableServerResources reloadableserverresources = new ReloadableServerResources( p_358539_.layers(), p_358539_.lookupWithUpdatedTags(), p_250212_, p_249301_, p_366334_, p_251126_ ); return SimpleReloadInstance.create( p_248588_, reloadableserverresources.listeners(), p_249136_, p_249601_, DATA_RELOAD_INITIAL_TASK, LOGGER.isDebugEnabled() ) .done() .thenApply(p_214306_ -> reloadableserverresources); } ); } public void updateStaticRegistryTags() { this.postponedTags.forEach(Registry.PendingTags::apply); } }