public async Task TestDeleteVisiting()
        {
            await using var pairTracker = await PoolManager.GetServerClient();

            var server = pairTracker.Pair.Server;

            var       entMan    = server.ResolveDependency <IServerEntityManager>();
            EntityUid playerEnt = default;
            EntityUid visitEnt  = default;
            Mind      mind      = null;
            await server.WaitAssertion(() =>
            {
                var player = IoCManager.Resolve <IPlayerManager>().ServerSessions.Single();

                var mapMan = IoCManager.Resolve <IMapManager>();

                var mapId = mapMan.GetAllMapIds().Last();
                var pos   = new MapCoordinates(Vector2.Zero, mapId);

                playerEnt = entMan.SpawnEntity(null, pos);
                visitEnt  = entMan.SpawnEntity(null, pos);

                mind = new Mind(player.UserId);
                mind.ChangeOwningPlayer(player.UserId);

                mind.TransferTo(playerEnt);
                mind.Visit(visitEnt);

                Assert.That(player.AttachedEntity, Is.EqualTo(visitEnt));
                Assert.That(mind.VisitingEntity, Is.EqualTo(visitEnt));
            });

            await PoolManager.RunTicksSync(pairTracker.Pair, 5);

            await server.WaitAssertion(() =>
            {
                entMan.DeleteEntity(visitEnt);
                if (mind == null)
                {
                    Assert.Fail("Mind was null");
                    return;
                }

                if (mind.VisitingEntity != null)
                {
                    Assert.Fail("Mind VisitingEntity was not null");
                    return;
                }

                // This used to throw so make sure it doesn't.
                entMan.DeleteEntity(playerEnt);
            });

            await PoolManager.RunTicksSync(pairTracker.Pair, 5);

            await pairTracker.CleanReturnAsync();
        }
        public async Task TestGhostOnDeleteMap()
        {
            await using var pairTracker = await PoolManager.GetServerClient();

            var server = pairTracker.Pair.Server;

            EntityUid playerEnt = default;
            Mind      mind      = null;
            MapId     map       = default;
            await server.WaitAssertion(() =>
            {
                var player = IoCManager.Resolve <IPlayerManager>().ServerSessions.Single();

                var mapMan = IoCManager.Resolve <IMapManager>();

                map      = mapMan.CreateMap();
                var grid = mapMan.CreateGrid(map);

                var entMgr = IoCManager.Resolve <IServerEntityManager>();

                mapMan.CreateNewMapEntity(MapId.Nullspace);

                playerEnt = entMgr.SpawnEntity(null, grid.ToCoordinates());

                mind = new Mind(player.UserId);
                mind.ChangeOwningPlayer(player.UserId);

                mind.TransferTo(playerEnt);

                Assert.That(mind.CurrentEntity, Is.EqualTo(playerEnt));
            });

            await PoolManager.RunTicksSync(pairTracker.Pair, 5);

            await server.WaitPost(() =>
            {
                var mapMan = IoCManager.Resolve <IMapManager>();

                mapMan.DeleteMap(map);
            });

            await PoolManager.RunTicksSync(pairTracker.Pair, 5);

            await server.WaitAssertion(() =>
            {
                Assert.That(IoCManager.Resolve <IEntityManager>().EntityExists(mind.CurrentEntity !.Value), Is.True);
                Assert.That(mind.CurrentEntity, Is.Not.EqualTo(playerEnt));
            });

            await pairTracker.CleanReturnAsync();
        }
        public async Task TestGhostOnDelete()
        {
            // Has to be a non-dummy ticker so we have a proper map.

            await using var pairTracker = await PoolManager.GetServerClient();

            var server = pairTracker.Pair.Server;

            var       entMan    = server.ResolveDependency <IServerEntityManager>();
            EntityUid playerEnt = default;
            Mind      mind      = null;
            await server.WaitAssertion(() =>
            {
                var player = IoCManager.Resolve <IPlayerManager>().ServerSessions.Single();

                var mapMan = IoCManager.Resolve <IMapManager>();

                var mapId = mapMan.GetAllMapIds().Last();
                var pos   = new MapCoordinates(Vector2.Zero, mapId);

                playerEnt = entMan.SpawnEntity(null, pos);

                mind = new Mind(player.UserId);
                mind.ChangeOwningPlayer(player.UserId);

                mind.TransferTo(playerEnt);

                Assert.That(mind.CurrentEntity, Is.EqualTo(playerEnt));
            });

            await PoolManager.RunTicksSync(pairTracker.Pair, 5);

            await server.WaitPost(() =>
            {
                entMan.DeleteEntity(playerEnt);
            });

            await PoolManager.RunTicksSync(pairTracker.Pair, 5);

            await server.WaitAssertion(() =>
            {
                Assert.That(entMan.EntityExists(mind.CurrentEntity !.Value), Is.True);
            });

            await pairTracker.CleanReturnAsync();
        }
        public async Task TestDeleteVisiting()
        {
            var(_, server) = await StartConnectedServerDummyTickerClientPair();

            var       entMan    = server.ResolveDependency <IServerEntityManager>();
            EntityUid playerEnt = default;
            EntityUid visitEnt  = default;
            Mind      mind      = null;

            server.Assert(() =>
            {
                var player = IoCManager.Resolve <IPlayerManager>().ServerSessions.Single();

                var mapMan = IoCManager.Resolve <IMapManager>();

                mapMan.CreateNewMapEntity(MapId.Nullspace);

                playerEnt = entMan.SpawnEntity(null, MapCoordinates.Nullspace);
                visitEnt  = entMan.SpawnEntity(null, MapCoordinates.Nullspace);

                mind = new Mind(player.UserId);
                mind.ChangeOwningPlayer(player.UserId);

                mind.TransferTo(playerEnt);
                mind.Visit(visitEnt);

                Assert.That(player.AttachedEntity, Is.EqualTo(visitEnt));
                Assert.That(mind.VisitingEntity, Is.EqualTo(visitEnt));
            });

            server.RunTicks(1);

            server.Assert(() =>
            {
                entMan.DeleteEntity(visitEnt);

                Assert.That(mind.VisitingEntity, Is.EqualTo(default));
 public void WipeMind()
 {
     Mind?.ChangeOwningPlayer(null);
     Mind = null;
 }
 public void WipeMind()
 {
     Mind?.TransferTo(null);
     // This will ensure Mind == null
     Mind?.ChangeOwningPlayer(null);
 }