diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index a25706fd36..717e47b8f7 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -198,6 +198,8 @@ namespace OpenRA.Mods.Common.Orders { if (!initialized) { + var actor = rules.Actors[building]; + var td = new TypeDictionary() { new FactionInit(faction), @@ -205,7 +207,11 @@ namespace OpenRA.Mods.Common.Orders new HideBibPreviewInit() }; - var init = new ActorPreviewInitializer(rules.Actors[building], wr, td); + foreach (var api in actor.TraitInfos()) + foreach (var o in api.ActorPreviewInits(actor, ActorPreviewType.PlaceBuilding)) + td.Add(o); + + var init = new ActorPreviewInitializer(actor, wr, td); preview = rules.Actors[building].TraitInfos() .SelectMany(rpi => rpi.RenderPreview(init)) .ToArray(); diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index fccf1fb169..e15f00da4f 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -290,4 +290,12 @@ namespace OpenRA.Mods.Common.Traits { Order IssueDeployOrder(Actor self); } + + public enum ActorPreviewType { PlaceBuilding, ColorPicker, MapEditorSidebar } + + [RequireExplicitImplementation] + public interface IActorPreviewInitInfo : ITraitInfo + { + IEnumerable ActorPreviewInits(ActorInfo ai, ActorPreviewType type); + } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs index 679759950b..2ef06a2f28 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs @@ -33,6 +33,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic td.Add(new HideBibPreviewInit()); td.Add(new OwnerInit(world.WorldActor.Owner)); td.Add(new FactionInit(world.WorldActor.Owner.PlayerReference.Faction)); + foreach (var api in actor.TraitInfos()) + foreach (var o in api.ActorPreviewInits(actor, ActorPreviewType.ColorPicker)) + td.Add(o); if (preview != null) preview.SetPreview(actor, td); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs index 0df6710afa..e85878bc6c 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs @@ -109,6 +109,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic td.Add(new HideBibPreviewInit()); td.Add(new OwnerInit(selectedOwner.Name)); td.Add(new FactionInit(selectedOwner.Faction)); + foreach (var api in actor.TraitInfos()) + foreach (var o in api.ActorPreviewInits(actor, ActorPreviewType.MapEditorSidebar)) + td.Add(o); try {