Don’t switch mods from inside button click handlers.
Fixes screen flickering and desyncs when returning to the mod chooser.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -36,8 +36,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
panel.Get<ButtonWidget>("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);
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<ButtonWidget>("CANCEL_BUTTON");
|
||||
if (cancelButton != null)
|
||||
cancelButton.OnClick = () => Game.InitializeMod(Game.Settings.Game.Mod, null);
|
||||
cancelButton.OnClick = loadDefaultMod;
|
||||
|
||||
var copyFromDiscButton = installMusicContainer.GetOrNull<ButtonWidget>("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 },
|
||||
});
|
||||
};
|
||||
|
||||
@@ -54,8 +54,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
mainMenu.Get<ButtonWidget>("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<ButtonWidget>("SETTINGS_BUTTON").OnClick = () =>
|
||||
|
||||
@@ -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<ContentInstaller>();
|
||||
installButton.IsVisible = () => modRules.InstalledMusic.ToArray().Length <= installData.ShippedSoundtracks;
|
||||
|
||||
Reference in New Issue
Block a user