2018-06-06 15:37:56 +00:00
|
|
|
/*
|
|
|
|
* Minecraft Forge
|
2019-02-10 22:57:03 +00:00
|
|
|
* Copyright (c) 2016-2019.
|
2018-06-06 15:37:56 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation version 2.1
|
|
|
|
* of the License.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
package net.minecraftforge.fml.client;
|
|
|
|
|
|
|
|
import net.minecraft.client.Minecraft;
|
2018-09-05 00:23:45 +00:00
|
|
|
import net.minecraft.client.resources.DownloadingPackFinder;
|
2019-05-23 23:02:15 +00:00
|
|
|
import net.minecraft.client.resources.ClientResourcePackInfo;
|
2019-06-22 02:42:16 +00:00
|
|
|
import net.minecraft.profiler.IProfiler;
|
2019-08-05 00:16:01 +00:00
|
|
|
import net.minecraft.resources.IFutureReloadListener;
|
|
|
|
import net.minecraft.resources.IReloadableResourceManager;
|
|
|
|
import net.minecraft.resources.IResourceManager;
|
|
|
|
import net.minecraft.resources.ResourcePackList;
|
2018-06-21 19:37:32 +00:00
|
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
2019-06-23 20:01:20 +00:00
|
|
|
import net.minecraftforge.client.event.ModelRegistryEvent;
|
2019-07-21 01:04:00 +00:00
|
|
|
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
2019-03-11 22:32:37 +00:00
|
|
|
import net.minecraftforge.common.ForgeConfig;
|
2019-05-12 17:07:17 +00:00
|
|
|
import net.minecraftforge.common.MinecraftForge;
|
2019-06-23 20:01:20 +00:00
|
|
|
import net.minecraftforge.eventbus.api.Event;
|
2019-08-05 00:16:01 +00:00
|
|
|
import net.minecraftforge.fml.BrandingControl;
|
|
|
|
import net.minecraftforge.fml.LoadingFailedException;
|
|
|
|
import net.minecraftforge.fml.LogicalSidedProvider;
|
|
|
|
import net.minecraftforge.fml.ModLoader;
|
|
|
|
import net.minecraftforge.fml.ModLoadingWarning;
|
|
|
|
import net.minecraftforge.fml.SidedProvider;
|
|
|
|
import net.minecraftforge.fml.VersionChecker;
|
2018-09-29 01:07:46 +00:00
|
|
|
import net.minecraftforge.fml.client.gui.LoadingErrorScreen;
|
2019-06-23 20:01:20 +00:00
|
|
|
import net.minecraftforge.fml.client.registry.RenderingRegistry;
|
2018-10-06 01:42:15 +00:00
|
|
|
import net.minecraftforge.fml.packs.ResourcePackLoader;
|
2019-08-05 00:16:01 +00:00
|
|
|
import net.minecraftforge.fml.server.LanguageHook;
|
2019-03-11 22:32:37 +00:00
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
|
2019-05-23 23:02:15 +00:00
|
|
|
import com.mojang.blaze3d.platform.GlStateManager;
|
|
|
|
|
2019-03-11 22:32:37 +00:00
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
2019-06-22 02:42:16 +00:00
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
import java.util.concurrent.Executor;
|
2019-06-23 20:01:20 +00:00
|
|
|
import java.util.function.Consumer;
|
|
|
|
import java.util.function.Supplier;
|
2019-03-11 22:32:37 +00:00
|
|
|
|
|
|
|
import static net.minecraftforge.fml.loading.LogMarkers.LOADING;
|
2018-06-06 15:37:56 +00:00
|
|
|
|
2018-06-21 19:37:32 +00:00
|
|
|
@OnlyIn(Dist.CLIENT)
|
2018-06-06 15:37:56 +00:00
|
|
|
public class ClientModLoader
|
|
|
|
{
|
2019-03-11 22:32:37 +00:00
|
|
|
private static final Logger LOGGER = LogManager.getLogger();
|
2018-06-19 18:04:05 +00:00
|
|
|
private static boolean loading;
|
|
|
|
private static Minecraft mc;
|
2018-09-29 01:07:46 +00:00
|
|
|
private static LoadingFailedException error;
|
2019-06-23 03:39:00 +00:00
|
|
|
private static EarlyLoaderGUI earlyLoaderGUI;
|
2018-06-19 18:04:05 +00:00
|
|
|
|
2019-05-23 23:02:15 +00:00
|
|
|
public static void begin(final Minecraft minecraft, final ResourcePackList<ClientResourcePackInfo> defaultResourcePacks, final IReloadableResourceManager mcResourceManager, DownloadingPackFinder metadataSerializer)
|
2018-06-06 15:37:56 +00:00
|
|
|
{
|
2018-06-19 18:04:05 +00:00
|
|
|
loading = true;
|
|
|
|
ClientModLoader.mc = minecraft;
|
2018-06-11 01:12:46 +00:00
|
|
|
SidedProvider.setClient(()->minecraft);
|
2018-06-23 02:45:01 +00:00
|
|
|
LogicalSidedProvider.setClient(()->minecraft);
|
2019-08-05 00:16:01 +00:00
|
|
|
LanguageHook.loadForgeAndMCLangs();
|
2019-06-23 03:39:00 +00:00
|
|
|
earlyLoaderGUI = new EarlyLoaderGUI(minecraft.mainWindow);
|
2019-07-01 03:48:54 +00:00
|
|
|
createRunnableWithCatch(() -> ModLoader.get().gatherAndInitializeMods(earlyLoaderGUI::renderTick)).run();
|
2018-06-23 02:45:01 +00:00
|
|
|
ResourcePackLoader.loadResourcePacks(defaultResourcePacks);
|
2019-06-22 02:42:16 +00:00
|
|
|
mcResourceManager.addReloadListener(ClientModLoader::onreload);
|
|
|
|
mcResourceManager.addReloadListener(BrandingControl.resourceManagerReloadListener());
|
2019-07-21 01:04:00 +00:00
|
|
|
ModelLoaderRegistry.init();
|
2018-06-06 15:37:56 +00:00
|
|
|
}
|
|
|
|
|
2019-06-22 02:42:16 +00:00
|
|
|
private static CompletableFuture<Void> onreload(final IFutureReloadListener.IStage stage, final IResourceManager resourceManager, final IProfiler prepareProfiler, final IProfiler executeProfiler, final Executor asyncExecutor, final Executor syncExecutor) {
|
2019-06-23 16:26:25 +00:00
|
|
|
return CompletableFuture.runAsync(createRunnableWithCatch(() -> startModLoading(syncExecutor)), asyncExecutor).
|
2019-06-22 16:52:22 +00:00
|
|
|
thenCompose(stage::markCompleteAwaitingOthers).
|
2019-06-23 16:26:25 +00:00
|
|
|
thenRunAsync(() -> finishModLoading(syncExecutor), asyncExecutor);
|
2019-06-22 02:42:16 +00:00
|
|
|
}
|
|
|
|
|
2019-06-22 23:08:49 +00:00
|
|
|
private static Runnable createRunnableWithCatch(Runnable r) {
|
2019-06-22 02:42:16 +00:00
|
|
|
return ()-> {
|
|
|
|
try {
|
|
|
|
r.run();
|
|
|
|
} catch (LoadingFailedException e) {
|
|
|
|
MinecraftForge.EVENT_BUS.shutdown();
|
2019-06-22 16:52:22 +00:00
|
|
|
if (error == null) error = e;
|
2019-06-22 02:42:16 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2019-06-22 16:52:22 +00:00
|
|
|
|
2019-06-23 16:26:25 +00:00
|
|
|
private static void startModLoading(Executor executor) {
|
2019-06-23 03:39:00 +00:00
|
|
|
earlyLoaderGUI.handleElsewhere();
|
2019-06-23 20:01:20 +00:00
|
|
|
createRunnableWithCatch(() -> ModLoader.get().loadMods(executor, ClientModLoader::preSidedRunnable, ClientModLoader::postSidedRunnable)).run();
|
2019-06-23 03:39:00 +00:00
|
|
|
}
|
2019-06-23 20:01:20 +00:00
|
|
|
|
|
|
|
private static void postSidedRunnable(Consumer<Supplier<Event>> perModContainerEventProcessor) {
|
|
|
|
RenderingRegistry.loadEntityRenderers(mc.getRenderManager());
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void preSidedRunnable(Consumer<Supplier<Event>> perModContainerEventProcessor) {
|
|
|
|
perModContainerEventProcessor.accept(ModelRegistryEvent::new);
|
|
|
|
}
|
|
|
|
|
2019-06-23 16:26:25 +00:00
|
|
|
private static void finishModLoading(Executor executor)
|
2018-06-06 15:37:56 +00:00
|
|
|
{
|
2019-06-23 16:26:25 +00:00
|
|
|
createRunnableWithCatch(() -> ModLoader.get().finishMods(executor)).run();
|
2018-06-19 18:04:05 +00:00
|
|
|
loading = false;
|
2019-06-23 16:26:25 +00:00
|
|
|
// reload game settings on main thread
|
|
|
|
executor.execute(()->mc.gameSettings.loadOptions());
|
2018-06-06 15:37:56 +00:00
|
|
|
}
|
|
|
|
|
2018-06-11 01:12:46 +00:00
|
|
|
public static VersionChecker.Status checkForUpdates()
|
2018-06-06 15:37:56 +00:00
|
|
|
{
|
2018-06-11 01:12:46 +00:00
|
|
|
return VersionChecker.Status.UP_TO_DATE;
|
2018-06-06 15:37:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public static void complete()
|
|
|
|
{
|
2019-05-23 23:02:15 +00:00
|
|
|
GlStateManager.disableTexture();
|
|
|
|
GlStateManager.enableTexture();
|
2019-03-11 22:32:37 +00:00
|
|
|
List<ModLoadingWarning> warnings = ModLoader.get().getWarnings();
|
2019-03-23 00:58:10 +00:00
|
|
|
boolean showWarnings = true;
|
|
|
|
try {
|
|
|
|
showWarnings = ForgeConfig.CLIENT.showLoadWarnings.get();
|
|
|
|
} catch (NullPointerException e) {
|
|
|
|
// We're in an early error state, config is not available. Assume true.
|
|
|
|
}
|
|
|
|
if (!showWarnings) {
|
2019-03-11 22:32:37 +00:00
|
|
|
//User disabled warning screen, as least log them
|
|
|
|
if (!warnings.isEmpty()) {
|
|
|
|
LOGGER.warn(LOADING, "Mods loaded with {} warning(s)", warnings.size());
|
|
|
|
warnings.forEach(warning -> LOGGER.warn(LOADING, warning.formatToString()));
|
|
|
|
}
|
|
|
|
warnings = Collections.emptyList(); //Clear warnings, as the user does not want to see them
|
|
|
|
}
|
|
|
|
if (error != null || !warnings.isEmpty()) {
|
|
|
|
mc.displayGuiScreen(new LoadingErrorScreen(error, warnings));
|
2018-12-21 22:45:35 +00:00
|
|
|
} else {
|
|
|
|
ClientHooks.logMissingTextureErrors();
|
2018-09-29 01:07:46 +00:00
|
|
|
}
|
2019-06-23 06:17:51 +00:00
|
|
|
if (error == null) {
|
2019-06-22 16:31:27 +00:00
|
|
|
// We can finally start the forge eventbus up
|
|
|
|
MinecraftForge.EVENT_BUS.start();
|
|
|
|
}
|
2018-06-11 01:12:46 +00:00
|
|
|
}
|
2018-06-19 18:04:05 +00:00
|
|
|
|
2019-06-23 03:39:00 +00:00
|
|
|
public static void renderProgressText() {
|
|
|
|
earlyLoaderGUI.renderFromGUI();
|
|
|
|
}
|
2018-06-19 18:04:05 +00:00
|
|
|
public static boolean isLoading()
|
|
|
|
{
|
|
|
|
return loading;
|
|
|
|
}
|
2018-06-06 15:37:56 +00:00
|
|
|
}
|