コード例 #1
0
        // Construction
        public CBrowseLobbyAddRemoveMessage( CLobbySummary new_lobby, ELobbyID removed_lobby )
            : base()
        {
            Lobbies = new List< CLobbySummary >();
            if ( new_lobby != null )
            {
                Lobbies.Add( new_lobby );
            }

            RemovedLobby = removed_lobby;
        }
コード例 #2
0
        // Public interface
        // Operations
        // Channel Creation
        public static void Create_Lobby_Chat_Channel( CChatChannelConfig channel_config, ELobbyID lobby_id, EPersistenceID source_player )
        {
            CCreateChatChannelRequestServerMessage create_lobby_channel_message = new CCreateChatChannelRequestServerMessage( channel_config );
            create_lobby_channel_message.Handler =
                delegate( CResponseMessage response )
                {
                    CCreateChatChannelResponseServerMessage response_msg = response as CCreateChatChannelResponseServerMessage;
                    On_Lobby_Chat_Channel_Creation_Response( lobby_id, source_player, response_msg );
                };

            CServerMessageRouter.Send_Message_To_Chat_Server( create_lobby_channel_message );
        }
コード例 #3
0
 public static string Get_Lobby_Log_Description( ELobbyID lobby_id )
 {
     CLobby lobby = Instance.Get_Lobby( lobby_id );
     if ( lobby != null )
     {
         return lobby.GameDescription;
     }
     else
     {
         return String.Format( "Lobby#{0}", (int)lobby_id );
     }
 }
コード例 #4
0
        public void Insert_Watched_Lobby( ELobbyID lobby_id )
        {
            if ( m_WatchedLobbies.Count == 0 )
            {
                m_WatchedLobbies.Add( lobby_id );
                return;
            }

            // dumb and linear
            int index = 0;
            while ( index < m_WatchedLobbies.Count && lobby_id > m_WatchedLobbies[ index ] )
            {
                index++;
            }

            m_WatchedLobbies.Insert( index, lobby_id );
        }
コード例 #5
0
 private static void On_Lobby_Chat_Channel_Join_Response( EPersistenceID player_id, ELobbyID lobby_id, CJoinChatChannelResponseServerMessage response )
 {
     CServerLobbyManager.Instance.On_Lobby_Chat_Channel_Join_Response( lobby_id, player_id, response );
 }
コード例 #6
0
 public static void Player_Join_Lobby_Channel( EPersistenceID player_id, ELobbyID lobby_id, EChannelID channel_id )
 {
     Change_System_Channel( player_id,
                                   channel_id,
                                   EChannelGameProperties.OrdinarySingletonMask,
                                   delegate( CResponseMessage response ) {
                                         On_Lobby_Chat_Channel_Join_Response( player_id, lobby_id, response as CJoinChatChannelResponseServerMessage );
                                   } );
 }
コード例 #7
0
 private void Send_Message_To_Members( ELobbyID lobby_id, CNetworkMessage message )
 {
     Send_Message_To_Members( lobby_id, message, EPersistenceID.Invalid );
 }
コード例 #8
0
        private void On_Join_Lobby_Failure( ELobbyID lobby_id, EPersistenceID player_id, EMessageRequestID request_id, EJoinLobbyFailureReason reason )
        {
            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Player {0} failed to join lobby {1} because of {2}.",
                                                                                                    CConnectedPlayerManager.Get_Player_Log_Name( player_id ),
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    reason.ToString() ) );

            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Player_By_Persistence_ID( player_id );
            if ( player != null )
            {
                player.Change_State( EConnectedPlayerState.Chat_Idle );
            }

            if ( !CConnectedPlayerManager.Instance.Is_Connected( player_id ) )
            {
                return;
            }

            CJoinLobbyFailure join_response = new CJoinLobbyFailure( request_id, reason );
            CServerMessageRouter.Send_Message_To_Player( join_response, player_id );
        }
