diff --git a/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs b/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs index ae01fb60e6..7de5e8f276 100644 --- a/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs +++ b/OpenRA.Mods.Common/LoadScreens/BlankLoadScreen.cs @@ -48,7 +48,8 @@ namespace OpenRA.Mods.Common.LoadScreens { var widgetArgs = new WidgetArgs() { - { "continueLoading", () => Game.InitializeMod(Game.Settings.Game.Mod, args) }, + { "continueLoading", () => Game.RunAfterTick(() => + Game.InitializeMod(Game.Settings.Game.Mod, args)) }, }; if (installData.BackgroundWidget != null) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs index dff55c86e6..4685a06e9c 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallLogic.cs @@ -36,8 +36,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic panel.Get("BACK_BUTTON").OnClick = () => { - Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id; - Game.InitializeMod("modchooser", null); + Game.RunAfterTick(() => + { + Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id; + Game.InitializeMod("modchooser", null); + }); }; } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs index b3c7017a6a..7dd7956884 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Installation/InstallMusicLogic.cs @@ -24,9 +24,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var installMusicContainer = widget.Get("INSTALL_MUSIC_PANEL"); + Action loadDefaultMod = () => Game.RunAfterTick(() => + Game.InitializeMod(Game.Settings.Game.Mod, null)); + var cancelButton = installMusicContainer.GetOrNull("CANCEL_BUTTON"); if (cancelButton != null) - cancelButton.OnClick = () => Game.InitializeMod(Game.Settings.Game.Mod, null); + cancelButton.OnClick = loadDefaultMod; var copyFromDiscButton = installMusicContainer.GetOrNull("COPY_FROM_CD_BUTTON"); if (copyFromDiscButton != null) @@ -34,7 +37,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic copyFromDiscButton.OnClick = () => { Ui.OpenWindow("INSTALL_FROMCD_PANEL", new WidgetArgs() { - { "continueLoading", () => Game.InitializeMod(Game.Settings.Game.Mod, null) }, + { "continueLoading", loadDefaultMod }, }); }; } @@ -47,7 +50,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic downloadButton.OnClick = () => { Ui.OpenWindow("INSTALL_DOWNLOAD_PANEL", new WidgetArgs() { - { "afterInstall", () => Game.InitializeMod(Game.Settings.Game.Mod, null) }, + { "afterInstall", loadDefaultMod }, { "mirrorListUrl", installData.MusicPackageMirrorList }, }); }; diff --git a/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs index 281564eb8f..c1bf1a866f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/MainMenuLogic.cs @@ -54,8 +54,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic mainMenu.Get("MODS_BUTTON").OnClick = () => { - Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id; - Game.InitializeMod("modchooser", null); + // Switching mods changes the world state (by disposing it), + // so we can't do this inside the input handler. + Game.RunAfterTick(() => + { + Game.Settings.Game.PreviousMod = Game.ModData.Manifest.Mod.Id; + Game.InitializeMod("modchooser", null); + }); }; mainMenu.Get("SETTINGS_BUTTON").OnClick = () => diff --git a/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs index d8f9c41c75..67e2a37b39 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/MusicPlayerLogic.cs @@ -87,10 +87,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic installButton.IsDisabled = () => world == null || world.Type != WorldType.Shellmap; var args = new string[] { "Install.Music=true" }; installButton.OnClick = () => - { - Game.ModData.LoadScreen.Display(); // HACK: prevent a flicker when transitioning to the installation dialog - Game.InitializeMod(Game.Settings.Game.Mod, new Arguments(args)); - }; + Game.RunAfterTick(() => + Game.InitializeMod(Game.Settings.Game.Mod, new Arguments(args))); var installData = Game.ModData.Manifest.Get(); installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length <= installData.ShippedSoundtracks;