private void Log(Messages.GameMaster.IGameMasterHandler message)
        {
            Xsd2.GameMessage msg = message as Xsd2.GameMessage;
            if (msg != null && _logger != null)
            {
                var player = GameState.BluePlayers.FirstOrDefault(p => p.Guid.ToString() == msg.playerGuid);
                if (player == null)
                {
                    player = GameState.RedPlayers.FirstOrDefault(p => p.Guid.ToString() == msg.playerGuid);
                }
                _logger.WriteLog(message.GetType().ToString(), GameState.GameId.ToString(), player.Id.ToString(), player.Guid.ToString(), player.TeamColour.ToString(), player.PlayerType.ToString());
                if (GameState.GameFinished)
                {
                    string result = "";
                    result = player.TeamColour == Xsd2.TeamColour.blue ? "Victory" : "Defeat";

                    foreach (var p in GameState.BluePlayers)
                    {
                        _logger.WriteLog(result, GameState.GameId.ToString(), p.Id.ToString(), p.Guid.ToString(), p.TeamColour.ToString(), p.PlayerType.ToString());
                    }
                    result = result == "Victory" ? "Defeat" : "Victory";
                    foreach (var p in GameState.RedPlayers)
                    {
                        _logger.WriteLog(result, GameState.GameId.ToString(), p.Id.ToString(), p.Guid.ToString(), p.TeamColour.ToString(), p.PlayerType.ToString());
                    }
                }
            }

            if (GameState.GameFinished && _logger != null)
            {
                _logger.Dispose();
                _logger = null;
            }
        }
        private void Receive()
        {
            while (_status)
            {
                try
                {
                    if (_tcpClient.Available > 0 || !String.IsNullOrEmpty(_msg))
                    {
                        byte[] arr = new byte[2048];
                        if (_tcpClient.Available > 0)
                        {
                            _tcpClient.GetStream().Read(arr, 0, arr.Length);
                            _msg += Encoding.UTF8.GetString(arr);
                        }

                        _msg = _msg.Replace("\0", string.Empty);

                        if (Messages.KeepAlive.IsKeepAlive(_msg))
                        {
                            _msg = _msg.Substring(1);
                            ResetTimer();
                        }
                        else
                        {
                            int    specialByteIndex;
                            string currentMsg = _msgParser.Parse(ref _msg, out specialByteIndex);
                            if (specialByteIndex == -1 || string.IsNullOrEmpty(currentMsg))
                            {
                                continue;
                            }
                            ResetTimer();
                            Console.WriteLine(currentMsg);
                            var type = _xmlRootReader.GetMessageType(currentMsg);
                            //Deserialization of the message
                            var serializer = new XmlSerializer(type);
                            Messages.GameMaster.IGameMasterHandler message = null;
                            using (var stream = new StringReader(currentMsg))
                            {
                                message = (IGameMasterHandler)serializer.Deserialize(stream);
                            }
                            message.HandleOnGameMaster(this);
                            Log(message);
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Lost connection: " + e);
                    _status = false;
                    //Disconnect();
                }

                Thread.Sleep(30);
            }
        }