diff --git a/src/game/Server/Opcodes.h b/src/game/Server/Opcodes.h index 733ef07a1..59906cce4 100644 --- a/src/game/Server/Opcodes.h +++ b/src/game/Server/Opcodes.h @@ -459,7 +459,7 @@ enum Opcodes SMSG_QUESTGIVER_STATUS = 0x2115, // 4.3.4 15595 CMSG_QUESTGIVER_HELLO = 0x0D17, // 4.3.4 15595 SMSG_QUESTGIVER_QUEST_LIST = 0x0134, // 4.3.4 15595 - CMSG_QUESTGIVER_QUERY_QUEST = 0x2F14, // 4.3.4 15595 + CMSG_QUESTGIVER_QUERY_QUEST = 0x0474, // 5.4.7 18019 CMSG_QUESTGIVER_QUEST_AUTOLAUNCH = 0x1188, SMSG_QUESTGIVER_QUEST_DETAILS = 0x2425, // 4.3.4 15595 CMSG_QUESTGIVER_ACCEPT_QUEST = 0x6B37, // 4.3.4 15595 diff --git a/src/game/WorldHandlers/QuestHandler.cpp b/src/game/WorldHandlers/QuestHandler.cpp index 1e66b9f91..008d66d5f 100644 --- a/src/game/WorldHandlers/QuestHandler.cpp +++ b/src/game/WorldHandlers/QuestHandler.cpp @@ -204,12 +204,30 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPacket& recv_data) _player->PlayerTalkClass->CloseGossip(); } -void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket& recv_data) +void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket& recvData) { ObjectGuid guid; uint32 quest; - uint8 unk1; - recv_data >> guid >> quest >> unk1; + + recvData >> quest; + guid[6] = recvData.ReadBit(); + guid[3] = recvData.ReadBit(); + guid[1] = recvData.ReadBit(); + recvData.ReadBit(); + guid[5] = recvData.ReadBit(); + guid[4] = recvData.ReadBit(); + guid[2] = recvData.ReadBit(); + guid[7] = recvData.ReadBit(); + guid[0] = recvData.ReadBit(); + + recvData.ReadByteSeq(guid[5]); + recvData.ReadByteSeq(guid[6]); + recvData.ReadByteSeq(guid[2]); + recvData.ReadByteSeq(guid[0]); + recvData.ReadByteSeq(guid[1]); + recvData.ReadByteSeq(guid[4]); + recvData.ReadByteSeq(guid[3]); + recvData.ReadByteSeq(guid[7]); DEBUG_LOG("WORLD: Received opcode CMSG_QUESTGIVER_QUERY_QUEST - for %s to %s, quest = %u, unk1 = %u", _player->GetGuidStr().c_str(), guid.GetString().c_str(), quest, unk1); @@ -646,7 +664,58 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket { DEBUG_LOG("WORLD: Received opcode CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); - _player->SendQuestGiverStatusMultiple(); + uint32 count = 0; + + WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); + data << uint32(count); // placeholder + + for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) + { + uint32 dialogStatus = DIALOG_STATUS_NONE; + + if (itr->IsAnyTypeCreature()) + { + // need also pet quests case support + Creature* questgiver = GetPlayer()->GetMap()->GetAnyTypeCreature(*itr); + + if (!questgiver || questgiver->IsHostileTo(_player)) + continue; + + if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) + continue; + + dialogStatus = sScriptMgr.GetDialogStatus(_player, questgiver); + + if (dialogStatus > DIALOG_STATUS_REWARD_REP) + dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE); + + data << questgiver->GetObjectGuid(); + data << uint32(dialogStatus); + ++count; + } + else if (itr->IsGameObject()) + { + GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); + + if (!questgiver) + continue; + + if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) + continue; + + dialogStatus = sScriptMgr.GetDialogStatus(_player, questgiver); + + if (dialogStatus > DIALOG_STATUS_REWARD_REP) + dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE); + + data << questgiver->GetObjectGuid(); + data << uint32(dialogStatus); + ++count; + } + } + + data.put(0, count); // write real count + SendPacket(&data); } bool WorldSession::CanInteractWithQuestGiver(ObjectGuid guid, char const* descr)