// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 Aviu00 <93730715+Aviu00@users.noreply.github.com> // SPDX-FileCopyrightText: 2025 Misandry // SPDX-FileCopyrightText: 2025 gus // // SPDX-License-Identifier: AGPL-3.0-or-later using Content.Server._Shitcode.Wizard.Components; using Content.Server.Temperature.Components; using Content.Server.Temperature.Systems; using Content.Shared._Shitcode.Wizard.Traps; using Content.Shared.Damage; using Content.Shared.Projectiles; using Content.Shared.Temperature; using Content.Shared.Whitelist; namespace Content.Server._Shitcode.Wizard.Systems; public sealed class IceCubeSystem : SharedIceCubeSystem { [Dependency] private readonly TemperatureSystem _temperature = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnTemperatureChange); SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnHit); } private void OnHit(Entity ent, ref ProjectileHitEvent args) { if (_whitelist.IsValid(ent.Comp.Whitelist, args.Target)) EnsureComp(args.Target); } private void OnDamageChanged(Entity ent, ref DamageChangedEvent args) { var (uid, comp) = ent; if (!TryComp(uid, out TemperatureComponent? temperature)) return; if (args is not { DamageIncreased: true, DamageDelta: not null } || !args.DamageDelta.DamageDict.TryGetValue("Heat", out var heat)) return; _temperature.ForceChangeTemperature(uid, MathF.Min(comp.UnfreezeTemperatureThreshold + 10f, temperature.CurrentTemperature + heat.Float() * comp.TemperaturePerHeatDamageIncrease), temperature); } private void OnTemperatureChange(Entity ent, ref OnTemperatureChangeEvent args) { if (args.TemperatureDelta > 0f && args.CurrentTemperature > ent.Comp.UnfreezeTemperatureThreshold) RemCompDeferred(ent.Owner, ent.Comp); } protected override void Startup(Entity ent) { base.Startup(ent); var (uid, comp) = ent; if (!TryComp(uid, out TemperatureComponent? temperature)) return; _temperature.ForceChangeTemperature(uid, MathF.Min(temperature.CurrentTemperature, comp.FrozenTemperature), temperature); } protected override void Shutdown(Entity ent) { base.Shutdown(ent); var (uid, comp) = ent; if (!TryComp(uid, out TemperatureComponent? temperature)) return; _temperature.ForceChangeTemperature(uid, MathF.Max(temperature.CurrentTemperature, comp.UnfrozenTemperature), temperature); } }