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