diff --git a/OpenRa.Game/Traits/Activities/Teleport.cs b/OpenRa.Game/Traits/Activities/Teleport.cs index 2b6c4362d0..bb0dc81d7b 100644 --- a/OpenRa.Game/Traits/Activities/Teleport.cs +++ b/OpenRa.Game/Traits/Activities/Teleport.cs @@ -19,26 +19,11 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick(Actor self) { - var unit = self.traits.Get(); var mobile = self.traits.Get(); - - //TODO: Something needs to go here to shift the units position. - // Everything i have tried has caused a crash in UnitInfluenceMap. - - //Game.world.AddFrameEndTask(_ => - //{ - Game.UnitInfluence.Remove(self, mobile); - //self.Location = this.destination; - mobile.toCell = this.destination; - Game.UnitInfluence.Add(self, mobile); - - - //}); - - return null; + mobile.TeleportTo(self, destination); + return NextActivity; } - public void Cancel(Actor self){} - + public void Cancel(Actor self) { } } } diff --git a/OpenRa.Game/Traits/ChronoshiftDeploy.cs b/OpenRa.Game/Traits/ChronoshiftDeploy.cs index 38c542401b..020ea01bd5 100644 --- a/OpenRa.Game/Traits/ChronoshiftDeploy.cs +++ b/OpenRa.Game/Traits/ChronoshiftDeploy.cs @@ -38,8 +38,8 @@ namespace OpenRa.Game.Traits if (order.OrderString == "UsePortableChronoshift" && CanEnterCell(order.TargetLocation, self)) { - //self.QueueActivity(new Activities.Teleport(order.TargetLocation)); - Sound.Play("chrotnk1.aud"); + self.QueueActivity(new Activities.Teleport(order.TargetLocation)); + // Sound.Play("chrotnk1.aud"); chronoshiftActive = false; remainingChargeTime = chargeTime; } diff --git a/OpenRa.Game/Traits/Mobile.cs b/OpenRa.Game/Traits/Mobile.cs index 8e8908f13f..4f4f3d0ac6 100644 --- a/OpenRa.Game/Traits/Mobile.cs +++ b/OpenRa.Game/Traits/Mobile.cs @@ -28,6 +28,12 @@ namespace OpenRa.Game.Traits Game.UnitInfluence.Add(self, this); } + public void TeleportTo(Actor self, int2 xy) + { + fromCell = toCell = xy; + self.CenterLocation = Util.CenterOfCell(fromCell); + } + public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) { if (mi.Button == MouseButton.Left) return null; @@ -52,7 +58,9 @@ namespace OpenRa.Game.Traits public IEnumerable OccupiedCells() { - return new[] { fromCell, toCell }; + return (fromCell == toCell) + ? new[] { fromCell } + : new[] { fromCell, toCell }; } public UnitMovementType GetMovementType() diff --git a/OpenRa.Game/UnitInfluenceMap.cs b/OpenRa.Game/UnitInfluenceMap.cs index 472d76d1fb..8be45447dc 100644 --- a/OpenRa.Game/UnitInfluenceMap.cs +++ b/OpenRa.Game/UnitInfluenceMap.cs @@ -57,13 +57,8 @@ namespace OpenRa.Game public void Remove( Actor self, IOccupySpace unit ) { - var min = int2.Max(new int2(0, 0), self.Location - searchDistance); - var max = int2.Min(new int2(128, 128), self.Location + searchDistance); - - for (var j = min.Y; j <= max.Y; j++) - for (var i = min.X; i <= max.X; i++) - if (influence[i, j] == self) - influence[i, j] = null; + foreach (var c in unit.OccupiedCells()) + influence[c.X, c.Y] = null; } public void Update(Actor self, IOccupySpace unit)