using System.Diagnostics.CodeAnalysis; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.IoC; namespace Robust.Server.GameObjects; public sealed partial class PointLightSystem : SharedPointLightSystem { [Dependency] private MetaDataSystem _metadata = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnLightGetState); SubscribeLocalEvent(OnLightStartup); SubscribeLocalEvent(OnLightShutdown); SubscribeLocalEvent(OnFlagRemoveAttempt); } private void OnLightShutdown(Entity ent, ref ComponentShutdown args) { UpdatePriority(ent.Owner, ent.Comp, MetaData(ent.Owner)); } private void OnFlagRemoveAttempt(Entity ent, ref MetaFlagRemoveAttemptEvent args) { if (IsHighPriority(ent.Comp)) args.ToRemove &= ~MetaDataFlags.PvsPriority; } private void OnLightStartup(EntityUid uid, PointLightComponent component, ComponentStartup args) { UpdatePriority(uid, component, MetaData(uid)); } private bool IsHighPriority(SharedPointLightComponent comp) { return comp is { Enabled: true, CastShadows: true, Radius: > 7, LifeStage: <= ComponentLifeStage.Running }; } protected override void UpdatePriority(EntityUid uid, SharedPointLightComponent comp, MetaDataComponent meta) { _metadata.SetFlag((uid, meta), MetaDataFlags.PvsPriority, IsHighPriority(comp)); } public override SharedPointLightComponent EnsureLight(EntityUid uid) { return EnsureComp(uid); } public override bool ResolveLight(EntityUid uid, [NotNullWhen(true)] ref SharedPointLightComponent? component) { if (component is not null) return true; TryComp(uid, out var comp); component = comp; return component != null; } public override bool TryGetLight(EntityUid uid, [NotNullWhen(true)] out SharedPointLightComponent? component) { if (TryComp(uid, out var comp)) { component = comp; return true; } component = null; return false; } public override bool RemoveLightDeferred(EntityUid uid) { return RemCompDeferred(uid); } }