public override bool Stop() { if (!base.Stop()) { return(false); } Logger.Log(LogType.Debug, $"Stopping {ComponentName}."); if (PlayerWatcherToken?.IsCancellationRequested == false) { PlayerWatcherToken.Cancel(); PlayerWatcherLock.Wait(); } if (PlayerCorrectionToken?.IsCancellationRequested == false) { PlayerCorrectionToken.Cancel(); PlayerCorrectionLock.Wait(); } ModuleManager.ClientJoined -= ModuleManager_ClientJoined; ModuleManager.ClientLeaved -= ModuleManager_ClientLeaved; Listener?.Stop(); lock (JoiningClients) { foreach (var client in JoiningClients) { client?.Dispose(); } JoiningClients.Clear(); } lock (Clients) { foreach (var client in Clients) { client?.SendKick("Server is closing!"); } Clients.Clear(); } NearPlayers.Clear(); return(true); }
private void PlayerCorrectionCycle() { PlayerCorrectionLock.Reset(); var watch = Stopwatch.StartNew(); while (!PlayerCorrectionToken.IsCancellationRequested) { foreach (var nearPlayers in NearPlayers.Where(nearPlayers => nearPlayers.Value != null)) { foreach (var player in nearPlayers.Value.Where(player => player.Moving)) { foreach (var playerToSend in nearPlayers.Value.Where(playerToSend => player != playerToSend)) { playerToSend.SendPacket(player.GetDataPacket()); } } } if (watch.ElapsedMilliseconds < 10) { PlayerCorrectionThreadTime = watch.ElapsedMilliseconds; var time = (int)(5 - watch.ElapsedMilliseconds); if (time < 0) { time = 0; } Thread.Sleep(time); } watch.Reset(); watch.Start(); } PlayerCorrectionLock.Set(); }
protected override void Dispose(bool disposing) { if (!IsDisposed) { if (disposing) { // TODO if (PlayerWatcherToken?.IsCancellationRequested == false) { PlayerWatcherToken.Cancel(); PlayerWatcherLock.Wait(); } if (PlayerCorrectionToken?.IsCancellationRequested == false) { PlayerCorrectionToken.Cancel(); PlayerCorrectionLock.Wait(); } } IsDisposed = true; } base.Dispose(disposing); }