Route viewport centering via WorldRenderer.

This commit is contained in:
Paul Chote
2013-09-27 17:13:54 +12:00
parent b3d608092c
commit f575c20d38
21 changed files with 77 additions and 70 deletions

View File

@@ -45,11 +45,6 @@ namespace OpenRA
public static Renderer Renderer; public static Renderer Renderer;
public static bool HasInputFocus = false; public static bool HasInputFocus = false;
public static void MoveViewport(float2 loc)
{
viewport.Center(loc);
}
public static void JoinServer(string host, int port) public static void JoinServer(string host, int port)
{ {
JoinInner(new OrderManager(host, port, JoinInner(new OrderManager(host, port,

View File

@@ -150,12 +150,17 @@ namespace OpenRA.Graphics
scrollPosition = NormalizeScrollPosition((Game.CellSize * loc - 1f/(2*Zoom)*new float2(Game.Renderer.Resolution)).ToInt2()); scrollPosition = NormalizeScrollPosition((Game.CellSize * loc - 1f/(2*Zoom)*new float2(Game.Renderer.Resolution)).ToInt2());
} }
public void Center(WPos pos)
{
Center(new float2(pos.X / 1024f, (pos.Y + pos.Z) / 1024f));
}
public void Center(IEnumerable<Actor> actors) public void Center(IEnumerable<Actor> actors)
{ {
if (!actors.Any()) if (!actors.Any())
return; return;
Center(actors.Select(a => a.CenterPosition).Average().ToCPos().ToFloat2()); Center(actors.Select(a => a.CenterPosition).Average());
} }
// Rectangle (in viewport coords) that contains things to be drawn // Rectangle (in viewport coords) that contains things to be drawn

View File

@@ -34,6 +34,7 @@ namespace OpenRA.Graphics
{ {
public readonly World world; public readonly World world;
public readonly Theater Theater; public readonly Theater Theater;
public Viewport Viewport { get { return Game.viewport; } }
internal readonly TerrainRenderer terrainRenderer; internal readonly TerrainRenderer terrainRenderer;
internal readonly ShroudRenderer shroudRenderer; internal readonly ShroudRenderer shroudRenderer;

View File

@@ -11,6 +11,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits; using OpenRA.Traits;
namespace OpenRA namespace OpenRA
@@ -64,7 +65,7 @@ namespace OpenRA
Cache<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>()); Cache<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>());
public void DoControlGroup(World world, int group, Modifiers mods, int MultiTapCount) public void DoControlGroup(World world, WorldRenderer worldRenderer, int group, Modifiers mods, int MultiTapCount)
{ {
var addModifier = Platform.CurrentPlatform == PlatformType.OSX ? Modifiers.Meta : Modifiers.Ctrl; var addModifier = Platform.CurrentPlatform == PlatformType.OSX ? Modifiers.Meta : Modifiers.Ctrl;
if (mods.HasModifier(addModifier)) if (mods.HasModifier(addModifier))
@@ -84,7 +85,7 @@ namespace OpenRA
if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2) if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2)
{ {
Game.viewport.Center(controlGroups[group]); worldRenderer.Viewport.Center(controlGroups[group]);
return; return;
} }

View File

@@ -176,7 +176,7 @@ namespace OpenRA.Widgets
{ {
if (e.KeyName.Length == 1 && char.IsDigit(e.KeyName[0])) if (e.KeyName.Length == 1 && char.IsDigit(e.KeyName[0]))
{ {
world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers, e.MultiTapCount); world.Selection.DoControlGroup(world, worldRenderer, e.KeyName[0] - '0', e.Modifiers, e.MultiTapCount);
return true; return true;
} }

View File

@@ -22,14 +22,16 @@ namespace OpenRA.Mods.RA
class CncShellmapScript : IWorldLoaded, ITick class CncShellmapScript : IWorldLoaded, ITick
{ {
static CPos viewportOrigin; WPos viewportOrigin;
Dictionary<string, Actor> actors; Dictionary<string, Actor> actors;
WorldRenderer worldRenderer;
public void WorldLoaded(World w, WorldRenderer wr) public void WorldLoaded(World w, WorldRenderer wr)
{ {
worldRenderer = wr;
var b = w.Map.Bounds; var b = w.Map.Bounds;
viewportOrigin = new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2); viewportOrigin = new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2).CenterPosition;
Game.MoveViewport(viewportOrigin.ToFloat2()); worldRenderer.Viewport.Center(viewportOrigin);
actors = w.WorldActor.Trait<SpawnMapActors>().Actors; actors = w.WorldActor.Trait<SpawnMapActors>().Actors;
@@ -39,8 +41,8 @@ namespace OpenRA.Mods.RA
void SetViewport() void SetViewport()
{ {
var t = (ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed; var t = (ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed;
var loc = viewportOrigin.ToFloat2() + (new float2(-15, 4) * float2.FromAngle((float)t)); var offset = new float2(-15360, 4096) * float2.FromAngle((float)t);
Game.viewport.Center(loc); worldRenderer.Viewport.Center(viewportOrigin + new WVec((int)offset.X, (int)offset.Y, 0));
} }
int ticks = 0; int ticks = 0;

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Cnc.Missions
players = w.Players.ToDictionary(p => p.InternalName); players = w.Players.ToDictionary(p => p.InternalName);
actors = w.WorldActor.Trait<SpawnMapActors>().Actors; actors = w.WorldActor.Trait<SpawnMapActors>().Actors;
var b = w.Map.Bounds; var b = w.Map.Bounds;
Game.MoveViewport(new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2).ToFloat2()); wr.Viewport.Center(new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2).CenterPosition);
Action afterFMV = () => Action afterFMV = () =>
{ {

View File

@@ -193,13 +193,10 @@ namespace OpenRA.Mods.Cnc.Missions
nr1 = actors["NODReinforceNthA"]; nr1 = actors["NODReinforceNthA"];
nr2 = actors["NODReinforceNthB"]; nr2 = actors["NODReinforceNthB"];
nr3 = actors["NODReinforceNWstA"]; nr3 = actors["NODReinforceNWstA"];
Game.MoveViewport(nr1.Location.ToFloat2());
Action afterFMV = () => wr.Viewport.Center(nr1.Location.CenterPosition);
{
MissionUtils.PlayMissionMusic();
};
Game.RunAfterDelay(0, () => Media.PlayFMVFullscreen(w, "nod1pre.vqa", () => Game.RunAfterDelay(0, () => Media.PlayFMVFullscreen(w, "nod1pre.vqa", () =>
Media.PlayFMVFullscreen(w, "nod1.vqa", afterFMV))); Media.PlayFMVFullscreen(w, "nod1.vqa", MissionUtils.PlayMissionMusic)));
} }
} }
} }

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Mods.RA
// Set viewport // Set viewport
if (world.LocalPlayer != null && Start.ContainsKey(world.LocalPlayer)) if (world.LocalPlayer != null && Start.ContainsKey(world.LocalPlayer))
Game.viewport.Center(Start[world.LocalPlayer].ToFloat2()); wr.Viewport.Center(Start[world.LocalPlayer].CenterPosition);
} }
static Player FindPlayerInSlot(World world, string pr) static Player FindPlayerInSlot(World world, string pr)

View File

@@ -300,7 +300,7 @@ namespace OpenRA.Mods.RA.Missions
attackEntryPoint2 = actors["SovietAttackEntryPoint2"]; attackEntryPoint2 = actors["SovietAttackEntryPoint2"];
SetAlliedUnitsToDefensiveStance(); SetAlliedUnitsToDefensiveStance();
Game.MoveViewport(insertionLZ.Location.ToFloat2()); wr.Viewport.Center(insertionLZ.CenterPosition);
if (w.LobbyInfo.IsSinglePlayer) if (w.LobbyInfo.IsSinglePlayer)
Media.PlayFMVFullscreen(w, "ally1.vqa", () => Media.PlayFMVFullscreen(w, "ally1.vqa", () =>

View File

@@ -468,10 +468,9 @@ namespace OpenRA.Mods.RA.Missions
shroud.Explore(w, sam4.Location, 2); shroud.Explore(w, sam4.Location, 2);
if (w.LocalPlayer == null || w.LocalPlayer == allies1) if (w.LocalPlayer == null || w.LocalPlayer == allies1)
Game.MoveViewport(chinookHusk.Location.ToFloat2()); wr.Viewport.Center(chinookHusk.CenterPosition);
else else
Game.MoveViewport(allies2BasePoint.Location.ToFloat2()); wr.Viewport.Center(allies2BasePoint.CenterPosition);
MissionUtils.PlayMissionMusic(); MissionUtils.PlayMissionMusic();
} }

View File

@@ -448,10 +448,9 @@ namespace OpenRA.Mods.RA.Missions
paradropBox = new Rectangle(topLeft.Location.X, topLeft.Location.Y, bottomRight.Location.X - topLeft.Location.X, bottomRight.Location.Y - topLeft.Location.Y); paradropBox = new Rectangle(topLeft.Location.X, topLeft.Location.Y, bottomRight.Location.X - topLeft.Location.X, bottomRight.Location.Y - topLeft.Location.Y);
if (w.LocalPlayer == null || w.LocalPlayer == allies1) if (w.LocalPlayer == null || w.LocalPlayer == allies1)
Game.MoveViewport(allies1EntryPoint.Location.ToFloat2()); wr.Viewport.Center(allies1EntryPoint.CenterPosition);
else else
Game.MoveViewport(allies2EntryPoint.Location.ToFloat2()); wr.Viewport.Center(allies2EntryPoint.CenterPosition);
OnObjectivesUpdated(false); OnObjectivesUpdated(false);
MissionUtils.PlayMissionMusic(); MissionUtils.PlayMissionMusic();

View File

@@ -60,6 +60,7 @@ namespace OpenRA.Mods.RA.Missions
Player soviets; Player soviets;
Player creeps; Player creeps;
World world; World world;
WorldRenderer worldRenderer;
List<Patrol> patrols; List<Patrol> patrols;
CPos[] patrolPoints1; CPos[] patrolPoints1;
@@ -110,7 +111,7 @@ namespace OpenRA.Mods.RA.Missions
if (world.FrameNumber == frameInfiltrated + 100) if (world.FrameNumber == frameInfiltrated + 100)
{ {
Sound.Play("aarrivs1.aud"); Sound.Play("aarrivs1.aud");
Game.MoveViewport(reinforcementsUnloadPoint.Location.ToFloat2()); worldRenderer.Viewport.Center(reinforcementsUnloadPoint.CenterPosition);
world.AddFrameEndTask(w => SendReinforcements()); world.AddFrameEndTask(w => SendReinforcements());
} }
if (world.FrameNumber == frameInfiltrated + 200) if (world.FrameNumber == frameInfiltrated + 200)
@@ -354,6 +355,7 @@ namespace OpenRA.Mods.RA.Missions
public void WorldLoaded(World w, WorldRenderer wr) public void WorldLoaded(World w, WorldRenderer wr)
{ {
world = w; world = w;
worldRenderer = wr;
difficulty = w.LobbyInfo.GlobalSettings.Difficulty; difficulty = w.LobbyInfo.GlobalSettings.Difficulty;
Game.Debug("{0} difficulty selected".F(difficulty)); Game.Debug("{0} difficulty selected".F(difficulty));
@@ -453,7 +455,7 @@ namespace OpenRA.Mods.RA.Missions
OnObjectivesUpdated(false); OnObjectivesUpdated(false);
SetupSubStances(); SetupSubStances();
Game.MoveViewport(spyReinforcementsEntryPoint.Location.ToFloat2()); worldRenderer.Viewport.Center(spyReinforcementsEntryPoint.CenterPosition);
MissionUtils.PlayMissionMusic(); MissionUtils.PlayMissionMusic();
} }
} }

