From a0941db61bbc62d6a3b253e9abe7b38034fd60d2 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 17 Apr 2011 20:02:02 +1200 Subject: [PATCH] Fix warfactory roof glitch --- OpenRA.Mods.RA/Activities/MakeAnimation.cs | 12 +++++++----- OpenRA.Mods.RA/Render/RenderBuilding.cs | 8 ++++---- OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs | 10 +++++++--- OpenRA.Mods.RA/Sellable.cs | 8 +++++--- OpenRA.Mods.RA/Transforms.cs | 5 +++-- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/OpenRA.Mods.RA/Activities/MakeAnimation.cs b/OpenRA.Mods.RA/Activities/MakeAnimation.cs index c620c5028b..9673efd065 100644 --- a/OpenRA.Mods.RA/Activities/MakeAnimation.cs +++ b/OpenRA.Mods.RA/Activities/MakeAnimation.cs @@ -13,17 +13,20 @@ using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Render; using OpenRA.Traits; using OpenRA.Traits.Activities; +using System; namespace OpenRA.Mods.RA.Activities { class MakeAnimation : Activity { readonly bool Reversed; + readonly Action OnComplete; - public MakeAnimation(Actor self) : this(self, false) {} - public MakeAnimation(Actor self, bool reversed) + public MakeAnimation(Actor self, Action onComplete) : this(self, false, onComplete) {} + public MakeAnimation(Actor self, bool reversed, Action onComplete) { Reversed = reversed; + OnComplete = onComplete; } bool complete = false; @@ -41,11 +44,10 @@ namespace OpenRA.Mods.RA.Activities foreach (var s in bi.SellSounds) Sound.PlayToPlayer(self.Owner, s, self.CenterLocation); - // PlayCustomAnim is required to stop a frame of the normal state after the anim completes - rb.PlayCustomAnimBackwards(self, "make", () => {rb.PlayCustomAnim(self, "make"); complete = true;}); + rb.PlayCustomAnimBackwards(self, "make", () => { OnComplete(); complete = true;}); } else - rb.PlayCustomAnimThen(self, "make", () => complete = true); + rb.PlayCustomAnimThen(self, "make", () => { OnComplete(); complete = true;}); } return complete ? NextActivity : this; } diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index a805ae879f..be3c2b15e6 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -47,11 +47,11 @@ namespace OpenRA.Mods.RA.Render // Work around a bogus crash anim.PlayRepeating( NormalizeSequence(self, "idle") ); + // Can't call Complete() directly from ctor because other traits haven't been inited yet if (self.Info.Traits.Get().HasMakeAnimation && !init.Contains()) - self.QueueActivity(new MakeAnimation(self)); - - // Can't call Complete() from ctor because other traits haven't been inited yet - self.QueueActivity(new CallFunc(() => Complete(self))); + self.QueueActivity(new MakeAnimation(self, () => Complete(self))); + else + self.QueueActivity(new CallFunc(() => Complete(self))); } public IEnumerable ModifyRender(Actor self, IEnumerable r) diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index 93601c8316..d5dd3f32c3 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -44,18 +44,22 @@ namespace OpenRA.Mods.RA.Render bool isOpen; [Sync] int2 openExit; - + + bool buildComplete; public RenderBuildingWarFactory(ActorInitializer init, RenderBuildingInfo info) : base(init, info) { roof = new Animation(GetImage(init.self)); + var offset = new RenderSimple.AnimationWithOffset( roof ) { ZOffset = 24 }; + offset.DisableFunc = () => !buildComplete; + anims.Add("roof", offset); } public void BuildingComplete( Actor self ) { roof.Play(NormalizeSequence(self, self.GetDamageState() > DamageState.Heavy ? "damaged-idle-top" : "idle-top")); - self.Trait().anims.Add( "roof", new RenderSimple.AnimationWithOffset( roof ) { ZOffset = 24 } ); + buildComplete = true; } public override void Tick(Actor self) @@ -89,7 +93,7 @@ namespace OpenRA.Mods.RA.Render public void Selling(Actor self) { - self.Trait().anims.Remove("roof"); + anims.Remove("roof"); } public void Sold(Actor self) { } diff --git a/OpenRA.Mods.RA/Sellable.cs b/OpenRA.Mods.RA/Sellable.cs index b94b3bedd0..71ab7d34e1 100644 --- a/OpenRA.Mods.RA/Sellable.cs +++ b/OpenRA.Mods.RA/Sellable.cs @@ -30,13 +30,15 @@ namespace OpenRA.Mods.RA if (order.OrderString == "Sell" && !selling) { selling = true; - self.CancelActivity(); - if (self.HasTrait() && self.Info.Traits.Get().HasMakeAnimation) - self.QueueActivity(new MakeAnimation(self, true)); foreach( var ns in self.TraitsImplementing() ) ns.Selling( self ); + self.CancelActivity(); + + var rb = self.TraitOrDefault(); + if (rb != null && self.Info.Traits.Get().HasMakeAnimation) + self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make"))); self.QueueActivity(new Sell()); } } diff --git a/OpenRA.Mods.RA/Transforms.cs b/OpenRA.Mods.RA/Transforms.cs index 5a64e7a92e..9361aea513 100644 --- a/OpenRA.Mods.RA/Transforms.cs +++ b/OpenRA.Mods.RA/Transforms.cs @@ -80,8 +80,9 @@ namespace OpenRA.Mods.RA if (self.HasTrait()) self.QueueActivity(new Turn(Info.Facing)); - if (self.HasTrait() && self.Info.Traits.Get().HasMakeAnimation) - self.QueueActivity(new MakeAnimation(self, true)); + var rb = self.TraitOrDefault(); + if (rb != null && self.Info.Traits.Get().HasMakeAnimation) + self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make"))); self.QueueActivity(new Transform(self, Info.IntoActor) {Offset = Info.Offset, Facing = Info.Facing, Sounds = Info.TransformSounds}); }