Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
GossipDef.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "Formulas.h"
7#include "GossipDef.h"
8#include "ObjectMgr.h"
9#include "Opcodes.h"
10#include "QuestDef.h"
11#include "WorldPacket.h"
12#include "WorldSession.h"
13
14void GossipMenu::AddMenuItem(int32 menuItemId, uint8 icon, std::string const& message, uint32 sender, uint32 action, std::string const& boxMessage, uint32 boxMoney, bool coded /*= false*/)
15{
17
18 // Find a free new id - script case
19 if (menuItemId == -1)
20 {
21 menuItemId = 0;
22 if (!_menuItems.empty())
23 {
24 for (GossipMenuItemContainer::const_iterator itr = _menuItems.begin(); itr != _menuItems.end(); ++itr)
25 {
26 if (int32(itr->first) > menuItemId)
27 break;
28
29 menuItemId = itr->first + 1;
30 }
31 }
32 }
33
34 GossipMenuItem& menuItem = _menuItems[menuItemId];
35
36 menuItem.MenuItemIcon = icon;
37 menuItem.Message = message;
38 menuItem.IsCoded = coded;
39 menuItem.Sender = sender;
40 menuItem.OptionType = action;
41 menuItem.BoxMessage = boxMessage;
42 menuItem.BoxMoney = boxMoney;
43}
44
53void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, uint32 action)
54{
56 GossipMenuItemsMapBounds bounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
58 if (bounds.first == bounds.second)
59 return;
60
62 for (GossipMenuItemsContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
63 {
65 if (itr->second.OptionID != menuItemId)
66 continue;
67
69 std::string strOptionText = itr->second.OptionText;
70 std::string strBoxText = itr->second.BoxText;
71
73 if (GetLocale() > LOCALE_enUS)
75 if (GossipMenuItemsLocale const* no = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, menuItemId)))
76 {
78 ObjectMgr::GetLocaleString(no->OptionText, GetLocale(), strOptionText);
79 ObjectMgr::GetLocaleString(no->BoxText, GetLocale(), strBoxText);
80 }
81
83 AddMenuItem(-1, itr->second.OptionIcon, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
84 }
85}
86
87void GossipMenu::AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
88{
89 GossipMenuItemData& itemData = _menuItemData[menuItemId];
90
91 itemData.GossipActionMenuId = gossipActionMenuId;
92 itemData.GossipActionPoi = gossipActionPoi;
93}
94
96{
97 GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
98 if (itr == _menuItems.end())
99 return 0;
100
101 return itr->second.Sender;
102}
103
105{
106 GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
107 if (itr == _menuItems.end())
108 return 0;
109
110 return itr->second.OptionType;
111}
112
114{
115 GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
116 if (itr == _menuItems.end())
117 return false;
118
119 return itr->second.IsCoded;
120}
121
123{
124 _menuItems.clear();
125 _menuItemData.clear();
126}
127
129{
130 if (_session)
131 _gossipMenu.SetLocale(_session->GetSessionDbLocaleIndex());
132}
133
138
140{
141 _gossipMenu.ClearMenu();
142 _questMenu.ClearMenu();
143}
144
145void PlayerMenu::SendGossipMenu(uint32 titleTextId, uint64 objectGUID) const
146{
147 std::string updatedQuestTitles[0x20];
148 ObjectGuid guid = ObjectGuid(objectGUID);
149
150 WorldPacket data(SMSG_GOSSIP_MESSAGE, 150); // Guessed
151 data.WriteBits(_questMenu.GetMenuItemCount(), 19); // max count 0x20
152
153 // Store this instead of checking the Singleton every loop iteration
154 bool questLevelInTitle = sWorld->GetBoolConfig(WorldBoolConfigs::CONFIG_UI_QUESTLEVELS_IN_DIALOGS);
155
156 for (uint8 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
157 {
158 uint32 questId = _questMenu.GetItem(i).QuestId;
159 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
160
161 std::string title = quest->GetTitle();
162
163 int32 locale = _session->GetSessionDbLocaleIndex();
164 if (locale >= 0)
165 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questId))
166 ObjectMgr::GetLocaleString(localeData->Title, locale, title);
167
168 if (questLevelInTitle)
169 AddQuestLevelToTitle(title, quest->GetQuestLevel());
170
171 data.WriteBit(quest->IsRepeatable());
172 data.WriteBits(title.length(), 9);
173
174 updatedQuestTitles[i] = title;
175 }
176
177 data.WriteGuidMask(guid, 5, 7, 4, 0);
178 data.WriteBits(_gossipMenu.GetMenuItemCount(), 20); // max count 0x10
179 data.WriteGuidMask(guid, 6, 2);
180
181 for (GossipMenuItemContainer::const_iterator itr = _gossipMenu.GetMenuItems().begin(); itr != _gossipMenu.GetMenuItems().end(); ++itr)
182 {
183 GossipMenuItem const& item = itr->second;
184
185 data.WriteBits(item.BoxMessage.length(), 12);
186 data.WriteBits(item.Message.length(), 12);
187 }
188
189 data.WriteGuidMask(guid, 3, 1);
190 data.FlushBits();
191
192 for (uint8 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
193 {
194 QuestMenuItem const& item = _questMenu.GetItem(i);
195 Quest const* quest = sObjectMgr->GetQuestTemplate(item.QuestId);
196
197 data.WriteString(updatedQuestTitles[i]);
198 data << int32(quest->GetFlags());
199 data << int32(quest->GetQuestLevel());
200 data << int32(item.QuestIcon);
201 data << int32(item.QuestId);
202 data << int32(quest->GetFlags2());
203 }
204
205 data.WriteGuidBytes(guid, 1, 0);
206
207 for (GossipMenuItemContainer::const_iterator itr = _gossipMenu.GetMenuItems().begin(); itr != _gossipMenu.GetMenuItems().end(); ++itr)
208 {
209 GossipMenuItem const& item = itr->second;
210
211 data << int32(item.BoxMoney); // money required to open menu, 2.0.3
212 data.WriteString(item.BoxMessage); // accept text (related to money) pop up box, 2.0.
213 data << int32(itr->first);
214 data << int8(item.IsCoded); // makes pop up box password
215 data.WriteString(item.Message); // text for gossip item
216 data << int8(item.MenuItemIcon);
217 }
218
219 data.WriteGuidBytes(guid, 5, 3);
220 data << int32(_gossipMenu.GetMenuId()); // new 2.4.0
221 data.WriteGuidBytes(guid, 2, 6, 4);
222 data << int32(0); //FriendshipFactionID
223 data.WriteGuidBytes(guid, 7);
224 data << int32(titleTextId);
225
226 _session->SendPacket(&data);
227}
228
230{
232 _session->SendPacket(&data);
233}
234
236{
237 PointOfInterest const* poi = sObjectMgr->GetPointOfInterest(poiId);
238 if (!poi)
239 {
240 SF_LOG_ERROR("sql.sql", "Request to send non-existing POI (Id: %u), ignored.", poiId);
241 return;
242 }
243
244 std::string iconText = poi->icon_name;
245 int32 locale = _session->GetSessionDbLocaleIndex();
246 if (locale >= 0)
247 if (PointOfInterestLocale const* localeData = sObjectMgr->GetPointOfInterestLocale(poiId))
248 ObjectMgr::GetLocaleString(localeData->IconName, locale, iconText);
249
250 WorldPacket data(SMSG_GOSSIP_POI, 4 + 4 + 4 + 4 + 4 + 10); // guess size
251 data << uint32(poi->flags);
252 data << float(poi->x);
253 data << float(poi->y);
254 data << uint32(poi->icon);
255 data << uint32(poi->data);
256 data << iconText;
257
258 _session->SendPacket(&data);
259}
260
261/*********************************************************/
262/*** QUEST SYSTEM ***/
263/*********************************************************/
264
266{
267 _questMenuItems.reserve(16); // can be set for max from most often sizes to speedup push_back and less memory use
268}
269
274
276{
277 if (!sObjectMgr->GetQuestTemplate(QuestId))
278 return;
279
281
282 QuestMenuItem questMenuItem;
283
284 questMenuItem.QuestId = QuestId;
285 questMenuItem.QuestIcon = Icon;
286
287 _questMenuItems.push_back(questMenuItem);
288}
289
290bool QuestMenu::HasItem(uint32 questId) const
291{
292 for (QuestMenuItemList::const_iterator i = _questMenuItems.begin(); i != _questMenuItems.end(); ++i)
293 if (i->QuestId == questId)
294 return true;
295
296 return false;
297}
298
300{
301 _questMenuItems.clear();
302}
303
304void PlayerMenu::SendQuestGiverQuestList(QEmote eEmote, const std::string& Title, uint64 npcGUID)
305{
306 ByteBuffer questData;
307 ObjectGuid guid = npcGUID;
308
309 WorldPacket data(SMSG_QUESTGIVER_QUEST_LIST, 100); // guess size
310
311 data << uint32(eEmote._Emote); // NPC emote
312 data << uint32(eEmote._Delay); // player emote
313
314 data.WriteGuidMask(guid, 2);
315
316 data.WriteBits(Title.size(), 11);
317
318 data.WriteGuidMask(guid, 6, 0);
319
320 uint32 count = 0;
321 size_t countPos = data.bitwpos();
322 data.WriteBits(count, 19);
323
324 // Store this instead of checking the Singleton every loop iteration
325 bool questLevelInTitle = sWorld->GetBoolConfig(WorldBoolConfigs::CONFIG_UI_QUESTLEVELS_IN_DIALOGS);
326
327 for (uint32 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
328 {
329 QuestMenuItem const& qmi = _questMenu.GetItem(i);
330
331 uint32 questID = qmi.QuestId;
332
333 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
334 {
335 ++count;
336 std::string title = quest->GetTitle();
337
338 int32 locale = _session->GetSessionDbLocaleIndex();
339 if (locale >= 0)
340 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questID))
341 ObjectMgr::GetLocaleString(localeData->Title, locale, title);
342
343 if (questLevelInTitle)
344 AddQuestLevelToTitle(title, quest->GetQuestLevel());
345
346 data.WriteBit(quest->IsRepeatable());
347 data.WriteBits(title.size(), 9);
348
349 questData << uint32(quest->GetFlags());
350 questData << uint32(questID);
351 questData.WriteString(title);
352 questData << uint32(quest->GetFlags2());
353 questData << uint32(qmi.QuestIcon);
354 questData << uint32(quest->GetQuestLevel());
355 }
356 }
357
358 data.WriteGuidMask(guid, 1, 3, 4, 5, 7);
359
360 data.PutBits(countPos, count, 19);
361 data.FlushBits();
362
363 data.WriteGuidBytes(guid, 1, 0, 6, 7);
364 data.append(questData);
365 data.WriteGuidBytes(guid, 5, 3, 2);
366 data.WriteString(Title);
367 data.WriteGuidBytes(guid, 4);
368
369 _session->SendPacket(&data);
370
371 SF_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_LIST NPC Guid=%u", GUID_LOPART(npcGUID));
372}
373
374void PlayerMenu::SendQuestGiverStatus(uint32 questStatus, uint64 npcGUID) const
375{
376 ObjectGuid guid = npcGUID;
377
378 WorldPacket data(SMSG_QUESTGIVER_STATUS, 1 + 8 + 4);
379
380 data.WriteGuidMask(guid, 1, 7, 4, 2, 5, 3, 6, 0);
381
382 data.FlushBits();
383
384 data.WriteGuidBytes(guid, 7);
385
386 data << uint32(questStatus);
387
388 data.WriteGuidBytes(guid, 4, 6, 1, 5, 2, 0, 3);
389
390 _session->SendPacket(&data);
391 SF_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC Guid=%u, status=%u", GUID_LOPART(npcGUID), questStatus);
392}
393
394void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, uint64 npcGUID, bool activateAccept, bool displayPopup) const
395{
396 std::string questTitle = quest->GetTitle();
397 std::string questDetails = quest->GetDetails();
398 std::string questObjectives = quest->GetObjectives();
399 std::string questGiverTextWindow = quest->GetQuestGiverTextWindow();
400 std::string questGiverTargetName = quest->GetQuestGiverTargetName();
401 std::string questTurnTextWindow = quest->GetQuestTurnTextWindow();
402 std::string questTurnTargetName = quest->GetQuestTurnTargetName();
403
404 int32 locale = _session->GetSessionDbLocaleIndex();
405 if (locale >= 0)
406 {
407 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
408 {
409 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
410 ObjectMgr::GetLocaleString(localeData->Details, locale, questDetails);
411 ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
412 ObjectMgr::GetLocaleString(localeData->QuestGiverTextWindow, locale, questGiverTextWindow);
413 ObjectMgr::GetLocaleString(localeData->QuestGiverTargetName, locale, questGiverTargetName);
414 ObjectMgr::GetLocaleString(localeData->QuestTurnTextWindow, locale, questTurnTextWindow);
415 ObjectMgr::GetLocaleString(localeData->QuestTurnTargetName, locale, questTurnTargetName);
416 }
417 }
418
420 AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
421
422 ByteBuffer objData;
423 for (QuestObjectiveSet::const_iterator citr = quest->m_questObjectives.begin(); citr != quest->m_questObjectives.end(); ++citr)
424 {
425 QuestObjective const* objective = *citr;
426 objData << uint8(objective->Type);
427 objData << uint32(objective->Id);
428 objData << int32(objective->Amount);
429 objData << uint32(objective->ObjectId);
430 }
431
432 uint32 RewardItemDisplayId[QUEST_REWARDS_COUNT] = { };
433 uint32 RewardChoiceItemDisplayId[QUEST_REWARD_CHOICES_COUNT] = { };
434
435 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; i++)
436 {
437 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardItemId[i]))
438 RewardItemDisplayId[i] = itemTemplate->DisplayInfoID;
439 }
440
441 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; i++)
442 {
443 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[i]))
444 RewardChoiceItemDisplayId[i] = itemTemplate->DisplayInfoID;
445 }
446
447 ObjectGuid DividerGUID = _session->GetPlayer()->GetDivider();
448 ObjectGuid QuestGiverGUID = npcGUID;
449
450 WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 100); // guess size
451 data << uint32(quest->RewardItemIdCount[3]);
452 data << uint32(RewardChoiceItemDisplayId[4]);
453 data << uint32(quest->RewardChoiceItemId[2]);
454
455 for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; i++)
456 {
457 data << uint32(quest->RewardCurrencyCount[i]);
458 data << uint32(quest->RewardCurrencyId[i]);
459 }
460
461 data << uint32(quest->GetRewChoiceItemsCount());
462 data << uint32(quest->RewardChoiceItemCount[2]);
463 data << uint32(quest->RewardItemIdCount[1]);
464 data << uint32(RewardChoiceItemDisplayId[5]);
465 data << uint32(quest->RewardItemIdCount[0]);
466 data << uint32(RewardItemDisplayId[3]);
467 data << uint32(quest->RewardChoiceItemId[0]);
468 data << uint32(quest->RewardChoiceItemCount[3]);
469 data << uint32(quest->GetQuestGiverPortrait());
470 data << uint32(RewardChoiceItemDisplayId[3]);
471 data << uint32(quest->RewardItemId[0]);
472 data << uint32(quest->GetQuestId());
473 data << uint32(quest->GetSuggestedPlayers());
474 data << uint32(RewardChoiceItemDisplayId[0]);
475 data << uint32(quest->RewardChoiceItemCount[4]);
476 data << uint32(quest->RewardChoiceItemCount[5]);
477 data << uint32(quest->GetBonusTalents());
478 data << uint32(quest->RewardChoiceItemCount[1]);
479 data << uint32(RewardChoiceItemDisplayId[2]);
480
481 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; i++)
482 {
483 data << uint32(quest->RewardFactionValueId[i]);
484 data << uint32(quest->RewardFactionValueIdOverride[i]);
485 data << uint32(quest->RewardFactionId[i]);
486 }
487
488 data << uint32(quest->RewardItemId[3]);
489 data << uint32(quest->GetRewardSkillId());
490 data << uint32(quest->XPValue(_session->GetPlayer()) * sWorld->getRate(Rates::RATE_XP_QUEST));
491 data << uint32(quest->GetRewardReputationMask());
492 data << uint32(RewardItemDisplayId[2]);
493 data << uint32(quest->RewardItemId[1]);
494 data << uint32(quest->RewardChoiceItemId[1]);
495 data << uint32(quest->RewardChoiceItemId[5]);
496 data << uint32(quest->GetRewSpell());
497 data << uint32(quest->GetFlags());
498 data << uint32(quest->GetCharTitleId());
499 data << uint32(quest->RewardItemId[2]);
500 data << uint32(quest->GetRewMoney());
501 data << uint32(quest->RewardItemIdCount[2]);
502 data << uint32(quest->GetFlags2());
503 data << uint32(quest->GetRewSpell());
504 data << uint32(quest->RewardChoiceItemId[3]);
505 data << uint32(quest->GetRewItemsCount());
506 data << uint32(quest->GetRewardSkillPoints());
507 data << uint32(RewardItemDisplayId[0]);
508 data << uint32(quest->RewardChoiceItemId[4]);
509 data << uint32(quest->GetRewardPackageItemId());
510 data << uint32(quest->RewardChoiceItemCount[0]);
511 data << uint32(RewardItemDisplayId[1]);
512 data << uint32(RewardChoiceItemDisplayId[1]);
513 data << uint32(quest->GetQuestTurnInPortrait());
514
515 data.WriteGuidMask(DividerGUID, 7);
516 data.WriteGuidMask(QuestGiverGUID, 1);
517
518 data.WriteBits(questTurnTargetName.size(), 8);
519
520 data.WriteGuidMask(QuestGiverGUID, 2);
521
522 data.WriteBits(questGiverTextWindow.size(), 10);
523 data.WriteBit(displayPopup);
524
525 data.WriteGuidMask(DividerGUID, 2);
526
527 data.WriteBits(questTitle.size(), 9);
529
530 data.WriteGuidMask(DividerGUID, 0);
531 data.WriteGuidMask(QuestGiverGUID, 6, 5);
532
533 data.WriteBits(questGiverTargetName.size(), 8);
534
535 data.WriteGuidMask(QuestGiverGUID, 3);
536 data.WriteGuidMask(DividerGUID, 1);
537 data.WriteGuidMask(QuestGiverGUID, 0);
538
539 data.WriteBit(0);
540
541 data.WriteGuidMask(QuestGiverGUID, 4);
542 data.WriteGuidMask(DividerGUID, 3, 5, 4);
543
544 data.WriteBits(questTurnTextWindow.size(), 10);
545 data.WriteBit(activateAccept);
546
547 data.WriteGuidMask(DividerGUID, 6);
548 data.WriteGuidMask(QuestGiverGUID, 7);
549
550 data.WriteBits(questDetails.size(), 12);
551 data.WriteBits(0, 22);
552 data.WriteBits(quest->m_questObjectives.size(), 20);
553 data.WriteBits(questObjectives.size(), 12);
554
555 data.FlushBits();
556
557 data.WriteGuidBytes(DividerGUID, 0);
558
559 data.WriteString(questGiverTargetName);
560 data.WriteString(questTurnTextWindow);
561 data.WriteString(questTitle);
562
563 data.WriteGuidBytes(QuestGiverGUID, 6);
564
565 data.WriteString(questObjectives);
566
567 data.WriteGuidBytes(DividerGUID, 2);
568
569 data.WriteString(questGiverTextWindow);
570
571 data.append(objData);
572
573 data.WriteString(questTurnTargetName);
574 data.WriteString(questDetails);
575
576 data.WriteGuidBytes(DividerGUID, 5, 7);
577 data.WriteGuidBytes(QuestGiverGUID, 7, 3, 0);
578
579 for (uint8 i = 0; i < QUEST_EMOTE_COUNT; i++)
580 {
581 data << uint32(quest->DetailsEmoteDelay[i]); // DetailsEmoteDelay (in ms)
582 data << uint32(quest->DetailsEmote[i]);
583 }
584
585 data.WriteGuidBytes(DividerGUID, 4, 3);
586 data.WriteGuidBytes(QuestGiverGUID, 5, 1, 2);
587 data.WriteGuidBytes(DividerGUID, 1, 6);
588 data.WriteGuidBytes(QuestGiverGUID, 4);
589
591
592 _session->SendPacket(&data);
593
594 SF_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), quest->GetQuestId());
595}
596
598{
599 std::string questTitle = quest->GetTitle();
600 std::string questDetails = quest->GetDetails();
601 std::string questObjectives = quest->GetObjectives();
602 std::string questEndText = quest->GetEndText();
603 std::string questCompletedText = quest->GetCompletedText();
604 std::string questGiverTextWindow = quest->GetQuestGiverTextWindow();
605 std::string questGiverTargetName = quest->GetQuestGiverTargetName();
606 std::string questTurnTextWindow = quest->GetQuestTurnTextWindow();
607 std::string questTurnTargetName = quest->GetQuestTurnTargetName();
608
609 int32 locale = _session->GetSessionDbLocaleIndex();
610 if (locale >= 0)
611 {
612 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
613 {
614 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
615 ObjectMgr::GetLocaleString(localeData->Details, locale, questDetails);
616 ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
617 ObjectMgr::GetLocaleString(localeData->EndText, locale, questEndText);
618 ObjectMgr::GetLocaleString(localeData->CompletedText, locale, questCompletedText);
619 ObjectMgr::GetLocaleString(localeData->QuestGiverTextWindow, locale, questGiverTextWindow);
620 ObjectMgr::GetLocaleString(localeData->QuestGiverTargetName, locale, questGiverTargetName);
621 ObjectMgr::GetLocaleString(localeData->QuestTurnTextWindow, locale, questTurnTextWindow);
622 ObjectMgr::GetLocaleString(localeData->QuestTurnTargetName, locale, questTurnTargetName);
623 }
624 }
625
627 AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
628
629 WorldPacket data(SMSG_QUEST_QUERY_RESPONSE, 100); // guess size
630 data << uint32(quest->GetQuestId());
631
632 data.WriteBit(1); // has data
633 data.WriteBits(questTurnTextWindow.size(), 10);
634 data.WriteBits(questTitle.size(), 9);
635 data.WriteBits(questCompletedText.size(), 11);
636 data.WriteBits(questDetails.size(), 12);
637 data.WriteBits(questTurnTargetName.size(), 8);
638 data.WriteBits(questGiverTargetName.size(), 8);
639 data.WriteBits(questGiverTextWindow.size(), 10);
640 data.WriteBits(questEndText.size(), 9);
641 data.WriteBits(quest->m_questObjectives.size(), 19);
642 data.WriteBits(questObjectives.size(), 12);
643
644 ByteBuffer objData;
645 for (QuestObjectiveSet::const_iterator citr = quest->m_questObjectives.begin(); citr != quest->m_questObjectives.end(); ++citr)
646 {
647 QuestObjective const* questObjective = *citr;
648
649 std::string descriptionText = questObjective->Description;
650 if (locale > 0)
651 if (QuestObjectiveLocale const* questObjectiveLocale = sObjectMgr->GetQuestObjectiveLocale(questObjective->Id))
652 ObjectMgr::GetLocaleString(questObjectiveLocale->Description, locale, descriptionText);
653
654 data.WriteBits(descriptionText.size(), 8);
655 data.WriteBits(questObjective->VisualEffects.size(), 22);
656
657 objData << int32(questObjective->Amount);
658 objData << uint32(questObjective->Id);
659 objData.WriteString(descriptionText);
660 objData << uint32(questObjective->Flags);
661 objData << uint8(questObjective->Index);
662 objData << uint8(questObjective->Type);
663 objData << uint32(questObjective->ObjectId);
664
665 for (VisualEffectVec::const_iterator citrEffects = questObjective->VisualEffects.begin(); citrEffects != questObjective->VisualEffects.end(); ++citrEffects)
666 objData << uint32(*citrEffects);
667 }
668
669 data.FlushBits();
670
671 bool hiddenReward = quest->HasFlag(QUEST_FLAGS_HIDE_REWARD);
672
673 // values need rechecking and zero values need more research
674 data.append(objData);
675 data << uint32(quest->RequiredSourceItemId[0]);
676 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemId[4]);
677 data << uint32(hiddenReward ? 0 : quest->RewardItemId[3]);
678 data << uint32(hiddenReward ? 0 : quest->RewardItemIdCount[1]);
679 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemCount[2]);
680
681 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; i++)
682 {
683 data << uint32(quest->RewardCurrencyId[i]);
684 data << uint32(quest->RewardCurrencyCount[i]);
685 }
686
687 data << uint32(quest->GetBonusTalents()); // bonus talents
688 data << float(quest->GetPointY());
689 data << uint32(quest->GetSoundTurnIn());
690
691 for (int i = 0; i < QUEST_REPUTATIONS_COUNT; i++)
692 {
693 data << uint32(quest->RewardFactionValueId[i]); // columnid+1 QuestFactionReward.dbc?
694 data << uint32(quest->RewardFactionValueIdOverride[i]); // unknown usage
695 data << uint32(quest->RewardFactionId[i]); // reward factions ids
696 }
697
698 data << uint32(hiddenReward ? 0 : quest->GetRewMoney()); // reward money (below max lvl)
699 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemCount[4]);
700 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemCount[1]);
701 data << uint32(quest->GetFlags2());
702 data.WriteString(questEndText);
703 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemId[1]);
704 data << uint32(quest->GetRewMoneyMaxLevel()); // used in XP calculation at client
705 data << uint32(hiddenReward ? 0 : quest->RewardItemId[0]);
706 data.WriteString(questCompletedText);
707 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemId[3]);
708 data << uint32(quest->GetRewHonorAddition()); // rewarded honor points
709 data.WriteString(questGiverTextWindow);
710 data.WriteString(questObjectives);
711 data << uint32(quest->GetRewardSkillPoints()); // reward skill points
712 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemId[5]);
713 data << uint32(quest->GetSuggestedPlayers()); // suggested players count
714 data << uint32(quest->GetQuestId()); // quest id
715 data << uint32(quest->RequiredSourceItemId[1]);
716 data << uint32(hiddenReward ? 0 : quest->RewardItemId[1]);
717 data << int32(quest->GetMinLevel()); // min level
718 data << uint32(quest->GetRewardReputationMask()); // rep mask (unsure on what it does)
719 data << uint32(quest->GetPointOpt());
720 data << int32(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)
721 data << uint32(quest->GetQuestMethod()); // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
722 data << uint32(quest->RequiredSourceItemCount[2]);
723 data << uint32(quest->GetXPId()); // seems to always have the same value as the first XP ID field
724 data.WriteString(questDetails);
725 data << uint32(hiddenReward ? 0 : quest->RewardItemIdCount[0]);
726 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemCount[5]);
727 data << uint32(hiddenReward ? 0 : quest->RewardItemIdCount[2]);
728 data << uint32(quest->GetRewSpellCast()); // casted spell
729 data << uint32(0); // unknown
730 data.WriteString(questTurnTargetName);
731 data << uint32(0); // unknown
732 data << uint32(quest->RequiredSourceItemCount[1]);
733 data << uint32(quest->RequiredSourceItemId[2]);
734 data << uint32(quest->GetQuestTurnInPortrait());
735 data.WriteString(questTitle);
736 data << uint32(quest->GetType()); // quest type
737 data << uint32(quest->GetXPId()); // used for calculating rewarded experience
738 data << uint32(0); // unknown
739 data << uint32(0); // unknown
740 data << uint32(quest->GetPointMapId());
741 data << uint32(quest->GetNextQuestInChain()); // client will request this quest from NPC, if not 0
742 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemId[0]);
743 data.WriteString(questGiverTargetName);
744 data << uint32(0); // unknown
745 data << uint32(quest->RequiredSourceItemId[3]);
746 data << float(quest->GetPointX());
747 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemId[2]);
748 data << uint32(0); // unknown
749 data << uint32(hiddenReward ? 0 : quest->RewardItemIdCount[3]);
750 data << uint32(quest->GetSoundAccept());
751 data << uint32(hiddenReward ? 0 : quest->RewardItemId[2]);
752 data << float(quest->GetRewHonorMultiplier());
753 data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
754 data.WriteString(questTurnTextWindow);
755 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemCount[3]);
756 data << uint32(quest->RequiredSourceItemCount[0]);
757 data << int32(quest->GetZoneOrSort()); // zone or sort to display in quest log
758 data << uint32(quest->GetRewardSkillId()); // reward skill id
759 data << uint32(hiddenReward ? 0 : quest->RewardChoiceItemCount[0]);
760 data << uint32(quest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast == 0)
761 data << uint32(quest->GetQuestGiverPortrait());
762 data << uint32(0); // unknown
763 data << uint32(quest->RequiredSourceItemCount[3]);
764 data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
765 data << uint32(quest->GetRewardPackageItemId());
766 data << uint32(quest->GetSrcItemId()); // source item id
767
768 _session->SendPacket(&data);
769
770 SF_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", quest->GetQuestId());
771}
772
773void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, uint64 npcGuid, bool enableNext) const
774{
775 std::string questTitle = quest->GetTitle();
776 std::string questOfferRewardText = quest->GetOfferRewardText();
777 std::string questGiverTextWindow = quest->GetQuestGiverTextWindow();
778 std::string questGiverTargetName = quest->GetQuestGiverTargetName();
779 std::string questTurnTextWindow = quest->GetQuestTurnTextWindow();
780 std::string questTurnTargetName = quest->GetQuestTurnTargetName();
781
782 int32 locale = _session->GetSessionDbLocaleIndex();
783 if (locale >= 0)
784 {
785 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
786 {
787 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
788 ObjectMgr::GetLocaleString(localeData->OfferRewardText, locale, questOfferRewardText);
789 ObjectMgr::GetLocaleString(localeData->QuestGiverTextWindow, locale, questGiverTextWindow);
790 ObjectMgr::GetLocaleString(localeData->QuestGiverTargetName, locale, questGiverTargetName);
791 ObjectMgr::GetLocaleString(localeData->QuestTurnTextWindow, locale, questTurnTextWindow);
792 ObjectMgr::GetLocaleString(localeData->QuestTurnTargetName, locale, questTurnTargetName);
793 }
794 }
795
796 uint32 QuestTakerEntry = 0;
797
798 if (npcGuid)
800 if (l_Object->hasInvolvedQuest(quest->GetQuestId()))
801 QuestTakerEntry = l_Object->GetEntry();
802
804 AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
805
806 uint32 rewItemDisplayId[QUEST_REWARDS_COUNT] = { };
807 for (uint8 i = 0; i < QUEST_REWARDS_COUNT; i++)
808 {
809 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardItemId[i]))
810 rewItemDisplayId[i] = itemTemplate->DisplayInfoID;
811 }
812
813 uint32 rewChoiceItemDisplayId[QUEST_REWARD_CHOICES_COUNT] = { };
814 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; i++)
815 {
816 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[i]))
817 rewChoiceItemDisplayId[i] = itemTemplate->DisplayInfoID;
818 }
819
820 uint32 rewEmoteCount = 0;
821 for (uint8 i = 0; i < QUEST_EMOTE_COUNT; i++)
822 {
823 if (quest->OfferRewardEmote[i] <= 0)
824 break;
825
826 rewEmoteCount++;
827 }
828
829 ObjectGuid QuestGiverGUID = npcGuid;
830
831 WorldPacket data(SMSG_QUESTGIVER_OFFER_REWARD, 50); // guess size
832 data << uint32(quest->RewardItemIdCount[2]);
833 data << uint32(quest->GetQuestId());
834 data << uint32(quest->RewardItemId[3]);
835 data << uint32(rewChoiceItemDisplayId[2]);
836
837 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; i++)
838 {
839 data << uint32(quest->RewardFactionId[i]);
840 data << uint32(quest->RewardFactionValueId[i]);
841 data << uint32(quest->RewardFactionValueIdOverride[i]);
842 }
843
844 data << uint32(quest->RewardItemIdCount[0]);
845 data << uint32(quest->RewardItemIdCount[3]);
846 data << uint32(rewItemDisplayId[3]);
847 data << uint32(quest->RewardItemId[1]);
848 data << uint32(quest->RewardChoiceItemId[3]);
849 data << uint32(rewChoiceItemDisplayId[3]);
850 data << uint32(quest->GetRewChoiceItemsCount());
851 data << uint32(quest->GetRewSpellCast());
852 data << uint32(rewItemDisplayId[1]);
853 data << uint32(quest->RewardChoiceItemCount[5]);
854 data << uint32(rewChoiceItemDisplayId[4]);
855 data << uint32(quest->RewardChoiceItemCount[1]);
856 data << uint32(rewChoiceItemDisplayId[0]);
857 data << uint32(rewItemDisplayId[0]);
858 data << uint32(quest->GetRewardPackageItemId());
859 data << uint32(quest->GetQuestTurnInPortrait());
860 data << uint32(quest->RewardItemIdCount[1]);
861 data << uint32(quest->GetRewardReputationMask());
862 data << uint32(quest->RewardChoiceItemId[0]);
863 data << uint32(quest->RewardChoiceItemCount[3]);
864 data << uint32(quest->RewardChoiceItemCount[4]);
865 data << uint32(quest->RewardChoiceItemId[1]);
866 data << uint32(quest->GetBonusTalents());
867 data << uint32(quest->GetRewardSkillId());
868
869 for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; i++)
870 {
871 data << uint32(quest->RewardCurrencyId[i]);
872 data << uint32(quest->RewardCurrencyCount[i]);
873 }
874
875 data << uint32(quest->GetFlags());
876 data << uint32(quest->GetFlags2());
877 data << uint32(quest->XPValue(_session->GetPlayer()) * sWorld->getRate(Rates::RATE_XP_QUEST));
878 data << uint32(quest->GetCharTitleId());
879 data << uint32(quest->RewardChoiceItemId[2]);
880 data << uint32(quest->GetRewItemsCount());
881 data << uint32(quest->GetSuggestedPlayers());
882 data << uint32(quest->RewardChoiceItemId[4]);
883 data << uint32(QuestTakerEntry); // ender NPC or GO entry
884 data << uint32(quest->RewardItemId[2]);
885 data << uint32(quest->RewardChoiceItemCount[0]);
886 data << uint32(rewChoiceItemDisplayId[5]);
887 data << uint32(quest->GetQuestGiverPortrait());
888 data << uint32(quest->GetRewMoney());
889 data << uint32(quest->RewardChoiceItemId[5]);
890 data << uint32(rewChoiceItemDisplayId[1]);
891 data << uint32(quest->RewardChoiceItemCount[2]);
892 data << uint32(rewItemDisplayId[2]);
893 data << uint32(quest->GetRewSpell());
894 data << uint32(quest->RewardItemId[0]);
895 data << uint32(quest->GetRewardSkillPoints());
896
897 data.WriteBits(questTurnTextWindow.size(), 10);
898 data.WriteBits(questGiverTargetName.size(), 8);
899
900 data.WriteGuidMask(QuestGiverGUID, 6);
901
902 data.WriteBits(rewEmoteCount, 21);
903
904 data.WriteGuidMask(QuestGiverGUID, 3, 7);
905
906 data.WriteBits(questTitle.size(), 9);
907
908 data.WriteGuidMask(QuestGiverGUID, 4);
909
910 data.WriteBits(questTurnTargetName.size(), 8);
911 data.WriteBits(questGiverTextWindow.size(), 10);
912 data.WriteBits(questOfferRewardText.size(), 12);
913
914 data.WriteGuidMask(QuestGiverGUID, 1, 2, 0, 5);
915
916 data.WriteBit(enableNext);
917
918 data.FlushBits();
919
920 data.WriteString(questGiverTargetName);
921 data.WriteString(questTitle);
922
923 for (uint8 i = 0; i < rewEmoteCount; i++)
924 {
925 data << uint32(quest->OfferRewardEmoteDelay[i]);
926 data << uint32(quest->OfferRewardEmote[i]);
927 }
928
929 data.WriteGuidBytes(QuestGiverGUID, 2);
930
931 data.WriteString(questOfferRewardText);
932 data.WriteString(questTurnTextWindow);
933 data.WriteString(questTurnTargetName);
934
935 data.WriteGuidBytes(QuestGiverGUID, 5, 1);
936
937 data.WriteString(questGiverTextWindow);
938
939 data.WriteGuidBytes(QuestGiverGUID, 0, 7, 6, 4, 3);
940
941 _session->SendPacket(&data);
942
943 SF_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u", GUID_LOPART(npcGuid), quest->GetQuestId());
944}
945
946void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, uint64 npcGuid, bool canComplete, bool closeOnCancel) const
947{
948 // We can always call to RequestItems, but this packet only goes out if there are actually
949 // items. Otherwise, we'll skip straight to the OfferReward
950
952 if (!itemCounter && canComplete)
953 {
954 SendQuestGiverOfferReward(quest, npcGuid, true);
955 return;
956 }
957
958 std::string questTitle = quest->GetTitle();
959 std::string requestItemsText = quest->GetRequestItemsText();
960
961 int32 locale = _session->GetSessionDbLocaleIndex();
962 if (locale >= 0)
963 {
964 if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
965 {
966 ObjectMgr::GetLocaleString(localeData->Title, locale, questTitle);
967 ObjectMgr::GetLocaleString(localeData->RequestItemsText, locale, requestItemsText);
968 }
969 }
970
971 uint32 QuestTakerEntry = 0;
972
973 if (npcGuid)
975 if (l_Object->hasInvolvedQuest(quest->GetQuestId()))
976 QuestTakerEntry = l_Object->GetEntry();
977
978 uint32 requiredMoney = 0;
979 ByteBuffer currencyData, itemData;
980
981 for (QuestObjectiveSet::const_iterator citr = quest->m_questObjectives.begin(); citr != quest->m_questObjectives.end(); ++citr)
982 {
983 QuestObjective const* questObjective = *citr;
984 switch (questObjective->Type)
985 {
987 {
988 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(questObjective->ObjectId))
989 itemData << uint32(itemTemplate->DisplayInfoID);
990 else
991 itemData << uint32(0);
992
993 itemData << uint32(questObjective->ObjectId);
994 itemData << uint32(questObjective->Amount);
995
996 break;
997 }
999 {
1000 currencyData << uint32(questObjective->ObjectId);
1001 currencyData << uint32(questObjective->Amount);
1002
1003 break;
1004 }
1006 {
1007 requiredMoney = questObjective->Amount;
1008 break;
1009 }
1010 default:
1011 break;
1012 }
1013 }
1014
1016 AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
1017
1018 ObjectGuid QuestGiverGUID = npcGuid;
1020
1021 WorldPacket data(SMSG_QUESTGIVER_REQUEST_ITEMS, 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 1 + 8 + 8 +
1022 questTitle.size() + requestItemsText.size() + itemCounter * (4 + 4 + 4) + currencyCounter * (4 + 4));
1023
1024 data << uint32(quest->GetSuggestedPlayers());
1025 data << uint32(quest->GetFlags());
1026 data << uint32(quest->OfferRewardEmoteDelay[0]);
1027 data << uint32(canComplete ? 0x5F : 0x5B);
1028 data << uint32(requiredMoney);
1029 data << uint32(QuestTakerEntry); // quest starter NPC/GO entry
1030 data << uint32(quest->GetFlags2());
1031 data << uint32(canComplete ? quest->GetCompleteEmote() : quest->GetIncompleteEmote());
1032 data << uint32(quest->GetQuestId());
1033
1034 data.WriteBits(currencyCounter, 21);
1035 data.WriteBit(closeOnCancel);
1036
1037 data.WriteGuidMask(QuestGiverGUID, 2, 5, 1);
1038
1039 data.WriteBits(questTitle.size(), 9);
1040 data.WriteBits(requestItemsText.size(), 12);
1041
1042 data.WriteGuidMask(QuestGiverGUID, 6, 0);
1043
1044 data.WriteBits(itemCounter, 20);
1045
1046 data.WriteGuidMask(QuestGiverGUID, 4, 7, 3);
1047
1048 data.FlushBits();
1049
1050 data.WriteGuidBytes(QuestGiverGUID, 0, 2);
1051
1052 data.WriteString(questTitle);
1053
1054 data.append(currencyData);
1055 data.append(itemData);
1056
1057 data.WriteGuidBytes(QuestGiverGUID, 3, 1);
1058
1059 data.WriteString(requestItemsText);
1060
1061 data.WriteGuidBytes(QuestGiverGUID, 4, 5, 7, 6);
1062
1063 _session->SendPacket(&data);
1064
1065 SF_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u", GUID_LOPART(npcGuid), quest->GetQuestId());
1066}
1067
1068void PlayerMenu::AddQuestLevelToTitle(std::string& title, int32 level)
1069{
1070 // Adds the quest level to the front of the quest title
1071 // example: [13] Westfall Stew
1072
1073 std::stringstream questTitlePretty;
1074 questTitlePretty << "[" << level << "] " << title;
1075 title = questTitlePretty.str();
1076}
@ LOCALE_enUS
Definition Common.h:139
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::int8_t int8
Definition Define.h:75
std::uint64_t uint64
Definition Define.h:76
#define ASSERT
Definition Errors.h:29
#define GOSSIP_MAX_MENU_ITEMS
Definition GossipDef.h:15
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
@ TYPEMASK_ITEM
Definition Object.h:38
@ TYPEMASK_UNIT
Definition Object.h:40
@ TYPEMASK_GAMEOBJECT
Definition Object.h:42
uint32 GUID_LOPART(uint64 x)
uint32 MAKE_PAIR32(uint16 l, uint16 h)
#define sObjectMgr
Definition ObjectMgr.h:1617
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition ObjectMgr.h:555
#define QUEST_REWARDS_COUNT
Definition QuestDef.h:26
@ QUEST_OBJECTIVE_TYPE_CURRENCY
Definition QuestDef.h:197
@ QUEST_OBJECTIVE_TYPE_ITEM
Definition QuestDef.h:194
@ QUEST_OBJECTIVE_TYPE_MONEY
Definition QuestDef.h:201
#define QUEST_EMOTE_COUNT
Definition QuestDef.h:29
#define QUEST_REWARD_CURRENCY_COUNT
Definition QuestDef.h:30
@ QUEST_FLAGS_HIDE_REWARD
Definition QuestDef.h:124
#define QUEST_REPUTATIONS_COUNT
Definition QuestDef.h:28
#define QUEST_REWARD_CHOICES_COUNT
Definition QuestDef.h:25
void WriteGuidBytes(const ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:264
bool WriteBit(uint32 bit)
Definition ByteBuffer.h:164
void WriteGuidMask(const ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:248
size_t bitwpos() const
Returns position of last written bit.
Definition ByteBuffer.h:492
void WriteString(std::string const &str)
Definition ByteBuffer.h:578
void append(T value)
Definition ByteBuffer.h:147
void PutBits(size_t pos, T value, uint32 bitCount)
Definition ByteBuffer.h:283
void WriteBits(T value, size_t bits)
Definition ByteBuffer.h:192
void FlushBits()
Definition ByteBuffer.h:154
GossipMenuItemContainer _menuItems
Definition GossipDef.h:206
LocaleConstant GetLocale() const
Definition GossipDef.h:162
uint32 GetMenuItemAction(uint32 menuItemId) const
void AddMenuItem(int32 menuItemId, uint8 icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition GossipDef.cpp:14
GossipMenuItemDataContainer _menuItemData
Definition GossipDef.h:207
uint32 GetMenuItemSender(uint32 menuItemId) const
Definition GossipDef.cpp:95
bool IsMenuItemCoded(uint32 menuItemId) const
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition GossipDef.cpp:87
void ClearMenu()
static Object * GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask)
static void GetLocaleString(const StringVector &data, int loc_idx, std::string &value)
Definition ObjectMgr.h:1353
void SendGossipMenu(uint32 titleTextId, uint64 objectGUID) const
void SendPointOfInterest(uint32 poiId) const
QuestMenu _questMenu
Definition GossipDef.h:279
void SendQuestGiverStatus(uint32 questStatus, uint64 npcGUID) const
void SendQuestGiverQuestList(QEmote eEmote, const std::string &Title, uint64 npcGUID)
void ClearMenus()
PlayerMenu(WorldSession *session)
GossipMenu _gossipMenu
Definition GossipDef.h:278
void SendQuestGiverQuestDetails(Quest const *quest, uint64 npcGUID, bool activateAccept, bool displayPopup=false) const
static void AddQuestLevelToTitle(std::string &title, int32 level)
void SendQuestQueryResponse(Quest const *quest) const
WorldSession * _session
Definition GossipDef.h:280
void SendQuestGiverRequestItems(Quest const *quest, uint64 npcGUID, bool canComplete, bool closeOnCancel) const
void SendQuestGiverOfferReward(Quest const *quest, uint64 npcGUID, bool enableNext) const
void SendCloseGossip() const
bool HasFlag(uint32 flag) const
Definition QuestDef.h:261
uint32 DetailsEmote[QUEST_EMOTE_COUNT]
Definition QuestDef.h:358
uint32 OfferRewardEmote[QUEST_EMOTE_COUNT]
Definition QuestDef.h:360
uint32 GetRewSpell() const
Definition QuestDef.h:312
uint32 GetRewMoneyMaxLevel() const
Definition QuestDef.cpp:186
uint32 RewardCurrencyCount[QUEST_REWARD_CURRENCY_COUNT]
Definition QuestDef.h:364
uint32 GetRewardSkillId() const
Definition QuestDef.h:331
uint32 GetSoundAccept() const
Definition QuestDef.h:320
std::string const & GetQuestGiverTargetName() const
Definition QuestDef.h:305
std::string const & GetEndText() const
Definition QuestDef.h:302
float GetPointX() const
Definition QuestDef.h:317
float GetPointY() const
Definition QuestDef.h:318
uint32 RequiredSourceItemId[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:349
uint32 GetCharTitleId() const
Definition QuestDef.h:291
std::string const & GetRequestItemsText() const
Definition QuestDef.h:301
uint32 XPValue(Player *player) const
Definition QuestDef.cpp:150
uint8 GetQuestObjectiveCountType(uint8 type) const
Definition QuestDef.cpp:320
uint32 RewardItemIdCount[QUEST_REWARDS_COUNT]
Definition QuestDef.h:354
uint32 GetMinLevel() const
Definition QuestDef.h:273
std::string const & GetObjectives() const
Definition QuestDef.h:299
uint32 GetPointMapId() const
Definition QuestDef.h:316
uint32 GetRewardReputationMask() const
Definition QuestDef.h:333
uint32 RewardChoiceItemId[QUEST_REWARD_CHOICES_COUNT]
Definition QuestDef.h:351
uint32 GetQuestGiverPortrait() const
Definition QuestDef.h:334
uint32 GetQuestTurnInPortrait() const
Definition QuestDef.h:335
int32 RewardFactionValueIdOverride[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:357
uint32 DetailsEmoteDelay[QUEST_EMOTE_COUNT]
Definition QuestDef.h:359
std::string const & GetDetails() const
Definition QuestDef.h:298
bool IsRepeatable() const
Definition QuestDef.h:324
int32 GetZoneOrSort() const
Definition QuestDef.h:272
int32 GetQuestLevel() const
Definition QuestDef.h:275
float GetRewHonorMultiplier() const
Definition QuestDef.h:310
uint32 GetRewHonorAddition() const
Definition QuestDef.h:309
uint32 RewardChoiceItemCount[QUEST_REWARD_CHOICES_COUNT]
Definition QuestDef.h:352
uint32 GetFlags() const
Definition QuestDef.h:327
std::string const & GetQuestTurnTargetName() const
Definition QuestDef.h:307
std::string const & GetCompletedText() const
Definition QuestDef.h:303
std::string const & GetQuestTurnTextWindow() const
Definition QuestDef.h:306
uint32 OfferRewardEmoteDelay[QUEST_EMOTE_COUNT]
Definition QuestDef.h:361
uint32 GetQuestId() const
Definition QuestDef.h:270
uint32 RequiredSourceItemCount[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:350
QuestObjectiveSet m_questObjectives
Definition QuestDef.h:378
uint32 GetType() const
Definition QuestDef.h:276
int32 GetRewMoney() const
Definition QuestDef.cpp:181
uint32 GetPointOpt() const
Definition QuestDef.h:319
std::string const & GetOfferRewardText() const
Definition QuestDef.h:300
uint32 RewardCurrencyId[QUEST_REWARD_CURRENCY_COUNT]
Definition QuestDef.h:363
uint32 GetXPId() const
Definition QuestDef.h:294
uint32 GetSoundTurnIn() const
Definition QuestDef.h:321
uint32 GetFlags2() const
Definition QuestDef.h:328
uint32 GetRewItemsCount() const
Definition QuestDef.h:367
uint32 GetRewChoiceItemsCount() const
Definition QuestDef.h:366
uint32 GetIncompleteEmote() const
Definition QuestDef.h:322
uint32 GetSrcItemId() const
Definition QuestDef.h:295
uint32 RewardFactionId[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:355
std::string const & GetTitle() const
Definition QuestDef.h:297
uint32 GetCompleteEmote() const
Definition QuestDef.h:323
int32 RewardFactionValueId[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:356
int32 GetRewSpellCast() const
Definition QuestDef.h:313
std::string const & GetQuestGiverTextWindow() const
Definition QuestDef.h:304
uint32 GetRewardPackageItemId() const
Definition QuestDef.h:370
uint32 RewardItemId[QUEST_REWARDS_COUNT]
Definition QuestDef.h:353
uint32 GetBonusTalents() const
Definition QuestDef.h:292
uint32 GetQuestMethod() const
Definition QuestDef.h:271
uint32 GetRewardSkillPoints() const
Definition QuestDef.h:332
uint32 GetNextQuestInChain() const
Definition QuestDef.h:290
uint32 GetSuggestedPlayers() const
Definition QuestDef.h:285
QuestMenuItemList _questMenuItems
Definition GossipDef.h:239
bool HasItem(uint32 questId) const
void ClearMenu()
void AddMenuItem(uint32 QuestId, uint8 Icon)
Player session in the World.
@ SMSG_QUESTGIVER_QUEST_LIST
Definition Opcodes.h:903
@ SMSG_GOSSIP_MESSAGE
Definition Opcodes.h:669
@ SMSG_QUESTGIVER_STATUS
Definition Opcodes.h:905
@ SMSG_GOSSIP_POI
Definition Opcodes.h:670
@ SMSG_QUESTGIVER_REQUEST_ITEMS
Definition Opcodes.h:904
@ SMSG_GOSSIP_COMPLETE
Definition Opcodes.h:668
@ SMSG_QUESTGIVER_QUEST_DETAILS
Definition Opcodes.h:900
@ SMSG_QUEST_QUERY_RESPONSE
Definition Opcodes.h:916
@ SMSG_QUESTGIVER_OFFER_REWARD
Definition Opcodes.h:898
#define sWorld
Definition World.h:910
@ CONFIG_UI_QUESTLEVELS_IN_DIALOGS
Definition World.h:162
@ RATE_XP_QUEST
Definition World.h:398
uint32 GossipActionMenuId
Definition GossipDef.h:134
uint32 OptionType
Definition GossipDef.h:124
std::string BoxMessage
Definition GossipDef.h:125
uint32 BoxMoney
Definition GossipDef.h:126
uint8 MenuItemIcon
Definition GossipDef.h:120
std::string Message
Definition GossipDef.h:122
std::string icon_name
Definition ObjectMgr.h:523
uint32 _Emote
Definition NPCHandler.h:12
uint32 _Delay
Definition NPCHandler.h:13
uint32 QuestId
Definition GossipDef.h:144
uint8 QuestIcon
Definition GossipDef.h:145
std::string Description
Definition QuestDef.h:245
VisualEffectVec VisualEffects
Definition QuestDef.h:246
uint32 ObjectId
Definition QuestDef.h:242