71 _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid);
86 SF_LOG_DEBUG(
"network",
"WORLD: HandleQuestgiverHelloOpcode - Unit (GUID: %u) not found or you can't interact with him.",
97 _player->PlayerTalkClass->ClearMenus();
102 _player->SendPreparedGossip(creature);
122#define CLOSE_GOSSIP_CLEAR_DIVIDER() \
124 _player->PlayerTalkClass->SendCloseGossip(); \
125 _player->SetDivider(0); \
137 if ((
_player->GetDivider() &&
_player->GetDivider() != guid) || !playerQuestObject->CanShareQuest(questId))
153 if (!
_player->CanInteractWithQuestGiver(
object))
159 if (!
GetPlayer()->CanTakeQuest(quest,
true))
165 if (
_player->GetDivider() != 0)
175 if (
_player->CanAddQuest(quest,
true))
177 _player->AddQuest(quest,
object);
186 Player* player = itr->GetSource();
188 if (!player || player ==
_player)
198 _player->SendQuestConfirmAccept(quest, player);
204 if (
_player->CanCompleteQuest(questId))
205 _player->CompleteQuest(questId);
210 object->ToCreature()->AI()->sQuestAccept(
_player, quest);
218 bool destroyItem =
true;
223 for (QuestObjectiveSet::const_iterator citr = quest->m_questObjectives.begin(); citr != quest->m_questObjectives.end(); ++citr)
238 object->ToGameObject()->AI()->QuestAccept(
_player, quest);
243 _player->PlayerTalkClass->SendCloseGossip();
245 if (quest->GetSrcSpell() > 0)
252 _player->PlayerTalkClass->SendCloseGossip();
254#undef CLOSE_GOSSIP_CLEAR_DIVIDER
288 _player->PlayerTalkClass->SendCloseGossip();
297 if (!
_player->CanTakeQuest(quest,
true))
300 if (quest->IsAutoAccept() &&
_player->CanAddQuest(quest,
true))
302 _player->AddQuest(quest,
object);
303 if (
_player->CanCompleteQuest(questId))
304 _player->CompleteQuest(questId);
308 _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, object->
GetGUID(),
_player->CanCompleteQuest(quest->GetQuestId()),
true);
310 _player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, object->
GetGUID(),
true);
327 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_QUERY quest = %u", questId);
330 _player->PlayerTalkClass->SendQuestQueryResponse(quest);
344 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_GIVER_CHOOSE_REWARD npc = %u, quest = %u, reward = %u",
uint32(
GUID_LOPART(guid)), questId, reward);
356 SF_LOG_ERROR(
"network",
"Error in CMSG_QUEST_GIVER_CHOOSE_REWARD: player %s (guid %d) tried to get invalid reward (%u) (possible packet-hacking detected)",
_player->GetName().c_str(),
_player->GetGUIDLow(), reward);
369 if (!
_player->CanInteractWithQuestGiver(
object))
376 SF_LOG_ERROR(
"network",
"Error in QUEST_STATUS_COMPLETE: player %s (guid %u) tried to complete quest %u, but is not allowed to do so (possible packet-hacking or high latency)",
380 if (
_player->CanRewardQuest(quest, reward,
true))
382 _player->RewardQuest(quest, reward,
object);
392 if (
Quest const* nextQuest =
_player->GetNextQuest(guid, quest))
395 if (
_player->CanTakeQuest(nextQuest,
false))
397 if (nextQuest->IsAutoAccept() &&
_player->CanAddQuest(nextQuest,
true))
398 _player->AddQuest(nextQuest,
object);
400 _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid,
true);
414 if (
Quest const* nextQuest =
_player->GetNextQuest(guid, quest))
417 if (
_player->CanTakeQuest(nextQuest,
false))
419 if (nextQuest->IsAutoAccept() &&
_player->CanAddQuest(nextQuest,
true))
420 _player->AddQuest(nextQuest,
object);
422 _player->PlayerTalkClass->SendQuestGiverQuestDetails(nextQuest, guid,
true);
435 _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid,
true);
454 if (!
_player->CanInteractWithQuestGiver(
object))
457 if (
_player->CanCompleteQuest(questId))
458 _player->CompleteQuest(questId);
464 _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, guid,
true);
469 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_GIVER_CANCEL");
471 _player->PlayerTalkClass->SendCloseGossip();
477 recvData >> slot1 >> slot2;
482 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUESTLOG_SWAP_QUEST slot 1 = %u, slot 2 = %u", slot1, slot2);
492 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUESTLOG_REMOVE_QUEST slot = %u", slot);
498 if (!
_player->TakeQuestSourceItem(questId,
true))
504 _player->RemoveTimedQuest(questId);
513 _player->TakeQuestSourceItem(questId,
true);
514 _player->RemoveActiveQuest(questId);
517 SF_LOG_INFO(
"network",
"Player %u abandoned quest %u",
_player->GetGUIDLow(), questId);
520 _player->SetQuestSlot(slot, 0);
531 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_CONFIRM_ACCEPT questId = %u", questId);
543 if (!
_player->IsInSameRaidWith(originalPlayer))
549 if (!
_player->CanTakeQuest(quest,
true))
552 if (
_player->CanAddQuest(quest,
true))
553 _player->AddQuest(quest, NULL);
563 bool autoCompleteMode;
568 autoCompleteMode = recvData.
ReadBit();
583 if (autoCompleteMode == 0)
586 if (!
_player->CanInteractWithQuestGiver(
object))
592 SF_LOG_ERROR(
"network",
"Possible hacking attempt: Player %s [guid: %u] tried to complete quest [entry: %u] without being in possession of the quest!",
598 bg->HandleQuestComplete(questId,
_player);
603 _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, playerGuid,
_player->CanCompleteRepeatableQuest(quest),
false);
605 _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, playerGuid,
_player->CanRewardQuest(quest,
false),
false);
610 _player->PlayerTalkClass->SendQuestGiverRequestItems(quest, playerGuid,
_player->CanRewardQuest(quest,
false),
false);
612 _player->PlayerTalkClass->SendQuestGiverOfferReward(quest, playerGuid,
true);
621 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_GIVER_QUEST_AUTOLAUNCH");
627 recvPacket >> questId;
629 if (!
_player->CanShareQuest(questId))
632 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_PUSHQUESTTOPARTY questId = %u", questId);
646 Player* receiver = itr->GetSource();
648 if (!receiver || receiver == sender)
708 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_PUSH_RESULT");
712 if (
_player->GetDivider() == guid)
714 player->SendPushToPartyResponse(
_player, msg);
722 uint32 result = defstatus;
747 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
750 uint32 quest_id = i->second;
756 if (!
sConditionMgr->IsObjectMeetToConditions(player, conditions))
771 if (result2 > result)
775 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
778 uint32 quest_id = i->second;
784 if (!
sConditionMgr->IsObjectMeetToConditions(player, conditions))
811 if (result2 > result)
823 SF_LOG_DEBUG(
"network",
"WORLD: Received CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY");
841 for (Player::ClientGUIDs::const_iterator itr =
_player->m_clientGUIDs.begin(); itr !=
_player->m_clientGUIDs.end(); ++itr)
874 byteData <<
uint32(questStatus);
908 byteData <<
uint32(questStatus);
926 size_t rew_count =
_player->GetRewardedQuestCount();
929 data <<
uint32(rew_count);
932 for (RewardedQuestSet::const_iterator itr = rewQuests.begin(); itr != rewQuests.end(); ++itr)
@ CONDITION_SOURCE_TYPE_QUEST_ACCEPT
std::list< Condition * > ConditionList
@ ACHIEVEMENT_TIMED_TYPE_QUEST
@ ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED
#define SF_LOG_DEBUG(filterType__,...)
#define SF_LOG_ERROR(filterType__,...)
#define SF_LOG_INFO(filterType__,...)
TypeID GuidHigh2TypeId(uint32 guid_hi)
uint32 GUID_LOPART(uint64 x)
bool IS_GAMEOBJECT_GUID(uint64 guid)
bool IS_CRE_OR_VEH_OR_PET_GUID(uint64 guid)
uint32 GUID_HIPART(uint64 guid)
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
std::set< uint32 > RewardedQuestSet
@ QUEST_PARTY_MSG_FINISH_QUEST
@ QUEST_PARTY_MSG_CANT_TAKE_QUEST
@ QUEST_PARTY_MSG_ACCEPT_QUEST
@ QUEST_PARTY_MSG_HAVE_QUEST
@ QUEST_PARTY_MSG_SHARING_QUEST
@ QUEST_PARTY_MSG_LOG_FULL
@ QUEST_OBJECTIVE_TYPE_ITEM
@ QUEST_FLAGS_AUTOCOMPLETE
@ QUEST_FLAGS_PLAYER_CAST_ACCEPT
@ QUEST_FLAGS_START_EVENT_MUST_COMPLETE
#define MAX_QUEST_LOG_SIZE
@ QUEST_STATUS_INCOMPLETE
@ DIALOG_STATUS_UNAVAILABLE
@ DIALOG_STATUS_AVAILABLE
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE
@ DIALOG_STATUS_REWARD_REP
@ DIALOG_STATUS_INCOMPLETE
@ DIALOG_STATUS_AVAILABLE_REP
@ QUEST_SPECIAL_FLAGS_TIMED
#define CLOSE_GOSSIP_CLEAR_DIVIDER()
@ GAMEOBJECT_TYPE_QUESTGIVER
@ UNIT_NPC_FLAG_QUESTGIVER
bool WriteBit(uint32 bit)
size_t bitwpos() const
Returns position of last written bit.
void ReadGuidBytes(ObjectGuid &guid, Offsets... offsets)
void ReadByteSeq(uint8 &b)
void PutBits(size_t pos, T value, uint32 bitCount)
void ReadGuidMask(ObjectGuid &guid, Offsets... offsets)
void WriteBits(T value, size_t bits)
void WriteByteSeq(uint8 b)
CreatureTemplate const * GetCreatureTemplate() const
virtual bool QuestReward(Player *, Quest const *, uint32)
GameObjectAI * AI() const
GameobjectTypes GetGoType() const
GroupReference * GetFirstMember()
ItemTemplate const * GetTemplate() const
GameObject * GetGameObject(uint64 guid)
static Creature * GetCreatureOrPetOrVehicle(WorldObject const &, uint64)
static Object * GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask)
static Player * FindPlayerInOrOutOfWorld(uint64)
static Player * FindPlayer(uint64)
virtual bool hasQuest(uint32) const
GameObject * ToGameObject()
bool HasFlag(uint16 index, uint32 flag) const
virtual bool hasInvolvedQuest(uint32) const
int32 GetQuestLevel(Quest const *quest) const
void SetDivider(uint64 guid)
bool GetQuestRewardStatus(uint32 quest_id) const
bool CanTakeQuest(Quest const *quest, bool msg)
bool CanCompleteQuest(uint32 quest_id)
void AddQuest(Quest const *quest, Object *questGiver)
bool CanAddQuest(Quest const *quest, bool msg)
void CompleteQuest(uint32 quest_id)
bool CanSeeStartQuest(Quest const *quest)
void SwapQuestSlot(uint16 slot1, uint16 slot2)
bool SatisfyQuestStatus(Quest const *qInfo, bool msg)
bool CanShareQuest(uint32 questId) const
uint64 GetDivider() const
Creature * GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
bool SatisfyQuestLog(bool msg)
void SendPushToPartyResponse(Player *player, uint8 msg)
QuestStatus GetQuestStatus(uint32 quest_id) const
bool CanCompleteRepeatableQuest(Quest const *quest)
bool SatisfyQuestLevel(Quest const *qInfo, bool msg)
bool IsQuestRewarded(uint32 quest_id) const
PlayerMenu * PlayerTalkClass
bool HasFlag(uint32 flag) const
uint8 GetQuestObjectiveCountType(uint8 type) const
bool IsRewChoiceItemValid(uint32 itemId) const
bool IsRepeatable() const
bool IsAutoComplete() const
uint32 GetQuestId() const
bool IsAutoAccept() const
bool IsDailyOrWeekly() const
uint32 GetRewardPackageItemId() const
virtual bool OnGossipHello(Player *player)
virtual void sQuestReward(Player *, Quest const *, uint32)
void StopMoving()
-------—End of Pet responses methods-------—
void RemoveAurasByType(AuraType auraType, uint64 casterGUID=0, Aura *except=NULL, bool negative=true, bool positive=true)
bool IsHostileTo(Unit const *unit) const
void HandleQueryQuestsCompleted(WorldPacket &recvData)
bool isLogingOut() const
Is the user engaged in a log out process?
void HandleQuestConfirmAccept(WorldPacket &recvData)
void HandleQuestLogRemoveQuest(WorldPacket &recvData)
void SendQuestgiverStatusMultiple()
void HandleQuestgiverQuestAutoLaunch(WorldPacket &recvPacket)
void HandleQuestQueryOpcode(WorldPacket &recvPacket)
void HandleQuestgiverAcceptQuestOpcode(WorldPacket &recvPacket)
Player * GetPlayer() const
void HandleQuestgiverStatusQueryOpcode(WorldPacket &recvPacket)
void HandleQuestgiverCompleteQuest(WorldPacket &recvData)
void HandleQuestgiverHelloOpcode(WorldPacket &recvPacket)
void HandleQuestgiverRequestRewardOpcode(WorldPacket &recvPacket)
uint32 getDialogStatus(Player *player, Object *questgiver, uint32 defstatus)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void HandleQuestLogSwapQuest(WorldPacket &recvData)
void HandleQuestPushResult(WorldPacket &recvPacket)
void HandleQuestgiverQueryQuestOpcode(WorldPacket &recvPacket)
void HandleQuestgiverChooseRewardOpcode(WorldPacket &recvPacket)
void HandlePushQuestToParty(WorldPacket &recvPacket)
void HandleQuestgiverCancel(WorldPacket &recvData)
void HandleQuestgiverStatusMultipleQuery(WorldPacket &recvPacket)
@ SMSG_QUEST_GIVER_STATUS_MULTIPLE
@ SMSG_QUERY_QUESTS_COMPLETED_RESPONSE
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF