AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
PlayerMenu Class Reference

#include "GossipDef.h"

Public Member Functions

GossipMenuGetGossipMenu ()
 
QuestMenuGetQuestMenu ()
 
bool Empty () const
 
uint32 GetGossipOptionSender (uint32 selection) const
 
uint32 GetGossipOptionAction (uint32 selection) const
 
bool IsGossipOptionCoded (uint32 selection) const
 
AddMenuItem

Adds a localized gossip menu item from db by menu id and menu item id.

Parameters
menuIdGossip menu id.
menuItemIdGossip menu item id.
senderIdentifier of the current menu.
actionCustom action given to OnGossipHello.
boxMoneyCustom price for pop-up box. If > 0, it will replace DB value.
 PlayerMenu (WorldSession *session)
 
 ~PlayerMenu ()
 
void ClearMenus ()
 
void SendGossipMenu (uint32 titleTextId, ObjectGuid objectGUID)
 
void SendCloseGossip ()
 
void SendPointOfInterest (uint32 poiId) const
 
void SendQuestGiverStatus (uint8 questStatus, ObjectGuid npcGUID) const
 
void SendQuestGiverQuestList (QEmote const &eEmote, std::string const &Title, ObjectGuid guid)
 
void SendQuestQueryResponse (Quest const *quest) const
 
void SendQuestGiverQuestDetails (Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
 
void SendQuestGiverOfferReward (Quest const *quest, ObjectGuid npcGUID, bool enableNext) const
 
void SendQuestGiverRequestItems (Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
 

Private Attributes

GossipMenu _gossipMenu
 
QuestMenu _questMenu
 
WorldSession_session
 

Detailed Description

Constructor & Destructor Documentation

◆ PlayerMenu()

PlayerMenu::PlayerMenu ( WorldSession session)
explicit
176 : _session(session)
177{
179}
void SetLocale(LocaleConstant locale)
Definition: GossipDef.h:172
GossipMenu _gossipMenu
Definition: GossipDef.h:291
WorldSession * _session
Definition: GossipDef.h:293
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:497

References _gossipMenu, WorldSession::GetSessionDbLocaleIndex(), and GossipMenu::SetLocale().

◆ ~PlayerMenu()

PlayerMenu::~PlayerMenu ( )
182{
183 ClearMenus();
184}
void ClearMenus()
Definition: GossipDef.cpp:186

References ClearMenus().

Member Function Documentation

◆ ClearMenus()

void PlayerMenu::ClearMenus ( )
187{
190}
void ClearMenu()
Definition: GossipDef.cpp:170
void ClearMenu()
Definition: GossipDef.cpp:311
QuestMenu _questMenu
Definition: GossipDef.h:292

References _gossipMenu, _questMenu, GossipMenu::ClearMenu(), and QuestMenu::ClearMenu().

Referenced by ClearGossipMenuFor(), Player::PrepareGossipMenu(), and ~PlayerMenu().

◆ Empty()

bool PlayerMenu::Empty ( ) const
inline
266{ return _gossipMenu.Empty() && _questMenu.Empty(); }
bool Empty() const
Definition: GossipDef.h:182
bool Empty() const
Definition: GossipDef.h:241

References _gossipMenu, _questMenu, GossipMenu::Empty(), and QuestMenu::Empty().

◆ GetGossipMenu()

◆ GetGossipOptionAction()

◆ GetGossipOptionSender()

uint32 PlayerMenu::GetGossipOptionSender ( uint32  selection) const
inline
269{ return _gossipMenu.GetMenuItemSender(selection); }
uint32 GetMenuItemSender(uint32 menuItemId) const
Definition: GossipDef.cpp:143

References _gossipMenu, and GossipMenu::GetMenuItemSender().

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ GetQuestMenu()

◆ IsGossipOptionCoded()

bool PlayerMenu::IsGossipOptionCoded ( uint32  selection) const
inline
271{ return _gossipMenu.IsMenuItemCoded(selection); }
bool IsMenuItemCoded(uint32 menuItemId) const
Definition: GossipDef.cpp:161

References _gossipMenu, and GossipMenu::IsMenuItemCoded().

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ SendCloseGossip()

◆ SendGossipMenu()

void PlayerMenu::SendGossipMenu ( uint32  titleTextId,
ObjectGuid  objectGUID 
)
193{
194 _gossipMenu.SetSenderGUID(objectGUID);
195
197 data << objectGUID;
198 data << uint32(_gossipMenu.GetMenuId()); // new 2.4.0
199 data << uint32(titleTextId);
200 data << uint32(_gossipMenu.GetMenuItemCount()); // max count 0x10
201
202 for (GossipMenuItemContainer::const_iterator itr = _gossipMenu.GetMenuItems().begin(); itr != _gossipMenu.GetMenuItems().end(); ++itr)
203 {
204 GossipMenuItem const& item = itr->second;
205 data << uint32(itr->first);
206 data << uint8(item.MenuItemIcon);
207 data << uint8(item.IsCoded); // makes pop up box password
208 data << uint32(item.BoxMoney); // money required to open menu, 2.0.3
209 data << item.Message; // text for gossip item
210 data << item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
211 }
212
213 data << uint32(_questMenu.GetMenuItemCount()); // max count 0x20
214 uint32 count = 0;
215
216 for (uint32 iI = 0; iI < _questMenu.GetMenuItemCount(); ++iI)
217 {
218 ++count;
219 QuestMenuItem const& item = _questMenu.GetItem(iI);
220 uint32 questID = item.QuestId;
221 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
222 {
223 data << uint32(questID);
224 data << uint32(item.QuestIcon);
225 data << int32(quest->GetQuestLevel());
226 data << uint32(quest->GetFlags()); // 3.3.3 quest flags
227 data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 icon changes: blue question mark or yellow exclamation mark
228 std::string title = quest->GetTitle();
229
231 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questID))
232 ObjectMgr::GetLocaleString(localeData->Title, locale, title);
233 data << title;
234 }
235 }
236
237 _session->SendPacket(&data);
238}
std::int32_t int32
Definition: Define.h:104
std::uint8_t uint8
Definition: Define.h:110
std::uint32_t uint32
Definition: Define.h:108
#define sObjectMgr
Definition: ObjectMgr.h:1640
@ SMSG_GOSSIP_MESSAGE
Definition: Opcodes.h:411
Definition: GossipDef.h:131
std::string BoxMessage
Definition: GossipDef.h:137
uint32 BoxMoney
Definition: GossipDef.h:138
uint8 MenuItemIcon
Definition: GossipDef.h:132
bool IsCoded
Definition: GossipDef.h:133
std::string Message
Definition: GossipDef.h:134
Definition: GossipDef.h:154
uint32 QuestId
Definition: GossipDef.h:155
uint8 QuestIcon
Definition: GossipDef.h:156
uint32 GetMenuItemCount() const
Definition: GossipDef.h:177
uint32 GetMenuId() const
Definition: GossipDef.h:171
GossipMenuItemContainer const & GetMenuItems() const
Definition: GossipDef.h:211
QuestMenuItem const & GetItem(uint16 index) const
Definition: GossipDef.h:248
uint8 GetMenuItemCount() const
Definition: GossipDef.h:236
static std::string_view GetLocaleString(std::vector< std::string > const &data, size_t locale)
Definition: ObjectMgr.h:1416
Definition: QuestDef.h:180
Definition: QuestDef.h:207

