From eb5b50185c9d997a0388ef5e74a37ef16ed84352 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 10 Jun 2016 16:34:12 +0100 Subject: [PATCH] Add IActorPreviewInitModifier interface. --- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 8 ++++++- OpenRA.Mods.Common/Traits/Mobile.cs | 8 ++++++- .../Traits/Render/RenderSprites.cs | 8 ++++++- OpenRA.Mods.Common/Traits/Turreted.cs | 22 +++++++++++++++++++ OpenRA.Mods.Common/TraitsInterfaces.cs | 6 +++++ 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index f1b3782b9a..660bd39e67 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits } public class Aircraft : ITick, ISync, IFacing, IPositionable, IMove, IIssueOrder, IResolveOrder, IOrderVoice, IDeathActorInitModifier, - INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyActorDisposing + INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyActorDisposing, IActorPreviewInitModifier { static readonly Pair[] NoCells = { }; @@ -660,5 +660,11 @@ namespace OpenRA.Mods.Common.Traits { UnReserve(); } + + void IActorPreviewInitModifier.ModifyActorPreviewInit(Actor self, TypeDictionary inits) + { + if (!inits.Contains() && !inits.Contains()) + inits.Add(new DynamicFacingInit(() => Facing)); + } } } diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 0a3cd8c0ee..27fd2a7675 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -319,7 +319,7 @@ namespace OpenRA.Mods.Common.Traits } public class Mobile : UpgradableTrait, IIssueOrder, IResolveOrder, IOrderVoice, IPositionable, IMove, IFacing, ISync, - IDeathActorInitModifier, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyBlockingMove + IDeathActorInitModifier, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyBlockingMove, IActorPreviewInitModifier { const int AverageTicksBeforePathing = 5; const int SpreadTicksBeforePathing = 5; @@ -716,6 +716,12 @@ namespace OpenRA.Mods.Common.Traits } } + void IActorPreviewInitModifier.ModifyActorPreviewInit(Actor self, TypeDictionary inits) + { + if (!inits.Contains() && !inits.Contains()) + inits.Add(new DynamicFacingInit(() => facing)); + } + class MoveOrderTargeter : IOrderTargeter { readonly Mobile mobile; diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs index e467ad85e7..9a7a513aef 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs @@ -83,7 +83,7 @@ namespace OpenRA.Mods.Common.Traits.Render } } - public class RenderSprites : IRender, ITick, INotifyOwnerChanged, INotifyEffectiveOwnerChanged + public class RenderSprites : IRender, ITick, INotifyOwnerChanged, INotifyEffectiveOwnerChanged, IActorPreviewInitModifier { class AnimationWrapper { @@ -231,5 +231,11 @@ namespace OpenRA.Mods.Common.Traits.Render .Select(a => (a.Animation.Animation.Image.Size.XY * info.Scale).ToInt2()) .FirstOrDefault(); } + + void IActorPreviewInitModifier.ModifyActorPreviewInit(Actor self, TypeDictionary inits) + { + if (!inits.Contains()) + inits.Add(new FactionInit(faction)); + } } } diff --git a/OpenRA.Mods.Common/Traits/Turreted.cs b/OpenRA.Mods.Common/Traits/Turreted.cs index 2e9dcfceab..e985c8e6b0 100644 --- a/OpenRA.Mods.Common/Traits/Turreted.cs +++ b/OpenRA.Mods.Common/Traits/Turreted.cs @@ -174,6 +174,28 @@ namespace OpenRA.Mods.Common.Traits facings.Value(self.World).Add(Name, TurretFacing); } + + void IActorPreviewInitModifier.ModifyActorPreviewInit(Actor self, TypeDictionary inits) + { + var facings = inits.GetOrDefault(); + if (facings == null) + { + facings = new DynamicTurretFacingsInit(); + inits.Add(facings); + } + + Func bodyFacing = () => facing.Facing; + var dynamicFacing = inits.GetOrDefault(); + var staticFacing = inits.GetOrDefault(); + if (dynamicFacing != null) + bodyFacing = dynamicFacing.Value(self.World); + else if (staticFacing != null) + bodyFacing = () => staticFacing.Value(self.World); + + // Freeze the relative turret facing to its current value + var facingOffset = TurretFacing - bodyFacing(); + facings.Value(self.World).Add(Name, () => bodyFacing() + facingOffset); + } } public class TurretFacingInit : IActorInit diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index eb9b45e091..c4ef8fe336 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -125,4 +125,10 @@ namespace OpenRA.Mods.Common.Traits bool AdjacentWallCanConnect(Actor self, CPos wallLocation, string wallType, out CVec facing); void SetDirty(); } + + [RequireExplicitImplementation] + public interface IActorPreviewInitModifier + { + void ModifyActorPreviewInit(Actor self, TypeDictionary inits); + } }