From 2e6ab15a2a75d76a491a739f90de15384eddb4ef Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Wed, 23 Dec 2020 16:59:50 +0100 Subject: [PATCH] Clean up station events synchronization code. AAAAAAAAAAAAAAAAAAAAAAAAAAA --- .../StationEvents/IStationEventManager.cs | 2 +- .../StationEvents/StationEventManager.cs | 39 ++++++++++--------- .../AdminMenu/AdminMenuWindow.cs | 9 +++-- .../StationEvents/StationEventSystem.cs | 37 +++++++++--------- .../NetMessages/MsgRequestStationEvents.cs | 29 ++++++++++++++ .../NetMessages/MsgStationEvents.cs} | 22 +++++------ 6 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 Content.Shared/Network/NetMessages/MsgRequestStationEvents.cs rename Content.Shared/{StationEvents/SharedStationEvent.cs => Network/NetMessages/MsgStationEvents.cs} (66%) diff --git a/Content.Client/StationEvents/IStationEventManager.cs b/Content.Client/StationEvents/IStationEventManager.cs index 3381708f6a..24046ea357 100644 --- a/Content.Client/StationEvents/IStationEventManager.cs +++ b/Content.Client/StationEvents/IStationEventManager.cs @@ -6,7 +6,7 @@ namespace Content.Client.StationEvents { public interface IStationEventManager { - public List? StationEvents { get; } + public IReadOnlyList StationEvents { get; } public void Initialize(); public event Action OnStationEventsReceived; public void RequestEvents(); diff --git a/Content.Client/StationEvents/StationEventManager.cs b/Content.Client/StationEvents/StationEventManager.cs index b9d6e8f760..59e78e9734 100644 --- a/Content.Client/StationEvents/StationEventManager.cs +++ b/Content.Client/StationEvents/StationEventManager.cs @@ -1,42 +1,43 @@ #nullable enable using System; using System.Collections.Generic; -using Content.Shared.StationEvents; +using Content.Shared.Network.NetMessages; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; +using Robust.Shared.Network; namespace Content.Client.StationEvents { - class StationEventManager : SharedStationEvent, IStationEventManager + internal sealed class StationEventManager : IStationEventManager { - private List? _events; - public List? StationEvents - { - get - { - if (_events == null) - RequestEvents(); - return _events; - } - } + [Dependency] private readonly IClientNetManager _netManager = default!; + + private readonly List _events = new(); + public IReadOnlyList StationEvents => _events; public event Action? OnStationEventsReceived; public void Initialize() { - var netManager = IoCManager.Resolve(); - netManager.RegisterNetMessage(nameof(MsgGetStationEvents), EventHandler); - netManager.Disconnect += (sender, msg) => _events = null; + _netManager.RegisterNetMessage(nameof(MsgRequestStationEvents)); + _netManager.RegisterNetMessage(nameof(MsgStationEvents), RxStationEvents); + _netManager.Disconnect += OnNetManagerOnDisconnect; } - private void EventHandler(MsgGetStationEvents msg) + private void OnNetManagerOnDisconnect(object? sender, NetDisconnectedArgs msg) { - _events = msg.Events; + _events.Clear(); + } + + private void RxStationEvents(MsgStationEvents msg) + { + _events.Clear(); + _events.AddRange(msg.Events); OnStationEventsReceived?.Invoke(); } + public void RequestEvents() { - var netManager = IoCManager.Resolve(); - netManager.ClientSendMessage(netManager.CreateNetMessage()); + _netManager.ClientSendMessage(_netManager.CreateNetMessage()); } } } diff --git a/Content.Client/UserInterface/AdminMenu/AdminMenuWindow.cs b/Content.Client/UserInterface/AdminMenu/AdminMenuWindow.cs index 5febcca1f2..1dc7da1611 100644 --- a/Content.Client/UserInterface/AdminMenu/AdminMenuWindow.cs +++ b/Content.Client/UserInterface/AdminMenu/AdminMenuWindow.cs @@ -468,10 +468,11 @@ namespace Content.Client.UserInterface.AdminMenu Name = "Event", GetData = () => { - var events = IoCManager.Resolve().StationEvents; - if (events == null) - return new List { "Not loaded" }; - events.Add("Random"); + var events = IoCManager.Resolve().StationEvents.ToList(); + if (events.Count == 0) + events.Add(Loc.GetString("Not loaded")); + else + events.Add(Loc.GetString("Random")); return events.ToList(); }, GetDisplayName = (obj) => (string) obj, diff --git a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs index cf7c9fb63e..5cef4092a4 100644 --- a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using Content.Server.GameTicking; using Content.Server.Interfaces.GameTicking; using Content.Server.StationEvents; using Content.Shared; using Content.Shared.GameTicking; +using Content.Shared.Network.NetMessages; using JetBrains.Annotations; using Robust.Server.Console; using Robust.Server.Interfaces.Player; @@ -17,7 +19,6 @@ using Robust.Shared.Interfaces.Reflection; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Localization; -using static Content.Shared.StationEvents.SharedStationEvent; namespace Content.Server.GameObjects.EntitySystems.StationEvents { @@ -29,6 +30,9 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents [Dependency] private readonly IServerNetManager _netManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IGameTicker _gameTicker = default!; + [Dependency] private readonly IConGroupController _conGroupController = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IRobustRandom _random = default!; public StationEvent CurrentEvent { get; private set; } public IReadOnlyCollection StationEvents => _stationEvents; @@ -170,30 +174,27 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents // Can't just check debug / release for a default given mappers need to use release mode // As such we'll always pause it by default. _configurationManager.OnValueChanged(CCVars.EventsEnabled, value => Enabled = value, true); - _netManager.RegisterNetMessage(nameof(MsgGetStationEvents), GetEventReceived); + + _netManager.RegisterNetMessage(nameof(MsgRequestStationEvents), RxRequest); + _netManager.RegisterNetMessage(nameof(MsgStationEvents)); } - private void GetEventReceived(MsgGetStationEvents msg) + private void RxRequest(MsgRequestStationEvents msg) { - var player = _playerManager.GetSessionByChannel(msg.MsgChannel); - SendEvents(player); + if (_playerManager.TryGetSessionByChannel(msg.MsgChannel, out var player)) + SendEvents(player); } private void SendEvents(IPlayerSession player) { - if (!IoCManager.Resolve().CanCommand(player, "events")) + if (!_conGroupController.CanCommand(player, "events")) return; - var newMsg = _netManager.CreateNetMessage(); - newMsg.Events = new List(); - foreach (var e in StationEvents) - { - newMsg.Events.Add(e.Name); - } + var newMsg = _netManager.CreateNetMessage(); + newMsg.Events = StationEvents.Select(e => e.Name).ToArray(); _netManager.ServerSendMessage(newMsg, player.ConnectedClient); } - public override void Update(float frameTime) { base.Update(frameTime); @@ -254,9 +255,8 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents /// private void ResetTimer() { - var robustRandom = IoCManager.Resolve(); // 5 - 15 minutes. TG does 3-10 but that's pretty frequent - _timeUntilNextEvent = robustRandom.Next(300, 900); + _timeUntilNextEvent = _random.Next(300, 900); } /// @@ -277,8 +277,7 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents sumOfWeights += (int) stationEvent.Weight; } - var robustRandom = IoCManager.Resolve(); - sumOfWeights = robustRandom.Next(sumOfWeights); + sumOfWeights = _random.Next(sumOfWeights); foreach (var stationEvent in availableEvents) { @@ -301,12 +300,12 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents private List AvailableEvents(bool ignoreEarliestStart = false) { TimeSpan currentTime; - var playerCount = IoCManager.Resolve().PlayerCount; + var playerCount = _playerManager.PlayerCount; // playerCount does a lock so we'll just keep the variable here if (!ignoreEarliestStart) { - currentTime = IoCManager.Resolve().CurTime; + currentTime = _gameTiming.CurTime; } else { diff --git a/Content.Shared/Network/NetMessages/MsgRequestStationEvents.cs b/Content.Shared/Network/NetMessages/MsgRequestStationEvents.cs new file mode 100644 index 0000000000..d7a21ad578 --- /dev/null +++ b/Content.Shared/Network/NetMessages/MsgRequestStationEvents.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.IO; +using Lidgren.Network; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Network; + +namespace Content.Shared.Network.NetMessages +{ + public class MsgRequestStationEvents : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgRequestStationEvents); + public MsgRequestStationEvents(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + } + } +} diff --git a/Content.Shared/StationEvents/SharedStationEvent.cs b/Content.Shared/Network/NetMessages/MsgStationEvents.cs similarity index 66% rename from Content.Shared/StationEvents/SharedStationEvent.cs rename to Content.Shared/Network/NetMessages/MsgStationEvents.cs index 82f41a4614..6523419f1e 100644 --- a/Content.Shared/StationEvents/SharedStationEvent.cs +++ b/Content.Shared/Network/NetMessages/MsgStationEvents.cs @@ -1,31 +1,30 @@ -using System.Collections.Generic; -using System.IO; +using System.IO; using Lidgren.Network; using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Serialization; using Robust.Shared.IoC; using Robust.Shared.Network; -namespace Content.Shared.StationEvents +namespace Content.Shared.Network.NetMessages { - public class SharedStationEvent - { - public class MsgGetStationEvents : NetMessage + public class MsgStationEvents : NetMessage { #region REQUIRED public const MsgGroups GROUP = MsgGroups.Command; - public const string NAME = nameof(MsgGetStationEvents); - public MsgGetStationEvents(INetChannel channel) : base(NAME, GROUP) { } + public const string NAME = nameof(MsgStationEvents); + public MsgStationEvents(INetChannel channel) : base(NAME, GROUP) { } #endregion - public List Events; + + public string[] Events; + public override void ReadFromBuffer(NetIncomingMessage buffer) { var serializer = IoCManager.Resolve(); var length = buffer.ReadVariableInt32(); using var stream = buffer.ReadAlignedMemory(length); - Events = serializer.Deserialize>(stream); + serializer.DeserializeDirect(stream, out Events); } public override void WriteToBuffer(NetOutgoingMessage buffer) @@ -33,12 +32,11 @@ namespace Content.Shared.StationEvents var serializer = IoCManager.Resolve(); using (var stream = new MemoryStream()) { - serializer.Serialize(stream, Events); + serializer.SerializeDirect(stream, Events); buffer.WriteVariableInt32((int)stream.Length); stream.TryGetBuffer(out var segment); buffer.Write(segment); } } } - } }