From 156122f9e3c5679d500941aa0bbcb907083f2005 Mon Sep 17 00:00:00 2001 From: xan2622 Date: Sun, 4 Jan 2026 03:08:04 +0100 Subject: [PATCH] Improves observer camera focus fallback when the player's (or bot's) Construction Yard is destroyed Currently, when an observer clicks on a player's name in the stats panel, the camera centers on that player's Construction Yard. However, if the Construction Yard has been destroyed, the click does nothing. This commit searches for the Construction Yard, then a MCV, then any remaining building. --- .../Logic/Ingame/ObserverStatsLogic.cs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) 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;