//this void is called when player clicks on search button void WorldSession::HandleAuctionListItems( WorldPacket & recv_data ) { DEBUG_LOG("WORLD: HandleAuctionListItems"); ObjectGuid auctioneerGuid; std::string searchedname; uint8 levelmin, levelmax, usable; uint32 listfrom, auctionSlotID, auctionMainCategory, auctionSubCategory, quality; recv_data >> auctioneerGuid; recv_data >> listfrom; // start, used for page control listing by 50 elements recv_data >> searchedname; recv_data >> levelmin >> levelmax; recv_data >> auctionSlotID >> auctionMainCategory >> auctionSubCategory; recv_data >> quality >> usable; recv_data.read_skip(16); // unknown 16 bytes: 00 07 01 00 00 01 05 00 06 00 09 01 08 00 03 00 AuctionHouseEntry const* auctionHouseEntry = GetCheckedAuctionHouseForAuctioneer(auctioneerGuid); if (!auctionHouseEntry) return; // always return pointer AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap(auctionHouseEntry); // remove fake death if(GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); //DEBUG_LOG("Auctionhouse search %s list from: %u, searchedname: %s, levelmin: %u, levelmax: %u, auctionSlotID: %u, auctionMainCategory: %u, auctionSubCategory: %u, quality: %u, usable: %u", // auctioneerGuid.GetString().c_str(), listfrom, searchedname.c_str(), levelmin, levelmax, auctionSlotID, auctionMainCategory, auctionSubCategory, quality, usable); WorldPacket data( SMSG_AUCTION_LIST_RESULT, (4+4+4) ); uint32 count = 0; uint32 totalcount = 0; data << uint32(0); // converting string that we try to find to lower case std::wstring wsearchedname; if(!Utf8toWStr(searchedname,wsearchedname)) return; wstrToLower(wsearchedname); auctionHouse->BuildListAuctionItems(data, _player, wsearchedname, listfrom, levelmin, levelmax, usable, auctionSlotID, auctionMainCategory, auctionSubCategory, quality, count, totalcount); data.put<uint32>(0, count); data << uint32(totalcount); data << uint32(300); // 2.3.0 delay for next list request? SendPacket(&data); }
//this void is called when player clicks on search button void WorldSession::HandleAuctionListItems( WorldPacket & recv_data ) { std::string searchedname; uint8 levelmin, levelmax, usable; uint32 listfrom, auctionSlotID, auctionMainCategory, auctionSubCategory, quality; uint64 guid; recv_data >> guid; recv_data >> listfrom; // start, used for page control listing by 50 elements recv_data >> searchedname; recv_data >> levelmin >> levelmax; recv_data >> auctionSlotID >> auctionMainCategory >> auctionSubCategory; recv_data >> quality >> usable; recv_data.read_skip(16); // unknown 16 bytes: 00 07 01 00 00 01 05 00 06 00 09 01 08 00 03 00 Creature *pCreature = GetPlayer()->GetNPCIfCanInteractWith(guid,UNIT_NPC_FLAG_AUCTIONEER); if (!pCreature) { sLog.outDebug( "WORLD: HandleAuctionListItems - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) ); return; } // remove fake death if(GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); AuctionHouseObject* auctionHouse = sAuctionMgr.GetAuctionsMap( pCreature->getFaction() ); //sLog.outDebug("Auctionhouse search (GUID: %u TypeId: %u)", , list from: %u, searchedname: %s, levelmin: %u, levelmax: %u, auctionSlotID: %u, auctionMainCategory: %u, auctionSubCategory: %u, quality: %u, usable: %u", // GUID_LOPART(guid),GuidHigh2TypeId(GUID_HIPART(guid)), listfrom, searchedname.c_str(), levelmin, levelmax, auctionSlotID, auctionMainCategory, auctionSubCategory, quality, usable); WorldPacket data( SMSG_AUCTION_LIST_RESULT, (4+4+4) ); uint32 count = 0; uint32 totalcount = 0; data << (uint32) 0; // converting string that we try to find to lower case std::wstring wsearchedname; if(!Utf8toWStr(searchedname,wsearchedname)) return; wstrToLower(wsearchedname); auctionHouse->BuildListAuctionItems(data,_player, wsearchedname, listfrom, levelmin, levelmax, usable, auctionSlotID, auctionMainCategory, auctionSubCategory, quality, count,totalcount); data.put<uint32>(0, count); data << (uint32) totalcount; data << (uint32) 300; // unk 2.3.0 const? SendPacket(&data); }
////////////////////////////////////////////////////////////// /// This function handles CMSG_GROUP_INVITE ////////////////////////////////////////////////////////////// void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data ) { if(!_player->IsInWorld()) { return; } CHECK_PACKET_SIZE(recv_data, 1); std::string membername; Player * player = NULL; Group *group = NULL; recv_data.read_skip( 10 ); //no idea, they were all 0 recv_data >> membername; //tried to make sure the other guy can't accept the invited /* if( _player->HasBeenInvited() ) { return; } */ player = objmgr.GetPlayer(membername.c_str(), false); if ( player == NULL) { SendPartyCommandResult(_player, 0, membername, ERR_PARTY_CANNOT_FIND); return; } if (player == _player) { return; } if ( _player->InGroup() && !_player->IsGroupLeader() ) { SendPartyCommandResult(_player, 0, "", ERR_PARTY_YOU_ARE_NOT_LEADER); return; } group = _player->GetGroup(); if( group != NULL ) { if(group->IsFull()) { SendPartyCommandResult(_player, 0, "", ERR_PARTY_IS_FULL); return; } } if ( player->InGroup() ) { SendPartyCommandResult(_player, player->GetGroup()->GetGroupType(), membername, ERR_PARTY_ALREADY_IN_GROUP); return; } if(player->GetTeam()!=_player->GetTeam() && _player->GetSession()->GetPermissionCount() == 0 && !sWorld.interfaction_group) { SendPartyCommandResult(_player, 0, membername, ERR_PARTY_WRONG_FACTION); return; } //tried to make sure the other guy can't accept the invited /* if ( player->HasBeenInvited() ) { SendPartyCommandResult(_player, 0, membername, ERR_PARTY_ALREADY_IN_GROUP); return; }*/ if( player->Social_IsIgnoring( _player->GetLowGUID() ) ) { SendPartyCommandResult(_player, 0, membername, ERR_PARTY_IS_IGNORING_YOU); return; } /* {SERVER} Packet: (0x1F7F) SMSG_GROUP_INVITE PacketSize = 16 TimeStamp = 30686468 01 55 64 72 65 61 00 AA 2A 00 00 00 00 00 00 00 14333 {SERVER} Packet: (0x4723) UNKNOWN PacketSize = 44 TimeStamp = 17757047 4E E0 1001110 11100000 6F 00 00 00 03 go3 00 00 00 00 00 00 00 00 4C go2 44 75 6E 65 6D 61 75 6C 00 Dunemaul 00 00 00 00 41 6E 61 72 6B 65 00 Anarke 00 1F 59 15 00 go7 AF go1 81 go6 EB go0 {SERVER} Packet: (0xFA67) SMSG_NAME_QUERY_RESPONSE PacketSize = 20 TimeStamp = 17676894 CF EA AE 4D 02 80 01 00 41 6E 61 72 6B 65 00 00 02 00 06 00 {SERVER} Packet: (0x4723) UNKNOWN PacketSize = 46 TimeStamp = 18686064 4E E0 6F 00 00 00 00 00 00 00 00 42 00 00 00 81 44 75 6E 65 6D 61 75 6C 00 00 00 00 00 44 72 61 69 73 69 75 73 00 00 69 E3 1F 00 B0 81 F7 11001111 {SERVER} Packet: (0xFA67) SMSG_NAME_QUERY_RESPONSE PacketSize = 22 TimeStamp = 18570343 CF F6 B1 80 01 80 01 00 44 72 61 69 73 69 75 73 00 00 0A 00 03 00 */ uint64 inviter_guid = _player->GetGUID(); uint8 *guid_bytes = (uint8*)&inviter_guid; uint16 guid_mask = 0; //!!not confirmed, but seems to work ! /* if( guid_bytes[0] ) guid_mask |= BIT_0; if( guid_bytes[1] ) guid_mask |= BIT_1; if( guid_bytes[2] ) guid_mask |= BIT_2; if( guid_bytes[3] ) guid_mask |= BIT_3;*/ guid_mask = 0xE04E; sStackWorldPacket( data,SMSG_GROUP_INVITE, 100); data << uint16(guid_mask);//guid mask data << uint32( 0 ); //? // if( guid_bytes[3] ) data << ObfuscateByte( guid_bytes[3] ); data << uint32( 0x00000000 ); data << uint32( 0x00000000 ); // if( guid_bytes[2] ) data << ObfuscateByte( guid_bytes[2] ); data << ""; //realm name data << uint32( 0x00000000 ); data << GetPlayer()->GetName(); data << uint32( 0 ); // if( guid_bytes[7] ) data << ObfuscateByte( guid_bytes[7] ); // if( guid_bytes[1] ) data << ObfuscateByte( guid_bytes[1] ); // if( guid_bytes[6] ) data << ObfuscateByte( guid_bytes[6] ); // if( guid_bytes[0] ) data << ObfuscateByte( guid_bytes[0] ); player->GetSession()->SendPacket(&data); uint32 gtype = 0; if(group) gtype = group->GetGroupType(); SendPartyCommandResult(_player, gtype, membername, ERR_PARTY_NO_ERROR); // 16/08/06 - change to guid to prevent very unlikely event of a crash in deny, etc player->SetInviter( _player->GetLowGUID() ); // 16/08/06 - change to guid to prevent very unlikely event of a crash in deny, etc _player->SetInviter( player->GetLowGUID() );//bugfix if player invtied 2 people-> he can be in 2 parties }
bool WardenMgr::ValidateCheatCheckResult(WorldSession* const session, WorldPacket& clientPacket) { uint32 accountId = session->GetAccountId(); sLog->outStaticDebug("Wardend::ValidateCheatCheckResult(%u, *pkt)", accountId); bool valid = true; uint16 pktLen; uint32 checksum; clientPacket >> pktLen; clientPacket >> checksum; if (checksum != BuildChecksum(clientPacket.contents() + clientPacket.rpos(), clientPacket.size() - clientPacket.rpos())) { if (session->GetPlayer()) { sLog->outWarden("Warden Cheat-check: Kicking player %s for failed check, Packet Checksum 0x%08X is invalid!", session->GetPlayerName(), checksum); } else { sLog->outWarden("Warden Cheat-check: Kicking account %u for failed check, Packet Checksum 0x%08X is invalid!", session->GetAccountId(), checksum); } ReactToCheatCheckResult(session, false); return false; } if (pktLen == 0) return false; // parse the timing check always sent sLog->outStaticDebug("TimeCheck"); uint8 res; uint32 ticks; clientPacket >> res; // should be 1 clientPacket >> ticks; // Need to compare ticks based on last one using server ticks diff since sLog->outStaticDebug("Warden: Time unk 0x%08X", ticks); pktLen = pktLen - 5; WardenClientCheckList* checkList = (WardenClientCheckList*)session->m_WardenClientChecks; if (!checkList) return false; for (uint8 i=0; i<checkList->size(); ++i) { switch ((*checkList)[i].check) { case WARD_CHECK_TIMING: { sLog->outStaticDebug("Warden: TimeCheck"); uint8 res; uint32 ticks; clientPacket >> res; // should be 1 clientPacket >> ticks; // Need to compare ticks based on last one using server ticks diff since sLog->outStaticDebug("Warden: Time unk 0x%08X", ticks); pktLen = pktLen - 5; break; } case WARD_CHECK_MEMORY: { sLog->outStaticDebug("Warden: MemCheck"); uint8 res; clientPacket >> res; // should be 0 if (res) { valid = false; if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed check, MEM at Offset 0x%04X, lentgh %u could not be read by client", session->GetPlayerName(), (*checkList)[i].mem->Offset, (*checkList)[i].mem->Length); } else { sLog->outWarden("Warden: account %u failed check, MEM at Offset 0x%04X, lentgh %u could not be read by client", session->GetAccountId(), (*checkList)[i].mem->Offset, (*checkList)[i].mem->Length); } } else { uint8 memContent[20]; bool memcheck_failed = false; for (uint8 pos=0; pos<(*checkList)[i].mem->Length; ++pos) { clientPacket >> memContent[pos]; if (memContent[pos]!=(*checkList)[i].mem->Result[pos]) { valid = false; memcheck_failed = true; } } pktLen = pktLen - (1 + (*checkList)[i].mem->Length); if (memcheck_failed) { std::string strContent, strContent2; hexEncodeByteArray(memContent, (*checkList)[i].mem->Length, strContent); hexEncodeByteArray((*checkList)[i].mem->Result, (*checkList)[i].mem->Length, strContent2); if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed check, MEM Offset 0x%04X length %u has content '%s' instead of '%s'", session->GetPlayerName(), (*checkList)[i].mem->Offset, (*checkList)[i].mem->Length, strContent.c_str(), strContent2.c_str()); } else { sLog->outWarden("Warden: account %u failed check, MEM Offset 0x%04X length %u has content '%s' instead of '%s'", session->GetAccountId(), (*checkList)[i].mem->Offset, (*checkList)[i].mem->Length, strContent.c_str(), strContent2.c_str()); } } } sLog->outStaticDebug("Warden: Mem %s", valid ? "Ok" : "Failed"); break; } case WARD_CHECK_FILE: { sLog->outStaticDebug("Warden: MPQCheck"); uint8 res; uint8 resSHA1[20]; clientPacket >> res; // should be 0 if (res) { valid = false; if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed check, MPQ '%s' not found by client", session->GetPlayerName(), (*checkList)[i].file->String.c_str()); } else { sLog->outWarden("Warden: account %u failed check, MPQ '%s' not found by client", session->GetAccountId(), (*checkList)[i].file->String.c_str()); } pktLen = pktLen - 1; } else { for (uint8 pos=0; pos<20; ++pos) clientPacket >> resSHA1[pos]; if (res || memcmp(resSHA1, (*checkList)[i].file->SHA, 20)) { valid = false; std::string strResSHA1, strReqSHA1; hexEncodeByteArray(resSHA1, 20, strResSHA1); hexEncodeByteArray((*checkList)[i].file->SHA, 20, strReqSHA1); if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed check, MPQ '%s' SHA1 is '%s' instead of '%s'", session->GetPlayerName(), (*checkList)[i].file->String.c_str(), strResSHA1.c_str(), strReqSHA1.c_str()); } else { sLog->outWarden("Warden: account %u failed check, MPQ '%s' SHA1 is '%s' instead of '%s'", session->GetAccountId(), (*checkList)[i].file->String.c_str(), strResSHA1.c_str(), strReqSHA1.c_str()); } } pktLen = pktLen - 21; } sLog->outStaticDebug("Warden: MPQ %s", valid ? "Ok" : "Failed"); break; } case WARD_CHECK_LUA: { sLog->outStaticDebug("Warden: LUACheck"); uint8 res; uint8 foundLuaLen; clientPacket >> res; // should be 0 clientPacket >> foundLuaLen; // should be 0 uint8 *luaStr; if (foundLuaLen > 0) { luaStr = (uint8*)malloc(foundLuaLen+1); for (uint8 pos=0; pos<foundLuaLen; ++pos) { clientPacket >> luaStr[pos]; } luaStr[foundLuaLen] = 0; if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed lua check, Lua '%s' found as '%s'", session->GetPlayerName(), (*checkList)[i].lua->String.c_str(), (char*)luaStr); } else { sLog->outWarden("Warden: account %u failed lua check, Lua '%s' found as '%s'", session->GetAccountId(), (*checkList)[i].lua->String.c_str(), (char*)luaStr); } valid = false; free(luaStr); } sLog->outStaticDebug("Lua %s", valid ? "Ok" : "Failed"); pktLen = pktLen - 2; break; } case WARD_CHECK_PAGE1: case WARD_CHECK_PAGE2: case WARD_CHECK_DRIVER: { sLog->outStaticDebug("PageCheck or DriverCheck"); uint8 res; clientPacket >> res; // should be 0xE9 if (res != 0xE9) { if ((*checkList)[i].check == WARD_CHECK_DRIVER) { if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed driver check '%s'", session->GetPlayerName(), (*checkList)[i].driver->String.c_str()); } else { sLog->outWarden("Warden: account %u failed driver check '%s'", session->GetAccountId(), (*checkList)[i].driver->String.c_str()); } } else { if (session->GetPlayer()) { sLog->outWarden("Warden: player %s failed page check Offset 0x%08X, length %u", session->GetPlayerName(), (*checkList)[i].page->Offset, (*checkList)[i].page->Length); } else { sLog->outWarden("Warden: account %u failed page check Offset 0x%08X, length %u", session->GetAccountId(), (*checkList)[i].page->Offset, (*checkList)[i].page->Length); } } valid = false; } sLog->outStaticDebug("Page or Driver %s",valid?"Ok":"Failed"); pktLen = pktLen - 1; break; } default: sLog->outStaticDebug("Warden: Other!!"); // Finish skiping the rest of the packet and return failed checks if (session->GetPlayer()) { sLog->outWarden("Wrong packet for player %s or problem to parse it, I had to clean %u bytes", session->GetPlayerName(), clientPacket.size() - clientPacket.rpos()); } else { sLog->outWarden("Wrong packet for account %u or problem to parse it, I had to clean %u bytes", session->GetAccountId(), clientPacket.size() - clientPacket.rpos()); } clientPacket.read_skip(clientPacket.size() - clientPacket.rpos()); return false; } }