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.
234 lines
8.8 KiB
234 lines
8.8 KiB
local _, KT = ...
|
|
|
|
KT_PROFESSION_RECIPE_TRACKER_MODULE = KT_ObjectiveTracker_GetModuleInfoTable("KT_PROFESSION_RECIPE_TRACKER_MODULE");
|
|
KT_PROFESSION_RECIPE_TRACKER_MODULE.updateReasonModule = KT_OBJECTIVE_TRACKER_UPDATE_MODULE_PROFESSION_RECIPE;
|
|
KT_PROFESSION_RECIPE_TRACKER_MODULE:SetHeader(KT_ObjectiveTrackerFrame.BlocksFrame.ProfessionHeader, PROFESSIONS_TRACKER_HEADER_PROFESSION);
|
|
|
|
local IsRecrafting = true;
|
|
|
|
-- *****************************************************************************************************
|
|
-- ***** BLOCK DROPDOWN FUNCTIONS
|
|
-- *****************************************************************************************************
|
|
|
|
function KT.GetRecipeID(block) -- MSA
|
|
return math.abs(block.id);
|
|
end
|
|
|
|
function KT.IsRecraftBlock(block) -- MSA
|
|
return block.id < 0;
|
|
end
|
|
|
|
local function RecipeObjectiveTracker_OnOpenDropDown(self)
|
|
--[[local block = self.activeFrame;
|
|
|
|
info = UIDropDownMenu_CreateInfo();
|
|
info.notCheckable = 1;
|
|
|
|
if not KT.IsRecraftBlock(block) and IsSpellKnown(KT.GetRecipeID(block)) then
|
|
info.text = PROFESSIONS_TRACKING_VIEW_RECIPE;
|
|
info.func = function()
|
|
C_TradeSkillUI.OpenRecipe(recipeID);
|
|
end;
|
|
info.arg1 = block.id;
|
|
info.checked = false;
|
|
UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL);
|
|
end
|
|
|
|
info.text = PROFESSIONS_UNTRACK_RECIPE;
|
|
info.func = function()
|
|
local track = false;
|
|
C_TradeSkillUI.SetRecipeTracked(KT.GetRecipeID(block), track, KT.IsRecraftBlock(block));
|
|
end;
|
|
info.arg1 = block.id;
|
|
info.checked = false;
|
|
UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL);]]
|
|
end
|
|
|
|
function KT_PROFESSION_RECIPE_TRACKER_MODULE:OnBlockHeaderClick(block, mouseButton)
|
|
if ( IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() ) then
|
|
local link = C_TradeSkillUI.GetRecipeLink(KT.GetRecipeID(block));
|
|
if ( link ) then
|
|
ChatEdit_InsertLink(link);
|
|
end
|
|
elseif ( mouseButton ~= "RightButton" ) then
|
|
--CloseDropDownMenus();
|
|
if ( not ProfessionsFrame ) then
|
|
ProfessionsFrame_LoadUI();
|
|
end
|
|
if ( IsModifiedClick("RECIPEWATCHTOGGLE") ) then
|
|
local track = false;
|
|
C_TradeSkillUI.SetRecipeTracked(KT.GetRecipeID(block), track, KT.IsRecraftBlock(block));
|
|
else
|
|
if not KT.IsRecraftBlock(block) then
|
|
C_TradeSkillUI.OpenRecipe(KT.GetRecipeID(block));
|
|
end
|
|
end
|
|
else
|
|
KT_ObjectiveTracker_ToggleDropDown(block, RecipeObjectiveTracker_OnOpenDropDown);
|
|
end
|
|
end
|
|
|
|
-- *****************************************************************************************************
|
|
-- ***** UPDATE FUNCTIONS
|
|
-- *****************************************************************************************************
|
|
local LINE_TYPE_ANIM = { template = "QuestObjectiveAnimLineTemplate", freeLines = { } };
|
|
|
|
function KT_PROFESSION_RECIPE_TRACKER_MODULE:Update()
|
|
self:BeginLayout();
|
|
|
|
if self.continuableContainer then
|
|
self.continuableContainer:Cancel();
|
|
end
|
|
|
|
self.continuableContainer = ContinuableContainer:Create();
|
|
local function LoadItems(recipes)
|
|
for _, recipeID in ipairs(recipes) do
|
|
local reagents = Professions.CreateRecipeReagentsForAllBasicReagents(recipeID);
|
|
for reagentIndex, reagent in ipairs(reagents) do
|
|
if reagent.itemID then
|
|
self.continuableContainer:AddContinuable(Item:CreateFromItemID(reagent.itemID));
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Load regular and recraft recipe items.
|
|
LoadItems(C_TradeSkillUI.GetRecipesTracked(IsRecrafting));
|
|
LoadItems(C_TradeSkillUI.GetRecipesTracked(not IsRecrafting));
|
|
|
|
local function Layout()
|
|
local colorStyle = KT_OBJECTIVE_TRACKER_COLOR["Normal"];
|
|
|
|
local function AddObjectives(isRecraft)
|
|
for _, recipeID in ipairs(C_TradeSkillUI.GetRecipesTracked(isRecraft)) do
|
|
local recipeSchematic = C_TradeSkillUI.GetRecipeSchematic(recipeID, isRecraft);
|
|
local blockID = NegateIf(recipeID, isRecraft);
|
|
local block = self:GetBlock(blockID);
|
|
local blockName = isRecraft and PROFESSIONS_CRAFTING_FORM_RECRAFTING_HEADER:format(recipeSchematic.name) or recipeSchematic.name;
|
|
self:SetBlockHeader(block, blockName);
|
|
|
|
for slotIndex, reagentSlotSchematic in ipairs(recipeSchematic.reagentSlotSchematics) do
|
|
if reagentSlotSchematic.reagentType == Enum.CraftingReagentType.Basic then
|
|
local reagent = reagentSlotSchematic.reagents[1];
|
|
local quantityRequired = reagentSlotSchematic.quantityRequired;
|
|
local quantity = Professions.AccumulateReagentsInPossession(reagentSlotSchematic.reagents);
|
|
local name = nil;
|
|
if reagent.itemID then
|
|
local item = Item:CreateFromItemID(reagent.itemID);
|
|
name = item:GetItemName();
|
|
elseif reagent.currencyID then
|
|
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(reagent.currencyID);
|
|
if currencyInfo then
|
|
name = currencyInfo.name;
|
|
end
|
|
end
|
|
|
|
if name then
|
|
local text = PROFESSIONS_TRACKER_REAGENT_FORMAT:format(PROFESSIONS_TRACKER_REAGENT_COUNT_FORMAT:format(quantity, quantityRequired), name)
|
|
local metQuantity = quantity >= quantityRequired;
|
|
local dashStyle = metQuantity and KT_OBJECTIVE_DASH_STYLE_HIDE or KT_OBJECTIVE_DASH_STYLE_SHOW;
|
|
local colorStyle = KT_OBJECTIVE_TRACKER_COLOR[metQuantity and "Complete" or "Normal"];
|
|
line = self:AddObjective(block, slotIndex, text, LINE_TYPE_ANIM, nil, dashStyle, colorStyle);
|
|
line.Check:SetShown(metQuantity);
|
|
end
|
|
end
|
|
end
|
|
|
|
block:SetHeight(block.height);
|
|
|
|
if ( KT_ObjectiveTracker_AddBlock(block) ) then
|
|
block:Show();
|
|
self:FreeUnusedLines(block);
|
|
else
|
|
block.used = false;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
AddObjectives(IsRecrafting);
|
|
AddObjectives(not IsRecrafting);
|
|
end
|
|
|
|
-- We can continue to layout each of the blocks if every item is loaded, otherwise
|
|
-- we need to wait until the items load, then notify the objective tracker to try again.
|
|
local allLoaded = true;
|
|
local function OnItemsLoaded()
|
|
if allLoaded then
|
|
Layout();
|
|
else
|
|
KT_ObjectiveTracker_Update(KT_OBJECTIVE_TRACKER_UPDATE_MODULE_PROFESSION_RECIPE);
|
|
end
|
|
end
|
|
-- The assignment of allLoaded is only meaningful if false. If and when the callback
|
|
-- is invoked later, it will force an update. If the value was true, the callback would have
|
|
-- already been invoked prior to returning.
|
|
allLoaded = self.continuableContainer:ContinueOnLoad(OnItemsLoaded);
|
|
|
|
self:EndLayout();
|
|
end
|
|
|
|
function KT_ProfessionsRecipeTracking_Initialize()
|
|
local function GetAllBasicReagentIDs()
|
|
local currencyIDs = {};
|
|
local itemIDs = {};
|
|
local function AddIDs(isRecraft)
|
|
for _, recipeID in ipairs(C_TradeSkillUI.GetRecipesTracked(isRecraft)) do
|
|
for _, reagent in ipairs(Professions.CreateRecipeReagentsForAllBasicReagents(recipeID)) do
|
|
if reagent.itemID then
|
|
table.insert(itemIDs, reagent.itemID);
|
|
elseif reagent.currencyID then
|
|
table.insert(currencyIDs, reagent.currencyID);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
AddIDs(IsRecrafting);
|
|
AddIDs(not IsRecrafting);
|
|
return itemIDs, currencyIDs;
|
|
end
|
|
|
|
-- itemIDs and currencyIDs captured by OnItemCountChanged will be updated by OnTrackedRecipeUpdate below.
|
|
local itemIDs, currencyIDs = GetAllBasicReagentIDs();
|
|
|
|
local function OnItemCountChanged(o, itemID)
|
|
if tContains(itemIDs, itemID) then
|
|
KT_ObjectiveTracker_Update(KT_OBJECTIVE_TRACKER_UPDATE_MODULE_PROFESSION_RECIPE);
|
|
end
|
|
end
|
|
EventRegistry:RegisterFrameEvent("ITEM_COUNT_CHANGED");
|
|
EventRegistry:RegisterCallback("ITEM_COUNT_CHANGED", OnItemCountChanged, KT_PROFESSION_RECIPE_TRACKER_MODULE);
|
|
|
|
local function OnCurrencyChanged(o, currencyID)
|
|
if tContains(currencyIDs, currencyID) then
|
|
ObjectiveTracker_Update(OBJECTIVE_TRACKER_UPDATE_MODULE_PROFESSION_RECIPE);
|
|
end
|
|
end
|
|
EventRegistry:RegisterFrameEvent("CURRENCY_DISPLAY_UPDATE");
|
|
EventRegistry:RegisterCallback("CURRENCY_DISPLAY_UPDATE", OnCurrencyChanged, PROFESSION_RECIPE_TRACKER_MODULE);
|
|
|
|
local function OnTrackedRecipeUpdate(o, recipeID, tracked)
|
|
itemIDs, currencyIDs = GetAllBasicReagentIDs();
|
|
KT_ObjectiveTracker_Update(KT_OBJECTIVE_TRACKER_UPDATE_MODULE_PROFESSION_RECIPE);
|
|
end
|
|
|
|
EventRegistry:RegisterFrameEvent("TRACKED_RECIPE_UPDATE");
|
|
EventRegistry:RegisterCallback("TRACKED_RECIPE_UPDATE", OnTrackedRecipeUpdate, KT_PROFESSION_RECIPE_TRACKER_MODULE);
|
|
|
|
local function UntrackRecipeIfUnlearned(isRecraft)
|
|
for _, recipeID in ipairs(C_TradeSkillUI.GetRecipesTracked(isRecraft)) do
|
|
if not C_TradeSkillUI.IsRecipeProfessionLearned(recipeID) then
|
|
local track = false;
|
|
C_TradeSkillUI.SetRecipeTracked(recipeID, track, isRecraft);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnSkillLinesChanged(o)
|
|
UntrackRecipeIfUnlearned(IsRecrafting);
|
|
UntrackRecipeIfUnlearned(not IsRecrafting);
|
|
end
|
|
EventRegistry:RegisterFrameEvent("SKILL_LINES_CHANGED");
|
|
EventRegistry:RegisterCallback("SKILL_LINES_CHANGED", OnSkillLinesChanged, KT_PROFESSION_RECIPE_TRACKER_MODULE);
|
|
end
|