diff --git a/OpenRA.Mods.Common/Traits/Production.cs b/OpenRA.Mods.Common/Traits/Production.cs index b359243b46..87c033c7bf 100644 --- a/OpenRA.Mods.Common/Traits/Production.cs +++ b/OpenRA.Mods.Common/Traits/Production.cs @@ -35,39 +35,50 @@ namespace OpenRA.Mods.Common.Traits public ProductionInfo Info; public string Faction { get; private set; } + readonly bool occupiesSpace; + public Production(ActorInitializer init, ProductionInfo info) { Info = info; + occupiesSpace = init.Self.Info.Traits.WithInterface().Any(); rp = Exts.Lazy(() => init.Self.IsDead ? null : init.Self.TraitOrDefault()); Faction = init.Contains() ? init.Get() : init.Self.Owner.Faction.InternalName; } public void DoProduction(Actor self, ActorInfo producee, ExitInfo exitinfo, string factionVariant) { - var exit = self.Location + exitinfo.ExitCell; - var spawn = self.CenterPosition + exitinfo.SpawnOffset; - var to = self.World.Map.CenterOfCell(exit); - - var fi = producee.Traits.GetOrDefault(); - var initialFacing = exitinfo.Facing < 0 ? Util.GetFacing(to - spawn, fi == null ? 0 : fi.GetInitialFacing()) : exitinfo.Facing; - - var exitLocation = rp.Value != null ? rp.Value.Location : exit; - var target = Target.FromCell(self.World, exitLocation); + var exit = CPos.Zero; + var exitLocation = CPos.Zero; + var target = Target.Invalid; var bi = producee.Traits.GetOrDefault(); if (bi != null && bi.ForceFaction != null) factionVariant = bi.ForceFaction; + var td = new TypeDictionary + { + new OwnerInit(self.Owner), + }; + + if (occupiesSpace) + { + exit = self.Location + exitinfo.ExitCell; + var spawn = self.CenterPosition + exitinfo.SpawnOffset; + var to = self.World.Map.CenterOfCell(exit); + + var fi = producee.Traits.GetOrDefault(); + var initialFacing = exitinfo.Facing < 0 ? Util.GetFacing(to - spawn, fi == null ? 0 : fi.GetInitialFacing()) : exitinfo.Facing; + + exitLocation = rp.Value != null ? rp.Value.Location : exit; + target = Target.FromCell(self.World, exitLocation); + + td.Add(new LocationInit(exit)); + td.Add(new CenterPositionInit(spawn)); + td.Add(new FacingInit(initialFacing)); + } + self.World.AddFrameEndTask(w => { - var td = new TypeDictionary - { - new OwnerInit(self.Owner), - new LocationInit(exit), - new CenterPositionInit(spawn), - new FacingInit(initialFacing) - }; - if (factionVariant != null) td.Add(new FactionInit(factionVariant)); @@ -107,7 +118,13 @@ namespace OpenRA.Mods.Common.Traits if (Reservable.IsReserved(self)) return false; - // pick a spawn/exit point pair + if (!occupiesSpace) + { + DoProduction(self, producee, null, factionVariant); + return true; + } + + // Pick a spawn/exit point pair var exit = self.Info.Traits.WithInterface().Shuffle(self.World.SharedRandom) .FirstOrDefault(e => CanUseExit(self, producee, e));