From 2bac9f6c644b1682e4626829de06185b950dd5de Mon Sep 17 00:00:00 2001 From: Taryn Hill Date: Mon, 23 Mar 2015 21:05:22 -0500 Subject: [PATCH] Add interface IPreventsEjectOnDeath. --- OpenRA.Mods.Common/Traits/Demolishable.cs | 19 +++++++++++++++++-- OpenRA.Mods.Common/Traits/EjectOnDeath.cs | 18 ++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Demolishable.cs b/OpenRA.Mods.Common/Traits/Demolishable.cs index 9c1dd4dec1..d208985cb3 100644 --- a/OpenRA.Mods.Common/Traits/Demolishable.cs +++ b/OpenRA.Mods.Common/Traits/Demolishable.cs @@ -17,11 +17,26 @@ namespace OpenRA.Mods.Common.Traits { public bool IsValidTarget(ActorInfo actorInfo, Actor saboteur) { return true; } - public object Create(ActorInitializer init) { return new Demolishable(); } + [Desc("If true and this actor has EjectOnDeath, no actor will be spawned.")] + public readonly bool PreventsEjectOnDeath = false; + + public object Create(ActorInitializer init) { return new Demolishable(init.Self, this); } } - public class Demolishable : IDemolishable + public class Demolishable : IDemolishable, IPreventsEjectOnDeath { + readonly DemolishableInfo info; + + public Demolishable(Actor self, DemolishableInfo info) + { + this.info = info; + } + + public bool PreventsEjectOnDeath(Actor self) + { + return info.PreventsEjectOnDeath; + } + public void Demolish(Actor self, Actor saboteur) { self.Kill(saboteur); diff --git a/OpenRA.Mods.Common/Traits/EjectOnDeath.cs b/OpenRA.Mods.Common/Traits/EjectOnDeath.cs index e81e72979c..78500bf61b 100644 --- a/OpenRA.Mods.Common/Traits/EjectOnDeath.cs +++ b/OpenRA.Mods.Common/Traits/EjectOnDeath.cs @@ -15,7 +15,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Eject a ground soldier or a paratrooper while in the air.")] - public class EjectOnDeathInfo : TraitInfo + public class EjectOnDeathInfo : ITraitInfo { [ActorReference] public readonly string PilotActor = "E1"; @@ -26,17 +26,31 @@ namespace OpenRA.Mods.Common.Traits [Desc("Risks stuck units when they don't have the Paratrooper trait.")] public readonly bool AllowUnsuitableCell = false; + + public object Create(ActorInitializer init) { return new EjectOnDeath(init.Self, this); } } + public interface IPreventsEjectOnDeath { bool PreventsEjectOnDeath(Actor self); } + public class EjectOnDeath : INotifyKilled { + readonly EjectOnDeathInfo info; + + public EjectOnDeath(Actor self, EjectOnDeathInfo info) + { + this.info = info; + } + public void Killed(Actor self, AttackInfo e) { if (self.Owner.WinState == WinState.Lost || !self.World.Map.Contains(self.Location)) return; + foreach (var condition in self.TraitsImplementing()) + if (condition.PreventsEjectOnDeath(self)) + return; + var r = self.World.SharedRandom.Next(1, 100); - var info = self.Info.Traits.Get(); if (r <= 100 - info.SuccessRate) return;