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;
270 text.
Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
273 text.
Meta = quest->IsMeta();
302 if (!pointOfInterest)
304 TC_LOG_ERROR(
"sql.sql",
"Request to send non-existing PointOfInterest (Id: {}), ignored.",
id);
309 packet.
ID = pointOfInterest->
ID;
310 packet.
Name = pointOfInterest->
Name;
318 packet.
Pos = pointOfInterest->
Pos;
319 packet.
Icon = pointOfInterest->
Icon;
346 questMenuItem.
QuestId = QuestId;
363 _responses.push_back({ .Id = id, .ClientIdentifier = clientIdentifier });
396 _data.emplace<std::monostate>();
419 questList.
Greeting = questGreeting->Text;
443 text.
Repeatable = quest->IsTurnIn() && quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly();
446 text.
Meta = quest->IsMeta();
457 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE NPC={}", guid.
ToString());
487 std::string_view content = text.Text[LOCALE_enUS];
488 ObjectMgr::GetLocaleString(text.Text, localeConstant, content);
489 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
506 packet.QuestGiverGUID = npcGUID;
507 packet.InformUnit = _session->GetPlayer()->GetPlayerSharingQuest();
508 packet.QuestID = quest->GetQuestId();
509 packet.QuestPackageID = quest->GetQuestPackageID();
510 packet.PortraitGiver = quest->GetQuestGiverPortrait();
511 packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
512 packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
513 packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
514 packet.QuestInfoID = quest->GetQuestInfoID();
515 packet.QuestSessionBonus = 0;
516 packet.AutoLaunched = autoLaunched;
517 packet.ResetByScheduler = quest->IsResetByScheduler();
518 packet.DisplayPopup = displayPopup;
520 packet.QuestFlags[1] = quest->GetFlagsEx();
521 packet.QuestFlags[2] = quest->GetFlagsEx2();
522 packet.QuestFlags[3] = quest->GetFlagsEx3();
523 packet.SuggestedPartyMembers = quest->GetSuggestedPlayers();
527 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
533 packet.LearnSpells.push_back(spellEffectInfo.TriggerSpell);
535 quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer());
540 packet.DescEmotes[i].Type = quest->DetailsEmote[i];
541 packet.DescEmotes[i].Delay = quest->DetailsEmoteDelay[i];
545 packet.Objectives.resize(objs.size());
546 for (
uint32 i = 0; i < objs.size(); ++i)
548 packet.Objectives[i].ID = objs[i].ID;
549 packet.Objectives[i].Type = objs[i].Type;
550 packet.Objectives[i].ObjectID = objs[i].ObjectID;
551 packet.Objectives[i].Amount = objs[i].Amount;
554 _session->SendPacket(packet.Write());
556 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUEST_GIVER_QUEST_DETAILS NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
588 std::string_view content = text.Text[LOCALE_enUS];
589 ObjectMgr::GetLocaleString(text.Text, locale, content);
590 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
610 quest->BuildQuestRewards(offer.
Rewards, _session->GetPlayer());
616 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
620 offer.
QuestID = quest->GetQuestId();
627 offer.
Emotes.emplace_back(quest->OfferRewardEmote[i], quest->OfferRewardEmoteDelay[i]);
634 packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
635 packet.PortraitGiver = quest->GetQuestGiverPortrait();
636 packet.PortraitGiverMount = quest->GetQuestGiverPortraitMount();
637 packet.PortraitGiverModelSceneID = quest->GetQuestGiverPortraitModelSceneId();
638 packet.QuestPackageID = quest->GetQuestPackageID();
640 _session->SendPacket(packet.Write());
641 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPC={}, questid={}", npcGUID.ToString(), quest->GetQuestId());
665 std::string_view content = text.Text[LOCALE_enUS];
666 ObjectMgr::GetLocaleString(text.Text, locale, content);
667 return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
679 packet.QuestGiverGUID = npcGUID;
683 packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
685 packet.QuestID = quest->GetQuestId();
689 packet.CompEmoteDelay = quest->GetCompleteEmoteDelay();
690 packet.CompEmoteType = quest->GetCompleteEmote();
694 packet.CompEmoteDelay = quest->GetIncompleteEmoteDelay();
695 packet.CompEmoteType = quest->GetIncompleteEmote();
698 packet.QuestFlags[0] = quest->GetFlags();
699 packet.QuestFlags[1] = quest->GetFlagsEx();
700 packet.QuestFlags[2] = quest->GetFlagsEx2();
701 packet.QuestFlags[3] = quest->GetFlagsEx3();
702 packet.SuggestPartyMembers = quest->GetSuggestedPlayers();
703 packet.QuestInfoID = quest->GetQuestInfoID();
707 packet.StatusFlags = canComplete ? 0xFF : 0xFD;
709 packet.MoneyToGet = 0;
715 packet.Collect.emplace_back(obj.ObjectID, obj.Amount, obj.Flags);
718 packet.Currency.emplace_back(obj.ObjectID, obj.Amount);
721 packet.MoneyToGet += obj.Amount;
728 packet.AutoLaunched = autoLaunched;
729 packet.ResetByScheduler = quest->IsResetByScheduler();
731 _session->SendPacket(packet.Write());
732 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