void Database::SendBody(Client *c, int MessageNumber) { int CharacterID = FindCharacter(c->MailBoxName().c_str()); _log(UCS__TRACE, "SendBody: MsgID %i, to %s, CharID is %i", MessageNumber, c->MailBoxName().c_str(), CharacterID); if(CharacterID <= 0) return; char errbuf[MYSQL_ERRMSG_SIZE]; char* query = 0; MYSQL_RES *result; MYSQL_ROW row; if (!RunQuery(query,MakeAnyLenString(&query, "select `msgid`, `body`, `to` from `mail` " "where `charid`=%i and `msgid`=%i", CharacterID, MessageNumber), errbuf, &result)){ safe_delete_array(query); return ; } safe_delete_array(query); if (mysql_num_rows(result) != 1) { mysql_free_result(result); return; } row = mysql_fetch_row(result); _log(UCS__TRACE, "Message: %i body (%i bytes)", MessageNumber, strlen(row[1])); int PacketLength = 12 + strlen(row[0]) + strlen(row[1]) + strlen(row[2]); EQApplicationPacket *outapp = new EQApplicationPacket(OP_MailSendBody,PacketLength); char *PacketBuffer = (char *)outapp->pBuffer; VARSTRUCT_ENCODE_INTSTRING(PacketBuffer, c->GetMailBoxNumber()); VARSTRUCT_ENCODE_STRING(PacketBuffer,row[0]); VARSTRUCT_ENCODE_STRING(PacketBuffer,row[1]); VARSTRUCT_ENCODE_STRING(PacketBuffer,"1"); VARSTRUCT_ENCODE_TYPE(uint8, PacketBuffer, 0); VARSTRUCT_ENCODE_TYPE(uint8, PacketBuffer, 0x0a); VARSTRUCT_ENCODE_STRING(PacketBuffer, "TO:"); PacketBuffer--; VARSTRUCT_ENCODE_STRING(PacketBuffer, row[2]); PacketBuffer--; // Overwrite the null terminator VARSTRUCT_ENCODE_TYPE(uint8, PacketBuffer, 0x0a); mysql_free_result(result); _pkt(UCS__PACKETS, outapp); c->QueuePacket(outapp); safe_delete(outapp); }
void ClientList::SendOnlineGuildMembers(uint32 FromID, uint32 GuildID) { int PacketLength = 8; uint32 Count = 0; ClientListEntry* from = this->FindCLEByCharacterID(FromID); if(!from) { _log(WORLD__CLIENT_ERR,"Invalid client. FromID=%i GuildID=%i", FromID, GuildID); return; } LinkedListIterator<ClientListEntry*> Iterator(clientlist); Iterator.Reset(); while(Iterator.MoreElements()) { ClientListEntry* CLE = Iterator.GetData(); if(CLE && (CLE->GuildID() == GuildID)) { PacketLength += (strlen(CLE->name()) + 5); ++Count; } Iterator.Advance(); } Iterator.Reset(); ServerPacket* pack = new ServerPacket(ServerOP_OnlineGuildMembersResponse, PacketLength); char *Buffer = (char *)pack->pBuffer; VARSTRUCT_ENCODE_TYPE(uint32, Buffer, FromID); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, Count); while(Iterator.MoreElements()) { ClientListEntry* CLE = Iterator.GetData(); if(CLE && (CLE->GuildID() == GuildID)) { VARSTRUCT_ENCODE_STRING(Buffer, CLE->name()); VARSTRUCT_ENCODE_TYPE(uint32, Buffer, CLE->zone()); } Iterator.Advance(); } zoneserver_list.SendPacket(from->zone(), from->instance(), pack); safe_delete(pack); }
void Database::SendBody(Client *client, int messageNumber) { int characterID = FindCharacter(client->MailBoxName().c_str()); _log(UCS__TRACE, "SendBody: MsgID %i, to %s, CharID is %i", messageNumber, client->MailBoxName().c_str(), characterID); if(characterID <= 0) return; std::string query = StringFormat("SELECT `msgid`, `body`, `to` FROM `mail` " "WHERE `charid`=%i AND `msgid`=%i", characterID, messageNumber); auto results = QueryDatabase(query); if (!results.Success()) return; if (results.RowCount() != 1) return; auto row = results.begin(); _log(UCS__TRACE, "Message: %i body (%i bytes)", messageNumber, strlen(row[1])); int packetLength = 12 + strlen(row[0]) + strlen(row[1]) + strlen(row[2]); EQApplicationPacket *outapp = new EQApplicationPacket(OP_MailSendBody,packetLength); char *packetBuffer = (char *)outapp->pBuffer; VARSTRUCT_ENCODE_INTSTRING(packetBuffer, client->GetMailBoxNumber()); VARSTRUCT_ENCODE_STRING(packetBuffer,row[0]); VARSTRUCT_ENCODE_STRING(packetBuffer,row[1]); VARSTRUCT_ENCODE_STRING(packetBuffer,"1"); VARSTRUCT_ENCODE_TYPE(uint8, packetBuffer, 0); VARSTRUCT_ENCODE_TYPE(uint8, packetBuffer, 0x0a); VARSTRUCT_ENCODE_STRING(packetBuffer, "TO:"); packetBuffer--; VARSTRUCT_ENCODE_STRING(packetBuffer, row[2]); packetBuffer--; // Overwrite the null terminator VARSTRUCT_ENCODE_TYPE(uint8, packetBuffer, 0x0a); _pkt(UCS__PACKETS, outapp); client->QueuePacket(outapp); safe_delete(outapp); }
EQApplicationPacket *TitleManager::MakeTitlesPacket(Client *c) { vector<TitleEntry>::iterator Iterator; vector<TitleEntry> AvailableTitles; uint32 Length = 4; Iterator = Titles.begin(); while(Iterator != Titles.end()) { if(!IsClientEligibleForTitle(c, Iterator)) { ++Iterator; continue; } AvailableTitles.push_back((*Iterator)); Length += Iterator->Prefix.length() + Iterator->Suffix.length() + 6; ++Iterator; } EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendTitleList, Length); char *Buffer = (char *)outapp->pBuffer; VARSTRUCT_ENCODE_TYPE(uint32, Buffer, AvailableTitles.size()); Iterator = AvailableTitles.begin(); while(Iterator != AvailableTitles.end()) { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, Iterator->TitleID); VARSTRUCT_ENCODE_STRING(Buffer, Iterator->Prefix.c_str()); VARSTRUCT_ENCODE_STRING(Buffer, Iterator->Suffix.c_str()); ++Iterator; } return(outapp); }
void ClientList::SendLFGMatches(ServerLFGMatchesRequest_Struct *smrs) { // Send back matches when someone searches player's Looking For A Group. LinkedListIterator<ClientListEntry*> Iterator(clientlist); ClientListEntry* CLE = 0; int Matches = 0; Iterator.Reset(); // We run the ClientList twice. The first time is to determine how big the outgoing packet needs to be. while(Iterator.MoreElements()) { CLE = Iterator.GetData(); if(CLE->LFG()) { unsigned int BitMask = 1 << CLE->class_(); // First we check that the player meets the level and class criteria of the person // doing the search. if((CLE->level() >= smrs->FromLevel) && (CLE->level() <= smrs->ToLevel) && (BitMask & smrs->Classes)) // Then we check if if the player doing the search meets the level criteria specified // by the player who is LFG. // // GetLFGMatchFilter returns the setting of the 'Only players who match my posted filters // can query me' checkbox. // // FromLevel and ToLevel are the settings of the 'Want group levels:' boxes. if(!CLE->GetLFGMatchFilter() || ((smrs->QuerierLevel >= CLE->GetLFGFromLevel()) && (smrs->QuerierLevel <= CLE->GetLFGToLevel()))) Matches++; } Iterator.Advance(); } auto Pack = new ServerPacket(ServerOP_LFGMatches, (sizeof(ServerLFGMatchesResponse_Struct) * Matches) + 4); char *Buf = (char *)Pack->pBuffer; // FromID is the Entity ID of the player doing the search. VARSTRUCT_ENCODE_TYPE(uint32, Buf, smrs->FromID); ServerLFGMatchesResponse_Struct* Buffer = (ServerLFGMatchesResponse_Struct*)Buf; Iterator.Reset(); if(Matches) { while(Iterator.MoreElements() && (Matches > 0)) { CLE = Iterator.GetData(); if(CLE->LFG()) { unsigned int BitMask = 1 << CLE->class_(); if((CLE->level() >= smrs->FromLevel) && (CLE->level() <= smrs->ToLevel) && (BitMask & smrs->Classes)) { Matches--; strcpy(Buffer->Name, CLE->name()); Buffer->Class_ = CLE->class_(); Buffer->Level = CLE->level(); Buffer->Zone = CLE->zone(); // If the LFG player is anon, level and class are still displayed, but // zone shows as UNAVAILABLE. Buffer->Anon = (CLE->Anon() != 0); // The client can filter on Guildname Buffer->GuildID = CLE->GuildID(); strcpy(Buffer->Comments, CLE->GetLFGComments()); Buffer++; } } Iterator.Advance(); } Pack->Deflate(); } SendPacket(smrs->FromName,Pack); safe_delete(Pack); }