static bool HandleQuestAdd(ChatHandler* handler, const char* args) { Player* player = handler->getSelectedPlayer(); if (!player) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); return false; } // .addquest #entry' // number or [name] Shift-click form |color|Hquest:quest_id:quest_level|h[name]|h|r char* cId = handler->extractKeyFromLink((char*)args, "Hquest"); if (!cId) return false; uint32 entry = atol(cId); Quest const* quest = sObjectMgr->GetQuestTemplate(entry); if (!quest) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); return false; } // check item starting quest (it can work incorrectly if added without item in inventory) ItemTemplateContainer const* itc = sObjectMgr->GetItemTemplateStore(); ItemTemplateContainer::const_iterator result = find_if(itc->begin(), itc->end(), Finder<uint32, ItemTemplate>(entry, &ItemTemplate::StartQuest)); if (result != itc->end()) { handler->PSendSysMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, result->second.ItemId); handler->SetSentErrorMessage(true); return false; } // ok, normal (creature/GO starting) quest if (player->CanAddQuest(quest, true)) { player->AddQuest(quest, NULL); if (player->CanCompleteQuest(entry)) player->CompleteQuest(entry); } return true; }
static bool HandleQuestAdd(ChatHandler* handler, const char* args) { Player* player = handler->getSelectedPlayer(); if (!player) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); return false; } char* cId = handler->extractKeyFromLink((char*)args, "Hquest"); if (!cId) return false; uint32 entry = atol(cId); Quest const* quest = sObjectMgr->GetQuestTemplate(entry); if (!quest) { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, entry); handler->SetSentErrorMessage(true); return false; } ItemTemplateContainer const* itc = sObjectMgr->GetItemTemplateStore(); ItemTemplateContainer::const_iterator result = find_if (itc->begin(), itc->end(), Finder<uint32, ItemTemplate>(entry, &ItemTemplate::StartQuest)); if (result != itc->end()) { handler->PSendSysMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, result->second.ItemId); handler->SetSentErrorMessage(true); return false; } if (player->CanAddQuest(quest, true)) { player->AddQuest(quest, NULL); if (player->CanCompleteQuest(entry)) player->CompleteQuest(entry); } return true; }
void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) { uint32 questId; recvPacket >> questId; if (!_player->CanShareQuest(questId)) return; TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_PUSHQUESTTOPARTY quest = %u", questId); if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId)) { if (Group* group = _player->GetGroup()) { for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* player = itr->GetSource(); if (!player || player == _player) // skip self continue; if (!player->SatisfyQuestStatus(quest, false)) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_HAVE_QUEST); continue; } if (player->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_FINISH_QUEST); continue; } if (!player->CanTakeQuest(quest, false)) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_CANT_TAKE_QUEST); continue; } if (!player->SatisfyQuestLog(false)) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_LOG_FULL); continue; } if (player->GetDivider() != 0) { _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_BUSY); continue; } _player->SendPushToPartyResponse(player, QUEST_PARTY_MSG_SHARING_QUEST); if (quest->IsAutoAccept() && player->CanAddQuest(quest, true) && player->CanTakeQuest(quest, true)) { player->AddQuest(quest, _player); if (player->CanCompleteQuest(questId)) player->CompleteQuest(questId); } if ((quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly()) || quest->HasFlag(QUEST_FLAGS_AUTOCOMPLETE)) player->PlayerTalkClass->SendQuestGiverRequestItems(quest, _player->GetGUID(), player->CanCompleteRepeatableQuest(quest), true); else { player->SetDivider(_player->GetGUID()); player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, _player->GetGUID(), true); } } } } }