uint32 Creature::getDialogStatus(Player *pPlayer, uint32 defstatus) { bool wasReward = false; bool wasRewardRep = false; bool wasAvail = false; bool wasIncompl = false; bool wasAnavail = false; bool wasAvailShow = false; bool wasUnavailShow = false; uint32 quest_id; uint32 status; Quest *pQuest; for( std::list<uint32>::iterator i = mQuestIds.begin( ); i != mQuestIds.end( ); ++ i ) { quest_id = *i; status = pPlayer->getQuestStatus(quest_id); pQuest = objmgr.GetQuest(quest_id); if ( pQuest == NULL ) continue; if ( !pQuest->PreReqSatisfied( pPlayer ) || !pQuest->IsCompatible( pPlayer ) || pQuest->RewardIsTaken( pPlayer ) ) continue; if ( status == QUEST_STATUS_INCOMPLETE ) wasIncompl = true; if ( status == QUEST_STATUS_COMPLETE ) { if (pQuest->HasFlag( QUEST_SPECIAL_FLAGS_REPEATABLE )) wasRewardRep = true; else wasReward = true; } if ( status == QUEST_STATUS_AVAILABLE ) { if ( pQuest->CanShowAvailable( pPlayer ) ) wasAvailShow = true; wasAvail = true; } if ( status == QUEST_STATUS_UNAVAILABLE ) { wasAnavail = true; if ( pQuest->CanShowUnsatified( pPlayer ) ) wasUnavailShow = true; } if ( status == QUEST_STATUS_NONE ) { if (!pQuest->LevelSatisfied( pPlayer )) { pPlayer->addNewQuest(quest_id, QUEST_STATUS_UNAVAILABLE ); if ( pQuest->CanShowUnsatified( pPlayer ) ) wasUnavailShow = true; wasAnavail = true; } else { pPlayer->addNewQuest(quest_id, QUEST_STATUS_AVAILABLE ); if ( pQuest->CanShowAvailable( pPlayer ) ) wasAvailShow = true; wasAvail = true; } } } for( std::list<uint32>::iterator i = mInvolvedQuestIds.begin( ); i != mInvolvedQuestIds.end( ); ++ i ) { quest_id = *i; status = pPlayer->getQuestStatus(quest_id); pQuest = objmgr.GetQuest(quest_id); if ( status == QUEST_STATUS_INCOMPLETE ) { if ( pQuest->HasFlag( QUEST_SPECIAL_FLAGS_SPEAKTO ) ) wasReward = true; else wasIncompl = true; } } if (wasReward) return DIALOG_STATUS_REWARD; if (wasRewardRep) return DIALOG_STATUS_REWARD_REP; if (wasAvail) { if (wasAvailShow) return DIALOG_STATUS_AVAILABLE; else return DIALOG_STATUS_CHAT; } if (wasIncompl) return DIALOG_STATUS_INCOMPLETE; if ( defstatus != DIALOG_STATUS_NONE ) return defstatus; if (wasAnavail) { if (wasUnavailShow) return DIALOG_STATUS_UNAVAILABLE; } return DIALOG_STATUS_NONE; }
void WorldSession::HandleQuestGiverQueryQuestOpcode(WorldPacket & recv_data) { CHECK_INWORLD_RETURN LOG_DEBUG("WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST."); WorldPacket data; uint64 guid; uint32 quest_id; uint32 status = 0; uint8 unk; recv_data >> guid; recv_data >> quest_id; recv_data >> unk; Object* qst_giver = NULL; bool bValid = false; Quest* qst = QuestStorage.LookupEntry(quest_id); if(!qst) { LOG_DEBUG("WORLD: Invalid quest ID."); return; } uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_UNIT) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = quest_giver; else return; if(quest_giver->isQuestGiver()) { bValid = true; status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id), false); } } else if(guidtype == HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(quest_giver->isQuestGiver()) { bValid = true; status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id), false); } } else if(guidtype == HIGHGUID_TYPE_ITEM) { Item* quest_giver = GetPlayer()->GetItemInterface()->GetItemByGUID(guid); //------cebernic: added it for script engine if(!quest_giver) return; ItemPrototype* itemProto = quest_giver->GetProto(); if(itemProto->Bonding != ITEM_BIND_ON_USE || quest_giver->IsSoulbound()) // SoulBind item will be used after SoulBind() { if(sScriptMgr.CallScriptedItem(quest_giver, GetPlayer())) return; } if(itemProto->Bonding == ITEM_BIND_ON_USE) quest_giver->SoulBind(); //--------------------------------------------- if(quest_giver) qst_giver = quest_giver; else return; bValid = true; status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, 1, false); } if(!qst_giver) { LOG_DEBUG("WORLD: Invalid questgiver GUID."); return; } if(!bValid) { LOG_DEBUG("WORLD: object is not a questgiver."); return; } if((status == QMGR_QUEST_AVAILABLE) || (status == QMGR_QUEST_REPEATABLE) || (status == QMGR_QUEST_CHAT)) { sQuestMgr.BuildQuestDetails(&data, qst, qst_giver, 1, language, _player); // 0 because we want goodbye to function SendPacket(&data); LOG_DEBUG("WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS."); if(qst->HasFlag(QUEST_FLAGS_AUTO_ACCEPT)) _player->AcceptQuest(qst_giver->GetGUID(), qst->id); } else if(status == QMGR_QUEST_NOT_FINISHED || status == QMGR_QUEST_FINISHED) { sQuestMgr.BuildRequestItems(&data, qst, qst_giver, status, language); SendPacket(&data); LOG_DEBUG("WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS."); } }