public virtual bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere)
        {
            if (IsTraitDisabled)
            {
                return(false);
            }

            // Some things appear chronoshiftable, but instead they just die.
            if (Info.ExplodeInstead)
            {
                self.World.AddFrameEndTask(w =>
                {
                    // Damage is inflicted by the chronosphere
                    if (!self.Disposed)
                    {
                        self.Kill(chronosphere, Info.DamageTypes);
                    }
                });
                return(true);
            }

            // Set up return-to-origin info
            // If this actor is already counting down to return to
            // an existing location then we shouldn't override it
            if (ReturnTicks <= 0)
            {
                Origin      = self.Location;
                ReturnTicks = duration;
            }

            this.duration     = duration;
            this.chronosphere = chronosphere;
            this.killCargo    = killCargo;

            if (Info.ExposeInfectors)
            {
                foreach (var i in self.TraitsImplementing <IRemoveInfector>())
                {
                    i.RemoveInfector(self, false);
                }
            }

            // Set up the teleport
            self.QueueActivity(false, new Teleport(chronosphere, targetLocation, null, killCargo, true, Info.ChronoshiftSound));

            // AllowImpassable was true, but we can't enter here, kill the unit.
            if (iPositionable == null || !iPositionable.CanExistInCell(targetLocation))
            {
                self.World.AddFrameEndTask(w =>
                {
                    // Damage is inflicted by the chronosphere
                    if (!self.Disposed)
                    {
                        self.Kill(chronosphere, Info.DamageTypes);
                    }
                });
                return(true);
            }

            return(true);
        }