using Content.Server._CP14.MagicEnergy.Components; using Content.Shared._CP14.MagicEnergy.Components; using Content.Shared.Damage; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Robust.Shared.Map.Components; namespace Content.Server._CP14.MagicEnergy; public partial class CP14MagicEnergySystem { [Dependency] private readonly MobStateSystem _mobState = default!; private void InitializeDraw() { SubscribeLocalEvent(OnDrawMapInit); SubscribeLocalEvent(OnDamageChanged); } private void OnDamageChanged(Entity ent, ref DamageChangedEvent args) { if (args.DamageDelta is null || !args.DamageIncreased) return; foreach (var dict in args.DamageDelta.DamageDict) { if (dict.Value <= 0) continue; if (!ent.Comp.Damage.TryGetValue(dict.Key, out var modifier)) continue; ChangeEnergy(ent, modifier * dict.Value, out _, out _, safe: true); } } private void OnDrawMapInit(Entity ent, ref MapInitEvent args) { ent.Comp.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(ent.Comp.Delay); } private void UpdateDraw(float frameTime) { UpdateEnergyContainer(); UpdateEnergyCrystalSlot(); } private void UpdateEnergyContainer() { var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var draw, out var magicContainer)) { if (!draw.Enable) continue; if (draw.NextUpdateTime >= _gameTiming.CurTime) continue; if (TryComp(uid, out var mobState) && !_mobState.IsAlive(uid, mobState)) continue; draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay); ChangeEnergy(uid, draw.Energy, out _, out _, magicContainer, draw.Safe); } var query2 = EntityQueryEnumerator(); while (query2.MoveNext(out var uid, out var draw, out var magicContainer)) { if (draw.NextUpdateTime >= _gameTiming.CurTime) continue; if (TryComp(uid, out var mobState) && !_mobState.IsAlive(uid, mobState)) continue; draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay); var daylight = false; //if (TryComp(Transform(uid).MapUid, out var mapLight)) //{ // var color = mapLight.AmbientLightColor; // var medium = (color.R + color.G + color.B) / 3f; // // if (medium > draw.LightThreshold) // daylight = true; //} ChangeEnergy(uid, daylight ? draw.DaylightEnergy : draw.DarknessEnergy, out _, out _, magicContainer, true); } } private void UpdateEnergyCrystalSlot() { var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var draw, out var slot)) { if (!draw.Enable) continue; if (draw.NextUpdateTime >= _gameTiming.CurTime) continue; draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay); if (!_magicSlot.TryGetEnergyCrystalFromSlot(uid, out var energyEnt, out var energyComp)) continue; ChangeEnergy(energyEnt.Value, draw.Energy, out _, out _, energyComp, draw.Safe); } } }