Save and load skirmish spectator viewport.

This commit is contained in:
Paul Chote
2019-04-20 11:01:55 +00:00
committed by reaperrr
parent 410d0796c3
commit c8f2ee5270
2 changed files with 45 additions and 5 deletions

View File

@@ -29,25 +29,44 @@ namespace OpenRA.Mods.Common.Traits
List<MiniYamlNode> IGameSaveTraitData.IssueTraitData(Actor self)
{
if (worldRenderer.World.LocalPlayer == null || self != worldRenderer.World.LocalPlayer.PlayerActor)
// HACK: Store the viewport state for the skirmish observer on the first bot's trait
// TODO: This won't make sense for MP saves
var localPlayer = worldRenderer.World.LocalPlayer;
if ((localPlayer != null && localPlayer.PlayerActor != self) ||
self.Owner != self.World.Players.FirstOrDefault(p => p.IsBot))
return null;
return new List<MiniYamlNode>()
var nodes = new List<MiniYamlNode>()
{
new MiniYamlNode("Viewport", FieldSaver.FormatValue(worldRenderer.Viewport.CenterPosition)),
new MiniYamlNode("Selection", "", self.World.Selection.Serialize())
new MiniYamlNode("Viewport", FieldSaver.FormatValue(worldRenderer.Viewport.CenterPosition))
};
var renderPlayer = worldRenderer.World.RenderPlayer;
if (localPlayer == null && renderPlayer != null)
nodes.Add(new MiniYamlNode("RenderPlayer", FieldSaver.FormatValue(renderPlayer.PlayerActor.ActorID)));
if (localPlayer != null && localPlayer.PlayerActor == self)
nodes.Add(new MiniYamlNode("Selection", "", self.World.Selection.Serialize()));
return nodes;
}
void IGameSaveTraitData.ResolveTraitData(Actor self, List<MiniYamlNode> data)
{
var viewportNode = data.FirstOrDefault(n => n.Key == "Viewport");
if (viewportNode != null)
worldRenderer.Viewport.Center(FieldLoader.GetValue<WPos>("data", viewportNode.Value.Value));
worldRenderer.Viewport.Center(FieldLoader.GetValue<WPos>("Viewport", viewportNode.Value.Value));
var selectionNode = data.FirstOrDefault(n => n.Key == "Selection");
if (selectionNode != null)
self.World.Selection.Deserialize(self.World, selectionNode.Value.Nodes);
var renderPlayerNode = data.FirstOrDefault(n => n.Key == "RenderPlayer");
if (renderPlayerNode != null)
{
var renderPlayerActorID = FieldLoader.GetValue<uint>("RenderPlayer", renderPlayerNode.Value.Value);
worldRenderer.World.RenderPlayer = worldRenderer.World.GetActorById(renderPlayerActorID).Owner;
}
}
}
}

View File

@@ -29,6 +29,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
readonly HotkeyReference combinedViewKey = new HotkeyReference();
readonly HotkeyReference worldViewKey = new HotkeyReference();
readonly World world;
CameraOption selected;
class CameraOption
@@ -64,6 +66,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
[ObjectCreator.UseCtor]
public ObserverShroudSelectorLogic(Widget widget, ModData modData, World world, Dictionary<string, MiniYaml> logicArgs)
{
this.world = world;
MiniYaml yaml;
if (logicArgs.TryGetValue("CombinedViewKey", out yaml))
combinedViewKey = modData.Hotkeys[yaml.Value];
@@ -182,5 +186,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic
return false;
}
public override void Tick()
{
// Fix the selector if something else has changed the render player
if (selected != null && world.RenderPlayer != selected.Player)
{
if (combined.Player == world.RenderPlayer)
combined.OnClick();
else if (disableShroud.Player == world.RenderPlayer)
disableShroud.OnClick();
else
foreach (var group in teams)
foreach (var option in group)
if (option.Player == world.RenderPlayer)
option.OnClick();
}
}
}
}