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)
|
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 null;
|
||||||
|
|
||||||
return new List<MiniYamlNode>()
|
var nodes = new List<MiniYamlNode>()
|
||||||
{
|
{
|
||||||
new MiniYamlNode("Viewport", FieldSaver.FormatValue(worldRenderer.Viewport.CenterPosition)),
|
new MiniYamlNode("Viewport", FieldSaver.FormatValue(worldRenderer.Viewport.CenterPosition))
|
||||||
new MiniYamlNode("Selection", "", self.World.Selection.Serialize())
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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)
|
void IGameSaveTraitData.ResolveTraitData(Actor self, List<MiniYamlNode> data)
|
||||||
{
|
{
|
||||||
var viewportNode = data.FirstOrDefault(n => n.Key == "Viewport");
|
var viewportNode = data.FirstOrDefault(n => n.Key == "Viewport");
|
||||||
if (viewportNode != null)
|
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");
|
var selectionNode = data.FirstOrDefault(n => n.Key == "Selection");
|
||||||
if (selectionNode != null)
|
if (selectionNode != null)
|
||||||
self.World.Selection.Deserialize(self.World, selectionNode.Value.Nodes);
|
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 combinedViewKey = new HotkeyReference();
|
||||||
readonly HotkeyReference worldViewKey = new HotkeyReference();
|
readonly HotkeyReference worldViewKey = new HotkeyReference();
|
||||||
|
|
||||||
|
readonly World world;
|
||||||
|
|
||||||
CameraOption selected;
|
CameraOption selected;
|
||||||
|
|
||||||
class CameraOption
|
class CameraOption
|
||||||
@@ -64,6 +66,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public ObserverShroudSelectorLogic(Widget widget, ModData modData, World world, Dictionary<string, MiniYaml> logicArgs)
|
public ObserverShroudSelectorLogic(Widget widget, ModData modData, World world, Dictionary<string, MiniYaml> logicArgs)
|
||||||
{
|
{
|
||||||
|
this.world = world;
|
||||||
|
|
||||||
MiniYaml yaml;
|
MiniYaml yaml;
|
||||||
if (logicArgs.TryGetValue("CombinedViewKey", out yaml))
|
if (logicArgs.TryGetValue("CombinedViewKey", out yaml))
|
||||||
combinedViewKey = modData.Hotkeys[yaml.Value];
|
combinedViewKey = modData.Hotkeys[yaml.Value];
|
||||||
@@ -182,5 +186,22 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
|
|
||||||
return false;
|
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