diff --git a/OpenRA.Game/Traits/Render/RenderSprites.cs b/OpenRA.Game/Traits/Render/RenderSprites.cs index 741f19b1aa..dc08b42200 100755 --- a/OpenRA.Game/Traits/Render/RenderSprites.cs +++ b/OpenRA.Game/Traits/Render/RenderSprites.cs @@ -32,7 +32,7 @@ namespace OpenRA.Traits public virtual object Create(ActorInitializer init) { return new RenderSprites(init.self); } } - public class RenderSprites : IRender, ITick, INotifyOwnerChanged + public class RenderSprites : IRender, ITick, INotifyOwnerChanged, INotifyEffectiveOwnerChanged { class AnimationWrapper { @@ -78,12 +78,12 @@ namespace OpenRA.Traits return () => facing.Facing; } - RenderSpritesInfo Info; + readonly RenderSpritesInfo info; string cachedImage = null; public RenderSprites(Actor self) { - Info = self.Info.Traits.Get(); + info = self.Info.Traits.Get(); } public static string GetImage(ActorInfo actor) @@ -100,11 +100,6 @@ namespace OpenRA.Traits return cachedImage = GetImage(self.Info); } - protected virtual string PaletteName(Actor self) - { - return Info.Palette ?? Info.PlayerPalette + self.Owner.InternalName; - } - protected void UpdatePalette() { foreach (var anim in anims.Values) @@ -112,6 +107,7 @@ namespace OpenRA.Traits } public 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) { @@ -121,9 +117,12 @@ namespace OpenRA.Traits continue; if (a.PaletteReference == null) - a.CachePalette(wr, self.Owner); + { + var owner = self.EffectiveOwner != null && self.EffectiveOwner.Disguised ? self.EffectiveOwner.Owner : self.Owner; + a.CachePalette(wr, owner); + } - foreach (var r in a.Animation.Render(self, wr, a.PaletteReference, Info.Scale)) + foreach (var r in a.Animation.Render(self, wr, a.PaletteReference, info.Scale)) yield return r; } } @@ -139,8 +138,8 @@ namespace OpenRA.Traits // Use defaults if (palette == null) { - palette = Info.Palette ?? Info.PlayerPalette; - isPlayerPalette = Info.Palette == null; + palette = info.Palette ?? info.PlayerPalette; + isPlayerPalette = info.Palette == null; } anims.Add(key, new AnimationWrapper(anim, palette, isPlayerPalette)); @@ -173,7 +172,7 @@ namespace OpenRA.Traits { return anims.Values.Where(b => b.IsVisible && b.Animation.Animation.CurrentSequence != null) - .Select(a => (a.Animation.Animation.Image.size*Info.Scale).ToInt2()) + .Select(a => (a.Animation.Animation.Image.size*info.Scale).ToInt2()) .FirstOrDefault(); } } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 57a565a690..cfa990b7e0 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -77,6 +77,7 @@ namespace OpenRA.Traits public interface INotifyProduction { void UnitProduced(Actor self, Actor other, CPos exit); } public interface INotifyDelivery { void IncomingDelivery(Actor self); void Delivered(Actor self); } public interface INotifyOwnerChanged { void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner); } + public interface INotifyEffectiveOwnerChanged { void OnEffectiveOwnerChanged(Actor self, Player oldEffectiveOwner, Player newEffectiveOwner); } public interface INotifyCapture { void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner); } public interface INotifyHarvest { void Harvested(Actor self, ResourceType resource); } public interface ISeedableResource { void Seed(Actor self); } diff --git a/OpenRA.Mods.RA/Disguise.cs b/OpenRA.Mods.RA/Disguise.cs index b442930a5d..79e4d91654 100644 --- a/OpenRA.Mods.RA/Disguise.cs +++ b/OpenRA.Mods.RA/Disguise.cs @@ -78,7 +78,7 @@ namespace OpenRA.Mods.RA } } - public Order IssueOrder( Actor self, IOrderTargeter order, Target target, bool queued ) + public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "Disguise") return new Order(order.OrderID, self, queued) { TargetActor = target.Actor }; @@ -90,12 +90,8 @@ namespace OpenRA.Mods.RA { if (order.OrderString == "Disguise") { - var target = order.TargetActor == self ? null : order.TargetActor; - - if (target != null && target.IsInWorld) - DisguiseAs(target); - else - DropDisguise(); + var target = order.TargetActor != self && order.TargetActor.IsInWorld ? order.TargetActor : null; + DisguiseAs(self, target); } } @@ -112,22 +108,29 @@ namespace OpenRA.Mods.RA return AsPlayer.Color.RGB; } - void DisguiseAs(Actor target) + void DisguiseAs(Actor self, Actor target) { - var tooltip = target.TraitsImplementing().FirstOrDefault(); - AsName = tooltip.Name(); - AsPlayer = tooltip.Owner(); - AsSprite = target.Trait().GetImage(target); + var oldEffectiveOwner = AsPlayer; + + if (target != null) + { + var tooltip = target.TraitsImplementing().FirstOrDefault(); + AsName = tooltip.Name(); + AsPlayer = tooltip.Owner(); + AsSprite = target.Trait().GetImage(target); + } + else + { + AsName = null; + AsPlayer = null; + AsSprite = null; + } + + foreach (var t in self.TraitsImplementing()) + t.OnEffectiveOwnerChanged(self, oldEffectiveOwner, AsPlayer); } - void DropDisguise() - { - AsName = null; - AsPlayer = null; - AsSprite = null; - } - - public void Attacking(Actor self, Target target, Armament a, Barrel barrel) { DropDisguise(); } + public void Attacking(Actor self, Target target, Armament a, Barrel barrel) { DisguiseAs(self, null); } } class IgnoresDisguiseInfo : TraitInfo {} diff --git a/OpenRA.Mods.RA/Render/RenderDisguise.cs b/OpenRA.Mods.RA/Render/RenderDisguise.cs index ed22c510fd..26277cf12e 100644 --- a/OpenRA.Mods.RA/Render/RenderDisguise.cs +++ b/OpenRA.Mods.RA/Render/RenderDisguise.cs @@ -8,9 +8,11 @@ */ #endregion +using OpenRA.Traits; + namespace OpenRA.Mods.RA.Render { - class RenderDisguiseInfo : RenderInfantryProneInfo + class RenderDisguiseInfo : RenderInfantryProneInfo, Requires { public override object Create(ActorInitializer init) { return new RenderDisguise(init.self, this); } } @@ -29,12 +31,6 @@ namespace OpenRA.Mods.RA.Render intendedSprite = disguise.AsSprite; } - protected override string PaletteName(Actor self) - { - var player = disguise.AsPlayer ?? self.Owner; - return info.Palette ?? info.PlayerPalette + player.InternalName; - } - public override void Tick(Actor self) { if (disguise.AsSprite != intendedSprite)