diff --git a/OpenRA.Game/Traits/Mobile.cs b/OpenRA.Game/Traits/Mobile.cs index 84d32f361d..1ee6a2efb2 100644 --- a/OpenRA.Game/Traits/Mobile.cs +++ b/OpenRA.Game/Traits/Mobile.cs @@ -66,9 +66,9 @@ namespace OpenRA.Traits self.World.WorldActor.traits.Get().Add(self, this); } - public void TeleportTo(Actor self, int2 xy) + public void SetPosition(Actor self, int2 cell) { - SetLocation( xy, xy ); + SetLocation( cell, cell ); self.CenterLocation = Util.CenterOfCell(fromCell); } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 21a03e1c4a..bcacb5aed3 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -101,6 +101,7 @@ namespace OpenRA.Traits UnitMovementType GetMovementType(); bool CanEnterCell(int2 location); IEnumerable GetCurrentPath(Actor self); + void SetPosition(Actor self, int2 cell); } public interface IOffsetCenterLocation { float2 CenterOffset { get; } } diff --git a/OpenRA.Mods.Cnc/ProductionAirdrop.cs b/OpenRA.Mods.Cnc/ProductionAirdrop.cs index 9b3e1d9cf8..5e94fa8c30 100644 --- a/OpenRA.Mods.Cnc/ProductionAirdrop.cs +++ b/OpenRA.Mods.Cnc/ProductionAirdrop.cs @@ -18,6 +18,7 @@ */ #endregion +using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.RA; using OpenRA.Mods.RA.Activities; @@ -66,7 +67,7 @@ namespace OpenRA.Mods.Cnc self.World.AddFrameEndTask(ww => { ww.Add(actor); - actor.traits.Get().TeleportTo(actor, self.Location + unloadOffset); + actor.traits.WithInterface().FirstOrDefault().SetPosition(actor, self.Location + unloadOffset); newUnit.traits.Get().Facing = 192; actor.CancelActivity(); actor.QueueActivity(new Move(self.Location + exitOffset, self)); diff --git a/OpenRA.Mods.RA/Activities/Leap.cs b/OpenRA.Mods.RA/Activities/Leap.cs index 966b4e10a0..14afe0be52 100644 --- a/OpenRA.Mods.RA/Activities/Leap.cs +++ b/OpenRA.Mods.RA/Activities/Leap.cs @@ -19,6 +19,7 @@ #endregion using OpenRA.Traits; +using System.Linq; namespace OpenRA.Mods.RA.Activities { class Leap : IActivity @@ -51,7 +52,7 @@ namespace OpenRA.Mods.RA.Activities if (t >= 1f) { - self.traits.Get().TeleportTo(self, target.Location); + self.traits.WithInterface().FirstOrDefault().SetPosition(self, target.Location); target.InflictDamage(self, target.Health, null); // kill it return NextActivity; } diff --git a/OpenRA.Mods.RA/Activities/Teleport.cs b/OpenRA.Mods.RA/Activities/Teleport.cs index 883de1157f..18e6872cbb 100755 --- a/OpenRA.Mods.RA/Activities/Teleport.cs +++ b/OpenRA.Mods.RA/Activities/Teleport.cs @@ -18,6 +18,7 @@ */ #endregion +using System.Linq; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities @@ -35,8 +36,7 @@ namespace OpenRA.Mods.RA.Activities public IActivity Tick(Actor self) { - var mobile = self.traits.Get(); - mobile.TeleportTo(self, destination); + self.traits.WithInterface().FirstOrDefault().SetPosition(self, destination); return NextActivity; } diff --git a/OpenRA.Mods.RA/Activities/UnloadCargo.cs b/OpenRA.Mods.RA/Activities/UnloadCargo.cs index 0f967861ba..2b16d0c713 100644 --- a/OpenRA.Mods.RA/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.RA/Activities/UnloadCargo.cs @@ -78,7 +78,7 @@ namespace OpenRA.Mods.RA.Activities self.World.AddFrameEndTask(w => { w.Add(actor); - actor.traits.Get().TeleportTo(actor, self.Location); + actor.traits.WithInterface().FirstOrDefault().SetPosition(actor, self.Location); actor.CancelActivity(); actor.QueueActivity(new Move(exitTile.Value, 0)); }); diff --git a/OpenRA.Mods.RA/Aircraft.cs b/OpenRA.Mods.RA/Aircraft.cs index ab26c4124d..0f9fae58d4 100755 --- a/OpenRA.Mods.RA/Aircraft.cs +++ b/OpenRA.Mods.RA/Aircraft.cs @@ -49,6 +49,12 @@ namespace OpenRA.Mods.RA get { return Location; } } + public void SetPosition(Actor self, int2 cell) + { + Location = cell; + self.CenterLocation = Util.CenterOfCell(cell); + } + public bool AircraftCanEnter(Actor self, Actor a) { var aircraft = self.Info.Traits.Get(); diff --git a/OpenRA.Mods.RA/Effects/Parachute.cs b/OpenRA.Mods.RA/Effects/Parachute.cs index 68d93c4908..c4bc7f10f9 100644 --- a/OpenRA.Mods.RA/Effects/Parachute.cs +++ b/OpenRA.Mods.RA/Effects/Parachute.cs @@ -19,6 +19,7 @@ #endregion using System.Collections.Generic; +using System.Linq; using OpenRA.Effects; using OpenRA.Graphics; using OpenRA.Traits; @@ -67,8 +68,11 @@ namespace OpenRA.Mods.RA.Effects w.Remove(this); var loc = Traits.Util.CellContaining(location); cargo.CancelActivity(); - if (cargo.traits.Contains()) - cargo.traits.Get().TeleportTo(cargo, loc); + + var mobile = cargo.traits.WithInterface().FirstOrDefault(); + + if (mobile != null) + mobile.SetPosition(cargo, loc); else { cargo.CenterLocation = Traits.Util.CenterOfCell(loc);