References _gossipMenu, _questMenu, _session, GossipMenuItem::BoxMessage, GossipMenuItem::BoxMoney, QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), GossipMenu::GetMenuId(), GossipMenu::GetMenuItemCount(), QuestMenu::GetMenuItemCount(), GossipMenu::GetMenuItems(), WorldSession::GetSessionDbLocaleIndex(), GossipMenuItem::IsCoded, GossipMenuItem::MenuItemIcon, GossipMenuItem::Message, QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, WorldSession::SendPacket(), GossipMenu::SetSenderGUID(), SMSG_GOSSIP_MESSAGE, and sObjectMgr.

Referenced by SendGossipMenuFor(), and Player::SendPreparedGossip().

◆ SendPointOfInterest()

void PlayerMenu::SendPointOfInterest ( uint32  poiId) const
249{
250 PointOfInterest const* poi = sObjectMgr->GetPointOfInterest(poiId);
251 if (!poi)
252 {
253 LOG_ERROR("sql.sql", "Request to send non-existing POI (Id: {}), ignored.", poiId);
254 return;
255 }
256
257 std::string name = poi->Name;
259 if (PointOfInterestLocale const* localeData = sObjectMgr->GetPointOfInterestLocale(poiId))
260 ObjectMgr::GetLocaleString(localeData->Name, locale, name);
261
262 WorldPacket data(SMSG_GOSSIP_POI, 4 + 4 + 4 + 4 + 4 + 20); // guess size
263 data << uint32(poi->Flags);
264 data << float(poi->PositionX);
265 data << float(poi->PositionY);
266 data << uint32(poi->Icon);
267 data << uint32(poi->Importance);
268 data << name;
269
270 _session->SendPacket(&data);
271}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:159
@ SMSG_GOSSIP_POI
Definition: Opcodes.h:578
Definition: CreatureData.h:344
Definition: ObjectMgr.h:582
std::string Name
Definition: ObjectMgr.h:589
uint32 Flags
Definition: ObjectMgr.h:587
float PositionX
Definition: ObjectMgr.h:584
uint32 Importance
Definition: ObjectMgr.h:588
uint32 Icon
Definition: ObjectMgr.h:586
float PositionY
Definition: ObjectMgr.h:585

