| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414 |
- #nullable enable annotations
- using System.Numerics;
- using Content.Server.Interaction;
- using Content.Shared.Hands.Components;
- using Content.Shared.Hands.EntitySystems;
- using Content.Shared.Interaction;
- using Content.Shared.Interaction.Components;
- using Content.Shared.Item;
- using Robust.Shared.Containers;
- using Robust.Shared.GameObjects;
- using Robust.Shared.Map;
- using Robust.Shared.Maths;
- using Robust.Shared.Reflection;
- namespace Content.IntegrationTests.Tests.Interaction.Click
- {
- [TestFixture]
- [TestOf(typeof(InteractionSystem))]
- public sealed class InteractionSystemTests
- {
- [TestPrototypes]
- private const string Prototypes = @"
- - type: entity
- id: DummyDebugWall
- components:
- - type: Physics
- bodyType: Dynamic
- - type: Fixtures
- fixtures:
- fix1:
- shape:
- !type:PhysShapeAabb
- bounds: ""-0.25,-0.25,0.25,0.25""
- layer:
- - MobMask
- mask:
- - MobMask
- ";
- [Test]
- public async Task InteractionTest()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var sEntities = server.ResolveDependency<IEntityManager>();
- var mapManager = server.ResolveDependency<IMapManager>();
- var sysMan = server.ResolveDependency<IEntitySystemManager>();
- var handSys = sysMan.GetEntitySystem<SharedHandsSystem>();
- var map = await pair.CreateTestMap();
- var mapId = map.MapId;
- var coords = map.MapCoords;
- await server.WaitIdleAsync();
- EntityUid user = default;
- EntityUid target = default;
- EntityUid item = default;
- await server.WaitAssertion(() =>
- {
- user = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<HandsComponent>(user);
- sEntities.EnsureComponent<ComplexInteractionComponent>(user);
- handSys.AddHand(user, "hand", HandLocation.Left);
- target = sEntities.SpawnEntity(null, coords);
- item = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<ItemComponent>(item);
- });
- await server.WaitRunTicks(1);
- var entitySystemManager = server.ResolveDependency<IEntitySystemManager>();
- InteractionSystem interactionSystem = default!;
- TestInteractionSystem testInteractionSystem = default!;
- Assert.Multiple(() =>
- {
- Assert.That(entitySystemManager.TryGetEntitySystem(out interactionSystem));
- Assert.That(entitySystemManager.TryGetEntitySystem(out testInteractionSystem));
- });
- var interactUsing = false;
- var interactHand = false;
- await server.WaitAssertion(() =>
- {
- testInteractionSystem.InteractUsingEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactUsing = true; };
- testInteractionSystem.InteractHandEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactHand = true; };
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.Multiple(() =>
- {
- Assert.That(interactUsing, Is.False);
- Assert.That(interactHand);
- });
- Assert.That(handSys.TryPickup(user, item));
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.That(interactUsing);
- });
- testInteractionSystem.ClearHandlers();
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task InteractionObstructionTest()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var sEntities = server.ResolveDependency<IEntityManager>();
- var mapManager = server.ResolveDependency<IMapManager>();
- var sysMan = server.ResolveDependency<IEntitySystemManager>();
- var handSys = sysMan.GetEntitySystem<SharedHandsSystem>();
- var map = await pair.CreateTestMap();
- var mapId = map.MapId;
- var coords = map.MapCoords;
- await server.WaitIdleAsync();
- EntityUid user = default;
- EntityUid target = default;
- EntityUid item = default;
- EntityUid wall = default;
- await server.WaitAssertion(() =>
- {
- user = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<HandsComponent>(user);
- handSys.AddHand(user, "hand", HandLocation.Left);
- target = sEntities.SpawnEntity(null, new MapCoordinates(new Vector2(1.9f, 0), mapId));
- item = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<ItemComponent>(item);
- wall = sEntities.SpawnEntity("DummyDebugWall", new MapCoordinates(new Vector2(1, 0), sEntities.GetComponent<TransformComponent>(user).MapID));
- });
- await server.WaitRunTicks(1);
- var entitySystemManager = server.ResolveDependency<IEntitySystemManager>();
- InteractionSystem interactionSystem = default!;
- TestInteractionSystem testInteractionSystem = default!;
- Assert.Multiple(() =>
- {
- Assert.That(entitySystemManager.TryGetEntitySystem(out interactionSystem));
- Assert.That(entitySystemManager.TryGetEntitySystem(out testInteractionSystem));
- });
- var interactUsing = false;
- var interactHand = false;
- await server.WaitAssertion(() =>
- {
- testInteractionSystem.InteractUsingEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactUsing = true; };
- testInteractionSystem.InteractHandEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactHand = true; };
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.Multiple(() =>
- {
- Assert.That(interactUsing, Is.False);
- Assert.That(interactHand, Is.False);
- });
- Assert.That(handSys.TryPickup(user, item));
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.That(interactUsing, Is.False);
- });
- testInteractionSystem.ClearHandlers();
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task InteractionInRangeTest()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var sEntities = server.ResolveDependency<IEntityManager>();
- var mapManager = server.ResolveDependency<IMapManager>();
- var sysMan = server.ResolveDependency<IEntitySystemManager>();
- var handSys = sysMan.GetEntitySystem<SharedHandsSystem>();
- var map = await pair.CreateTestMap();
- var mapId = map.MapId;
- var coords = map.MapCoords;
- await server.WaitIdleAsync();
- EntityUid user = default;
- EntityUid target = default;
- EntityUid item = default;
- await server.WaitAssertion(() =>
- {
- user = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<HandsComponent>(user);
- sEntities.EnsureComponent<ComplexInteractionComponent>(user);
- handSys.AddHand(user, "hand", HandLocation.Left);
- target = sEntities.SpawnEntity(null, new MapCoordinates(new Vector2(SharedInteractionSystem.InteractionRange - 0.1f, 0), mapId));
- item = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<ItemComponent>(item);
- });
- await server.WaitRunTicks(1);
- var entitySystemManager = server.ResolveDependency<IEntitySystemManager>();
- InteractionSystem interactionSystem = default!;
- TestInteractionSystem testInteractionSystem = default!;
- Assert.Multiple(() =>
- {
- Assert.That(entitySystemManager.TryGetEntitySystem(out interactionSystem));
- Assert.That(entitySystemManager.TryGetEntitySystem(out testInteractionSystem));
- });
- var interactUsing = false;
- var interactHand = false;
- await server.WaitAssertion(() =>
- {
- testInteractionSystem.InteractUsingEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactUsing = true; };
- testInteractionSystem.InteractHandEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactHand = true; };
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.Multiple(() =>
- {
- Assert.That(interactUsing, Is.False);
- Assert.That(interactHand);
- });
- Assert.That(handSys.TryPickup(user, item));
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.That(interactUsing);
- });
- testInteractionSystem.ClearHandlers();
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task InteractionOutOfRangeTest()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var sEntities = server.ResolveDependency<IEntityManager>();
- var mapManager = server.ResolveDependency<IMapManager>();
- var sysMan = server.ResolveDependency<IEntitySystemManager>();
- var handSys = sysMan.GetEntitySystem<SharedHandsSystem>();
- var map = await pair.CreateTestMap();
- var mapId = map.MapId;
- var coords = map.MapCoords;
- await server.WaitIdleAsync();
- EntityUid user = default;
- EntityUid target = default;
- EntityUid item = default;
- await server.WaitAssertion(() =>
- {
- user = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<HandsComponent>(user);
- handSys.AddHand(user, "hand", HandLocation.Left);
- target = sEntities.SpawnEntity(null, new MapCoordinates(new Vector2(SharedInteractionSystem.InteractionRange + 0.01f, 0), mapId));
- item = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<ItemComponent>(item);
- });
- await server.WaitRunTicks(1);
- var entitySystemManager = server.ResolveDependency<IEntitySystemManager>();
- InteractionSystem interactionSystem = default!;
- TestInteractionSystem testInteractionSystem = default!;
- Assert.Multiple(() =>
- {
- Assert.That(entitySystemManager.TryGetEntitySystem(out interactionSystem));
- Assert.That(entitySystemManager.TryGetEntitySystem(out testInteractionSystem));
- });
- var interactUsing = false;
- var interactHand = false;
- await server.WaitAssertion(() =>
- {
- testInteractionSystem.InteractUsingEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactUsing = true; };
- testInteractionSystem.InteractHandEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(target)); interactHand = true; };
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.Multiple(() =>
- {
- Assert.That(interactUsing, Is.False);
- Assert.That(interactHand, Is.False);
- });
- Assert.That(handSys.TryPickup(user, item));
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.That(interactUsing, Is.False);
- });
- testInteractionSystem.ClearHandlers();
- await pair.CleanReturnAsync();
- }
- [Test]
- public async Task InsideContainerInteractionBlockTest()
- {
- await using var pair = await PoolManager.GetServerClient();
- var server = pair.Server;
- var sEntities = server.ResolveDependency<IEntityManager>();
- var mapManager = server.ResolveDependency<IMapManager>();
- var sysMan = server.ResolveDependency<IEntitySystemManager>();
- var handSys = sysMan.GetEntitySystem<SharedHandsSystem>();
- var conSystem = sysMan.GetEntitySystem<SharedContainerSystem>();
- var map = await pair.CreateTestMap();
- var mapId = map.MapId;
- var coords = map.MapCoords;
- await server.WaitIdleAsync();
- EntityUid user = default;
- EntityUid target = default;
- EntityUid item = default;
- EntityUid containerEntity = default;
- BaseContainer container = null;
- await server.WaitAssertion(() =>
- {
- user = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<HandsComponent>(user);
- sEntities.EnsureComponent<ComplexInteractionComponent>(user);
- handSys.AddHand(user, "hand", HandLocation.Left);
- target = sEntities.SpawnEntity(null, coords);
- item = sEntities.SpawnEntity(null, coords);
- sEntities.EnsureComponent<ItemComponent>(item);
- containerEntity = sEntities.SpawnEntity(null, coords);
- container = conSystem.EnsureContainer<Container>(containerEntity, "InteractionTestContainer");
- });
- await server.WaitRunTicks(1);
- var entitySystemManager = server.ResolveDependency<IEntitySystemManager>();
- InteractionSystem interactionSystem = default!;
- TestInteractionSystem testInteractionSystem = default!;
- Assert.Multiple(() =>
- {
- Assert.That(entitySystemManager.TryGetEntitySystem(out interactionSystem));
- Assert.That(entitySystemManager.TryGetEntitySystem(out testInteractionSystem));
- });
- await server.WaitIdleAsync();
- var interactUsing = false;
- var interactHand = false;
- await server.WaitAssertion(() =>
- {
- #pragma warning disable NUnit2045 // Interdependent assertions.
- Assert.That(conSystem.Insert(user, container));
- Assert.That(sEntities.GetComponent<TransformComponent>(user).ParentUid, Is.EqualTo(containerEntity));
- #pragma warning restore NUnit2045
- testInteractionSystem.InteractUsingEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(containerEntity)); interactUsing = true; };
- testInteractionSystem.InteractHandEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(containerEntity)); interactHand = true; };
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.Multiple(() =>
- {
- Assert.That(interactUsing, Is.False);
- Assert.That(interactHand, Is.False);
- });
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(containerEntity).Coordinates, containerEntity);
- Assert.Multiple(() =>
- {
- Assert.That(interactUsing, Is.False);
- Assert.That(interactHand);
- });
- Assert.That(handSys.TryPickup(user, item));
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(target).Coordinates, target);
- Assert.That(interactUsing, Is.False);
- interactionSystem.UserInteraction(user, sEntities.GetComponent<TransformComponent>(containerEntity).Coordinates, containerEntity);
- Assert.That(interactUsing, Is.True);
- });
- testInteractionSystem.ClearHandlers();
- await pair.CleanReturnAsync();
- }
- public sealed class TestInteractionSystem : EntitySystem
- {
- public EntityEventHandler<InteractUsingEvent>? InteractUsingEvent;
- public EntityEventHandler<InteractHandEvent>? InteractHandEvent;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<InteractUsingEvent>((e) => InteractUsingEvent?.Invoke(e));
- SubscribeLocalEvent<InteractHandEvent>((e) => InteractHandEvent?.Invoke(e));
- }
- public void ClearHandlers()
- {
- InteractUsingEvent = null;
- InteractHandEvent = null;
- }
- }
- }
- }
|