Beispiel #1
0
	bool OnGossipHello(Player* pPlayer, Creature* pCreature)
	{
		// uint64 const guid = pCreature->GetGUID();

		if (pCreature->isQuestGiver())
		{
			Object *pObject = (Object*)pCreature;
			QuestRelations* pObjectQR = sObjectMgr->GetCreatureQuestRelationMap();
			QuestRelations* pObjectQIR = sObjectMgr->GetCreatureQuestInvolvedRelation();

			QuestMenu &qm = pPlayer->PlayerTalkClass->GetQuestMenu();
			qm.ClearMenu();

			for (QuestRelations::const_iterator i = pObjectQIR->lower_bound(pObject->GetEntry()); i != pObjectQIR->upper_bound(pObject->GetEntry()); ++i)
			{
				uint32 quest_id = i->second;
				QuestStatus status = pPlayer->GetQuestStatus(quest_id);
				if (status == QUEST_STATUS_COMPLETE && !pPlayer->GetQuestRewardStatus(quest_id))
					qm.AddMenuItem(quest_id, 4);
				else if (status == QUEST_STATUS_INCOMPLETE)
					qm.AddMenuItem(quest_id, 4);
				//else if (status == QUEST_STATUS_AVAILABLE)
				//    qm.AddMenuItem(quest_id, 2);
			}

		for (QuestRelations::const_iterator i = pObjectQR->lower_bound(pObject->GetEntry()); i != pObjectQR->upper_bound(pObject->GetEntry()); ++i)
			{
				uint32 quest_id = i->second;
				Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest_id);
				if (!pQuest) continue;
				QuestStatus status;
				bool allowed=false;
				switch(quest_id)
				{
					case 13795: // The Scourgebane
						allowed = (pPlayer->GetQuestStatus(13702) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13702)) || (pPlayer->GetQuestStatus(13732) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13732)) || (pPlayer->GetQuestStatus(13735) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13735)) || (pPlayer->GetQuestStatus(13733) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13733)) || (pPlayer->GetQuestStatus(13734) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13734)) || (pPlayer->GetQuestStatus(13736) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13736)) || (pPlayer->GetQuestStatus(13737) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13737)) || (pPlayer->GetQuestStatus(13738) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13738)) || (pPlayer->GetQuestStatus(13739) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13739)) || (pPlayer->GetQuestStatus(13740) == QUEST_STATUS_COMPLETE && pPlayer->GetQuestRewardStatus(13740)); // If the player has finished any of the "A Champion Rises" quests
						if(allowed)
						{
							status = pPlayer->GetQuestStatus(quest_id);

							if(pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 4);
							else if(status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 2);
						}
						break;
					default:
						status = pPlayer->GetQuestStatus(quest_id);

						if (pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
							qm.AddMenuItem(quest_id, 4);
						else if (status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
							qm.AddMenuItem(quest_id, 2);
						break;
				}
			}
		}
	    pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
	    return true;
	}
