From 71f2026b3203eea88bda9ca2ef636ac398c3a0d6 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Thu, 13 Jul 2017 23:45:48 +0200 Subject: [PATCH] Remove the hardcoded cloak reference from activities --- OpenRA.Mods.Cnc/Activities/Infiltrate.cs | 9 ++++---- OpenRA.Mods.Common/Activities/Demolish.cs | 13 ++++------- OpenRA.Mods.Common/Activities/UnloadCargo.cs | 9 ++++---- .../Traits/Buildings/Building.cs | 7 +++++- OpenRA.Mods.Common/Traits/Cloak.cs | 22 +++++++++++++++++-- OpenRA.Mods.Common/TraitsInterfaces.cs | 18 +++++++++++++++ 6 files changed, 57 insertions(+), 21 deletions(-) diff --git a/OpenRA.Mods.Cnc/Activities/Infiltrate.cs b/OpenRA.Mods.Cnc/Activities/Infiltrate.cs index 0cd288ce75..165b83ea51 100644 --- a/OpenRA.Mods.Cnc/Activities/Infiltrate.cs +++ b/OpenRA.Mods.Cnc/Activities/Infiltrate.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Linq; using OpenRA.Activities; using OpenRA.Mods.Cnc.Traits; using OpenRA.Mods.Common.Activities; @@ -21,14 +22,14 @@ namespace OpenRA.Mods.Cnc.Activities { readonly Actor target; readonly Infiltrates infiltrates; - readonly Cloak cloak; + readonly INotifyInfiltration[] notifiers; public Infiltrate(Actor self, Actor target, Infiltrates infiltrate) : base(self, target, infiltrate.Info.EnterBehaviour) { this.target = target; infiltrates = infiltrate; - cloak = self.TraitOrDefault(); + notifiers = self.TraitsImplementing().ToArray(); } protected override void OnInside(Actor self) @@ -40,8 +41,8 @@ namespace OpenRA.Mods.Cnc.Activities if (!infiltrates.Info.ValidStances.HasStance(stance)) return; - if (cloak != null && cloak.Info.UncloakOn.HasFlag(UncloakType.Infiltrate)) - cloak.Uncloak(); + foreach (var ini in notifiers) + ini.Infiltrating(self); foreach (var t in target.TraitsImplementing()) t.Infiltrated(target, self); diff --git a/OpenRA.Mods.Common/Activities/Demolish.cs b/OpenRA.Mods.Common/Activities/Demolish.cs index 185d78462f..441d32889f 100644 --- a/OpenRA.Mods.Common/Activities/Demolish.cs +++ b/OpenRA.Mods.Common/Activities/Demolish.cs @@ -26,8 +26,7 @@ namespace OpenRA.Mods.Common.Activities readonly int flashesDelay; readonly int flashInterval; readonly int flashDuration; - - readonly Cloak cloak; + readonly INotifyDemolition[] notifiers; public Demolish(Actor self, Actor target, EnterBehaviour enterBehaviour, int delay, int flashes, int flashesDelay, int flashInterval, int flashDuration) @@ -35,12 +34,12 @@ namespace OpenRA.Mods.Common.Activities { this.target = target; demolishables = target.TraitsImplementing().ToArray(); + notifiers = self.TraitsImplementing().ToArray(); this.delay = delay; this.flashes = flashes; this.flashesDelay = flashesDelay; this.flashInterval = flashInterval; this.flashDuration = flashDuration; - cloak = self.TraitOrDefault(); } protected override bool CanReserve(Actor self) @@ -55,12 +54,8 @@ namespace OpenRA.Mods.Common.Activities if (target.IsDead) return; - if (cloak != null && cloak.Info.UncloakOn.HasFlag(UncloakType.Demolish)) - cloak.Uncloak(); - - var building = target.TraitOrDefault(); - if (building != null) - building.Lock(); + foreach (var ind in notifiers) + ind.Demolishing(self); for (var f = 0; f < flashes; f++) w.Add(new DelayedAction(flashesDelay + f * flashInterval, () => diff --git a/OpenRA.Mods.Common/Activities/UnloadCargo.cs b/OpenRA.Mods.Common/Activities/UnloadCargo.cs index 4698ae632d..e75bf9e3f0 100644 --- a/OpenRA.Mods.Common/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.Common/Activities/UnloadCargo.cs @@ -23,14 +23,14 @@ namespace OpenRA.Mods.Common.Activities { readonly Actor self; readonly Cargo cargo; - readonly Cloak[] cloaks; + readonly INotifyUnload[] notifiers; readonly bool unloadAll; public UnloadCargo(Actor self, bool unloadAll) { this.self = self; cargo = self.Trait(); - cloaks = self.TraitsImplementing().ToArray(); + notifiers = self.TraitsImplementing().ToArray(); this.unloadAll = unloadAll; } @@ -60,9 +60,8 @@ namespace OpenRA.Mods.Common.Activities if (IsCanceled || cargo.IsEmpty(self)) return NextActivity; - foreach (var cloak in cloaks) - if (cloak.Info.UncloakOn.HasFlag(UncloakType.Unload)) - cloak.Uncloak(); + foreach (var inu in notifiers) + inu.Unloading(self); var actor = cargo.Peek(self); var spawn = self.CenterPosition; diff --git a/OpenRA.Mods.Common/Traits/Buildings/Building.cs b/OpenRA.Mods.Common/Traits/Buildings/Building.cs index 60f0c9aad2..74c029ff38 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Building.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Building.cs @@ -237,7 +237,7 @@ namespace OpenRA.Mods.Common.Traits } public class Building : IOccupySpace, ITargetableCells, INotifySold, INotifyTransform, ISync, INotifyCreated, - INotifyAddedToWorld, INotifyRemovedFromWorld + INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyDemolition { public readonly bool SkipMakeAnimation; public readonly BuildingInfo Info; @@ -331,6 +331,11 @@ namespace OpenRA.Mods.Common.Traits notify.BuildingComplete(self); } + void INotifyDemolition.Demolishing(Actor self) + { + Lock(); + } + void INotifySold.Selling(Actor self) { if (Info.RemoveSmudgesOnSell) diff --git a/OpenRA.Mods.Common/Traits/Cloak.cs b/OpenRA.Mods.Common/Traits/Cloak.cs index 1499d2f2e5..0b99a4584b 100644 --- a/OpenRA.Mods.Common/Traits/Cloak.cs +++ b/OpenRA.Mods.Common/Traits/Cloak.cs @@ -62,8 +62,8 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new Cloak(this); } } - public class Cloak : ConditionalTrait, IRenderModifier, INotifyDamage, - INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyCreated, INotifyHarvesterAction + public class Cloak : ConditionalTrait, IRenderModifier, INotifyDamage, INotifyUnload, INotifyDemolition, INotifyInfiltration, + INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyCreated, INotifyHarvesterAction { [Sync] int remainingTime; bool isDocking; @@ -212,5 +212,23 @@ namespace OpenRA.Mods.Common.Traits { isDocking = false; } + + void INotifyUnload.Unloading(Actor self) + { + if (Info.UncloakOn.HasFlag(UncloakType.Unload)) + Uncloak(); + } + + void INotifyDemolition.Demolishing(Actor self) + { + if (Info.UncloakOn.HasFlag(UncloakType.Demolish)) + Uncloak(); + } + + void INotifyInfiltration.Infiltrating(Actor self) + { + if (Info.UncloakOn.HasFlag(UncloakType.Infiltrate)) + Uncloak(); + } } } diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 7356fb16cc..c374c15472 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -148,6 +148,24 @@ namespace OpenRA.Mods.Common.Traits void Undocked(); } + [RequireExplicitImplementation] + public interface INotifyUnload + { + void Unloading(Actor self); + } + + [RequireExplicitImplementation] + public interface INotifyDemolition + { + void Demolishing(Actor self); + } + + [RequireExplicitImplementation] + public interface INotifyInfiltration + { + void Infiltrating(Actor self); + } + public interface ITechTreePrerequisiteInfo : ITraitInfo { } public interface ITechTreePrerequisite {