コード例 #9
0
        public void On_Lobby_Chat_Channel_Creation_Response( ELobbyID lobby_id, EPersistenceID player_id, CCreateChatChannelResponseServerMessage response_msg )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                if ( response_msg.ChannelID != EChannelID.Invalid )
                {
                    CDestroyChatChannelServerMessage destroy_channel_message = new CDestroyChatChannelServerMessage( response_msg.ChannelID );
                    CServerMessageRouter.Send_Message_To_Chat_Server( destroy_channel_message );
                }

                return;
            }

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Lobby {0} chat channel {1} creation result = {2}.",
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    response_msg.ChannelName,
                                                                                                    response_msg.Error.ToString() ) );

            if ( response_msg.Error != EChannelCreationError.None )
            {
                Shutdown_Lobby( lobby_id, ELobbyDestroyedReason.Chat_Channel_Creation_Failure );
                return;
            }

            lobby.Initialize_Chat_Channel( response_msg.ChannelID );
            lobby.ConnectedMemberIDs.Apply( pid => CAsyncBackendOperations.Player_Join_Lobby_Channel( pid, lobby_id, lobby.ChatChannel ) );
        }
コード例 #10
0
 // Methods
 // Public interface
 public void Join_Lobby_By_Browsing( EPersistenceID player_id, ELobbyID lobby_id )
 {
     Join_Lobby_Aux( player_id, Get_Lobby( lobby_id ), EMessageRequestID.Invalid, "" );
 }
コード例 #11
0
        public CServerLobby Get_Lobby( ELobbyID lobby_id )
        {
            CServerLobby lobby = null;
            if ( !m_Lobbies.TryGetValue( lobby_id, out lobby ) )
            {
                return null;
            }

            return lobby;
        }
コード例 #12
0
 // Methods
 // Public interface
 public void Initialize( ELobbyID id, uint player_count, uint observer_count )
 {
     ID = id;
     PlayerCount = player_count;
     ObserverCount = observer_count;
 }
コード例 #13
0
        // Methods
        // Public interface
        public void Initialize( ELobbyID id, CLobbyConfig config, DateTime creation_time, EPersistenceID creator, uint player_count, uint observer_count )
        {
            Config = config.Clone( false );

            ID = id;
            CreationTime = creation_time;
            Creator = creator;
            PlayerCount = player_count;
            ObserverCount = observer_count;
        }
コード例 #14
0
 public void Remove_Watched_Lobby( ELobbyID lobby_id )
 {
     m_WatchedLobbies.Remove( lobby_id );
 }
コード例 #15
0
 public bool Is_Watching( ELobbyID lobby_id )
 {
     return m_WatchedLobbies.Contains( lobby_id );
 }
コード例 #16
0
        private void On_Create_Lobby_Failure( ELobbyID lobby_id, EPersistenceID player_id, EMessageRequestID request_id, ECreateLobbyFailureReason reason )
        {
            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "{0}'s lobby {1} failed to create because {2}.",
                                                                                                    CConnectedPlayerManager.Get_Player_Log_Name( player_id ),
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    reason.ToString() ) );

            Shutdown_Lobby( lobby_id, ELobbyDestroyedReason.Creation_Failure );

            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Player_By_Persistence_ID( player_id );
            if ( player != null )
            {
                player.Change_State( EConnectedPlayerState.Chat_Idle );
            }

            if ( !CConnectedPlayerManager.Instance.Is_Connected( player_id ) )
            {
                return;
            }

            CCreateLobbyFailure create_response = new CCreateLobbyFailure( request_id, reason );
            CServerMessageRouter.Send_Message_To_Player( create_response, player_id );
        }
コード例 #17
0
        private void On_Create_Lobby_Success( EPersistenceID player_id, EMessageRequestID request_id, ELobbyID lobby_id )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );

            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Player_By_Persistence_ID( player_id );
            player.On_Join_Lobby_Success( lobby_id );

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Player {0}'s lobby {1} successfully created.",
                                                                                                    player.Name,
                                                                                                    lobby.GameDescription ) );

            CCreateLobbySuccess create_response = new CCreateLobbySuccess( request_id, lobby.Clone_State() );
            CServerMessageRouter.Send_Message_To_Player( create_response, player_id );

            if ( lobby.IsPublic )
            {
                CServerLobbyBrowserManager.Instance.Notify_Browsers_Of_New_Lobby( lobby_id );
            }
        }
