diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj
index 6eb27635311683..8495a115daf7fc 100644
--- a/Content.Server/Content.Server.csproj
+++ b/Content.Server/Content.Server.csproj
@@ -142,7 +142,7 @@
-
+
diff --git a/Content.Server/GameTicking/GamePresets/PresetSandbox.cs b/Content.Server/GameTicking/GamePresets/PresetSandbox.cs
new file mode 100644
index 00000000000000..fa9d4ae76bf5e7
--- /dev/null
+++ b/Content.Server/GameTicking/GamePresets/PresetSandbox.cs
@@ -0,0 +1,10 @@
+namespace Content.Server.GameTicking.GamePresets
+{
+ public sealed class PresetSandbox : GamePreset
+ {
+ public override void Start()
+ {
+ // Nothing yet.
+ }
+ }
+}
diff --git a/Content.Server/GameTicking/GamePresets/PresetTraitor.cs b/Content.Server/GameTicking/GamePresets/PresetTraitor.cs
deleted file mode 100644
index 787cf8a14673d7..00000000000000
--- a/Content.Server/GameTicking/GamePresets/PresetTraitor.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using Robust.Shared.Log;
-
-namespace Content.Server.GameTicking.GamePresets
-{
- public class PresetTraitor : GamePreset
- {
- public override void Start()
- {
- Logger.DebugS("ticker.preset", "Current preset is traitor.");
- }
- }
-}
diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs
index 5b98912752137e..34554700ee93d4 100644
--- a/Content.Server/GameTicking/GameTicker.cs
+++ b/Content.Server/GameTicking/GameTicker.cs
@@ -15,13 +15,13 @@
using Robust.Server.Interfaces.Player;
using Robust.Server.Player;
using Robust.Shared.Configuration;
-using Robust.Shared.Console;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.Configuration;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Map;
using Robust.Shared.Interfaces.Network;
+using Robust.Shared.Interfaces.Reflection;
using Robust.Shared.Interfaces.Timing;
using Robust.Shared.IoC;
using Robust.Shared.Log;
@@ -81,6 +81,8 @@ private set
[ViewVariables] private readonly List _gameRules = new List();
+ [ViewVariables] private Type _presetType;
+
#pragma warning disable 649
[Dependency] private IEntityManager _entityManager;
[Dependency] private IMapManager _mapManager;
@@ -155,7 +157,7 @@ public void StartRound()
RunLevel = GameRunLevel.InRound;
// TODO: Allow other presets to be selected.
- var preset = _dynamicTypeFactory.CreateInstance();
+ var preset = (GamePreset)_dynamicTypeFactory.CreateInstance(_presetType);
preset.Start();
foreach (var (playerSession, ready) in _playersInLobby.ToList())
@@ -248,6 +250,15 @@ public void RemoveGameRule(GameRule rule)
public IEnumerable ActiveGameRules => _gameRules;
+ public void SetStartPreset(Type type)
+ {
+ if (!typeof(GamePreset).IsAssignableFrom(type))
+ {
+ throw new ArgumentException("type must inherit GamePreset");
+ }
+ _presetType = type;
+ }
+
private IEntity _spawnPlayerMob()
{
var entity = _entityManager.ForceSpawnEntityAt(PlayerPrototypeName, _getLateJoinSpawnPoint());
@@ -643,4 +654,38 @@ public void Execute(IConsoleShell shell, IPlayerSession player, string[] args)
ticker.ToggleReady(player, bool.Parse(args[0]));
}
}
+
+ class SetGamePresetCommand : IClientCommand
+ {
+ public string Command => "setgamepreset";
+ public string Description => "";
+ public string Help => "";
+
+ public void Execute(IConsoleShell shell, IPlayerSession player, string[] args)
+ {
+ if (args.Length != 1)
+ {
+ shell.SendText(player, "Need exactly one argument.");
+ return;
+ }
+
+ var ticker = IoCManager.Resolve();
+
+ Type presetType;
+ switch (args[0])
+ {
+ case "DeathMatch":
+ presetType = typeof(PresetDeathMatch);
+ break;
+ case "Sandbox":
+ presetType = typeof(PresetSandbox);
+ break;
+ default:
+ shell.SendText(player, "That is not a valid game preset!");
+ return;
+ }
+
+ ticker.SetStartPreset(presetType);
+ }
+ }
}
diff --git a/Content.Server/Interfaces/GameTicking/IGameTicker.cs b/Content.Server/Interfaces/GameTicking/IGameTicker.cs
index ba737643c4d3fa..cf879f7c324f19 100644
--- a/Content.Server/Interfaces/GameTicking/IGameTicker.cs
+++ b/Content.Server/Interfaces/GameTicking/IGameTicker.cs
@@ -33,5 +33,7 @@ public interface IGameTicker
T AddGameRule() where T : GameRule, new();
void RemoveGameRule(GameRule rule);
IEnumerable ActiveGameRules { get; }
+
+ void SetStartPreset(Type type);
}
}
diff --git a/Resources/Groups/groups.yml b/Resources/Groups/groups.yml
index 1df54bd80716ed..1fb92055557bcd 100644
--- a/Resources/Groups/groups.yml
+++ b/Resources/Groups/groups.yml
@@ -45,4 +45,5 @@
- delete
- tp
- tpgrid
+ - setgamepreset
CanViewVar: true