diff --git a/OpenRA.Mods.Common/Activities/Resupply.cs b/OpenRA.Mods.Common/Activities/Resupply.cs index dc4440581a..b01a5f4780 100644 --- a/OpenRA.Mods.Common/Activities/Resupply.cs +++ b/OpenRA.Mods.Common/Activities/Resupply.cs @@ -29,6 +29,7 @@ namespace OpenRA.Mods.Common.Activities readonly RepairableNear repairableNear; readonly Rearmable rearmable; readonly INotifyResupply[] notifyResupplies; + readonly INotifyBeingResupplied[] notifyBeingResupplied; readonly ICallForTransport[] transportCallers; readonly IMove move; readonly Aircraft aircraft; @@ -53,6 +54,7 @@ namespace OpenRA.Mods.Common.Activities repairableNear = self.TraitOrDefault(); rearmable = self.TraitOrDefault(); notifyResupplies = host.TraitsImplementing().ToArray(); + notifyBeingResupplied = self.TraitsImplementing().ToArray(); transportCallers = self.TraitsImplementing().ToArray(); move = self.Trait(); aircraft = move as Aircraft; @@ -149,6 +151,9 @@ namespace OpenRA.Mods.Common.Activities actualResupplyStarted = true; foreach (var notifyResupply in notifyResupplies) notifyResupply.BeforeResupply(host.Actor, self, activeResupplyTypes); + + foreach (var br in notifyBeingResupplied) + br.StartingResupply(self, host.Actor); } if (activeResupplyTypes.HasFlag(ResupplyType.Repair)) @@ -237,6 +242,9 @@ namespace OpenRA.Mods.Common.Activities else if (repairableNear == null && !(self.CurrentActivity.NextActivity is Move)) QueueChild(move.MoveToTarget(self, host)); } + + foreach (var br in notifyBeingResupplied) + br.StoppingResupply(self, isHostInvalid ? null : host.Actor); } void RepairTick(Actor self) diff --git a/OpenRA.Mods.Common/Traits/Cloak.cs b/OpenRA.Mods.Common/Traits/Cloak.cs index 8dea4ce0a2..434745c5b8 100644 --- a/OpenRA.Mods.Common/Traits/Cloak.cs +++ b/OpenRA.Mods.Common/Traits/Cloak.cs @@ -45,7 +45,8 @@ namespace OpenRA.Mods.Common.Traits [Desc("Measured in game ticks.")] public readonly int CloakDelay = 30; - [Desc("Events leading to the actor getting uncloaked. Possible values are: Attack, Move, Unload, Infiltrate, Demolish, Dock, Damage, Heal and SelfHeal.")] + [Desc("Events leading to the actor getting uncloaked. Possible values are: Attack, Move, Unload, Infiltrate, Demolish, Dock, Damage, Heal and SelfHeal.", + "'Dock' is triggered when docking to a refinery or resupplying.")] public readonly UncloakType UncloakOn = UncloakType.Attack | UncloakType.Unload | UncloakType.Infiltrate | UncloakType.Demolish | UncloakType.Dock; @@ -66,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits } public class Cloak : PausableConditionalTrait, IRenderModifier, INotifyDamage, INotifyUnload, INotifyDemolition, INotifyInfiltration, - INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyCreated, INotifyHarvesterAction + INotifyAttack, ITick, IVisibilityModifier, IRadarColorModifier, INotifyCreated, INotifyHarvesterAction, INotifyBeingResupplied { [Sync] int remainingTime; @@ -246,5 +247,20 @@ namespace OpenRA.Mods.Common.Traits if (Info.UncloakOn.HasFlag(UncloakType.Infiltrate)) Uncloak(); } + + void INotifyBeingResupplied.StartingResupply(Actor self, Actor host) + { + if (Info.UncloakOn.HasFlag(UncloakType.Dock)) + { + isDocking = true; + Uncloak(); + } + } + + void INotifyBeingResupplied.StoppingResupply(Actor self, Actor host) + { + if (Info.UncloakOn.HasFlag(UncloakType.Dock)) + isDocking = false; + } } } diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 3e758e7688..806e1bf796 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -131,6 +131,13 @@ namespace OpenRA.Mods.Common.Traits void ResupplyTick(Actor host, Actor target, ResupplyType types); } + [RequireExplicitImplementation] + public interface INotifyBeingResupplied + { + void StartingResupply(Actor self, Actor host); + void StoppingResupply(Actor self, Actor host); + } + [RequireExplicitImplementation] public interface INotifyPowerLevelChanged { void PowerLevelChanged(Actor self); } public interface INotifySupportPower { void Charged(Actor self); void Activated(Actor self); }