From 3cb707ad3c1c0dbf106abdf378cefbc330e2ddcb Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Fri, 7 Aug 2015 16:10:27 +0300 Subject: [PATCH] Remove producer-is-in-world assumptions from Production D2k upgrades need to be actors that never actor the world, produced by the PlayerActor, who is also not in the world, but the Production trait expects the producer to be in the world even if it has Exit.MoveIntoWorld = False, allowing the producees to not enter the world. --- OpenRA.Mods.Common/Traits/Production.cs | 53 ++++++++++++++++--------- 1 file changed, 35 insertions(+), 18 deletions(-) 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));