using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.EntitySystems.Click; using Content.Shared.Interfaces.GameObjects.Components; using NUnit.Framework; using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Reflection; using System.Threading.Tasks; namespace Content.IntegrationTests.Tests.Interaction.Click { [TestFixture] [TestOf(typeof(InteractionSystem))] public class InteractionSystemTests : ContentIntegrationTest { [Reflect(false)] private class TestAttackEntitySystem : EntitySystem { public EntityEventHandler ClickAttackEvent; public EntityEventHandler InteractUsingEvent; public EntityEventHandler InteractHandEvent; public override void Initialize() { base.Initialize(); SubscribeLocalEvent((e) => ClickAttackEvent?.Invoke(e)); SubscribeLocalEvent((e) => InteractUsingEvent?.Invoke(e)); SubscribeLocalEvent((e) => InteractHandEvent?.Invoke(e)); } } [Test] public async Task InsideContainerInteractionBlockTest() { var server = StartServerDummyTicker(new ServerContentIntegrationOption { ContentBeforeIoC = () => { IoCManager.Resolve().LoadExtraSystemType(); } }); await server.WaitIdleAsync(); var entityManager = server.ResolveDependency(); var mapManager = server.ResolveDependency(); IEntity origin = null; IEntity other = null; IEntity containerEntity = null; IContainer container = null; server.Assert(() => { var mapId = mapManager.CreateMap(); var coordinates = new MapCoordinates(Vector2.Zero, mapId); origin = entityManager.SpawnEntity(null, coordinates); origin.EnsureComponent().AddHand("hand"); other = entityManager.SpawnEntity(null, coordinates); containerEntity = entityManager.SpawnEntity(null, coordinates); container = ContainerHelpers.EnsureContainer(containerEntity, "InteractionTestContainer"); }); await server.WaitIdleAsync(); var attack = false; var interactUsing = false; var interactHand = false; server.Assert(() => { Assert.That(container.Insert(origin)); Assert.That(origin.Transform.Parent!.Owner, Is.EqualTo(containerEntity)); var entitySystemManager = IoCManager.Resolve(); Assert.That(entitySystemManager.TryGetEntitySystem(out var interactionSystem)); Assert.That(entitySystemManager.TryGetEntitySystem(out var testAttackEntitySystem)); testAttackEntitySystem.ClickAttackEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(containerEntity.Uid)); attack = true; }; testAttackEntitySystem.InteractUsingEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(containerEntity)); interactUsing = true; }; testAttackEntitySystem.InteractHandEvent = (ev) => { Assert.That(ev.Target, Is.EqualTo(containerEntity)); interactHand = true; }; interactionSystem.DoAttack(origin, other.Transform.Coordinates, false, other.Uid); interactionSystem.UserInteraction(origin, other.Transform.Coordinates, other.Uid); Assert.That(attack, Is.False); Assert.That(interactUsing, Is.False); Assert.That(interactHand, Is.False); interactionSystem.DoAttack(origin, containerEntity.Transform.Coordinates, false, containerEntity.Uid); interactionSystem.UserInteraction(origin, containerEntity.Transform.Coordinates, containerEntity.Uid); Assert.That(attack); Assert.That(interactUsing, Is.False); Assert.That(interactHand); var itemEntity = entityManager.SpawnEntity(null, origin.Transform.Coordinates); var item = itemEntity.EnsureComponent(); Assert.That(origin.TryGetComponent(out var hands)); hands.PutInHand(item); interactionSystem.UserInteraction(origin, other.Transform.Coordinates, other.Uid); Assert.That(interactUsing, Is.False); interactionSystem.UserInteraction(origin, containerEntity.Transform.Coordinates, containerEntity.Uid); Assert.That(interactUsing, Is.True); }); } } }