diff --git a/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs index ca02eba0ba..abfcaa4be1 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithSpriteTurret.cs @@ -45,8 +45,8 @@ namespace OpenRA.Mods.Common.Traits.Render var t = init.Actor.TraitInfos() .First(tt => tt.Turret == Turret); - var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret); - var anim = new Animation(init.World, image, () => turretFacing); + var turretFacing = Turreted.TurretFacingFromInit(init, t.InitialFacing, Turret); + var anim = new Animation(init.World, image, turretFacing); anim.Play(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); Func facing = init.GetFacing(); diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs index 73059f38cb..4a3ed257f9 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs @@ -45,8 +45,8 @@ namespace OpenRA.Mods.Common.Traits.Render var voxel = VoxelProvider.GetVoxel(image, Sequence); - var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, t.Turret); - Func turretOrientation = () => body.QuantizeOrientation(WRot.FromYaw(WAngle.FromFacing(turretFacing) - orientation().Yaw), facings); + var turretFacing = Turreted.TurretFacingFromInit(init, t.InitialFacing, t.Turret); + Func turretOrientation = () => body.QuantizeOrientation(WRot.FromYaw(WAngle.FromFacing(turretFacing()) - orientation().Yaw), facings); Func quantizedTurret = () => body.QuantizeOrientation(turretOrientation(), facings); Func quantizedBody = () => body.QuantizeOrientation(orientation(), facings); diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs index b645aa01f5..556e390072 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs @@ -41,8 +41,8 @@ namespace OpenRA.Mods.Common.Traits.Render var voxel = VoxelProvider.GetVoxel(image, Sequence); Func turretOffset = () => body.LocalToWorld(t.Offset.Rotate(orientation())); - var turretFacing = Turreted.GetInitialTurretFacing(init, t.InitialFacing, Turret); - Func turretBodyOrientation = () => WRot.FromYaw(WAngle.FromFacing(turretFacing) - orientation().Yaw); + var turretFacing = Turreted.TurretFacingFromInit(init, t.InitialFacing, Turret); + Func turretBodyOrientation = () => WRot.FromYaw(WAngle.FromFacing(turretFacing()) - orientation().Yaw); yield return new VoxelAnimation(voxel, turretOffset, () => new[] { turretBodyOrientation(), body.QuantizeOrientation(orientation(), facings) }, () => false, () => 0); } diff --git a/OpenRA.Mods.Common/Traits/ThrowsParticle.cs b/OpenRA.Mods.Common/Traits/ThrowsParticle.cs index dcd768894b..473e3b10f6 100644 --- a/OpenRA.Mods.Common/Traits/ThrowsParticle.cs +++ b/OpenRA.Mods.Common/Traits/ThrowsParticle.cs @@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits // TODO: Carry orientation over from the parent instead of just facing var bodyFacing = init.Contains() ? init.Get>()() : init.Contains() ? init.Get() : 0; - facing = WAngle.FromFacing(Turreted.GetInitialTurretFacing(init, 0)); + facing = WAngle.FromFacing(Turreted.TurretFacingFromInit(init, 0)()); // Calculate final position var throwRotation = WRot.FromFacing(Game.CosmeticRandom.Next(1024)); diff --git a/OpenRA.Mods.Common/Traits/Turreted.cs b/OpenRA.Mods.Common/Traits/Turreted.cs index 66c90ca3ad..2e9dcfceab 100644 --- a/OpenRA.Mods.Common/Traits/Turreted.cs +++ b/OpenRA.Mods.Common/Traits/Turreted.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits public virtual object Create(ActorInitializer init) { return new Turreted(init, this); } } - public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier + public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier, IActorPreviewInitModifier { readonly TurretedInfo info; AttackTurreted attack; @@ -50,31 +50,44 @@ namespace OpenRA.Mods.Common.Traits public WVec Offset { get { return info.Offset + localOffset; } } public string Name { get { return info.Turret; } } - public static int GetInitialTurretFacing(IActorInitializer init, int def, string turret = null) + public static Func TurretFacingFromInit(IActorInitializer init, int def, string turret = null) { + if (turret != null && init.Contains()) + { + Func facing; + if (init.Get>>().TryGetValue(turret, out facing)) + return facing; + } + if (turret != null && init.Contains()) { int facing; if (init.Get>().TryGetValue(turret, out facing)) - return facing; + return () => facing; } if (init.Contains()) - return init.Get(); + { + var facing = init.Get(); + return () => facing; + } if (init.Contains()) - return init.Get>()(); + return init.Get>(); if (init.Contains()) - return init.Get(); + { + var facing = init.Get(); + return () => facing; + } - return def; + return () => def; } public Turreted(ActorInitializer init, TurretedInfo info) { this.info = info; - TurretFacing = GetInitialTurretFacing(init, info.InitialFacing, info.Turret); + TurretFacing = TurretFacingFromInit(init, info.InitialFacing, info.Turret)(); } public void Created(Actor self) @@ -179,4 +192,12 @@ namespace OpenRA.Mods.Common.Traits public TurretFacingsInit(Dictionary init) { value = init; } public Dictionary Value(World world) { return value; } } + + public class DynamicTurretFacingsInit : IActorInit>> + { + readonly Dictionary> value = new Dictionary>(); + public DynamicTurretFacingsInit() { } + public DynamicTurretFacingsInit(Dictionary> init) { value = init; } + public Dictionary> Value(World world) { return value; } + } }