BYTEARRAY CGPSProtocol :: SEND_GPSC_RECONNECT( unsigned char PID, uint32_t reconnectKey, uint32_t lastPacket ) { BYTEARRAY packet; packet.push_back( GPS_HEADER_CONSTANT ); packet.push_back( GPS_RECONNECT ); packet.push_back( 0 ); packet.push_back( 0 ); packet.push_back( PID ); UTIL_AppendByteArray( packet, reconnectKey, false ); UTIL_AppendByteArray( packet, lastPacket, false ); AssignLength( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_WARDEN( BYTEARRAY wardenResponse ) { BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_WARDEN ); // SID_WARDEN packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, wardenResponse ); // warden response AssignLength( packet ); // DEBUG_Print( "SENT SID_WARDEN" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_NETGAMEPORT( uint16_t serverPort ) { BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_NETGAMEPORT ); // SID_NETGAMEPORT packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, serverPort, false ); // local game server port AssignLength( packet ); // DEBUG_Print( "SENT SID_NETGAMEPORT" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_CHATCOMMAND( string command ) { BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_CHATCOMMAND ); // SID_CHATCOMMAND packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArrayFast( packet, command ); // Message AssignLength( packet ); // DEBUG_Print( "SENT SID_CHATCOMMAND" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNLSProtocol :: SEND_BNLS_WARDEN_RAW( uint32_t cookie, BYTEARRAY raw ) { 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( 1 ); // BNLS_WARDEN_RAW UTIL_AppendByteArray( packet, cookie, false ); // cookie UTIL_AppendByteArray( packet, (uint16_t)raw.size( ), false ); // raw length UTIL_AppendByteArray( packet, raw ); // raw AssignLength( packet ); return packet; }
BYTEARRAY CGPSProtocol :: SEND_GPSS_INIT( uint16_t reconnectPort, unsigned char PID, uint32_t reconnectKey, unsigned char numEmptyActions ) { BYTEARRAY packet; packet.push_back( GPS_HEADER_CONSTANT ); packet.push_back( GPS_INIT ); packet.push_back( 0 ); packet.push_back( 0 ); UTIL_AppendByteArray( packet, reconnectPort, false ); packet.push_back( PID ); UTIL_AppendByteArray( packet, reconnectKey, false ); packet.push_back( numEmptyActions ); AssignLength( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_CLANSETMOTD( string motd ) { unsigned char Cookie[] = { 0, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_CLANSETMOTD ); // SID_CLANSETMOTD 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_AppendByteArray( packet, motd); AssignLength( packet ); return packet; }
BYTEARRAY CPUBProtocol :: SendUnableToCreate( ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_UNABLETOCREATE ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( 0 ); // 1 byte AssignLength(packet); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_CLANINVITATION( string accountName ) { unsigned char Cookie[] = { 0, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_CLANINVITATION ); // SID_CLANINVITATION 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_AppendByteArray( packet, accountName); AssignLength( packet ); return packet; }
BYTEARRAY CPUBProtocol :: SEND_GAME_KEY( string key, string login ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); packet.push_back( this->PUB_BOT_GAME_KEY ); packet.push_back( 0 ); packet.push_back( 0 ); packet.push_back( key.size() ); UTIL_AppendByteArray( packet, key, false ); packet.push_back( login.size() ); UTIL_AppendByteArray( packet, login, false ); AssignLength( packet ); return packet; }
BYTEARRAY CPUBProtocol :: SendVersionOk() { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); packet.push_back( PUB_VERSION_OK ); packet.push_back( 0 ); // assign later packet.push_back( 0 ); // assign later AssignLength(packet); return packet; }
BYTEARRAY CPUBProtocol :: SendAuthFailed( ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_AUTH_FAILED ); // 1 byte packet.push_back(0); packet.push_back(0); AssignLength(packet); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_ENTERCHAT( ) { BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_ENTERCHAT ); // SID_ENTERCHAT packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // Account Name is NULL on Warcraft III/The Frozen Throne packet.push_back( 0 ); // Stat String is NULL on CDKEY'd products AssignLength( packet ); // DEBUG_Print( "SENT SID_ENTERCHAT" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CBNETProtocol :: SEND_SID_CLANMEMBERLIST( ) { unsigned char Cookie[] = { 0, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( BNET_HEADER_CONSTANT ); // BNET header constant packet.push_back( SID_CLANMEMBERLIST ); // SID_CLANMEMBERLIST 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 ); // cookie AssignLength( packet ); // DEBUG_Print( "SENT SID_CLANMEMBERLIST" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_SLOTINFO( vector<CGameSlot> &slots, uint32_t randomSeed, unsigned char layoutStyle, unsigned char playerSlots ) { BYTEARRAY SlotInfo = EncodeSlotInfo( slots, randomSeed, layoutStyle, playerSlots ); BYTEARRAY packet; packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_SLOTINFO ); // W3GS_SLOTINFO packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, (uint16_t)SlotInfo.size( ), false ); // SlotInfo length UTIL_AppendByteArrayFast( packet, SlotInfo ); // SlotInfo AssignLength( packet ); // DEBUG_Print( "SENT W3GS_SLOTINFO" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_DECREATEGAME( ) { unsigned char HostCounter[] = { 1, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_DECREATEGAME ); // W3GS_DECREATEGAME 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 AssignLength( packet ); // DEBUG_Print( "SENT W3GS_DECREATEGAME" ); // DEBUG_Print( packet ); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_REFRESHGAME( uint32_t players, uint32_t playerSlots, uint32_t HostCounter ) { 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, false ); // 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 CPUBProtocol :: SendPlayerLowScore( uint16_t nScore ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_LOWSCORE ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( 0 ); // 1 byte UTIL_AppendByteArray( packet, nScore, false); AssignLength(packet); return packet; }
BYTEARRAY CPUBProtocol :: SendCurrentOnline( const uint32_t nCurrentOnline ) { BYTEARRAY packet; packet.push_back( PUB_HEADER_CONSTANT ); // Auth header 1 byte packet.push_back( PUB_CURRENT_ONLINE ); // 1 byte packet.push_back( 0 ); // 1 byte packet.push_back( 0 ); // 1 byte UTIL_AppendByteArray( packet, nCurrentOnline, false ); AssignLength(packet); return packet; }
BYTEARRAY CGameProtocol :: SEND_W3GS_STARTDOWNLOAD( unsigned char fromPID ) { unsigned char Unknown[] = { 1, 0, 0, 0 }; BYTEARRAY packet; packet.push_back( W3GS_HEADER_CONSTANT ); // W3GS header constant packet.push_back( W3GS_STARTDOWNLOAD ); // W3GS_STARTDOWNLOAD packet.push_back( 0 ); // packet length will be assigned later packet.push_back( 0 ); // packet length will be assigned later UTIL_AppendByteArray( packet, Unknown, 4 ); // ??? packet.push_back( fromPID ); // from PID AssignLength( packet ); // DEBUG_Print( "SENT W3GS_STARTDOWNLOAD" ); // 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 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 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_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_AppendByteArray( packet, clientToken ); // Client Token UTIL_AppendByteArray( packet, serverToken ); // Server Token UTIL_AppendByteArray( packet, passwordHash ); // Password Hash UTIL_AppendByteArray( packet, accountName ); // Account Name AssignLength( packet ); // DEBUG_Print( "SENT SID_LOGONRESPONSE" ); // 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 ); // DEBUG_Print( "SENT SID_CHECKAD" ); // DEBUG_Print( packet ); 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 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, (uint32_t)0, false ); else UTIL_AppendByteArray( packet, GetTicks( ) - player->GetStartedLaggingTicks( ), false ); AssignLength( packet ); // DEBUG_Print( "SENT W3GS_STOP_LAG" ); // DEBUG_Print( packet ); return packet; }
QByteArray CBNLSProtocol :: SEND_BNLS_WARDEN_SEED( quint32 cookie, quint32 seed ) { char Client[] = { 80, 88, 51, 87 }; // "W3XP" QByteArray packet; packet.push_back( (char)0 ); // packet length will be assigned later packet.push_back( (char)0 ); // packet length will be assigned later packet.push_back( BNLS_WARDEN ); // BNLS_WARDEN packet.push_back( (char)0 ); // BNLS_WARDEN_SEED packet.append(Util::fromUInt32(cookie)); // cookie packet.append(QByteArray(Client, 4)); // Client packet.append(Util::fromUInt16(4)); // length of seed packet.append(Util::fromUInt32(seed)); // seed packet.push_back( (char)0 ); // username is blank packet.append(Util::fromUInt16(0)); // password length // password 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_AppendByteArray( packet, gameName ); // Game Name packet.push_back( 0 ); // Game Password is NULL AssignLength( packet ); // DEBUG_Print( "SENT SID_NOTIFYJOIN" ); // DEBUG_Print( 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; }