// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 GoobBot // SPDX-FileCopyrightText: 2025 Solstice // SPDX-FileCopyrightText: 2025 SolsticeOfTheWinter // SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 gluesniffler // // SPDX-License-Identifier: AGPL-3.0-or-later using System.Linq; using Content.Shared._Goobstation.Religion; using Content.Server._Goobstation.Bible; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Interaction; using Content.Shared.Inventory; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; using Content.Shared.Timing; using Content.Server.Bible.Components; using Content.Shared.Body; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; namespace Content.Server._Goobstation.Religion; public sealed class WeakToHolySystem : EntitySystem { [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly GoobBibleSystem _goobBible = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; private static readonly ProtoId DamageContainerId = "BiologicalMetaphysical"; // Delta V - Metaphysical Biological for Holy Damage public override void Initialize() { base.Initialize(); SubscribeLocalEvent(AfterBibleUse); SubscribeLocalEvent(OnInit); // DeltaV - Add damage set SubscribeLocalEvent(OnRemove); // DeltaV - Clean up on removal } // Begin DeltaV Additions - Holy Weakness private void OnInit(Entity ent, ref MapInitEvent args) { if (!TryComp(ent, out var damageable)) return; var dmg = _damageableSystem.GetPositiveDamage((ent, damageable)); _damageableSystem.ChangeDamageContainer((ent, damageable), DamageContainerId); // Delta V - Changes the DamageContainer of the Entity from (presumably) Biological to BiologicalMetaphysical. } private void OnRemove(Entity ent, ref ComponentRemove args) { if (!TryComp(ent, out var damageable)) return; if (!ent.Comp.HadHolyWeakness) { var dmg = _damageableSystem.GetPositiveDamage((ent, damageable)); dmg.DamageDict.TryGetValue("Holy", out var holyDmg); DamageSpecifier heal = new() {DamageDict = new Dictionary, FixedPoint2>() {{ "Holy", -holyDmg }}}; _damageableSystem.TryChangeDamage((ent, damageable), heal, ignoreResistances: true); } } // End DeltaV additions private void AfterBibleUse(Entity ent, ref InteractUsingEvent args) { if (!TryComp(args.Used, out var bibleComp)) return; if (!TryComp(args.Used, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((args.Used, useDelay)) || !HasComp(args.User)) return; _goobBible.TryDoSmite(args.Used, args.User, args.Target, useDelay); } #region Holy Healing public override void Update(float frameTime) { base.Update(frameTime); // Holy damage healing. var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var weakToHoly, out var body)) { if (weakToHoly.NextPassiveHealTick > _timing.CurTime) continue; weakToHoly.NextPassiveHealTick = _timing.CurTime + weakToHoly.HealTickDelay; if (!TryComp(uid, out var damageable)) continue; var dmg = _damageableSystem.GetPositiveDamage((uid, damageable)); if (TerminatingOrDeleted(uid) || !dmg.DamageDict.TryGetValue("Holy", out _)) continue; // Rune healing. if (weakToHoly.IsColliding) _damageableSystem.TryChangeDamage(uid, weakToHoly.HealAmount, ignoreResistances: true); // Passive healing. _damageableSystem.TryChangeDamage(uid, weakToHoly.PassiveAmount, ignoreResistances: true); } } #endregion }