| contrebasse@25 | 1 local addonName, A = ... | 
| contrebasse@25 | 2 | 
| contrebasse@25 | 3 -- @todo clean the A table | 
| contrebasse@25 | 4 -- @todo check local copy of globals functions | 
| contrebasse@25 | 5 -- @todo add support for dez ? | 
| contrebasse@41 | 6 -- @todo add support for hidden recipes, removing filtering | 
| contrebasse@25 | 7 -- @todo add support for cross tradeskill, like mining + forge/ingé | 
| contrebasse@25 | 8 | 
| contrebasse@25 | 9 --------------------------------------------------- | 
| contrebasse@25 | 10 -- Variables | 
| contrebasse@25 | 11 --------------------------------------------------- | 
| contrebasse@25 | 12 -- Used by findglobals | 
| contrebasse@25 | 13 -- GLOBALS: _G, CreateFrame, DEFAULT_CHAT_FRAME | 
| contrebasse@25 | 14 | 
| contrebasse@25 | 15 -- Lua functions | 
| contrebasse@25 | 16 | 
| contrebasse@25 | 17 -- Wow functions | 
| contrebasse@25 | 18 | 
| contrebasse@25 | 19 -- constant vars | 
| contrebasse@25 | 20 | 
| contrebasse@25 | 21 --------------------------------------------------- | 
| contrebasse@25 | 22 -- Manage events | 
| contrebasse@25 | 23 --------------------------------------------------- | 
| contrebasse@25 | 24 A.EventsFrame = CreateFrame("Frame") | 
| contrebasse@25 | 25 | 
| contrebasse@25 | 26 local SCAN_DELAY = 0.2 | 
| contrebasse@25 | 27 local t_throttle = SCAN_DELAY | 
| contrebasse@25 | 28 local function throttleScan(self, t_elapsed) | 
| contrebasse@25 | 29 	t_throttle = t_throttle - t_elapsed | 
| contrebasse@25 | 30 	if t_throttle<0 then | 
| contrebasse@25 | 31 		self:SetScript("OnUpdate", nil) | 
| contrebasse@25 | 32 | 
| contrebasse@25 | 33 		-- Close the external window if the tradeskill changed | 
| contrebasse@25 | 34 		if A.currentTradeSkill ~= GetTradeSkillLine() then | 
| contrebasse@25 | 35 			A.MenuFrame:Hide() | 
| contrebasse@25 | 36 		end | 
| contrebasse@25 | 37 		if IsTradeSkillGuild() or IsTradeSkillLinked() then | 
| contrebasse@25 | 38 			A.MenuFrame:Hide() | 
| contrebasse@25 | 39 			return | 
| contrebasse@25 | 40 		end | 
| contrebasse@25 | 41 | 
| contrebasse@25 | 42 		-- Scan availabe recipes | 
| contrebasse@27 | 43 		-- Rescan in case of problem | 
| contrebasse@27 | 44 		if not A:ScanSimpleRecipes() then | 
| contrebasse@27 | 45 			t_throttle = SCAN_DELAY | 
| contrebasse@27 | 46 			self:SetScript("OnUpdate", throttleScan) | 
| contrebasse@27 | 47 		end | 
| contrebasse@25 | 48 | 
| contrebasse@25 | 49 		-- Show makables reagents | 
| contrebasse@25 | 50 		A.updateCounts(GetTradeSkillSelectionIndex()) | 
| contrebasse@25 | 51 	end | 
| contrebasse@25 | 52 end | 
| contrebasse@25 | 53 A.EventsFrame:SetScript("OnEvent", function(self, event) | 
| contrebasse@25 | 54 	if event == "TRADE_SKILL_UPDATE" then | 
| contrebasse@25 | 55 		t_throttle = SCAN_DELAY | 
| contrebasse@25 | 56 		self:SetScript("OnUpdate", throttleScan) | 
| contrebasse@25 | 57 | 
| contrebasse@25 | 58 	elseif event == "TRADE_SKILL_SHOW" then | 
| contrebasse@25 | 59 		A:Initialize() | 
| contrebasse@25 | 60 		A.EventsFrame:UnregisterEvent("TRADE_SKILL_SHOW") | 
| contrebasse@25 | 61 	end -- if | 
| contrebasse@25 | 62 end) -- function | 
| contrebasse@25 | 63 A.EventsFrame:RegisterEvent("TRADE_SKILL_SHOW") | 
| contrebasse@25 | 64 A.EventsFrame:RegisterEvent("TRADE_SKILL_UPDATE") | 
| contrebasse@25 | 65 | 
| contrebasse@25 | 66 --------------------------------------------------- | 
| contrebasse@25 | 67 -- Initialize | 
| contrebasse@25 | 68 --------------------------------------------------- | 
| contrebasse@25 | 69 function A:Initialize() | 
| contrebasse@25 | 70 | 
| contrebasse@25 | 71 	-- Register clics on reagent's buttons | 
| contrebasse@25 | 72 	for i=1,7 do | 
| contrebasse@25 | 73 		local btn = _G["TradeSkillReagent"..i] | 
| contrebasse@25 | 74 		btn:HookScript("OnDoubleClick", A.ProcessReagent) | 
| contrebasse@25 | 75 		btn:HookScript("OnEnter", A.btnEntered) | 
| contrebasse@25 | 76 		btn:HookScript("OnLeave", A.btnLeft) | 
| contrebasse@25 | 77 		btn.SplitStack = A.SplitStack | 
| contrebasse@25 | 78 | 
| contrebasse@25 | 79 		local textureHighlight = btn:CreateTexture() | 
| contrebasse@25 | 80 		textureHighlight:Hide() | 
| contrebasse@25 | 81 		textureHighlight:SetTexture("Interface\\BUTTONS\\CheckButtonHilight") | 
| contrebasse@25 | 82 		textureHighlight:SetBlendMode("ADD") | 
| contrebasse@25 | 83 		textureHighlight:SetAllPoints("TradeSkillReagent"..i.."IconTexture") | 
| contrebasse@25 | 84 		btn.textureHighlight = textureHighlight | 
| contrebasse@25 | 85 | 
| contrebasse@25 | 86 		local label = btn:CreateFontString(nil,"ARTWORK","GameFontHighlight") | 
| contrebasse@25 | 87 		label:SetSize(100,20) | 
| contrebasse@25 | 88 		label:SetPoint("TOPLEFT",btn,"TOPLEFT",4,-4) | 
| contrebasse@25 | 89 		label:SetJustifyH("LEFT") | 
| contrebasse@25 | 90 		label:SetJustifyV("TOP") | 
| contrebasse@25 | 91 		label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") | 
| contrebasse@25 | 92 		btn.label = label | 
| contrebasse@25 | 93 	end -- for | 
| contrebasse@25 | 94 | 
| contrebasse@25 | 95 	A.tooltipRecipe = CreateFrame("GameTooltip", "ReagentMaker_tooltipRecipe",UIParent, "GameTooltipTemplate") | 
| contrebasse@25 | 96 	A.tooltipRecipe:SetFrameStrata("TOOLTIP") | 
| contrebasse@25 | 97 	A.tooltipRecipe:Hide() | 
| contrebasse@25 | 98 end -- function | 
| contrebasse@25 | 99 | 
| contrebasse@25 | 100 -- Function run after selecting a item in the tradeskill window | 
| contrebasse@25 | 101 function A.ProcessReagent(btn, ...) | 
| contrebasse@25 | 102 | 
| contrebasse@25 | 103 	-- Do not manage guild tradeskill | 
| contrebasse@25 | 104 	if IsTradeSkillGuild() or IsTradeSkillLinked() then return end | 
| contrebasse@25 | 105 | 
| contrebasse@25 | 106 	-- We want no modifiers, or shift to choose the number of reagent to craft | 
| contrebasse@25 | 107 	if IsModifierKeyDown() and not IsShiftKeyDown() then return end | 
| contrebasse@25 | 108 	local chooseNumberToCraft = IsShiftKeyDown() | 
| contrebasse@25 | 109 | 
| contrebasse@25 | 110 	--A.SaveActiveFilters() | 
| contrebasse@25 | 111 | 
| contrebasse@25 | 112 	-- Index of the reagent in the recipe, taken from the button name | 
| contrebasse@25 | 113 	local reagentRecipeIndex = A.buttonNumber(btn) | 
| contrebasse@25 | 114 | 
| contrebasse@25 | 115 	-- ID of the reagent we want to craft | 
| contrebasse@25 | 116 	local reagentID = A.link2ID(GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex)) | 
| contrebasse@25 | 117 | 
| contrebasse@25 | 118 	-- Continue only if the reagent is known | 
| contrebasse@25 | 119 	if not reagentID or not A.data[reagentID] then return end | 
| contrebasse@25 | 120 | 
| contrebasse@25 | 121 	-- If only one recipe is known for the reagent, use it | 
| contrebasse@25 | 122 	if #(A.data[reagentID]) == 1 and not A.data[reagentID].spell then | 
| contrebasse@25 | 123 		local numMakable, reagentIndex = A.numMakable(reagentID) | 
| contrebasse@25 | 124 		if not numMakable then | 
| contrebasse@38 | 125 			A.Error("The recipe to make the reagent seems to be hidden, it is not makable.") | 
| contrebasse@25 | 126 			return | 
| contrebasse@25 | 127 		end | 
| contrebasse@25 | 128 		if numMakable>0 then | 
| contrebasse@25 | 129 			A.craft(reagentID,reagentRecipeIndex,reagentIndex,numMakable,chooseNumberToCraft) | 
| contrebasse@25 | 130 			return | 
| contrebasse@25 | 131 		end | 
| contrebasse@33 | 132 | 
| contrebasse@25 | 133 		-- If we can make the item needed to make the reagent, open a window to make it | 
| contrebasse@25 | 134 		-- one step recursion, enables to mill to create an ink | 
| contrebasse@38 | 135 		if (not A.data[reagentID].manyReagents) and A.data[A.data[reagentID][1][1]] then | 
| contrebasse@33 | 136 			A.externalCraftWindow(A.data[reagentID][1][1],reagentID) | 
| contrebasse@25 | 137 		else | 
| contrebasse@38 | 138 			A.Error("You do not have enough reagents to craft ["..(GetItemInfo(reagentID) or "item #"..reagentID).."]") | 
| contrebasse@25 | 139 		end | 
| contrebasse@38 | 140 		return | 
| contrebasse@25 | 141 	else | 
| contrebasse@25 | 142 		A.externalCraftWindow(reagentID) | 
| contrebasse@25 | 143 	end -- if | 
| contrebasse@25 | 144 	--A.RestoreActiveFilters() | 
| contrebasse@25 | 145 end -- function | 
| contrebasse@25 | 146 | 
| contrebasse@25 | 147 | 
| contrebasse@25 | 148 --------------------------------------------------- | 
| contrebasse@25 | 149 -- Craft items | 
| contrebasse@25 | 150 --------------------------------------------------- | 
| contrebasse@25 | 151 -- function used after choosing the number of reagent to craft | 
| contrebasse@25 | 152 function A.SplitStack(owner,split) | 
| contrebasse@25 | 153 	DoTradeSkill(owner.ReagentMaker_reagentIndex,tonumber(split)) | 
| contrebasse@25 | 154 	owner.ReagentMaker_reagentIndex = nil | 
| contrebasse@25 | 155 end | 
| contrebasse@25 | 156 | 
| contrebasse@25 | 157 -- Craft the reagent of an item, given it's position in the recipe | 
| contrebasse@25 | 158 function A.craft(reagentID,reagentRecipeIndex,reagentIndex,numReagentMakable,chooseNumber) | 
| contrebasse@25 | 159 	-- Look at how many we need to make one item for the selected recipe | 
| contrebasse@25 | 160 	local numToMake = 1 | 
| contrebasse@25 | 161 	local selectedIndex = GetTradeSkillSelectionIndex() | 
| contrebasse@25 | 162 	local skillName, skillType, numAvailable, isExpanded, serviceType, numSkillUps = GetTradeSkillInfo(selectedIndex) | 
| contrebasse@28 | 163 	local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(selectedIndex, reagentRecipeIndex) | 
| contrebasse@28 | 164 	-- make enough reagents to craft one more item | 
| contrebasse@28 | 165 	numToMake = math.min(reagentCount*(1+numAvailable) - playerReagentCount,numReagentMakable) | 
| contrebasse@25 | 166 | 
| contrebasse@25 | 167 	-- Choose number or craft directly | 
| contrebasse@25 | 168 	if chooseNumber and numReagentMakable>1 then | 
| contrebasse@25 | 169 		-- the dialog window is linked to the reagent button | 
| contrebasse@25 | 170 		local btn = _G["TradeSkillReagent"..reagentRecipeIndex] | 
| contrebasse@25 | 171 | 
| contrebasse@25 | 172 		-- Store info to be able to run the function later | 
| contrebasse@25 | 173 		btn.ReagentMaker_reagentIndex = reagentIndex | 
| contrebasse@25 | 174 | 
| contrebasse@25 | 175 		-- Open dialog | 
| contrebasse@25 | 176 		OpenStackSplitFrame(numReagentMakable, btn, "TOP", "BOTTOM") | 
| contrebasse@25 | 177 | 
| contrebasse@25 | 178 		-- Fill in the number to make | 
| contrebasse@25 | 179 		numToMake = tostring(numToMake) | 
| contrebasse@25 | 180 		for i = 1,numToMake:len() do | 
| contrebasse@25 | 181 			StackSplitFrame_OnChar(StackSplitFrame,numToMake:gsub(i,i)) | 
| contrebasse@25 | 182 		end | 
| contrebasse@25 | 183 		StackSplitFrame.typing = 0 -- reinit the frame so tha the entered value will be erased on text entry | 
| contrebasse@25 | 184 	else | 
| contrebasse@25 | 185 		DoTradeSkill(reagentIndex,numToMake) | 
| contrebasse@25 | 186 	end -- if | 
| contrebasse@25 | 187 end -- function | 
| contrebasse@25 | 188 | 
| contrebasse@25 | 189 | 
| contrebasse@25 | 190 -- Button hovering | 
| contrebasse@25 | 191 function A.btnEntered(btn) | 
| contrebasse@25 | 192 	-- Do not manage guild tradeskill | 
| contrebasse@25 | 193 	if IsTradeSkillGuild() or IsTradeSkillLinked() then return end | 
| contrebasse@25 | 194 | 
| contrebasse@25 | 195 	-- Index of the reagent in the recipe, taken from the button name | 
| contrebasse@25 | 196 	local reagentRecipeIndex = A.buttonNumber(btn) | 
| contrebasse@25 | 197 | 
| contrebasse@25 | 198 	-- ID of the reagent we want to craft | 
| contrebasse@25 | 199 	local reagentLink = GetTradeSkillReagentItemLink(GetTradeSkillSelectionIndex(), reagentRecipeIndex) | 
| contrebasse@25 | 200 	local reagentID = A.link2ID(reagentLink) | 
| contrebasse@25 | 201 | 
| contrebasse@25 | 202 	-- Continue only if the reagent is known | 
| contrebasse@25 | 203 	if not reagentID or not A.data[reagentID] then return end | 
| contrebasse@25 | 204 | 
| contrebasse@25 | 205 	btn.textureHighlight:Show() | 
| contrebasse@25 | 206 | 
| contrebasse@25 | 207 	-- Tooltips | 
| contrebasse@43 | 208 	local link = A.data[reagentID].spellLink | 
| contrebasse@25 | 209 	if link then | 
| contrebasse@25 | 210 		A.tooltipRecipe:SetOwner(btn) | 
| contrebasse@25 | 211 		A.tooltipRecipe:SetHyperlink(link) | 
| contrebasse@25 | 212 		A.tooltipRecipe:Show() | 
| contrebasse@25 | 213 		A.tooltipRecipe:ClearAllPoints() | 
| contrebasse@25 | 214 		A.tooltipRecipe:SetPoint("BOTTOMLEFT",GameTooltip,"BOTTOMRIGHT") | 
| contrebasse@43 | 215 	else | 
| contrebasse@43 | 216 		-- Shouldn't happend, but just in case... | 
| contrebasse@43 | 217 		A.Error("Recipe link not found for "..reagentID) | 
| contrebasse@25 | 218 	end | 
| contrebasse@25 | 219 end | 
| contrebasse@25 | 220 | 
| contrebasse@25 | 221 function A.btnLeft(btn) | 
| contrebasse@25 | 222 	btn.textureHighlight:Hide() | 
| contrebasse@25 | 223 	A.tooltipRecipe:Hide() | 
| contrebasse@25 | 224 end -- function | 
| contrebasse@25 | 225 | 
| contrebasse@25 | 226 function A.updateCounts(recipeIndex) | 
| contrebasse@25 | 227 	-- Needs an argument | 
| contrebasse@25 | 228 	if not recipeIndex then return end | 
| contrebasse@25 | 229 | 
| contrebasse@25 | 230 	-- Do not manage guild tradeskill | 
| contrebasse@25 | 231 	if IsTradeSkillGuild() or IsTradeSkillLinked() then | 
| contrebasse@25 | 232 		for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do | 
| contrebasse@25 | 233 			_G["TradeSkillReagent"..reagentRecipeIndex].label:Hide() | 
| contrebasse@25 | 234 		end | 
| contrebasse@25 | 235 		return | 
| contrebasse@25 | 236 	end | 
| contrebasse@25 | 237 | 
| contrebasse@25 | 238 	-- Count makable items and show it | 
| contrebasse@25 | 239 	for reagentRecipeIndex = 1,GetTradeSkillNumReagents(recipeIndex) do | 
| contrebasse@25 | 240 		-- ID of the reagent we want to craft | 
| contrebasse@25 | 241 		local reagentLink = GetTradeSkillReagentItemLink(recipeIndex, reagentRecipeIndex) | 
| contrebasse@25 | 242 		local reagentID = A.link2ID(reagentLink) | 
| contrebasse@25 | 243 | 
| contrebasse@25 | 244 		local label = _G["TradeSkillReagent"..reagentRecipeIndex].label | 
| contrebasse@25 | 245 		if not label then return end | 
| contrebasse@25 | 246 | 
| contrebasse@25 | 247 		-- Continue only if the reagent is known | 
| contrebasse@25 | 248 		if not reagentID or not A.data[reagentID] or #(A.data[reagentID]) ~= 1 or A.data[reagentID].spell then | 
| contrebasse@25 | 249 			label:Hide() | 
| contrebasse@25 | 250 		else | 
| contrebasse@25 | 251 			-- Count and show | 
| contrebasse@25 | 252 			local numMakable = A.numMakable(reagentID) | 
| contrebasse@25 | 253 			label:SetText(numMakable or "?") | 
| contrebasse@25 | 254 			if not numMakable or numMakable==0 then | 
| contrebasse@25 | 255 				label:SetTextColor(1, 0, 0, 1) | 
| contrebasse@25 | 256 			else | 
| contrebasse@25 | 257 				label:SetTextColor(0, 5, 0, 1) | 
| contrebasse@25 | 258 			end -- if | 
| contrebasse@25 | 259 			label:Show() | 
| contrebasse@25 | 260 		end -- if | 
| contrebasse@25 | 261 	end -- for | 
| contrebasse@25 | 262 end -- function | 
| contrebasse@25 | 263 hooksecurefunc("SelectTradeSkill",A.updateCounts) |