diff --git a/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs b/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs deleted file mode 100644 index a1ed71ee4c..0000000000 --- a/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs +++ /dev/null @@ -1,113 +0,0 @@ -using Content.Server.Light.Events; -using Content.Shared.Actions; -using Content.Shared.Decals; -using Content.Shared.Emag.Systems; -using Content.Shared.Light; -using Content.Shared.Light.Components; -using Content.Shared.Mind.Components; -using Content.Shared.Toggleable; -using Content.Shared.Verbs; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; -using Robust.Shared.Utility; - -namespace Content.Server.Light.EntitySystems -{ - public sealed class UnpoweredFlashlightSystem : EntitySystem - { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly ActionContainerSystem _actionContainer = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; - [Dependency] private readonly SharedPointLightSystem _light = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent>(AddToggleLightVerbs); - SubscribeLocalEvent(OnGetActions); - SubscribeLocalEvent(OnToggleAction); - SubscribeLocalEvent(OnMindAdded); - SubscribeLocalEvent(OnGotEmagged); - SubscribeLocalEvent(OnMapInit); - } - - private void OnMapInit(EntityUid uid, UnpoweredFlashlightComponent component, MapInitEvent args) - { - _actionContainer.EnsureAction(uid, ref component.ToggleActionEntity, component.ToggleAction); - Dirty(uid, component); - } - - private void OnToggleAction(EntityUid uid, UnpoweredFlashlightComponent component, ToggleActionEvent args) - { - if (args.Handled) - return; - - ToggleLight(uid, component); - - args.Handled = true; - } - - private void OnGetActions(EntityUid uid, UnpoweredFlashlightComponent component, GetItemActionsEvent args) - { - args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); - } - - private void AddToggleLightVerbs(EntityUid uid, UnpoweredFlashlightComponent component, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - ActivationVerb verb = new() - { - Text = Loc.GetString("toggle-flashlight-verb-get-data-text"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/light.svg.192dpi.png")), - Act = () => ToggleLight(uid, component), - Priority = -1 // For things like PDA's, Open-UI and other verbs that should be higher priority. - }; - - args.Verbs.Add(verb); - } - - private void OnMindAdded(EntityUid uid, UnpoweredFlashlightComponent component, MindAddedMessage args) - { - _actionsSystem.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); - } - - private void OnGotEmagged(EntityUid uid, UnpoweredFlashlightComponent component, ref GotEmaggedEvent args) - { - if (!_light.TryGetLight(uid, out var light)) - return; - - if (_prototypeManager.TryIndex(component.EmaggedColorsPrototype, out var possibleColors)) - { - var pick = _random.Pick(possibleColors.Colors.Values); - _light.SetColor(uid, pick, light); - } - - args.Repeatable = true; - args.Handled = true; - } - - public void ToggleLight(EntityUid uid, UnpoweredFlashlightComponent flashlight) - { - if (!_light.TryGetLight(uid, out var light)) - return; - - flashlight.LightOn = !flashlight.LightOn; - _light.SetEnabled(uid, flashlight.LightOn, light); - - _appearance.SetData(uid, UnpoweredFlashlightVisuals.LightOn, flashlight.LightOn); - - _audioSystem.PlayPvs(flashlight.ToggleSound, uid); - - RaiseLocalEvent(uid, new LightToggleEvent(flashlight.LightOn), true); - _actionsSystem.SetToggled(flashlight.ToggleActionEntity, flashlight.LightOn); - } - } -} diff --git a/Content.Server/Light/Events/LightToggleEvent.cs b/Content.Server/Light/Events/LightToggleEvent.cs deleted file mode 100644 index c7e82ce754..0000000000 --- a/Content.Server/Light/Events/LightToggleEvent.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Content.Server.Light.Events -{ - public sealed class LightToggleEvent : EntityEventArgs - { - public bool IsOn; - - public LightToggleEvent(bool isOn) - { - IsOn = isOn; - } - } -} diff --git a/Content.Server/PDA/PdaSystem.cs b/Content.Server/PDA/PdaSystem.cs index 0b86fe29ed..d4934ee24e 100644 --- a/Content.Server/PDA/PdaSystem.cs +++ b/Content.Server/PDA/PdaSystem.cs @@ -4,7 +4,6 @@ using Content.Server.Chat.Managers; using Content.Server.DeviceNetwork.Components; using Content.Server.Instruments; using Content.Server.Light.EntitySystems; -using Content.Server.Light.Events; using Content.Server.PDA.Ringer; using Content.Server.Station.Systems; using Content.Server.Store.Components; @@ -12,7 +11,9 @@ using Content.Server.Store.Systems; using Content.Shared.Access.Components; using Content.Shared.CartridgeLoader; using Content.Shared.Chat; +using Content.Shared.Light; using Content.Shared.Light.Components; +using Content.Shared.Light.EntitySystems; using Content.Shared.PDA; using Robust.Server.Containers; using Robust.Server.GameObjects; @@ -207,8 +208,9 @@ namespace Content.Server.PDA if (!PdaUiKey.Key.Equals(msg.UiKey)) return; - if (TryComp(uid, out var flashlight)) - _unpoweredFlashlight.ToggleLight(uid, flashlight); + // TODO PREDICTION + // When moving this to shared, fill in the user field + _unpoweredFlashlight.TryToggleLight(uid, user: null); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowRingtoneMessage msg) diff --git a/Content.Shared/Actions/ActionEvents.cs b/Content.Shared/Actions/ActionEvents.cs index 72a566b8c8..cddb70f74d 100644 --- a/Content.Shared/Actions/ActionEvents.cs +++ b/Content.Shared/Actions/ActionEvents.cs @@ -68,9 +68,10 @@ public sealed class GetItemActionsEvent : EntityEventArgs AddAction(ref actionId, prototypeId, Provider); } - public void AddAction(EntityUid actionId) + public void AddAction(EntityUid? actionId) { - Actions.Add(actionId); + if (actionId != null) + Actions.Add(actionId.Value); } } diff --git a/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs b/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs index 1b0701edd2..2953a01ced 100644 --- a/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs +++ b/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs @@ -2,7 +2,6 @@ using Content.Shared.Decals; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Light.Components; @@ -17,7 +16,7 @@ public sealed partial class UnpoweredFlashlightComponent : Component public SoundSpecifier ToggleSound = new SoundPathSpecifier("/Audio/Items/flashlight_pda.ogg"); [DataField, AutoNetworkedField] - public bool LightOn = false; + public bool LightOn; [DataField] public EntProtoId ToggleAction = "ActionToggleLight"; diff --git a/Content.Shared/Light/EntitySystems/UnpoweredFlashlightSystem.cs b/Content.Shared/Light/EntitySystems/UnpoweredFlashlightSystem.cs new file mode 100644 index 0000000000..42e55bea55 --- /dev/null +++ b/Content.Shared/Light/EntitySystems/UnpoweredFlashlightSystem.cs @@ -0,0 +1,122 @@ +using Content.Shared.Actions; +using Content.Shared.Emag.Systems; +using Content.Shared.Light.Components; +using Content.Shared.Mind.Components; +using Content.Shared.Toggleable; +using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Utility; + +namespace Content.Shared.Light.EntitySystems; + +public sealed class UnpoweredFlashlightSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly SharedPointLightSystem _light = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(AddToggleLightVerbs); + SubscribeLocalEvent(OnGetActions); + SubscribeLocalEvent(OnToggleAction); + SubscribeLocalEvent(OnMindAdded); + SubscribeLocalEvent(OnGotEmagged); + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(EntityUid uid, UnpoweredFlashlightComponent component, MapInitEvent args) + { + _actionContainer.EnsureAction(uid, ref component.ToggleActionEntity, component.ToggleAction); + Dirty(uid, component); + } + + private void OnToggleAction(EntityUid uid, UnpoweredFlashlightComponent component, ToggleActionEvent args) + { + if (args.Handled) + return; + + TryToggleLight((uid, component), args.Performer); + args.Handled = true; + } + + private void OnGetActions(EntityUid uid, UnpoweredFlashlightComponent component, GetItemActionsEvent args) + { + args.AddAction(component.ToggleActionEntity); + } + + private void AddToggleLightVerbs(EntityUid uid, UnpoweredFlashlightComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + ActivationVerb verb = new() + { + Text = Loc.GetString("toggle-flashlight-verb-get-data-text"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/light.svg.192dpi.png")), + Act = () => TryToggleLight((uid, component), args.User), + Priority = -1 // For things like PDA's, Open-UI and other verbs that should be higher priority. + }; + + args.Verbs.Add(verb); + } + + private void OnMindAdded(EntityUid uid, UnpoweredFlashlightComponent component, MindAddedMessage args) + { + _actionsSystem.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); + } + + private void OnGotEmagged(EntityUid uid, UnpoweredFlashlightComponent component, ref GotEmaggedEvent args) + { + if (!_light.TryGetLight(uid, out var light)) + return; + + if (_prototypeManager.TryIndex(component.EmaggedColorsPrototype, out var possibleColors)) + { + var pick = _random.Pick(possibleColors.Colors.Values); + _light.SetColor(uid, pick, light); + } + + args.Repeatable = true; + args.Handled = true; + } + + public void TryToggleLight(Entity ent, EntityUid? user = null, bool quiet = false) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + SetLight(ent, !ent.Comp.LightOn, user, quiet); + } + + public void SetLight(Entity ent, bool value, EntityUid? user = null, bool quiet = false) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + if (ent.Comp.LightOn == value) + return; + + if (!_light.TryGetLight(ent, out var light)) + return; + + Dirty(ent); + ent.Comp.LightOn = value; + _light.SetEnabled(ent, value, light); + _appearance.SetData(ent, UnpoweredFlashlightVisuals.LightOn, value); + + if (!quiet) + _audioSystem.PlayPredicted(ent.Comp.ToggleSound, ent, user); + + _actionsSystem.SetToggled(ent.Comp.ToggleActionEntity, value); + RaiseLocalEvent(ent, new LightToggleEvent(value)); + } +} diff --git a/Content.Shared/Light/LightToggleEvent.cs b/Content.Shared/Light/LightToggleEvent.cs new file mode 100644 index 0000000000..ac48c09419 --- /dev/null +++ b/Content.Shared/Light/LightToggleEvent.cs @@ -0,0 +1,6 @@ +namespace Content.Shared.Light; + +public sealed class LightToggleEvent(bool isOn) : EntityEventArgs +{ + public bool IsOn = isOn; +}