From 9c20fba4a03243644b0cea1ae26ecfb799229d67 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 4 Dec 2010 11:02:53 +1300 Subject: [PATCH] fix spy crashing things when disguised as a unit with fewer idle anims --- OpenRA.Game/Graphics/Animation.cs | 10 ++++++---- OpenRA.Mods.RA/IdleAnimation.cs | 12 ++++++++---- OpenRA.Mods.RA/Render/RenderSpy.cs | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/OpenRA.Game/Graphics/Animation.cs b/OpenRA.Game/Graphics/Animation.cs index 4aba0fecfd..63f01ac475 100644 --- a/OpenRA.Game/Graphics/Animation.cs +++ b/OpenRA.Game/Graphics/Animation.cs @@ -56,13 +56,14 @@ namespace OpenRA.Graphics PlayThen( sequenceName, () => PlayRepeating( CurrentSequence.Name ) ); } - public void ReplaceAnim(string sequenceName) + public bool ReplaceAnim(string sequenceName) { if (!HasSequence(sequenceName)) - return; + return false; CurrentSequence = SequenceProvider.GetSequence(name, sequenceName); frame %= CurrentSequence.Length; + return true; } public void PlayThen( string sequenceName, Action after ) @@ -124,14 +125,15 @@ namespace OpenRA.Graphics } } - public void ChangeImage(string newImage) + public void ChangeImage(string newImage, string newAnimIfMissing) { newImage = newImage.ToLowerInvariant(); if (name != newImage) { name = newImage.ToLowerInvariant(); - ReplaceAnim(CurrentSequence.Name); + if (!ReplaceAnim(CurrentSequence.Name)) + ReplaceAnim(newAnimIfMissing); } } diff --git a/OpenRA.Mods.RA/IdleAnimation.cs b/OpenRA.Mods.RA/IdleAnimation.cs index be25f40b48..3e417aa7a0 100644 --- a/OpenRA.Mods.RA/IdleAnimation.cs +++ b/OpenRA.Mods.RA/IdleAnimation.cs @@ -8,8 +8,8 @@ */ #endregion +using OpenRA.Mods.RA.Render; using OpenRA.Traits; -using OpenRA.Mods.RA.Render; namespace OpenRA.Mods.RA { @@ -20,7 +20,6 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new IdleAnimation(this); } } - // infantry prone behavior class IdleAnimation : ITick, INotifyIdle { enum IdleState @@ -53,8 +52,13 @@ namespace OpenRA.Mods.RA else if (delay > 0 && --delay == 0) { - state = IdleState.Active; - self.Trait().anim.PlayThen(sequence, () => state = IdleState.None); + state = IdleState.Active; + var ri = self.TraitOrDefault(); + + if (ri.anim.HasSequence(sequence)) + ri.anim.PlayThen(sequence, () => state = IdleState.None); + else + state = IdleState.None; } } diff --git a/OpenRA.Mods.RA/Render/RenderSpy.cs b/OpenRA.Mods.RA/Render/RenderSpy.cs index 5a9282dd8d..5c4f19e6a5 100755 --- a/OpenRA.Mods.RA/Render/RenderSpy.cs +++ b/OpenRA.Mods.RA/Render/RenderSpy.cs @@ -46,13 +46,13 @@ namespace OpenRA.Mods.RA.Render { disguisedAsPlayer = target.Owner; disguisedAsSprite = target.Trait().GetImage(target); - anim.ChangeImage(disguisedAsSprite); + anim.ChangeImage(disguisedAsSprite, "stand"); } else { disguisedAsPlayer = null; disguisedAsSprite = null; - anim.ChangeImage(GetImage(self)); + anim.ChangeImage(GetImage(self), "stand"); } } }