2024-07-29 21:01:36 +03:00
|
|
|
using Content.Server._CP14.MagicEnergy.Components;
|
2025-05-15 00:37:42 +03:00
|
|
|
using Content.Shared._CP14.DayCycle;
|
2024-07-29 21:01:36 +03:00
|
|
|
using Content.Shared._CP14.MagicEnergy.Components;
|
2025-01-06 17:08:49 +03:00
|
|
|
using Content.Shared.Damage;
|
2025-03-28 11:10:42 +03:00
|
|
|
using Content.Shared.Mobs.Components;
|
|
|
|
|
using Content.Shared.Mobs.Systems;
|
2025-09-06 13:19:18 +03:00
|
|
|
using Robust.Shared.Timing;
|
2024-07-29 21:01:36 +03:00
|
|
|
|
|
|
|
|
namespace Content.Server._CP14.MagicEnergy;
|
|
|
|
|
|
|
|
|
|
public partial class CP14MagicEnergySystem
|
|
|
|
|
{
|
2025-03-28 11:10:42 +03:00
|
|
|
[Dependency] private readonly MobStateSystem _mobState = default!;
|
2025-05-15 00:37:42 +03:00
|
|
|
[Dependency] private readonly CP14DayCycleSystem _dayCycle = default!;
|
2025-03-28 11:10:42 +03:00
|
|
|
|
2024-07-29 21:01:36 +03:00
|
|
|
private void InitializeDraw()
|
|
|
|
|
{
|
|
|
|
|
SubscribeLocalEvent<CP14MagicEnergyDrawComponent, MapInitEvent>(OnDrawMapInit);
|
2025-01-06 17:08:49 +03:00
|
|
|
SubscribeLocalEvent<CP14MagicEnergyFromDamageComponent, DamageChangedEvent>(OnDamageChanged);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnDamageChanged(Entity<CP14MagicEnergyFromDamageComponent> 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;
|
|
|
|
|
|
2025-04-15 00:32:41 +10:00
|
|
|
ChangeEnergy(ent.Owner, modifier * dict.Value, out _, out _, safe: true);
|
2025-01-06 17:08:49 +03:00
|
|
|
}
|
2024-07-29 21:01:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnDrawMapInit(Entity<CP14MagicEnergyDrawComponent> 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<CP14MagicEnergyDrawComponent, CP14MagicEnergyContainerComponent>();
|
|
|
|
|
while (query.MoveNext(out var uid, out var draw, out var magicContainer))
|
|
|
|
|
{
|
2025-01-06 03:31:59 +03:00
|
|
|
if (!draw.Enable)
|
|
|
|
|
continue;
|
|
|
|
|
|
2024-07-29 21:01:36 +03:00
|
|
|
if (draw.NextUpdateTime >= _gameTiming.CurTime)
|
|
|
|
|
continue;
|
|
|
|
|
|
2025-03-28 11:10:42 +03:00
|
|
|
if (TryComp<MobStateComponent>(uid, out var mobState) && !_mobState.IsAlive(uid, mobState))
|
|
|
|
|
continue;
|
|
|
|
|
|
2025-09-06 13:19:55 +03:00
|
|
|
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
|
2024-07-29 21:01:36 +03:00
|
|
|
|
2025-04-15 00:32:41 +10:00
|
|
|
ChangeEnergy((uid, magicContainer), draw.Energy, out _, out _, draw.Safe);
|
2024-07-29 21:01:36 +03:00
|
|
|
}
|
|
|
|
|
|
2025-01-06 03:31:59 +03:00
|
|
|
var query2 = EntityQueryEnumerator<CP14MagicEnergyPhotosynthesisComponent, CP14MagicEnergyContainerComponent>();
|
|
|
|
|
while (query2.MoveNext(out var uid, out var draw, out var magicContainer))
|
2024-07-29 21:01:36 +03:00
|
|
|
{
|
|
|
|
|
if (draw.NextUpdateTime >= _gameTiming.CurTime)
|
|
|
|
|
continue;
|
|
|
|
|
|
2025-03-28 11:10:42 +03:00
|
|
|
if (TryComp<MobStateComponent>(uid, out var mobState) && !_mobState.IsAlive(uid, mobState))
|
|
|
|
|
continue;
|
|
|
|
|
|
2024-07-29 21:01:36 +03:00
|
|
|
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
|
|
|
|
|
|
2025-05-15 00:37:42 +03:00
|
|
|
var daylight = _dayCycle.UnderSunlight(uid);
|
2025-03-19 12:52:37 +03:00
|
|
|
|
2025-04-15 00:32:41 +10:00
|
|
|
ChangeEnergy((uid, magicContainer), daylight ? draw.DaylightEnergy : draw.DarknessEnergy, out _, out _, true);
|
2024-07-29 21:01:36 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-06 03:31:59 +03:00
|
|
|
private void UpdateEnergyCrystalSlot()
|
2024-07-29 21:01:36 +03:00
|
|
|
{
|
2025-01-06 03:31:59 +03:00
|
|
|
var query = EntityQueryEnumerator<CP14MagicEnergyDrawComponent, CP14MagicEnergyCrystalSlotComponent>();
|
|
|
|
|
while (query.MoveNext(out var uid, out var draw, out var slot))
|
2024-07-29 21:01:36 +03:00
|
|
|
{
|
|
|
|
|
if (!draw.Enable)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (draw.NextUpdateTime >= _gameTiming.CurTime)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
|
|
|
|
|
|
2025-04-15 00:32:41 +10:00
|
|
|
if (!_magicSlot.TryGetEnergyCrystalFromSlot(uid, out var energyEnt))
|
2025-01-06 03:31:59 +03:00
|
|
|
continue;
|
2024-07-29 21:01:36 +03:00
|
|
|
|
2025-04-15 00:32:41 +10:00
|
|
|
ChangeEnergy((energyEnt.Value, energyEnt.Value), draw.Energy, out _, out _, draw.Safe);
|
2024-07-29 21:01:36 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|