/// <summary>
        /// Received Event from GameServer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void GameClientOnReceivedDataEvent(object sender, ReceivedEventArgs args)
        {
            try
            {
                var gameEvent = args.Data as GameEvent;
                if (gameEvent != null && gameEvent.EventType == GameEvent.Type.GuiJoined)
                {
                    var gameArea = (Game.Middleware.Logic.Model.Model.Game) gameEvent.Data;

                    if (gameArea != null)
                    {
                        this.GameConnected = true;

                        this.CurrentGameView = new GameView {DataContext = new GameViewModel(this.GameClient, gameArea, this.PlayerName)};
                        this.CurrentGameView.Show();
                    }
                    else
                    {
                        this.ShowInformationOverlay("Did not receive any new Games! Please try again.");
                    }

                    this.GameClient.ReceivedDataEvent -= GameClientOnReceivedDataEvent;
                }
            }
            catch (Exception ex)
            {
                this.ShowInformationOverlay("Error while waiting for GameServer: " + ex.Message);
            }
        }
        /// <summary>
        /// Received a new GameEvent
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="receivedEventArgs"></param>
        private void GameClientOnReceivedEvent(object sender, ReceivedEventArgs receivedEventArgs)
        {
            var receivedEvent = receivedEventArgs.Data as GameEvent;
            if (receivedEvent == null) return;
            switch (receivedEvent.EventType)
            {
                // Area Update
                case GameEvent.Type.AreaUpdate:
                    {
                        OnAreaUpdateEvent(new AreaUpdateEventArgs(receivedEvent.Data as Area));
                    }
                    break;

                // Player left, close the View
                case GameEvent.Type.PlayerLeft:
                    {
                        OnPlayerLeftEvent(new PlayerLeftEventArgs());
                    }
                    break;

                // Player left, close the View
                case GameEvent.Type.PlayerLost:
                    {
                        OnPlayerLostEvent(new PlayerLostEventArgs((bool)receivedEvent.Data));
                    }
                    break;

                // Player joined after connection failure
                case GameEvent.Type.PlayerJoined:
                    {
                        OnPlayerJoinedEvent(new PlayerJoinedEventArgs());
                    }
                    break;

                // Player left, close the View
                case GameEvent.Type.PlayerKicked:
                    {
                        OnPlayerKickedEvent(new PlayerKickedEventArgs());
                    }
                    break;

                // Game Ready, show the path
                case GameEvent.Type.GameReady:
                    {
                        OnGameReadyEvent(new GameReadyEventArgs(receivedEvent.Data as Path));
                    }
                    break;

                // Area Update
                case GameEvent.Type.GameFinish:
                    {
                        OnGameFinishEvent(new GameFinishEventArgs((bool)receivedEvent.Data));
                    }
                    break;

                // Set all Areas back
                case GameEvent.Type.GameStart:
                    {
                        OnGameStartEvent(new GameStartEventArgs());
                    }
                    break;

                // Game Reset
                case GameEvent.Type.GameReset:
                    {
                        OnGameResetEvent(new GameResetEventArgs());
                    }
                    break;

                // Set all Areas back
                case GameEvent.Type.PlayerFinish:
                    {
                        OnPlayerFinishEvent(new PlayerFinishEvent((double)receivedEvent.Data));
                    }
                    break;
            }
        }
 /// <summary>
 /// Received data from TCP Connection
 /// </summary>
 /// <param name="e"></param>
 private void OnReceivedEvent(ReceivedEventArgs e)
 {
     if (this.ReceivedDataEvent != null) this.ReceivedDataEvent(this, e);
 }