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); } } diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index a7f1c124c1..486228374a 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -358,6 +358,15 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // Add a warning to add WithRearmAnimation to actors that might need it. + // Update rule added during prep-1609 stable period, date needs fixing after release. + if (engineVersion < 20160918 && depth == 2) + { + if (node.Key == "RearmBuildings") + foreach (var host in node.Value.Value.Split(',')) + Console.WriteLine("Actor type `{0}` is denoted as a RearmBuilding. Consider adding the `WithRearmAnimation` trait to it.".F(host)); + } + UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); } diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 100da51d67..9231d4951d 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -1116,6 +1116,7 @@ HPAD: ZOffset: 256 UpgradeTypes: primary UpgradeMinEnabledLevel: 1 + WithRearmAnimation: AFLD: Inherits: ^Building @@ -1232,6 +1233,7 @@ AFLD: ZOffset: 256 UpgradeTypes: primary UpgradeMinEnabledLevel: 1 + WithRearmAnimation: POWR: Inherits: ^Building @@ -1573,6 +1575,7 @@ FIX: FinishRepairingNotification: UnitRepaired PlayerExperience: 15 WithRepairAnimation: + WithRearmAnimation: Power: Amount: -30 ProvidesPrerequisite@buildingname: