HandTests.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System.Linq;
  2. using Content.Server.Storage.EntitySystems;
  3. using Content.Shared.Hands.Components;
  4. using Content.Shared.Hands.EntitySystems;
  5. using Robust.Server.GameObjects;
  6. using Robust.Server.Player;
  7. using Robust.Shared.Containers;
  8. using Robust.Shared.GameObjects;
  9. namespace Content.IntegrationTests.Tests.Hands;
  10. [TestFixture]
  11. public sealed class HandTests
  12. {
  13. [TestPrototypes]
  14. private const string Prototypes = @"
  15. - type: entity
  16. id: TestPickUpThenDropInContainerTestBox
  17. name: box
  18. components:
  19. - type: EntityStorage
  20. - type: ContainerContainer
  21. containers:
  22. entity_storage: !type:Container
  23. ";
  24. [Test]
  25. public async Task TestPickupDrop()
  26. {
  27. await using var pair = await PoolManager.GetServerClient(new PoolSettings
  28. {
  29. Connected = true,
  30. DummyTicker = false
  31. });
  32. var server = pair.Server;
  33. var entMan = server.ResolveDependency<IEntityManager>();
  34. var playerMan = server.ResolveDependency<IPlayerManager>();
  35. var mapSystem = server.System<SharedMapSystem>();
  36. var sys = entMan.System<SharedHandsSystem>();
  37. var tSys = entMan.System<TransformSystem>();
  38. var data = await pair.CreateTestMap();
  39. await pair.RunTicksSync(5);
  40. EntityUid item = default;
  41. EntityUid player = default;
  42. HandsComponent hands = default!;
  43. await server.WaitPost(() =>
  44. {
  45. player = playerMan.Sessions.First().AttachedEntity!.Value;
  46. var xform = entMan.GetComponent<TransformComponent>(player);
  47. item = entMan.SpawnEntity("Crowbar", tSys.GetMapCoordinates(player, xform: xform));
  48. hands = entMan.GetComponent<HandsComponent>(player);
  49. sys.TryPickup(player, item, hands.ActiveHand!);
  50. });
  51. // run ticks here is important, as errors may happen within the container system's frame update methods.
  52. await pair.RunTicksSync(5);
  53. Assert.That(hands.ActiveHandEntity, Is.EqualTo(item));
  54. await server.WaitPost(() =>
  55. {
  56. sys.TryDrop(player, item, null!);
  57. });
  58. await pair.RunTicksSync(5);
  59. Assert.That(hands.ActiveHandEntity, Is.Null);
  60. await server.WaitPost(() => mapSystem.DeleteMap(data.MapId));
  61. await pair.CleanReturnAsync();
  62. }
  63. [Test]
  64. public async Task TestPickUpThenDropInContainer()
  65. {
  66. await using var pair = await PoolManager.GetServerClient(new PoolSettings
  67. {
  68. Connected = true,
  69. DummyTicker = false
  70. });
  71. var server = pair.Server;
  72. var map = await pair.CreateTestMap();
  73. await pair.RunTicksSync(5);
  74. var entMan = server.ResolveDependency<IEntityManager>();
  75. var playerMan = server.ResolveDependency<IPlayerManager>();
  76. var mapSystem = server.System<SharedMapSystem>();
  77. var sys = entMan.System<SharedHandsSystem>();
  78. var tSys = entMan.System<TransformSystem>();
  79. var containerSystem = server.System<SharedContainerSystem>();
  80. EntityUid item = default;
  81. EntityUid box = default;
  82. EntityUid player = default;
  83. HandsComponent hands = default!;
  84. // spawn the elusive box and crowbar at the coordinates
  85. await server.WaitPost(() => box = server.EntMan.SpawnEntity("TestPickUpThenDropInContainerTestBox", map.GridCoords));
  86. await server.WaitPost(() => item = server.EntMan.SpawnEntity("Crowbar", map.GridCoords));
  87. // place the player at the exact same coordinates and have them grab the crowbar
  88. await server.WaitPost(() =>
  89. {
  90. player = playerMan.Sessions.First().AttachedEntity!.Value;
  91. tSys.PlaceNextTo(player, item);
  92. hands = entMan.GetComponent<HandsComponent>(player);
  93. sys.TryPickup(player, item, hands.ActiveHand!);
  94. });
  95. await pair.RunTicksSync(5);
  96. Assert.That(hands.ActiveHandEntity, Is.EqualTo(item));
  97. // Open then close the box to place the player, who is holding the crowbar, inside of it
  98. var storage = server.System<EntityStorageSystem>();
  99. await server.WaitPost(() =>
  100. {
  101. storage.OpenStorage(box);
  102. storage.CloseStorage(box);
  103. });
  104. await pair.RunTicksSync(5);
  105. Assert.That(containerSystem.IsEntityInContainer(player), Is.True);
  106. // Dropping the item while the player is inside the box should cause the item
  107. // to also be inside the same container the player is in now,
  108. // with the item not being in the player's hands
  109. await server.WaitPost(() =>
  110. {
  111. sys.TryDrop(player, item, null!);
  112. });
  113. await pair.RunTicksSync(5);
  114. var xform = entMan.GetComponent<TransformComponent>(player);
  115. var itemXform = entMan.GetComponent<TransformComponent>(item);
  116. Assert.That(hands.ActiveHandEntity, Is.Not.EqualTo(item));
  117. Assert.That(containerSystem.IsInSameOrNoContainer((player, xform), (item, itemXform)));
  118. await server.WaitPost(() => mapSystem.DeleteMap(map.MapId));
  119. await pair.CleanReturnAsync();
  120. }
  121. }