Beispiel #2
0
static void getQuestLocationByRelation(const Quest& q, QuestPointListener& l, QplFunc func,
	const QuestRelations& qrs, const Spawns& spawns)
{
	for(auto pair = qrs.findQuest(q.id); pair.first != pair.second; ++pair.first) {
		const QuestRelation& qr(*pair.first->second);
		getQuestLocationPair(spawns.findId(qr.id), l, func);
	}
}
Beispiel #3
0
void PoolGroup<Quest>::Spawn1Object(PoolObject* obj)
{
    // Creatures
    QuestRelations* questMap = sObjectMgr->GetCreatureQuestRelationMap();
    PooledQuestRelationBoundsNC qr = sPoolMgr->mQuestCreatureRelation.equal_range(obj->guid);
    for (PooledQuestRelation::iterator itr = qr.first; itr != qr.second; ++itr)
    {
        sLog->outDebug(LOG_FILTER_POOLSYS, "PoolGroup<Quest>: Adding quest %u to creature %u", itr->first, itr->second);
        questMap->insert(QuestRelations::value_type(itr->second, itr->first));
    }

    // Gameobjects
    questMap = sObjectMgr->GetGOQuestRelationMap();
    qr = sPoolMgr->mQuestGORelation.equal_range(obj->guid);
    for (PooledQuestRelation::iterator itr = qr.first; itr != qr.second; ++itr)
    {
        sLog->outDebug(LOG_FILTER_POOLSYS, "PoolGroup<Quest>: Adding quest %u to GO %u", itr->first, itr->second);
        questMap->insert(QuestRelations::value_type(itr->second, itr->first));
    }
}
Beispiel #4
0
void ObjectMgr::LoadQuests()
{
    sQuestsStorage.Load ();

    // create multimap previous quest for each existed quest
    // some quests can have many previous maps setted by NextQuestId in previouse quest
    // for example set of race quests can lead to single not race specific quest
    for(uint32 i = 1; i < sQuestsStorage.MaxEntry; ++i )
    {
        QuestInfo const* qinfo = GetQuestInfo(i);

        if(!qinfo)
            continue;

        if(qinfo->PrevQuestId )
            sPrevQuests.insert(QuestRelations::value_type(qinfo->QuestId,qinfo->PrevQuestId));

        if(qinfo->NextQuestId )
            sPrevQuests.insert(QuestRelations::value_type(qinfo->NextQuestId,qinfo->QuestId));
    };

    sLog.outString( ">> Loaded %u quests definitions", sQuestsStorage.RecordCount );
    sLog.outString( "" );
}
Beispiel #5
0
void PoolGroup<Quest>::Despawn1Object(uint32 quest_id)
{
    // Creatures
    QuestRelations* questMap = sObjectMgr->GetCreatureQuestRelationMap();
    PooledQuestRelationBoundsNC qr = sPoolMgr->mQuestCreatureRelation.equal_range(quest_id);
    for (PooledQuestRelation::iterator itr = qr.first; itr != qr.second; ++itr)
    {
        QuestRelations::iterator qitr = questMap->find(itr->second);
        if (qitr == questMap->end())
            continue;
        QuestRelations::iterator lastElement = questMap->upper_bound(itr->second);
        for (; qitr != lastElement; ++qitr)
        {
            if (qitr->first == itr->second)
            {
                questMap->erase(qitr);                  // iterator is now no more valid
                break;                                  // but we can exit loop since the element is found
            }
        }
    }

    // Gameobjects
    questMap = sObjectMgr->GetGOQuestRelationMap();
    qr = sPoolMgr->mQuestGORelation.equal_range(quest_id);
    for (PooledQuestRelation::iterator itr = qr.first; itr != qr.second; ++itr)
    {
        QuestRelations::iterator qitr = questMap->find(itr->second);
        if (qitr == questMap->end())
            continue;
        QuestRelations::iterator lastElement = questMap->upper_bound(itr->second);
        for (; qitr != lastElement; ++qitr)
        {
            if (qitr->first == itr->second)
            {
                questMap->erase(qitr);                  // iterator is now no more valid
                break;                                  // but we can exit loop since the element is found
            }
        }
    }
}
Beispiel #6
0
    bool OnGossipHello(Player* player, Creature* creature)
    {
        if (creature->isQuestGiver())
            player->PrepareQuestMenu(creature->GetGUID());

        BattlefieldWG* BfWG = (BattlefieldWG *) sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
        if (BfWG)
        {
            if (creature->isQuestGiver())
            {
                Object* pObject = (Object *) creature;
                QuestRelations* objectQR = sObjectMgr->GetCreatureQuestRelationMap();
                QuestRelations* objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelation();

                QuestMenu & qm = player->PlayerTalkClass->GetQuestMenu();
                qm.ClearMenu();

                for (QuestRelations::const_iterator i = objectQIR->lower_bound(pObject->GetEntry()); i != objectQIR->upper_bound(pObject->GetEntry()); ++i)
                {
                    uint32 quest_id = i->second;
                    QuestStatus status = player->GetQuestStatus(quest_id);
                    if (status == QUEST_STATUS_COMPLETE && !player->GetQuestRewardStatus(quest_id))
                        qm.AddMenuItem(quest_id, 4);
                    else if (status == QUEST_STATUS_INCOMPLETE)
                        qm.AddMenuItem(quest_id, 4);
                }

                for (QuestRelations::const_iterator i = objectQR->lower_bound(pObject->GetEntry()); i != objectQR->upper_bound(pObject->GetEntry()); ++i)
                {
                    uint32 quest_id = i->second;
                    Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
                    if (!quest)
                        continue;

                    switch (quest_id)
                    {
                        // Horde attacker
                        case 13193:
                        case 13202:
                        case 13180:
                        case 13200:
                        case 13201:
                        case 13223:
                            if (BfWG->GetAttackerTeam() == TEAM_HORDE)
                            {
                                QuestStatus status = player->GetQuestStatus(quest_id);

                                if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 4);
                                else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 2);
                            }
                            break;
                        // Horde defender
                        case 13199:
                        case 13192:
                        case 13178:
                        case 13191:
                        case 13194:
                        case 13539:
                        case 13185:
                            if (BfWG->GetDefenderTeam() == TEAM_HORDE)
                            {
                                QuestStatus status = player->GetQuestStatus(quest_id);

                                if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 4);
                                else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 2);
                            }
                            break;
                        // Alliance attacker
                        case 13196:
                        case 13198:
                        case 13179:
                        case 13222:
                        case 13195:
                            if (BfWG->GetAttackerTeam() == TEAM_ALLIANCE)
                            {
                                QuestStatus status = player->GetQuestStatus(quest_id);

                                if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 4);
                                else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 2);
                            }
                            break;
                        // Alliance defender
                        case 13154:
                        case 13153:
                        case 13177:
                        case 13538:
                        case 13186:
                        case 13156:
                            if (BfWG->GetDefenderTeam() == TEAM_ALLIANCE)
                            {
                                QuestStatus status = player->GetQuestStatus(quest_id);

                                if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 4);
                                else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
                                    qm.AddMenuItem(quest_id, 2);
                            }
                            break;
                        default:
                            QuestStatus status = player->GetQuestStatus(quest_id);

                            if (quest->IsAutoComplete() && player->CanTakeQuest(quest, false))
                                qm.AddMenuItem(quest_id, 4);
                            else if (status == QUEST_STATUS_NONE && player->CanTakeQuest(quest, false))
                                qm.AddMenuItem(quest_id, 2);
                            break;
                    }
                }
            }
            player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
            return true;
        }
        return true;
    }
