Save and load skirmish spectator viewport.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user