BYTEARRAY CGameProtocol :: SEND_W3GS_REFRESHGAME( uint32_t players, uint32_t playerSlots ) { unsigned char HostCounter[] = { 1, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_REFRESHGAME ); // W3GS_REFRESHGAME packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, HostCounter, 4 ); // Host Counter UTIL_AppendByteArray( packet, players, false ); // Players UTIL_AppendByteArray( packet, playerSlots, false ); // Player Slots AssignLength( packet ); // DEBUG_Print( "SENT W3GS_REFRESHGAME" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_MAPPART( unsigned char fromPID, unsigned char toPID, uint32_t start, string *mapData ) { unsigned char Unknown[] = { 1, 0, 0, 0 }; BYTEARRAY packet; if( start < mapData->size( ) ) { packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_MAPPART ); // W3GS_MAPPART packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( toPID ); // to PID packet.push_back( fromPID ); // from PID UTIL_AppendByteArray( packet, Unknown, 4 ); // ??? UTIL_AppendByteArray( packet, start, false ); // start position // calculate end position (don't send more than 1442 map bytes in one packet) uint32_t End = start + 1442; if( End > mapData->size( ) ) End = mapData->size( ); // calculate crc CCRC32* m_CRC = new CCRC32( ); m_CRC->Initialize( ); BYTEARRAY crc32 = UTIL_CreateByteArray( m_CRC->FullCRC( (unsigned char *)mapData->c_str( ) + start, End - start ), false ); UTIL_AppendByteArray( packet, crc32 ); delete m_CRC; // map data BYTEARRAY Data = UTIL_CreateByteArray( (unsigned char *)mapData->c_str( ) + start, End - start ); UTIL_AppendByteArray( packet, Data ); AssignLength( packet ); } else CONSOLE_Print( "[GAMEPROTO] invalid parameters passed to SEND_W3GS_MAPPART" ); // DEBUG_Print( "SENT W3GS_MAPPART" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_PROTOCOL_INITIALIZE_SELECTOR( ) { BYTEARRAY packet; packet.push_back( 1 ); // DEBUG_Print( "SENT PROTOCOL_INITIALIZE_SELECTOR" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_CHECKAD( ) { unsigned char Zeros[] = { 0, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_CHECKAD ); // SID_CHECKAD packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, Zeros, 4 ); // ??? UTIL_AppendByteArray( packet, Zeros, 4 ); // ??? UTIL_AppendByteArray( packet, Zeros, 4 ); // ??? UTIL_AppendByteArray( packet, Zeros, 4 ); // ??? AssignLength( packet ); return packet; }
void CReplay :: AddChatMessage( unsigned char PID, unsigned char flags, uint32_t chatMode, string message ) { BYTEARRAY Block; Block.push_back( REPLAY_CHATMESSAGE ); Block.push_back( PID ); UTIL_AppendByteArray( Block, (uint16_t)0, false ); Block.push_back( flags ); UTIL_AppendByteArray( Block, chatMode, false ); UTIL_AppendByteArrayFast( Block, message ); // assign length BYTEARRAY LengthBytes = UTIL_CreateByteArray( (uint16_t)( Block.size( ) - 4 ), false ); Block[2] = LengthBytes[0]; Block[3] = LengthBytes[1]; m_CompiledBlocks += string( Block.begin( ), Block.end( ) ); }
BYTEARRAY CPUBProtocol :: SendAuthAccept( string login, string pass, string key, deque<CBotData> BotList ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_AUTH_ACCEPT ); // 1 byte packet.push_back( 0 ); // assign later packet.push_back( 0 ); // assign later packet.push_back( login.size( ) ); // 1 byte UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (unsigned char *)login.c_str( ), login.size( ) )); // packet.push_back( BotList.size() ); // 1 byte for (uint32_t i = 0; i < BotList.size(); i++) { packet.push_back(BotList[i].bot_ip.size( )); UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (unsigned char *)BotList[i].bot_ip.c_str( ), BotList[i].bot_ip.size( ) )); UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (uint16_t)(0) , false)); UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (uint16_t)(BotList[i].bot_gameport) , false)); } packet.push_back( key.size( ) ); // 1 byte UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (unsigned char *)key.c_str( ), key.size( ) )); AssignLength(packet); return packet; }
BYTEARRAY CPUBProtocol :: SendBotCreateGame( const string& creatorname, const string& gamename, const string& gamemode, vector<string> hold_list, uint16_t min_score, uint16_t max_score, bool is_ladder, bool is_balance ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); packet.push_back( PUB_BOTCREATEGAME ); packet.push_back( 0 ); packet.push_back( 0 ); packet.push_back( is_ladder ); packet.push_back( is_balance ); packet.push_back( hold_list.size() ); packet.push_back( 0 ); UTIL_AppendByteArray(packet, min_score, false); UTIL_AppendByteArray(packet, max_score, false); UTIL_AppendByteArray(packet, gamemode, true); UTIL_AppendByteArray(packet, gamename, true); UTIL_AppendByteArray(packet, creatorname, true); for ( uint16_t i = 0; i < hold_list.size(); ++i) UTIL_AppendByteArray(packet, hold_list[i], true); AssignLength(packet); return packet; }
BYTEARRAY CGameSlot :: GetByteArray( ) const { BYTEARRAY b; b.push_back( m_PID ); b.push_back( m_DownloadStatus ); b.push_back( m_SlotStatus ); b.push_back( m_Computer ); b.push_back( m_Team ); b.push_back( m_Colour ); b.push_back( m_Race ); b.push_back( m_ComputerType ); b.push_back( m_Handicap ); return b; }
BYTEARRAY CGameProtocol :: SEND_W3GS_INCOMING_ACTION2( queue<CIncomingAction *> actions ) { BYTEARRAY packet; packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_INCOMING_ACTION2 ); // W3GS_INCOMING_ACTION2 packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // ??? (send interval?) packet.push_back( 0 ); // ??? (send interval?) // create subpacket if( !actions.empty( ) ) { BYTEARRAY subpacket; while( !actions.empty( ) ) { CIncomingAction *Action = actions.front( ); actions.pop( ); subpacket.push_back( Action->GetPID( ) ); UTIL_AppendByteArray( subpacket, (uint16_t)Action->GetAction( )->size( ), false ); UTIL_AppendByteArray( subpacket, *Action->GetAction( ) ); } // calculate crc (we only care about the first 2 bytes though) CCRC32* m_CRC = new CCRC32( ); m_CRC->Initialize(); BYTEARRAY crc32 = UTIL_CreateByteArray( m_CRC->FullCRC( (unsigned char *)string( subpacket.begin( ), subpacket.end( ) ).c_str( ), subpacket.size( ) ), false ); crc32.resize( 2 ); delete m_CRC; // finish subpacket UTIL_AppendByteArray( packet, crc32 ); // crc UTIL_AppendByteArray( packet, subpacket ); // subpacket } AssignLength( packet ); // DEBUG_Print( "SENT W3GS_INCOMING_ACTION2" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_LOGONRESPONSE( BYTEARRAY clientToken, BYTEARRAY serverToken, BYTEARRAY passwordHash, string accountName ) { // todotodo: check that the passed BYTEARRAY sizes are correct (don't know what they should be right now so I can't do this today) BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_LOGONRESPONSE ); // SID_LOGONRESPONSE packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, clientToken ); // Client Token UTIL_AppendByteArrayFast( packet, serverToken ); // Server Token UTIL_AppendByteArrayFast( packet, passwordHash ); // Password Hash UTIL_AppendByteArrayFast( packet, accountName ); // Account Name AssignLength( packet ); // DEBUG_Print( "SENT SID_LOGONRESPONSE" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_AUTH_ACCOUNTLOGONPROOF( BYTEARRAY clientPasswordProof ) { BYTEARRAY packet; if( clientPasswordProof.size( ) == 20 ) { packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_AUTH_ACCOUNTLOGONPROOF ); // SID_AUTH_ACCOUNTLOGONPROOF packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, clientPasswordProof ); // Client Password Proof AssignLength( packet ); } else cout << "[BNETPROTO] invalid parameters passed to SEND_SID_AUTH_ACCOUNTLOGON\n"; return packet; }
BYTEARRAY CPUBProtocol :: SendChatFromGame(const string& login, const string& bot_ip, const string& gamename, uint16_t gameport, const string& message) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); packet.push_back( this->PUB_CHATFROMGAME ); packet.push_back( 0 ); packet.push_back( 0 ); UTIL_AppendByteArray( packet, gameport, false); UTIL_AppendByteArray( packet, bot_ip, true); UTIL_AppendByteArray( packet, gamename, true); UTIL_AppendByteArray( packet, login, true ); UTIL_AppendByteArray( packet, message, true ); AssignLength( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_NOTIFYJOIN( string gameName ) { unsigned char ProductID[] = { 0, 0, 0, 0 }; unsigned char ProductVersion[] = { 14, 0, 0, 0 }; // Warcraft III is 14 BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_NOTIFYJOIN ); // SID_NOTIFYJOIN packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, ProductID, 4 ); // Product ID UTIL_AppendByteArray( packet, ProductVersion, 4 ); // Product Version UTIL_AppendByteArrayFast( packet, gameName ); // Game Name packet.push_back( 0 ); // Game Password is NULL AssignLength( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_STOP_LAG( CGamePlayer* player, bool loadInGame ) { BYTEARRAY packet; packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_STOP_LAG ); // W3GS_STOP_LAG packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( player->GetPID() ); if( loadInGame ) UTIL_AppendByteArray( packet, static_cast<uint32_t>(0), false ); else UTIL_AppendByteArray( packet, GetTicks() - player->GetStartedLaggingTicks(), false ); AssignLength( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_GAMELOADED_OTHERS( unsigned char PID ) { BYTEARRAY packet; if( PID != 255 ) { packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_GAMELOADED_OTHERS ); // W3GS_GAMELOADED_OTHERS packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( PID ); // PID AssignLength( packet ); } else cout << "[GAMEPROTO] invalid parameters passed to SEND_W3GS_GAMELOADED_OTHERS\n"; return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_PING( BYTEARRAY pingValue ) { BYTEARRAY packet; if( pingValue.size() == 4 ) { packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_PING ); // SID_PING packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, pingValue ); // Ping Value AssignLength( packet ); } else cout << "[BNETPROTO] invalid parameters passed to SEND_SID_PING\n"; return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_GAMEINFO( bool TFT, unsigned char war3Version, BYTEARRAY mapGameType, BYTEARRAY mapFlags, BYTEARRAY mapWidth, BYTEARRAY mapHeight, string gameName, string hostName, uint32_t upTime, string mapPath, BYTEARRAY mapCRC, uint32_t slotsTotal, uint32_t slotsOpen, uint16_t port, uint32_t hostCounter ) { unsigned char ProductID_ROC[] = { 51, 82, 65, 87 }; // "WAR3" unsigned char ProductID_TFT[] = { 80, 88, 51, 87 }; // "W3XP" unsigned char Version[] = { war3Version, 0, 0, 0 }; unsigned char Unknown1[] = { 1, 2, 3, 4 }; unsigned char Unknown2[] = { 1, 0, 0, 0 }; BYTEARRAY packet; if( mapGameType.size( ) == 4 && mapFlags.size( ) == 4 && mapWidth.size( ) == 2 && mapHeight.size( ) == 2 && !gameName.empty( ) && !hostName.empty( ) && !mapPath.empty( ) && mapCRC.size( ) == 4 ) { // make the stat string BYTEARRAY StatString; UTIL_AppendByteArrayFast( StatString, mapFlags ); StatString.push_back( 0 ); UTIL_AppendByteArrayFast( StatString, mapWidth ); UTIL_AppendByteArrayFast( StatString, mapHeight ); UTIL_AppendByteArrayFast( StatString, mapCRC ); UTIL_AppendByteArrayFast( StatString, mapPath ); UTIL_AppendByteArrayFast( StatString, hostName ); StatString.push_back( 0 ); StatString = UTIL_EncodeStatString( StatString ); // make the rest of the packet packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_GAMEINFO ); // W3GS_GAMEINFO packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later if( TFT ) UTIL_AppendByteArray( packet, ProductID_TFT, 4 ); // Product ID (TFT) else UTIL_AppendByteArray( packet, ProductID_ROC, 4 ); // Product ID (ROC) UTIL_AppendByteArray( packet, Version, 4 ); // Version UTIL_AppendByteArray( packet, hostCounter, false ); // Host Counter UTIL_AppendByteArray( packet, Unknown1, 4 ); // ??? (this varies wildly even between two identical games created one after another) UTIL_AppendByteArrayFast( packet, gameName ); // Game Name packet.push_back( 0 ); // ??? (maybe game password) UTIL_AppendByteArrayFast( packet, StatString ); // Stat String packet.push_back( 0 ); // Stat String null terminator (the stat string is encoded to remove all even numbers i.e. zeros) UTIL_AppendByteArray( packet, slotsTotal, false ); // Slots Total UTIL_AppendByteArrayFast( packet, mapGameType ); // Game Type UTIL_AppendByteArray( packet, Unknown2, 4 ); // ??? UTIL_AppendByteArray( packet, slotsOpen, false ); // Slots Open UTIL_AppendByteArray( packet, upTime, false ); // time since creation UTIL_AppendByteArray( packet, port, false ); // port AssignLength( packet ); } else CONSOLE_Print( "[GAMEPROTO] invalid parameters passed to SEND_W3GS_GAMEINFO" ); // DEBUG_Print( "SENT W3GS_GAMEINFO" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_AUTH_ACCOUNTLOGON( BYTEARRAY clientPublicKey, string accountName ) { BYTEARRAY packet; if( clientPublicKey.size( ) == 32 ) { packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_AUTH_ACCOUNTLOGON ); // SID_AUTH_ACCOUNTLOGON packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, clientPublicKey ); // Client Key UTIL_AppendByteArrayFast( packet, accountName ); // Account Name AssignLength( packet ); } else cout << "[BNETPROTO] invalid parameters passed to SEND_SID_AUTH_ACCOUNTLOGON\n"; return packet; }
BYTEARRAY CBNLSProtocol :: SEND_BNLS_WARDEN_SEED( uint32_t cookie, uint32_t seed ) { unsigned char Client[] = { 80, 88, 51, 87 }; // "W3XP" BYTEARRAY packet; packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( BNLS_WARDEN ); // BNLS_WARDEN packet.push_back( 0 ); // BNLS_WARDEN_SEED UTIL_AppendByteArray( packet, cookie, false ); // cookie UTIL_AppendByteArray( packet, Client, 4 ); // Client UTIL_AppendByteArray( packet, (uint16_t)4, false ); // length of seed UTIL_AppendByteArray( packet, seed, false ); // seed packet.push_back( 0 ); // username is blank UTIL_AppendByteArray( packet, (uint16_t)0, false ); // password length // password AssignLength( packet ); return packet; }
BYTEARRAY CPUBProtocol :: SendScorePlayer( const string& login, const string& score, const uint32_t games_count) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_GETSCOREANS ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( 0 ); // 1 byte UTIL_AppendByteArray( packet, login, true); UTIL_AppendByteArray( packet, score, true); UTIL_AppendByteArray( packet, games_count, false ); AssignLength(packet); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_PLAYERLEAVE_OTHERS( unsigned char PID, uint32_t leftCode ) { BYTEARRAY packet; if( PID != 255 ) { packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_PLAYERLEAVE_OTHERS ); // W3GS_PLAYERLEAVE_OTHERS packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( PID ); // PID UTIL_AppendByteArray( packet, leftCode, false ); // left code (see PLAYERLEAVE_ constants in gameprotocol.h) AssignLength( packet ); } else cout << "[GAMEPROTO] invalid parameters passed to SEND_W3GS_PLAYERLEAVE_OTHERS\n"; return packet; }
CIncomingGameHost *CBNETProtocol :: RECEIVE_SID_GETADVLISTEX( BYTEARRAY data ) { // DEBUG_Print( "RECEIVED SID_GETADVLISTEX" ); // DEBUG_Print( data ); // 2 bytes -> Header // 2 bytes -> Length // 4 bytes -> GamesFound // if( GamesFound > 0 ) // 10 bytes -> ??? // 2 bytes -> Port // 4 bytes -> IP // null term string -> GameName // 2 bytes -> ??? // 8 bytes -> HostCounter if( ValidateLength( data ) && data.size( ) >= 8 ) { BYTEARRAY GamesFound = BYTEARRAY( data.begin( ) + 4, data.begin( ) + 8 ); if( UTIL_ByteArrayToUInt32( GamesFound, false ) > 0 && data.size( ) >= 25 ) { BYTEARRAY Port = BYTEARRAY( data.begin( ) + 18, data.begin( ) + 20 ); BYTEARRAY IP = BYTEARRAY( data.begin( ) + 20, data.begin( ) + 24 ); BYTEARRAY GameName = UTIL_ExtractCString( data, 24 ); if( data.size( ) >= GameName.size( ) + 35 ) { BYTEARRAY HostCounter; HostCounter.push_back( UTIL_ExtractHex( data, GameName.size( ) + 27, true ) ); HostCounter.push_back( UTIL_ExtractHex( data, GameName.size( ) + 29, true ) ); HostCounter.push_back( UTIL_ExtractHex( data, GameName.size( ) + 31, true ) ); HostCounter.push_back( UTIL_ExtractHex( data, GameName.size( ) + 33, true ) ); return new CIncomingGameHost( IP, UTIL_ByteArrayToUInt16( Port, false ), string( GameName.begin( ), GameName.end( ) ), HostCounter ); } } } return NULL; }
BYTEARRAY CPUBProtocol :: SendRealName( const string login, const string& key ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_AUTH_NAME ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( login.size() ); UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (unsigned char *)login.c_str( ), login.size( ) )); packet.push_back( key.size() ); UTIL_AppendByteArray(packet, UTIL_CreateByteArray( (unsigned char *)key.c_str( ), key.size( ) )); AssignLength(packet); return packet; }
BYTEARRAY CPUBProtocol :: SendBotCreateSavedGame( const string& gamename, const string& savefilename, BYTEARRAY nMagicNumber, const string& owner, const string& saveData ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); packet.push_back( PUB_CREATE_SAVEDGAME ); packet.push_back( 0 ); packet.push_back( 0 ); UTIL_AppendByteArray(packet, gamename, true); UTIL_AppendByteArray(packet, savefilename, true); UTIL_AppendByteArray(packet, nMagicNumber); UTIL_AppendByteArray(packet, owner, true); UTIL_AppendByteArray(packet, saveData, false); AssignLength(packet); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_AUTH_CHECK( bool TFT, BYTEARRAY clientToken, BYTEARRAY exeVersion, BYTEARRAY exeVersionHash, BYTEARRAY keyInfoROC, BYTEARRAY keyInfoTFT, string exeInfo, string keyOwnerName ) { uint32_t NumKeys = 0; if( TFT ) NumKeys = 2; else NumKeys = 1; BYTEARRAY packet; if( clientToken.size( ) == 4 && exeVersion.size( ) == 4 && exeVersionHash.size( ) == 4 && keyInfoROC.size( ) == 36 && ( !TFT || keyInfoTFT.size( ) == 36 ) ) { packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_AUTH_CHECK ); // SID_AUTH_CHECK packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, clientToken ); // Client Token UTIL_AppendByteArrayFast( packet, exeVersion ); // EXE Version UTIL_AppendByteArrayFast( packet, exeVersionHash ); // EXE Version Hash UTIL_AppendByteArray( packet, NumKeys, false ); // number of keys in this packet UTIL_AppendByteArray( packet, (uint32_t)0, false ); // boolean Using Spawn (32 bit) UTIL_AppendByteArrayFast( packet, keyInfoROC ); // ROC Key Info if( TFT ) UTIL_AppendByteArrayFast( packet, keyInfoTFT ); // TFT Key Info UTIL_AppendByteArrayFast( packet, exeInfo ); // EXE Info UTIL_AppendByteArrayFast( packet, keyOwnerName ); // CD Key Owner Name AssignLength( packet ); } else { CONSOLE_Print( "[BNETPROTO] invalid parameters passed to SEND_SID_AUTH_CHECK" ); forward(new CFwdData(FWD_GENERAL, "Invalid parameters passed to SEND_SID_AUTH_CHECK", 6, 0)); } // DEBUG_Print( "SENT SID_AUTH_CHECK" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_CLANINVITATIONRESPONSE( bool accept ) { unsigned char Cookie[] = { 0, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_CLANINVITATIONRESPONSE ); // SID_CLANCREATIONINVITATION packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, Cookie, 4); UTIL_AppendByteArrayFast( packet, m_ClanLastInviteTag ); UTIL_AppendByteArrayFast( packet, m_ClanLastInviteName ); if(accept) packet.push_back( 0x06 ); else packet.push_back( 0x04 ); AssignLength( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_JOINCHANNEL( string channel ) { unsigned char NoCreateJoin[] = { 2, 0, 0, 0 }; unsigned char FirstJoin[] = { 1, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_JOINCHANNEL ); // SID_JOINCHANNEL packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later if( channel.size( ) > 0 ) UTIL_AppendByteArray( packet, NoCreateJoin, 4 ); // flags for no create join else UTIL_AppendByteArray( packet, FirstJoin, 4 ); // flags for first join UTIL_AppendByteArrayFast( packet, channel ); AssignLength( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_CHAT_FROM_HOST( unsigned char fromPID, BYTEARRAY toPIDs, unsigned char flag, BYTEARRAY flagExtra, string message ) { BYTEARRAY packet; if( !toPIDs.empty( ) && !message.empty( ) && message.size( ) < 255 ) { packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_CHAT_FROM_HOST ); // W3GS_CHAT_FROM_HOST packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( toPIDs.size( ) ); // number of receivers UTIL_AppendByteArrayFast( packet, toPIDs ); // receivers packet.push_back( fromPID ); // sender packet.push_back( flag ); // flag UTIL_AppendByteArrayFast( packet, flagExtra ); // extra flag UTIL_AppendByteArrayFast( packet, message ); // message AssignLength( packet ); } else CONSOLE_Print( "[GAMEPROTO] invalid parameters passed to SEND_W3GS_CHAT_FROM_HOST" ); // DEBUG_Print( "SENT W3GS_CHAT_FROM_HOST" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CPUBProtocol :: SendLobbyPlayers( const string& gamename, const string& bot_ip, uint16_t gameport, vector<CGamePlayer>& nPlayers ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_GAMEPLAYERS ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( 0 ); // 1 byte UTIL_AppendByteArray( packet, gameport, false); UTIL_AppendByteArray( packet, bot_ip, true); UTIL_AppendByteArray( packet, gamename, true); packet.push_back( nPlayers.size() ); for (vector<CGamePlayer>::iterator i = nPlayers.begin(); i != nPlayers.end(); ++i) UTIL_AppendByteArray( packet, (*i).GetName(), true ); AssignLength(packet); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_AUTH_ACCOUNTLOGONPROOF( BYTEARRAY clientPasswordProof ) { BYTEARRAY packet; if( clientPasswordProof.size( ) == 20 ) { packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_AUTH_ACCOUNTLOGONPROOF ); // SID_AUTH_ACCOUNTLOGONPROOF packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, clientPasswordProof ); // Client Password Proof AssignLength( packet ); } else { CONSOLE_Print( "[BNETPROTO] invalid parameters passed to SEND_SID_AUTH_ACCOUNTLOGON" ); forward(new CFwdData(FWD_GENERAL, "Invalid parameters passed to SEND_SID_AUTH_ACCOUNTLOGON", 6, 0)); } // DEBUG_Print( "SENT SID_AUTH_ACCOUNTLOGONPROOF" ); // DEBUG_Print( packet ); return packet; }