From dcb70d12e3dd891ca339051c3c7687d3693f24f4 Mon Sep 17 00:00:00 2001 From: Mustafa Alperen Seki Date: Sat, 24 Apr 2021 21:01:14 +0300 Subject: [PATCH] Make Harvester conditional. --- .../Activities/DeliverResources.cs | 3 +++ .../Activities/FindAndDeliverResources.cs | 2 +- .../Activities/HarvestResource.cs | 3 +++ .../Activities/HarvesterDockSequence.cs | 6 ++--- OpenRA.Mods.Common/Traits/Harvester.cs | 24 +++++++++++++++---- .../Logic/Ingame/ObserverStatsLogic.cs | 2 +- 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/DeliverResources.cs b/OpenRA.Mods.Common/Activities/DeliverResources.cs index 192b579012..4085f453b1 100644 --- a/OpenRA.Mods.Common/Activities/DeliverResources.cs +++ b/OpenRA.Mods.Common/Activities/DeliverResources.cs @@ -43,6 +43,9 @@ namespace OpenRA.Mods.Common.Activities public override bool Tick(Actor self) { + if (harv.IsTraitDisabled) + Cancel(self, true); + if (IsCanceling) return true; diff --git a/OpenRA.Mods.Common/Activities/FindAndDeliverResources.cs b/OpenRA.Mods.Common/Activities/FindAndDeliverResources.cs index 6c6b28678e..de427fcfdc 100644 --- a/OpenRA.Mods.Common/Activities/FindAndDeliverResources.cs +++ b/OpenRA.Mods.Common/Activities/FindAndDeliverResources.cs @@ -78,7 +78,7 @@ namespace OpenRA.Mods.Common.Activities public override bool Tick(Actor self) { - if (IsCanceling) + if (IsCanceling || harv.IsTraitDisabled) return true; if (NextActivity != null) diff --git a/OpenRA.Mods.Common/Activities/HarvestResource.cs b/OpenRA.Mods.Common/Activities/HarvestResource.cs index 8c7b35979d..4cb622e429 100644 --- a/OpenRA.Mods.Common/Activities/HarvestResource.cs +++ b/OpenRA.Mods.Common/Activities/HarvestResource.cs @@ -53,6 +53,9 @@ namespace OpenRA.Mods.Common.Activities public override bool Tick(Actor self) { + if (harv.IsTraitDisabled) + Cancel(self, true); + if (IsCanceling || harv.IsFull) return true; diff --git a/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs index 4be4fdbb1d..fbf57459a5 100644 --- a/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs @@ -59,7 +59,7 @@ namespace OpenRA.Mods.Common.Activities return false; case DockingState.Drag: - if (IsCanceling || !Refinery.IsInWorld || Refinery.IsDead) + if (IsCanceling || !Refinery.IsInWorld || Refinery.IsDead || Harv.IsTraitDisabled) return true; dockingState = DockingState.Dock; @@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Activities return false; case DockingState.Dock: - if (!IsCanceling && Refinery.IsInWorld && !Refinery.IsDead) + if (!IsCanceling && Refinery.IsInWorld && !Refinery.IsDead && !Harv.IsTraitDisabled) OnStateDock(self); else dockingState = DockingState.Undock; @@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Activities return false; case DockingState.Loop: - if (IsCanceling || !Refinery.IsInWorld || Refinery.IsDead || Harv.TickUnload(self, Refinery)) + if (IsCanceling || !Refinery.IsInWorld || Refinery.IsDead || Harv.IsTraitDisabled || Harv.TickUnload(self, Refinery)) dockingState = DockingState.Undock; return false; diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index 3cb448e521..ae01dfe09d 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -22,7 +22,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class HarvesterInfo : TraitInfo, Requires + public class HarvesterInfo : ConditionalTraitInfo, Requires { public readonly HashSet DeliveryBuildings = new HashSet(); @@ -106,10 +106,9 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new Harvester(init.Self, this); } } - public class Harvester : IIssueOrder, IResolveOrder, IOrderVoice, + public class Harvester : ConditionalTrait, IIssueOrder, IResolveOrder, IOrderVoice, ISpeedModifier, ISync, INotifyCreated { - public readonly HarvesterInfo Info; public readonly IReadOnlyDictionary Contents; readonly Mobile mobile; @@ -140,21 +139,23 @@ namespace OpenRA.Mods.Common.Traits } public Harvester(Actor self, HarvesterInfo info) + : base(info) { - Info = info; Contents = new ReadOnlyDictionary(contents); mobile = self.Trait(); resourceLayer = self.World.WorldActor.Trait(); claimLayer = self.World.WorldActor.Trait(); } - void INotifyCreated.Created(Actor self) + protected override void Created(Actor self) { UpdateCondition(self); // Note: This is queued in a FrameEndTask because otherwise the activity is dropped/overridden while moving out of a factory. if (Info.SearchOnCreation) self.World.AddFrameEndTask(w => self.QueueActivity(new FindAndDeliverResources(self))); + + base.Created(self); } public void LinkProc(Actor self, Actor proc) @@ -294,6 +295,9 @@ namespace OpenRA.Mods.Common.Traits { get { + if (IsTraitDisabled) + yield break; + yield return new EnterAlliedActorTargeter( "Deliver", 5, @@ -370,6 +374,16 @@ namespace OpenRA.Mods.Common.Traits return 100 - (100 - Info.FullyLoadedSpeed) * contents.Values.Sum() / Info.Capacity; } + protected override void TraitDisabled(Actor self) + { + LastLinkedProc = null; + LinkedProc = null; + contents.Clear(); + + if (conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + } + class HarvestOrderTargeter : IOrderTargeter { public string OrderID => "Harvest"; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index 49b9e49be9..1af074031a 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -407,7 +407,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic template.Get("ASSETS").GetText = () => assetsText.Update(stats.AssetsValue); var harvesters = template.Get("HARVESTERS"); - harvesters.GetText = () => world.ActorsHavingTrait().Count(a => a.Owner == player && !a.IsDead).ToString(); + harvesters.GetText = () => world.ActorsWithTrait().Count(a => a.Actor.Owner == player && !a.Actor.IsDead && !a.Trait.IsTraitDisabled).ToString(); var derricks = template.GetOrNull("DERRICKS"); if (derricks != null)