diff --git a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs index 9fe6c505b3..96710080a6 100755 --- a/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs +++ b/OpenRA.Mods.RA/Buildings/RepairableBuilding.cs @@ -19,37 +19,37 @@ 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; 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"; 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 +70,17 @@ namespace OpenRA.Mods.RA.Buildings public void Tick(Actor self) { + if (IsTraitDisabled) + { + if (RepairActive && Info.CancelWhenDisabled) + { + Repairers.Clear(); + RepairActive = false; + } + + 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;