bool CConnectManager::StaticProcessPacket ( unsigned char ucPacketID, NetBitStreamInterface& BitStream ) { // We're working on connecting? if ( g_pConnectManager->m_bIsConnecting ) { // The packet we're expecting? if ( ucPacketID == PACKET_ID_MOD_NAME ) { // Read out the mod to load char* szModName = new char [ BitStream.GetNumberOfBytesUsed () + 1 ]; memset ( szModName, 0, BitStream.GetNumberOfBytesUsed () + 1 ); if ( BitStream.Read ( szModName, BitStream.GetNumberOfBytesUsed () ) ) { // Backward compatibly examine the bytes following the mod name BitStream.ResetReadPointer (); BitStream.Read ( szModName, strlen ( szModName ) ); char cPad; BitStream.Read ( cPad ); unsigned short usServerBitStreamVersion = 0x01; BitStream.Read ( usServerBitStreamVersion ); // This will silently fail for < 1.0.2 and leave the bitstream version at 0x01 CCore::GetSingleton ().GetNetwork ()->SetServerBitStreamVersion ( usServerBitStreamVersion ); // Limit the nick length for servers that have a problem with max length nicks if ( usServerBitStreamVersion < 0x06 ) g_pConnectManager->m_strNick = g_pConnectManager->m_strNick.substr ( 0, MAX_PLAYER_NICK_LENGTH - 1 ); // Populate the arguments to pass it (-c host port nick) SString strArguments ( "%s %s", g_pConnectManager->m_strNick.c_str(), g_pConnectManager->m_strPassword.c_str() ); // Hide the messagebox we're currently showing CCore::GetSingleton ().RemoveMessageBox (); // If we connected from quick-connect, get rid of it CQuickConnect * pQuickConnect = CCore::GetSingleton ().GetLocalGUI ()->GetMainMenu ()->GetQuickConnectWindow (); if ( pQuickConnect->IsVisible () ) pQuickConnect->SetVisible ( false ); // Save the connection details into the config CVARS_SET ( "host", g_pConnectManager->m_strHost ); CVARS_SET ( "port", g_pConnectManager->m_usPort ); CVARS_SET ( "password", g_pConnectManager->m_strPassword ); //Conver the Address to an unsigned long unsigned long ulAddr = inet_addr( g_pConnectManager->m_strHost.c_str() ); //Create an instance of the in_addr structure to store the address in_addr Address; //Set the address to the unsigned long we just created Address.S_un.S_addr = ulAddr; //Set the current server info and Add the ASE Offset to the Query port) CCore::GetSingleton().SetCurrentServer ( Address, g_pConnectManager->m_usPort + 123 ); // Kevuwk: Forced the config to save here so that the IP/Port isn't lost on crash CCore::GetSingleton ().SaveConfig (); // Reset our variables g_pConnectManager->m_strNick = ""; g_pConnectManager->m_strHost = ""; g_pConnectManager->m_strPassword = ""; g_pConnectManager->m_usPort = 0; g_pConnectManager->m_bIsConnecting = false; g_pConnectManager->m_tConnectStarted = 0; // Load the mod if ( !CModManager::GetSingleton ().Load ( szModName, strArguments ) ) { // Failed loading the mod strArguments.Format ( "No such mod installed (%s)", szModName ); CCore::GetSingleton ().ShowMessageBox ( "Error", strArguments, MB_BUTTON_OK | MB_ICON_ERROR ); g_pConnectManager->Abort (); } } else { // Show failed message and abort the attempt CCore::GetSingleton ().ShowMessageBox ( "Error", "Bad server response (2)", MB_BUTTON_OK | MB_ICON_ERROR ); g_pConnectManager->Abort (); } delete [] szModName; } else { // Not the player joined packet? if ( ucPacketID != PACKET_ID_SERVER_JOIN && ucPacketID != PACKET_ID_SERVER_JOIN_DATA ) { // Show failed message and abort the attempt CCore::GetSingleton ().ShowMessageBox ( "Error", "Bad server response (1)", MB_BUTTON_OK | MB_ICON_ERROR ); g_pConnectManager->Abort (); } } return true; } return false; }
bool CConnectManager::StaticProcessPacket ( unsigned char ucPacketID, NetBitStreamInterface& BitStream ) { // We're working on connecting? if ( g_pConnectManager->m_bIsConnecting ) { g_pConnectManager->OnServerExists (); // The packet we're expecting? if ( ucPacketID == PACKET_ID_MOD_NAME ) { // Read packet data unsigned short usServerBitStreamVersion = 0x01; BitStream.Read ( usServerBitStreamVersion ); SString strModName; BitStream.ReadString ( strModName ); // Process packet data CCore::GetSingleton ().GetNetwork ()->SetServerBitStreamVersion ( usServerBitStreamVersion ); if ( strModName != "" ) { // Populate the arguments to pass it (-c host port nick) SString strArguments ( "%s %s", g_pConnectManager->m_strNick.c_str(), g_pConnectManager->m_strPassword.c_str() ); // Hide the messagebox we're currently showing CCore::GetSingleton ().RemoveMessageBox (); // If we connected from quick-connect, get rid of it CQuickConnect * pQuickConnect = CCore::GetSingleton ().GetLocalGUI ()->GetMainMenu ()->GetQuickConnectWindow (); if ( pQuickConnect->IsVisible () ) pQuickConnect->SetVisible ( false ); // Save the connection details into the config if ( g_pConnectManager->m_bSave ) { CVARS_SET ( "host", g_pConnectManager->m_strHost ); CVARS_SET ( "port", g_pConnectManager->m_usPort ); CVARS_SET ( "password", g_pConnectManager->m_strPassword ); } //Set the current server info and Add the ASE Offset to the Query port) CCore::GetSingleton().SetCurrentServer ( g_pConnectManager->m_Address, g_pConnectManager->m_usPort ); SetApplicationSettingInt ( "last-server-ip", g_pConnectManager->m_Address.s_addr ); SetApplicationSettingInt ( "last-server-port", g_pConnectManager->m_usPort ); SetApplicationSettingInt ( "last-server-time", _time32 ( NULL ) ); // Kevuwk: Forced the config to save here so that the IP/Port isn't lost on crash CCore::GetSingleton ().SaveConfig (); // Reset our variables g_pConnectManager->m_strNick = ""; g_pConnectManager->m_strHost = ""; g_pConnectManager->m_strPassword = ""; g_pConnectManager->m_Address.s_addr = 0; g_pConnectManager->m_usPort = 0; g_pConnectManager->m_bIsConnecting = false; g_pConnectManager->m_bIsDetectingVersion = false; g_pConnectManager->m_tConnectStarted = 0; // Load the mod if ( !CModManager::GetSingleton ().Load ( strModName, strArguments ) ) { // Failed loading the mod strArguments.Format ( _("No such mod installed (%s)"), strModName.c_str() ); CCore::GetSingleton ().ShowMessageBox ( _("Error")+_E("CC31"), strArguments, MB_BUTTON_OK | MB_ICON_ERROR ); // Mod loading failed g_pConnectManager->Abort (); } } else { // Show failed message and abort the attempt CCore::GetSingleton ().ShowNetErrorMessageBox ( _("Error")+_E("CC32"), _("Bad server response (2)") ); g_pConnectManager->Abort (); } } else { // Not the player joined packet? if ( ucPacketID != PACKET_ID_SERVER_JOIN && ucPacketID != PACKET_ID_SERVER_JOIN_DATA ) { // Show failed message and abort the attempt CCore::GetSingleton ().ShowNetErrorMessageBox ( _("Error")+_E("CC33"), _("Bad server response (1)") ); g_pConnectManager->Abort (); } } return true; } return false; }
bool CConnectManager::StaticProcessPacket ( unsigned char ucPacketID, NetBitStreamInterface& BitStream ) { // We're working on connecting? if ( g_pConnectManager->m_bIsConnecting ) { // The packet we're expecting? if ( ucPacketID == PACKET_ID_MOD_NAME ) { // Read out the mod to load char* szModName = new char [ BitStream.GetNumberOfBytesUsed () + 1 ]; memset ( szModName, 0, BitStream.GetNumberOfBytesUsed () + 1 ); if ( BitStream.Read ( szModName, BitStream.GetNumberOfBytesUsed () ) ) { // Backward compatibly examine the bytes following the mod name BitStream.ResetReadPointer (); BitStream.Read ( szModName, strlen ( szModName ) ); char cPad; BitStream.Read ( cPad ); unsigned short usServerBitStreamVersion = 0x01; BitStream.Read ( usServerBitStreamVersion ); // This will silently fail for < 1.0.2 and leave the bitstream version at 0x01 CCore::GetSingleton ().GetNetwork ()->SetServerBitStreamVersion ( usServerBitStreamVersion ); // Populate the arguments to pass it (-c host port nick) SString strArguments ( "%s %s", g_pConnectManager->m_strNick.c_str(), g_pConnectManager->m_strPassword.c_str() ); // Hide the messagebox we're currently showing CCore::GetSingleton ().RemoveMessageBox (); // If we connected from quick-connect, get rid of it CQuickConnect * pQuickConnect = CCore::GetSingleton ().GetLocalGUI ()->GetMainMenu ()->GetQuickConnectWindow (); if ( pQuickConnect->IsVisible () ) pQuickConnect->SetVisible ( false ); // Save the connection details into the config CVARS_SET ( "host", g_pConnectManager->m_strHost ); CVARS_SET ( "port", g_pConnectManager->m_usPort ); CVARS_SET ( "password", g_pConnectManager->m_strPassword ); // Save the connection details into the recently played servers list in_addr Address; if ( CServerListItem::Parse ( g_pConnectManager->m_strHost.c_str (), Address ) ) { CServerBrowser* pServerBrowser = CCore::GetSingleton ().GetLocalGUI ()->GetMainMenu ()->GetServerBrowser (); CServerList* pRecentList = pServerBrowser->GetRecentList (); CServerListItem RecentServer ( Address, g_pConnectManager->m_usPort + SERVER_LIST_QUERY_PORT_OFFSET ); if ( !pRecentList->Exists ( RecentServer ) ) { pRecentList->Add ( RecentServer ); } // Set as our current server for xfire if ( XfireIsLoaded () ) { const char *szKey[2], *szValue[2]; szKey[0] = "Gamemode"; szValue[0] = RecentServer.strType.c_str(); szKey[1] = "Map"; szValue[1] = RecentServer.strMap.c_str(); XfireSetCustomGameData ( 2, szKey, szValue ); } } // Kevuwk: Forced the config to save here so that the IP/Port isn't lost on crash CCore::GetSingleton ().SaveConfig (); // Reset our variables g_pConnectManager->m_strNick = ""; g_pConnectManager->m_strHost = ""; g_pConnectManager->m_strPassword = ""; g_pConnectManager->m_usPort = 0; g_pConnectManager->m_bIsConnecting = false; g_pConnectManager->m_tConnectStarted = 0; // Load the mod if ( !CModManager::GetSingleton ().Load ( szModName, strArguments ) ) { // Failed loading the mod strArguments.Format ( "No such mod installed (%s)", szModName ); CCore::GetSingleton ().ShowMessageBox ( "Error", strArguments, MB_BUTTON_OK | MB_ICON_ERROR ); g_pConnectManager->Abort (); } } else { // Show failed message and abort the attempt CCore::GetSingleton ().ShowMessageBox ( "Error", "Bad server response (2)", MB_BUTTON_OK | MB_ICON_ERROR ); g_pConnectManager->Abort (); } delete [] szModName; } else { // Not the player joined packet? if ( ucPacketID != PACKET_ID_SERVER_JOIN && ucPacketID != PACKET_ID_SERVER_JOIN_DATA ) { // Show failed message and abort the attempt CCore::GetSingleton ().ShowMessageBox ( "Error", "Bad server response (1)", MB_BUTTON_OK | MB_ICON_ERROR ); g_pConnectManager->Abort (); } } return true; } return false; }