private void Handle_Join_Match( CJoinMatchSuccess message )
        {
            if ( Match != null )
            {
                throw new CApplicationException( "Received duplicate match state data" );
            }

            Set_Match( new CClientMatchInstance( message.MatchState, message.GameState ) );
            CClientLogicalThread.Instance.Add_UI_Notification( new CUIScreenStateNotification( EUIScreenState.Match_Idle ) );
            CClientResource.Output_Text< EClientTextID >( EClientTextID.Client_Match_Join_Success );
        }
        public void On_Player_Reconnect( EPersistenceID player_id )
        {
            if ( MatchState.On_Player_Reconnect( player_id ) )
            {
                Send_Message_To_Members( new CMatchPlayerConnectionStateMessage( player_id, true ), player_id );
            }

            CMatchState match_state = Clone_Match_State( player_id );
            CGameState game_state = Clone_Game_State( player_id );
            CJoinMatchSuccess join_success = new CJoinMatchSuccess( match_state, game_state );
            CServerMessageRouter.Send_Message_To_Player( join_success, player_id );

            if ( Players.Contains( player_id ) )
            {
                CAsyncBackendOperations.Join_Match_Channel( ID, player_id, MatchChannel );
            }

            if ( Observers.Contains( player_id ) )
            {
                CAsyncBackendOperations.Join_Observer_Channel( ID, player_id, ObserverChannel );
            }
        }