void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket) { sLog.outDebug( "WORLD: Recieved CMSG_QUESTGIVER_CHOOSE_REWARD." ); WorldPacket data; uint64 guid; uint32 quest_id; uint32 reward_slot; recvPacket >> guid; recvPacket >> quest_id; recvPacket >> reward_slot; bool bValid = false; Quest *qst = NULL; Object *qst_giver = NULL; if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_UNIT) { Creature *quest_giver = sObjHolder.GetObject<Creature>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = sQuestMgr.FindQuest(quest_id); } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_GAMEOBJECT) { GameObject *quest_giver = sObjHolder.GetObject<GameObject>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = sQuestMgr.FindQuest(quest_id); } if (!qst_giver) { sLog.outDebug("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { sLog.outDebug("WORLD: Creature is not a questgiver."); return; } //FIXME: Some Quest givers talk in the end of the quest. // qst_giver->SendChatMessage(CHAT_MSG_MONSTER_SAY,LANG_UNIVERSAL,qst->GetQuestEndMessage().c_str()); QuestLogEntry *qle = _player->GetQuestLogForEntry(quest_id); if (!qle) { sLog.outDebug("WORLD: QuestLogEntry not found."); return; } if (!qle->CanBeFinished()) { sLog.outDebug("WORLD: Quest not finished."); return; } // remove icon if(qst_giver->GetTypeId() == TYPEID_UNIT) { qst_giver->BuildFieldUpdatePacket(GetPlayer(), UNIT_DYNAMIC_FLAGS, qst_giver->GetUInt32Value(UNIT_DYNAMIC_FLAGS)); } //check for room in inventory for all items sQuestMgr.OnQuestFinished(GetPlayer(), qst, qst_giver, reward_slot); //if(qst_giver->GetTypeId() == TYPEID_UNIT) qst->LUA_SendEvent(((Creature*)qst_giver),GetPlayer(),ON_QUEST_COMPLETEQUEST); if(qst->next_quest_id) { data.Initialize(CMSG_QUESTGIVER_QUERY_QUEST); data << guid; data << qst->next_quest_id; HandleQuestGiverQueryQuestOpcode(data); } if(qst->time > 0) { GetPlayer()->timed_quest_slot = 0; } }
void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket) { CHECK_INWORLD_RETURN; DEBUG_LOG( "WORLD"," Received CMSG_QUESTGIVER_CHOOSE_REWARD." ); uint64 guid; uint32 quest_id; uint32 reward_slot; recvPacket >> guid; recvPacket >> quest_id; recvPacket >> reward_slot; if( reward_slot >= 6 ) return; bool bValid = false; Quest *qst = NULL; Object* qst_giver = NULLOBJ; uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_CREATURE) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = QuestStorage.LookupEntry(quest_id); } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; //bValid = quest_giver->isQuestGiver(); //if(bValid) bValid = true; qst = QuestStorage.LookupEntry(quest_id); } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { OUT_DEBUG("WORLD: Creature is not a questgiver."); return; } //FIXME: Some Quest givers talk in the end of the quest. // qst_giver->SendChatMessage(CHAT_MSG_MONSTER_SAY,LANG_UNIVERSAL,qst->GetQuestEndMessage().c_str()); QuestLogEntry *qle = _player->GetQuestLogForEntry(quest_id); if (!qle && !qst->is_repeatable) { OUT_DEBUG("WORLD: QuestLogEntry not found."); return; } if (qle && !qle->CanBeFinished()) { OUT_DEBUG("WORLD: Quest not finished."); return; } //check for room in inventory for all items if(!sQuestMgr.CanStoreReward(_player,qst,reward_slot)) { sQuestMgr.SendQuestFailed(FAILED_REASON_INV_FULL, qst, _player); return; } sQuestMgr.OnQuestFinished(_player, qst, qst_giver, reward_slot); //if(qst_giver->GetTypeId() == TYPEID_UNIT) qst->LUA_SendEvent(TO_CREATURE( qst_giver ),GetPlayer(),ON_QUEST_COMPLETEQUEST); if(qst->next_quest_id) { WorldPacket data(12); data.Initialize(CMSG_QUESTGIVER_QUERY_QUEST); data << guid; data << qst->next_quest_id; HandleQuestGiverQueryQuestOpcode(data); } _player->SaveToDB(false); }
void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket) { if(!_player) return; if(!_player->IsInWorld()) return; sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD." ); uint64 guid; uint32 quest_id; uint32 reward_slot; recvPacket >> guid; recvPacket >> quest_id; recvPacket >> reward_slot; if( reward_slot >= 6 ) return; bool bValid = false; Quest *qst = NULL; Object *qst_giver = NULL; 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 = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = QuestStorage.LookupEntry(quest_id); } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject *quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = (Object*)quest_giver; else return; //bValid = quest_giver->isQuestGiver(); //if(bValid) bValid = true; qst = QuestStorage.LookupEntry(quest_id); } if (!qst_giver) { sLog.outDebug("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { sLog.outDebug("WORLD: Creature is not a questgiver."); return; } //FIXME: Some Quest givers talk in the end of the quest. // qst_giver->SendChatMessage(CHAT_MSG_MONSTER_SAY,LANG_UNIVERSAL,qst->GetQuestEndMessage().c_str()); QuestLogEntry *qle = _player->GetQuestLogForEntry(quest_id); if (!qle && !qst->is_repeatable) { sLog.outDebug("WORLD: QuestLogEntry not found."); return; } if (qle && !qle->CanBeFinished()) { sLog.outDebug("WORLD: Quest not finished."); return; } // remove icon /*if(qst_giver->GetTypeId() == TYPEID_UNIT) { qst_giver->BuildFieldUpdatePacket(GetPlayer(), UNIT_DYNAMIC_FLAGS, qst_giver->GetUInt32Value(UNIT_DYNAMIC_FLAGS)); }*/ //check for room in inventory for all items if(!sQuestMgr.CanStoreReward(GetPlayer(),qst,reward_slot)) { sQuestMgr.SendQuestFailed(FAILED_REASON_INV_FULL, qst, GetPlayer()); return; } sQuestMgr.OnQuestFinished(GetPlayer(), qst, qst_giver, reward_slot); //if(qst_giver->GetTypeId() == TYPEID_UNIT) qst->LUA_SendEvent(static_cast< Creature* >( qst_giver ),GetPlayer(),ON_QUEST_COMPLETEQUEST); if(qst->next_quest_id) { WorldPacket data(12); data.Initialize(CMSG_QUESTGIVER_QUERY_QUEST); data << guid; data << qst->next_quest_id; HandleQuestGiverQueryQuestOpcode(data); } if(qst->time > 0) { GetPlayer()->timed_quest_slot = 0; } }