コード例 #18
0
        public void On_Lobby_Chat_Channel_Join_Response( ELobbyID lobby_id, EPersistenceID player_id, CJoinChatChannelResponseServerMessage response_msg )
        {
            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Lobby {0} chat channel join result = {1}.",
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    response_msg.Error.ToString() ) );

            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            if ( !lobby.Is_Member( player_id ) )
            {
                return;
            }

            if ( response_msg.Error != EChannelJoinError.None )
            {
                if ( player_id == lobby.Creator )
                {
                    Shutdown_Lobby( lobby_id, ELobbyDestroyedReason.Chat_Channel_Join_Failure );
                }
                else
                {
                    Remove_From_Lobby( lobby_id, player_id, ERemovedFromLobbyReason.Unable_To_Join_Chat_Channel );
                }
            }
        }
コード例 #19
0
        private void On_Join_Lobby_Success( EPersistenceID player_id, EMessageRequestID request_id, ELobbyID lobby_id )
        {
            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Player_By_Persistence_ID( player_id );
            player.On_Join_Lobby_Success( lobby_id );

            CServerLobby lobby = Get_Lobby( lobby_id );

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Player {0} successfully joined lobby {1}.",
                                                                                                    player.Name,
                                                                                                    lobby.GameDescription ) );

            CJoinLobbySuccess join_response = new CJoinLobbySuccess( request_id, lobby.Clone_State() );
            CServerMessageRouter.Send_Message_To_Player( join_response, player_id );

            ELobbyMemberType member_type;
            uint member_index;
            lobby.Get_Member_Info( player_id, out member_index, out member_type );

            CLobbyMemberJoinedOperation op = new CLobbyMemberJoinedOperation( player_id, player.Name, member_type, member_index );
            Send_Message_To_Members( lobby_id, new CLobbyOperationMessage( op ), player_id );
        }
コード例 #20
0
 public void On_Player_Disconnect( EPersistenceID player_id, ELobbyID lobby_id )
 {
     Change_Player_State( player_id, lobby_id, ELobbyMemberState.Disconnected );
 }
コード例 #21
0
        public void Change_Player_State( EPersistenceID player_id, ELobbyID lobby_id, ELobbyMemberState new_state )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            ELobbyMemberState old_state = lobby.Get_Member_State( player_id );
            if ( old_state == new_state )
            {
                return;
            }

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Player {0} changed state in lobby {1} from {2} to {3}.",
                                                                                                    CConnectedPlayerManager.Get_Player_Log_Name( player_id ),
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    old_state.ToString(),
                                                                                                    new_state.ToString() ) );

            lobby.Set_Member_State( player_id, new_state );

            CLobbyMemberChangeStateOperation change_state_op = new CLobbyMemberChangeStateOperation( player_id, new_state );
            Send_Message_To_Members( lobby_id, new CLobbyOperationMessage( change_state_op ) );
        }
コード例 #22
0
        public void On_Player_Reconnect( EPersistenceID player_id, ELobbyID lobby_id )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                throw new CApplicationException( "Player reconnected to non-existent lobby." );
            }

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Player {0} successfully rejoined lobby {1}.",
                                                                                                    CConnectedPlayerManager.Get_Player_Log_Name( player_id ),
                                                                                                    Get_Lobby_Log_Description( lobby_id ) ) );

            Change_Player_State( player_id, lobby_id, ELobbyMemberState.Not_Ready );

            CServerMessageRouter.Send_Message_To_Player( new CJoinLobbySuccess( EMessageRequestID.Invalid, lobby.Clone_State() ), player_id );

            if ( lobby.ChatChannel != EChannelID.Invalid )
            {
                CAsyncBackendOperations.Player_Join_Lobby_Channel( player_id, lobby_id, lobby.ChatChannel );
            }
        }
コード例 #23
0
        private void Send_Message_To_Members( ELobbyID lobby_id, CNetworkMessage message, EPersistenceID exclude_id )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            lobby.ConnectedMemberIDs.Where( cid => cid != exclude_id ).Apply( id => CServerMessageRouter.Send_Message_To_Player( message, id ) );
        }
