diff --git a/TrueCraft.API/Server/IMultiplayerServer.cs b/TrueCraft.API/Server/IMultiplayerServer.cs index b33a8da..73fb25c 100644 --- a/TrueCraft.API/Server/IMultiplayerServer.cs +++ b/TrueCraft.API/Server/IMultiplayerServer.cs @@ -30,6 +30,7 @@ namespace TrueCraft.API.Server bool EnableClientLogging { get; set; } void Start(IPEndPoint endPoint); + void Stop(); void RegisterPacketHandler(byte packetId, PacketHandler handler); void AddWorld(IWorld world); void AddLogProvider(ILogProvider provider); diff --git a/TrueCraft/MultiplayerServer.cs b/TrueCraft/MultiplayerServer.cs index 0f733ad..9f0c531 100644 --- a/TrueCraft/MultiplayerServer.cs +++ b/TrueCraft/MultiplayerServer.cs @@ -60,6 +60,7 @@ namespace TrueCraft private readonly PacketHandler[] PacketHandlers; private IList LogProviders; internal object ClientLock = new object(); + private bool ShuttingDown = false; public MultiplayerServer() { @@ -96,6 +97,7 @@ namespace TrueCraft public void Start(IPEndPoint endPoint) { + ShuttingDown = false; Listener = new TcpListener(endPoint); Listener.Start(); Listener.BeginAcceptTcpClient(AcceptClient, null); @@ -104,6 +106,16 @@ namespace TrueCraft EnvironmentWorker.Change(100, 1000 / 20); } + public void Stop() + { + ShuttingDown = true; + Listener.Stop(); + foreach (var w in Worlds) + w.Save(); + foreach (var c in Clients) + DisconnectClient(c); + } + public void AddWorld(IWorld world) { Worlds.Add(world); @@ -235,6 +247,8 @@ namespace TrueCraft private void DoEnvironment(object discarded) { + if (ShuttingDown) + return; Scheduler.Update(); foreach (var manager in EntityManagers) { @@ -246,6 +260,8 @@ namespace TrueCraft { while (true) { + if (ShuttingDown) + return; bool idle = true; for (int i = 0; i < Clients.Count && i >= 0; i++) { diff --git a/TrueCraft/Program.cs b/TrueCraft/Program.cs index ff4782d..031b47f 100644 --- a/TrueCraft/Program.cs +++ b/TrueCraft/Program.cs @@ -81,10 +81,7 @@ namespace TrueCraft static void HandleCancelKeyPress(object sender, ConsoleCancelEventArgs e) { - foreach (var w in Server.Worlds) - { - w.Save(); - } + Server.Stop(); } static void HandleChatMessageReceived(object sender, ChatMessageEventArgs e)