DestructibleDamageTypeTest.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using Content.Server.Destructible.Thresholds.Triggers;
  2. using Content.Shared.Damage;
  3. using Content.Shared.Damage.Prototypes;
  4. using Robust.Shared.GameObjects;
  5. using Robust.Shared.Prototypes;
  6. using static Content.IntegrationTests.Tests.Destructible.DestructibleTestPrototypes;
  7. namespace Content.IntegrationTests.Tests.Destructible
  8. {
  9. [TestFixture]
  10. [TestOf(typeof(DamageTypeTrigger))]
  11. [TestOf(typeof(AndTrigger))]
  12. public sealed class DestructibleDamageTypeTest
  13. {
  14. [Test]
  15. public async Task Test()
  16. {
  17. await using var pair = await PoolManager.GetServerClient();
  18. var server = pair.Server;
  19. var testMap = await pair.CreateTestMap();
  20. var sEntityManager = server.ResolveDependency<IEntityManager>();
  21. var sEntitySystemManager = server.ResolveDependency<IEntitySystemManager>();
  22. var protoManager = server.ResolveDependency<IPrototypeManager>();
  23. EntityUid sDestructibleEntity = default;
  24. DamageableComponent sDamageableComponent = null;
  25. TestDestructibleListenerSystem sTestThresholdListenerSystem = null;
  26. DamageableSystem sDamageableSystem = null;
  27. await server.WaitPost(() =>
  28. {
  29. var coordinates = testMap.GridCoords;
  30. sDestructibleEntity = sEntityManager.SpawnEntity(DestructibleDamageTypeEntityId, coordinates);
  31. sDamageableComponent = sEntityManager.GetComponent<DamageableComponent>(sDestructibleEntity);
  32. sTestThresholdListenerSystem = sEntitySystemManager.GetEntitySystem<TestDestructibleListenerSystem>();
  33. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  34. sDamageableSystem = sEntitySystemManager.GetEntitySystem<DamageableSystem>();
  35. });
  36. await server.WaitRunTicks(5);
  37. await server.WaitAssertion(() =>
  38. {
  39. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  40. });
  41. await server.WaitAssertion(() =>
  42. {
  43. var bluntDamageType = protoManager.Index<DamageTypePrototype>("TestBlunt");
  44. var slashDamageType = protoManager.Index<DamageTypePrototype>("TestSlash");
  45. var bluntDamage = new DamageSpecifier(bluntDamageType, 5);
  46. var slashDamage = new DamageSpecifier(slashDamageType, 5);
  47. // Raise blunt damage to 5
  48. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage, true);
  49. // No thresholds reached yet, the earliest one is at 10 damage
  50. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  51. // Raise blunt damage to 10
  52. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage, true);
  53. // No threshold reached, slash needs to be 10 as well
  54. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  55. // Raise slash damage to 10
  56. sDamageableSystem.TryChangeDamage(sDestructibleEntity, slashDamage * 2, true);
  57. // One threshold reached, blunt 10 + slash 10
  58. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Has.Count.EqualTo(1));
  59. // Threshold blunt 10 + slash 10
  60. var msg = sTestThresholdListenerSystem.ThresholdsReached[0];
  61. var threshold = msg.Threshold;
  62. // Check that it matches the YAML prototype
  63. Assert.Multiple(() =>
  64. {
  65. Assert.That(threshold.Behaviors, Is.Empty);
  66. Assert.That(threshold.Trigger, Is.Not.Null);
  67. Assert.That(threshold.Triggered, Is.True);
  68. Assert.That(threshold.Trigger, Is.InstanceOf<AndTrigger>());
  69. });
  70. var trigger = (AndTrigger) threshold.Trigger;
  71. Assert.Multiple(() =>
  72. {
  73. Assert.That(trigger.Triggers[0], Is.InstanceOf<DamageTypeTrigger>());
  74. Assert.That(trigger.Triggers[1], Is.InstanceOf<DamageTypeTrigger>());
  75. });
  76. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  77. // Raise blunt damage to 20
  78. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * 2, true);
  79. // No new thresholds reached
  80. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  81. // Raise slash damage to 20
  82. sDamageableSystem.TryChangeDamage(sDestructibleEntity, slashDamage * 2, true);
  83. // No new thresholds reached
  84. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  85. // Lower blunt damage to 0
  86. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * -4, true);
  87. // No new thresholds reached, healing should not trigger it
  88. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  89. // Raise blunt damage back up to 10
  90. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * 2, true);
  91. // 10 blunt + 10 slash threshold reached, blunt was healed and brought back to its threshold amount and slash stayed the same
  92. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Has.Count.EqualTo(1));
  93. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  94. // Heal both types of damage to 0
  95. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * -2, true);
  96. sDamageableSystem.TryChangeDamage(sDestructibleEntity, slashDamage * -4, true);
  97. // No new thresholds reached, healing should not trigger it
  98. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  99. // Raise blunt damage to 10
  100. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * 2, true);
  101. // No new thresholds reached
  102. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  103. // Raise slash damage to 10
  104. sDamageableSystem.TryChangeDamage(sDestructibleEntity, slashDamage * 2, true);
  105. // Both types of damage were healed and then raised again, the threshold should have been reached as triggers once is default false
  106. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Has.Count.EqualTo(1));
  107. // Threshold blunt 10 + slash 10
  108. msg = sTestThresholdListenerSystem.ThresholdsReached[0];
  109. threshold = msg.Threshold;
  110. // Check that it matches the YAML prototype
  111. Assert.Multiple(() =>
  112. {
  113. Assert.That(threshold.Behaviors, Is.Empty);
  114. Assert.That(threshold.Trigger, Is.Not.Null);
  115. Assert.That(threshold.Triggered, Is.True);
  116. Assert.That(threshold.Trigger, Is.InstanceOf<AndTrigger>());
  117. });
  118. trigger = (AndTrigger) threshold.Trigger;
  119. Assert.Multiple(() =>
  120. {
  121. Assert.That(trigger.Triggers[0], Is.InstanceOf<DamageTypeTrigger>());
  122. Assert.That(trigger.Triggers[1], Is.InstanceOf<DamageTypeTrigger>());
  123. });
  124. sTestThresholdListenerSystem.ThresholdsReached.Clear();
  125. // Change triggers once to true
  126. threshold.TriggersOnce = true;
  127. // Heal blunt and slash back to 0
  128. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * -2, true);
  129. sDamageableSystem.TryChangeDamage(sDestructibleEntity, slashDamage * -2, true);
  130. // No new thresholds reached from healing
  131. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  132. // Raise blunt damage to 10
  133. sDamageableSystem.TryChangeDamage(sDestructibleEntity, bluntDamage * 2, true);
  134. // No new thresholds reached
  135. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  136. // Raise slash damage to 10
  137. sDamageableSystem.TryChangeDamage(sDestructibleEntity, slashDamage * 2, true);
  138. // No new thresholds reached as triggers once is set to true and it already triggered before
  139. Assert.That(sTestThresholdListenerSystem.ThresholdsReached, Is.Empty);
  140. });
  141. await pair.CleanReturnAsync();
  142. }
  143. }
  144. }