Core/Quests: Update quest_template and SMSG_QUEST_QUERY_RESPONSE
TODO: - Validate SkillId and reward it - Validate Currency, add it to the requires and reward it (after being able to read currency dbc) - Update other quest related opcodes
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
ALTER TABLE `quest_template` ADD COLUMN `MinimapTargetMark` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `SpecialFlags`,
|
||||||
|
ADD COLUMN `RewardSkillId` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardArenaPoints`,
|
||||||
|
ADD COLUMN `RewardSkillPoints` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardSkillId`,
|
||||||
|
ADD COLUMN `RewardReputationMask` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardSkillPoints`,
|
||||||
|
ADD COLUMN `QuestGiverPortrait` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardReputationMask`,
|
||||||
|
ADD COLUMN `QuestTurnInPortrait` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `QuestGiverPortrait`,
|
||||||
|
ADD COLUMN `RequiredSpell` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredItemCount6`,
|
||||||
|
ADD COLUMN `RewardCurrencyId1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ObjectiveText4`,
|
||||||
|
ADD COLUMN `RewardCurrencyId2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyId1`,
|
||||||
|
ADD COLUMN `RewardCurrencyId3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyId2`,
|
||||||
|
ADD COLUMN `RewardCurrencyId4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyId3`,
|
||||||
|
ADD COLUMN `RewardCurrencyCount1` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyId4`,
|
||||||
|
ADD COLUMN `RewardCurrencyCount2` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyCount1`,
|
||||||
|
ADD COLUMN `RewardCurrencyCount3` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyCount2`,
|
||||||
|
ADD COLUMN `RewardCurrencyCount4` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyCount3`,
|
||||||
|
ADD COLUMN `RequiredCurrencyId1` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewardCurrencyCount4`,
|
||||||
|
ADD COLUMN `RequiredCurrencyId2` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyId1`,
|
||||||
|
ADD COLUMN `RequiredCurrencyId3` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyId2`,
|
||||||
|
ADD COLUMN `RequiredCurrencyId4` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyId3`,
|
||||||
|
ADD COLUMN `RequiredCurrencyCount1` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyId4`,
|
||||||
|
ADD COLUMN `RequiredCurrencyCount2` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount1`,
|
||||||
|
ADD COLUMN `RequiredCurrencyCount3` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount2`,
|
||||||
|
ADD COLUMN `RequiredCurrencyCount4` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `RequiredCurrencyCount3`,
|
||||||
|
ADD COLUMN `QuestGiverTextWindow` TEXT NULL DEFAULT NULL AFTER `RequiredCurrencyCount4`,
|
||||||
|
ADD COLUMN `QuestGiverTargetName` TEXT NULL DEFAULT NULL AFTER `QuestGiverTextWindow`,
|
||||||
|
ADD COLUMN `QuestTurnTextWindow` TEXT NULL DEFAULT NULL AFTER `QuestGiverTargetName`,
|
||||||
|
ADD COLUMN `QuestTurnTargetName` TEXT NULL DEFAULT NULL AFTER `QuestTurnTextWindow`,
|
||||||
|
ADD COLUMN `SoundAccept` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '890' AFTER `QuestTurnTargetName`,
|
||||||
|
ADD COLUMN `SoundTurnIn` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '878' AFTER `SoundAccept`;
|
||||||
|
|
||||||
|
ALTER TABLE `quest_template` DROP COLUMN `Unknown0`; -- Not found on 422
|
||||||
@@ -401,11 +401,17 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, uint64 npcGUID,
|
|||||||
|
|
||||||
void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
||||||
{
|
{
|
||||||
|
// SMSG_QUEST_QUERY_RESPONSE - Updated to 422
|
||||||
|
|
||||||
std::string questTitle = quest->GetTitle();
|
std::string questTitle = quest->GetTitle();
|
||||||
std::string questDetails = quest->GetDetails();
|
std::string questDetails = quest->GetDetails();
|
||||||
std::string questObjectives = quest->GetObjectives();
|
std::string questObjectives = quest->GetObjectives();
|
||||||
std::string questEndText = quest->GetEndText();
|
std::string questEndText = quest->GetEndText();
|
||||||
std::string questCompletedText = quest->GetCompletedText();
|
std::string questCompletedText = quest->GetCompletedText();
|
||||||
|
std::string questGiverTextWindow = quest->GetQuestGiverTextWindow();
|
||||||
|
std::string questGiverTargetName = quest->GetQuestGiverTargetName();
|
||||||
|
std::string questTurnTextWindow = quest->GetQuestTurnTextWindow();
|
||||||
|
std::string questTurnTargetName = quest->GetQuestTurnTargetName();
|
||||||
|
|
||||||
std::string questObjectiveText[QUEST_OBJECTIVES_COUNT];
|
std::string questObjectiveText[QUEST_OBJECTIVES_COUNT];
|
||||||
for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
@@ -421,6 +427,10 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
|||||||
ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
|
ObjectMgr::GetLocaleString(localeData->Objectives, locale, questObjectives);
|
||||||
ObjectMgr::GetLocaleString(localeData->EndText, locale, questEndText);
|
ObjectMgr::GetLocaleString(localeData->EndText, locale, questEndText);
|
||||||
ObjectMgr::GetLocaleString(localeData->CompletedText, locale, questCompletedText);
|
ObjectMgr::GetLocaleString(localeData->CompletedText, locale, questCompletedText);
|
||||||
|
ObjectMgr::GetLocaleString(localeData->QuestGiverTextWindow, locale, questGiverTextWindow);
|
||||||
|
ObjectMgr::GetLocaleString(localeData->QuestGiverTargetName, locale, questGiverTargetName);
|
||||||
|
ObjectMgr::GetLocaleString(localeData->QuestTurnTextWindow, locale, questTurnTextWindow);
|
||||||
|
ObjectMgr::GetLocaleString(localeData->QuestTurnTargetName, locale, questTurnTargetName);
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
ObjectMgr::GetLocaleString(localeData->ObjectiveText[i], locale, questObjectiveText[i]);
|
ObjectMgr::GetLocaleString(localeData->ObjectiveText[i], locale, questObjectiveText[i]);
|
||||||
@@ -461,11 +471,16 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
|||||||
data << float(0); // new reward honor (multipled by ~62 at client side)
|
data << float(0); // new reward honor (multipled by ~62 at client side)
|
||||||
data << uint32(quest->GetSrcItemId()); // source item id
|
data << uint32(quest->GetSrcItemId()); // source item id
|
||||||
data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
|
data << uint32(quest->GetFlags() & 0xFFFF); // quest flags
|
||||||
|
data << uint32(quest->GetMinimapTargetMark()); // minimap target mark (skull, etc. missing enum)
|
||||||
data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
|
data << uint32(quest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
|
||||||
data << uint32(quest->GetPlayersSlain()); // players slain
|
data << uint32(quest->GetPlayersSlain()); // players slain
|
||||||
data << uint32(quest->GetBonusTalents()); // bonus talents
|
data << uint32(quest->GetBonusTalents()); // bonus talents
|
||||||
data << uint32(quest->GetRewArenaPoints()); // bonus arena points
|
data << uint32(quest->GetRewArenaPoints()); // bonus arena points
|
||||||
data << uint32(0); // review rep show mask
|
data << uint32(quest->GetRewardSkillId()); // reward skill id
|
||||||
|
data << uint32(quest->GetRewardSkillPoints()); // reward skill points
|
||||||
|
data << uint32(quest->GetRewardReputationMask()); // rep mask (unsure on what it does)
|
||||||
|
data << uint32(quest->GetQuestGiverPortrait()); // quest giver entry ?
|
||||||
|
data << uint32(quest->GetQuestTurnInPortrait()); // quest turnin entry ?
|
||||||
|
|
||||||
if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
|
if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
|
||||||
{
|
{
|
||||||
@@ -494,7 +509,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
|||||||
for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid+1 QuestFactionReward.dbc?
|
for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid+1 QuestFactionReward.dbc?
|
||||||
data << int32(quest->RewardFactionValueId[i]);
|
data << int32(quest->RewardFactionValueId[i]);
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // unk (0)
|
for (uint32 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // unknown usage
|
||||||
data << int32(quest->RewardFactionValueIdOverride[i]);
|
data << int32(quest->RewardFactionValueIdOverride[i]);
|
||||||
|
|
||||||
data << quest->GetPointMapId();
|
data << quest->GetPointMapId();
|
||||||
@@ -506,7 +521,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
|||||||
data << questObjectives;
|
data << questObjectives;
|
||||||
data << questDetails;
|
data << questDetails;
|
||||||
data << questEndText;
|
data << questEndText;
|
||||||
data << questCompletedText; // display in quest objectives window once all objectives are completed
|
data << questCompletedText;
|
||||||
|
|
||||||
for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
{
|
{
|
||||||
@@ -516,8 +531,8 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
|||||||
data << uint32(quest->RequiredNpcOrGo[i]);
|
data << uint32(quest->RequiredNpcOrGo[i]);
|
||||||
|
|
||||||
data << uint32(quest->RequiredNpcOrGoCount[i]);
|
data << uint32(quest->RequiredNpcOrGoCount[i]);
|
||||||
data << uint32(quest->RequiredSourceItemid[i]);
|
data << uint32(quest->RequiredSourceItemId[i]);
|
||||||
data << uint32(0); // req source count?
|
data << uint32(quest->RequiredSourceItemCount[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
||||||
@@ -526,9 +541,30 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
|
|||||||
data << uint32(quest->RequiredItemCount[i]);
|
data << uint32(quest->RequiredItemCount[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data << uint32(quest->GetRequiredSpell()); // Is it required to be cast, learned or what?
|
||||||
|
|
||||||
for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
data << questObjectiveText[i];
|
data << questObjectiveText[i];
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
|
||||||
|
{
|
||||||
|
data << uint32(quest->RewardCurrencyId[i]);
|
||||||
|
data << uint32(quest->RewardCurrencyCount[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i)
|
||||||
|
{
|
||||||
|
data << uint32(quest->RequiredCurrencyId[i]);
|
||||||
|
data << uint32(quest->RequiredCurrencyCount[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
data << questGiverTextWindow;
|
||||||
|
data << questGiverTargetName;
|
||||||
|
data << questTurnTextWindow;
|
||||||
|
data << questTurnTargetName;
|
||||||
|
data << uint32(quest->GetSoundAccept());
|
||||||
|
data << uint32(quest->GetSoundTurnIn());
|
||||||
|
|
||||||
_session->SendPacket(&data);
|
_session->SendPacket(&data);
|
||||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", quest->GetQuestId());
|
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", quest->GetQuestId());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14834,10 +14834,10 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
|
|||||||
|
|
||||||
for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (quest->RequiredSourceItemid[i])
|
if (quest->RequiredSourceItemId[i])
|
||||||
{
|
{
|
||||||
uint32 count = quest->RequiredSourceItemId[i];
|
uint32 count = quest->RequiredSourceItemCount[i];
|
||||||
DestroyItemCount(quest->RequiredSourceItemid[i], count ? count : 9999, true);
|
DestroyItemCount(quest->RequiredSourceItemId[i], count ? count : 9999, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15031,9 +15031,9 @@ void Player::FailQuest(uint32 questId)
|
|||||||
// Destroy items recieved on starting the quest.
|
// Destroy items recieved on starting the quest.
|
||||||
DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true, true);
|
DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true, true);
|
||||||
for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
||||||
if (quest->RequiredSourceItemid[i] > 0 && quest->RequiredSourceItemId[i] > 0)
|
if (quest->RequiredSourceItemId[i] > 0 && quest->RequiredSourceItemCount[i] > 0)
|
||||||
// Destroy items recieved during the quest.
|
// Destroy items recieved during the quest.
|
||||||
DestroyItemCount(quest->RequiredSourceItemid[i], quest->RequiredSourceItemId[i], true, true);
|
DestroyItemCount(quest->RequiredSourceItemId[i], quest->RequiredSourceItemCount[i], true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16084,7 +16084,7 @@ bool Player::HasQuestForItem(uint32 itemid) const
|
|||||||
for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
|
for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
|
||||||
{
|
{
|
||||||
// examined item is a source item
|
// examined item is a source item
|
||||||
if (qinfo->RequiredSourceItemid[j] == itemid)
|
if (qinfo->RequiredSourceItemId[j] == itemid)
|
||||||
{
|
{
|
||||||
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
|
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
|
||||||
|
|
||||||
@@ -16093,9 +16093,9 @@ bool Player::HasQuestForItem(uint32 itemid) const
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// allows custom amount drop when not 0
|
// allows custom amount drop when not 0
|
||||||
if (qinfo->RequiredSourceItemId[j])
|
if (qinfo->RequiredSourceItemCount[j])
|
||||||
{
|
{
|
||||||
if (GetItemCount(itemid, true) < qinfo->RequiredSourceItemId[j])
|
if (GetItemCount(itemid, true) < qinfo->RequiredSourceItemCount[j])
|
||||||
return true;
|
return true;
|
||||||
} else if (GetItemCount(itemid, true) < pProto->GetMaxStackSize())
|
} else if (GetItemCount(itemid, true) < pProto->GetMaxStackSize())
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -3593,33 +3593,37 @@ void ObjectMgr::LoadQuests()
|
|||||||
"RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, "
|
"RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, "
|
||||||
// 21 22 23 24 25 26 27 28 29 30 31
|
// 21 22 23 24 25 26 27 28 29 30 31
|
||||||
"PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, "
|
"PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, "
|
||||||
// 32 33 34 35 36 37 38 39 40 41 42
|
// 32 33 34 35 36 37 38 39 40 41 42 43
|
||||||
"RewardMailTemplateId, RewardMailDelay, SourceItemId, SourceItemCount, SourceSpellId, Flags, SpecialFlags, RewardTitleId, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
|
"RewardMailTemplateId, RewardMailDelay, SourceItemId, SourceItemCount, SourceSpellId, Flags, SpecialFlags, MinimapTargetMark, RewardTitleId, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
|
||||||
// 43 44 45 46 47 48 49 50
|
// 44 45 46 47 48 49 50 51 52 53 54 55 56
|
||||||
"RewardItemId1, RewardItemId2, RewardItemId3, RewardItemId4, RewardItemCount1, RewardItemCount2, RewardItemCount3, RewardItemCount4, "
|
"RewardSkillId, RewardSkillPoints, RewardReputationMask, QuestGiverPortrait, QuestTurnInPortrait, RewardItemId1, RewardItemId2, RewardItemId3, RewardItemId4, RewardItemCount1, RewardItemCount2, RewardItemCount3, RewardItemCount4, "
|
||||||
// 51 52 53 54 55 56 57 58 59 60 61 62
|
// 57 58 59 60 61 62 63 64 65 66 67 68
|
||||||
"RewardChoiceItemId1, RewardChoiceItemId2, RewardChoiceItemId3, RewardChoiceItemId4, RewardChoiceItemId5, RewardChoiceItemId6, RewardChoiceItemCount1, RewardChoiceItemCount2, RewardChoiceItemCount3, RewardChoiceItemCount4, RewardChoiceItemCount5, RewardChoiceItemCount6, "
|
"RewardChoiceItemId1, RewardChoiceItemId2, RewardChoiceItemId3, RewardChoiceItemId4, RewardChoiceItemId5, RewardChoiceItemId6, RewardChoiceItemCount1, RewardChoiceItemCount2, RewardChoiceItemCount3, RewardChoiceItemCount4, RewardChoiceItemCount5, RewardChoiceItemCount6, "
|
||||||
// 63 64 65 66 67 68 69 70 71 72
|
// 69 70 71 72 73 74 75 76 77 78
|
||||||
"RewardFactionId1, RewardFactionId2, RewardFactionId3, RewardFactionId4, RewardFactionId5, RewardFactionValueId1, RewardFactionValueId2, RewardFactionValueId3, RewardFactionValueId4, RewardFactionValueId5, "
|
"RewardFactionId1, RewardFactionId2, RewardFactionId3, RewardFactionId4, RewardFactionId5, RewardFactionValueId1, RewardFactionValueId2, RewardFactionValueId3, RewardFactionValueId4, RewardFactionValueId5, "
|
||||||
// 73 74 75 76 77
|
// 79 80 81 82 83
|
||||||
"RewardFactionValueIdOverride1, RewardFactionValueIdOverride2, RewardFactionValueIdOverride3, RewardFactionValueIdOverride4, RewardFactionValueIdOverride5, "
|
"RewardFactionValueIdOverride1, RewardFactionValueIdOverride2, RewardFactionValueIdOverride3, RewardFactionValueIdOverride4, RewardFactionValueIdOverride5, "
|
||||||
// 78 79 80 81
|
// 84 85 86 87 88 89 90 91 92 93 94
|
||||||
"PointMapId, PointX, PointY, PointOption, "
|
"PointMapId, PointX, PointY, PointOption, Title, Objectives, Details, EndText, CompletedText, OfferRewardText, RequestItemsText, "
|
||||||
// 82 83 84 85 86 87 88
|
// 95 96 97 98 99 100 101 102
|
||||||
"Title, Objectives, Details, EndText, OfferRewardText, RequestItemsText, CompletedText, "
|
|
||||||
// 89 90 91 92 93 94 95 96
|
|
||||||
"RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
|
"RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
|
||||||
// 97 98 99 100 101 102 103 104
|
// 103 104 105 106 107 108 109 110
|
||||||
"RequiredSourceItemId1, RequiredSourceItemId2, RequiredSourceItemId3, RequiredSourceItemId4, RequiredSourceItemCount1, RequiredSourceItemCount2, RequiredSourceItemCount3, RequiredSourceItemCount4, "
|
"RequiredSourceItemId1, RequiredSourceItemId2, RequiredSourceItemId3, RequiredSourceItemId4, RequiredSourceItemCount1, RequiredSourceItemCount2, RequiredSourceItemCount3, RequiredSourceItemCount4, "
|
||||||
// 105 106 107 108 109 110 111 112 113 114 115 116
|
// 111 112 113 114 115 116 117 118 119 120 121 122
|
||||||
"RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
|
"RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
|
||||||
// 117 118 119 120 121 122 123 124 125
|
// 123 124 125 126 127 128 129 130 131
|
||||||
"RequiredSpellCast1, RequiredSpellCast2, RequiredSpellCast3, RequiredSpellCast4, Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, "
|
"RequiredSpell, RequiredSpellCast1, RequiredSpellCast2, RequiredSpellCast3, RequiredSpellCast4, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, "
|
||||||
// 126 127 128 129 130 131 132 133 134 135
|
// 132 133 134 135 136 137 138 139
|
||||||
|
"RewardCurrencyId1, RewardCurrencyId2, RewardCurrencyId3, RewardCurrencyId4, RewardCurrencyCount1, RewardCurrencyCount2, RewardCurrencyCount3, RewardCurrencyCount4, "
|
||||||
|
// 140 141 142 143 144 145 146 147
|
||||||
|
"RequiredCurrencyId1, RequiredCurrencyId2, RequiredCurrencyId3, RequiredCurrencyId4, RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, "
|
||||||
|
// 148 149 150 151 152 153
|
||||||
|
"QuestGiverTextWindow, QuestGiverTargetName, QuestTurnTextWindow, QuestTurnTargetName, SoundAccept, SoundTurnIn, "
|
||||||
|
// 154 155 156 157 158 159 160 161 162 163
|
||||||
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, EmoteOnIncomplete, EmoteOnComplete, "
|
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, EmoteOnIncomplete, EmoteOnComplete, "
|
||||||
// 136 137 138 139 140 141 142 143
|
// 164 165 166 167 168 169 170 171
|
||||||
"OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4, "
|
"OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4, "
|
||||||
// 144 145 146
|
// 172 173 174
|
||||||
"StartScript, CompleteScript, WDBVerified"
|
"StartScript, CompleteScript, WDBVerified"
|
||||||
" FROM quest_template");
|
" FROM quest_template");
|
||||||
if (!result)
|
if (!result)
|
||||||
@@ -3912,7 +3916,7 @@ void ObjectMgr::LoadQuests()
|
|||||||
qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
|
qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (qinfo->RequiredItemCount[j]>0)
|
else if (qinfo->RequiredItemCount[j] > 0)
|
||||||
{
|
{
|
||||||
sLog->outErrorDb("Quest %u has `RequiredItemId%d` = 0 but `RequiredItemCount%d` = %u, quest can't be done.",
|
sLog->outErrorDb("Quest %u has `RequiredItemId%d` = 0 but `RequiredItemCount%d` = %u, quest can't be done.",
|
||||||
qinfo->GetQuestId(), j+1, j+1, qinfo->RequiredItemCount[j]);
|
qinfo->GetQuestId(), j+1, j+1, qinfo->RequiredItemCount[j]);
|
||||||
@@ -3922,22 +3926,22 @@ void ObjectMgr::LoadQuests()
|
|||||||
|
|
||||||
for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
|
for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
|
||||||
{
|
{
|
||||||
uint32 id = qinfo->RequiredSourceItemid[j];
|
uint32 id = qinfo->RequiredSourceItemId[j];
|
||||||
if (id)
|
if (id)
|
||||||
{
|
{
|
||||||
if (!sObjectMgr->GetItemTemplate(id))
|
if (!sObjectMgr->GetItemTemplate(id))
|
||||||
{
|
{
|
||||||
sLog->outErrorDb("Quest %u has `RequiredSourceItemid%d` = %u but item with entry %u does not exist, quest can't be done.",
|
sLog->outErrorDb("Quest %u has `RequiredSourceItemId%d` = %u but item with entry %u does not exist, quest can't be done.",
|
||||||
qinfo->GetQuestId(), j+1, id, id);
|
qinfo->GetQuestId(), j+1, id, id);
|
||||||
// no changes, quest can't be done for this requirement
|
// no changes, quest can't be done for this requirement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (qinfo->RequiredSourceItemId[j]>0)
|
if (qinfo->RequiredSourceItemCount[j] > 0)
|
||||||
{
|
{
|
||||||
sLog->outErrorDb("Quest %u has `RequiredSourceItemid%d` = 0 but `RequiredSourceItemId%d` = %u.",
|
sLog->outErrorDb("Quest %u has `RequiredSourceItemId%d` = 0 but `RequiredSourceItemCount%d` = %u.",
|
||||||
qinfo->GetQuestId(), j+1, j+1, qinfo->RequiredSourceItemId[j]);
|
qinfo->GetQuestId(), j+1, j+1, qinfo->RequiredSourceItemCount[j]);
|
||||||
// no changes, quest ignore this data
|
// no changes, quest ignore this data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4190,6 +4194,161 @@ void ObjectMgr::LoadQuests()
|
|||||||
qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
|
qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (uint8 j = 0; j < QUEST_REWARD_CURRENCY_COUNT; ++j)
|
||||||
|
{
|
||||||
|
uint32 currency = qinfo->RewardCurrencyId[j];
|
||||||
|
if (currency)
|
||||||
|
{
|
||||||
|
if (qinfo->RewardCurrencyCount[j] == 0)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardCurrencyId%d` = %u but `RewardCurrencyCount%d` = 0, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), j+1, currency, j+1);
|
||||||
|
// no changes, quest can't be done for this requirement
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Re-enable once currency dbc getters are implemented
|
||||||
|
if (!sObjectMgr->GetCurrency(currency))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardCurrencyId%d` = %u but currency with entry %u does not exist, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), j+1, currency, currency);
|
||||||
|
qinfo->RewardCurrencyCount[j] = 0; // prevent incorrect work of quest
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
else if (qinfo->RewardCurrencyCount[j] > 0)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardCurrencyId%d` = 0 but `RewardCurrencyCount%d` = %u, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), j+1, j+1, qinfo->RewardCurrencyCount[j]);
|
||||||
|
qinfo->RewardCurrencyCount[j] = 0; // prevent incorrect work of quest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint8 j = 0; j < QUEST_REQUIRED_CURRENCY_COUNT; ++j)
|
||||||
|
{
|
||||||
|
uint32 currency = qinfo->RequiredCurrencyId[j];
|
||||||
|
if (currency)
|
||||||
|
{
|
||||||
|
if (qinfo->RequiredCurrencyCount[j] == 0)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RequiredCurrencyId%d` = %u but `RequiredCurrencyCount%d` = 0, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), j+1, currency, j+1);
|
||||||
|
// no changes, quest can't be done for this requirement
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Re-enable once currency dbc getters are implemented
|
||||||
|
if (!sObjectMgr->GetCurrency(currency))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RequiredCurrencyId%d` = %u but currency with entry %u does not exist, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), j+1, currency, currency);
|
||||||
|
qinfo->RequiredCurrencyCount[j] = 0; // prevent incorrect work of quest
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
else if (qinfo->RequiredCurrencyCount[j] > 0)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RequiredCurrencyId%d` = 0 but `RequiredCurrencyCount%d` = %u, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), j+1, j+1, qinfo->RequiredCurrencyCount[j]);
|
||||||
|
qinfo->RequiredCurrencyCount[j] = 0; // prevent incorrect work of quest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->SoundAccept)
|
||||||
|
{
|
||||||
|
if (!sSoundEntriesStore.LookupEntry(qinfo->SoundAccept))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `SoundAccept` = %u but sound %u does not exist, set to 0.",
|
||||||
|
qinfo->GetQuestId(), qinfo->SoundAccept, qinfo->SoundAccept);
|
||||||
|
qinfo->SoundAccept = 0; // no sound will be played
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->SoundTurnIn)
|
||||||
|
{
|
||||||
|
if (!sSoundEntriesStore.LookupEntry(qinfo->SoundTurnIn))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `SoundTurnIn` = %u but sound %u does not exist, set to 0.",
|
||||||
|
qinfo->GetQuestId(), qinfo->SoundTurnIn, qinfo->SoundTurnIn);
|
||||||
|
qinfo->SoundTurnIn = 0; // no sound will be played
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->RequiredSpell > 0)
|
||||||
|
{
|
||||||
|
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RequiredSpell);
|
||||||
|
|
||||||
|
if (!spellInfo)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RequiredSpell` = %u but spell %u does not exist, quest will not require a spell.",
|
||||||
|
qinfo->GetQuestId(), qinfo->RequiredSpell, qinfo->RequiredSpell);
|
||||||
|
qinfo->RequiredSpell = 0; // no spell will be required
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (!SpellMgr::IsSpellValid(spellInfo))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RequiredSpell` = %u but spell %u is broken, quest will not require a spell.",
|
||||||
|
qinfo->GetQuestId(), qinfo->RequiredSpell, qinfo->RequiredSpell);
|
||||||
|
qinfo->RequiredSpell = 0; // no spell will be required
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Can we require talents?
|
||||||
|
else if (GetTalentSpellCost(qinfo->RewardSpellCast))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardSpell` = %u but spell %u is talent, quest will not have a spell reward.",
|
||||||
|
qinfo->GetQuestId(), qinfo->RewardSpellCast, qinfo->RewardSpellCast);
|
||||||
|
qinfo->RewardSpellCast = 0; // no spell will be casted on player
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->RewardSkillId)
|
||||||
|
{
|
||||||
|
if (!sSkillLineStore.LookupEntry(qinfo->RewardSkillId))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardSkillId` = %u but this skill does not exist",
|
||||||
|
qinfo->GetQuestId(), qinfo->RewardSkillId);
|
||||||
|
}
|
||||||
|
if (!qinfo->RewardSkillPoints)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardSkillId` = %u but `RewardSkillPoints` is 0",
|
||||||
|
qinfo->GetQuestId(), qinfo->RewardSkillId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->RewardSkillPoints)
|
||||||
|
{
|
||||||
|
if (qinfo->RewardSkillPoints > sWorld->GetConfigMaxSkillValue())
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardSkillPoints` = %u but max possible skill is %u, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), qinfo->RewardSkillPoints, sWorld->GetConfigMaxSkillValue());
|
||||||
|
// no changes, quest can't be done for this requirement
|
||||||
|
}
|
||||||
|
if (!qinfo->RewardSkillId)
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `RewardSkillPoints` = %u but `RewardSkillId` is 0",
|
||||||
|
qinfo->GetQuestId(), qinfo->RewardSkillPoints);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->QuestGiverPortrait)
|
||||||
|
{
|
||||||
|
if (!sObjectMgr->GetCreatureTemplate(qinfo->QuestGiverPortrait))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `QuestGiverPortrait` = %u but creature with entry %u does not exist, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), qinfo->QuestGiverPortrait, qinfo->QuestGiverPortrait);
|
||||||
|
qinfo->QuestGiverPortrait = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qinfo->QuestTurnInPortrait)
|
||||||
|
{
|
||||||
|
if (!sObjectMgr->GetCreatureTemplate(qinfo->QuestTurnInPortrait))
|
||||||
|
{
|
||||||
|
sLog->outErrorDb("Quest %u has `QuestTurnInPortrait` = %u but creature with entry %u does not exist, quest can't be done.",
|
||||||
|
qinfo->GetQuestId(), qinfo->QuestTurnInPortrait, qinfo->QuestTurnInPortrait);
|
||||||
|
qinfo->QuestTurnInPortrait = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// fill additional data stores
|
// fill additional data stores
|
||||||
if (qinfo->PrevQuestId)
|
if (qinfo->PrevQuestId)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,114 +61,150 @@ Quest::Quest(Field* questRecord)
|
|||||||
SourceSpellid = questRecord[36].GetUInt32();
|
SourceSpellid = questRecord[36].GetUInt32();
|
||||||
Flags = questRecord[37].GetUInt32();
|
Flags = questRecord[37].GetUInt32();
|
||||||
uint32 SpecialFlags = questRecord[38].GetUInt16();
|
uint32 SpecialFlags = questRecord[38].GetUInt16();
|
||||||
RewardTitleId = questRecord[39].GetUInt32();
|
MinimapTargetMark = questRecord[39].GetUInt32();
|
||||||
RequiredPlayerKills = questRecord[40].GetUInt32();
|
RewardTitleId = questRecord[40].GetUInt32();
|
||||||
RewardTalents = questRecord[41].GetUInt32();
|
RequiredPlayerKills = questRecord[41].GetUInt32();
|
||||||
RewardArenaPoints = questRecord[42].GetInt32();
|
RewardTalents = questRecord[42].GetUInt32();
|
||||||
|
RewardArenaPoints = questRecord[43].GetInt32();
|
||||||
|
RewardSkillId = questRecord[44].GetUInt32();
|
||||||
|
RewardSkillPoints = questRecord[45].GetUInt32();
|
||||||
|
RewardReputationMask = questRecord[46].GetUInt32();
|
||||||
|
QuestGiverPortrait = questRecord[47].GetUInt32();
|
||||||
|
QuestTurnInPortrait = questRecord[48].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
|
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
|
||||||
RewardItemId[i] = questRecord[43+i].GetUInt32();
|
RewardItemId[i] = questRecord[49+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
|
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
|
||||||
RewardItemIdCount[i] = questRecord[47+i].GetUInt32();
|
RewardItemIdCount[i] = questRecord[53+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
|
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
|
||||||
RewardChoiceItemId[i] = questRecord[51+i].GetUInt32();
|
RewardChoiceItemId[i] = questRecord[57+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
|
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
|
||||||
RewardChoiceItemCount[i] = questRecord[57+i].GetUInt32();
|
RewardChoiceItemCount[i] = questRecord[63+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
|
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
|
||||||
RewardFactionId[i] = questRecord[63+i].GetUInt32();
|
RewardFactionId[i] = questRecord[69+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
|
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
|
||||||
RewardFactionValueId[i] = questRecord[68+i].GetInt32();
|
RewardFactionValueId[i] = questRecord[74+i].GetInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
|
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
|
||||||
RewardFactionValueIdOverride[i] = questRecord[73+i].GetInt32();
|
RewardFactionValueIdOverride[i] = questRecord[79+i].GetInt32();
|
||||||
|
|
||||||
PointMapId = questRecord[78].GetUInt32();
|
PointMapId = questRecord[84].GetUInt32();
|
||||||
PointX = questRecord[79].GetFloat();
|
PointX = questRecord[85].GetFloat();
|
||||||
PointY = questRecord[80].GetFloat();
|
PointY = questRecord[86].GetFloat();
|
||||||
PointOption = questRecord[81].GetUInt32();
|
PointOption = questRecord[87].GetUInt32();
|
||||||
Title = questRecord[82].GetString();
|
Title = questRecord[88].GetString();
|
||||||
Objectives = questRecord[83].GetString();
|
Objectives = questRecord[89].GetString();
|
||||||
Details = questRecord[84].GetString();
|
Details = questRecord[90].GetString();
|
||||||
EndText = questRecord[85].GetString();
|
EndText = questRecord[91].GetString();
|
||||||
OfferRewardText = questRecord[86].GetString();
|
CompletedText = questRecord[92].GetString();
|
||||||
RequestItemsText = questRecord[87].GetString();
|
OfferRewardText = questRecord[93].GetString();
|
||||||
CompletedText = questRecord[88].GetString();
|
RequestItemsText = questRecord[94].GetString();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
RequiredNpcOrGo[i] = questRecord[89+i].GetInt32();
|
RequiredNpcOrGo[i] = questRecord[95+i].GetInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
RequiredNpcOrGoCount[i] = questRecord[93+i].GetUInt32();
|
RequiredNpcOrGoCount[i] = questRecord[99+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
||||||
RequiredSourceItemid[i] = questRecord[97+i].GetUInt32();
|
RequiredSourceItemId[i] = questRecord[103+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
|
||||||
RequiredSourceItemId[i] = questRecord[101+i].GetUInt32();
|
RequiredSourceItemCount[i] = questRecord[107+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
||||||
RequiredItemId[i] = questRecord[105+i].GetUInt32();
|
RequiredItemId[i] = questRecord[111+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
||||||
RequiredItemCount[i] = questRecord[111+i].GetUInt32();
|
RequiredItemCount[i] = questRecord[117+i].GetUInt32();
|
||||||
|
|
||||||
|
RequiredSpell = questRecord[123].GetUInt32();
|
||||||
|
|
||||||
|
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) // To be removed
|
||||||
|
RequiredSpellCast[i] = questRecord[124+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
RequiredSpellCast[i] = questRecord[117+i].GetUInt32();
|
ObjectiveText[i] = questRecord[128+i].GetString();
|
||||||
|
|
||||||
// int8 Unknown0 = questRecord[121].GetUInt32();
|
for (int i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
|
||||||
|
RewardCurrencyId[i] = questRecord[132].GetUInt32();
|
||||||
|
|
||||||
|
for (int i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
|
||||||
|
RewardCurrencyCount[i] = questRecord[136].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (int i = 0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i)
|
||||||
ObjectiveText[i] = questRecord[122+i].GetString();
|
RequiredCurrencyId[i] = questRecord[140].GetUInt32();
|
||||||
|
|
||||||
|
for (int i = 0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i)
|
||||||
|
RequiredCurrencyCount[i] = questRecord[144].GetUInt32();
|
||||||
|
|
||||||
|
QuestGiverTextWindow = questRecord[148].GetString();
|
||||||
|
QuestGiverTargetName = questRecord[149].GetString();
|
||||||
|
QuestTurnTextWindow = questRecord[150].GetString();
|
||||||
|
QuestTurnTargetName = questRecord[151].GetString();
|
||||||
|
SoundAccept = questRecord[152].GetUInt32();
|
||||||
|
SoundTurnIn = questRecord[153].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
||||||
DetailsEmote[i] = questRecord[126+i].GetUInt32();
|
DetailsEmote[i] = questRecord[154+i].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
||||||
DetailsEmoteDelay[i] = questRecord[130+i].GetUInt32();
|
DetailsEmoteDelay[i] = questRecord[158+i].GetUInt32();
|
||||||
|
|
||||||
EmoteOnIncomplete = questRecord[134].GetUInt32();
|
EmoteOnIncomplete = questRecord[162].GetUInt32();
|
||||||
EmoteOnComplete = questRecord[135].GetUInt32();
|
EmoteOnComplete = questRecord[163].GetUInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
||||||
OfferRewardEmote[i] = questRecord[136+i].GetInt32();
|
OfferRewardEmote[i] = questRecord[164+i].GetInt32();
|
||||||
|
|
||||||
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
|
||||||
OfferRewardEmoteDelay[i] = questRecord[140+i].GetInt32();
|
OfferRewardEmoteDelay[i] = questRecord[168+i].GetInt32();
|
||||||
|
|
||||||
StartScript = questRecord[144].GetUInt32();
|
StartScript = questRecord[172].GetUInt32();
|
||||||
CompleteScript = questRecord[145].GetUInt32();
|
CompleteScript = questRecord[173].GetUInt32();
|
||||||
|
|
||||||
// int32 WDBVerified = questRecord[146].GetInt32();
|
// int32 WDBVerified = questRecord[174].GetInt32();
|
||||||
|
|
||||||
Flags |= SpecialFlags << 20;
|
Flags |= SpecialFlags << 20;
|
||||||
if (Flags & QUEST_TRINITY_FLAGS_AUTO_ACCEPT)
|
if (Flags & QUEST_TRINITY_FLAGS_AUTO_ACCEPT)
|
||||||
Flags |= QUEST_FLAGS_AUTO_ACCEPT;
|
Flags |= QUEST_FLAGS_AUTO_ACCEPT;
|
||||||
|
|
||||||
m_reqitemscount = 0;
|
m_reqItemsCount = 0;
|
||||||
m_reqCreatureOrGOcount = 0;
|
m_reqNpcOrGoCount = 0;
|
||||||
m_rewitemscount = 0;
|
m_rewItemsCount = 0;
|
||||||
m_rewchoiceitemscount = 0;
|
m_rewChoiceItemsCount = 0;
|
||||||
|
m_rewCurrencyCount = 0;
|
||||||
|
m_reqCurrencyCount = 0;
|
||||||
|
|
||||||
for (int i=0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
for (int i=0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
|
||||||
if (RequiredItemId[i])
|
if (RequiredItemId[i])
|
||||||
++m_reqitemscount;
|
++m_reqItemsCount;
|
||||||
|
|
||||||
for (int i=0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
for (int i=0; i < QUEST_OBJECTIVES_COUNT; ++i)
|
||||||
if (RequiredNpcOrGo[i])
|
if (RequiredNpcOrGo[i])
|
||||||
++m_reqCreatureOrGOcount;
|
++m_reqNpcOrGoCount;
|
||||||
|
|
||||||
for (int i=0; i < QUEST_REWARDS_COUNT; ++i)
|
for (int i=0; i < QUEST_REWARDS_COUNT; ++i)
|
||||||
if (RewardItemId[i])
|
if (RewardItemId[i])
|
||||||
++m_rewitemscount;
|
++m_rewItemsCount;
|
||||||
|
|
||||||
for (int i=0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
|
for (int i=0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
|
||||||
if (RewardChoiceItemId[i])
|
if (RewardChoiceItemId[i])
|
||||||
++m_rewchoiceitemscount;
|
++m_rewChoiceItemsCount;
|
||||||
|
|
||||||
|
for (int i=0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
|
||||||
|
if (RewardCurrencyId[i])
|
||||||
|
++m_rewCurrencyCount;
|
||||||
|
|
||||||
|
for (int i=0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i)
|
||||||
|
if (RequiredCurrencyId[i])
|
||||||
|
++m_reqCurrencyCount;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Quest::XPValue(Player* player) const
|
uint32 Quest::XPValue(Player* player) const
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ class ObjectMgr;
|
|||||||
#define QUEST_REPUTATIONS_COUNT 5
|
#define QUEST_REPUTATIONS_COUNT 5
|
||||||
#define QUEST_EMOTE_COUNT 4
|
#define QUEST_EMOTE_COUNT 4
|
||||||
#define QUEST_PVP_KILL_SLOT 0
|
#define QUEST_PVP_KILL_SLOT 0
|
||||||
|
#define QUEST_REWARD_CURRENCY_COUNT 4
|
||||||
|
#define QUEST_REQUIRED_CURRENCY_COUNT 4
|
||||||
|
|
||||||
enum QuestFailedReasons
|
enum QuestFailedReasons
|
||||||
{
|
{
|
||||||
@@ -173,6 +175,11 @@ struct QuestLocale
|
|||||||
StringVector EndText;
|
StringVector EndText;
|
||||||
StringVector CompletedText;
|
StringVector CompletedText;
|
||||||
std::vector< StringVector > ObjectiveText;
|
std::vector< StringVector > ObjectiveText;
|
||||||
|
// new on 4.x
|
||||||
|
StringVector QuestGiverTextWindow;
|
||||||
|
StringVector QuestGiverTargetName;
|
||||||
|
StringVector QuestTurnTextWindow;
|
||||||
|
StringVector QuestTurnTargetName;
|
||||||
};
|
};
|
||||||
|
|
||||||
// This Quest class provides a convenient way to access a few pretotaled (cached) quest details,
|
// This Quest class provides a convenient way to access a few pretotaled (cached) quest details,
|
||||||
@@ -229,11 +236,14 @@ class Quest
|
|||||||
std::string GetRequestItemsText() const { return RequestItemsText; }
|
std::string GetRequestItemsText() const { return RequestItemsText; }
|
||||||
std::string GetEndText() const { return EndText; }
|
std::string GetEndText() const { return EndText; }
|
||||||
std::string GetCompletedText() const { return CompletedText; }
|
std::string GetCompletedText() const { return CompletedText; }
|
||||||
|
std::string GetQuestGiverTextWindow() const { return QuestGiverTextWindow; }
|
||||||
|
std::string GetQuestGiverTargetName() const { return QuestGiverTargetName; }
|
||||||
|
std::string GetQuestTurnTextWindow() const { return QuestTurnTextWindow; }
|
||||||
|
std::string GetQuestTurnTargetName() const { return QuestTurnTargetName; }
|
||||||
int32 GetRewOrReqMoney() const;
|
int32 GetRewOrReqMoney() const;
|
||||||
uint32 GetRewHonorAddition() const { return RewardHonor; }
|
uint32 GetRewHonorAddition() const { return RewardHonor; }
|
||||||
float GetRewHonorMultiplier() const { return RewardHonorMultiplier; }
|
float GetRewHonorMultiplier() const { return RewardHonorMultiplier; }
|
||||||
uint32 GetRewMoneyMaxLevel() const { return RewardMoneyMaxLevel; }
|
uint32 GetRewMoneyMaxLevel() const { return RewardMoneyMaxLevel; } // use in XP calculation at client
|
||||||
// use in XP calculation at client
|
|
||||||
uint32 GetRewSpell() const { return RewardSpell; }
|
uint32 GetRewSpell() const { return RewardSpell; }
|
||||||
int32 GetRewSpellCast() const { return RewardSpellCast; }
|
int32 GetRewSpellCast() const { return RewardSpellCast; }
|
||||||
uint32 GetRewMailTemplateId() const { return RewardMailTemplateId; }
|
uint32 GetRewMailTemplateId() const { return RewardMailTemplateId; }
|
||||||
@@ -242,6 +252,9 @@ class Quest
|
|||||||
float GetPointX() const { return PointX; }
|
float GetPointX() const { return PointX; }
|
||||||
float GetPointY() const { return PointY; }
|
float GetPointY() const { return PointY; }
|
||||||
uint32 GetPointOpt() const { return PointOption; }
|
uint32 GetPointOpt() const { return PointOption; }
|
||||||
|
uint32 GetRequiredSpell() const { return RequiredSpell; }
|
||||||
|
uint32 GetSoundAccept() const { return SoundAccept; }
|
||||||
|
uint32 GetSoundTurnIn() const { return SoundTurnIn; }
|
||||||
uint32 GetIncompleteEmote() const { return EmoteOnIncomplete; }
|
uint32 GetIncompleteEmote() const { return EmoteOnIncomplete; }
|
||||||
uint32 GetCompleteEmote() const { return EmoteOnComplete; }
|
uint32 GetCompleteEmote() const { return EmoteOnComplete; }
|
||||||
uint32 GetQuestStartScript() const { return StartScript; }
|
uint32 GetQuestStartScript() const { return StartScript; }
|
||||||
@@ -249,6 +262,12 @@ class Quest
|
|||||||
bool IsRepeatable() const { return Flags & QUEST_TRINITY_FLAGS_REPEATABLE; }
|
bool IsRepeatable() const { return Flags & QUEST_TRINITY_FLAGS_REPEATABLE; }
|
||||||
bool IsAutoComplete() const;
|
bool IsAutoComplete() const;
|
||||||
uint32 GetFlags() const { return Flags; }
|
uint32 GetFlags() const { return Flags; }
|
||||||
|
uint32 GetMinimapTargetMark() const { return MinimapTargetMark; }
|
||||||
|
uint32 GetRewardSkillId() const { return RewardSkillId; }
|
||||||
|
uint32 GetRewardSkillPoints() const { return RewardSkillPoints; }
|
||||||
|
uint32 GetRewardReputationMask() const { return RewardReputationMask; }
|
||||||
|
uint32 GetQuestGiverPortrait() const { return QuestGiverPortrait; }
|
||||||
|
uint32 GetQuestTurnInPortrait() const { return QuestTurnInPortrait; }
|
||||||
bool IsDaily() const { return Flags & QUEST_FLAGS_DAILY; }
|
bool IsDaily() const { return Flags & QUEST_FLAGS_DAILY; }
|
||||||
bool IsWeekly() const { return Flags & QUEST_FLAGS_WEEKLY; }
|
bool IsWeekly() const { return Flags & QUEST_FLAGS_WEEKLY; }
|
||||||
bool IsDailyOrWeekly() const { return Flags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); }
|
bool IsDailyOrWeekly() const { return Flags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); }
|
||||||
@@ -262,8 +281,8 @@ class Quest
|
|||||||
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];
|
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];
|
||||||
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT];
|
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT];
|
||||||
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT];
|
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT];
|
||||||
uint32 RequiredSourceItemid[QUEST_SOURCE_ITEM_IDS_COUNT];
|
|
||||||
uint32 RequiredSourceItemId[QUEST_SOURCE_ITEM_IDS_COUNT];
|
uint32 RequiredSourceItemId[QUEST_SOURCE_ITEM_IDS_COUNT];
|
||||||
|
uint32 RequiredSourceItemCount[QUEST_SOURCE_ITEM_IDS_COUNT];
|
||||||
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]; // >0 Creature <0 Gameobject
|
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]; // >0 Creature <0 Gameobject
|
||||||
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT];
|
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT];
|
||||||
uint32 RequiredSpellCast[QUEST_OBJECTIVES_COUNT];
|
uint32 RequiredSpellCast[QUEST_OBJECTIVES_COUNT];
|
||||||
@@ -278,11 +297,16 @@ class Quest
|
|||||||
uint32 DetailsEmoteDelay[QUEST_EMOTE_COUNT];
|
uint32 DetailsEmoteDelay[QUEST_EMOTE_COUNT];
|
||||||
uint32 OfferRewardEmote[QUEST_EMOTE_COUNT];
|
uint32 OfferRewardEmote[QUEST_EMOTE_COUNT];
|
||||||
uint32 OfferRewardEmoteDelay[QUEST_EMOTE_COUNT];
|
uint32 OfferRewardEmoteDelay[QUEST_EMOTE_COUNT];
|
||||||
|
// 4.x
|
||||||
|
uint32 RewardCurrencyId[QUEST_REWARD_CURRENCY_COUNT];
|
||||||
|
uint32 RewardCurrencyCount[QUEST_REWARD_CURRENCY_COUNT];
|
||||||
|
uint32 RequiredCurrencyId[QUEST_REQUIRED_CURRENCY_COUNT];
|
||||||
|
uint32 RequiredCurrencyCount[QUEST_REQUIRED_CURRENCY_COUNT];
|
||||||
|
|
||||||
uint32 GetReqItemsCount() const { return m_reqitemscount; }
|
uint32 GetReqItemsCount() const { return m_reqItemsCount; }
|
||||||
uint32 GetReqCreatureOrGOcount() const { return m_reqCreatureOrGOcount; }
|
uint32 GetReqCreatureOrGOcount() const { return m_reqNpcOrGoCount; }
|
||||||
uint32 GetRewChoiceItemsCount() const { return m_rewchoiceitemscount; }
|
uint32 GetRewChoiceItemsCount() const { return m_rewChoiceItemsCount; }
|
||||||
uint32 GetRewItemsCount() const { return m_rewitemscount; }
|
uint32 GetRewItemsCount() const { return m_rewItemsCount; }
|
||||||
|
|
||||||
typedef std::vector<int32> PrevQuests;
|
typedef std::vector<int32> PrevQuests;
|
||||||
PrevQuests prevQuests;
|
PrevQuests prevQuests;
|
||||||
@@ -291,10 +315,12 @@ class Quest
|
|||||||
|
|
||||||
// cached data
|
// cached data
|
||||||
private:
|
private:
|
||||||
uint32 m_reqitemscount;
|
uint32 m_reqItemsCount;
|
||||||
uint32 m_reqCreatureOrGOcount;
|
uint32 m_reqNpcOrGoCount;
|
||||||
uint32 m_rewchoiceitemscount;
|
uint32 m_rewChoiceItemsCount;
|
||||||
uint32 m_rewitemscount;
|
uint32 m_rewItemsCount;
|
||||||
|
uint32 m_rewCurrencyCount;
|
||||||
|
uint32 m_reqCurrencyCount;
|
||||||
|
|
||||||
// table data
|
// table data
|
||||||
protected:
|
protected:
|
||||||
@@ -355,6 +381,20 @@ class Quest
|
|||||||
uint32 EmoteOnComplete;
|
uint32 EmoteOnComplete;
|
||||||
uint32 StartScript;
|
uint32 StartScript;
|
||||||
uint32 CompleteScript;
|
uint32 CompleteScript;
|
||||||
|
// new in 4.x
|
||||||
|
uint32 MinimapTargetMark;
|
||||||
|
uint32 RewardSkillId;
|
||||||
|
uint32 RewardSkillPoints;
|
||||||
|
uint32 RewardReputationMask;
|
||||||
|
uint32 QuestGiverPortrait;
|
||||||
|
uint32 QuestTurnInPortrait;
|
||||||
|
uint32 RequiredSpell;
|
||||||
|
std::string QuestGiverTextWindow;
|
||||||
|
std::string QuestGiverTargetName;
|
||||||
|
std::string QuestTurnTextWindow;
|
||||||
|
std::string QuestTurnTargetName;
|
||||||
|
uint32 SoundAccept;
|
||||||
|
uint32 SoundTurnIn;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct QuestStatusData
|
struct QuestStatusData
|
||||||
|
|||||||
Reference in New Issue
Block a user