diff --git a/OpenRA.Game/Traits/Render/RenderSimple.cs b/OpenRA.Game/Traits/Render/RenderSimple.cs index b9f1ed46bf..34ec41c879 100755 --- a/OpenRA.Game/Traits/Render/RenderSimple.cs +++ b/OpenRA.Game/Traits/Render/RenderSimple.cs @@ -33,7 +33,7 @@ namespace OpenRA.Traits } } - public class RenderSimple : IRender, IAutoSelectionSize, ITick + public class RenderSimple : IRender, IAutoSelectionSize, ITick, INotifyOwnerChanged { public Dictionary anims = new Dictionary(); @@ -56,7 +56,6 @@ namespace OpenRA.Traits return Info.Image ?? actor.Name; } - string cachedImage = null; public string GetImage(Actor self) { if (cachedImage != null) @@ -66,6 +65,9 @@ namespace OpenRA.Traits } RenderSimpleInfo Info; + string cachedImage = null; + bool initializePalette = true; + protected PaletteReference palette; public RenderSimple(Actor self, Func baseFacing) { @@ -78,17 +80,26 @@ namespace OpenRA.Traits anim.PlayRepeating("idle"); } - protected PaletteReference Palette(Player p, WorldRenderer wr) + protected virtual string PaletteName(Actor self) { - return wr.Palette(Info.Palette ?? Info.PlayerPalette + p.InternalName); + return Info.Palette ?? Info.PlayerPalette + self.Owner.InternalName; } + protected void UpdatePalette() { initializePalette = true; } + public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { UpdatePalette(); } + public virtual IEnumerable Render(Actor self, WorldRenderer wr) { + if (initializePalette) + { + palette = wr.Palette(PaletteName(self)); + initializePalette = false; + } + foreach (var a in anims.Values) if (a.DisableFunc == null || !a.DisableFunc()) { - Renderable ret = a.Image(self, Palette(self.Owner, wr)); + Renderable ret = a.Image(self, palette); if (Info.Scale != 1f) ret = ret.WithScale(Info.Scale).WithPos(ret.Pos + 0.5f * ret.Sprite.size * (1 - Info.Scale)); yield return ret; diff --git a/OpenRA.Mods.RA/Missions/Allies04Script.cs b/OpenRA.Mods.RA/Missions/Allies04Script.cs index 2b89f9194d..a667170785 100644 --- a/OpenRA.Mods.RA/Missions/Allies04Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies04Script.cs @@ -496,19 +496,21 @@ namespace OpenRA.Mods.RA.Missions public override object Create(ActorInitializer init) { return new Allies04RenderHijacked(init.self, this); } } - class Allies04RenderHijacked : RenderUnit, IRenderModifier + class Allies04RenderHijacked : RenderUnit { Allies04Hijackable hijackable; + Allies04RenderHijackedInfo info; public Allies04RenderHijacked(Actor self, Allies04RenderHijackedInfo info) : base(self) { + this.info = info; hijackable = self.Trait(); } - public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + protected override string PaletteName(Actor self) { - return r.Select(a => a.WithPalette(Palette(hijackable.OldOwner, wr))); + return info.Palette ?? info.PlayerPalette + hijackable.OldOwner.InternalName; } } diff --git a/OpenRA.Mods.RA/Render/RenderSpy.cs b/OpenRA.Mods.RA/Render/RenderSpy.cs index 2d5d6dab23..966401cd68 100755 --- a/OpenRA.Mods.RA/Render/RenderSpy.cs +++ b/OpenRA.Mods.RA/Render/RenderSpy.cs @@ -21,20 +21,23 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderSpy(init.self, this); } } - class RenderSpy : RenderInfantryProne, IRenderModifier + class RenderSpy : RenderInfantryProne { + RenderSpyInfo info; string disguisedAsSprite; Spy spy; public RenderSpy(Actor self, RenderSpyInfo info) : base(self, info) { + this.info = info; spy = self.Trait(); disguisedAsSprite = spy.disguisedAsSprite; } - public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) + protected override string PaletteName(Actor self) { - return spy.disguisedAsPlayer != null ? r.Select(a => a.WithPalette(Palette(spy.disguisedAsPlayer, wr))) : r; + var player = spy.disguisedAsPlayer != null ? spy.disguisedAsPlayer : self.Owner; + return info.Palette ?? info.PlayerPalette + player.InternalName; } public override void Tick(Actor self) @@ -46,6 +49,7 @@ namespace OpenRA.Mods.RA.Render anim.ChangeImage(disguisedAsSprite, "stand"); else anim.ChangeImage(GetImage(self), "stand"); + UpdatePalette(); } base.Tick(self); }