コード例 #24
0
 public void Remove_From_Lobby( ELobbyID lobby_id, EPersistenceID player_id, ERemovedFromLobbyReason reason )
 {
     Remove_From_Lobby( lobby_id, player_id, reason, EMessageRequestID.Invalid );
 }
コード例 #25
0
 // Private interface
 // Callbacks
 // Channel Creation
 private static void On_Lobby_Chat_Channel_Creation_Response( ELobbyID lobby_id, EPersistenceID player_id, CCreateChatChannelResponseServerMessage response_msg )
 {
     CServerLobbyManager.Instance.On_Lobby_Chat_Channel_Creation_Response( lobby_id, player_id, response_msg );
 }
コード例 #26
0
        public void Remove_From_Lobby( ELobbyID lobby_id, EPersistenceID player_id, ERemovedFromLobbyReason reason, EMessageRequestID request_id )
        {
            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Removing player {0} from lobby {1} for reason {2}.",
                                                                                                    CConnectedPlayerManager.Get_Player_Log_Name( player_id ),
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    reason.ToString() ) );

            if ( CConnectedPlayerManager.Instance.Is_Connected( player_id ) && reason != ERemovedFromLobbyReason.Lobby_Destroyed_Game_Started )
            {
                CAsyncBackendOperations.Join_General_Channel( player_id, EMessageRequestID.Invalid );
            }

            CConnectedPlayer player = CConnectedPlayerManager.Instance.Get_Player_By_Persistence_ID( player_id );
            player.On_Leave_Lobby();

            CLobbyMemberLeftOperation op = new CLobbyMemberLeftOperation( player_id, reason );
            bool is_lobby_shutdown = Is_Channel_Shutdown_Reason( reason );
            if ( is_lobby_shutdown )
            {
                CServerMessageRouter.Send_Message_To_Player( new CLobbyOperationMessage( op ), player_id );
            }
            else
            {
                Send_Message_To_Members( lobby_id, new CLobbyOperationMessage( op ) );
            }

            lobby.Remove_Member( player_id, !is_lobby_shutdown );
        }
コード例 #27
0
        public void Shutdown_Lobby( ELobbyID lobby_id, ELobbyDestroyedReason reason )
        {
            CLog.Log( ELoggingChannel.Lobby, ELogLevel.Medium, String.Format( "Shutting down lobby {0} for reason {1}.",
                                                                                                    Get_Lobby_Log_Description( lobby_id ),
                                                                                                    reason.ToString() ) );

            CServerLobby lobby = Get_Lobby( lobby_id );
            if ( lobby == null )
            {
                return;
            }

            if ( lobby.IsPublic )
            {
                CServerLobbyBrowserManager.Instance.Notify_Browsers_Of_Removed_Lobby( lobby_id );
            }

            List< EPersistenceID > members = new List< EPersistenceID >( lobby.MemberIDs );
            members.Apply( member => Remove_From_Lobby( lobby.ID, member, Compute_Removal_Reason( reason ) ) );

            if ( lobby.ChatChannel != EChannelID.Invalid )
            {
                CDestroyChatChannelServerMessage destroy_channel_message = new CDestroyChatChannelServerMessage( lobby.ChatChannel );
                CServerMessageRouter.Send_Message_To_Chat_Server( destroy_channel_message );
            }

            m_Lobbies.Remove( lobby_id );
            m_LobbiesByCreator.Remove( lobby.Creator );
        }
コード例 #28
0
 private CServerLobbyManager()
 {
     m_NextLobbyID = ( ELobbyID ) ( ELobbyID.Invalid + 1 );
 }
コード例 #29
0
 // constructors
 public CServerLobby( ELobbyID id, CLobbyConfig config, EPersistenceID creator )
     : base(id, config, creator)
 {
 }
コード例 #30
0
 public void Add_Watched_Lobby( ELobbyID lobby_id )
 {
     m_WatchedLobbies.Add( lobby_id );
 }