You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
10 KiB
319 lines
10 KiB
local _, addon = ...
|
|
local API = addon.API;
|
|
|
|
--User Settings:
|
|
local SIMPLIFY_CURRENCY_REWARD = false;
|
|
|
|
----------------
|
|
|
|
local GetQuestID = GetQuestID;
|
|
local GetQuestRewardSpells = C_QuestInfoSystem.GetQuestRewardSpells;
|
|
local GetQuestRewardSpellInfo = C_QuestInfoSystem.GetQuestRewardSpellInfo;
|
|
local GetNumQuestRewards = GetNumQuestRewards;
|
|
local GetNumQuestChoices = GetNumQuestChoices;
|
|
local GetNumRewardCurrencies = API.GetNumRewardCurrencies;
|
|
local GetRewardMoney = GetRewardMoney;
|
|
local GetRewardSkillPoints = API.GetRewardSkillPoints;
|
|
local GetRewardSkillLineID = GetRewardSkillLineID;
|
|
local GetRewardXP = GetRewardXP;
|
|
local GetRewardArtifactXP = API.GetRewardArtifactXP;
|
|
local GetRewardHonor = GetRewardHonor;
|
|
local GetRewardTitle = GetRewardTitle;
|
|
local QuestCanHaveWarModeBonus = API.QuestCanHaveWarModeBonus;
|
|
local QuestHasQuestSessionBonus = API.QuestHasQuestSessionBonus;
|
|
local GetQuestOfferMajorFactionReputationRewards = (C_QuestOffer and C_QuestOffer.GetQuestOfferMajorFactionReputationRewards) or API.AlwaysFalse;
|
|
local GetQuestItemInfoLootType = API.GetQuestItemInfoLootType;
|
|
local IsSpellKnownOrOverridesKnown = IsSpellKnownOrOverridesKnown;
|
|
local IsCharacterNewlyBoosted = IsCharacterNewlyBoosted;
|
|
|
|
|
|
local tinsert = table.insert;
|
|
local ipairs = ipairs;
|
|
|
|
--MirageDialogBaseMixin Declared in SharedUITemplates.lua
|
|
|
|
local QuestCompleteSpellType = Enum.QuestCompleteSpellType;
|
|
|
|
local QUEST_INFO_SPELL_REWARD_ORDERING = {
|
|
QuestCompleteSpellType.Follower,
|
|
QuestCompleteSpellType.Companion,
|
|
QuestCompleteSpellType.Tradeskill,
|
|
QuestCompleteSpellType.Ability,
|
|
QuestCompleteSpellType.Aura,
|
|
QuestCompleteSpellType.Spell,
|
|
QuestCompleteSpellType.Unlock,
|
|
};
|
|
|
|
--[[
|
|
local QUEST_INFO_SPELL_REWARD_TO_HEADER = {
|
|
[QuestCompleteSpellType.Follower] = REWARD_FOLLOWER,
|
|
[QuestCompleteSpellType.Companion] = REWARD_COMPANION,
|
|
[QuestCompleteSpellType.Tradeskill] = REWARD_TRADESKILL_SPELL,
|
|
[QuestCompleteSpellType.Ability] = REWARD_ABILITY,
|
|
[QuestCompleteSpellType.Aura] = REWARD_AURA,
|
|
[QuestCompleteSpellType.Spell] = REWARD_SPELL,
|
|
[QuestCompleteSpellType.Unlock] = REWARD_UNLOCK,
|
|
};
|
|
--]]
|
|
|
|
local function GetRewardSpellBucketType(spellInfo)
|
|
if spellInfo.type and spellInfo.type ~= QuestCompleteSpellType.LegacyBehavior then
|
|
return spellInfo.type;
|
|
elseif spellInfo.isTradeskillSpell then
|
|
return QuestCompleteSpellType.Tradeskill;
|
|
elseif spellInfo.isBoostSpell then
|
|
return QuestCompleteSpellType.Ability;
|
|
elseif spellInfo.garrFollowerID then
|
|
local followerInfo = C_Garrison.GetFollowerInfo(spellInfo.garrFollowerID);
|
|
if followerInfo and followerInfo.followerTypeID == Enum.GarrisonFollowerType.FollowerType_9_0_GarrisonFollower then
|
|
return QuestCompleteSpellType.Companion;
|
|
else
|
|
return QuestCompleteSpellType.Follower;
|
|
end
|
|
elseif spellInfo.isSpellLearned then
|
|
return QuestCompleteSpellType.Spell;
|
|
elseif spellInfo.genericUnlock then
|
|
return QuestCompleteSpellType.Unlock;
|
|
end
|
|
|
|
return QuestCompleteSpellType.Aura;
|
|
end
|
|
|
|
local function AddSpellToBucket(buckets, spellInfo)
|
|
local subType = GetRewardSpellBucketType(spellInfo);
|
|
|
|
if not buckets[subType] then
|
|
buckets[subType] = {};
|
|
end
|
|
|
|
tinsert(buckets[subType], spellInfo);
|
|
end
|
|
|
|
|
|
|
|
local SORT_PRIORITY = {
|
|
SetXP = 1,
|
|
SetMoney = 2,
|
|
};
|
|
|
|
local function SortRewardList(a, b)
|
|
if a.small ~= b.small then
|
|
return b.small
|
|
end
|
|
|
|
if a[1] ~= b[1] then
|
|
local p1 = SORT_PRIORITY[a[1]];
|
|
local p2 = SORT_PRIORITY[b[1]];
|
|
if p1 and p2 then
|
|
return p1 < p2
|
|
elseif p1 then
|
|
return true
|
|
elseif p2 then
|
|
return false
|
|
end
|
|
end
|
|
|
|
if a.order and b.order then
|
|
return a.order < b.order
|
|
elseif a.order then
|
|
return true
|
|
elseif b.order then
|
|
return false
|
|
end
|
|
|
|
return a[2] < b[2]
|
|
end
|
|
|
|
|
|
local function BuildRewardList(questComplete)
|
|
--Derivative of QuestInfo_ShowRewards in QuestInfo.lua
|
|
local rewardList = {};
|
|
|
|
local questID = GetQuestID(); --C_QuestLog.GetSelectedQuest
|
|
|
|
local numQuestRewards = 0;
|
|
local numQuestChoices = 0;
|
|
local numQuestCurrencies = 0;
|
|
local money = 0;
|
|
local skillName;
|
|
local skillPoints;
|
|
local skillIcon;
|
|
local xp = 0;
|
|
local artifactXP = 0;
|
|
local artifactCategory;
|
|
local honor = 0;
|
|
local playerTitle;
|
|
local spellRewards = GetQuestRewardSpells(questID) or {};
|
|
local spellRewardBuckets = {};
|
|
local hasWarModeBonus = false;
|
|
local majorFactionRepRewards;
|
|
|
|
numQuestRewards = GetNumQuestRewards();
|
|
numQuestChoices = GetNumQuestChoices();
|
|
numQuestCurrencies = GetNumRewardCurrencies(questID);
|
|
money = GetRewardMoney();
|
|
skillName, skillIcon, skillPoints = GetRewardSkillPoints();
|
|
xp = GetRewardXP();
|
|
artifactXP, artifactCategory = GetRewardArtifactXP();
|
|
honor = GetRewardHonor();
|
|
playerTitle = GetRewardTitle();
|
|
hasWarModeBonus = QuestCanHaveWarModeBonus(questID);
|
|
majorFactionRepRewards = GetQuestOfferMajorFactionReputationRewards();
|
|
|
|
for index, spellID in ipairs(spellRewards) do
|
|
if spellID and spellID > 0 then
|
|
local spellInfo = GetQuestRewardSpellInfo(questID, spellID);
|
|
local knownSpell = IsSpellKnownOrOverridesKnown(spellID);
|
|
|
|
-- only allow the spell reward if user can learn it
|
|
if spellInfo and spellInfo.texture and not knownSpell and (not spellInfo.isBoostSpell or IsCharacterNewlyBoosted()) and (not spellInfo.garrFollowerID or not C_Garrison.IsFollowerCollected(spellInfo.garrFollowerID)) then
|
|
spellInfo.spellID = spellID;
|
|
AddSpellToBucket(spellRewardBuckets, spellInfo);
|
|
end
|
|
end
|
|
end
|
|
|
|
local totalRewards = numQuestRewards + numQuestChoices + numQuestCurrencies;
|
|
if ( totalRewards == 0 and money == 0 and xp == 0 and not playerTitle and #spellRewards == 0 and artifactXP == 0 and honor == 0 and not majorFactionRepRewards ) then
|
|
return nil;
|
|
end
|
|
|
|
|
|
if ( artifactXP > 0 ) then
|
|
local artifactName, icon = C_ArtifactUI.GetArtifactXPRewardTargetInfo(artifactCategory);
|
|
end
|
|
|
|
|
|
-- Setup spell rewards
|
|
if #spellRewards > 0 then
|
|
local spellIndex = 100;
|
|
for orderIndex, spellBucketType in ipairs(QUEST_INFO_SPELL_REWARD_ORDERING) do
|
|
local spellBucket = spellRewardBuckets[spellBucketType];
|
|
if spellBucket then
|
|
for i, spellInfo in ipairs(spellBucket) do
|
|
spellIndex = spellIndex + 1;
|
|
|
|
if spellInfo.garrFollowerID then
|
|
local followerInfo = C_Garrison.GetFollowerInfo(spellInfo.garrFollowerID);
|
|
tinsert(rewardList, {"SetRewardFollower", spellInfo.garrFollowerID});
|
|
else
|
|
local spellIcon = spellInfo.texture;
|
|
local spellName = spellInfo.name;
|
|
local spellID = spellInfo.spellID;
|
|
tinsert(rewardList, {"SetRewardspell", spellID, spellIcon, spellName, order = spellIndex});
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if playerTitle then
|
|
tinsert(rewardList, {"SetRewardTitle", playerTitle, order = 10});
|
|
end
|
|
|
|
local hasChanceForQuestSessionBonusReward = QuestHasQuestSessionBonus(questID); --Party Sync
|
|
|
|
if ( numQuestRewards > 0 or numQuestCurrencies > 0 or money > 0 or xp > 0 or honor > 0 or majorFactionRepRewards or hasChanceForQuestSessionBonusReward ) then
|
|
-- Money rewards
|
|
if ( money > 0 ) then
|
|
tinsert(rewardList, {"SetMoney", money, small = true});
|
|
end
|
|
-- XP rewards
|
|
if xp > 0 then
|
|
tinsert(rewardList, {"SetXP", xp, small = true});
|
|
end
|
|
-- Skill Point rewards
|
|
if skillPoints then
|
|
local skillLineID = GetRewardSkillLineID();
|
|
tinsert(rewardList, {"SetRewardSkill", skillIcon, skillPoints, skillName, skillLineID, order = 50});
|
|
end
|
|
|
|
|
|
-- Item rewards
|
|
for i = 1, numQuestRewards do
|
|
tinsert(rewardList, {"SetRewardItem", i});
|
|
end
|
|
|
|
-- currency
|
|
local foundCurrencies = 0;
|
|
for i = 1, numQuestCurrencies, 1 do
|
|
tinsert(rewardList, {"SetRewardCurrency", i, small = SIMPLIFY_CURRENCY_REWARD});
|
|
|
|
foundCurrencies = foundCurrencies + 1;
|
|
if (foundCurrencies == numQuestCurrencies) then
|
|
break;
|
|
end
|
|
end
|
|
|
|
-- Major Faction Reputation Rewards
|
|
if majorFactionRepRewards then
|
|
for i, rewardInfo in ipairs(majorFactionRepRewards) do
|
|
tinsert(rewardList, {"SetMajorFactionReputation", rewardInfo, small = SIMPLIFY_CURRENCY_REWARD, order = i});
|
|
end
|
|
end
|
|
|
|
-- warmode bonus
|
|
if hasWarModeBonus and C_PvP.IsWarModeDesired() then
|
|
local bonus = C_PvP.GetWarModeRewardBonus();
|
|
if bonus and bonus > 0 then
|
|
tinsert(rewardList, {"SetWarModeBonus", bonus, order = 500});
|
|
end
|
|
end
|
|
|
|
if honor > 0 then
|
|
tinsert(rewardList, {"SetRewardHonor", honor, small = SIMPLIFY_CURRENCY_REWARD, order = 510});
|
|
end
|
|
|
|
-- Bonus reward chance for quest sessions
|
|
if hasChanceForQuestSessionBonusReward then
|
|
--QUEST_SESSION_BONUS_LOOT_REWARD_FRAME_TITLE --"Completing this quest while in Party Sync may reward:"
|
|
--questItem.type = "reward";
|
|
--questItem.objectType = "questSessionBonusReward";
|
|
|
|
local QUEST_SESSION_BONUS_REWARD_ITEM_ID = 171305;
|
|
local QUEST_SESSION_BONUS_REWARD_ITEM_COUNT = 1;
|
|
end
|
|
end
|
|
|
|
table.sort(rewardList, SortRewardList);
|
|
|
|
-- Setup choosable rewards
|
|
local chooseItems;
|
|
|
|
if numQuestChoices > 0 then
|
|
local sourceType = "choice";
|
|
local onlyChoice = numQuestChoices == 1;
|
|
|
|
if onlyChoice then
|
|
--REWARD_ITEMS_ONLY --You will receive
|
|
--Disaplay as normal rewards
|
|
local lootType = GetQuestItemInfoLootType(sourceType, 1);
|
|
|
|
if (lootType == 0) then -- LOOT_LIST_ITEM
|
|
tinsert(rewardList, 1, {"SetRewardChoiceItem", 1, true});
|
|
elseif (lootType == 1) then -- LOOT_LIST_CURRENCY
|
|
tinsert(rewardList, 1, {"SetRewardChoiceCurrency", 1, true});
|
|
end
|
|
else
|
|
local choiceGroup = {};
|
|
choiceGroup.isRewardChoices = true;
|
|
choiceGroup.chooseItems = questComplete;
|
|
choiceGroup.numChoices = numQuestChoices;
|
|
tinsert(rewardList, 1, choiceGroup);
|
|
chooseItems = questComplete;
|
|
end
|
|
end
|
|
|
|
return rewardList, chooseItems
|
|
end
|
|
|
|
addon.BuildRewardList = BuildRewardList;
|
|
|
|
do
|
|
local function Settings_SimplifyCurrencyReward(dbValue)
|
|
SIMPLIFY_CURRENCY_REWARD = dbValue == true;
|
|
addon.DialogueUI:OnSettingsChanged();
|
|
end
|
|
|
|
addon.CallbackRegistry:Register("SettingChanged.SimplifyCurrencyReward", Settings_SimplifyCurrencyReward);
|
|
end
|