using Content.Server.Power.Components; using Content.Shared.Placeable; using Content.Shared.Temperature; using Content.Shared.Temperature.Components; using Content.Shared.Temperature.Systems; namespace Content.Server.Temperature.Systems; /// /// Handles the server-only parts of /// public sealed class EntityHeaterSystem : SharedEntityHeaterSystem { [Dependency] private readonly TemperatureSystem _temperature = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); } private void OnMapInit(Entity ent, ref MapInitEvent args) { // Set initial power level if (TryComp(ent, out var power)) power.Load = SettingPower(ent.Comp.Setting, ent.Comp.Power); } public override void Update(float deltaTime) { var query = EntityQueryEnumerator(); while (query.MoveNext(out _, out _, out var placer, out var power)) { if (!power.Powered) continue; // don't divide by total entities since it's a big grill // excess would just be wasted in the air but that's not worth simulating // if you want a heater thermomachine just use that... var energy = power.PowerReceived * deltaTime; foreach (var ent in placer.PlacedEntities) { _temperature.ChangeHeat(ent, energy); } } } /// /// doesn't exist on the client, so we need /// this server-only override to handle setting the network load. /// protected override void ChangeSetting(Entity ent, EntityHeaterSetting setting, EntityUid? user = null) { base.ChangeSetting(ent, setting, user); if (!TryComp(ent, out var power)) return; power.Load = SettingPower(setting, ent.Comp.Power); } }