57 auto itr = std::max_element(bounds.
begin(), bounds.
end(), [](GossipMenuItemsContainer::value_type
const& a, GossipMenuItemsContainer::value_type
const& b)
59 return a.second.OrderIndex < b.second.OrderIndex;
61 if (itr != bounds.
end())
62 orderIndex = itr->second.OrderIndex + 1;
67 for (GossipMenuItemContainer::const_iterator itr =
_menuItems.begin(); itr !=
_menuItems.end(); ++itr)
69 if (
int32(itr->OrderIndex) > orderIndex)
72 orderIndex = itr->OrderIndex + 1;
82 return int32(item.OrderIndex) < index;
95 menuItem.
BoxText = std::move(boxText);
119 auto itr = std::find_if(bounds.
begin(), bounds.
end(), [menuItemId](std::pair<uint32 const, GossipMenuItems>
const& itemPair)
121 return itemPair.second.OrderIndex == menuItemId;
124 if (itr == bounds.
end())
133 std::string strOptionText, strBoxText;
138 if (optionBroadcastText)
151 if (boxBroadcastText)
172 return item.GossipOptionID == gossipOptionId;
185 return item.OrderIndex == orderIndex;
263 opt.
Flags = item.Flags;
265 opt.
Text = item.OptionText;
286 text.
Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
316 if (!pointOfInterest)
318 TC_LOG_ERROR(
"sql.sql",
"Request to send non-existing PointOfInterest (Id: {}), ignored.",
id);
323 packet.
ID = pointOfInterest->
ID;
324 packet.
Name = pointOfInterest->
Name;
332 packet.
Pos = pointOfInterest->
Pos;
333 packet.
Icon = pointOfInterest->
Icon;
360 questMenuItem.
QuestId = QuestId;
369 if (i->QuestId == questId)
392 questList.
Greeting = questGreeting->Text;
414 text.
Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
426 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE NPC={}", guid.
ToString());
454 std::string_view content = text.Text[LOCALE_enUS];
455 ObjectMgr::GetLocaleString(text.Text, localeConstant, content);
456 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
473 packet.QuestGiverGUID = npcGUID;
474 packet.InformUnit = _session->GetPlayer()->GetPlayerSharingQuest();
475 packet.QuestID = quest->GetQuestId();
476 packet.QuestPackageID = quest->GetQuestPackageID();
477 packet.PortraitGiver = quest->GetQuestGiverPortrait();
478 packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
479 packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
480 packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
481 packet.QuestSessionBonus = 0;
482 packet.AutoLaunched = autoLaunched;
483 packet.DisplayPopup = displayPopup;
485 packet.QuestFlags[1] = quest->GetFlagsEx();
486 packet.QuestFlags[2] = quest->GetFlagsEx2();
487 packet.SuggestedPartyMembers = quest->GetSuggestedPlayers();
491 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
497 packet.LearnSpells.push_back(spellEffectInfo.TriggerSpell);
499 quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer());
504 packet.DescEmotes[i].Type = quest->DetailsEmote[i];
505 packet.DescEmotes[i].Delay = quest->DetailsEmoteDelay[i];
509 packet.Objectives.resize(objs.size());
510 for (
uint32 i = 0; i < objs.size(); ++i)
512 packet.Objectives[i].ID = objs[i].ID;
513 packet.Objectives[i].ObjectID = objs[i].ObjectID;
514 packet.Objectives[i].Amount = objs[i].Amount;
515 packet.Objectives[i].Type = objs[i].Type;
518 _session->SendPacket(packet.Write());
520 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUEST_GIVER_QUEST_DETAILS NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
550 std::string_view content = text.Text[LOCALE_enUS];
551 ObjectMgr::GetLocaleString(text.Text, locale, content);
552 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
572 quest->BuildQuestRewards(offer.
Rewards, _session->GetPlayer());
578 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
582 offer.
QuestID = quest->GetQuestId();
587 offer.
Emotes.emplace_back(quest->OfferRewardEmote[i], quest->OfferRewardEmoteDelay[i]);
593 packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
594 packet.PortraitGiver = quest->GetQuestGiverPortrait();
595 packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
596 packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
597 packet.QuestPackageID = quest->GetQuestPackageID();
599 _session->SendPacket(packet.Write());
600 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
622 std::string_view content = text.Text[LOCALE_enUS];
623 ObjectMgr::GetLocaleString(text.Text, locale, content);
624 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
636 packet.QuestGiverGUID = npcGUID;
640 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
642 packet.QuestID = quest->GetQuestId();
646 packet.CompEmoteDelay = quest->GetCompleteEmoteDelay();
647 packet.CompEmoteType = quest->GetCompleteEmote();
651 packet.CompEmoteDelay = quest->GetIncompleteEmoteDelay();
652 packet.CompEmoteType = quest->GetIncompleteEmote();
655 packet.QuestFlags[0] = quest->GetFlags();
656 packet.QuestFlags[1] = quest->GetFlagsEx();
657 packet.QuestFlags[2] = quest->GetFlagsEx2();
658 packet.SuggestPartyMembers = quest->GetSuggestedPlayers();
662 packet.StatusFlags = canComplete ? 0xFF : 0xFD;
664 packet.MoneyToGet = 0;
670 packet.Collect.emplace_back(obj.ObjectID, obj.Amount, obj.Flags);
673 packet.Currency.emplace_back(obj.ObjectID, obj.Amount);
676 packet.MoneyToGet += obj.Amount;
683 packet.AutoLaunched = autoLaunched;
685 _session->SendPacket(packet.Write());
686 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
#define GOSSIP_MAX_MENU_ITEMS
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
std::vector< QuestObjective > QuestObjectives
@ QUEST_OBJECTIVE_CURRENCY
#define QUEST_EMOTE_COUNT
@ SPELL_EFFECT_LEARN_SPELL
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
static char const * GetBroadcastTextValue(BroadcastTextEntry const *broadcastText, LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false)
std::string ToString() const
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
static ObjectGuid GetGUID(Object const *o)
std::string const & GetPortraitGiverName() const
bool HasQuestObjectiveType(QuestObjectiveType type) const
std::string const & GetPortraitTurnInName() const
std::string const & GetRequestItemsText() const
WorldPacket BuildQueryData(LocaleConstant loc, Player *player) const
std::string const & GetLogTitle() const
uint32 GetQuestId() const
std::string const & GetPortraitGiverText() const
std::vector< QuestConditionalText > const & GetConditionalOfferRewardText() const
std::array< WorldPacket, TOTAL_LOCALES > QueryData
std::string const & GetPortraitTurnInText() const
std::string const & GetOfferRewardText() const
std::vector< QuestConditionalText > const & GetConditionalRequestItemsText() const
std::string const & GetLogDescription() const
std::string const & GetQuestDescription() const
std::vector< QuestConditionalText > const & GetConditionalQuestDescription() const
Utility class to enable range for loop syntax for multimap.equal_range uses.
constexpr end_iterator end() const
constexpr iterator begin() const
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< ClientGossipOptions > GossipOptions
Optional< int32 > BroadcastTextID
std::vector< ClientGossipText > GossipText
int32 FriendshipFactionID
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > Pos
std::string PortraitTurnInName
std::string PortraitGiverText
std::string PortraitTurnInText
std::string PortraitGiverName
std::vector< ConditionalQuestText > ConditionalRewardText
std::string PortraitGiverText
std::string PortraitTurnInText
std::string PortraitTurnInName
std::string DescriptionText
std::string PortraitGiverName
std::vector< ConditionalQuestText > ConditionalDescriptionText
std::string LogDescription
ObjectGuid QuestGiverGUID
std::vector< NPC::ClientGossipText > QuestDataText
WorldPacket const * Write() override
std::vector< ConditionalQuestText > ConditionalCompletionText
std::string CompletionText
QuestGiverInfo QuestGiver
WorldPacket const * Write() override
Player session in the World.
LocaleConstant GetSessionDbLocaleIndex() const
Player * GetPlayer() const
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
@ CONFIG_QUEST_IGNORE_AUTO_ACCEPT
@ CONFIG_CACHE_DATA_QUERIES
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomWeightedContainerElement(C const &container, std::span< double > const &weights) -> decltype(std::begin(container))
Optional< int32 > OverrideIconID
GossipOptionNpc OptionNPC
Optional< int32 > SpellID
GossipOptionStatus Status
::QuestGiverStatus Status
int32 SuggestedPartyMembers
std::vector< QuestDescEmote > Emotes
int32 QuestGiverCreatureID
ObjectGuid QuestGiverGUID