From 7e67ce013976aa60837f71ac9bb877e40bbc8599 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 26 Oct 2018 18:35:45 +0000 Subject: [PATCH] Pass CaptureTypes through the INotifyCapture interface. Also make it require explicit implementation. --- OpenRA.Mods.Common/Activities/CaptureActor.cs | 2 +- OpenRA.Mods.Common/Scripting/ScriptTriggers.cs | 2 +- OpenRA.Mods.Common/Traits/Buildings/Refinery.cs | 3 ++- OpenRA.Mods.Common/Traits/Capturable.cs | 2 +- OpenRA.Mods.Common/Traits/CaptureManager.cs | 2 +- OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs | 5 ++--- OpenRA.Mods.Common/Traits/ProximityCaptor.cs | 3 ++- OpenRA.Mods.Common/Traits/ProximityCapturable.cs | 6 ++++-- OpenRA.Mods.Common/Traits/Sound/CaptureNotification.cs | 3 ++- OpenRA.Mods.Common/Traits/StoresResources.cs | 3 ++- OpenRA.Mods.Common/Traits/TransformOnCapture.cs | 3 ++- OpenRA.Mods.Common/TraitsInterfaces.cs | 4 +++- 12 files changed, 23 insertions(+), 15 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/CaptureActor.cs b/OpenRA.Mods.Common/Activities/CaptureActor.cs index 34cde34516..4583cec3f2 100644 --- a/OpenRA.Mods.Common/Activities/CaptureActor.cs +++ b/OpenRA.Mods.Common/Activities/CaptureActor.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.Common.Activities actor.ChangeOwnerSync(self.Owner); foreach (var t in actor.TraitsImplementing()) - t.OnCapture(actor, self, oldOwner, self.Owner); + t.OnCapture(actor, self, oldOwner, self.Owner, captures.Info.CaptureTypes); if (self.Owner.Stances[oldOwner].HasStance(captures.Info.PlayerExperienceStances)) { diff --git a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs index eedaa96d1d..f94699afd5 100644 --- a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs +++ b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs @@ -278,7 +278,7 @@ namespace OpenRA.Mods.Common.Scripting } } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { if (world.Disposing) return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs index e47e5c56a8..f683653f55 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs @@ -16,6 +16,7 @@ using OpenRA.Activities; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Traits.Render; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -161,7 +162,7 @@ namespace OpenRA.Mods.Common.Traits playerResources = newOwner.PlayerActor.Trait(); } - void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { // Steal any docked harv too if (dockedHarv != null) diff --git a/OpenRA.Mods.Common/Traits/Capturable.cs b/OpenRA.Mods.Common/Traits/Capturable.cs index 5108627d1b..15bf165859 100644 --- a/OpenRA.Mods.Common/Traits/Capturable.cs +++ b/OpenRA.Mods.Common/Traits/Capturable.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits captureManager = self.Trait(); } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { if (Info.CancelActivity) { diff --git a/OpenRA.Mods.Common/Traits/CaptureManager.cs b/OpenRA.Mods.Common/Traits/CaptureManager.cs index f639c154f5..4a90c2f98e 100644 --- a/OpenRA.Mods.Common/Traits/CaptureManager.cs +++ b/OpenRA.Mods.Common/Traits/CaptureManager.cs @@ -161,7 +161,7 @@ namespace OpenRA.Mods.Common.Traits return null; } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { BeingCaptured = true; self.World.AddFrameEndTask(w => BeingCaptured = false); diff --git a/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs index 42fca3c84b..7c84330bea 100644 --- a/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs +++ b/OpenRA.Mods.Common/Traits/GivesCashOnCapture.cs @@ -9,11 +9,10 @@ */ #endregion -using System; using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Effects; -using OpenRA.Traits; +using OpenRA.Primitives; namespace OpenRA.Mods.Common.Traits { @@ -45,7 +44,7 @@ namespace OpenRA.Mods.Common.Traits this.info = info; } - void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { if (IsTraitDisabled || !IsValidCaptor(captor)) return; diff --git a/OpenRA.Mods.Common/Traits/ProximityCaptor.cs b/OpenRA.Mods.Common/Traits/ProximityCaptor.cs index dd3abe0bd1..0ee2330a1c 100644 --- a/OpenRA.Mods.Common/Traits/ProximityCaptor.cs +++ b/OpenRA.Mods.Common/Traits/ProximityCaptor.cs @@ -10,6 +10,7 @@ #endregion using System.Collections.Generic; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -18,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits public class ProximityCaptorInfo : TraitInfo { [FieldLoader.Require] - public readonly HashSet Types = new HashSet(); + public readonly BitSet Types = default(BitSet); } public class ProximityCaptor { } diff --git a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs index 1a4541e327..532bbe1dd8 100644 --- a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs +++ b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs @@ -15,6 +15,7 @@ using System.Linq; using OpenRA.Graphics; using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Graphics; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -26,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits public readonly WDist Range = WDist.FromCells(5); [Desc("Allowed ProximityCaptor actors to capture this actor.")] - public readonly HashSet CaptorTypes = new HashSet { "Vehicle", "Tank", "Infantry" }; + public readonly BitSet CaptorTypes = new BitSet("Vehicle", "Tank", "Infantry"); [Desc("If set, the capturing process stops immediately after another player comes into Range.")] public readonly bool MustBeClear = false; @@ -182,8 +183,9 @@ namespace OpenRA.Mods.Common.Traits if (self.Owner == self.World.LocalPlayer) w.Add(new FlashTarget(self)); + var pc = captor.Info.TraitInfoOrDefault(); foreach (var t in self.TraitsImplementing()) - t.OnCapture(self, captor, previousOwner, captor.Owner); + t.OnCapture(self, captor, previousOwner, captor.Owner, pc.Types); }); } diff --git a/OpenRA.Mods.Common/Traits/Sound/CaptureNotification.cs b/OpenRA.Mods.Common/Traits/Sound/CaptureNotification.cs index 6b2c7aea34..7e7d760ea5 100644 --- a/OpenRA.Mods.Common/Traits/Sound/CaptureNotification.cs +++ b/OpenRA.Mods.Common/Traits/Sound/CaptureNotification.cs @@ -9,6 +9,7 @@ */ #endregion +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits.Sound @@ -40,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits.Sound this.info = info; } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { var faction = info.NewOwnerVoice ? newOwner.Faction.InternalName : oldOwner.Faction.InternalName; Game.Sound.PlayNotification(self.World.Map.Rules, newOwner, "Speech", info.Notification, faction); diff --git a/OpenRA.Mods.Common/Traits/StoresResources.cs b/OpenRA.Mods.Common/Traits/StoresResources.cs index f6e579ed95..9edfb7cbef 100644 --- a/OpenRA.Mods.Common/Traits/StoresResources.cs +++ b/OpenRA.Mods.Common/Traits/StoresResources.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -50,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits player = newOwner.PlayerActor.Trait(); } - void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { var resources = Stored; oldOwner.PlayerActor.Trait().TakeResources(resources); diff --git a/OpenRA.Mods.Common/Traits/TransformOnCapture.cs b/OpenRA.Mods.Common/Traits/TransformOnCapture.cs index 5b40278844..01fc4e37c5 100644 --- a/OpenRA.Mods.Common/Traits/TransformOnCapture.cs +++ b/OpenRA.Mods.Common/Traits/TransformOnCapture.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; +using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -40,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits faction = init.Contains() ? init.Get() : init.Self.Owner.Faction.InternalName; } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + void INotifyCapture.OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes) { if (!IsValidCaptor(captor)) return; diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 2eabfd6a58..bdb557f16a 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -138,7 +138,9 @@ namespace OpenRA.Mods.Common.Traits public interface INotifyDelivery { void IncomingDelivery(Actor self); void Delivered(Actor self); } public interface INotifyDocking { void Docked(Actor self, Actor harvester); void Undocked(Actor self, Actor harvester); } public interface INotifyParachute { void OnParachute(Actor self); void OnLanded(Actor self, Actor ignore); } - public interface INotifyCapture { void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner); } + + [RequireExplicitImplementation] + public interface INotifyCapture { void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner, BitSet captureTypes); } public interface INotifyDiscovered { void OnDiscovered(Actor self, Player discoverer, bool playNotification); } public interface IRenderActorPreviewInfo : ITraitInfo { IEnumerable RenderPreview(ActorPreviewInitializer init); } public interface ICruiseAltitudeInfo : ITraitInfo { WDist GetCruiseAltitude(); }