References _session, PointOfInterest::Flags, ObjectMgr::GetLocaleString(), WorldSession::GetSessionDbLocaleIndex(), PointOfInterest::Icon, PointOfInterest::Importance, LOG_ERROR, PointOfInterest::Name, PointOfInterest::PositionX, PointOfInterest::PositionY, WorldSession::SendPacket(), SMSG_GOSSIP_POI, and sObjectMgr.

Referenced by Player::OnGossipSelect().

◆ SendQuestGiverOfferReward()

void PlayerMenu::SendQuestGiverOfferReward ( Quest const *  quest,
ObjectGuid  npcGUID,
bool  enableNext 
) const
646{
647 std::string questTitle = quest->GetTitle();
648 std::string RewardText = quest->GetOfferRewardText();
649
651 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
652 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
653
654 if (QuestOfferRewardLocale const* questOfferRewardLocale = sObjectMgr->GetQuestOfferRewardLocale(quest->GetQuestId()))
655 ObjectMgr::GetLocaleString(questOfferRewardLocale->RewardText, locale, RewardText);
656
657 WorldPacket data(SMSG_QUESTGIVER_OFFER_REWARD, 400); // guess size
658 data << npcGUID;
659 data << uint32(quest->GetQuestId());
660 data << questTitle;
661 data << RewardText;
662
663 data << uint8(enableNext ? 1 : 0); // Auto Finish
664 data << uint32(quest->GetFlags()); // 3.3.3 questFlags
665 data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum
666
667 uint32 emoteCount = 0;
668 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
669 {
670 if (quest->OfferRewardEmote[i] <= 0)
671 break;
672 ++emoteCount;
673 }
674
675 data << emoteCount; // Emote Count
676 for (uint32 i = 0; i < emoteCount; ++i)
677 {
678 data << uint32(quest->OfferRewardEmoteDelay[i]); // Delay Emote
679 data << uint32(quest->OfferRewardEmote[i]);
680 }
681
682 data << uint32(quest->GetRewChoiceItemsCount());
683 for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
684 {
685 data << uint32(quest->RewardChoiceItemId[i]);
686 data << uint32(quest->RewardChoiceItemCount[i]);
687
688 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[i]))
689 data << uint32(itemTemplate->DisplayInfoID);
690 else
691 data << uint32(0);
692 }
693
694 data << uint32(quest->GetRewItemsCount());
695 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
696 {
697 data << uint32(quest->RewardItemId[i]);
698 data << uint32(quest->RewardItemIdCount[i]);
699
700 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardItemId[i]))
701 data << uint32(itemTemplate->DisplayInfoID);
702 else
703 data << uint32(0);
704 }
705
706 uint32 moneyRew = 0;
707 Player* player = _session->GetPlayer();
708 uint8 playerLevel = player ? player->GetLevel() : 0;
709 if (player && (player->GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player)))
710 {
711 moneyRew = quest->GetRewMoneyMaxLevel();
712 }
713 moneyRew += quest->GetRewOrReqMoney(player ? player->GetLevel() : 0); // reward money (below max lvl)
714 data << moneyRew;
715 uint32 questXp;
716 if (player && !sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player))
717 {
718 questXp = uint32(quest->XPValue(playerLevel) * player->GetQuestRate());
719 }
720 else
721 {
722 questXp = 0;
723 }
724 sScriptMgr->OnQuestComputeXP(player, quest, questXp);
725 data << questXp;
726
727 // rewarded honor points. Multiply with 10 to satisfy client
728 data << uint32(10 * quest->CalculateHonorGain(_session->GetPlayer()->GetQuestLevel(quest)));
729 data << float(0.0f); // unk, honor multiplier?
730 data << uint32(0x08); // unused by client?
731 data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast == 0)
732 data << int32(quest->GetRewSpellCast()); // casted spell
733 data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
734 data << uint32(quest->GetBonusTalents()); // bonus talents
735 data << uint32(quest->GetRewArenaPoints()); // arena points
736 data << uint32(0);
737
738 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
739 data << uint32(quest->RewardFactionId[i]);
740
741 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (zero based)?
742 data << int32(quest->RewardFactionValueId[i]);
743
744 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override?
745 data << uint32(quest->RewardFactionValueIdOverride[i]);
746
747 _session->SendPacket(&data);
748 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD {}, questid={}", npcGUID.ToString(), quest->GetQuestId());
749}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
#define QUEST_EMOTE_COUNT
Definition: QuestDef.h:42
#define QUEST_REPUTATIONS_COUNT
Definition: QuestDef.h:41
#define sScriptMgr
Definition: ScriptMgr.h:2702
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:234
@ SMSG_QUESTGIVER_OFFER_REWARD
Definition: Opcodes.h:427
#define sWorld
Definition: World.h:451
Definition: ItemTemplate.h:628
Definition: Player.h:1046
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.h:1391
float GetQuestRate(bool isDFQuest=false)
Definition: Player.cpp:16128
uint8 GetLevel() const
Definition: Unit.h:1420
Definition: QuestDef.h:199
Player * GetPlayer() const
Definition: WorldSession.h:361