Beispiel #7
0
	bool OnGossipHello(Player* pPlayer, Creature* pCreature)
	{
		// uint64 const guid = pCreature->GetGUID();

		if (pCreature->isQuestGiver())
		{
			Object *pObject = (Object*)pCreature;
			QuestRelations* pObjectQR = sObjectMgr->GetCreatureQuestRelationMap();
			QuestRelations* pObjectQIR = sObjectMgr->GetCreatureQuestInvolvedRelation();

			QuestMenu &qm = pPlayer->PlayerTalkClass->GetQuestMenu();
			qm.ClearMenu();

			for (QuestRelations::const_iterator i = pObjectQIR->lower_bound(pObject->GetEntry()); i != pObjectQIR->upper_bound(pObject->GetEntry()); ++i)
			{
				uint32 quest_id = i->second;
				QuestStatus status = pPlayer->GetQuestStatus(quest_id);
				if (status == QUEST_STATUS_COMPLETE && !pPlayer->GetQuestRewardStatus(quest_id))
					qm.AddMenuItem(quest_id, 4);
				else if (status == QUEST_STATUS_INCOMPLETE)
					qm.AddMenuItem(quest_id, 4);
			//else if (status == QUEST_STATUS_AVAILABLE)
				//    qm.AddMenuItem(quest_id, 2);
			}

			for (QuestRelations::const_iterator i = pObjectQR->lower_bound(pObject->GetEntry()); i != pObjectQR->upper_bound(pObject->GetEntry()); ++i)
			{
				uint32 quest_id = i->second;
				Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest_id);
				if (!pQuest) continue;
				QuestStatus status;
				bool allowed=false;
				switch(quest_id)
				{
					case 13682: // Alliance Threat From Above
					case 13809: // Horde Threat From Above
						allowed = (pPlayer->GetQuestStatus(13664) == QUEST_STATUS_COMPLETE) && pPlayer->GetQuestRewardStatus(13664);
						if(allowed)
						{
							status = pPlayer->GetQuestStatus(quest_id);

							if(pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 4);
							else if(status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 2);
						}
						break;
					default:
						status = pPlayer->GetQuestStatus(quest_id);

						if (pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
							qm.AddMenuItem(quest_id, 4);
						else if (status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
							qm.AddMenuItem(quest_id, 2);
					break;
				}
			}
		}
	    pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
	    return true;
	}
Beispiel #8
0
	bool OnGossipHello(Player* pPlayer, Creature* pCreature)
	{
		//uint64 const guid = pCreature->GetGUID();

	        if (pCreature->isQuestGiver())
		{
			Object *pObject = (Object*)pCreature;
			QuestRelations* pObjectQR = sObjectMgr->GetCreatureQuestRelationMap();
			QuestRelations* pObjectQIR = sObjectMgr->GetCreatureQuestInvolvedRelation();

			QuestMenu &qm = pPlayer->PlayerTalkClass->GetQuestMenu();
			qm.ClearMenu();

			for (QuestRelations::const_iterator i = pObjectQIR->lower_bound(pObject->GetEntry()); i != pObjectQIR->upper_bound(pObject->GetEntry()); ++i)
			{
				uint32 quest_id = i->second;
				QuestStatus status = pPlayer->GetQuestStatus(quest_id);
				if (status == QUEST_STATUS_COMPLETE && !pPlayer->GetQuestRewardStatus(quest_id))
					qm.AddMenuItem(quest_id, 4);
				else if (status == QUEST_STATUS_INCOMPLETE)
					qm.AddMenuItem(quest_id, 4);
				//else if (status == QUEST_STATUS_AVAILABLE)
				//    qm.AddMenuItem(quest_id, 2);
			}

			bool EligibilityAlliance = pPlayer->GetQuestStatus(13686) == QUEST_STATUS_COMPLETE;
			bool EligibilityHorde = pPlayer->GetQuestStatus(13687) == QUEST_STATUS_COMPLETE;

			for (QuestRelations::const_iterator i = pObjectQR->lower_bound(pObject->GetEntry()); i != pObjectQR->upper_bound(pObject->GetEntry()); ++i)
			{
				uint32 quest_id = i->second;
				Quest const* pQuest = sObjectMgr->GetQuestTemplate(quest_id);
				if (!pQuest) continue;

				switch(quest_id)
				{
					case 13707: // Valiant Of Orgrimmar
					case 13708: // Valiant Of Sen'jin
					case 13709: // Valiant Of Thunder Bluff
					case 13710: // Valiant Of Undercity
					case 13711: // Valiant Of Silvermoon
						if(!EligibilityHorde)
						{
							QuestStatus status = pPlayer->GetQuestStatus(quest_id);

							if(pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 4);
							else if(status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 2);
						}
						break;
					case 13593: // Valiant Of Stormwind
					case 13703: // Valiant Of Ironforge
					case 13706: // Valiant Of Darnassus
					case 13704: // Valiant Of Gnomeregan
					case 13705: // Valiant Of The Exodar
						if(!EligibilityAlliance)
						{
							QuestStatus status = pPlayer->GetQuestStatus(quest_id);

							if(pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 4);
							else if(status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
								qm.AddMenuItem(quest_id, 2);
						}
						break;
					default:
						QuestStatus status = pPlayer->GetQuestStatus(quest_id);

						if (pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))
							qm.AddMenuItem(quest_id, 4);
						else if (status == QUEST_STATUS_NONE && pPlayer->CanTakeQuest(pQuest, false))
							qm.AddMenuItem(quest_id, 2);
						break;
				}
			}
		}
	    pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());
	    return true;
	}