| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- #nullable enable
- using System.Linq;
- using Content.Server.Ghost.Roles;
- using Content.Server.Ghost.Roles.Components;
- using Content.Server.Mind.Commands;
- using Content.Server.Roles;
- using Content.Shared.Damage;
- using Content.Shared.Damage.Prototypes;
- using Content.Shared.FixedPoint;
- using Content.Shared.Mind;
- using Content.Shared.Mind.Components;
- using Content.Shared.Players;
- using Content.Shared.Roles;
- using Content.Shared.Roles.Jobs;
- using Robust.Server.Console;
- using Robust.Server.GameObjects;
- using Robust.Server.Player;
- using Robust.Shared.GameObjects;
- using Robust.Shared.Map;
- using Robust.Shared.Prototypes;
- namespace Content.IntegrationTests.Tests.Minds;
- [TestFixture]
- public sealed partial class MindTests
- {
- [TestPrototypes]
- private const string Prototypes = @"
- - type: entity
- id: MindTestEntityDamageable
- components:
- - type: MindContainer
- - type: Damageable
- damageContainer: Biological
- - type: Body
- prototype: Human
- requiredLegs: 2
- - type: MobState
- - type: MobThresholds
- thresholds:
- 0: Alive
- 200: Dead
- - type: Destructible
- thresholds:
- - trigger:
- !type:DamageTypeTrigger
- damageType: Blunt
- damage: 400
- behaviors:
- - !type:GibBehavior { }
- ";
- [Test]
- public async Task TestCreateAndTransferMindToNewEntity()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- await server.WaitAssertion(() =>
- {
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- var entity = entMan.SpawnEntity(null, new MapCoordinates());
- var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- var mind = mindSystem.CreateMind(null);
- Assert.That(mind.Comp.UserId, Is.EqualTo(null));
- mindSystem.TransferTo(mind, entity, mind: mind);
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mind.Owner));
- });
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestReplaceMind()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- await server.WaitAssertion(() =>
- {
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- var entity = entMan.SpawnEntity(null, new MapCoordinates());
- var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- var mindId = mindSystem.CreateMind(null).Owner;
- mindSystem.TransferTo(mindId, entity);
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mindId));
- var mind2 = mindSystem.CreateMind(null).Owner;
- mindSystem.TransferTo(mind2, entity);
- Assert.Multiple(() =>
- {
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mind2));
- var mind = entMan.GetComponent<MindComponent>(mindId);
- Assert.That(mind.OwnedEntity, Is.Not.EqualTo(entity));
- });
- });
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestEntityDeadWhenGibbed()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- var protoMan = server.ResolveDependency<IPrototypeManager>();
- EntityUid entity = default!;
- MindContainerComponent mindContainerComp = default!;
- EntityUid mindId = default!;
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- var damageableSystem = entMan.EntitySysManager.GetEntitySystem<DamageableSystem>();
- await server.WaitAssertion(() =>
- {
- entity = entMan.SpawnEntity("MindTestEntityDamageable", new MapCoordinates());
- mindContainerComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- mindId = mindSystem.CreateMind(null);
- mindSystem.TransferTo(mindId, entity);
- Assert.Multiple(() =>
- {
- Assert.That(mindSystem.GetMind(entity, mindContainerComp), Is.EqualTo(mindId));
- var mind = entMan.GetComponent<MindComponent>(mindId);
- Assert.That(!mindSystem.IsCharacterDeadPhysically(mind));
- });
- });
- await pair.RunTicksSync(5);
- await server.WaitAssertion(() =>
- {
- var damageable = entMan.GetComponent<DamageableComponent>(entity);
- if (!protoMan.TryIndex<DamageTypePrototype>("Blunt", out var prototype))
- {
- return;
- }
- damageableSystem.SetDamage(entity, damageable, new DamageSpecifier(prototype, FixedPoint2.New(401)));
- Assert.That(mindSystem.GetMind(entity, mindContainerComp), Is.EqualTo(mindId));
- });
- await pair.RunTicksSync(5);
- await server.WaitAssertion(() =>
- {
- var mind = entMan.GetComponent<MindComponent>(mindId);
- Assert.That(mindSystem.IsCharacterDeadPhysically(mind));
- });
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestMindTransfersToOtherEntity()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- await server.WaitAssertion(() =>
- {
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- var entity = entMan.SpawnEntity(null, new MapCoordinates());
- var targetEntity = entMan.SpawnEntity(null, new MapCoordinates());
- var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- entMan.EnsureComponent<MindContainerComponent>(targetEntity);
- var mind = mindSystem.CreateMind(null).Owner;
- mindSystem.TransferTo(mind, entity);
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mind));
- mindSystem.TransferTo(mind, targetEntity);
- Assert.Multiple(() =>
- {
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(null));
- Assert.That(mindSystem.GetMind(targetEntity), Is.EqualTo(mind));
- });
- });
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestOwningPlayerCanBeChanged()
- {
- await using var pair = await PoolManager.GetServerClient(new PoolSettings
- {
- Connected = true,
- DummyTicker = false
- });
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- await pair.RunTicksSync(5);
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- var originalMind = GetMind(pair);
- var userId = originalMind.Comp.UserId;
- EntityUid mindId = default!;
- MindComponent mind = default!;
- await server.WaitAssertion(() =>
- {
- var entity = entMan.SpawnEntity(null, new MapCoordinates());
- var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- entMan.DirtyEntity(entity);
- mindId = mindSystem.CreateMind(null);
- mind = entMan.GetComponent<MindComponent>(mindId);
- mindSystem.TransferTo(mindId, entity);
- Assert.Multiple(() =>
- {
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mindId));
- Assert.That(mindComp.HasMind);
- });
- });
- await pair.RunTicksSync(5);
- await server.WaitAssertion(() =>
- {
- mindSystem.SetUserId(mindId, userId);
- Assert.Multiple(() =>
- {
- Assert.That(mind.UserId, Is.EqualTo(userId));
- Assert.That(originalMind.Comp.UserId, Is.EqualTo(null));
- });
- mindSystem.SetUserId(originalMind.Id, userId);
- Assert.Multiple(() =>
- {
- Assert.That(mind.UserId, Is.EqualTo(null));
- Assert.That(originalMind.Comp.UserId, Is.EqualTo(userId));
- });
- });
- await pair.RunTicksSync(5);
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestAddRemoveHasRoles()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- await server.WaitAssertion(() =>
- {
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- var roleSystem = entMan.EntitySysManager.GetEntitySystem<SharedRoleSystem>();
- var entity = entMan.SpawnEntity(null, new MapCoordinates());
- var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- var mindId = mindSystem.CreateMind(null).Owner;
- var mind = entMan.EnsureComponent<MindComponent>(mindId);
- Assert.That(mind.UserId, Is.EqualTo(null));
- mindSystem.TransferTo(mindId, entity);
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mindId));
- Assert.Multiple(() =>
- {
- Assert.That(roleSystem.MindHasRole<TraitorRoleComponent>(mindId), Is.False);
- Assert.That(roleSystem.MindHasRole<JobRoleComponent>(mindId), Is.False);
- });
- var traitorRole = "MindRoleTraitor";
- roleSystem.MindAddRole(mindId, traitorRole);
- Assert.Multiple(() =>
- {
- Assert.That(roleSystem.MindHasRole<TraitorRoleComponent>(mindId));
- Assert.That(roleSystem.MindHasRole<JobRoleComponent>(mindId), Is.False);
- });
- var jobRole = "";
- roleSystem.MindAddJobRole(mindId, jobPrototype:jobRole);
- Assert.Multiple(() =>
- {
- Assert.That(roleSystem.MindHasRole<TraitorRoleComponent>(mindId));
- Assert.That(roleSystem.MindHasRole<JobRoleComponent>(mindId));
- });
- roleSystem.MindRemoveRole<TraitorRoleComponent>(mindId);
- Assert.Multiple(() =>
- {
- Assert.That(roleSystem.MindHasRole<TraitorRoleComponent>(mindId), Is.False);
- Assert.That(roleSystem.MindHasRole<JobRoleComponent>(mindId));
- });
- roleSystem.MindRemoveRole<JobRoleComponent>(mindId);
- Assert.Multiple(() =>
- {
- Assert.That(roleSystem.MindHasRole<TraitorRoleComponent>(mindId), Is.False);
- Assert.That(roleSystem.MindHasRole<JobRoleComponent>(mindId), Is.False);
- });
- });
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestPlayerCanGhost()
- {
- // Client is needed to spawn session
- await using var pair = await PoolManager.GetServerClient(new PoolSettings { Connected = true, DummyTicker = false });
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- var playerMan = server.ResolveDependency<IPlayerManager>();
- var mindSystem = entMan.EntitySysManager.GetEntitySystem<SharedMindSystem>();
- EntityUid entity = default!;
- EntityUid mindId = default!;
- MindComponent mind = default!;
- var player = playerMan.Sessions.Single();
- await server.WaitAssertion(() =>
- {
- entity = entMan.SpawnEntity(null, new MapCoordinates());
- var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- mindId = mindSystem.CreateMind(player.UserId, "Mindy McThinker");
- mind = entMan.GetComponent<MindComponent>(mindId);
- Assert.That(mind.UserId, Is.EqualTo(player.UserId));
- mindSystem.TransferTo(mindId, entity);
- Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mindId));
- });
- await pair.RunTicksSync(5);
- await server.WaitAssertion(() =>
- {
- entMan.DeleteEntity(entity);
- });
- await pair.RunTicksSync(5);
- EntityUid mob = default!;
- EntityUid mobMindId = default!;
- MindComponent mobMind = default!;
- await server.WaitAssertion(() =>
- {
- Assert.That(mind.OwnedEntity, Is.Not.Null);
- mob = entMan.SpawnEntity(null, new MapCoordinates());
- MakeSentientCommand.MakeSentient(mob, entMan);
- mobMindId = mindSystem.CreateMind(player.UserId, "Mindy McThinker the Second");
- mobMind = entMan.GetComponent<MindComponent>(mobMindId);
- mindSystem.SetUserId(mobMindId, player.UserId);
- mindSystem.TransferTo(mobMindId, mob);
- });
- await pair.RunTicksSync(5);
- await server.WaitAssertion(() =>
- {
- var mId = player.ContentData()?.Mind!.Value;
- Assert.That(mId, Is.Not.Null);
- Assert.That(mId, Is.Not.EqualTo(default(EntityUid)));
- var m = entMan.GetComponent<MindComponent>(mId!.Value);
- Assert.Multiple(() =>
- {
- Assert.That(m!.OwnedEntity, Is.EqualTo(mob));
- Assert.That(mId, Is.Not.EqualTo(mindId));
- });
- });
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task TestGhostDoesNotInfiniteLoop()
- {
- await using var pair = await PoolManager.GetServerClient(new PoolSettings
- {
- DummyTicker = false,
- Connected = true,
- Dirty = true
- });
- var server = pair.Server;
- var entMan = server.ResolveDependency<IServerEntityManager>();
- var playerMan = server.ResolveDependency<IPlayerManager>();
- var serverConsole = server.ResolveDependency<IServerConsoleHost>();
- //EntityUid entity = default!;
- EntityUid ghostRole = default!;
- EntityUid ghost = default!;
- EntityUid mindId = default!;
- MindComponent mind = default!;
- var player = playerMan.Sessions.Single();
- await server.WaitAssertion(() =>
- {
- // entity = entMan.SpawnEntity(null, new MapCoordinates());
- // var mindComp = entMan.EnsureComponent<MindContainerComponent>(entity);
- // mind = mindSystem.CreateMind(player.UserId, "Mindy McThinker");
- //
- // Assert.That(mind.UserId, Is.EqualTo(player.UserId));
- //
- // mindSystem.TransferTo(mind, entity);
- // Assert.That(mindSystem.GetMind(entity, mindComp), Is.EqualTo(mind));
- var data = player.ContentData();
- Assert.That(data?.Mind, Is.Not.EqualTo(null));
- mindId = data!.Mind!.Value;
- mind = entMan.GetComponent<MindComponent>(mindId);
- Assert.That(mind.OwnedEntity, Is.Not.Null);
- ghostRole = entMan.SpawnEntity("GhostRoleTestEntity", MapCoordinates.Nullspace);
- });
- await pair.RunTicksSync(20);
- await server.WaitAssertion(() =>
- {
- serverConsole.ExecuteCommand(player, "aghost");
- });
- await pair.RunTicksSync(20);
- await server.WaitAssertion(() =>
- {
- var id = entMan.GetComponent<GhostRoleComponent>(ghostRole).Identifier;
- entMan.EntitySysManager.GetEntitySystem<GhostRoleSystem>().Takeover(player, id);
- });
- await pair.RunTicksSync(20);
- await server.WaitAssertion(() =>
- {
- var data = entMan.GetComponent<MindComponent>(player.ContentData()!.Mind!.Value);
- Assert.That(data.OwnedEntity, Is.EqualTo(ghostRole));
- serverConsole.ExecuteCommand(player, "aghost");
- Assert.That(player.AttachedEntity, Is.Not.Null);
- ghost = player.AttachedEntity!.Value;
- });
- await pair.RunTicksSync(20);
- await server.WaitAssertion(() =>
- {
- Assert.That(player.AttachedEntity, Is.Not.Null);
- Assert.That(player.AttachedEntity!.Value, Is.EqualTo(ghost));
- });
- await pair.CleanReturnAsync();
- }
- }
|