References _session, Quest::CalculateHonorGain(), CONFIG_MAX_PLAYER_LEVEL, Quest::GetBonusTalents(), Quest::GetCharTitleId(), Quest::GetFlags(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Quest::GetOfferRewardText(), WorldSession::GetPlayer(), Quest::GetQuestId(), Player::GetQuestLevel(), Player::GetQuestRate(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetSuggestedPlayers(), Quest::GetTitle(), LOG_DEBUG, Quest::OfferRewardEmote, Quest::OfferRewardEmoteDelay, QUEST_EMOTE_COUNT, QUEST_REPUTATIONS_COUNT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, Quest::RewardItemId, Quest::RewardItemIdCount, WorldSession::SendPacket(), SMSG_QUESTGIVER_OFFER_REWARD, sObjectMgr, sScriptMgr, sWorld, ObjectGuid::ToString(), and Quest::XPValue().

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverRequestRewardOpcode(), and SendQuestGiverRequestItems().

◆ SendQuestGiverQuestDetails()

void PlayerMenu::SendQuestGiverQuestDetails ( Quest const *  quest,
ObjectGuid  npcGUID,
bool  activateAccept 
) const
386{
387 std::string questTitle = quest->GetTitle();
388 std::string questDetails = quest->GetDetails();
389 std::string questObjectives = quest->GetObjectives();
390 std::string questAreaDescription = quest->GetAreaDescription();
391
393 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
394 {
395 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
396 ObjectMgr::GetLocaleString(localeData->Details, locale, questDetails);
397 ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
398 ObjectMgr::GetLocaleString(localeData->AreaDescription, locale, questAreaDescription);
399 }
400
401 WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 500); // guess size
402 data << npcGUID;
403 data << _session->GetPlayer()->GetDivider();
404 data << uint32(quest->GetQuestId());
405 data << questTitle;
406 data << questDetails;
407 data << questObjectives;
408 data << uint8(activateAccept ? 1 : 0); // auto finish
409 data << uint32(quest->GetFlags()); // 3.3.3 questFlags
410 data << uint32(quest->GetSuggestedPlayers());
411 data << uint8(0); // IsFinished? value is sent back to server in quest accept packet
412
413 if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
414 {
415 data << uint32(0); // Rewarded chosen items hidden
416 data << uint32(0); // Rewarded items hidden
417 data << uint32(0); // Rewarded money hidden
418 data << uint32(0); // Rewarded XP hidden
419 }
420 else
421 {
422 data << uint32(quest->GetRewChoiceItemsCount());
423 for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
424 {
425 if (!quest->RewardChoiceItemId[i])
426 continue;
427
428 data << uint32(quest->RewardChoiceItemId[i]);
429 data << uint32(quest->RewardChoiceItemCount[i]);
430
431 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[i]))
432 data << uint32(itemTemplate->DisplayInfoID);
433 else
434 data << uint32(0x00);
435 }
436
437 data << uint32(quest->GetRewItemsCount());
438
439 for (uint32 i = 0; i < QUEST_REWARDS_COUNT; ++i)
440 {
441 if (!quest->RewardItemId[i])
442 continue;
443
444 data << uint32(quest->RewardItemId[i]);
445 data << uint32(quest->RewardItemIdCount[i]);
446
447 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardItemId[i]))
448 data << uint32(itemTemplate->DisplayInfoID);
449 else
450 data << uint32(0);
451 }
452
453 uint32 moneyRew = 0;
454 Player* player = _session->GetPlayer();
455 uint8 playerLevel = player ? player->GetLevel() : 0;
456 if (player && (player->getLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player)))
457 {
458 moneyRew = quest->GetRewMoneyMaxLevel();
459 }
460 moneyRew += quest->GetRewOrReqMoney(player ? player->GetLevel() : 0); // reward money (below max lvl)
461 data << moneyRew;
462 uint32 questXp;
463 if (player && !sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player))
464 {
465 questXp = uint32(quest->XPValue(playerLevel) * player->GetQuestRate());
466 }
467 else
468 {
469 questXp = 0;
470 }
471 sScriptMgr->OnQuestComputeXP(player, quest, questXp);
472 data << questXp;
473 }
474
475 // rewarded honor points. Multiply with 10 to satisfy client
476 data << uint32(10 * quest->CalculateHonorGain(_session->GetPlayer()->GetQuestLevel(quest)));
477 data << float(0.0f); // unk, honor multiplier?
478 data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast == 0)
479 data << int32(quest->GetRewSpellCast()); // casted spell
480 data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
481 data << uint32(quest->GetBonusTalents()); // bonus talents
482 data << uint32(quest->GetRewArenaPoints()); // reward arena points
483 data << uint32(0); // unk
484
485 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
486 data << uint32(quest->RewardFactionId[i]);
487
488 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
489 data << int32(quest->RewardFactionValueId[i]);
490
491 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
492 data << int32(quest->RewardFactionValueIdOverride[i]);
493
494 data << uint32(QUEST_EMOTE_COUNT);
495 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
496 {
497 data << uint32(quest->DetailsEmote[i]);
498 data << uint32(quest->DetailsEmoteDelay[i]); // DetailsEmoteDelay (in ms)
499 }
500 _session->SendPacket(&data);
501
502 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS {}, questid={}", npcGUID.ToString(), quest->GetQuestId());
503}
#define QUEST_REWARDS_COUNT
Definition: QuestDef.h:39
@ QUEST_FLAGS_HIDDEN_REWARDS
Definition: QuestDef.h:141
#define QUEST_REWARD_CHOICES_COUNT
Definition: QuestDef.h:38
@ SMSG_QUESTGIVER_QUEST_DETAILS
Definition: Opcodes.h:422
ObjectGuid GetDivider()
Definition: Player.h:1513
uint8 getLevel() const
Definition: Unit.h:1419

