| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- using Content.Shared.Damage;
- using Content.Shared.Damage.Prototypes;
- using Content.Shared.EntityEffects;
- using Content.Shared.FixedPoint;
- using Content.Shared.Localizations;
- using JetBrains.Annotations;
- using Robust.Shared.Prototypes;
- using System.Linq;
- using System.Text.Json.Serialization;
- using Content.Shared._Shitmed.EntityEffects.Effects; // Shitmed Change
- using Content.Shared._Shitmed.Targeting; // Shitmed Change
- using Content.Server.Temperature.Components; // Shitmed Change
- namespace Content.Server.EntityEffects.Effects
- {
- /// <summary>
- /// Default metabolism used for medicine reagents.
- /// </summary>
- [UsedImplicitly]
- public sealed partial class HealthChange : EntityEffect
- {
- /// <summary>
- /// Damage to apply every cycle. Damage Ignores resistances.
- /// </summary>
- [DataField(required: true)]
- [JsonPropertyName("damage")]
- public DamageSpecifier Damage = default!;
- /// <summary>
- /// Should this effect scale the damage by the amount of chemical in the solution?
- /// Useful for touch reactions, like styptic powder or acid.
- /// Only usable if the EntityEffectBaseArgs is an EntityEffectReagentArgs.
- /// </summary>
- [DataField]
- [JsonPropertyName("scaleByQuantity")]
- public bool ScaleByQuantity;
- [DataField]
- [JsonPropertyName("ignoreResistances")]
- public bool IgnoreResistances = true;
- protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
- {
- var damages = new List<string>();
- var heals = false;
- var deals = false;
- var damageSpec = new DamageSpecifier(Damage);
- var universalReagentDamageModifier = entSys.GetEntitySystem<DamageableSystem>().UniversalReagentDamageModifier;
- var universalReagentHealModifier = entSys.GetEntitySystem<DamageableSystem>().UniversalReagentHealModifier;
- if (universalReagentDamageModifier != 1 || universalReagentHealModifier != 1)
- {
- foreach (var (type, val) in damageSpec.DamageDict)
- {
- if (val < 0f)
- {
- damageSpec.DamageDict[type] = val * universalReagentHealModifier;
- }
- if (val > 0f)
- {
- damageSpec.DamageDict[type] = val * universalReagentDamageModifier;
- }
- }
- }
- damageSpec = entSys.GetEntitySystem<DamageableSystem>().ApplyUniversalAllModifiers(damageSpec);
- foreach (var group in prototype.EnumeratePrototypes<DamageGroupPrototype>())
- {
- if (!damageSpec.TryGetDamageInGroup(group, out var amount))
- continue;
- var relevantTypes = damageSpec.DamageDict
- .Where(x => x.Value != FixedPoint2.Zero && group.DamageTypes.Contains(x.Key)).ToList();
- if (relevantTypes.Count != group.DamageTypes.Count)
- continue;
- var sum = FixedPoint2.Zero;
- foreach (var type in group.DamageTypes)
- {
- sum += damageSpec.DamageDict.GetValueOrDefault(type);
- }
- // if the total sum of all the types equal the damage amount,
- // assume that they're evenly distributed.
- if (sum != amount)
- continue;
- var sign = FixedPoint2.Sign(amount);
- if (sign < 0)
- heals = true;
- if (sign > 0)
- deals = true;
- damages.Add(
- Loc.GetString("health-change-display",
- ("kind", group.LocalizedName),
- ("amount", MathF.Abs(amount.Float())),
- ("deltasign", sign)
- ));
- foreach (var type in group.DamageTypes)
- {
- damageSpec.DamageDict.Remove(type);
- }
- }
- foreach (var (kind, amount) in damageSpec.DamageDict)
- {
- var sign = FixedPoint2.Sign(amount);
- if (sign < 0)
- heals = true;
- if (sign > 0)
- deals = true;
- damages.Add(
- Loc.GetString("health-change-display",
- ("kind", prototype.Index<DamageTypePrototype>(kind).LocalizedName),
- ("amount", MathF.Abs(amount.Float())),
- ("deltasign", sign)
- ));
- }
- var healsordeals = heals ? (deals ? "both" : "heals") : (deals ? "deals" : "none");
- return Loc.GetString("reagent-effect-guidebook-health-change",
- ("chance", Probability),
- ("changes", ContentLocalizationManager.FormatList(damages)),
- ("healsordeals", healsordeals));
- }
- public override void Effect(EntityEffectBaseArgs args)
- {
- var scale = FixedPoint2.New(1);
- var damageSpec = new DamageSpecifier(Damage);
- if (args is EntityEffectReagentArgs reagentArgs)
- {
- scale = ScaleByQuantity ? reagentArgs.Quantity * reagentArgs.Scale : reagentArgs.Scale;
- }
- var universalReagentDamageModifier = args.EntityManager.System<DamageableSystem>().UniversalReagentDamageModifier;
- var universalReagentHealModifier = args.EntityManager.System<DamageableSystem>().UniversalReagentHealModifier;
- if (universalReagentDamageModifier != 1 || universalReagentHealModifier != 1)
- {
- foreach (var (type, val) in damageSpec.DamageDict)
- {
- if (val < 0f)
- {
- damageSpec.DamageDict[type] = val * universalReagentHealModifier;
- }
- if (val > 0f)
- {
- damageSpec.DamageDict[type] = val * universalReagentDamageModifier;
- }
- }
- }
- args.EntityManager.System<DamageableSystem>()
- .TryChangeDamage(
- args.TargetEntity,
- damageSpec * scale,
- IgnoreResistances,
- interruptsDoAfters: false,
- // Shitmed Change Start
- targetPart: TargetBodyPart.All,
- partMultiplier: 0.5f,
- canSever: false);
- // Shitmed Change End
- }
- }
- }
|