void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) { DEBUG_LOG("WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); data << uint32(count); // placeholder for(ObjectGuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint8 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 << uint8(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 << uint8(dialogStatus); ++count; } } data.put<uint32>(0, count); // write real count SendPacket(&data); }
void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recv_data) { ObjectGuid guid; recv_data >> guid; uint8 dialogStatus = DIALOG_STATUS_NONE; Object* questgiver = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT); if (!questgiver) { DETAIL_LOG("Error in CMSG_QUESTGIVER_STATUS_QUERY, called for not found questgiver %s", guid.GetString().c_str()); return; } DEBUG_LOG("WORLD: Received opcode CMSG_QUESTGIVER_STATUS_QUERY - for %s to %s", _player->GetGuidStr().c_str(), guid.GetString().c_str()); switch (questgiver->GetTypeId()) { case TYPEID_UNIT: { Creature* cr_questgiver = (Creature*)questgiver; if (_player->CanInteract(static_cast<Unit*>(questgiver))) // not show quest status to enemies { dialogStatus = sScriptDevAIMgr.GetDialogStatus(_player, cr_questgiver); if (dialogStatus == DIALOG_STATUS_UNDEFINED) dialogStatus = getDialogStatus(_player, cr_questgiver, DIALOG_STATUS_NONE); } break; } case TYPEID_GAMEOBJECT: { GameObject* go_questgiver = (GameObject*)questgiver; if (_player->CanInteract(go_questgiver)) { dialogStatus = sScriptDevAIMgr.GetDialogStatus(_player, go_questgiver); if (dialogStatus == DIALOG_STATUS_UNDEFINED) dialogStatus = getDialogStatus(_player, go_questgiver, DIALOG_STATUS_NONE); } break; } default: sLog.outError("QuestGiver called for unexpected type %u", questgiver->GetTypeId()); break; } // inform client about status of quest _player->PlayerTalkClass->SendQuestGiverStatus(dialogStatus, guid); }
void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) { uint64 guid; recv_data >> guid; uint8 dialogStatus = DIALOG_STATUS_NONE; Object* questgiver = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT); if (!questgiver) { DETAIL_LOG("Error in CMSG_QUESTGIVER_STATUS_QUERY, called for not found questgiver (Typeid: %u GUID: %u)", GuidHigh2TypeId(GUID_HIPART(guid)), GUID_LOPART(guid)); return; } switch(questgiver->GetTypeId()) { case TYPEID_UNIT: { DEBUG_LOG("WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u", uint32(GUID_LOPART(guid))); Creature* cr_questgiver = (Creature*)questgiver; if (!cr_questgiver->IsHostileTo(_player)) // not show quest status to enemies { dialogStatus = sScriptMgr.NPCDialogStatus(_player, cr_questgiver); if (dialogStatus > DIALOG_STATUS_REWARD_REP) dialogStatus = getDialogStatus(_player, cr_questgiver, DIALOG_STATUS_NONE); } break; } case TYPEID_GAMEOBJECT: { DEBUG_LOG("WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u", uint32(GUID_LOPART(guid))); GameObject* go_questgiver = (GameObject*)questgiver; dialogStatus = sScriptMgr.GODialogStatus(_player, go_questgiver); if (dialogStatus > DIALOG_STATUS_REWARD_REP) dialogStatus = getDialogStatus(_player, go_questgiver, DIALOG_STATUS_NONE); break; } default: sLog.outError("QuestGiver called for unexpected type %u", questgiver->GetTypeId()); break; } //inform client about status of quest _player->PlayerTalkClass->SendQuestGiverStatus(dialogStatus, guid); }
void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket & recv_data) { uint64 guid; recv_data >> guid; uint32 questStatus = DIALOG_STATUS_NONE; uint32 defstatus = DIALOG_STATUS_NONE; Object* questgiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); if (!questgiver) { sLog->outDetail( "Error in CMSG_QUESTGIVER_STATUS_QUERY, called for not found questgiver (Typeid: %u GUID: %u)", GuidHigh2TypeId(GUID_HIPART(guid)), GUID_LOPART(guid)); return; } switch (questgiver->GetTypeId()) { case TYPEID_UNIT: { sLog->outDebug( LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u", uint32(GUID_LOPART(guid))); Creature* cr_questgiver = questgiver->ToCreature(); if (!cr_questgiver->IsHostileTo(_player)) // do not show quest status to enemies { questStatus = sScriptMgr->GetDialogStatus(_player, cr_questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, cr_questgiver, defstatus); } break; } case TYPEID_GAMEOBJECT: { sLog->outDebug( LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u", uint32(GUID_LOPART(guid))); GameObject* go_questgiver = (GameObject*) questgiver; questStatus = sScriptMgr->GetDialogStatus(_player, go_questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, go_questgiver, defstatus); break; } default: sLog->outError("QuestGiver called for unexpected type %u", questgiver->GetTypeId()); break; } //inform client about status of quest _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid); }
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) { TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); data << uint32(count); // placeholder for (Player::ClientGUIDs::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint8 questStatus = DIALOG_STATUS_NONE; uint8 defstatus = DIALOG_STATUS_NONE; if (IS_CRE_OR_VEH_OR_PET_GUID(*itr)) { // need also pet quests case support Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(), *itr); if (!questgiver || questgiver->IsHostileTo(_player)) continue; if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; questStatus = sScriptMgr->GetDialogStatus(_player, questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, questgiver, defstatus); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } else if (IS_GAMEOBJECT_GUID(*itr)) { GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if (!questgiver) continue; if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; questStatus = sScriptMgr->GetDialogStatus(_player, questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, questgiver, defstatus); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } } data.put<uint32>(0, count); // write real count SendPacket(&data); }
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) { sLog.outDebug("WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); data << uint32(count); // placeholder for(ObjectGuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint8 questStatus = DIALOG_STATUS_NONE; uint8 defstatus = DIALOG_STATUS_NONE; if (itr->IsCreatureOrPet()) { // need also pet quests case support Creature *questgiver = GetPlayer()->GetMap()->GetCreatureOrPetOrVehicle(*itr); if(!questgiver || questgiver->IsHostileTo(_player)) continue; if(!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; questStatus = Script->NPCDialogStatus(_player, questgiver); if( questStatus > 6 ) questStatus = getDialogStatus(_player, questgiver, defstatus); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } else if (itr->IsGameobject()) { GameObject *questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if(!questgiver) continue; if(questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; questStatus = Script->GODialogStatus(_player, questgiver); if( questStatus > 6 ) questStatus = getDialogStatus(_player, questgiver, defstatus); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } } data.put<uint32>(0, count); // write real count SendPacket(&data); }
void WorldSession::HandleQuestgiverStatusQueryMultipleOpcode(WorldPacket& /*recvPacket*/) { sLog.outDebug("WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); data << uint32(count); // placeholder for (Player::ClientGUIDs::iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint8 questStatus = DIALOG_STATUS_NONE; uint8 defstatus = DIALOG_STATUS_NONE; if (IS_CREATURE_GUID(*itr)) { Creature *questgiver = GetPlayer()->GetMap()->GetCreature(*itr); if (!questgiver || questgiver->IsHostileTo(_player)) continue; if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; questStatus = sScriptMgr.GetDialogStatus(_player, questgiver); if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) questStatus = getDialogStatus(_player, questgiver, defstatus); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } else if (IS_GAMEOBJECT_GUID(*itr)) { GameObject *questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if (!questgiver) continue; if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; questStatus = sScriptMgr.GetDialogStatus(_player, questgiver); if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) questStatus = getDialogStatus(_player, questgiver, defstatus); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } } data.put<uint32>(0, count); // write real count SendPacket(&data); }
void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket & recv_data) { CHECK_PACKET_SIZE(recv_data,8); uint64 guid; recv_data >> guid; uint8 questStatus = DIALOG_STATUS_NONE; uint8 defstatus = DIALOG_STATUS_NONE; Object* questgiver = _player->GetMap()->GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); if (!questgiver) { sLog.outDetail("Error in CMSG_QUESTGIVER_STATUS_QUERY, called for not found questgiver (Typeid: %u GUID: %u)",GuidHigh2TypeId(GUID_HIPART(guid)),GUID_LOPART(guid)); return; } switch (questgiver->GetTypeId()) { case TYPEID_UNIT: { sLog.outDebug("WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u",uint32(GUID_LOPART(guid))); Creature* cr_questgiver=(Creature*)questgiver; if (!cr_questgiver->IsHostileTo(_player)) // not show quest status to enemies { questStatus = sScriptMgr.GetDialogStatus(_player, cr_questgiver); if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) questStatus = getDialogStatus(_player, cr_questgiver, defstatus); } break; } case TYPEID_GAMEOBJECT: { sLog.outDebug("WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u",uint32(GUID_LOPART(guid))); GameObject* go_questgiver=(GameObject*)questgiver; questStatus = sScriptMgr.GetDialogStatus(_player, go_questgiver); if (questStatus == DIALOG_STATUS_SCRIPTED_NO_STATUS) questStatus = getDialogStatus(_player, go_questgiver, defstatus); break; } default: sLog.outLog(LOG_DEFAULT, "ERROR: QuestGiver called for unexpected type %u", questgiver->GetTypeId()); break; } //inform client about status of quest _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid); }
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; ByteBuffer byteData; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 3 + count * (1 + 8 + 4)); size_t pos = data.bitwpos(); data.WriteBits(count, 21); // placeholder for (Player::ClientGUIDs::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint32 questStatus = DIALOG_STATUS_NONE; uint32 defstatus = DIALOG_STATUS_NONE; if (IS_CRE_OR_VEH_OR_PET_GUID(*itr)) { // need also pet quests case support Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(), *itr); if (!questgiver || questgiver->IsHostileTo(_player)) continue; if (!questgiver->HasFlag(UNIT_FIELD_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; questStatus = sScriptMgr->GetDialogStatus(_player, questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, questgiver, defstatus); ObjectGuid guid = questgiver->GetGUID(); data.WriteBit(guid[4]); data.WriteBit(guid[0]); data.WriteBit(guid[3]); data.WriteBit(guid[6]); data.WriteBit(guid[5]); data.WriteBit(guid[7]); data.WriteBit(guid[1]); data.WriteBit(guid[2]); byteData.WriteByteSeq(guid[6]); byteData.WriteByteSeq(guid[2]); byteData.WriteByteSeq(guid[7]); byteData.WriteByteSeq(guid[5]); byteData.WriteByteSeq(guid[4]); byteData << uint32(questStatus); byteData.WriteByteSeq(guid[1]); byteData.WriteByteSeq(guid[3]); byteData.WriteByteSeq(guid[0]); ++count; } else if (IS_GAMEOBJECT_GUID(*itr)) { GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if (!questgiver) continue; if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; questStatus = sScriptMgr->GetDialogStatus(_player, questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, questgiver, defstatus); ObjectGuid guid = questgiver->GetGUID(); data.WriteBit(guid[4]); data.WriteBit(guid[0]); data.WriteBit(guid[3]); data.WriteBit(guid[6]); data.WriteBit(guid[5]); data.WriteBit(guid[7]); data.WriteBit(guid[1]); data.WriteBit(guid[2]); byteData.WriteByteSeq(guid[6]); byteData.WriteByteSeq(guid[2]); byteData.WriteByteSeq(guid[7]); byteData.WriteByteSeq(guid[5]); byteData.WriteByteSeq(guid[4]); byteData << uint32(questStatus); byteData.WriteByteSeq(guid[1]); byteData.WriteByteSeq(guid[3]); byteData.WriteByteSeq(guid[0]); ++count; } } data.FlushBits(); data.PutBits(pos, count, 21); data.append(byteData); SendPacket(&data); }
void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPacket& recvData) { ObjectGuid guid; guid[4] = recvData.ReadBit(); guid[3] = recvData.ReadBit(); guid[2] = recvData.ReadBit(); guid[1] = recvData.ReadBit(); guid[0] = recvData.ReadBit(); guid[5] = recvData.ReadBit(); guid[7] = recvData.ReadBit(); guid[6] = recvData.ReadBit(); recvData.ReadByteSeq(guid[5]); recvData.ReadByteSeq(guid[7]); recvData.ReadByteSeq(guid[4]); recvData.ReadByteSeq(guid[0]); recvData.ReadByteSeq(guid[2]); recvData.ReadByteSeq(guid[1]); recvData.ReadByteSeq(guid[6]); recvData.ReadByteSeq(guid[3]); uint32 questStatus = DIALOG_STATUS_NONE; uint32 defstatus = DIALOG_STATUS_NONE; Object* questgiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); if (!questgiver) { TC_LOG_INFO("network", "Error in CMSG_QUESTGIVER_STATUS_QUERY, called for non-existing questgiver (Typeid: %u GUID: %u)", GuidHigh2TypeId(GUID_HIPART(guid)), GUID_LOPART(guid)); return; } switch (questgiver->GetTypeId()) { case TYPEID_UNIT: { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for npc, guid = %u", uint32(GUID_LOPART(guid))); Creature* cr_questgiver=questgiver->ToCreature(); if (!cr_questgiver->IsHostileTo(_player)) // do not show quest status to enemies { questStatus = sScriptMgr->GetDialogStatus(_player, cr_questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, cr_questgiver, defstatus); } break; } case TYPEID_GAMEOBJECT: { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u", uint32(GUID_LOPART(guid))); GameObject* go_questgiver=(GameObject*)questgiver; questStatus = sScriptMgr->GetDialogStatus(_player, go_questgiver); if (questStatus > 6) questStatus = getDialogStatus(_player, go_questgiver, defstatus); break; } default: TC_LOG_ERROR("network", "QuestGiver called for unexpected type %u", questgiver->GetTypeId()); break; } //inform client about status of quest _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid); }