From 3c79a9d87549f87b49c4eff03bfd39732507c7c8 Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Tue, 14 Oct 2014 23:55:59 -0500 Subject: [PATCH 1/2] Added upgrade support to RepairableBuilding --- OpenRA.Mods.RA/Buildings/RepairableBuilding.cs | 12 +++++++----- OpenRA.Mods.RA/Effects/RepairIndicator.cs | 2 +- OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs | 3 ++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs index 9fe6c505b3..07c9025883 100755 --- a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs +++ b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs @@ -19,7 +19,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA.Buildings { [Desc("Building can be repaired by the repair button.")] - public class RepairableBuildingInfo : ITraitInfo, Requires + public class RepairableBuildingInfo : UpgradableTraitInfo, ITraitInfo, Requires { public readonly int RepairPercent = 20; public readonly int RepairInterval = 24; @@ -31,25 +31,24 @@ namespace OpenRA.Mods.RA.Buildings public object Create(ActorInitializer init) { return new RepairableBuilding(init.self, this); } } - public class RepairableBuilding : ITick, ISync + public class RepairableBuilding : UpgradableTrait, ITick { [Sync] public int RepairersHash { get { return Repairers.Aggregate(0, (code, player) => code ^ Sync.hash_player(player)); } } public List Repairers = new List(); Health Health; - RepairableBuildingInfo Info; public bool RepairActive = false; public RepairableBuilding(Actor self, RepairableBuildingInfo info) + : base (info) { Health = self.Trait(); - Info = info; } public void RepairBuilding(Actor self, Player player) { - if (self.AppearsFriendlyTo(player.PlayerActor)) + if (!IsTraitDisabled && self.AppearsFriendlyTo(player.PlayerActor)) { // If the player won't affect the repair, we won't add him if (!Repairers.Remove(player) && Repairers.Count < Info.RepairBonuses.Length) @@ -70,6 +69,9 @@ namespace OpenRA.Mods.RA.Buildings public void Tick(Actor self) { + if (IsTraitDisabled) + return; + if (remainingTicks == 0) { Repairers = Repairers.Where(player => player.WinState == WinState.Undefined diff --git a/OpenRA.Mods.RA/Effects/RepairIndicator.cs b/OpenRA.Mods.RA/Effects/RepairIndicator.cs index a8e6282468..5672a27db6 100755 --- a/OpenRA.Mods.RA/Effects/RepairIndicator.cs +++ b/OpenRA.Mods.RA/Effects/RepairIndicator.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA.Effects rb = building.TraitOrDefault(); anim = new Animation(building.World, "allyrepair"); - anim.Paused = () => !rb.RepairActive; + anim.Paused = () => !rb.RepairActive || rb.IsTraitDisabled; CycleRepairer(); } diff --git a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs index 7636c4159b..af934dae5d 100644 --- a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs @@ -31,7 +31,8 @@ namespace OpenRA.Mods.RA.Orders if (mi.Button == MouseButton.Left) { var underCursor = world.ScreenMap.ActorsAt(mi) - .FirstOrDefault(a => !world.FogObscures(a) && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && a.HasTrait()); + .FirstOrDefault(a => !world.FogObscures(a) && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) + && a.TraitsImplementing().Any(t => !t.IsTraitDisabled)); if (underCursor == null) yield break; From 9ddf6dc36c2b620c3d0b8fbf8379822ef0f01df7 Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Thu, 27 Nov 2014 17:55:35 -0600 Subject: [PATCH 2/2] Added RepairableBuildingInfo.CancelWhenDisabled --- OpenRA.Mods.RA/Buildings/RepairableBuilding.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs index 07c9025883..96710080a6 100755 --- a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs +++ b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs @@ -25,6 +25,7 @@ namespace OpenRA.Mods.RA.Buildings public readonly int RepairInterval = 24; public readonly int RepairStep = 7; public readonly int[] RepairBonuses = { 100, 150, 175, 200, 220, 240, 260, 280, 300 }; + public readonly bool CancelWhenDisabled = false; public readonly string IndicatorPalettePrefix = "player"; @@ -70,7 +71,15 @@ namespace OpenRA.Mods.RA.Buildings public void Tick(Actor self) { if (IsTraitDisabled) + { + if (RepairActive && Info.CancelWhenDisabled) + { + Repairers.Clear(); + RepairActive = false; + } + return; + } if (remainingTicks == 0) {