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
177 : _session(session)
178{
180}
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:500

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

◆ ~PlayerMenu()

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

References ClearMenus().

Member Function Documentation

◆ ClearMenus()

void PlayerMenu::ClearMenus ( )
188{
191}
void ClearMenu()
Definition: GossipDef.cpp:171
void ClearMenu()
Definition: GossipDef.cpp:312
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:144

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:162

References _gossipMenu, and GossipMenu::IsMenuItemCoded().

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ SendCloseGossip()

◆ SendGossipMenu()

void PlayerMenu::SendGossipMenu ( uint32  titleTextId,
ObjectGuid  objectGUID 
)
194{
195 _gossipMenu.SetSenderGUID(objectGUID);
196
198 data << objectGUID;
199 data << uint32(_gossipMenu.GetMenuId()); // new 2.4.0
200 data << uint32(titleTextId);
201 data << uint32(_gossipMenu.GetMenuItemCount()); // max count 0x10
202
203 for (GossipMenuItemContainer::const_iterator itr = _gossipMenu.GetMenuItems().begin(); itr != _gossipMenu.GetMenuItems().end(); ++itr)
204 {
205 GossipMenuItem const& item = itr->second;
206 data << uint32(itr->first);
207 data << uint8(item.MenuItemIcon);
208 data << uint8(item.IsCoded); // makes pop up box password
209 data << uint32(item.BoxMoney); // money required to open menu, 2.0.3
210 data << item.Message; // text for gossip item
211 data << item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
212 }
213
214 data << uint32(_questMenu.GetMenuItemCount()); // max count 0x20
215 uint32 count = 0;
216
217 for (uint32 iI = 0; iI < _questMenu.GetMenuItemCount(); ++iI)
218 {
219 ++count;
220 QuestMenuItem const& item = _questMenu.GetItem(iI);
221 uint32 questID = item.QuestId;
222 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
223 {
224 data << uint32(questID);
225 data << uint32(item.QuestIcon);
226 data << int32(quest->GetQuestLevel());
227 data << uint32(quest->GetFlags()); // 3.3.3 quest flags
228 data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 icon changes: blue question mark or yellow exclamation mark
229 std::string title = quest->GetTitle();
230
232 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questID))
233 ObjectMgr::GetLocaleString(localeData->Title, locale, title);
234 data << title;
235 }
236 }
237
238 _session->SendPacket(&data);
239}
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
250{
251 PointOfInterest const* poi = sObjectMgr->GetPointOfInterest(poiId);
252 if (!poi)
253 {
254 LOG_ERROR("sql.sql", "Request to send non-existing POI (Id: {}), ignored.", poiId);
255 return;
256 }
257
258 std::string name = poi->Name;
260 if (PointOfInterestLocale const* localeData = sObjectMgr->GetPointOfInterestLocale(poiId))
261 ObjectMgr::GetLocaleString(localeData->Name, locale, name);
262
263 WorldPacket data(SMSG_GOSSIP_POI, 4 + 4 + 4 + 4 + 4 + 20); // guess size
264 data << uint32(poi->Flags);
265 data << float(poi->PositionX);
266 data << float(poi->PositionY);
267 data << uint32(poi->Icon);
268 data << uint32(poi->Importance);
269 data << name;
270
271 _session->SendPacket(&data);
272}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
@ 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
647{
648 std::string questTitle = quest->GetTitle();
649 std::string RewardText = quest->GetOfferRewardText();
650
652 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
653 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
654
655 if (QuestOfferRewardLocale const* questOfferRewardLocale = sObjectMgr->GetQuestOfferRewardLocale(quest->GetQuestId()))
656 ObjectMgr::GetLocaleString(questOfferRewardLocale->RewardText, locale, RewardText);
657
658 WorldPacket data(SMSG_QUESTGIVER_OFFER_REWARD, 400); // guess size
659 data << npcGUID;
660 data << uint32(quest->GetQuestId());
661 data << questTitle;
662 data << RewardText;
663
664 data << uint8(enableNext ? 1 : 0); // Auto Finish
665 data << uint32(quest->GetFlags()); // 3.3.3 questFlags
666 data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum
667
668 uint32 emoteCount = 0;
669 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
670 {
671 if (quest->OfferRewardEmote[i] <= 0)
672 break;
673 ++emoteCount;
674 }
675
676 data << emoteCount; // Emote Count
677 for (uint32 i = 0; i < emoteCount; ++i)
678 {
679 data << uint32(quest->OfferRewardEmoteDelay[i]); // Delay Emote
680 data << uint32(quest->OfferRewardEmote[i]);
681 }
682
683 data << uint32(quest->GetRewChoiceItemsCount());
684 for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
685 {
686 data << uint32(quest->RewardChoiceItemId[i]);
687 data << uint32(quest->RewardChoiceItemCount[i]);
688
689 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[i]))
690 data << uint32(itemTemplate->DisplayInfoID);
691 else
692 data << uint32(0);
693 }
694
695 data << uint32(quest->GetRewItemsCount());
696 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
697 {
698 data << uint32(quest->RewardItemId[i]);
699 data << uint32(quest->RewardItemIdCount[i]);
700
701 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardItemId[i]))
702 data << uint32(itemTemplate->DisplayInfoID);
703 else
704 data << uint32(0);
705 }
706
707 uint32 moneyRew = 0;
708 Player* player = _session->GetPlayer();
709 uint8 playerLevel = player ? player->GetLevel() : 0;
710 if (player && (player->GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player)))
711 {
712 moneyRew = quest->GetRewMoneyMaxLevel();
713 }
714 moneyRew += quest->GetRewOrReqMoney(player ? player->GetLevel() : 0); // reward money (below max lvl)
715 data << moneyRew;
716 uint32 questXp;
717 if (player && !sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player))
718 {
719 questXp = uint32(quest->XPValue(playerLevel) * player->GetQuestRate());
720 }
721 else
722 {
723 questXp = 0;
724 }
725 sScriptMgr->OnQuestComputeXP(player, quest, questXp);
726 data << questXp;
727
728 // rewarded honor points. Multiply with 10 to satisfy client
729 data << uint32(10 * quest->CalculateHonorGain(_session->GetPlayer()->GetQuestLevel(quest)));
730 data << float(0.0f); // unk, honor multiplier?
731 data << uint32(0x08); // unused by client?
732 data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast == 0)
733 data << int32(quest->GetRewSpellCast()); // casted spell
734 data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
735 data << uint32(quest->GetBonusTalents()); // bonus talents
736 data << uint32(quest->GetRewArenaPoints()); // arena points
737 data << uint32(0);
738
739 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
740 data << uint32(quest->RewardFactionId[i]);
741
742 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (zero based)?
743 data << int32(quest->RewardFactionValueId[i]);
744
745 for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override?
746 data << uint32(quest->RewardFactionValueIdOverride[i]);
747
748 _session->SendPacket(&data);
749 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD {}, questid={}", npcGUID.ToString(), quest->GetQuestId());
750}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
#define QUEST_EMOTE_COUNT
Definition: QuestDef.h:42
#define QUEST_REPUTATIONS_COUNT
Definition: QuestDef.h:41
#define sScriptMgr
Definition: ScriptMgr.h:698
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:236
@ SMSG_QUESTGIVER_OFFER_REWARD
Definition: Opcodes.h:427
#define sWorld
Definition: World.h:447
Definition: ItemTemplate.h:628
Definition: Player.h:1056
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.h:1403
float GetQuestRate(bool isDFQuest=false)
Definition: Player.cpp:16165
uint8 GetLevel() const
Definition: Unit.h:1432
Definition: QuestDef.h:199
Player * GetPlayer() const
Definition: WorldSession.h:364

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

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 
)
318{
319 WorldPacket data(SMSG_QUESTGIVER_QUEST_LIST, 100); // guess size
320 data << guid;
321
322 if (QuestGreeting const* questGreeting = sObjectMgr->GetQuestGreeting(guid.GetTypeId(), guid.GetEntry()))
323 {
324 std::string strGreeting = questGreeting->Text;
325
327 if (localeConstant != LOCALE_enUS)
328 if (QuestGreetingLocale const* questGreetingLocale = sObjectMgr->GetQuestGreetingLocale(guid.GetTypeId(), guid.GetEntry()))
329 ObjectMgr::GetLocaleString(questGreetingLocale->Greeting, localeConstant, strGreeting);
330
331 data << strGreeting;
332 data << uint32(questGreeting->EmoteDelay);
333 data << uint32(questGreeting->EmoteType);
334 }
335 else
336 {
337 data << Title;
338 data << uint32(eEmote._Delay); // player emote
339 data << uint32(eEmote._Emote); // NPC emote
340 }
341
342 size_t count_pos = data.wpos();
343 data << uint8(0);
344 uint32 count = 0;
345
346 for (uint32 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
347 {
348 QuestMenuItem const& questMenuItem = _questMenu.GetItem(i);
349
350 uint32 questID = questMenuItem.QuestId;
351
352 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
353 {
354 ++count;
355 std::string title = quest->GetTitle();
356
358 if (localeConstant != LOCALE_enUS)
359 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(questID))
360 ObjectMgr::GetLocaleString(questTemplateLocale->Title, localeConstant, title);
361
362 data << uint32(questID);
363 data << uint32(questMenuItem.QuestIcon);
364 data << int32(quest->GetQuestLevel());
365 data << uint32(quest->GetFlags()); // 3.3.3 quest flags
366 data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 changes icon: blue question or yellow exclamation
367 data << title;
368 }
369 }
370
371 data.put<uint8>(count_pos, count);
372 _session->SendPacket(&data);
373 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_LIST (QuestGiver: {})", guid.ToString());
374}
LocaleConstant
Definition: Common.h:67
@ LOCALE_enUS
Definition: Common.h:68
@ 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
753{
754 // We can always call to RequestItems, but this packet only goes out if there are actually
755 // items. Otherwise, we'll skip straight to the OfferReward
756
757 std::string questTitle = quest->GetTitle();
758 std::string requestItemsText = quest->GetRequestItemsText();
759
761 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
762 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
763
764 if (QuestRequestItemsLocale const* questRequestItemsLocale = sObjectMgr->GetQuestRequestItemsLocale(quest->GetQuestId()))
765 ObjectMgr::GetLocaleString(questRequestItemsLocale->CompletionText, locale, requestItemsText);
766
767 if (!quest->GetReqItemsCount() && canComplete)
768 {
769 SendQuestGiverOfferReward(quest, npcGUID, true);
770 return;
771 }
772
773 // Xinef: recheck completion on reward display
774 Player* _player = _session->GetPlayer();
775 QuestStatusMap::iterator qsitr = _player->getQuestStatusMap().find(quest->GetQuestId());
776 if (qsitr != _player->getQuestStatusMap().end() && qsitr->second.Status == QUEST_STATUS_INCOMPLETE)
777 {
778 for (uint8 i = 0; i < 6; ++i)
779 if (quest->RequiredItemId[i] && qsitr->second.ItemCount[i] < quest->RequiredItemCount[i])
780 if (_player->GetItemCount(quest->RequiredItemId[i], false) >= quest->RequiredItemCount[i])
781 qsitr->second.ItemCount[i] = quest->RequiredItemCount[i];
782
783 if (_player->CanCompleteQuest(quest->GetQuestId()))
784 {
785 _player->CompleteQuest(quest->GetQuestId());
786 canComplete = true;
787 }
788 }
789
790 WorldPacket data(SMSG_QUESTGIVER_REQUEST_ITEMS, 300); // guess size
791 data << npcGUID;
792 data << uint32(quest->GetQuestId());
793 data << questTitle;
794 data << requestItemsText;
795
796 data << uint32(0x00); // unknown
797
798 if (canComplete)
799 data << quest->GetCompleteEmote();
800 else
801 data << quest->GetIncompleteEmote();
802
803 // Close Window after cancel
804 if (closeOnCancel)
805 data << uint32(0x01);
806 else
807 data << uint32(0x00);
808
809 data << uint32(quest->GetFlags()); // 3.3.3 questFlags
810 data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum
811
812 // Required Money
813 data << uint32(quest->GetRewOrReqMoney() < 0 ? -quest->GetRewOrReqMoney() : 0);
814
815 data << uint32(quest->GetReqItemsCount());
816 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
817 {
818 if (!quest->RequiredItemId[i])
819 continue;
820
821 data << uint32(quest->RequiredItemId[i]);
822 data << uint32(quest->RequiredItemCount[i]);
823
824 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
825 data << uint32(itemTemplate->DisplayInfoID);
826 else
827 data << uint32(0);
828 }
829
830 if (!canComplete)
831 data << uint32(0x00);
832 else
833 data << uint32(0x03);
834
835 data << uint32(0x04);
836 data << uint32(0x08);
837 data << uint32(0x10);
838
839 _session->SendPacket(&data);
840 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS {}, questid={}", npcGUID.ToString(), quest->GetQuestId());
841}
#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:646
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1598
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:355
void CompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:597
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition: PlayerQuest.cpp:288
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
377{
379 data << npcGUID;
380 data << uint8(questStatus);
381
382 _session->SendPacket(&data);
383 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC {}, status={}", npcGUID.ToString(), questStatus);
384}
@ 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
507{
508 std::string questTitle = quest->GetTitle();
509 std::string questDetails = quest->GetDetails();
510 std::string questObjectives = quest->GetObjectives();
511 std::string questAreaDescription = quest->GetAreaDescription();
512 std::string questCompletedText = quest->GetCompletedText();
513
514 std::string questObjectiveText[QUEST_OBJECTIVES_COUNT];
515 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
516 questObjectiveText[i] = quest->ObjectiveText[i];
517
519 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
520 {
521 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
522 ObjectMgr::GetLocaleString(localeData->Details, locale, questDetails);
523 ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
524 ObjectMgr::GetLocaleString(localeData->AreaDescription, locale, questAreaDescription);
525 ObjectMgr::GetLocaleString(localeData->CompletedText, locale, questCompletedText);
526
527 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
528 ObjectMgr::GetLocaleString(localeData->ObjectiveText[i], locale, questObjectiveText[i]);
529 }
530
531 WorldPacket data(SMSG_QUEST_QUERY_RESPONSE, 100); // guess size
532
533 data << uint32(quest->GetQuestId()); // quest id
534 data << uint32(quest->GetQuestMethod()); // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
535 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)
536 data << uint32(quest->GetMinLevel()); // min level
537 data << uint32(quest->GetZoneOrSort()); // zone or sort to display in quest log
538
539 data << uint32(quest->GetType()); // quest type
540 data << uint32(quest->GetSuggestedPlayers()); // suggested players count
541
542 data << uint32(quest->GetRepObjectiveFaction()); // shown in quest log as part of quest objective
543 data << uint32(quest->GetRepObjectiveValue()); // shown in quest log as part of quest objective
544
545 data << uint32(quest->GetRepObjectiveFaction2()); // shown in quest log as part of quest objective OPPOSITE faction
546 data << uint32(quest->GetRepObjectiveValue2()); // shown in quest log as part of quest objective OPPOSITE faction
547
548 data << uint32(quest->GetNextQuestInChain()); // client will request this quest from NPC, if not 0
549 data << uint32(quest->GetXPId()); // used for calculating rewarded experience
550
551 if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
552 data << uint32(0); // Hide money rewarded
553 else
554 {
555 uint32 moneyRew = 0;
556 Player* player = _session->GetPlayer();
557 if (player && (player->GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(player)))
558 {
559 moneyRew = quest->GetRewMoneyMaxLevel();
560 }
561 moneyRew += quest->GetRewOrReqMoney(player ? player->GetLevel() : 0); // reward money (below max lvl)
562 data << moneyRew;
563 }
564
565 data << uint32(quest->GetRewMoneyMaxLevel()); // used in XP calculation at client
566 data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (cast if RewSpellCast == 0)
567 data << int32(quest->GetRewSpellCast()); // cast spell
568
569 // rewarded honor points
570 data << uint32(quest->GetRewHonorAddition());
571 data << float(quest->GetRewHonorMultiplier());
572 data << uint32(quest->GetSrcItemId()); // source item id
573 data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
574 data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
575 data << uint32(quest->GetPlayersSlain()); // players slain
576 data << uint32(quest->GetBonusTalents()); // bonus talents
577 data << uint32(quest->GetRewArenaPoints()); // bonus arena points
578 data << uint32(0); // review rep show mask
579
580 if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
581 {
582 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
583 data << uint32(0) << uint32(0);
584 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
585 data << uint32(0) << uint32(0);
586 }
587 else
588 {
589 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
590 {
591 data << uint32(quest->RewardItemId[i]);
592 data << uint32(quest->RewardItemIdCount[i]);
593 }
594 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
595 {
596 data << uint32(quest->RewardChoiceItemId[i]);
597 data << uint32(quest->RewardChoiceItemCount[i]);
598 }
599 }
600
601 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
602 data << uint32(quest->RewardFactionId[i]);
603
604 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid+1 QuestFactionReward.dbc?
605 data << int32(quest->RewardFactionValueId[i]);
606
607 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // unk (0)
608 data << int32(quest->RewardFactionValueIdOverride[i]);
609
610 data << uint32(quest->GetPOIContinent());
611 data << float(quest->GetPOIx());
612 data << float(quest->GetPOIy());
613 data << uint32(quest->GetPointOpt());
614
615 data << questTitle;
616 data << questObjectives;
617 data << questDetails;
618 data << questAreaDescription;
619 data << questCompletedText; // display in quest objectives window once all objectives are completed
620
621 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
622 {
623 if (quest->RequiredNpcOrGo[i] < 0)
624 data << uint32((quest->RequiredNpcOrGo[i] * (-1)) | 0x80000000); // client expects gameobject template id in form (id|0x80000000)
625 else
626 data << uint32(quest->RequiredNpcOrGo[i]);
627
628 data << uint32(quest->RequiredNpcOrGoCount[i]);
629 data << uint32(quest->ItemDrop[i]);
630 data << uint32(0); // req source count?
631 }
632
633 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
634 {
635 data << uint32(quest->RequiredItemId[i]);
636 data << uint32(quest->RequiredItemCount[i]);
637 }
638
639 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
640 data << questObjectiveText[i];
641
642 _session->SendPacket(&data);
643 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid={}", quest->GetQuestId());
644}
#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