From 5ed8113d8e4f725398526e539962f157d66f5631 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 16 Jun 2010 19:47:15 +1200 Subject: [PATCH] Steal docked harv on proc capture (needs multiplayer testing); framework for canceling dock on proc death/sell (needs further activity changes) --- OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs | 29 ++++++++++++++++++- OpenRA.Mods.RA/OreRefineryDockAction.cs | 22 ++++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs b/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs index 59604bbbee..24e02857a9 100644 --- a/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs +++ b/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.Cnc { class TiberiumRefineryDockActionInfo : TraitInfo {} - class TiberiumRefineryDockAction : IAcceptOreDockAction, ITraitPrerequisite + class TiberiumRefineryDockAction : IAcceptOreDockAction, INotifyDamage, INotifySold, INotifyCapture, ITraitPrerequisite { Actor dockedHarv = null; public void OnDock(Actor self, Actor harv, DeliverResources dockOrder) @@ -64,5 +64,32 @@ namespace OpenRA.Mods.Cnc }) ); } + void CancelDock(Actor self, Actor harv) + { + // Todo: Cancel the above activities that are non-cancelable + } + + public void Selling (Actor self) { CancelDock(self, dockedHarv); } + public void Sold (Actor self) {} + + public void Damaged (Actor self, AttackInfo e) + { + if (self.IsDead) + CancelDock(self, dockedHarv); + } + + public void OnCapture (Actor self, Actor captor) + { + if (dockedHarv == null) + return; + + dockedHarv.World.AddFrameEndTask(w => + { + // momentarily remove from world so the ownership queries don't get confused + w.Remove(dockedHarv); + dockedHarv.Owner = captor.Owner; + w.Add(dockedHarv); + }); + } } } diff --git a/OpenRA.Mods.RA/OreRefineryDockAction.cs b/OpenRA.Mods.RA/OreRefineryDockAction.cs index 1e10296f1c..9e5c9d54a7 100644 --- a/OpenRA.Mods.RA/OreRefineryDockAction.cs +++ b/OpenRA.Mods.RA/OreRefineryDockAction.cs @@ -29,8 +29,10 @@ namespace OpenRA.Mods.RA { class OreRefineryDockActionInfo : TraitInfo {} - class OreRefineryDockAction : IAcceptOreDockAction + class OreRefineryDockAction : IAcceptOreDockAction, INotifyCapture { + + Actor dockedHarv = null; public void OnDock(Actor self, Actor harv, DeliverResources dockOrder) { var unit = harv.traits.Get(); @@ -41,17 +43,33 @@ namespace OpenRA.Mods.RA harv.QueueActivity (new CallFunc (() => { + dockedHarv = harv; var renderUnit = harv.traits.Get (); if (renderUnit.anim.CurrentSequence.Name != "empty") renderUnit.PlayCustomAnimation (harv, "empty", () => { harvester.Deliver(harv, self); + harv.QueueActivity( new CallFunc( () => dockedHarv = null, false ) ); + if (harvester.LastHarvestedCell != int2.Zero) harv.QueueActivity( new Move(harvester.LastHarvestedCell, 5) ); - harv.QueueActivity( new Harvest() ); }); })); } + + public void OnCapture (Actor self, Actor captor) + { + if (dockedHarv == null) + return; + + dockedHarv.World.AddFrameEndTask(w => + { + // momentarily remove from world so the ownership queries don't get confused + w.Remove(dockedHarv); + dockedHarv.Owner = captor.Owner; + w.Add(dockedHarv); + }); + } } }