Add Condition support to WithDeathAnimation / DeathSounds.
This commit is contained in:
@@ -18,7 +18,7 @@ using OpenRA.Traits;
|
|||||||
namespace OpenRA.Mods.Common.Traits.Render
|
namespace OpenRA.Mods.Common.Traits.Render
|
||||||
{
|
{
|
||||||
[Desc("This actor has a death animation.")]
|
[Desc("This actor has a death animation.")]
|
||||||
public class WithDeathAnimationInfo : ITraitInfo, Requires<RenderSpritesInfo>
|
public class WithDeathAnimationInfo : ConditionalTraitInfo, Requires<RenderSpritesInfo>
|
||||||
{
|
{
|
||||||
[Desc("Sequence prefix to play when this actor is killed by a warhead.")]
|
[Desc("Sequence prefix to play when this actor is killed by a warhead.")]
|
||||||
[SequenceReference(null, true)] public readonly string DeathSequence = "die";
|
[SequenceReference(null, true)] public readonly string DeathSequence = "die";
|
||||||
@@ -58,25 +58,24 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
: new Dictionary<string, string[]>();
|
: new Dictionary<string, string[]>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new WithDeathAnimation(init.Self, this); }
|
public override object Create(ActorInitializer init) { return new WithDeathAnimation(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class WithDeathAnimation : INotifyKilled, INotifyCrushed
|
public class WithDeathAnimation : ConditionalTrait<WithDeathAnimationInfo>, INotifyKilled, INotifyCrushed
|
||||||
{
|
{
|
||||||
public readonly WithDeathAnimationInfo Info;
|
|
||||||
readonly RenderSprites rs;
|
readonly RenderSprites rs;
|
||||||
bool crushed;
|
bool crushed;
|
||||||
|
|
||||||
public WithDeathAnimation(Actor self, WithDeathAnimationInfo info)
|
public WithDeathAnimation(Actor self, WithDeathAnimationInfo info)
|
||||||
|
: base(info)
|
||||||
{
|
{
|
||||||
Info = info;
|
|
||||||
rs = self.Trait<RenderSprites>();
|
rs = self.Trait<RenderSprites>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Killed(Actor self, AttackInfo e)
|
public void Killed(Actor self, AttackInfo e)
|
||||||
{
|
{
|
||||||
// Actors with Crushable trait will spawn CrushedSequence.
|
// Actors with Crushable trait will spawn CrushedSequence.
|
||||||
if (crushed)
|
if (crushed || IsTraitDisabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var palette = Info.DeathSequencePalette;
|
var palette = Info.DeathSequencePalette;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ using OpenRA.Traits;
|
|||||||
namespace OpenRA.Mods.Common.Traits.Sound
|
namespace OpenRA.Mods.Common.Traits.Sound
|
||||||
{
|
{
|
||||||
[Desc("Sounds to play when killed.")]
|
[Desc("Sounds to play when killed.")]
|
||||||
public class DeathSoundsInfo : ITraitInfo
|
public class DeathSoundsInfo : ConditionalTraitInfo
|
||||||
{
|
{
|
||||||
[Desc("Death notification voice.")]
|
[Desc("Death notification voice.")]
|
||||||
[VoiceReference] public readonly string Voice = "Die";
|
[VoiceReference] public readonly string Voice = "Die";
|
||||||
@@ -28,19 +28,21 @@ namespace OpenRA.Mods.Common.Traits.Sound
|
|||||||
"If empty, this will be used as the default sound for all death types.")]
|
"If empty, this will be used as the default sound for all death types.")]
|
||||||
public readonly HashSet<string> DeathTypes = new HashSet<string>();
|
public readonly HashSet<string> DeathTypes = new HashSet<string>();
|
||||||
|
|
||||||
public object Create(ActorInitializer init) { return new DeathSounds(this); }
|
public override object Create(ActorInitializer init) { return new DeathSounds(this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DeathSounds : INotifyKilled
|
public class DeathSounds : ConditionalTrait<DeathSoundsInfo>, INotifyKilled
|
||||||
{
|
{
|
||||||
readonly DeathSoundsInfo info;
|
public DeathSounds(DeathSoundsInfo info)
|
||||||
|
: base(info) { }
|
||||||
public DeathSounds(DeathSoundsInfo info) { this.info = info; }
|
|
||||||
|
|
||||||
public void Killed(Actor self, AttackInfo e)
|
public void Killed(Actor self, AttackInfo e)
|
||||||
{
|
{
|
||||||
if (info.DeathTypes.Count == 0 || e.Damage.DamageTypes.Overlaps(info.DeathTypes))
|
if (IsTraitDisabled)
|
||||||
self.PlayVoiceLocal(info.Voice, info.VolumeMultiplier);
|
return;
|
||||||
|
|
||||||
|
if (Info.DeathTypes.Count == 0 || e.Damage.DamageTypes.Overlaps(Info.DeathTypes))
|
||||||
|
self.PlayVoiceLocal(Info.Voice, Info.VolumeMultiplier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user