HealthChange.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. using Content.Shared.Damage;
  2. using Content.Shared.Damage.Prototypes;
  3. using Content.Shared.EntityEffects;
  4. using Content.Shared.FixedPoint;
  5. using Content.Shared.Localizations;
  6. using JetBrains.Annotations;
  7. using Robust.Shared.Prototypes;
  8. using System.Linq;
  9. using System.Text.Json.Serialization;
  10. using Content.Shared._Shitmed.EntityEffects.Effects; // Shitmed Change
  11. using Content.Shared._Shitmed.Targeting; // Shitmed Change
  12. using Content.Server.Temperature.Components; // Shitmed Change
  13. namespace Content.Server.EntityEffects.Effects
  14. {
  15. /// <summary>
  16. /// Default metabolism used for medicine reagents.
  17. /// </summary>
  18. [UsedImplicitly]
  19. public sealed partial class HealthChange : EntityEffect
  20. {
  21. /// <summary>
  22. /// Damage to apply every cycle. Damage Ignores resistances.
  23. /// </summary>
  24. [DataField(required: true)]
  25. [JsonPropertyName("damage")]
  26. public DamageSpecifier Damage = default!;
  27. /// <summary>
  28. /// Should this effect scale the damage by the amount of chemical in the solution?
  29. /// Useful for touch reactions, like styptic powder or acid.
  30. /// Only usable if the EntityEffectBaseArgs is an EntityEffectReagentArgs.
  31. /// </summary>
  32. [DataField]
  33. [JsonPropertyName("scaleByQuantity")]
  34. public bool ScaleByQuantity;
  35. [DataField]
  36. [JsonPropertyName("ignoreResistances")]
  37. public bool IgnoreResistances = true;
  38. protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
  39. {
  40. var damages = new List<string>();
  41. var heals = false;
  42. var deals = false;
  43. var damageSpec = new DamageSpecifier(Damage);
  44. var universalReagentDamageModifier = entSys.GetEntitySystem<DamageableSystem>().UniversalReagentDamageModifier;
  45. var universalReagentHealModifier = entSys.GetEntitySystem<DamageableSystem>().UniversalReagentHealModifier;
  46. if (universalReagentDamageModifier != 1 || universalReagentHealModifier != 1)
  47. {
  48. foreach (var (type, val) in damageSpec.DamageDict)
  49. {
  50. if (val < 0f)
  51. {
  52. damageSpec.DamageDict[type] = val * universalReagentHealModifier;
  53. }
  54. if (val > 0f)
  55. {
  56. damageSpec.DamageDict[type] = val * universalReagentDamageModifier;
  57. }
  58. }
  59. }
  60. damageSpec = entSys.GetEntitySystem<DamageableSystem>().ApplyUniversalAllModifiers(damageSpec);
  61. foreach (var group in prototype.EnumeratePrototypes<DamageGroupPrototype>())
  62. {
  63. if (!damageSpec.TryGetDamageInGroup(group, out var amount))
  64. continue;
  65. var relevantTypes = damageSpec.DamageDict
  66. .Where(x => x.Value != FixedPoint2.Zero && group.DamageTypes.Contains(x.Key)).ToList();
  67. if (relevantTypes.Count != group.DamageTypes.Count)
  68. continue;
  69. var sum = FixedPoint2.Zero;
  70. foreach (var type in group.DamageTypes)
  71. {
  72. sum += damageSpec.DamageDict.GetValueOrDefault(type);
  73. }
  74. // if the total sum of all the types equal the damage amount,
  75. // assume that they're evenly distributed.
  76. if (sum != amount)
  77. continue;
  78. var sign = FixedPoint2.Sign(amount);
  79. if (sign < 0)
  80. heals = true;
  81. if (sign > 0)
  82. deals = true;
  83. damages.Add(
  84. Loc.GetString("health-change-display",
  85. ("kind", group.LocalizedName),
  86. ("amount", MathF.Abs(amount.Float())),
  87. ("deltasign", sign)
  88. ));
  89. foreach (var type in group.DamageTypes)
  90. {
  91. damageSpec.DamageDict.Remove(type);
  92. }
  93. }
  94. foreach (var (kind, amount) in damageSpec.DamageDict)
  95. {
  96. var sign = FixedPoint2.Sign(amount);
  97. if (sign < 0)
  98. heals = true;
  99. if (sign > 0)
  100. deals = true;
  101. damages.Add(
  102. Loc.GetString("health-change-display",
  103. ("kind", prototype.Index<DamageTypePrototype>(kind).LocalizedName),
  104. ("amount", MathF.Abs(amount.Float())),
  105. ("deltasign", sign)
  106. ));
  107. }
  108. var healsordeals = heals ? (deals ? "both" : "heals") : (deals ? "deals" : "none");
  109. return Loc.GetString("reagent-effect-guidebook-health-change",
  110. ("chance", Probability),
  111. ("changes", ContentLocalizationManager.FormatList(damages)),
  112. ("healsordeals", healsordeals));
  113. }
  114. public override void Effect(EntityEffectBaseArgs args)
  115. {
  116. var scale = FixedPoint2.New(1);
  117. var damageSpec = new DamageSpecifier(Damage);
  118. if (args is EntityEffectReagentArgs reagentArgs)
  119. {
  120. scale = ScaleByQuantity ? reagentArgs.Quantity * reagentArgs.Scale : reagentArgs.Scale;
  121. }
  122. var universalReagentDamageModifier = args.EntityManager.System<DamageableSystem>().UniversalReagentDamageModifier;
  123. var universalReagentHealModifier = args.EntityManager.System<DamageableSystem>().UniversalReagentHealModifier;
  124. if (universalReagentDamageModifier != 1 || universalReagentHealModifier != 1)
  125. {
  126. foreach (var (type, val) in damageSpec.DamageDict)
  127. {
  128. if (val < 0f)
  129. {
  130. damageSpec.DamageDict[type] = val * universalReagentHealModifier;
  131. }
  132. if (val > 0f)
  133. {
  134. damageSpec.DamageDict[type] = val * universalReagentDamageModifier;
  135. }
  136. }
  137. }
  138. args.EntityManager.System<DamageableSystem>()
  139. .TryChangeDamage(
  140. args.TargetEntity,
  141. damageSpec * scale,
  142. IgnoreResistances,
  143. interruptsDoAfters: false,
  144. // Shitmed Change Start
  145. targetPart: TargetBodyPart.All,
  146. partMultiplier: 0.5f,
  147. canSever: false);
  148. // Shitmed Change End
  149. }
  150. }
  151. }