diff --git a/Content.Client/ClientContentIoC.cs b/Content.Client/ClientContentIoC.cs index 9fe86a4b73..8639ea4c24 100644 --- a/Content.Client/ClientContentIoC.cs +++ b/Content.Client/ClientContentIoC.cs @@ -5,6 +5,7 @@ using Content.Client.Interfaces.Chat; using Content.Client.Interfaces.Parallax; using Content.Client.Parallax; using Content.Client.Sandbox; +using Content.Client.StationEvents; using Content.Client.UserInterface; using Content.Client.UserInterface.Stylesheets; using Content.Client.Utility; @@ -31,6 +32,7 @@ namespace Content.Client IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); + IoCManager.Register(); } } } diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 9a3065d77c..ef26c72a49 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -7,6 +7,7 @@ using Content.Client.Interfaces.Parallax; using Content.Client.Parallax; using Content.Client.Sandbox; using Content.Client.State; +using Content.Client.StationEvents; using Content.Client.UserInterface; using Content.Client.UserInterface.Stylesheets; using Content.Shared.GameObjects.Components; @@ -150,6 +151,7 @@ namespace Content.Client IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); + IoCManager.Resolve().Initialize(); _baseClient.RunLevelChanged += (sender, args) => { diff --git a/Content.Client/StationEvents/IStationEventManager.cs b/Content.Client/StationEvents/IStationEventManager.cs new file mode 100644 index 0000000000..828b20e80d --- /dev/null +++ b/Content.Client/StationEvents/IStationEventManager.cs @@ -0,0 +1,13 @@ +#nullable enable +using System; +using System.Collections.Generic; + +namespace Content.Client.StationEvents +{ + public interface IStationEventManager + { + public List? StationEvents { get; } + public void Initialize(); + public event Action OnStationEventsReceived; + } +} diff --git a/Content.Client/StationEvents/StationEventManager.cs b/Content.Client/StationEvents/StationEventManager.cs new file mode 100644 index 0000000000..eb1ce55416 --- /dev/null +++ b/Content.Client/StationEvents/StationEventManager.cs @@ -0,0 +1,42 @@ +#nullable enable +using Content.Shared.StationEvents; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.IoC; +using System; +using System.Collections.Generic; + +namespace Content.Client.StationEvents +{ + class StationEventManager : SharedStationEvent, IStationEventManager + { + private List? _events; + public List? StationEvents + { + get + { + if (_events == null) + RequestEvents(); + return _events; + } + } + public event Action? OnStationEventsReceived; + + public void Initialize() + { + var netManager = IoCManager.Resolve(); + netManager.RegisterNetMessage(nameof(MsgGetStationEvents), EventHandler); + netManager.Disconnect += (sender, msg) => _events = null; + } + + private void EventHandler(MsgGetStationEvents msg) + { + _events = msg.Events; + OnStationEventsReceived?.Invoke(); + } + public void RequestEvents() + { + var netManager = IoCManager.Resolve(); + netManager.ClientSendMessage(netManager.CreateNetMessage()); + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs index 1885b32231..48786d52dc 100644 --- a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs @@ -1,23 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Content.Server.StationEvents; +using Content.Server.StationEvents; using JetBrains.Annotations; +using Robust.Server.Console; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Random; using Robust.Shared.Interfaces.Reflection; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Localization; +using System; +using System.Collections.Generic; +using System.Text; +using static Content.Shared.StationEvents.SharedStationEvent; namespace Content.Server.GameObjects.EntitySystems.StationEvents { [UsedImplicitly] public sealed class StationEventSystem : EntitySystem { +#pragma warning disable 649 + [Dependency] private readonly IServerNetManager _netManager; + [Dependency] private readonly IPlayerManager _playerManager; +#pragma warning restore 649 // Somewhat based off of TG's implementation of events - + public StationEvent CurrentEvent { get; private set; } public IReadOnlyCollection StationEvents => _stationEvents; @@ -154,8 +161,31 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents var stationEvent = (StationEvent) typeFactory.CreateInstance(type); _stationEvents.Add(stationEvent); } + + _netManager.RegisterNetMessage(nameof(MsgGetStationEvents), GetEventReceived); } + private void GetEventReceived(MsgGetStationEvents msg) + { + var player = _playerManager.GetSessionByChannel(msg.MsgChannel); + SendEvents(player); + } + + private void SendEvents(IPlayerSession player) + { + if (!IoCManager.Resolve().CanCommand(player, "events")) + return; + + var newMsg = _netManager.CreateNetMessage(); + newMsg.Events = new List(); + foreach (var e in StationEvents) + { + newMsg.Events.Add(e.Name); + } + _netManager.ServerSendMessage(newMsg, player.ConnectedClient); + } + + public override void Update(float frameTime) { base.Update(frameTime); @@ -318,4 +348,4 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents CurrentEvent?.Shutdown(); } } -} \ No newline at end of file +} diff --git a/Content.Server/StationEvents/StationEventCommand.cs b/Content.Server/StationEvents/StationEventCommand.cs index 39331c6d5b..6712c8fa46 100644 --- a/Content.Server/StationEvents/StationEventCommand.cs +++ b/Content.Server/StationEvents/StationEventCommand.cs @@ -1,4 +1,4 @@ -#nullable enable +#nullable enable using Content.Server.GameObjects.EntitySystems; using Content.Server.GameObjects.EntitySystems.StationEvents; using JetBrains.Annotations; @@ -14,11 +14,10 @@ namespace Content.Client.Commands { public string Command => "events"; public string Description => "Provides admin control to station events"; - public string Help => "events >\n" + + public string Help => "events >\n" + "list: return all event names that can be run\n " + "pause: stop all random events from running\n" + "resume: allow random events to run again\n" + - "random: choose a random event that is valid and run it\n" + "run: start a particular event now; is case-insensitive and not localized"; public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) { @@ -99,4 +98,4 @@ namespace Content.Client.Commands return; } } -} \ No newline at end of file +} diff --git a/Content.Shared/StationEvents/SharedStationEvent.cs b/Content.Shared/StationEvents/SharedStationEvent.cs new file mode 100644 index 0000000000..8cecfb14df --- /dev/null +++ b/Content.Shared/StationEvents/SharedStationEvent.cs @@ -0,0 +1,46 @@ +using Lidgren.Network; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Network; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Content.Shared.StationEvents +{ + public class SharedStationEvent + { + public class MsgGetStationEvents : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgGetStationEvents); + public MsgGetStationEvents(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + public List Events; + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + var serializer = IoCManager.Resolve(); + var length = buffer.ReadVariableInt32(); + using var stream = buffer.ReadAsStream(length); + Events = serializer.Deserialize>(stream); + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + var serializer = IoCManager.Resolve(); + using (var stream = new MemoryStream()) + { + serializer.Serialize(stream, Events); + buffer.WriteVariableInt32((int)stream.Length); + stream.TryGetBuffer(out var segment); + buffer.Write(segment); + } + } + } + } +}