diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index a41619041d..07e720662d 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -34,7 +34,6 @@ namespace OpenRA.Mods.Common.Orders { producer = queue.Actor; building = name; - race = queue.MostLikelyProducer().Trait.Race; // Clear selection if using Left-Click Orders if (Game.Settings.Game.UseClassicMouseStyle) @@ -42,7 +41,12 @@ namespace OpenRA.Mods.Common.Orders var map = producer.World.Map; var tileset = producer.World.TileSet.Id.ToLowerInvariant(); - buildingInfo = map.Rules.Actors[building].Traits.Get(); + + var info = map.Rules.Actors[building]; + buildingInfo = info.Traits.Get(); + + var buildableInfo = info.Traits.Get(); + race = buildableInfo.ForceRace ?? queue.MostLikelyProducer().Trait.Race; buildOk = map.SequenceProvider.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0); buildBlocked = map.SequenceProvider.GetSequence("overlay", "build-invalid").GetSprite(0); diff --git a/OpenRA.Mods.Common/Traits/Buildable.cs b/OpenRA.Mods.Common/Traits/Buildable.cs index 605c623254..cbb711bdc7 100644 --- a/OpenRA.Mods.Common/Traits/Buildable.cs +++ b/OpenRA.Mods.Common/Traits/Buildable.cs @@ -36,6 +36,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("What the unit should start doing. Warning: If this is not a harvester", "it will break if you use FindResources.")] public readonly string InitialActivity = null; + [Desc("Force a specific race variant, overriding the race of the producing actor.")] + public readonly string ForceRace = null; + // TODO: UI fluff; doesn't belong here public readonly int BuildPaletteOrder = 9999; } diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs index eab585dba8..aa4c0c3a2e 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs @@ -42,6 +42,10 @@ namespace OpenRA.Mods.Common.Traits var race = producer.Trait != null ? producer.Trait.Race : self.Owner.Country.Race; var buildingInfo = unit.Traits.Get(); + var buildableInfo = unit.Traits.GetOrDefault(); + if (buildableInfo != null && buildableInfo.ForceRace != null) + race = buildableInfo.ForceRace; + if (order.OrderString == "LineBuild") { var playSounds = true; diff --git a/OpenRA.Mods.Common/Traits/Production.cs b/OpenRA.Mods.Common/Traits/Production.cs index 0d5b30db9b..d143263bba 100644 --- a/OpenRA.Mods.Common/Traits/Production.cs +++ b/OpenRA.Mods.Common/Traits/Production.cs @@ -53,6 +53,10 @@ namespace OpenRA.Mods.Common.Traits var exitLocation = rp.Value != null ? rp.Value.Location : exit; var target = Target.FromCell(self.World, exitLocation); + var bi = producee.Traits.GetOrDefault(); + if (bi != null && bi.ForceRace != null) + raceVariant = bi.ForceRace; + self.World.AddFrameEndTask(w => { var td = new TypeDictionary @@ -89,7 +93,6 @@ namespace OpenRA.Mods.Common.Traits foreach (var notify in notifyOthers) notify.Trait.UnitProducedByOther(notify.Actor, self, newUnit); - var bi = newUnit.Info.Traits.GetOrDefault(); if (bi != null && bi.InitialActivity != null) newUnit.QueueActivity(Game.CreateObject(bi.InitialActivity));