From af5d8a3bbee77dab83fcc06196f64faa2e520582 Mon Sep 17 00:00:00 2001 From: Ivaylo Draganov Date: Fri, 13 Dec 2019 21:03:25 +0200 Subject: [PATCH] Add a hotkey to cycle harvesters --- .../Hotkeys/CycleHarvestersHotkeyLogic.cs | 63 +++++++++++++++++++ mods/cnc/chrome/ingame.yaml | 3 +- mods/common/chrome/ingame.yaml | 3 +- mods/common/hotkeys/game.yaml | 4 ++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/CycleHarvestersHotkeyLogic.cs diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/CycleHarvestersHotkeyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/CycleHarvestersHotkeyLogic.cs new file mode 100644 index 0000000000..9175bd78bf --- /dev/null +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/Hotkeys/CycleHarvestersHotkeyLogic.cs @@ -0,0 +1,63 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Lint; +using OpenRA.Mods.Common.Traits; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.Common.Widgets.Logic.Ingame +{ + [ChromeLogicArgsHotkeys("CycleHarvestersKey")] + public class CycleHarvestersHotkeyLogic : SingleHotkeyBaseLogic + { + readonly Viewport viewport; + readonly ISelection selection; + readonly World world; + + [ObjectCreator.UseCtor] + public CycleHarvestersHotkeyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, World world, Dictionary logicArgs) + : base(widget, modData, "CycleHarvestersKey", "WORLD_KEYHANDLER", logicArgs) + { + viewport = worldRenderer.Viewport; + selection = world.Selection; + this.world = world; + } + + protected override bool OnHotkeyActivated(KeyInput e) + { + var player = world.RenderPlayer ?? world.LocalPlayer; + + var harvesters = world.ActorsHavingTrait() + .Where(a => a.IsInWorld && a.Owner == player) + .ToList(); + + if (!harvesters.Any()) + return true; + + var next = harvesters + .SkipWhile(b => !selection.Contains(b)) + .Skip(1) + .FirstOrDefault(); + + if (next == null) + next = harvesters.First(); + + selection.Combine(world, new Actor[] { next }, false, true); + viewport.Center(selection.Actors); + + return true; + } + } +} diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml index a394b4bda0..b4dee7a497 100644 --- a/mods/cnc/chrome/ingame.yaml +++ b/mods/cnc/chrome/ingame.yaml @@ -10,10 +10,11 @@ Container@INGAME_ROOT: TakeScreenshotKey: TakeScreenshot MuteAudioKey: ToggleMute LogicKeyListener@WORLD_KEYHANDLER: - Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, ResetZoomHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic + Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, CycleHarvestersHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, ResetZoomHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic RemoveFromControlGroupKey: RemoveFromControlGroup CycleBasesKey: CycleBase CycleProductionActorsKey: CycleProductionBuildings + CycleHarvestersKey: CycleHarvesters JumpToLastEventKey: ToLastEvent JumpToSelectedActorsKey: ToSelection ResetZoomKey: ResetZoom diff --git a/mods/common/chrome/ingame.yaml b/mods/common/chrome/ingame.yaml index 7615dee5e9..037edb5c9b 100644 --- a/mods/common/chrome/ingame.yaml +++ b/mods/common/chrome/ingame.yaml @@ -10,10 +10,11 @@ Container@INGAME_ROOT: TakeScreenshotKey: TakeScreenshot MuteAudioKey: ToggleMute LogicKeyListener@WORLD_KEYHANDLER: - Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, ResetZoomHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic + Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, CycleHarvestersHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, ResetZoomHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic RemoveFromControlGroupKey: RemoveFromControlGroup CycleBasesKey: CycleBase CycleProductionActorsKey: CycleProductionBuildings + CycleHarvestersKey: CycleHarvesters JumpToLastEventKey: ToLastEvent JumpToSelectedActorsKey: ToSelection ResetZoomKey: ResetZoom diff --git a/mods/common/hotkeys/game.yaml b/mods/common/hotkeys/game.yaml index 26dbde718f..bf49aa1193 100644 --- a/mods/common/hotkeys/game.yaml +++ b/mods/common/hotkeys/game.yaml @@ -18,6 +18,10 @@ SelectUnitsByType: W Description: Select units by type Types: World, Player, Spectator +CycleHarvesters: N + Description: Cycle Harvesters + Types: World, Player, Spectator + RemoveFromControlGroup: Description: Remove from control group Types: World, Player