From ab8c1403a8ab81251e55815ac9d1ae8d5573e459 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 18 Sep 2016 13:16:30 +0200 Subject: [PATCH 1/3] Fix locking an airfield that is rearming aircraft while being sold --- OpenRA.Mods.Common/Activities/Rearm.cs | 5 +- OpenRA.Mods.Common/OpenRA.Mods.Common.csproj | 1 + .../Traits/Render/WithRearmAnimation.cs | 57 +++++++++++++++++++ OpenRA.Mods.Common/TraitsInterfaces.cs | 3 + 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 OpenRA.Mods.Common/Traits/Render/WithRearmAnimation.cs 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); } } From b598e31d4bc6259ed181c6f957688729cc5ce876 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 18 Sep 2016 13:47:39 +0200 Subject: [PATCH 2/3] Add WithRearmAnimation to buildings that need it --- mods/ra/rules/structures.yaml | 3 +++ 1 file changed, 3 insertions(+) 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: From 88a4f73bdcb930cb204c27b46be07d086689054c Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 18 Sep 2016 14:20:58 +0200 Subject: [PATCH 3/3] Add advisory upgrade rule for WithRearmAnimation --- OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs | 9 +++++++++ 1 file changed, 9 insertions(+) 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); }