diff options
Diffstat (limited to 'src/server/game/Handlers/QuestHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 100 |
1 files changed, 44 insertions, 56 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index f591a5fa988..851e6e89e97 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -68,18 +68,15 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestG _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, packet.QuestGiverGUID); } -void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket& recvData) +void WorldSession::HandleQuestgiverHelloOpcode(WorldPackets::Quest::QuestGiverHello& packet) { - ObjectGuid guid; - recvData >> guid; - - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_HELLO %s", guid.ToString().c_str()); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_HELLO %s", packet.QuestGiverGUID.ToString().c_str()); - Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_NONE); + Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(packet.QuestGiverGUID, UNIT_NPC_FLAG_NONE); if (!creature) { TC_LOG_DEBUG("network", "WORLD: HandleQuestgiverHelloOpcode - %s not found or you can't interact with him.", - guid.ToString().c_str()); + packet.QuestGiverGUID.ToString().c_str()); return; } @@ -236,34 +233,28 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode(WorldPacket& recvData) } } -void WorldSession::HandleQuestQueryOpcode(WorldPacket& recvData) +void WorldSession::HandleQuestQueryOpcode(WorldPackets::Quest::QueryQuestInfo& packet) { if (!_player) return; - uint32 questId; - recvData >> questId; - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUEST_QUERY quest = %u", questId); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUEST_QUERY quest = %u", packet.QuestID); - if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) + if (Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID)) _player->PlayerTalkClass->SendQuestQueryResponse(quest); } -void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) +void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::QuestGiverChooseReward& packet) { - uint32 questId, reward; - ObjectGuid guid; - recvData >> guid >> questId >> reward; - - if (reward >= QUEST_REWARD_CHOICES_COUNT) + if (packet.ItemChoiceID >= QUEST_REWARD_CHOICES_COUNT) { - TC_LOG_ERROR("network", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward (%u) (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), reward); + TC_LOG_ERROR("network", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward (%u) (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID); return; } - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u", guid.ToString().c_str(), questId, reward); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.ItemChoiceID); - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID); if (!quest) return; @@ -271,8 +262,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (!quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) { - object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); - if (!object || !object->hasInvolvedQuest(questId)) + object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + if (!object || !object->hasInvolvedQuest(packet.QuestID)) return; // some kind of WPE protection @@ -280,17 +271,17 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) return; } - if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) || - (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) + if ((!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(packet.QuestID) == QUEST_STATUS_NONE) || + (_player->GetQuestStatus(packet.QuestID) != QUEST_STATUS_COMPLETE && !quest->IsAutoComplete())) { TC_LOG_ERROR("network", "Error in QUEST_STATUS_COMPLETE: player %s (%s) tried to complete quest %u, but is not allowed to do so (possible packet-hacking or high latency)", - _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), questId); + _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.QuestID); return; } - if (_player->CanRewardQuest(quest, reward, true)) + if (_player->CanRewardQuest(quest, packet.ItemChoiceID, true)) { - _player->RewardQuest(quest, reward, object); + _player->RewardQuest(quest, packet.ItemChoiceID, object); switch (object->GetTypeId()) { @@ -299,10 +290,10 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) { //For AutoSubmition was added plr case there as it almost same exclute AI script cases. Creature* creatureQGiver = object->ToCreature(); - if (!creatureQGiver || !sScriptMgr->OnQuestReward(_player, creatureQGiver, quest, reward)) + if (!creatureQGiver || !sScriptMgr->OnQuestReward(_player, creatureQGiver, quest, packet.ItemChoiceID)) { // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest)) { // Only send the quest to the player if the conditions are met if (_player->CanTakeQuest(nextQuest, false)) @@ -310,22 +301,22 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, packet.QuestGiverGUID, true); } } if (creatureQGiver) - creatureQGiver->AI()->sQuestReward(_player, quest, reward); + creatureQGiver->AI()->sQuestReward(_player, quest, packet.ItemChoiceID); } break; } case TYPEID_GAMEOBJECT: { GameObject* questGiver = object->ToGameObject(); - if (!sScriptMgr->OnQuestReward(_player, questGiver, quest, reward)) + if (!sScriptMgr->OnQuestReward(_player, questGiver, quest, packet.ItemChoiceID)) { // Send next quest - if (Quest const* nextQuest = _player->GetNextQuest(guid, quest)) + if (Quest const* nextQuest = _player->GetNextQuest(packet.QuestGiverGUID, quest)) { // Only send the quest to the player if the conditions are met if (_player->CanTakeQuest(nextQuest, false)) @@ -333,11 +324,11 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) if (nextQuest->IsAutoAccept() && _player->CanAddQuest(nextQuest, true)) _player->AddQuestAndCheckCompletion(nextQuest, object); - _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid, true); + _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, packet.QuestGiverGUID, true); } } - questGiver->AI()->QuestReward(_player, quest, reward); + questGiver->AI()->QuestReward(_player, quest, packet.ItemChoiceID); } break; } @@ -346,7 +337,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvData) } } else - _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); + _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, packet.QuestGiverGUID, true); } void WorldSession::HandleQuestgiverRequestRewardOpcode(WorldPacket& recvData) @@ -471,16 +462,13 @@ void WorldSession::HandleQuestConfirmAccept(WorldPacket& recvData) } } -void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData) +void WorldSession::HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiverCompleteQuest& packet) { - uint32 questId; - ObjectGuid guid; // NPC / GameObject guid for normal quest completion. Player guid for self-completed quests - bool autoCompleteMode; // 0 - standart complete quest mode with npc, 1 - auto-complete mode - recvData >> guid >> questId >> autoCompleteMode; + bool autoCompleteMode = packet.FromScript; // 0 - standart complete quest mode with npc, 1 - auto-complete mode - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %s, questId = %u self-complete: %u", guid.ToString().c_str(), questId, autoCompleteMode ? 1 : 0); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_COMPLETE_QUEST npc = %s, questId = %u self-complete: %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, autoCompleteMode ? 1 : 0); - Quest const* quest = sObjectMgr->GetQuestTemplate(questId); + Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID); if (!quest) return; @@ -491,14 +479,14 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData) if (autoCompleteMode) object = _player; else - object = ObjectAccessor::GetObjectByTypeMask(*_player, guid, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); + object = ObjectAccessor::GetObjectByTypeMask(*_player, packet.QuestGiverGUID, TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT); if (!object) return; if (autoCompleteMode == 0) { - if (!object->hasInvolvedQuest(questId)) + if (!object->hasInvolvedQuest(packet.QuestID)) return; // some kind of WPE protection @@ -508,33 +496,33 @@ void WorldSession::HandleQuestgiverCompleteQuest(WorldPacket& recvData) else { // Do not allow completing quests on other players. - if (guid != _player->GetGUID()) + if (packet.QuestGiverGUID != _player->GetGUID()) return; } - if (!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(questId) == QUEST_STATUS_NONE) + if (!_player->CanSeeStartQuest(quest) && _player->GetQuestStatus(packet.QuestID) == QUEST_STATUS_NONE) { TC_LOG_ERROR("network", "Possible hacking attempt: Player %s [%s] tried to complete quest [entry: %u] without being in possession of the quest!", - _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), questId); + _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.QuestID); return; } if (Battleground* bg = _player->GetBattleground()) - bg->HandleQuestComplete(questId, _player); + bg->HandleQuestComplete(packet.QuestID, _player); - if (_player->GetQuestStatus(questId) != QUEST_STATUS_COMPLETE) + if (_player->GetQuestStatus(packet.QuestID) != QUEST_STATUS_COMPLETE) { if (quest->IsRepeatable()) - _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanCompleteRepeatableQuest(quest), false); + _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, packet.QuestGiverGUID, _player->CanCompleteRepeatableQuest(quest), false); else - _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false); + _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, packet.QuestGiverGUID, _player->CanRewardQuest(quest, false), false); } else { - if (quest->GetReqItemsCount()) // some items required - _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, _player->CanRewardQuest(quest, false), false); + if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER)) // some items required + _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, packet.QuestGiverGUID, _player->CanRewardQuest(quest, false), false); else // no items required - _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid, true); + _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, packet.QuestGiverGUID, true); } } |
