Core/Quests: Convert quest loading to named field access (ref 29a680a1c2)

This commit is contained in:
Shauren
2025-04-25 20:07:53 +02:00
parent 29a680a1c2
commit 05709a2497
3 changed files with 122 additions and 106 deletions

View File

@@ -4622,7 +4622,7 @@ void ObjectMgr::LoadQuests()
Field* fields = result->Fetch();
uint32 questId = fields[0].GetUInt32();
auto itr = _questTemplates.emplace(std::piecewise_construct, std::forward_as_tuple(questId), std::forward_as_tuple(new Quest(fields))).first;
auto itr = _questTemplates.emplace(std::piecewise_construct, std::forward_as_tuple(questId), std::forward_as_tuple(new Quest(result))).first;
itr->second->_weakRef = itr->second;
if (itr->second->IsAutoPush())
_questTemplatesAutoPush.push_back(itr->second.get());

View File

@@ -23,112 +23,124 @@
#include "Log.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "QueryResult.h"
#include "QueryResultStructured.h"
#include "QuestPackets.h"
#include "QuestPools.h"
#include "SpellMgr.h"
#include "World.h"
#include "WorldSession.h"
Quest::Quest(Field* questRecord)
#define QUEST_TEMPLATE_FIELDS (ID)(QuestType)(QuestPackageID)(ContentTuningID)(QuestSortID)(QuestInfoID)(SuggestedGroupNum)(RewardNextQuest)(RewardXPDifficulty)\
(RewardXPMultiplier)(RewardMoneyDifficulty)(RewardMoneyMultiplier)(RewardBonusMoney)(RewardSpell)(RewardHonor)(RewardKillHonor)(StartItem)\
(RewardArtifactXPDifficulty)(RewardArtifactXPMultiplier)(RewardArtifactCategoryID)(Flags)(FlagsEx)(FlagsEx2)\
(RewardItem1)(RewardAmount1)(ItemDrop1)(ItemDropQuantity1)(RewardItem2)(RewardAmount2)(ItemDrop2)(ItemDropQuantity2)\
(RewardItem3)(RewardAmount3)(ItemDrop3)(ItemDropQuantity3)(RewardItem4)(RewardAmount4)(ItemDrop4)(ItemDropQuantity4)\
(RewardChoiceItemID1)(RewardChoiceItemQuantity1)(RewardChoiceItemDisplayID1)(RewardChoiceItemID2)(RewardChoiceItemQuantity2)(RewardChoiceItemDisplayID2)\
(RewardChoiceItemID3)(RewardChoiceItemQuantity3)(RewardChoiceItemDisplayID3)(RewardChoiceItemID4)(RewardChoiceItemQuantity4)(RewardChoiceItemDisplayID4)\
(RewardChoiceItemID5)(RewardChoiceItemQuantity5)(RewardChoiceItemDisplayID5)(RewardChoiceItemID6)(RewardChoiceItemQuantity6)(RewardChoiceItemDisplayID6)\
(POIContinent)(POIx)(POIy)(POIPriority)(RewardTitle)(RewardArenaPoints)(RewardSkillLineID)(RewardNumSkillUps)\
(PortraitGiver)(PortraitGiverMount)(PortraitGiverModelSceneID)(PortraitTurnIn)(RewardFactionID1)(RewardFactionValue1)(RewardFactionOverride1)(RewardFactionCapIn1)\
(RewardFactionID2)(RewardFactionValue2)(RewardFactionOverride2)(RewardFactionCapIn2)(RewardFactionID3)(RewardFactionValue3)(RewardFactionOverride3)(RewardFactionCapIn3)\
(RewardFactionID4)(RewardFactionValue4)(RewardFactionOverride4)(RewardFactionCapIn4)(RewardFactionID5)(RewardFactionValue5)(RewardFactionOverride5)(RewardFactionCapIn5)\
(RewardFactionFlags)(RewardCurrencyID1)(RewardCurrencyQty1)(RewardCurrencyID2)(RewardCurrencyQty2)(RewardCurrencyID3)(RewardCurrencyQty3)\
(RewardCurrencyID4)(RewardCurrencyQty4)(AcceptedSoundKitID)(CompleteSoundKitID)(AreaGroupID)(TimeAllowed)(AllowableRaces)(ResetByScheduler)(Expansion)\
(ManagedWorldStateID)(QuestSessionBonus)(LogTitle)(LogDescription)(QuestDescription)(AreaDescription)(PortraitGiverText)(PortraitGiverName)\
(PortraitTurnInText)(PortraitTurnInName)(QuestCompletionLog)
DEFINE_FIELD_ACCESSOR_CACHE(Quest::QuestTemplateQueryResult, ResultSet, QUEST_TEMPLATE_FIELDS);
Quest::Quest(QueryResult const& questRecord) : Quest(QuestTemplateQueryResult{ .Result = *questRecord })
{
_id = questRecord[0].GetUInt32();
_type = questRecord[1].GetUInt8();
_packageID = questRecord[2].GetUInt32();
_contentTuningID = questRecord[3].GetInt32();
_questSortID = questRecord[4].GetInt16();
_questInfoID = questRecord[5].GetUInt16();
_suggestedPlayers = questRecord[6].GetUInt8();
_nextQuestInChain = questRecord[7].GetUInt32();
_rewardXPDifficulty = questRecord[8].GetUInt32();
_rewardXPMultiplier = questRecord[9].GetFloat();
_rewardMoneyDifficulty = questRecord[10].GetUInt32();
_rewardMoneyMultiplier = questRecord[11].GetFloat();
_rewardBonusMoney = questRecord[12].GetUInt32();
_rewardSpell = questRecord[13].GetUInt32();
_rewardHonor = questRecord[14].GetUInt32();
_rewardKillHonor = questRecord[15].GetUInt32();
_sourceItemId = questRecord[16].GetUInt32();
_rewardArtifactXPDifficulty = questRecord[17].GetUInt32();
_rewardArtifactXPMultiplier = questRecord[18].GetFloat();
_rewardArtifactCategoryID = questRecord[19].GetUInt32();
_flags = questRecord[20].GetUInt32();
_flagsEx = questRecord[21].GetUInt32();
_flagsEx2 = questRecord[22].GetUInt32();
}
for (uint32 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
{
RewardItemId[i] = questRecord[23 + i * 4].GetUInt32();
RewardItemCount[i] = questRecord[24 + i * 4].GetUInt32();
ItemDrop[i] = questRecord[25 + i * 4].GetUInt32();
ItemDropQuantity[i] = questRecord[26 + i * 4].GetUInt32();
if (RewardItemId[i])
++_rewItemsCount;
}
for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
{
RewardChoiceItemId[i] = questRecord[39 + i * 3].GetUInt32();
RewardChoiceItemCount[i] = questRecord[40 + i * 3].GetUInt32();
RewardChoiceItemDisplayId[i] = questRecord[41 + i * 3].GetUInt32();
if (RewardChoiceItemId[i])
++_rewChoiceItemsCount;
}
_poiContinent = questRecord[57].GetUInt32();
_poix = questRecord[58].GetFloat();
_poiy = questRecord[59].GetFloat();
_poiPriority = questRecord[60].GetUInt32();
_rewardTitleId = questRecord[61].GetUInt32();
_rewardArenaPoints = questRecord[62].GetUInt32();
_rewardSkillId = questRecord[63].GetUInt32();
_rewardSkillPoints = questRecord[64].GetUInt32();
_questGiverPortrait = questRecord[65].GetUInt32();
_questGiverPortraitMount = questRecord[66].GetUInt32();
_questGiverPortraitModelSceneId = questRecord[67].GetInt32();
_questTurnInPortrait = questRecord[68].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
{
RewardFactionId[i] = questRecord[69 + i * 4].GetUInt32();
RewardFactionValue[i] = questRecord[70 + i * 4].GetInt32();
RewardFactionOverride[i] = questRecord[71 + i * 4].GetInt32();
RewardFactionCapIn[i] = questRecord[72 + i * 4].GetInt32();
}
_rewardReputationMask = questRecord[89].GetUInt32();
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
{
RewardCurrencyId[i] = questRecord[90 + i * 2].GetUInt32();
RewardCurrencyCount[i] = questRecord[91 + i * 2].GetUInt32();
if (RewardCurrencyId[i])
++_rewCurrencyCount;
}
_soundAccept = questRecord[98].GetUInt32();
_soundTurnIn = questRecord[99].GetUInt32();
_areaGroupID = questRecord[100].GetUInt32();
_limitTime = questRecord[101].GetInt64();
_allowableRaces.RawValue = questRecord[102].GetUInt64();
_resetByScheduler = questRecord[103].GetBool();
_expansion = questRecord[104].GetInt32();
_managedWorldStateID = questRecord[105].GetInt32();
_questSessionBonus = questRecord[106].GetInt32();
_logTitle = questRecord[107].GetString();
_logDescription = questRecord[108].GetString();
_questDescription = questRecord[109].GetString();
_areaDescription = questRecord[110].GetString();
_portraitGiverText = questRecord[111].GetString();
_portraitGiverName = questRecord[112].GetString();
_portraitTurnInText = questRecord[113].GetString();
_portraitTurnInName = questRecord[114].GetString();
_questCompletionLog = questRecord[115].GetString();
Quest::Quest(QuestTemplateQueryResult const& questRecord) :
RewardItemId({ questRecord.RewardItem1().GetUInt32(), questRecord.RewardItem2().GetUInt32(),
questRecord.RewardItem3().GetUInt32(), questRecord.RewardItem4().GetUInt32() }),
RewardItemCount({ questRecord.RewardAmount1().GetUInt32(), questRecord.RewardAmount2().GetUInt32(),
questRecord.RewardAmount3().GetUInt32(), questRecord.RewardAmount4().GetUInt32() }),
ItemDrop({ questRecord.ItemDrop1().GetUInt32(), questRecord.ItemDrop2().GetUInt32(),
questRecord.ItemDrop3().GetUInt32(), questRecord.ItemDrop4().GetUInt32() }),
ItemDropQuantity({ questRecord.ItemDropQuantity1().GetUInt32(), questRecord.ItemDropQuantity2().GetUInt32(),
questRecord.ItemDropQuantity3().GetUInt32(), questRecord.ItemDropQuantity4().GetUInt32() }),
RewardChoiceItemId({ questRecord.RewardChoiceItemID1().GetUInt32(), questRecord.RewardChoiceItemID2().GetUInt32(),
questRecord.RewardChoiceItemID3().GetUInt32(), questRecord.RewardChoiceItemID4().GetUInt32(),
questRecord.RewardChoiceItemID5().GetUInt32(), questRecord.RewardChoiceItemID6().GetUInt32() }),
RewardChoiceItemCount({ questRecord.RewardChoiceItemQuantity1().GetUInt32(), questRecord.RewardChoiceItemQuantity2().GetUInt32(),
questRecord.RewardChoiceItemQuantity3().GetUInt32(), questRecord.RewardChoiceItemQuantity4().GetUInt32(),
questRecord.RewardChoiceItemQuantity5().GetUInt32(), questRecord.RewardChoiceItemQuantity6().GetUInt32() }),
RewardChoiceItemDisplayId({ questRecord.RewardChoiceItemDisplayID1().GetUInt32(), questRecord.RewardChoiceItemDisplayID2().GetUInt32(),
questRecord.RewardChoiceItemDisplayID3().GetUInt32(), questRecord.RewardChoiceItemDisplayID4().GetUInt32(),
questRecord.RewardChoiceItemDisplayID5().GetUInt32(), questRecord.RewardChoiceItemDisplayID6().GetUInt32() }),
RewardFactionId({ questRecord.RewardFactionID1().GetUInt32(), questRecord.RewardFactionID2().GetUInt32(),
questRecord.RewardFactionID3().GetUInt32(), questRecord.RewardFactionID4().GetUInt32(), questRecord.RewardFactionID5().GetUInt32() }),
RewardFactionValue({ questRecord.RewardFactionValue1().GetInt32(), questRecord.RewardFactionValue2().GetInt32(),
questRecord.RewardFactionValue3().GetInt32(), questRecord.RewardFactionValue4().GetInt32(), questRecord.RewardFactionValue5().GetInt32() }),
RewardFactionOverride({ questRecord.RewardFactionOverride1().GetInt32(), questRecord.RewardFactionOverride2().GetInt32(),
questRecord.RewardFactionOverride3().GetInt32(), questRecord.RewardFactionOverride4().GetInt32(), questRecord.RewardFactionOverride5().GetInt32() }),
RewardFactionCapIn({ questRecord.RewardFactionCapIn1().GetInt32(), questRecord.RewardFactionCapIn2().GetInt32(),
questRecord.RewardFactionCapIn3().GetInt32(), questRecord.RewardFactionCapIn4().GetInt32(), questRecord.RewardFactionCapIn5().GetInt32() }),
RewardCurrencyId({ questRecord.RewardCurrencyID1().GetUInt32(), questRecord.RewardCurrencyID2().GetUInt32(),
questRecord.RewardCurrencyID3().GetUInt32(), questRecord.RewardCurrencyID4().GetUInt32() }),
RewardCurrencyCount({ questRecord.RewardCurrencyQty1().GetUInt32(), questRecord.RewardCurrencyQty2().GetUInt32(),
questRecord.RewardCurrencyQty3().GetUInt32(), questRecord.RewardCurrencyQty4().GetUInt32() }),
_rewItemsCount(std::ranges::count_if(RewardItemId, [](uint32 itemId) { return itemId != 0; })),
_rewChoiceItemsCount(std::ranges::count_if(RewardChoiceItemId, [](uint32 itemId) { return itemId != 0; })),
_id(questRecord.ID().GetUInt32()),
_type(questRecord.QuestType().GetUInt8()),
_packageID(questRecord.QuestPackageID().GetUInt32()),
_contentTuningID(questRecord.ContentTuningID().GetInt32()),
_questSortID(questRecord.QuestSortID().GetInt16()),
_questInfoID(questRecord.QuestInfoID().GetUInt16()),
_suggestedPlayers(questRecord.SuggestedGroupNum().GetUInt8()),
_nextQuestInChain(questRecord.RewardNextQuest().GetUInt32()),
_rewardXPDifficulty(questRecord.RewardXPDifficulty().GetUInt32()),
_rewardXPMultiplier(questRecord.RewardXPMultiplier().GetFloat()),
_rewardMoneyDifficulty(questRecord.RewardMoneyDifficulty().GetUInt32()),
_rewardMoneyMultiplier(questRecord.RewardMoneyMultiplier().GetFloat()),
_rewardBonusMoney(questRecord.RewardBonusMoney().GetUInt32()),
_rewardSpell(questRecord.RewardSpell().GetUInt32()),
_rewardHonor(questRecord.RewardHonor().GetUInt32()),
_rewardKillHonor(questRecord.RewardKillHonor().GetUInt32()),
_rewardArtifactXPDifficulty(questRecord.RewardArtifactXPDifficulty().GetUInt32()),
_rewardArtifactXPMultiplier(questRecord.RewardArtifactXPMultiplier().GetFloat()),
_rewardArtifactCategoryID(questRecord.RewardArtifactCategoryID().GetUInt32()),
_sourceItemId(questRecord.StartItem().GetUInt32()),
_flags(questRecord.Flags().GetUInt32()),
_flagsEx(questRecord.FlagsEx().GetUInt32()),
_flagsEx2(questRecord.FlagsEx2().GetUInt32()),
_poiContinent(questRecord.POIContinent().GetUInt32()),
_poix(questRecord.POIx().GetFloat()),
_poiy(questRecord.POIy().GetFloat()),
_poiPriority(questRecord.POIPriority().GetUInt32()),
_rewardTitleId(questRecord.RewardTitle().GetUInt32()),
_rewardArenaPoints(questRecord.RewardArenaPoints().GetUInt32()),
_rewardSkillId(questRecord.RewardSkillLineID().GetUInt32()),
_rewardSkillPoints(questRecord.RewardNumSkillUps().GetUInt32()),
_questGiverPortrait(questRecord.PortraitGiver().GetUInt32()),
_questGiverPortraitMount(questRecord.PortraitGiverMount().GetUInt32()),
_questGiverPortraitModelSceneId(questRecord.PortraitGiverModelSceneID().GetInt32()),
_questTurnInPortrait(questRecord.PortraitTurnIn().GetUInt32()),
_rewardReputationMask(questRecord.RewardFactionFlags().GetUInt32()),
_soundAccept(questRecord.AcceptedSoundKitID().GetUInt32()),
_soundTurnIn(questRecord.CompleteSoundKitID().GetUInt32()),
_areaGroupID(questRecord.AreaGroupID().GetUInt32()),
_limitTime(questRecord.TimeAllowed().GetInt64()),
_allowableRaces({ .RawValue = questRecord.AllowableRaces().GetUInt64() }),
_expansion(questRecord.Expansion().GetInt32()),
_managedWorldStateID(questRecord.ManagedWorldStateID().GetInt32()),
_questSessionBonus(questRecord.QuestSessionBonus().GetInt32()),
_logTitle(questRecord.LogTitle().GetStringView()),
_logDescription(questRecord.LogDescription().GetStringView()),
_questDescription(questRecord.QuestDescription().GetStringView()),
_areaDescription(questRecord.AreaDescription().GetStringView()),
_portraitGiverText(questRecord.PortraitGiverText().GetStringView()),
_portraitGiverName(questRecord.PortraitGiverName().GetStringView()),
_portraitTurnInText(questRecord.PortraitTurnInText().GetStringView()),
_portraitTurnInName(questRecord.PortraitTurnInName().GetStringView()),
_questCompletionLog(questRecord.QuestCompletionLog().GetStringView()),
_resetByScheduler(questRecord.ResetByScheduler().GetBool())
{
}
Quest::~Quest()
@@ -203,7 +215,7 @@ void Quest::LoadQuestRequestItems(Field* fields)
_emoteOnCompleteDelay = fields[3].GetUInt32();
_emoteOnIncompleteDelay = fields[4].GetUInt32();
_requestItemsText = fields[5].GetString();
_requestItemsText = fields[5].GetStringView();
}
void Quest::LoadQuestOfferReward(Field* fields)
@@ -222,7 +234,7 @@ void Quest::LoadQuestOfferReward(Field* fields)
for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
OfferRewardEmoteDelay[i] = fields[5 + i].GetUInt32();
_offerRewardText = fields[9].GetString();
_offerRewardText = fields[9].GetStringView();
}
void Quest::LoadQuestTemplateAddon(Field* fields)
@@ -267,7 +279,7 @@ void Quest::LoadQuestObjective(Field* fields)
obj.Flags = fields[6].GetUInt32();
obj.Flags2 = fields[7].GetUInt32();
obj.ProgressBarWeight = fields[8].GetFloat();
obj.Description = fields[9].GetString();
obj.Description = fields[9].GetStringView();
bool hasCompletionEffect = std::any_of(fields + 10, fields + 15, [](Field const& f) { return !f.IsNull(); });
if (hasCompletionEffect)

