Introduce INotifyAttack.PreparingAttack

And use it to allow triggering attack animations/overlays at a different point
than the actual weapon firing.
This commit is contained in:
reaperrr
2016-06-10 17:40:50 +02:00
parent 87537d9669
commit 75c49620d1
12 changed files with 40 additions and 10 deletions

View File

@@ -98,12 +98,14 @@ namespace OpenRA.Mods.Common.Traits
return true; 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) if (a != null && a.Info.AmmoPoolName == Info.Name)
TakeAmmo(); TakeAmmo();
} }
void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { }
public void Tick(Actor self) public void Tick(Actor self)
{ {
if (!Info.SelfReloads) if (!Info.SelfReloads)

View File

@@ -223,6 +223,9 @@ namespace OpenRA.Mods.Common.Traits
GuidedTarget = target GuidedTarget = target
}; };
foreach (var na in self.TraitsImplementing<INotifyAttack>())
na.PreparingAttack(self, target, this, barrel);
ScheduleDelayedAction(Info.FireDelay, () => ScheduleDelayedAction(Info.FireDelay, () =>
{ {
if (args.Weapon.Projectile != null) if (args.Weapon.Projectile != null)

View File

@@ -64,12 +64,14 @@ namespace OpenRA.Mods.Common.Traits
return base.CanAttack(self, target); 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; --charges;
timeToRecharge = info.ReloadDelay; 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) public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove, bool forceAttack)
{ {
return new ChargeAttack(this, newTarget); return new ChargeAttack(this, newTarget);

View File

@@ -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.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) void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e)
{ {
damageDisabled = e.DamageState >= DamageState.Critical; damageDisabled = e.DamageState >= DamageState.Critical;

View File

@@ -82,12 +82,14 @@ namespace OpenRA.Mods.Common.Traits
Panic(); 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) if (self.World.SharedRandom.Next(100 / info.AttackPanicChance) == 0)
Panic(); Panic();
} }
void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { }
public int GetSpeedModifier() public int GetSpeedModifier()
{ {
return Panicking ? info.PanicSpeedModifier : 100; return Panicking ? info.PanicSpeedModifier : 100;

View File

@@ -47,13 +47,15 @@ namespace OpenRA.Mods.Common.Traits.Render
wsb = init.Self.Trait<WithSpriteBody>(); wsb = init.Self.Trait<WithSpriteBody>();
} }
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)) if (!string.IsNullOrEmpty(info.AttackSequence))
wsb.PlayCustomAnimation(self, info.AttackSequence, () => wsb.CancelCustomAnimation(self)); 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)) if (string.IsNullOrEmpty(info.AimSequence) && string.IsNullOrEmpty(info.ReloadPrefix))
return; return;

View File

@@ -50,7 +50,9 @@ namespace OpenRA.Mods.Common.Traits.Render
info.Palette, info.IsPlayerPalette); 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; attacking = true;
overlay.PlayThen(info.Sequence, () => attacking = false); overlay.PlayThen(info.Sequence, () => attacking = false);

View File

@@ -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); Attacking(self, target);
} }
void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel) { }
public virtual void Tick(Actor self) public virtual void Tick(Actor self)
{ {
if (rsm != null) if (rsm != null)

View File

@@ -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) if (a == null)
return; return;
@@ -94,6 +94,8 @@ namespace OpenRA.Mods.Common.Traits.Render
anims[barrel].Animation.PlayThen(sequence, () => visible[barrel] = false); anims[barrel].Animation.PlayThen(sequence, () => visible[barrel] = false);
} }
void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { }
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{ {
foreach (var arm in armaments) foreach (var arm in armaments)

View File

@@ -34,7 +34,13 @@ namespace OpenRA.Mods.Common.Traits
IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition); IEnumerable<IRenderable> 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 INotifyBurstComplete { void FiredBurst(Actor self, Target target, Armament a); }
public interface INotifyCharging { void Charging(Actor self, Target target); } public interface INotifyCharging { void Charging(Actor self, Target target); }
public interface INotifyChat { bool OnChat(string from, string message); } public interface INotifyChat { bool OnChat(string from, string message); }

View File

@@ -92,7 +92,10 @@ namespace OpenRA.Mods.D2k.Activities
}); });
foreach (var notify in self.TraitsImplementing<INotifyAttack>()) foreach (var notify in self.TraitsImplementing<INotifyAttack>())
{
notify.PreparingAttack(self, target, null, null);
notify.Attacking(self, target, null, null); notify.Attacking(self, target, null, null);
}
return true; return true;
} }

View File

@@ -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); }
} }
} }