Reset server after game

This commit is contained in:
teinarss
2019-08-19 19:35:51 +02:00
committed by abcdefg30
parent 6702395357
commit 4dd8472d9b
3 changed files with 18 additions and 8 deletions

View File

@@ -626,7 +626,7 @@ namespace OpenRA
static void LogicTick() static void LogicTick()
{ {
delayedActions.PerformActions(RunTime); PerformDelayedActions();
if (OrderManager.Connection.ConnectionState != lastConnectionState) if (OrderManager.Connection.ConnectionState != lastConnectionState)
{ {
@@ -639,6 +639,11 @@ namespace OpenRA
InnerLogicTick(worldRenderer.World.OrderManager); InnerLogicTick(worldRenderer.World.OrderManager);
} }
public static void PerformDelayedActions()
{
delayedActions.PerformActions(RunTime);
}
public static void TakeScreenshot() public static void TakeScreenshot()
{ {
takeScreenshot = true; takeScreenshot = true;

View File

@@ -215,6 +215,10 @@ namespace OpenRA.Server
delayedActions.PerformActions(0); delayedActions.PerformActions(0);
// PERF: Dedicated servers need to drain the action queue to remove references blocking the GC from cleaning up disposed objects.
if (dedicated)
Game.PerformDelayedActions();
foreach (var t in serverTraits.WithInterface<ITick>()) foreach (var t in serverTraits.WithInterface<ITick>())
t.Tick(this); t.Tick(this);

View File

@@ -56,17 +56,17 @@ namespace OpenRA.Server
var mods = new InstalledMods(modSearchPaths, explicitModPaths); var mods = new InstalledMods(modSearchPaths, explicitModPaths);
// HACK: The engine code *still* assumes that Game.ModData is set
var modData = Game.ModData = new ModData(mods[modID], mods);
modData.MapCache.LoadMaps();
settings.Map = modData.MapCache.ChooseInitialMap(settings.Map, new MersenneTwister());
Console.WriteLine("[{0}] Starting dedicated server for mod: {1}", DateTime.Now.ToString(settings.TimestampFormat), modID); Console.WriteLine("[{0}] Starting dedicated server for mod: {1}", DateTime.Now.ToString(settings.TimestampFormat), modID);
while (true) while (true)
{ {
var server = new Server(new IPEndPoint(IPAddress.Any, settings.ListenPort), settings, modData, true); // HACK: The engine code *still* assumes that Game.ModData is set
var modData = Game.ModData = new ModData(mods[modID], mods);
modData.MapCache.LoadMaps();
settings.Map = modData.MapCache.ChooseInitialMap(settings.Map, new MersenneTwister());
var server = new Server(new IPEndPoint(IPAddress.Any, settings.ListenPort), settings, modData, true);
GC.Collect();
while (true) while (true)
{ {
Thread.Sleep(1000); Thread.Sleep(1000);
@@ -78,6 +78,7 @@ namespace OpenRA.Server
} }
} }
modData.Dispose();
Console.WriteLine("[{0}] Starting a new server instance...", DateTime.Now.ToString(settings.TimestampFormat)); Console.WriteLine("[{0}] Starting a new server instance...", DateTime.Now.ToString(settings.TimestampFormat));
} }
} }