Use INotifyOwnerChanged for updating internal references.

This commit is contained in:
Paul Chote
2014-10-13 19:43:11 +13:00
parent 8508fc5155
commit a08a3a3869
12 changed files with 45 additions and 33 deletions

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA
public object Create(ActorInitializer init) { return new Cargo(init, this); } 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; public readonly CargoInfo Info;
readonly Actor self; 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) if (cargo == null)
return; return;

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Infiltration
public object Create(ActorInitializer init) { return new InfiltrateForPowerOutage(init.self, this); } public object Create(ActorInitializer init) { return new InfiltrateForPowerOutage(init.self, this); }
} }
class InfiltrateForPowerOutage : INotifyCapture, INotifyInfiltrated class InfiltrateForPowerOutage : INotifyOwnerChanged, INotifyInfiltrated
{ {
readonly InfiltrateForPowerOutageInfo info; readonly InfiltrateForPowerOutageInfo info;
PowerManager playerPower; PowerManager playerPower;
@@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Infiltration
playerPower.TriggerPowerOutage(info.Duration); 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<PowerManager>(); playerPower = self.Owner.PlayerActor.Trait<PowerManager>();
} }

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA
public virtual object Create(ActorInitializer init) { return new OreRefinery(init.self, this); } 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 Actor self;
readonly OreRefineryInfo Info; readonly OreRefineryInfo Info;
@@ -117,18 +117,25 @@ namespace OpenRA.Mods.RA
harv.QueueActivity(new CallFunc(() => harv.Trait<Harvester>().ContinueHarvesting(harv))); harv.QueueActivity(new CallFunc(() => harv.Trait<Harvester>().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<PlayerResources>();
}
public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner)
{ {
// Steal any docked harv too // Steal any docked harv too
if (dockedHarv != null) if (dockedHarv != null)
{
dockedHarv.ChangeOwner(newOwner); dockedHarv.ChangeOwner(newOwner);
// Unlink any non-docked harvs // Relink to this refinery
foreach (var harv in GetLinkedHarvesters()) dockedHarv.Trait<Harvester>().LinkProc(dockedHarv, self);
if (harv.Actor.Owner == oldOwner) }
harv.Trait.UnlinkProc(harv.Actor, self);
PlayerResources = newOwner.PlayerActor.Trait<PlayerResources>();
} }
public void Selling(Actor self) { CancelDock(self); } public void Selling(Actor self) { CancelDock(self); }

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Power
public object Create(ActorInitializer init) { return new AffectedByPowerOutage(init.self); } 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; PowerManager playerPower;
@@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Power
get { return playerPower.PowerOutageRemainingTicks > 0; } 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<PowerManager>(); playerPower = newOwner.PlayerActor.Trait<PowerManager>();
} }

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Power
public object Create(ActorInitializer init) { return new Power(init.self, this); } public object Create(ActorInitializer init) { return new Power(init.self, this); }
} }
public class Power : INotifyCapture public class Power : INotifyOwnerChanged
{ {
readonly PowerInfo info; readonly PowerInfo info;
readonly Lazy<IPowerModifier[]> powerModifiers; readonly Lazy<IPowerModifier[]> powerModifiers;
@@ -41,7 +41,7 @@ namespace OpenRA.Mods.RA.Power
powerModifiers = Exts.Lazy(() => self.TraitsImplementing<IPowerModifier>().ToArray()); powerModifiers = Exts.Lazy(() => self.TraitsImplementing<IPowerModifier>().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<PowerManager>(); PlayerPower = newOwner.PlayerActor.Trait<PowerManager>();
} }

View File

@@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA.Power
public object Create(ActorInitializer init) { return new RequiresPower(init.self); } public object Create(ActorInitializer init) { return new RequiresPower(init.self); }
} }
class RequiresPower : IDisable, INotifyCapture class RequiresPower : IDisable, INotifyOwnerChanged
{ {
PowerManager playerPower; PowerManager playerPower;
@@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA.Power
get { return playerPower.PowerProvided < playerPower.PowerDrained; } 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<PowerManager>(); playerPower = newOwner.PlayerActor.Trait<PowerManager>();
} }

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Render
} }
} }
class RenderBuildingSilo : RenderBuilding, INotifyBuildComplete, INotifyCapture class RenderBuildingSilo : RenderBuilding, INotifyBuildComplete, INotifyOwnerChanged
{ {
PlayerResources playerResources; PlayerResources playerResources;
@@ -49,9 +49,10 @@ namespace OpenRA.Mods.RA.Render
: 0); : 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<PlayerResources>(); playerResources = newOwner.PlayerActor.Trait<PlayerResources>();
base.OnOwnerChanged(self, oldOwner, newOwner);
} }
} }
} }

View File

@@ -126,7 +126,7 @@ namespace OpenRA.Mods.RA.Render
anim.OwnerChanged(); 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 void OnEffectiveOwnerChanged(Actor self, Player oldEffectiveOwner, Player newEffectiveOwner) { UpdatePalette(); }
public virtual IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) public virtual IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Render
public object Create(ActorInitializer init) { return new WithResources(init.self, this); } 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; WithResourcesInfo info;
Animation anim; Animation anim;
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA.Render
anim.ReplaceAnim(rs.NormalizeSequence(self, info.Sequence)); 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<PlayerResources>(); playerResources = newOwner.PlayerActor.Trait<PlayerResources>();
} }

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA
[Desc("Reserve landing places for aircraft.")] [Desc("Reserve landing places for aircraft.")]
class ReservableInfo : TraitInfo<Reservable> { } class ReservableInfo : TraitInfo<Reservable> { }
public class Reservable : ITick, INotifyKilled, INotifyCapture, INotifySold public class Reservable : ITick, INotifyKilled, INotifyOwnerChanged, INotifySold
{ {
Actor reservedFor; Actor reservedFor;
Aircraft reservedForAircraft; Aircraft reservedForAircraft;
@@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA
reservedForAircraft.UnReserve(); 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) if (reservedForAircraft != null)
reservedForAircraft.UnReserve(); reservedForAircraft.UnReserve();

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA
public object Create(ActorInitializer init) { return new StoresResources(init.self, this); } 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; readonly StoresResourcesInfo Info;
@@ -38,12 +38,16 @@ namespace OpenRA.Mods.RA
public int Capacity { get { return Info.Capacity; } } public int Capacity { get { return Info.Capacity; } }
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
{
Player = newOwner.PlayerActor.Trait<PlayerResources>();
}
public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner) public void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner)
{ {
var resources = Stored; var resources = Stored;
Player.TakeResources(resources); oldOwner.PlayerActor.Trait<PlayerResources>().TakeResources(resources);
Player = newOwner.PlayerActor.Trait<PlayerResources>(); newOwner.PlayerActor.Trait<PlayerResources>().GiveResources(resources);
Player.GiveResources(resources);
} }
public void Killed(Actor self, AttackInfo e) public void Killed(Actor self, AttackInfo e)

View File

@@ -88,7 +88,7 @@ namespace OpenRA.Mods.RA
public override object Create(ActorInitializer init) { return new GpsPower(init.self, this); } 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; GpsWatcher owner;
@@ -133,10 +133,10 @@ namespace OpenRA.Mods.RA
owner.RefreshGps(self); 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); RemoveGps(self);
owner = captor.Owner.PlayerActor.Trait<GpsWatcher>(); owner = newOwner.PlayerActor.Trait<GpsWatcher>();
owner.GpsAdd(self); owner.GpsAdd(self);
} }
} }