TrinityCore
Loading...
Searching...
No Matches
GossipDef.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "GossipDef.h"
19#include "Log.h"
20#include "NPCPackets.h"
21#include "ObjectMgr.h"
22#include "Player.h"
23#include "QuestDef.h"
24#include "QuestPackets.h"
25#include "World.h"
26#include "WorldSession.h"
27
34
39
40uint32 GossipMenu::AddMenuItem(int32 menuItemId, GossipOptionIcon icon, std::string const& message, uint32 sender, uint32 action, std::string const& boxMessage, uint32 boxMoney, bool coded /*= false*/)
41{
43
44 // Find a free new id - script case
45 if (menuItemId == -1)
46 {
47 menuItemId = 0;
48 if (_menuId)
49 {
50 // set baseline menuItemId as higher than whatever exists in db
51 auto [itr, end] = sObjectMgr->GetGossipMenuItemsMapBounds(_menuId);
52 itr = std::max_element(itr, end, [](GossipMenuItemsContainer::value_type const& a, GossipMenuItemsContainer::value_type const& b)
53 {
54 return a.second.OptionID < b.second.OptionID;
55 });
56 if (itr != end)
57 menuItemId = itr->second.OptionID + 1;
58 }
59
60 if (!_menuItems.empty())
61 {
62 for (GossipMenuItemContainer::const_iterator itr = _menuItems.begin(); itr != _menuItems.end(); ++itr)
63 {
64 if (int32(itr->first) > menuItemId)
65 break;
66
67 menuItemId = itr->first + 1;
68 }
69 }
70 }
71
72 GossipMenuItem& menuItem = _menuItems[menuItemId];
73
74 menuItem.MenuItemIcon = icon;
75 menuItem.Message = message;
76 menuItem.IsCoded = coded;
77 menuItem.Sender = sender;
78 menuItem.OptionType = action;
79 menuItem.BoxMessage = boxMessage;
80 menuItem.BoxMoney = boxMoney;
81 return menuItemId;
82}
83
92void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, uint32 action)
93{
95 GossipMenuItemsMapBounds bounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
96 auto itr = std::find_if(bounds.first, bounds.second, [menuItemId](std::pair<uint32 const, GossipMenuItems> const& itemPair)
97 {
98 return itemPair.second.OptionID == menuItemId;
99 });
100
101 if (itr == bounds.second)
102 return;
103
105 std::string strOptionText, strBoxText;
106 BroadcastTextEntry const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
107 BroadcastTextEntry const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
108
110 if (optionBroadcastText)
111 strOptionText = optionBroadcastText->GetText(GetLocale());
112 else
113 strOptionText = itr->second.OptionText;
114
116 if (boxBroadcastText)
117 strBoxText = boxBroadcastText->GetText(GetLocale());
118 else
119 strBoxText = itr->second.BoxText;
120
122 if (GetLocale() != DEFAULT_LOCALE)
123 {
124 if (!optionBroadcastText)
125 {
127 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, menuItemId))
128 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, GetLocale(), strOptionText);
129 }
130
131 if (!boxBroadcastText)
132 {
134 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, menuItemId))
135 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, GetLocale(), strBoxText);
136 }
137 }
138
140 AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
141 AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
142}
143
144void GossipMenu::AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
145{
146 GossipMenuItemData& itemData = _menuItemData[menuItemId];
147
148 itemData.GossipActionMenuId = gossipActionMenuId;
149 itemData.GossipActionPoi = gossipActionPoi;
150}
151
153{
154 GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
155 if (itr == _menuItems.end())
156 return 0;
157
158 return itr->second.Sender;
159}
160
162{
163 GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
164 if (itr == _menuItems.end())
165 return 0;
166
167 return itr->second.OptionType;
168}
169
171{
172 GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
173 if (itr == _menuItems.end())
174 return false;
175
176 return itr->second.IsCoded;
177}
178
180{
181 _menuItems.clear();
182 _menuItemData.clear();
183}
184
185PlayerMenu::PlayerMenu(WorldSession* session) : _session(session)
186{
187 if (_session)
189}
190
195
201
202void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
203{
204 _gossipMenu.SetSenderGUID(objectGUID);
205
207 packet.GossipGUID = objectGUID;
208 packet.GossipID = _gossipMenu.GetMenuId();
209 packet.RandomTextID = titleTextId;
210
211 packet.GossipOptions.reserve(_gossipMenu.GetMenuItems().size());
212 for (auto const& [gossipOptionId, item] : _gossipMenu.GetMenuItems())
213 {
214 WorldPackets::NPC::ClientGossipOptions& opt = packet.GossipOptions.emplace_back();
215 opt.GossipOptionID = gossipOptionId;
216 opt.OptionNPC = static_cast<GossipOptionIcon>(item.MenuItemIcon);
217 opt.OptionFlags = item.IsCoded; // makes pop up box password
218 opt.OptionCost = item.BoxMoney; // money required to open menu, 2.0.3
219 opt.Text = item.Message; // text for gossip item
220 opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
221 }
222
223 packet.GossipText.resize(_questMenu.GetMenuItemCount());
224 uint32 count = 0;
225 for (uint8 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
226 {
227 QuestMenuItem const& item = _questMenu.GetItem(i);
228 uint32 questID = item.QuestId;
229 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
230 {
232 text.QuestID = questID;
233 text.QuestType = item.QuestIcon;
234 text.QuestLevel = quest->GetQuestLevel();
235 text.QuestFlags = quest->GetFlags();
236 text.Repeatable = quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
237
238 text.QuestTitle = quest->GetLogTitle();
240 if (localeConstant != LOCALE_enUS)
241 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(questID))
242 ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, localeConstant, text.QuestTitle);
243
244 ++count;
245 }
246 }
247
248 // Shrink to the real size
249 packet.GossipText.resize(count);
250
251 _session->SendPacket(packet.Write());
252}
253
261
263{
264 PointOfInterest const* pointOfInterest = sObjectMgr->GetPointOfInterest(id);
265 if (!pointOfInterest)
266 {
267 TC_LOG_ERROR("sql.sql", "Request to send non-existing POI (Id: {}), ignored.", id);
268 return;
269 }
270
272 packet.Name = pointOfInterest->Name;
273
275 if (localeConstant != LOCALE_enUS)
276 if (PointOfInterestLocale const* localeData = sObjectMgr->GetPointOfInterestLocale(id))
277 ObjectMgr::GetLocaleString(localeData->Name, localeConstant, packet.Name);
278
279 packet.Flags = pointOfInterest->Flags;
280 packet.Pos.Pos.Relocate(pointOfInterest->PositionX, pointOfInterest->PositionY);
281 packet.Icon = pointOfInterest->Icon;
282 packet.Importance = pointOfInterest->Importance;
283
284 _session->SendPacket(packet.Write());
285}
286
287/*********************************************************/
288/*** QUEST SYSTEM ***/
289/*********************************************************/
290
292{
293 _questMenuItems.reserve(16); // can be set for max from most often sizes to speedup push_back and less memory use
294}
295
300
302{
303 if (!sObjectMgr->GetQuestTemplate(QuestId))
304 return;
305
307
308 QuestMenuItem questMenuItem;
309
310 questMenuItem.QuestId = QuestId;
311 questMenuItem.QuestIcon = Icon;
312
313 _questMenuItems.push_back(questMenuItem);
314}
315
316bool QuestMenu::HasItem(uint32 questId) const
317{
318 for (QuestMenuItemList::const_iterator i = _questMenuItems.begin(); i != _questMenuItems.end(); ++i)
319 if (i->QuestId == questId)
320 return true;
321
322 return false;
323}
324
326{
327 _questMenuItems.clear();
328}
329
330void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string& Title, ObjectGuid guid)
331{
332 WorldPacket data(SMSG_QUESTGIVER_QUEST_LIST, 100); // guess size
333 data << guid;
334
335 if (QuestGreeting const* questGreeting = sObjectMgr->GetQuestGreeting(guid))
336 {
337 std::string strGreeting = questGreeting->greeting;
338
340 if (localeConstant != LOCALE_enUS)
341 if (QuestGreetingLocale const* questGreetingLocale = sObjectMgr->GetQuestGreetingLocale(MAKE_PAIR32(guid.GetEntry(), guid.GetTypeId())))
342 ObjectMgr::GetLocaleString(questGreetingLocale->greeting, localeConstant, strGreeting);
343
344 data << strGreeting;
345 data << uint32(questGreeting->greetEmoteDelay);
346 data << uint32(questGreeting->greetEmoteType);
347 }
348 else
349 {
350 data << Title;
351 data << uint32(eEmote._Delay); // player emote
352 data << uint32(eEmote._Emote); // NPC emote
353 }
354
355 size_t count_pos = data.wpos();
356 data << uint8(0);
357 uint32 count = 0;
358 for (uint32 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
359 {
360 QuestMenuItem const& questMenuItem = _questMenu.GetItem(i);
361
362 uint32 questID = questMenuItem.QuestId;
363
364 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
365 {
366 ++count;
367 std::string title = quest->GetLogTitle();
368
370 if (localeConstant != LOCALE_enUS)
371 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(questID))
372 ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, localeConstant, title);
373
374 data << uint32(questID);
375 data << uint32(questMenuItem.QuestIcon);
376 data << int32(quest->GetQuestLevel());
377 data << uint32(quest->GetFlags()); // 3.3.3 quest flags
378 data << uint8(quest->IsAutoComplete() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 icon changes - 0: yellow exclapamtion mark, 1: blue question mark
379 data << title;
380 }
381 }
382
383 data.put<uint8>(count_pos, count);
384 _session->SendPacket(&data);
385
386 TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_LIST (QuestGiver: {})", guid.ToString());
387}
388
390{
392 packet.QuestGiver.Guid = npcGUID;
393 packet.QuestGiver.Status = questStatus;
394
395 _session->SendPacket(packet.Write());
396 TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC={}, status={}", npcGUID.ToString(), AsUnderlyingType(questStatus));
397}
398
399void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched) const
400{
402
403 packet.QuestTitle = quest->GetLogTitle();
404 packet.LogDescription = quest->GetLogDescription();
405 packet.DescriptionText = quest->GetQuestDescription();
406
408 if (localeConstant != LOCALE_enUS)
409 {
410 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
411 {
412 ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, localeConstant, packet.QuestTitle);
413 ObjectMgr::GetLocaleString(questTemplateLocale->LogDescription, localeConstant, packet.LogDescription);
414 ObjectMgr::GetLocaleString(questTemplateLocale->QuestDescription, localeConstant, packet.DescriptionText);
415 }
416 }
417
418 packet.QuestGiverGUID = npcGUID;
420 packet.QuestID = quest->GetQuestId();
421 packet.AutoLaunched = autoLaunched;
422 packet.Flags = quest->GetFlags() & (sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_ACCEPT) ? ~QUEST_FLAGS_AUTO_ACCEPT : ~0);
423 packet.SuggestedGroupNum = quest->GetSuggestedPlayers();
424
425 quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer());
426
427 packet.DescEmotes.reserve(QUEST_EMOTE_COUNT);
428 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
429 packet.DescEmotes.emplace_back(quest->DetailsEmote[i], quest->DetailsEmoteDelay[i]);
430
431 _session->SendPacket(packet.Write());
432
433 TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_GIVER_QUEST_DETAILS NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
434}
435
437{
438 if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES))
440 else
441 {
443 _session->SendPacket(&queryPacket);
444 }
445
446 TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid={}", quest->GetQuestId());
447}
448
449void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUID, bool autoLaunched) const
450{
452
453 packet.QuestTitle = quest->GetLogTitle();
454 packet.RewardText = quest->GetOfferRewardText();
455
457 if (localeConstant != LOCALE_enUS)
458 {
459 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
460 ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, localeConstant, packet.QuestTitle);
461
462 if (QuestOfferRewardLocale const* questOfferRewardLocale = sObjectMgr->GetQuestOfferRewardLocale(quest->GetQuestId()))
463 ObjectMgr::GetLocaleString(questOfferRewardLocale->RewardText, localeConstant, packet.RewardText);
464 }
465
466 packet.QuestGiverGUID = npcGUID;
467 packet.QuestID = quest->GetQuestId();
468 packet.AutoLaunched = autoLaunched;
469 packet.Flags = quest->GetFlags();
470 packet.SuggestedGroupNum = quest->GetSuggestedPlayers();
471
472 for (uint32 i = 0; i < QUEST_EMOTE_COUNT && quest->OfferRewardEmote[i]; ++i)
473 packet.Emotes.emplace_back(quest->OfferRewardEmote[i], quest->OfferRewardEmoteDelay[i]);
474
475 quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer(), true);
476
477 _session->SendPacket(packet.Write());
478
479 TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_GIVER_OFFER_REWARD NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
480}
481
482void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGUID, bool canComplete, bool autoLaunched) const
483{
484 // We can always call to RequestItems, but this packet only goes out if there are actually
485 // items. Otherwise, we'll skip straight to the OfferReward
486
487 if (!quest->GetReqItemsCount() && canComplete)
488 {
489 SendQuestGiverOfferReward(quest, npcGUID, true);
490 return;
491 }
492
494
495 packet.QuestTitle = quest->GetLogTitle();
496 packet.CompletionText = quest->GetRequestItemsText();
497
499 if (locale != LOCALE_enUS)
500 {
501 if (QuestLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
502 ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, locale, packet.QuestTitle);
503
504 if (QuestRequestItemsLocale const* questRequestItemsLocale = sObjectMgr->GetQuestRequestItemsLocale(quest->GetQuestId()))
505 ObjectMgr::GetLocaleString(questRequestItemsLocale->CompletionText, locale, packet.CompletionText);
506 }
507
508 packet.QuestGiverGUID = npcGUID;
509
510 packet.QuestID = quest->GetQuestId();
511
512 if (canComplete)
513 {
514 packet.CompEmoteDelay = quest->GetCompleteEmoteDelay();
515 packet.CompEmoteType = quest->GetCompleteEmote();
516 }
517 else
518 {
519 packet.CompEmoteDelay = quest->GetIncompleteEmoteDelay();
520 packet.CompEmoteType = quest->GetIncompleteEmote();
521 }
522
523 packet.QuestFlags = quest->GetFlags();
525
526 packet.Explored = canComplete ? 0x03 : 0x00;
527 packet.HasItems = 0x04;
528 packet.HasFaction = 0x08;
529 packet.HasMoney = 0x10;
530
531 packet.MoneyToGet = quest->GetRewOrReqMoney() < 0 ? -quest->GetRewOrReqMoney() : 0;
532 for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
533 {
534 if (!quest->RequiredItemId[i])
535 continue;
536
537 WorldPackets::Quest::QuestObjectiveCollect& collect = packet.Collect.emplace_back();
538 collect.ObjectID = quest->RequiredItemId[i];
539 collect.Amount = quest->RequiredItemCount[i];
540
541 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
542 collect.DisplayID = itemTemplate->GetDisplayId();
543 }
544
545 packet.AutoLaunched = autoLaunched;
546
547 _session->SendPacket(packet.Write());
548 TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
549}
LocaleConstant
Definition Common.h:48
@ LOCALE_enUS
Definition Common.h:49
#define DEFAULT_LOCALE
Definition Common.h:62
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
#define ASSERT
Definition Errors.h:68
#define GOSSIP_MAX_MENU_ITEMS
Definition GossipDef.h:30
GossipOptionIcon
Definition GossipDef.h:60
#define TC_LOG_DEBUG(filterType__,...)
Definition Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
uint32 MAKE_PAIR32(uint16 l, uint16 h)
#define sObjectMgr
Definition ObjectMgr.h:1721
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition ObjectMgr.h:794
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition QuestDef.h:39
#define QUEST_EMOTE_COUNT
Definition QuestDef.h:44
QuestGiverStatus
Definition QuestDef.h:114
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:554
size_t wpos() const
Definition ByteBuffer.h:325
void put(std::size_t pos, T value)
Definition ByteBuffer.h:141
GossipMenuItemContainer _menuItems
Definition GossipDef.h:220
void SetLocale(LocaleConstant locale)
Definition GossipDef.h:175
LocaleConstant GetLocale() const
Definition GossipDef.h:176
uint32 GetMenuItemAction(uint32 menuItemId) const
uint32 AddMenuItem(int32 menuItemId, GossipOptionIcon icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition GossipDef.cpp:40
uint32 GetMenuId() const
Definition GossipDef.h:172
GossipMenuItemDataContainer _menuItemData
Definition GossipDef.h:221
LocaleConstant _locale
Definition GossipDef.h:224
GossipMenuItemContainer const & GetMenuItems() const
Definition GossipDef.h:214
uint32 GetMenuItemSender(uint32 menuItemId) const
bool IsMenuItemCoded(uint32 menuItemId) const
uint32 _menuId
Definition GossipDef.h:222
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
void ClearMenu()
void SetSenderGUID(ObjectGuid guid)
Definition GossipDef.h:173
ObjectGuid _senderGUID
Definition GossipDef.h:223
static ObjectGuid const Empty
Definition ObjectGuid.h:140
std::string ToString() const
uint32 GetEntry() const
Definition ObjectGuid.h:155
static TypeID GetTypeId(HighGuid high)
Definition ObjectGuid.h:191
void Clear()
Definition ObjectGuid.h:150
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
Definition ObjectMgr.h:1519
void SendCloseGossip()
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool autoLaunched) const
void SendPointOfInterest(uint32 poiId) const
void SendQuestGiverOfferReward(Quest const *quest, ObjectGuid npcGUID, bool autoLaunched) const
QuestMenu _questMenu
Definition GossipDef.h:292
void ClearMenus()
PlayerMenu(WorldSession *session)
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
GossipMenu _gossipMenu
Definition GossipDef.h:291
void SendQuestQueryResponse(Quest const *quest) const
void SendQuestGiverStatus(QuestGiverStatus questStatus, ObjectGuid npcGUID) const
WorldSession * _session
Definition GossipDef.h:293
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool autoLaunched) const
void SendQuestGiverQuestList(QEmote const &eEmote, const std::string &Title, ObjectGuid npcGUID)
ObjectGuid GetPlayerSharingQuest() const
Definition Player.h:1341
QuestMenuItem const & GetItem(uint16 index) const
Definition GossipDef.h:248
uint8 GetMenuItemCount() const
Definition GossipDef.h:236
QuestMenuItemList _questMenuItems
Definition GossipDef.h:254
bool HasItem(uint32 questId) const
void ClearMenu()
void AddMenuItem(uint32 QuestId, uint8 Icon)
WorldPacket BuildQueryData(LocaleConstant loc) const
Definition QuestDef.cpp:382
uint32 GetReqItemsCount() const
Definition QuestDef.h:322
std::string const & GetRequestItemsText() const
Definition QuestDef.h:266
std::array< uint32, QUEST_EMOTE_COUNT > DetailsEmoteDelay
Definition QuestDef.h:318
WorldPacket QueryData[TOTAL_LOCALES]
Definition QuestDef.h:343
uint32 GetFlags() const
Definition QuestDef.h:288
void BuildQuestRewards(WorldPackets::Quest::QuestRewards &rewards, Player *player, bool sendHiddenRewards=false) const
Definition QuestDef.cpp:240
std::array< uint32, QUEST_ITEM_OBJECTIVES_COUNT > RequiredItemId
Definition QuestDef.h:304
std::string const & GetLogTitle() const
Definition QuestDef.h:261
uint32 GetQuestId() const
Definition QuestDef.h:228
uint32 GetIncompleteEmoteDelay() const
Definition QuestDef.h:283
uint32 GetCompleteEmoteDelay() const
Definition QuestDef.h:284
std::string const & GetOfferRewardText() const
Definition QuestDef.h:265
int32 GetRewOrReqMoney(Player const *player=nullptr) const
Definition QuestDef.cpp:287
std::string const & GetLogDescription() const
Definition QuestDef.h:262
std::array< uint32, QUEST_EMOTE_COUNT > DetailsEmote
Definition QuestDef.h:317
uint32 GetIncompleteEmote() const
Definition QuestDef.h:281
uint32 GetCompleteEmote() const
Definition QuestDef.h:282
std::string const & GetQuestDescription() const
Definition QuestDef.h:263
std::array< uint32, QUEST_ITEM_OBJECTIVES_COUNT > RequiredItemCount
Definition QuestDef.h:305
std::array< uint32, QUEST_EMOTE_COUNT > OfferRewardEmoteDelay
Definition QuestDef.h:320
uint32 GetSuggestedPlayers() const
Definition QuestDef.h:247
std::array< uint32, QUEST_EMOTE_COUNT > OfferRewardEmote
Definition QuestDef.h:319
WorldPacket const * Write() override
std::vector< ClientGossipOptions > GossipOptions
Definition NPCPackets.h:77
std::vector< ClientGossipText > GossipText
Definition NPCPackets.h:79
TaggedPosition< Position::XY > Pos
Definition NPCPackets.h:141
WorldPacket const * Write() override
std::vector< QuestDescEmote > DescEmotes
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< QuestObjectiveCollect > Collect
WorldPacket const * Write() override
Player session in the World.
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
LocaleConstant GetSessionDbLocaleIndex() const
Player * GetPlayer() const
@ SMSG_QUESTGIVER_QUEST_LIST
Definition Opcodes.h:418
@ SMSG_GOSSIP_COMPLETE
Definition Opcodes.h:411
#define sWorld
Definition World.h:901
@ CONFIG_QUEST_IGNORE_AUTO_ACCEPT
Definition World.h:152
@ CONFIG_CACHE_DATA_QUERIES
Definition World.h:176
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition ObjectMgr.h:490
uint32 GossipActionMenuId
Definition GossipDef.h:147
uint32 OptionType
Definition GossipDef.h:137
std::string BoxMessage
Definition GossipDef.h:138
uint32 BoxMoney
Definition GossipDef.h:139
uint8 MenuItemIcon
Definition GossipDef.h:133
std::string Message
Definition GossipDef.h:135
std::string Name
Definition ObjectMgr.h:762
uint32 Importance
Definition ObjectMgr.h:761
void Relocate(float x, float y)
Definition Position.h:66
uint32 _Emote
Definition NPCHandler.h:23
uint32 _Delay
Definition NPCHandler.h:24
uint32 QuestId
Definition GossipDef.h:156
uint8 QuestIcon
Definition GossipDef.h:157
Position Pos
Definition Position.h:226