diff --git a/OpenRA.Mods.Common/Activities/Rearm.cs b/OpenRA.Mods.Common/Activities/Rearm.cs index 760b33e12d..173f3e47b5 100644 --- a/OpenRA.Mods.Common/Activities/Rearm.cs +++ b/OpenRA.Mods.Common/Activities/Rearm.cs @@ -59,9 +59,8 @@ namespace OpenRA.Mods.Common.Activities if (!pool.GiveAmmo()) continue; - var wsb = hostBuilding.Trait(); - if (wsb.DefaultAnimation.HasSequence("active")) - wsb.PlayCustomAnimation(hostBuilding, "active", () => wsb.CancelCustomAnimation(hostBuilding)); + foreach (var host in hostBuilding.TraitsImplementing()) + host.Rearming(hostBuilding, self); var sound = pool.Info.RearmSound; if (sound != null) diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index f7b5de4468..ca34ad9c36 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -453,6 +453,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/Render/WithRearmAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithRearmAnimation.cs new file mode 100644 index 0000000000..b478f3b52a --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Render/WithRearmAnimation.cs @@ -0,0 +1,57 @@ +#region Copyright & License Information +/* + * Copyright 2007-2016 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits.Render +{ + [Desc("Replaces the building animation when it rearms a unit.")] + public class WithRearmAnimationInfo : ITraitInfo, Requires + { + [Desc("Sequence name to use")] + [SequenceReference] public readonly string Sequence = "active"; + + public readonly bool PauseOnLowPower = false; + + public object Create(ActorInitializer init) { return new WithRearmAnimation(init.Self, this); } + } + + public class WithRearmAnimation : INotifyRearm, INotifyBuildComplete, INotifySold + { + readonly WithRearmAnimationInfo info; + readonly WithSpriteBody spriteBody; + bool buildComplete; + + public WithRearmAnimation(Actor self, WithRearmAnimationInfo info) + { + this.info = info; + spriteBody = self.TraitOrDefault(); + } + + void INotifyRearm.Rearming(Actor self, Actor target) + { + if (buildComplete && spriteBody != null && !(info.PauseOnLowPower && self.IsDisabled())) + spriteBody.PlayCustomAnimation(self, info.Sequence, () => spriteBody.CancelCustomAnimation(self)); + } + + public void BuildingComplete(Actor self) + { + buildComplete = true; + } + + public void Selling(Actor self) + { + buildComplete = false; + } + + public void Sold(Actor self) { } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 351a8f511a..bdacbedcaf 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -139,4 +139,7 @@ namespace OpenRA.Mods.Common.Traits { void ModifyActorPreviewInit(Actor self, TypeDictionary inits); } + + [RequireExplicitImplementation] + public interface INotifyRearm { void Rearming(Actor host, Actor other); } }