diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index 074cfc92cb..afc2e06fe1 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -546,12 +546,32 @@ namespace OpenRA.Mods.Common.Widgets.Logic { return ScrollItemWidget.Setup(template, () => false, () => { - var playerBase = world.ActorsHavingTrait().FirstOrDefault(a => !a.IsDead && a.Owner == player); - if (playerBase != null) - worldRenderer.Viewport.Center(playerBase.CenterPosition); + var targetActor = FindPlayerBaseActor(player); + if (targetActor != null) + worldRenderer.Viewport.Center(targetActor.CenterPosition); }); } + Actor FindPlayerBaseActor(Player player) + { + // Priority 1: Primary BaseBuilding (Construction Yard or MCV), closest to viewport + var primaryBase = world.ActorsHavingTrait() + .Where(a => a.Owner == player) + .OrderByDescending(a => a.IsPrimaryBuilding()) + .ThenBy(a => (worldRenderer.Viewport.CenterPosition - a.CenterPosition).LengthSquared) + .FirstOrDefault(); + + if (primaryBase != null) + return primaryBase; + + // Priority 2: Any selectable Building (fallback), closest to viewport + var building = world.ActorsHavingTrait() + .OrderBy(a => (worldRenderer.Viewport.CenterPosition - a.CenterPosition).LengthSquared) + .FirstOrDefault(a => a.Owner == player && a.Info.HasTraitInfo()); + + return building; + } + void AdjustStatisticsPanel(Widget itemTemplate) { var height = playerStatsPanel.Bounds.Height;