diff --git a/OpenRA.Mods.RA/Cargo.cs b/OpenRA.Mods.RA/Cargo.cs index 194c199e4e..eadf368a71 100644 --- a/OpenRA.Mods.RA/Cargo.cs +++ b/OpenRA.Mods.RA/Cargo.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new Cargo(init, this); } } - public class Cargo : IPips, IIssueOrder, IResolveOrder, IOrderVoice, INotifyCreated, INotifyKilled, INotifyCapture, INotifyAddedToWorld, ITick, INotifySold, IDisableMove + public class Cargo : IPips, IIssueOrder, IResolveOrder, IOrderVoice, INotifyCreated, INotifyKilled, INotifyOwnerChanged, INotifyAddedToWorld, ITick, INotifySold, IDisableMove { public readonly CargoInfo Info; readonly Actor self; @@ -263,7 +263,7 @@ namespace OpenRA.Mods.RA }); } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { if (cargo == null) return; diff --git a/OpenRA.Mods.RA/Infiltration/InfiltrateForPowerOutage.cs b/OpenRA.Mods.RA/Infiltration/InfiltrateForPowerOutage.cs index 6ec3dc40cd..2103ab1a09 100644 --- a/OpenRA.Mods.RA/Infiltration/InfiltrateForPowerOutage.cs +++ b/OpenRA.Mods.RA/Infiltration/InfiltrateForPowerOutage.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Infiltration public object Create(ActorInitializer init) { return new InfiltrateForPowerOutage(init.self, this); } } - class InfiltrateForPowerOutage : INotifyCapture, INotifyInfiltrated + class InfiltrateForPowerOutage : INotifyOwnerChanged, INotifyInfiltrated { readonly InfiltrateForPowerOutageInfo info; PowerManager playerPower; @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Infiltration playerPower.TriggerPowerOutage(info.Duration); } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { playerPower = self.Owner.PlayerActor.Trait(); } diff --git a/OpenRA.Mods.RA/OreRefinery.cs b/OpenRA.Mods.RA/OreRefinery.cs index 378c0e68d0..89c5ab0688 100644 --- a/OpenRA.Mods.RA/OreRefinery.cs +++ b/OpenRA.Mods.RA/OreRefinery.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA public virtual object Create(ActorInitializer init) { return new OreRefinery(init.self, this); } } - public class OreRefinery : ITick, IAcceptOre, INotifyKilled, INotifySold, INotifyCapture, IExplodeModifier, ISync + public class OreRefinery : ITick, IAcceptOre, INotifyKilled, INotifySold, INotifyCapture, INotifyOwnerChanged, IExplodeModifier, ISync { readonly Actor self; readonly OreRefineryInfo Info; @@ -117,18 +117,25 @@ namespace OpenRA.Mods.RA harv.QueueActivity(new CallFunc(() => harv.Trait().ContinueHarvesting(harv))); } + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + // Unlink any harvesters + foreach (var harv in GetLinkedHarvesters()) + harv.Trait.UnlinkProc(harv.Actor, self); + + PlayerResources = newOwner.PlayerActor.Trait(); + } + public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) { // Steal any docked harv too if (dockedHarv != null) + { dockedHarv.ChangeOwner(newOwner); - // Unlink any non-docked harvs - foreach (var harv in GetLinkedHarvesters()) - if (harv.Actor.Owner == oldOwner) - harv.Trait.UnlinkProc(harv.Actor, self); - - PlayerResources = newOwner.PlayerActor.Trait(); + // Relink to this refinery + dockedHarv.Trait().LinkProc(dockedHarv, self); + } } public void Selling(Actor self) { CancelDock(self); } diff --git a/OpenRA.Mods.RA/Power/AffectedByPowerOutage.cs b/OpenRA.Mods.RA/Power/AffectedByPowerOutage.cs index 4e733fccb4..4abbbcfd73 100644 --- a/OpenRA.Mods.RA/Power/AffectedByPowerOutage.cs +++ b/OpenRA.Mods.RA/Power/AffectedByPowerOutage.cs @@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Power public object Create(ActorInitializer init) { return new AffectedByPowerOutage(init.self); } } - public class AffectedByPowerOutage : INotifyCapture, ISelectionBar, IPowerModifier, IDisable + public class AffectedByPowerOutage : INotifyOwnerChanged, ISelectionBar, IPowerModifier, IDisable { PowerManager playerPower; @@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Power get { return playerPower.PowerOutageRemainingTicks > 0; } } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { playerPower = newOwner.PlayerActor.Trait(); } diff --git a/OpenRA.Mods.RA/Power/Power.cs b/OpenRA.Mods.RA/Power/Power.cs index 946988874e..5c3628c4f9 100644 --- a/OpenRA.Mods.RA/Power/Power.cs +++ b/OpenRA.Mods.RA/Power/Power.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Power public object Create(ActorInitializer init) { return new Power(init.self, this); } } - public class Power : INotifyCapture + public class Power : INotifyOwnerChanged { readonly PowerInfo info; readonly Lazy powerModifiers; @@ -41,7 +41,7 @@ namespace OpenRA.Mods.RA.Power powerModifiers = Exts.Lazy(() => self.TraitsImplementing().ToArray()); } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { PlayerPower = newOwner.PlayerActor.Trait(); } diff --git a/OpenRA.Mods.RA/Power/RequiresPower.cs b/OpenRA.Mods.RA/Power/RequiresPower.cs index 0dfb71cb9b..bdf521b528 100644 --- a/OpenRA.Mods.RA/Power/RequiresPower.cs +++ b/OpenRA.Mods.RA/Power/RequiresPower.cs @@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA.Power public object Create(ActorInitializer init) { return new RequiresPower(init.self); } } - class RequiresPower : IDisable, INotifyCapture + class RequiresPower : IDisable, INotifyOwnerChanged { PowerManager playerPower; @@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA.Power get { return playerPower.PowerProvided < playerPower.PowerDrained; } } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { playerPower = newOwner.PlayerActor.Trait(); } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs b/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs index d2382ddd3e..9712b970ba 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Render } } - class RenderBuildingSilo : RenderBuilding, INotifyBuildComplete, INotifyCapture + class RenderBuildingSilo : RenderBuilding, INotifyBuildComplete, INotifyOwnerChanged { PlayerResources playerResources; @@ -49,9 +49,10 @@ namespace OpenRA.Mods.RA.Render : 0); } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public override void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { playerResources = newOwner.PlayerActor.Trait(); + base.OnOwnerChanged(self, oldOwner, newOwner); } } } diff --git a/OpenRA.Mods.RA/Render/RenderSprites.cs b/OpenRA.Mods.RA/Render/RenderSprites.cs index 6cc3cd9348..cb0c401a1e 100644 --- a/OpenRA.Mods.RA/Render/RenderSprites.cs +++ b/OpenRA.Mods.RA/Render/RenderSprites.cs @@ -126,7 +126,7 @@ namespace OpenRA.Mods.RA.Render anim.OwnerChanged(); } - public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UpdatePalette(); } + public virtual void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UpdatePalette(); } public void OnEffectiveOwnerChanged(Actor self, Player oldEffectiveOwner, Player newEffectiveOwner) { UpdatePalette(); } public virtual IEnumerable Render(Actor self, WorldRenderer wr) diff --git a/OpenRA.Mods.RA/Render/WithResources.cs b/OpenRA.Mods.RA/Render/WithResources.cs index 39cbf37f8d..10d5a3d088 100644 --- a/OpenRA.Mods.RA/Render/WithResources.cs +++ b/OpenRA.Mods.RA/Render/WithResources.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Render public object Create(ActorInitializer init) { return new WithResources(init.self, this); } } - class WithResources : INotifyBuildComplete, INotifySold, INotifyCapture, INotifyDamageStateChanged + class WithResources : INotifyBuildComplete, INotifySold, INotifyOwnerChanged, INotifyDamageStateChanged { WithResourcesInfo info; Animation anim; @@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA.Render anim.ReplaceAnim(rs.NormalizeSequence(self, info.Sequence)); } - public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { playerResources = newOwner.PlayerActor.Trait(); } diff --git a/OpenRA.Mods.RA/Reservable.cs b/OpenRA.Mods.RA/Reservable.cs index b9c9e2a228..386c1d768e 100755 --- a/OpenRA.Mods.RA/Reservable.cs +++ b/OpenRA.Mods.RA/Reservable.cs @@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA [Desc("Reserve landing places for aircraft.")] class ReservableInfo : TraitInfo { } - public class Reservable : ITick, INotifyKilled, INotifyCapture, INotifySold + public class Reservable : ITick, INotifyKilled, INotifyOwnerChanged, INotifySold { Actor reservedFor; Aircraft reservedForAircraft; @@ -60,15 +60,15 @@ namespace OpenRA.Mods.RA reservedForAircraft.UnReserve(); } - public void OnCapture (Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { if (reservedForAircraft != null) reservedForAircraft.UnReserve(); } - public void Selling (Actor self) { Sold(self); } + public void Selling(Actor self) { Sold(self); } - public void Sold (Actor self) + public void Sold(Actor self) { if (reservedForAircraft != null) reservedForAircraft.UnReserve(); diff --git a/OpenRA.Mods.RA/StoresResources.cs b/OpenRA.Mods.RA/StoresResources.cs index e16e24e7ed..774f667ad2 100644 --- a/OpenRA.Mods.RA/StoresResources.cs +++ b/OpenRA.Mods.RA/StoresResources.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new StoresResources(init.self, this); } } - class StoresResources : IPips, INotifyCapture, INotifyKilled, IExplodeModifier, IStoreResources, ISync + class StoresResources : IPips, INotifyOwnerChanged, INotifyCapture, INotifyKilled, IExplodeModifier, IStoreResources, ISync { readonly StoresResourcesInfo Info; @@ -38,12 +38,16 @@ namespace OpenRA.Mods.RA public int Capacity { get { return Info.Capacity; } } + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + Player = newOwner.PlayerActor.Trait(); + } + public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) { var resources = Stored; - Player.TakeResources(resources); - Player = newOwner.PlayerActor.Trait(); - Player.GiveResources(resources); + oldOwner.PlayerActor.Trait().TakeResources(resources); + newOwner.PlayerActor.Trait().GiveResources(resources); } public void Killed(Actor self, AttackInfo e) diff --git a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs index 231851e421..99153d7157 100755 --- a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.RA public override object Create(ActorInitializer init) { return new GpsPower(init.self, this); } } - class GpsPower : SupportPower, INotifyKilled, INotifyStanceChanged, INotifySold, INotifyCapture + class GpsPower : SupportPower, INotifyKilled, INotifyStanceChanged, INotifySold, INotifyOwnerChanged { GpsWatcher owner; @@ -133,10 +133,10 @@ namespace OpenRA.Mods.RA owner.RefreshGps(self); } - public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { RemoveGps(self); - owner = captor.Owner.PlayerActor.Trait(); + owner = newOwner.PlayerActor.Trait(); owner.GpsAdd(self); } }