From 75c49620d1d4eb6690af0cc5fda11018a5f2a42b Mon Sep 17 00:00:00 2001 From: reaperrr Date: Fri, 10 Jun 2016 17:40:50 +0200 Subject: [PATCH] Introduce INotifyAttack.PreparingAttack And use it to allow triggering attack animations/overlays at a different point than the actual weapon firing. --- OpenRA.Mods.Common/Traits/AmmoPool.cs | 4 +++- OpenRA.Mods.Common/Traits/Armament.cs | 3 +++ OpenRA.Mods.Common/Traits/Attack/AttackCharge.cs | 4 +++- OpenRA.Mods.Common/Traits/Cloak.cs | 2 ++ OpenRA.Mods.Common/Traits/Infantry/ScaredyCat.cs | 4 +++- OpenRA.Mods.Common/Traits/Render/WithAttackAnimation.cs | 6 ++++-- OpenRA.Mods.Common/Traits/Render/WithAttackOverlay.cs | 4 +++- OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs | 4 +++- OpenRA.Mods.Common/Traits/Render/WithMuzzleOverlay.cs | 4 +++- OpenRA.Mods.Common/TraitsInterfaces.cs | 8 +++++++- OpenRA.Mods.D2k/Activities/SwallowActor.cs | 3 +++ OpenRA.Mods.RA/Traits/Disguise.cs | 4 +++- 12 files changed, 40 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/AmmoPool.cs b/OpenRA.Mods.Common/Traits/AmmoPool.cs index 8dc8268375..0e7cfa3c1e 100644 --- a/OpenRA.Mods.Common/Traits/AmmoPool.cs +++ b/OpenRA.Mods.Common/Traits/AmmoPool.cs @@ -98,12 +98,14 @@ namespace OpenRA.Mods.Common.Traits return true; } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { if (a != null && a.Info.AmmoPoolName == Info.Name) TakeAmmo(); } + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { } + public void Tick(Actor self) { if (!Info.SelfReloads) diff --git a/OpenRA.Mods.Common/Traits/Armament.cs b/OpenRA.Mods.Common/Traits/Armament.cs index 9ca212cef2..2ec8a9a614 100644 --- a/OpenRA.Mods.Common/Traits/Armament.cs +++ b/OpenRA.Mods.Common/Traits/Armament.cs @@ -223,6 +223,9 @@ namespace OpenRA.Mods.Common.Traits GuidedTarget = target }; + foreach (var na in self.TraitsImplementing()) + na.PreparingAttack(self, target, this, barrel); + ScheduleDelayedAction(Info.FireDelay, () => { if (args.Weapon.Projectile != null) diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackCharge.cs b/OpenRA.Mods.Common/Traits/Attack/AttackCharge.cs index 9e51574b96..7c64ebaac0 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackCharge.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackCharge.cs @@ -64,12 +64,14 @@ namespace OpenRA.Mods.Common.Traits return base.CanAttack(self, target); } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { --charges; timeToRecharge = info.ReloadDelay; } + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { } + public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove, bool forceAttack) { return new ChargeAttack(this, newTarget); diff --git a/OpenRA.Mods.Common/Traits/Cloak.cs b/OpenRA.Mods.Common/Traits/Cloak.cs index 0a92925b8b..086e411076 100644 --- a/OpenRA.Mods.Common/Traits/Cloak.cs +++ b/OpenRA.Mods.Common/Traits/Cloak.cs @@ -98,6 +98,8 @@ namespace OpenRA.Mods.Common.Traits void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { if (Info.UncloakOn.HasFlag(UncloakType.Attack)) Uncloak(); } + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { } + void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e) { damageDisabled = e.DamageState >= DamageState.Critical; diff --git a/OpenRA.Mods.Common/Traits/Infantry/ScaredyCat.cs b/OpenRA.Mods.Common/Traits/Infantry/ScaredyCat.cs index 4547d985c2..11907d83ef 100644 --- a/OpenRA.Mods.Common/Traits/Infantry/ScaredyCat.cs +++ b/OpenRA.Mods.Common/Traits/Infantry/ScaredyCat.cs @@ -82,12 +82,14 @@ namespace OpenRA.Mods.Common.Traits Panic(); } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { if (self.World.SharedRandom.Next(100 / info.AttackPanicChance) == 0) Panic(); } + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { } + public int GetSpeedModifier() { return Panicking ? info.PanicSpeedModifier : 100; diff --git a/OpenRA.Mods.Common/Traits/Render/WithAttackAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithAttackAnimation.cs index 6dd64ab1b2..ae11f808e6 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithAttackAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithAttackAnimation.cs @@ -47,13 +47,15 @@ namespace OpenRA.Mods.Common.Traits.Render wsb = init.Self.Trait(); } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { } + + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { if (!string.IsNullOrEmpty(info.AttackSequence)) wsb.PlayCustomAnimation(self, info.AttackSequence, () => wsb.CancelCustomAnimation(self)); } - public void Tick(Actor self) + void ITick.Tick(Actor self) { if (string.IsNullOrEmpty(info.AimSequence) && string.IsNullOrEmpty(info.ReloadPrefix)) return; diff --git a/OpenRA.Mods.Common/Traits/Render/WithAttackOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithAttackOverlay.cs index a838d5a638..223cff7974 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithAttackOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithAttackOverlay.cs @@ -50,7 +50,9 @@ namespace OpenRA.Mods.Common.Traits.Render info.Palette, info.IsPlayerPalette); } - void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { } + + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { attacking = true; overlay.PlayThen(info.Sequence, () => attacking = false); diff --git a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs index dfe0f5125e..4ff82366cb 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs @@ -105,11 +105,13 @@ namespace OpenRA.Mods.Common.Traits.Render } } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { Attacking(self, target); } + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { } + public virtual void Tick(Actor self) { if (rsm != null) diff --git a/OpenRA.Mods.Common/Traits/Render/WithMuzzleOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithMuzzleOverlay.cs index d29e5de2a7..e5044a556b 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithMuzzleOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithMuzzleOverlay.cs @@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Traits.Render } } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { if (a == null) return; @@ -94,6 +94,8 @@ namespace OpenRA.Mods.Common.Traits.Render anims[barrel].Animation.PlayThen(sequence, () => visible[barrel] = false); } + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { } + public IEnumerable Render(Actor self, WorldRenderer wr) { foreach (var arm in armaments) diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index c4ef8fe336..ca652ebc09 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -34,7 +34,13 @@ namespace OpenRA.Mods.Common.Traits IEnumerable Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition); } - public interface INotifyAttack { void Attacking(Actor self, Target target, Armament a, Barrel barrel); } + [RequireExplicitImplementation] + public interface INotifyAttack + { + void Attacking(Actor self, Target target, Armament a, Barrel barrel); + void PreparingAttack(Actor self, Target target, Armament a, Barrel barrel); + } + public interface INotifyBurstComplete { void FiredBurst(Actor self, Target target, Armament a); } public interface INotifyCharging { void Charging(Actor self, Target target); } public interface INotifyChat { bool OnChat(string from, string message); } diff --git a/OpenRA.Mods.D2k/Activities/SwallowActor.cs b/OpenRA.Mods.D2k/Activities/SwallowActor.cs index 242db18501..9e58d7821f 100644 --- a/OpenRA.Mods.D2k/Activities/SwallowActor.cs +++ b/OpenRA.Mods.D2k/Activities/SwallowActor.cs @@ -92,7 +92,10 @@ namespace OpenRA.Mods.D2k.Activities }); foreach (var notify in self.TraitsImplementing()) + { + notify.PreparingAttack(self, target, null, null); notify.Attacking(self, target, null, null); + } return true; } diff --git a/OpenRA.Mods.RA/Traits/Disguise.cs b/OpenRA.Mods.RA/Traits/Disguise.cs index 6ae7e41a7b..1a39180949 100644 --- a/OpenRA.Mods.RA/Traits/Disguise.cs +++ b/OpenRA.Mods.RA/Traits/Disguise.cs @@ -197,6 +197,8 @@ namespace OpenRA.Mods.RA.Traits } } - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) { DisguiseAs(null); } + void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { } + + void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { DisguiseAs(null); } } } \ No newline at end of file