View File

@@ -573,9 +573,15 @@ class TC_GAME_API Quest
friend class ObjectMgr;
friend class Player;
friend class PlayerMenu;
struct QuestTemplateQueryResult;
public:
// Loading data. All queries are in ObjectMgr::LoadQuests()
explicit Quest(Field* questRecord);
explicit Quest(QueryResult const& questRecord);
explicit Quest(QuestTemplateQueryResult const& questRecord);
Quest(Quest const&) = delete;
Quest(Quest&&) = delete;
Quest& operator=(Quest const&) = delete;
Quest& operator=(Quest&&) = delete;
~Quest();
void LoadRewardDisplaySpell(Field* fields);
void LoadRewardChoiceItems(Field* fields);
@@ -743,7 +749,6 @@ class TC_GAME_API Quest
uint32 GetRewChoiceItemsCount() const { return _rewChoiceItemsCount; }
uint32 GetRewItemsCount() const { return _rewItemsCount; }
uint32 GetRewCurrencyCount() const { return _rewCurrencyCount; }
void SetEventIdForQuest(uint16 eventId) { _eventIdForQuest = eventId; }
uint16 GetEventIdForQuest() const { return _eventIdForQuest; }
@@ -763,10 +768,9 @@ class TC_GAME_API Quest
std::array<WorldPacket, TOTAL_LOCALES> QueryData;
private:
uint32 _rewChoiceItemsCount = 0;
uint32 _rewItemsCount = 0;
uint32 _rewChoiceItemsCount = 0;
uint16 _eventIdForQuest = 0;
uint32 _rewCurrencyCount = 0;
// wdb data (quest query response)
uint32 _id = 0;