References _session, Quest::CalculateHonorGain(), CONFIG_MAX_PLAYER_LEVEL, Quest::DetailsEmote, Quest::DetailsEmoteDelay, Quest::GetAreaDescription(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Quest::GetDetails(), Player::GetDivider(), Quest::GetFlags(), Unit::getLevel(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Quest::GetObjectives(), WorldSession::GetPlayer(), Quest::GetQuestId(), Player::GetQuestLevel(), Player::GetQuestRate(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetSuggestedPlayers(), Quest::GetTitle(), Quest::HasFlag(), LOG_DEBUG, QUEST_EMOTE_COUNT, QUEST_FLAGS_HIDDEN_REWARDS, QUEST_REPUTATIONS_COUNT, QUEST_REWARD_CHOICES_COUNT, QUEST_REWARDS_COUNT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, Quest::RewardItemId, Quest::RewardItemIdCount, WorldSession::SendPacket(), SMSG_QUESTGIVER_QUEST_DETAILS, sObjectMgr, sScriptMgr, sWorld, ObjectGuid::ToString(), and Quest::XPValue().

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), SmartScript::ProcessAction(), and Player::SendPreparedQuest().

◆ SendQuestGiverQuestList()

void PlayerMenu::SendQuestGiverQuestList ( QEmote const &  eEmote,
std::string const &  Title,
ObjectGuid  guid 
)
317{
318 WorldPacket data(SMSG_QUESTGIVER_QUEST_LIST, 100); // guess size
319 data << guid;
320
321 if (QuestGreeting const* questGreeting = sObjectMgr->GetQuestGreeting(guid.GetTypeId(), guid.GetEntry()))
322 {
323 std::string strGreeting = questGreeting->Text;
324
326 if (localeConstant != LOCALE_enUS)
327 if (QuestGreetingLocale const* questGreetingLocale = sObjectMgr->GetQuestGreetingLocale(guid.GetTypeId(), guid.GetEntry()))
328 ObjectMgr::GetLocaleString(questGreetingLocale->Greeting, localeConstant, strGreeting);
329
330 data << strGreeting;
331 data << uint32(questGreeting->EmoteDelay);
332 data << uint32(questGreeting->EmoteType);
333 }
334 else
335 {
336 data << Title;
337 data << uint32(eEmote._Delay); // player emote
338 data << uint32(eEmote._Emote); // NPC emote
339 }
340
341 size_t count_pos = data.wpos();
342 data << uint8(0);
343 uint32 count = 0;
344
345 for (uint32 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
346 {
347 QuestMenuItem const& questMenuItem = _questMenu.GetItem(i);
348
349 uint32 questID = questMenuItem.QuestId;
350
351 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
352 {
353 ++count;
354 std::string title = quest->GetTitle();
355
357 if (localeConstant != LOCALE_enUS)
358 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(questID))
359 ObjectMgr::GetLocaleString(questTemplateLocale->Title, localeConstant, title);
360
361 data << uint32(questID);
362 data << uint32(questMenuItem.QuestIcon);
363 data << int32(quest->GetQuestLevel());
364 data << uint32(quest->GetFlags()); // 3.3.3 quest flags
365 data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 changes icon: blue question or yellow exclamation
366 data << title;
367 }
368 }
369
370 data.put<uint8>(count_pos, count);
371 _session->SendPacket(&data);
372 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_LIST (QuestGiver: {})", guid.ToString());
373}
LocaleConstant
Definition: Common.h:74
@ LOCALE_enUS
Definition: Common.h:75
@ SMSG_QUESTGIVER_QUEST_LIST
Definition: Opcodes.h:419
Definition: ObjectMgr.h:593
Definition: ObjectMgr.h:604

References QEmote::_Delay, QEmote::_Emote, _questMenu, _session, ObjectGuid::GetEntry(), QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), QuestMenu::GetMenuItemCount(), WorldSession::GetSessionDbLocaleIndex(), ObjectGuid::GetTypeId(), LOCALE_enUS, LOG_DEBUG, ByteBuffer::put(), QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, WorldSession::SendPacket(), SMSG_QUESTGIVER_QUEST_LIST, sObjectMgr, ObjectGuid::ToString(), and ByteBuffer::wpos().

Referenced by Player::SendPreparedQuest().

◆ SendQuestGiverRequestItems()

void PlayerMenu::SendQuestGiverRequestItems ( Quest const *  quest,
ObjectGuid  npcGUID,
bool  canComplete,
bool  closeOnCancel 
) const
752{
753 // We can always call to RequestItems, but this packet only goes out if there are actually
754 // items. Otherwise, we'll skip straight to the OfferReward
755
756 std::string questTitle = quest->GetTitle();
757 std::string requestItemsText = quest->GetRequestItemsText();
758
760 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
761 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
762
763 if (QuestRequestItemsLocale const* questRequestItemsLocale = sObjectMgr->GetQuestRequestItemsLocale(quest->GetQuestId()))
764 ObjectMgr::GetLocaleString(questRequestItemsLocale->CompletionText, locale, requestItemsText);
765
766 if (!quest->GetReqItemsCount() && canComplete)
767 {
768 SendQuestGiverOfferReward(quest, npcGUID, true);
769 return;
770 }
771
772 // Xinef: recheck completion on reward display
773 Player* _player = _session->GetPlayer();
774 QuestStatusMap::iterator qsitr = _player->getQuestStatusMap().find(quest->GetQuestId());
775 if (qsitr != _player->getQuestStatusMap().end() && qsitr->second.Status == QUEST_STATUS_INCOMPLETE)
776 {
777 for (uint8 i = 0; i < 6; ++i)
778 if (quest->RequiredItemId[i] && qsitr->second.ItemCount[i] < quest->RequiredItemCount[i])
779 if (_player->GetItemCount(quest->RequiredItemId[i], false) >= quest->RequiredItemCount[i])
780 qsitr->second.ItemCount[i] = quest->RequiredItemCount[i];
781
782 if (_player->CanCompleteQuest(quest->GetQuestId()))
783 {
784 _player->CompleteQuest(quest->GetQuestId());
785 canComplete = true;
786 }
787 }
788
789 WorldPacket data(SMSG_QUESTGIVER_REQUEST_ITEMS, 300); // guess size
790 data << npcGUID;
791 data << uint32(quest->GetQuestId());
792 data << questTitle;
793 data << requestItemsText;
794
795 data << uint32(0x00); // unknown
796
797 if (canComplete)
798 data << quest->GetCompleteEmote();
799 else
800 data << quest->GetIncompleteEmote();
801
802 // Close Window after cancel
803 if (closeOnCancel)
804 data << uint32(0x01);
805 else
806 data << uint32(0x00);
807
808 data << uint32(quest->GetFlags()); // 3.3.3 questFlags
809 data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum
810
811 // Required Money
812 data << uint32(quest->GetRewOrReqMoney() < 0 ? -quest->GetRewOrReqMoney() : 0);
813
814 data << uint32(quest->GetReqItemsCount());
815 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
816 {
817 if (!quest->RequiredItemId[i])
818 continue;
819
820 data << uint32(quest->RequiredItemId[i]);
821 data << uint32(quest->RequiredItemCount[i]);
822
823 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
824 data << uint32(itemTemplate->DisplayInfoID);
825 else
826 data << uint32(0);
827 }
828
829 if (!canComplete)
830 data << uint32(0x00);
831 else
832 data << uint32(0x03);
833
834 data << uint32(0x04);
835 data << uint32(0x08);
836 data << uint32(0x10);
837
838 _session->SendPacket(&data);
839 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS {}, questid={}", npcGUID.ToString(), quest->GetQuestId());
840}
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition: QuestDef.h:36
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:103
@ SMSG_QUESTGIVER_REQUEST_ITEMS
Definition: Opcodes.h:425
void SendQuestGiverOfferReward(Quest const *quest, ObjectGuid npcGUID, bool enableNext) const
Definition: GossipDef.cpp:645
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1585
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:358
void CompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:596
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition: PlayerQuest.cpp:287
Definition: QuestDef.h:194

References _session, Player::CanCompleteQuest(), Player::CompleteQuest(), Quest::GetCompleteEmote(), Quest::GetFlags(), Quest::GetIncompleteEmote(), Player::GetItemCount(), ObjectMgr::GetLocaleString(), WorldSession::GetPlayer(), Quest::GetQuestId(), Player::getQuestStatusMap(), Quest::GetReqItemsCount(), Quest::GetRequestItemsText(), Quest::GetRewOrReqMoney(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetSuggestedPlayers(), Quest::GetTitle(), LOG_DEBUG, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, WorldSession::SendPacket(), SendQuestGiverOfferReward(), SMSG_QUESTGIVER_REQUEST_ITEMS, sObjectMgr, and ObjectGuid::ToString().

Referenced by WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverQueryQuestOpcode(), npc_elder_clearwater::OnGossipHello(), and Player::SendPreparedQuest().

◆ SendQuestGiverStatus()

void PlayerMenu::SendQuestGiverStatus ( uint8  questStatus,
ObjectGuid  npcGUID 
) const
376{
378 data << npcGUID;
379 data << uint8(questStatus);
380
381 _session->SendPacket(&data);
382 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC {}, status={}", npcGUID.ToString(), questStatus);
383}
@ SMSG_QUESTGIVER_STATUS
Definition: Opcodes.h:417

References _session, LOG_DEBUG, WorldSession::SendPacket(), SMSG_QUESTGIVER_STATUS, and ObjectGuid::ToString().

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverStatusQueryOpcode().

◆ SendQuestQueryResponse()

void PlayerMenu::SendQuestQueryResponse ( Quest const *  quest) const
506{
507 std::string questTitle = quest->GetTitle();
508 std::string questDetails = quest->GetDetails();
509 std::string questObjectives = quest->GetObjectives();
510 std::string questAreaDescription = quest->GetAreaDescription();
511 std::string questCompletedText = quest->GetCompletedText();
512
513 std::string questObjectiveText[QUEST_OBJECTIVES_COUNT];
514 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
515 questObjectiveText[i] = quest->ObjectiveText[i];
516
518 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
519 {
520 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
521 ObjectMgr::GetLocaleString(localeData->Details, locale, questDetails);
522 ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
523 ObjectMgr::GetLocaleString(localeData->AreaDescription, locale, questAreaDescription);
524 ObjectMgr::GetLocaleString(localeData->CompletedText, locale, questCompletedText);
525
526 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
527 ObjectMgr::GetLocaleString(localeData->ObjectiveText[i], locale, questObjectiveText[i]);
528 }
529
530 WorldPacket data(SMSG_QUEST_QUERY_RESPONSE, 100); // guess size
531
532 data << uint32(quest->GetQuestId()); // quest id
533 data << uint32(quest->GetQuestMethod()); // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
534 data << uint32(quest->GetQuestLevel()); // may be -1, static data, in other cases must be used dynamic level: Player::GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client)
535 data << uint32(quest->GetMinLevel()); // min level
536 data << uint32(quest->GetZoneOrSort()); // zone or sort to display in quest log
537
538 data << uint32(quest->GetType()); // quest type
539 data << uint32(quest->GetSuggestedPlayers()); // suggested players count
540
541 data << uint32(quest->GetRepObjectiveFaction()); // shown in quest log as part of quest objective
542 data << uint32(quest->GetRepObjectiveValue()); // shown in quest log as part of quest objective
543
544 data << uint32(quest->GetRepObjectiveFaction2()); // shown in quest log as part of quest objective OPPOSITE faction
545 data << uint32(quest->GetRepObjectiveValue2()); // shown in quest log as part of quest objective OPPOSITE faction
546
547 data << uint32(quest->GetNextQuestInChain()); // client will request this quest from NPC, if not 0
548 data << uint32(quest->GetXPId()); // used for calculating rewarded experience
549
550 if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
551 data << uint32(0); // Hide money rewarded
552 else
553 {
554 uint32 moneyRew = 0;
555 Player* player = _session->GetPlayer();
556 if (player && (player->GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player)))
557 {
558 moneyRew = quest->GetRewMoneyMaxLevel();
559 }
560 moneyRew += quest->GetRewOrReqMoney(player ? player->GetLevel() : 0); // reward money (below max lvl)
561 data << moneyRew;
562 }
563
564 data << uint32(quest->GetRewMoneyMaxLevel()); // used in XP calculation at client
565 data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (cast if RewSpellCast == 0)
566 data << int32(quest->GetRewSpellCast()); // cast spell
567
568 // rewarded honor points
569 data << uint32(quest->GetRewHonorAddition());
570 data << float(quest->GetRewHonorMultiplier());
571 data << uint32(quest->GetSrcItemId()); // source item id
572 data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
573 data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
574 data << uint32(quest->GetPlayersSlain()); // players slain
575 data << uint32(quest->GetBonusTalents()); // bonus talents
576 data << uint32(quest->GetRewArenaPoints()); // bonus arena points
577 data << uint32(0); // review rep show mask
578
579 if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
580 {
581 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
582 data << uint32(0) << uint32(0);
583 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
584 data << uint32(0) << uint32(0);
585 }
586 else
587 {
588 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
589 {
590 data << uint32(quest->RewardItemId[i]);
591 data << uint32(quest->RewardItemIdCount[i]);
592 }
593 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
594 {
595 data << uint32(quest->RewardChoiceItemId[i]);
596 data << uint32(quest->RewardChoiceItemCount[i]);
597 }
598 }
599
600 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
601 data << uint32(quest->RewardFactionId[i]);
602
603 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid+1 QuestFactionReward.dbc?
604 data << int32(quest->RewardFactionValueId[i]);
605
606 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // unk (0)
607 data << int32(quest->RewardFactionValueIdOverride[i]);
608
609 data << uint32(quest->GetPOIContinent());
610 data << float(quest->GetPOIx());
611 data << float(quest->GetPOIy());
612 data << uint32(quest->GetPointOpt());
613
614 data << questTitle;
615 data << questObjectives;
616 data << questDetails;
617 data << questAreaDescription;
618 data << questCompletedText; // display in quest objectives window once all objectives are completed
619
620 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
621 {
622 if (quest->RequiredNpcOrGo[i] < 0)
623 data << uint32((quest->RequiredNpcOrGo[i] * (-1)) | 0x80000000); // client expects gameobject template id in form (id|0x80000000)
624 else
625 data << uint32(quest->RequiredNpcOrGo[i]);
626
627 data << uint32(quest->RequiredNpcOrGoCount[i]);
628 data << uint32(quest->ItemDrop[i]);
629 data << uint32(0); // req source count?
630 }
631
632 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
633 {
634 data << uint32(quest->RequiredItemId[i]);
635 data << uint32(quest->RequiredItemCount[i]);
636 }
637
638 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
639 data << questObjectiveText[i];
640
641 _session->SendPacket(&data);
642 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid={}", quest->GetQuestId());
643}
#define QUEST_OBJECTIVES_COUNT
Definition: QuestDef.h:35
@ SMSG_QUEST_QUERY_RESPONSE
Definition: Opcodes.h:123

References _session, CONFIG_MAX_PLAYER_LEVEL, Quest::GetAreaDescription(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Quest::GetCompletedText(), Quest::GetDetails(), Quest::GetFlags(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Quest::GetMinLevel(), Quest::GetNextQuestInChain(), Quest::GetObjectives(), WorldSession::GetPlayer(), Quest::GetPlayersSlain(), Quest::GetPOIContinent(), Quest::GetPointOpt(), Quest::GetPOIx(), Quest::GetPOIy(), Quest::GetQuestId(), Quest::GetQuestLevel(), Quest::GetQuestMethod(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue(), Quest::GetRepObjectiveValue2(), Quest::GetRewArenaPoints(), Quest::GetRewHonorAddition(), Quest::GetRewHonorMultiplier(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetSrcItemId(), Quest::GetSuggestedPlayers(), Quest::GetTitle(), Quest::GetType(), Quest::GetXPId(), Quest::GetZoneOrSort(), Quest::HasFlag(), Quest::ItemDrop, LOG_DEBUG, Quest::ObjectiveText, QUEST_FLAGS_HIDDEN_REWARDS, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_REPUTATIONS_COUNT, QUEST_REWARD_CHOICES_COUNT, QUEST_REWARDS_COUNT, Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, Quest::RewardItemId, Quest::RewardItemIdCount, WorldSession::SendPacket(), SMSG_QUEST_QUERY_RESPONSE, sObjectMgr, sScriptMgr, and sWorld.

Referenced by WorldSession::HandleQuestQueryOpcode().

Member Data Documentation

◆ _gossipMenu

◆ _questMenu

QuestMenu PlayerMenu::_questMenu
private

◆ _session