57 auto itr = std::ranges::max_element(bounds, std::ranges::less(),
58 [](GossipMenuItemsContainer::value_type
const& a) {
return a.second.OrderIndex; });
60 if (itr != bounds.
end())
61 orderIndex = itr->second.OrderIndex + 1;
66 if (
int32(_menuItem.OrderIndex) > orderIndex)
69 orderIndex = _menuItem.OrderIndex + 1;
88 menuItem.
BoxText = std::move(boxText);
112 auto itr = std::ranges::find(bounds, menuItemId,
113 [](std::pair<uint32 const, GossipMenuItems>
const& itemPair) {
return itemPair.second.OrderIndex; });
115 if (itr == bounds.
end())
124 std::string strOptionText, strBoxText;
129 if (optionBroadcastText)
142 if (boxBroadcastText)
196 return item->BoxCoded;
245 opt.
Flags = item.Flags;
247 opt.
Text = item.OptionText;
271 text.
Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
274 text.
Meta = quest->IsMeta();
303 if (!pointOfInterest)
305 TC_LOG_ERROR(
"sql.sql",
"Request to send non-existing PointOfInterest (Id: {}), ignored.",
id);
310 packet.
ID = pointOfInterest->
ID;
311 packet.
Name = pointOfInterest->
Name;
319 packet.
Pos = pointOfInterest->
Pos;
320 packet.
Icon = pointOfInterest->
Icon;
347 questMenuItem.
QuestId = QuestId;
364 _responses.push_back({ .Id = id, .ClientIdentifier = clientIdentifier });
397 _data.emplace<std::monostate>();
420 questList.
Greeting = questGreeting->Text;
444 text.
Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
447 text.
Meta = quest->IsMeta();
458 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE NPC={}", guid.
ToString());
488 std::string_view content = text.Text[LOCALE_enUS];
489 ObjectMgr::GetLocaleString(text.Text, localeConstant, content);
490 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
507 packet.QuestGiverGUID = npcGUID;
508 packet.InformUnit = _session->GetPlayer()->GetPlayerSharingQuest();
509 packet.QuestID = quest->GetQuestId();
510 packet.QuestPackageID = quest->GetQuestPackageID();
511 packet.PortraitGiver = quest->GetQuestGiverPortrait();
512 packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
513 packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
514 packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
515 packet.QuestInfoID = quest->GetQuestInfoID();
516 packet.QuestSessionBonus = 0;
517 packet.AutoLaunched = autoLaunched;
518 packet.ResetByScheduler = quest->IsResetByScheduler();
519 packet.DisplayPopup = displayPopup;
521 packet.QuestFlags[1] = quest->GetFlagsEx();
522 packet.QuestFlags[2] = quest->GetFlagsEx2();
523 packet.QuestFlags[3] = quest->GetFlagsEx3();
524 packet.SuggestedPartyMembers = quest->GetSuggestedPlayers();
528 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
534 packet.LearnSpells.push_back(spellEffectInfo.TriggerSpell);
536 quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer());
541 packet.DescEmotes[i].Type = quest->DetailsEmote[i];
542 packet.DescEmotes[i].Delay = quest->DetailsEmoteDelay[i];
546 packet.Objectives.resize(objs.size());
547 for (
uint32 i = 0; i < objs.size(); ++i)
549 packet.Objectives[i].ID = objs[i].ID;
550 packet.Objectives[i].Type = objs[i].Type;
551 packet.Objectives[i].ObjectID = objs[i].ObjectID;
552 packet.Objectives[i].Amount = objs[i].Amount;
555 _session->SendPacket(packet.Write());
557 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUEST_GIVER_QUEST_DETAILS NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
589 std::string_view content = text.Text[LOCALE_enUS];
590 ObjectMgr::GetLocaleString(text.Text, locale, content);
591 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
611 quest->BuildQuestRewards(offer.
Rewards, _session->GetPlayer());
617 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
621 offer.
QuestID = quest->GetQuestId();
628 offer.
Emotes.emplace_back(quest->OfferRewardEmote[i], quest->OfferRewardEmoteDelay[i]);
635 packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
636 packet.PortraitGiver = quest->GetQuestGiverPortrait();
637 packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
638 packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
639 packet.QuestPackageID = quest->GetQuestPackageID();
641 _session->SendPacket(packet.Write());
642 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
666 std::string_view content = text.Text[LOCALE_enUS];
667 ObjectMgr::GetLocaleString(text.Text, locale, content);
668 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
680 packet.QuestGiverGUID = npcGUID;
684 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
686 packet.QuestID = quest->GetQuestId();
690 packet.CompEmoteDelay = quest->GetCompleteEmoteDelay();
691 packet.CompEmoteType = quest->GetCompleteEmote();
695 packet.CompEmoteDelay = quest->GetIncompleteEmoteDelay();
696 packet.CompEmoteType = quest->GetIncompleteEmote();
699 packet.QuestFlags[0] = quest->GetFlags();
700 packet.QuestFlags[1] = quest->GetFlagsEx();
701 packet.QuestFlags[2] = quest->GetFlagsEx2();
702 packet.QuestFlags[3] = quest->GetFlagsEx3();
703 packet.SuggestPartyMembers = quest->GetSuggestedPlayers();
704 packet.QuestInfoID = quest->GetQuestInfoID();
708 packet.StatusFlags = canComplete ? 0xFF : 0xFD;
710 packet.MoneyToGet = 0;
716 packet.Collect.emplace_back(obj.ObjectID, obj.Amount, obj.Flags);
719 packet.Currency.emplace_back(obj.ObjectID, obj.Amount);
722 packet.MoneyToGet += obj.Amount;
729 packet.AutoLaunched = autoLaunched;
730 packet.ResetByScheduler = quest->IsResetByScheduler();
732 _session->SendPacket(packet.Write());
733 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__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
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)
ObjectGuid const & GetGUID() const
static char const * GetBroadcastTextValue(BroadcastTextEntry const *broadcastText, LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false)
void StartInteraction(ObjectGuid target, PlayerInteractionType type)
PlayerInteractionType Type
InteractionData & operator=(InteractionData const &other)
std::variant< std::monostate, TrainerData, PlayerChoiceData > _data
std::string ToString() const
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
void AddResponse(uint32 id, uint16 clientIdentifier)
std::vector< Response > _responses
Optional< uint32 > FindIdByClientIdentifier(uint16 clientIdentifier) const
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::string const & GetPortraitTurnInText() const
std::string const & GetOfferRewardText() const
std::vector< QuestConditionalText > const & GetConditionalRequestItemsText() const
std::string const & GetLogDescription() const
std::unique_ptr< WorldPacket[]> QueryData
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
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_view PortraitGiverName
std::string_view RewardText
std::string_view PortraitTurnInName
std::string_view PortraitGiverText
std::string_view PortraitTurnInText
std::string_view QuestTitle
std::vector< ConditionalQuestText > ConditionalRewardText
std::string_view PortraitTurnInName
std::string_view PortraitGiverName
std::string_view DescriptionText
std::string_view LogDescription
std::string_view PortraitTurnInText
std::string_view QuestTitle
std::string_view PortraitGiverText
std::vector< ConditionalQuestText > ConditionalDescriptionText
ObjectGuid QuestGiverGUID
std::vector< NPC::ClientGossipText > QuestDataText
std::string_view Greeting
WorldPacket const * Write() override
std::string_view QuestTitle
std::vector< ConditionalQuestText > ConditionalCompletionText
std::string_view 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
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomWeightedContainerElement(C const &container, std::span< double > const &weights) -> decltype(std::ranges::begin(container))
struct advstd::ranges::Contains contains
Optional< int32 > OverrideIconID
GossipOptionNpc OptionNPC
Optional< int32 > SpellID
GossipOptionStatus Status
std::string_view QuestTitle
std::array< int32, 4 > QuestFlags
::QuestGiverStatus Status
int32 SuggestedPartyMembers
std::vector< QuestDescEmote > Emotes
int32 QuestGiverCreatureID
std::array< int32, 4 > QuestFlags
ObjectGuid QuestGiverGUID