View File

@@ -22,13 +22,15 @@ namespace OpenRA.Mods.RA
class DefaultShellmapScript: IWorldLoaded, ITick class DefaultShellmapScript: IWorldLoaded, ITick
{ {
Dictionary<string, Actor> Actors; Dictionary<string, Actor> Actors;
static CPos ViewportOrigin; static WPos ViewportOrigin;
WorldRenderer worldRenderer;
public void WorldLoaded(World w, WorldRenderer wr) public void WorldLoaded(World w, WorldRenderer wr)
{ {
worldRenderer = wr;
var b = w.Map.Bounds; var b = w.Map.Bounds;
ViewportOrigin = new CPos(b.Left + b.Width/2, b.Top + b.Height/2); ViewportOrigin = new CPos(b.Left + b.Width/2, b.Top + b.Height/2).CenterPosition;
Game.MoveViewport(ViewportOrigin.ToFloat2()); worldRenderer.Viewport.Center(ViewportOrigin);
Actors = w.WorldActor.Trait<SpawnMapActors>().Actors; Actors = w.WorldActor.Trait<SpawnMapActors>().Actors;
Sound.SoundVolumeModifier = 0.25f; Sound.SoundVolumeModifier = 0.25f;
@@ -38,12 +40,9 @@ namespace OpenRA.Mods.RA
float speed = 4f; float speed = 4f;
public void Tick(Actor self) public void Tick(Actor self)
{ {
var loc = new float2( var t = (ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed;
(float)(System.Math.Sin((ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed) * 15f + ViewportOrigin.X), var offset = new float2(15360, 10240) * float2.FromAngle((float)t);
(float)(System.Math.Cos((ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed) * 10f + ViewportOrigin.Y) worldRenderer.Viewport.Center(ViewportOrigin + new WVec((int)offset.X, (int)offset.Y, 0));
);
Game.MoveViewport(loc);
if (ticks == 50) if (ticks == 50)
{ {
@@ -54,7 +53,6 @@ namespace OpenRA.Mods.RA
}, Actors["pdox"], -1, false); }, Actors["pdox"], -1, false);
} }
if (ticks == 100) if (ticks == 100)
Actors["mslo1"].Trait<NukePower>().Activate(Actors["mslo1"], new Order() { TargetLocation = new CPos(98, 52) }); Actors["mslo1"].Trait<NukePower>().Activate(Actors["mslo1"], new Order() { TargetLocation = new CPos(98, 52) });
if (ticks == 140) if (ticks == 140)

View File

@@ -26,16 +26,17 @@ namespace OpenRA.Mods.RA.Missions
class DesertShellmapScript : ITick, IWorldLoaded class DesertShellmapScript : ITick, IWorldLoaded
{ {
World world; World world;
WorldRenderer worldRenderer;
Player allies; Player allies;
Player soviets; Player soviets;
Player neutral; Player neutral;
List<int2> viewportTargets = new List<int2>(); WPos[] viewportTargets;
int2 viewportTarget; WPos viewportTarget;
int viewportTargetNumber; int viewportTargetNumber;
int2 viewportOrigin; WPos viewportOrigin;
float mul; int mul;
float div = 400; int div = 400;
int waitTicks = 0; int waitTicks = 0;
int nextCivilianMove = 1; int nextCivilianMove = 1;
@@ -138,12 +139,12 @@ namespace OpenRA.Mods.RA.Missions
if (--waitTicks <= 0) if (--waitTicks <= 0)
{ {
if (++mul <= div) if (++mul <= div)
Game.MoveViewport(float2.Lerp(viewportOrigin, viewportTarget, mul / div)); worldRenderer.Viewport.Center(WPos.Lerp(viewportOrigin, viewportTarget, mul, div));
else else
{ {
mul = 0; mul = 0;
viewportOrigin = viewportTarget; viewportOrigin = viewportTarget;
viewportTarget = viewportTargets[(viewportTargetNumber = (viewportTargetNumber + 1) % viewportTargets.Count)]; viewportTarget = viewportTargets[(viewportTargetNumber = (viewportTargetNumber + 1) % viewportTargets.Length)];
waitTicks = 100; waitTicks = 100;
if (viewportTargetNumber == 0) if (viewportTargetNumber == 0)
@@ -238,7 +239,7 @@ namespace OpenRA.Mods.RA.Missions
public void WorldLoaded(World w, WorldRenderer wr) public void WorldLoaded(World w, WorldRenderer wr)
{ {
world = w; world = w;
worldRenderer = wr;
allies = w.Players.Single(p => p.InternalName == "Allies"); allies = w.Players.Single(p => p.InternalName == "Allies");
soviets = w.Players.Single(p => p.InternalName == "Soviets"); soviets = w.Players.Single(p => p.InternalName == "Soviets");
neutral = w.Players.Single(p => p.InternalName == "Neutral"); neutral = w.Players.Single(p => p.InternalName == "Neutral");
@@ -254,12 +255,12 @@ namespace OpenRA.Mods.RA.Missions
paradrop2LZ = actors["Paradrop2LZ"]; paradrop2LZ = actors["Paradrop2LZ"];
paradrop2Entry = actors["Paradrop2Entry"]; paradrop2Entry = actors["Paradrop2Entry"];
var t1 = actors["ViewportTarget1"]; var t1 = actors["ViewportTarget1"].CenterPosition;
var t2 = actors["ViewportTarget2"]; var t2 = actors["ViewportTarget2"].CenterPosition;
var t3 = actors["ViewportTarget3"]; var t3 = actors["ViewportTarget3"].CenterPosition;
var t4 = actors["ViewportTarget4"]; var t4 = actors["ViewportTarget4"].CenterPosition;
var t5 = actors["ViewportTarget5"]; var t5 = actors["ViewportTarget5"].CenterPosition;
viewportTargets = new[] { t1, t2, t3, t4, t5 }.Select(t => t.Location.ToInt2()).ToList(); viewportTargets = new[] { t1, t2, t3, t4, t5 };
offmapAttackerSpawn1 = actors["OffmapAttackerSpawn1"]; offmapAttackerSpawn1 = actors["OffmapAttackerSpawn1"];
offmapAttackerSpawn2 = actors["OffmapAttackerSpawn2"]; offmapAttackerSpawn2 = actors["OffmapAttackerSpawn2"];
@@ -298,7 +299,8 @@ namespace OpenRA.Mods.RA.Missions
viewportOrigin = viewportTargets[0]; viewportOrigin = viewportTargets[0];
viewportTargetNumber = 1; viewportTargetNumber = 1;
viewportTarget = viewportTargets[1]; viewportTarget = viewportTargets[1];
Game.viewport.Center(viewportOrigin);
wr.Viewport.Center(viewportOrigin);
Sound.SoundVolumeModifier = 0.1f; Sound.SoundVolumeModifier = 0.1f;
} }
} }

View File

@@ -335,7 +335,7 @@ namespace OpenRA.Mods.RA.Missions
superTankDome.AddTrait(new InfiltrateAction(OnSuperTankDomeInfiltrated)); superTankDome.AddTrait(new InfiltrateAction(OnSuperTankDomeInfiltrated));
superTankDome.AddTrait(new TransformedAction(self => superTankDome = self)); superTankDome.AddTrait(new TransformedAction(self => superTankDome = self));
Game.MoveViewport(startEntryPoint.Location.ToFloat2()); wr.Viewport.Center(startEntryPoint.CenterPosition);
MissionUtils.PlayMissionMusic(); MissionUtils.PlayMissionMusic();
} }
} }

View File

@@ -154,7 +154,7 @@ namespace OpenRA.Mods.RA.Missions
airfield3 = actors["Airfield3"]; airfield3 = actors["Airfield3"];
airfields = new[] { airfield1, airfield2, airfield3 }; airfields = new[] { airfield1, airfield2, airfield3 };
Game.MoveViewport(startJeep.Location.ToFloat2()); wr.Viewport.Center(startJeep.CenterPosition);
if (w.LobbyInfo.IsSinglePlayer) if (w.LobbyInfo.IsSinglePlayer)
{ {

View File

@@ -336,7 +336,7 @@ namespace OpenRA.Mods.RA.Missions
shroud.Explore(w, sam1.Location, 4); shroud.Explore(w, sam1.Location, 4);
shroud.Explore(w, sam2.Location, 4); shroud.Explore(w, sam2.Location, 4);
Game.MoveViewport(alliesbase.Location.ToFloat2()); wr.Viewport.Center(alliesbase.CenterPosition);
StartCountDownTimer(); StartCountDownTimer();
SendSquad1(); SendSquad1();
SendSquad2(); SendSquad2();

View File

@@ -80,8 +80,8 @@ namespace OpenRA.Mods.RA.Missions
Actor FranceparaEntry2; Actor FranceparaEntry2;
Actor FranceparaEntry3; Actor FranceparaEntry3;
World world; World world;
WorldRenderer worldRenderer;
CountdownTimer survivalTimer; CountdownTimer survivalTimer;
CountdownTimerWidget survivalTimerWidget; CountdownTimerWidget survivalTimerWidget;
@@ -168,7 +168,7 @@ namespace OpenRA.Mods.RA.Missions
void FrenchReinforcements() void FrenchReinforcements()
{ {
Game.MoveViewport(sovietrally1.Location.ToFloat2()); worldRenderer.Viewport.Center(sovietrally1.CenterPosition);
MissionUtils.Parabomb(world, allies, FranceparaEntry1.Location, drum3.Location); MissionUtils.Parabomb(world, allies, FranceparaEntry1.Location, drum3.Location);
MissionUtils.Parabomb(world, allies, FranceparaEntry3.Location, drum2.Location); MissionUtils.Parabomb(world, allies, FranceparaEntry3.Location, drum2.Location);
MissionUtils.Parabomb(world, allies, FranceparaEntry2.Location, drum1.Location); MissionUtils.Parabomb(world, allies, FranceparaEntry2.Location, drum1.Location);
@@ -355,6 +355,8 @@ namespace OpenRA.Mods.RA.Missions
public void WorldLoaded(World w, WorldRenderer wr) public void WorldLoaded(World w, WorldRenderer wr)
{ {
world = w; world = w;
worldRenderer = wr;
allies = w.Players.SingleOrDefault(p => p.InternalName == "Allies"); allies = w.Players.SingleOrDefault(p => p.InternalName == "Allies");
if (allies != null) if (allies != null)
{ {
@@ -395,7 +397,8 @@ namespace OpenRA.Mods.RA.Missions
FranceparaEntry3 = actors["FranceparaEntry3"]; FranceparaEntry3 = actors["FranceparaEntry3"];
newsovietentrypoints = new[] { sovietparadropEntry, sovietEntry3 }.Select(p => p.Location).ToArray(); newsovietentrypoints = new[] { sovietparadropEntry, sovietEntry3 }.Select(p => p.Location).ToArray();
newsovietrallypoints = new[] { sovietrally3, sovietrally4, sovietrally8 }.Select(p => p.Location).ToArray(); newsovietrallypoints = new[] { sovietrally3, sovietrally4, sovietrally8 }.Select(p => p.Location).ToArray();
Game.MoveViewport(alliesbase.Location.ToFloat2());
worldRenderer.Viewport.Center(alliesbase.CenterPosition);
StartCountDownTimer(); StartCountDownTimer();
SetSovietUnitsToDefensiveStance(); SetSovietUnitsToDefensiveStance();
world.CreateActor(Camera, new TypeDictionary world.CreateActor(Camera, new TypeDictionary

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Buildings;
using OpenRA.Network; using OpenRA.Network;
using OpenRA.Traits; using OpenRA.Traits;
@@ -37,11 +38,13 @@ namespace OpenRA.Mods.RA.Widgets.Logic
DropDownButtonWidget statsDropDown; DropDownButtonWidget statsDropDown;
IEnumerable<Player> players; IEnumerable<Player> players;
World world; World world;
WorldRenderer worldRenderer;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverStatsLogic(World world, Widget widget) public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget)
{ {
this.world = world; this.world = world;
this.worldRenderer = worldRenderer;
players = world.Players.Where(p => !p.NonCombatant); players = world.Players.Where(p => !p.NonCombatant);
basicStatsHeaders = widget.Get<ContainerWidget>("BASIC_STATS_HEADERS"); basicStatsHeaders = widget.Get<ContainerWidget>("BASIC_STATS_HEADERS");
@@ -272,9 +275,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead() && a.HasTrait<BaseBuilding>() && a.Owner == player); var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead() && a.HasTrait<BaseBuilding>() && a.Owner == player);
if (playerBase != null) if (playerBase != null)
{ worldRenderer.Viewport.Center(playerBase.CenterPosition);
Game.MoveViewport(playerBase.Location.ToFloat2());
}
}); });
} }

View File

@@ -22,12 +22,14 @@ namespace OpenRA.Mods.RA.Widgets
{ {
public class WorldCommandWidget : Widget public class WorldCommandWidget : Widget
{ {
World world; readonly World world;
readonly WorldRenderer worldRenderer;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public WorldCommandWidget(World world) public WorldCommandWidget(World world, WorldRenderer worldRenderer)
{ {
this.world = world; this.world = world;
this.worldRenderer = worldRenderer;
} }
public override string GetCursor(int2 pos) { return null; } public override string GetCursor(int2 pos) { return null; }
@@ -207,13 +209,13 @@ namespace OpenRA.Mods.RA.Widgets
if (eventNotifier.lastAttackTime < 0) if (eventNotifier.lastAttackTime < 0)
return true; return true;
Game.viewport.Center(eventNotifier.lastAttackLocation.ToFloat2()); worldRenderer.Viewport.Center(eventNotifier.lastAttackLocation.CenterPosition);
return true; return true;
} }
bool ToSelection() bool ToSelection()
{ {
Game.viewport.Center(world.Selection.Actors); worldRenderer.Viewport.Center(world.Selection.Actors);
return true; return true;
} }
} }