diff --git a/OpenRA.Mods.Cnc/Traits/Disguise.cs b/OpenRA.Mods.Cnc/Traits/Disguise.cs index 4f243286f3..ec476a9f45 100644 --- a/OpenRA.Mods.Cnc/Traits/Disguise.cs +++ b/OpenRA.Mods.Cnc/Traits/Disguise.cs @@ -105,7 +105,6 @@ namespace OpenRA.Mods.Cnc.Traits { public ActorInfo AsActor { get; private set; } public Player AsPlayer { get; private set; } - public string AsSprite { get; private set; } public ITooltipInfo AsTooltipInfo { get; private set; } public bool Disguised { get { return AsPlayer != null; } } @@ -181,14 +180,12 @@ namespace OpenRA.Mods.Cnc.Traits var targetDisguise = target.TraitOrDefault(); if (targetDisguise != null && targetDisguise.Disguised) { - AsSprite = targetDisguise.AsSprite; AsPlayer = targetDisguise.AsPlayer; AsActor = targetDisguise.AsActor; AsTooltipInfo = targetDisguise.AsTooltipInfo; } else { - AsSprite = target.Trait().GetImage(target); var tooltip = target.TraitsImplementing().FirstOrDefault(); AsPlayer = tooltip.Owner; AsActor = target.Info; @@ -200,7 +197,6 @@ namespace OpenRA.Mods.Cnc.Traits AsTooltipInfo = null; AsPlayer = null; AsActor = self.Info; - AsSprite = null; } HandleDisguise(oldEffectiveActor, oldEffectiveOwner, oldDisguiseSetting); @@ -212,8 +208,6 @@ namespace OpenRA.Mods.Cnc.Traits var oldEffectiveOwner = AsPlayer; var oldDisguiseSetting = Disguised; - var renderSprites = actorInfo.TraitInfoOrDefault(); - AsSprite = renderSprites == null ? null : renderSprites.GetImage(actorInfo, self.World.Map.Rules.Sequences, newOwner.Faction.InternalName); AsPlayer = newOwner; AsActor = actorInfo; AsTooltipInfo = actorInfo.TraitInfos().FirstOrDefault(); diff --git a/OpenRA.Mods.Cnc/Traits/Render/WithDisguisingInfantryBody.cs b/OpenRA.Mods.Cnc/Traits/Render/WithDisguisingInfantryBody.cs index 10b77e5d9d..7e4385c49c 100644 --- a/OpenRA.Mods.Cnc/Traits/Render/WithDisguisingInfantryBody.cs +++ b/OpenRA.Mods.Cnc/Traits/Render/WithDisguisingInfantryBody.cs @@ -25,7 +25,9 @@ namespace OpenRA.Mods.Cnc.Traits.Render readonly WithDisguisingInfantryBodyInfo info; readonly Disguise disguise; readonly RenderSprites rs; - string intendedSprite; + ActorInfo disguiseActor; + Player disguisePlayer; + string disguiseImage; public WithDisguisingInfantryBody(ActorInitializer init, WithDisguisingInfantryBodyInfo info) : base(init, info) @@ -33,17 +35,26 @@ namespace OpenRA.Mods.Cnc.Traits.Render this.info = info; rs = init.Self.Trait(); disguise = init.Self.Trait(); - intendedSprite = disguise.AsSprite; } protected override void Tick(Actor self) { - if (disguise.AsSprite != intendedSprite) + if (disguise.AsActor != disguiseActor || disguise.AsPlayer != disguisePlayer) { - intendedSprite = disguise.AsSprite; + disguiseActor = disguise.AsActor; + disguisePlayer = disguise.AsPlayer; + disguiseImage = null; + + if (disguiseActor != null) + { + var renderSprites = disguiseActor.TraitInfoOrDefault(); + if (renderSprites != null) + disguiseImage = renderSprites.GetImage(disguiseActor, self.World.Map.Rules.Sequences, disguisePlayer.InternalName); + } + var sequence = DefaultAnimation.GetRandomExistingSequence(info.StandSequences, Game.CosmeticRandom); if (sequence != null) - DefaultAnimation.ChangeImage(intendedSprite ?? rs.GetImage(self), sequence); + DefaultAnimation.ChangeImage(disguiseImage ?? rs.GetImage(self), sequence); rs.UpdatePalette(); }