From 17fec823488516f72e210b2b631ffa421f7d7070 Mon Sep 17 00:00:00 2001 From: pevers Date: Tue, 24 Feb 2015 22:17:39 +0100 Subject: [PATCH] fixed taking over sam/pillbox/etc. to stop firing fixed issue with powered down samsites more optimization very small optimization undo changes to powerdown samsite fixes refixed powered down sam sites removed debug line redid the fix in another approach by queueing a sell activity on the top of the queue. This was already present but didn't always work fixed line I removed prevented attack activity to be queued when actor is disabled another style fail of me reverse and queueactivity activities are now executed on top of the queue for a sell action --- OpenRA.Mods.Common/Traits/Attack/AttackBase.cs | 3 +++ OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs | 7 ++++++- OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs | 5 ++--- OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs | 4 ++-- OpenRA.Mods.Common/Traits/Sellable.cs | 4 ++-- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 6f53c583ad..6b792b78bb 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -164,6 +164,9 @@ namespace OpenRA.Mods.Common.Traits public void AttackTarget(Target target, bool queued, bool allowMove) { + if (self.IsDisabled()) + return; + if (!target.IsValidFor(self)) return; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index b2bd537606..1ab859ea67 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -20,7 +20,7 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new AttackFollow(init.Self, this); } } - public class AttackFollow : AttackBase, ITick, ISync + public class AttackFollow : AttackBase, ITick, INotifyOwnerChanged, ISync { public Target Target { get; protected set; } @@ -46,6 +46,11 @@ namespace OpenRA.Mods.Common.Traits Target = Target.Invalid; } + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + Target = Target.Invalid; + } + class AttackActivity : Activity { readonly AttackFollow attack; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs b/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs index 1157d39d2b..0badcb0b29 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs @@ -35,12 +35,11 @@ namespace OpenRA.Mods.Common.Traits if (!base.CanAttack(self, target)) return false; - var canAttack = false; foreach (var t in turrets) if (t.FaceTarget(self, target)) - canAttack = true; + return true; - return canAttack; + return false; } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs index d43f075418..c72a2c9c79 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithMakeAnimation.cs @@ -46,13 +46,13 @@ namespace OpenRA.Mods.Common.Traits } } - public void Reverse(Actor self, Activity activity) + public void Reverse(Actor self, Activity activity, bool queued = true) { renderBuilding.PlayCustomAnimBackwards(self, info.Sequence, () => { // avoids visual glitches as we wait for the actor to get destroyed renderBuilding.DefaultAnimation.PlayFetchIndex(info.Sequence, () => 0); - self.QueueActivity(activity); + self.QueueActivity(queued, activity); }); } } diff --git a/OpenRA.Mods.Common/Traits/Sellable.cs b/OpenRA.Mods.Common/Traits/Sellable.cs index 4f3aa47947..9bbfb3cc23 100644 --- a/OpenRA.Mods.Common/Traits/Sellable.cs +++ b/OpenRA.Mods.Common/Traits/Sellable.cs @@ -53,9 +53,9 @@ namespace OpenRA.Mods.Common.Traits var makeAnimation = self.TraitOrDefault(); if (makeAnimation != null) - makeAnimation.Reverse(self, new Sell()); + makeAnimation.Reverse(self, new Sell(), false); else - self.QueueActivity(new Sell()); + self.QueueActivity(false, new Sell()); } } }