diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj index 6fa3c3aa0f..7af2670fd3 100644 --- a/Content.Server/Content.Server.csproj +++ b/Content.Server/Content.Server.csproj @@ -133,6 +133,7 @@ + diff --git a/Content.Server/EntryPoint.cs b/Content.Server/EntryPoint.cs index 8ef78acdc9..91e858cb8c 100644 --- a/Content.Server/EntryPoint.cs +++ b/Content.Server/EntryPoint.cs @@ -39,6 +39,7 @@ using Content.Server.Interfaces; using Content.Server.Interfaces.GameTicking; using Content.Shared.GameObjects.Components.Inventory; using Content.Shared.Interfaces; +using SS14.Server.Interfaces.ServerStatus; using SS14.Shared.Timing; namespace Content.Server @@ -46,6 +47,7 @@ namespace Content.Server public class EntryPoint : GameServer { private IGameTicker _gameTicker; + private StatusShell _statusShell; /// public override void Init() @@ -122,6 +124,10 @@ namespace Content.Server _gameTicker = IoCManager.Resolve(); IoCManager.Resolve().Initialize(); + + var playerManager = IoCManager.Resolve(); + + _statusShell = new StatusShell(); } public override void PostInit() diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index d9f4afa20d..78fbe4706e 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -53,7 +53,7 @@ namespace Content.Server.GameTicking } } - public Action OnRunLevelChanged; + public event Action OnRunLevelChanged; private const string PlayerPrototypeName = "HumanMob_Content"; private const string ObserverPrototypeName = "MobObserver"; @@ -414,8 +414,8 @@ namespace Content.Server.GameTicking public enum GameRunLevel { PreRoundLobby = 0, - InRound, - PostRound + InRound = 1, + PostRound = 2 } public class GameRunLevelChangedEventArgs : EventArgs diff --git a/Content.Server/Interfaces/GameTicking/IGameTicker.cs b/Content.Server/Interfaces/GameTicking/IGameTicker.cs index 5edff62194..0f6cc96be1 100644 --- a/Content.Server/Interfaces/GameTicking/IGameTicker.cs +++ b/Content.Server/Interfaces/GameTicking/IGameTicker.cs @@ -1,3 +1,4 @@ +using System; using Content.Server.GameTicking; using SS14.Server.Interfaces.Player; using SS14.Server.Player; @@ -13,6 +14,8 @@ namespace Content.Server.Interfaces.GameTicking { GameRunLevel RunLevel { get; } + event Action OnRunLevelChanged; + void Initialize(); void Update(FrameEventArgs frameEventArgs); diff --git a/Content.Server/StatusShell.cs b/Content.Server/StatusShell.cs new file mode 100644 index 0000000000..a3439d3712 --- /dev/null +++ b/Content.Server/StatusShell.cs @@ -0,0 +1,60 @@ +using System; +using Content.Server.GameTicking; +using Content.Server.Interfaces.GameTicking; +using Newtonsoft.Json.Linq; +using SS14.Server.Interfaces; +using SS14.Server.Interfaces.Player; +using SS14.Server.Interfaces.ServerStatus; +using SS14.Shared.IoC; + +namespace Content.Server +{ + /// + /// Tiny helper class to handle status messages. Nothing too complicated. + /// + public class StatusShell + { + private readonly IPlayerManager _playerManager; + private readonly string _name; + private GameRunLevel _runLevel; + private DateTime _roundStartTime; + + public StatusShell() + { + _playerManager = IoCManager.Resolve(); + var baseServer = IoCManager.Resolve(); + var gameTicker = IoCManager.Resolve(); + + gameTicker.OnRunLevelChanged += _runLevelChanged; + + _name = baseServer.ServerName; + IoCManager.Resolve().OnStatusRequest += _getResponse; + } + + private void _getResponse(JObject jObject) + { + lock (this) + { + jObject["name"] = _name; + jObject["players"] = _playerManager.PlayerCount; + jObject["run_level"] = (int) _runLevel; + if (_runLevel >= GameRunLevel.InRound) + { + jObject["round_start_time"] = _roundStartTime.ToString("o"); + } + } + } + + private void _runLevelChanged(GameRunLevelChangedEventArgs eventArgs) + { + lock (this) + { + _runLevel = eventArgs.NewRunLevel; + if (eventArgs.NewRunLevel == GameRunLevel.InRound) + { + _roundStartTime = DateTime.UtcNow; + } + } + } + } +} diff --git a/engine b/engine index 861aabbe9b..21fd3e5d96 160000 --- a/engine +++ b/engine @@ -1 +1 @@ -Subproject commit 861aabbe9bf47c664c4116ce3b368f7ce66fbe89 +Subproject commit 21fd3e5d9620f5193ab75040248d359b99557851