Add dynamic map refresh
This commit is contained in:
committed by
Matthias Mailänder
parent
61df7974b0
commit
b254eb0f3d
@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2021 The OpenRA Developers (see AUTHORS)
|
||||
* Copyright 2007-2022 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
@@ -178,10 +178,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
var combinedPath = Platform.ResolvePath(Path.Combine(selectedDirectory.Folder.Name, filename.Text + fileTypes[fileType].Extension));
|
||||
|
||||
// Invalidate the old map metadata
|
||||
if (map.Uid != null && map.Package != null && map.Package.Name == combinedPath)
|
||||
modData.MapCache[map.Uid].Invalidate();
|
||||
|
||||
try
|
||||
{
|
||||
if (!(map.Package is IReadWritePackage package) || package.Name != combinedPath)
|
||||
@@ -195,9 +191,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
map.Save(package);
|
||||
|
||||
// Update the map cache so it can be loaded without restarting the game
|
||||
modData.MapCache[map.Uid].UpdateFromMap(map.Package, selectedDirectory.Folder, selectedDirectory.Classification, null, map.Grid.Type);
|
||||
|
||||
Console.WriteLine("Saved current map at {0}", combinedPath);
|
||||
Ui.CloseWindow();
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2021 The OpenRA Developers (see AUTHORS)
|
||||
* Copyright 2007-2022 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
@@ -59,6 +59,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
MapPreview map;
|
||||
Session.MapStatus mapStatus;
|
||||
string oldMapUid;
|
||||
string newMapUid;
|
||||
string lastUpdatedUid;
|
||||
|
||||
bool chatEnabled;
|
||||
bool addBotOnMapLoad;
|
||||
@@ -129,6 +132,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
Game.LobbyInfoChanged += UpdateSpawnOccupants;
|
||||
Game.BeforeGameStart += OnGameStart;
|
||||
Game.ConnectionStateChanged += ConnectionStateChanged;
|
||||
modData.MapCache.MapUpdated += TrackRelevantMapUpdates;
|
||||
|
||||
var name = lobby.GetOrNull<LabelWidget>("SERVER_NAME");
|
||||
if (name != null)
|
||||
@@ -182,20 +186,26 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
{
|
||||
var onSelect = new Action<string>(uid =>
|
||||
{
|
||||
// Don't select the same map again
|
||||
if (uid == map.Uid)
|
||||
// Don't select the same map again, and handle map becoming unavailable
|
||||
if (uid == map.Uid && modData.MapCache[uid].Status != MapStatus.Available)
|
||||
return;
|
||||
|
||||
orderManager.IssueOrder(Order.Command("map " + uid));
|
||||
Game.Settings.Server.Map = uid;
|
||||
Game.Settings.Save();
|
||||
newMapUid = null;
|
||||
oldMapUid = null;
|
||||
lastUpdatedUid = null;
|
||||
});
|
||||
|
||||
// Check for updated maps, if the user has edited a map we'll preselect it for them
|
||||
modData.MapCache.UpdateMaps();
|
||||
|
||||
Ui.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs()
|
||||
{
|
||||
{ "initialMap", map.Uid },
|
||||
{ "initialMap", lastUpdatedUid ?? map.Uid },
|
||||
{ "initialTab", MapClassification.System },
|
||||
{ "onExit", DoNothing },
|
||||
{ "onExit", Game.IsHost ? new Action(() => UpdateSelectedMap()) : null },
|
||||
{ "onSelect", Game.IsHost ? onSelect : null },
|
||||
{ "filter", MapVisibility.Lobby },
|
||||
});
|
||||
@@ -364,8 +374,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
// Force start panel
|
||||
Action startGame = () =>
|
||||
{
|
||||
gameStarting = true;
|
||||
orderManager.IssueOrder(Order.Command("startgame"));
|
||||
// Refresh MapCache and check if the selected map is available before attempting to start the game
|
||||
if (modData.MapCache[map.Uid].Status == MapStatus.Available)
|
||||
{
|
||||
gameStarting = true;
|
||||
orderManager.IssueOrder(Order.Command("startgame"));
|
||||
}
|
||||
else
|
||||
UpdateSelectedMap();
|
||||
};
|
||||
|
||||
var startGameButton = lobby.GetOrNull<ButtonWidget>("START_GAME_BUTTON");
|
||||
@@ -484,6 +500,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
Game.LobbyInfoChanged -= UpdateSpawnOccupants;
|
||||
Game.BeforeGameStart -= OnGameStart;
|
||||
Game.ConnectionStateChanged -= ConnectionStateChanged;
|
||||
modData.MapCache.MapUpdated -= TrackRelevantMapUpdates;
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
@@ -822,6 +839,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
onStart();
|
||||
}
|
||||
|
||||
void TrackRelevantMapUpdates(string oldUid, string newUid)
|
||||
{
|
||||
// We need to handle map being updated multiple times without a refresh
|
||||
if (map.Uid == oldUid || oldUid == newMapUid)
|
||||
{
|
||||
if (oldMapUid == null)
|
||||
oldMapUid = oldUid;
|
||||
newMapUid = newUid;
|
||||
}
|
||||
|
||||
if (newUid != null)
|
||||
lastUpdatedUid = newUid;
|
||||
}
|
||||
|
||||
void UpdateSelectedMap()
|
||||
{
|
||||
if (modData.MapCache[map.Uid].Status == MapStatus.Available)
|
||||
return;
|
||||
|
||||
if (oldMapUid == map.Uid && modData.MapCache[newMapUid].Status == MapStatus.Available)
|
||||
{
|
||||
orderManager.IssueOrder(Order.Command("map " + newMapUid));
|
||||
Game.Settings.Server.Map = newMapUid;
|
||||
Game.Settings.Save();
|
||||
newMapUid = null;
|
||||
oldMapUid = null;
|
||||
lastUpdatedUid = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class LobbyFaction
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2021 The OpenRA Developers (see AUTHORS)
|
||||
* Copyright 2007-2022 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
@@ -158,7 +158,13 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
// Loading into the map editor
|
||||
Game.BeforeGameStart += RemoveShellmapUI;
|
||||
|
||||
var onSelect = new Action<string>(uid => LoadMapIntoEditor(modData.MapCache[uid].Uid));
|
||||
var onSelect = new Action<string>(uid =>
|
||||
{
|
||||
if (modData.MapCache[uid].Status != MapStatus.Available)
|
||||
SwitchMenu(MenuType.Extras);
|
||||
else
|
||||
LoadMapIntoEditor(modData.MapCache[uid].Uid);
|
||||
});
|
||||
|
||||
var newMapButton = widget.Get<ButtonWidget>("NEW_MAP_BUTTON");
|
||||
newMapButton.OnClick = () =>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2021 The OpenRA Developers (see AUTHORS)
|
||||
* Copyright 2007-2022 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation, either version 3 of
|
||||
@@ -119,7 +119,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
if (previews.Any())
|
||||
{
|
||||
CreateMissionGroup(kv.Key, previews);
|
||||
CreateMissionGroup(kv.Key, previews, onExit);
|
||||
allPreviews.AddRange(previews);
|
||||
}
|
||||
}
|
||||
@@ -131,7 +131,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
if (loosePreviews.Any())
|
||||
{
|
||||
CreateMissionGroup("Missions", loosePreviews);
|
||||
CreateMissionGroup("Missions", loosePreviews, onExit);
|
||||
allPreviews.AddRange(loosePreviews);
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
}).Start();
|
||||
|
||||
var startButton = widget.Get<ButtonWidget>("STARTGAME_BUTTON");
|
||||
startButton.OnClick = StartMissionClicked;
|
||||
startButton.OnClick = () => StartMissionClicked(onExit);
|
||||
startButton.IsDisabled = () => selectedMap == null;
|
||||
|
||||
widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
|
||||
@@ -179,7 +179,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
void CreateMissionGroup(string title, IEnumerable<MapPreview> previews)
|
||||
void CreateMissionGroup(string title, IEnumerable<MapPreview> previews, Action onExit)
|
||||
{
|
||||
var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => { });
|
||||
header.Get<LabelWidget>("LABEL").GetText = () => title;
|
||||
@@ -190,7 +190,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
var item = ScrollItemWidget.Setup(template,
|
||||
() => selectedMap != null && selectedMap.Uid == preview.Uid,
|
||||
() => SelectMap(preview),
|
||||
StartMissionClicked);
|
||||
() => StartMissionClicked(onExit));
|
||||
|
||||
var label = item.Get<LabelWithTooltipWidget>("TITLE");
|
||||
WidgetUtils.TruncateLabelToTooltip(label, preview.Title);
|
||||
@@ -365,10 +365,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
playingVideo = PlayingVideo.None;
|
||||
}
|
||||
|
||||
void StartMissionClicked()
|
||||
void StartMissionClicked(Action onExit)
|
||||
{
|
||||
StopVideo(videoPlayer);
|
||||
|
||||
// If selected mission becomes unavailable, exit MissionBrowser to refresh
|
||||
if (modData.MapCache[selectedMap.Uid].Status != MapStatus.Available)
|
||||
{
|
||||
Game.Disconnect();
|
||||
Ui.CloseWindow();
|
||||
onExit();
|
||||
return;
|
||||
}
|
||||
|
||||
var orders = new List<Order>();
|
||||
if (difficulty != null)
|
||||
orders.Add(Order.Command($"option difficulty {difficulty}"));
|
||||
|
||||
Reference in New Issue
Block a user