using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Gravity; namespace Content.Server.Gravity; public sealed class GravityGeneratorSystem : EntitySystem { [Dependency] private readonly GravitySystem _gravitySystem = default!; [Dependency] private readonly SharedPointLightSystem _lights = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnParentChanged); SubscribeLocalEvent(OnActivated); SubscribeLocalEvent(OnDeactivated); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var grav, out var charge)) { if (!_lights.TryGetLight(uid, out var pointLight)) continue; _lights.SetEnabled(uid, charge.Charge > 0, pointLight); _lights.SetRadius(uid, MathHelper.Lerp(grav.LightRadiusMin, grav.LightRadiusMax, charge.Charge), pointLight); } } private void OnActivated(Entity ent, ref ChargedMachineActivatedEvent args) { ent.Comp.GravityActive = true; var xform = Transform(ent); if (TryComp(xform.ParentUid, out GravityComponent? gravity)) { _gravitySystem.EnableGravity(xform.ParentUid, gravity); } } private void OnDeactivated(Entity ent, ref ChargedMachineDeactivatedEvent args) { ent.Comp.GravityActive = false; var xform = Transform(ent); if (TryComp(xform.ParentUid, out GravityComponent? gravity)) { _gravitySystem.RefreshGravity(xform.ParentUid, gravity); } } private void OnParentChanged(EntityUid uid, GravityGeneratorComponent component, ref EntParentChangedMessage args) { if (component.GravityActive && TryComp(args.OldParent, out GravityComponent? gravity)) { _gravitySystem.RefreshGravity(args.OldParent.Value, gravity); } } }