| mischivin@32 | 1 --[[ | 
| mischivin@33 | 2 Event Flow --> UNIT_SPELLCAST_SUCCEDED --> Prospecting --> Set Multiplier --> LOOT_OPENED --> parse --> ITEM_LOCKED (Get Item ID) --> LOOT_CLOSED (Add Results) | 
| mischivin@33 | 3 									   --> Mass Prospecting (Get Item ID from spell) --> Set Multiplier --> CHAT_MSG_LOOT --> parse --> TRADE_SKILL_UPDATE (Add Results) | 
| mischivin@33 | 4 | 
| mischivin@32 | 5 ]] | 
| mischivin@33 | 6 | 
| mischivin@33 | 7 --[[ | 
| mischivin@33 | 8 Declarations of constants. | 
| mischivin@33 | 9 ]] | 
| mischivin@33 | 10 | 
| mischivin@33 | 11 local PROSPECT_SPELLID = 31252 | 
| mischivin@33 | 12 local MILLING_SPELLID = 51005 | 
| mischivin@33 | 13 local MASS_PROSPECT_FELSLATE_SPELLID = 225904 | 
| mischivin@33 | 14 local MASS_PROSPECT_LEYSTONE_SPELLID = 225902 | 
| mischivin@33 | 15 local MASS_MILLING_YSERALLINE_SPELLID = 210116 | 
| mischivin@33 | 16 local PROSPECT = GetSpellInfo(PROSPECT_SPELLID) | 
| mischivin@33 | 17 local MILLING = GetSpellInfo(MILLING_SPELLID) | 
| mischivin@33 | 18 local MASS_PROSPECT_FELSLATE = GetSpellInfo(MASS_PROSPECT_FELSLATE_SPELLID) | 
| mischivin@33 | 19 local MASS_PROSPECT_LEYSTONE = GetSpellInfo(MASS_PROSPECT_LEYSTONE_SPELLID) | 
| mischivin@33 | 20 local MASS_MILLING_YSERALLINE = GetSpellInfo(MASS_MILLING_YSERALLINE_SPELLID) | 
| mischivin@33 | 21 | 
| mischivin@33 | 22 local VALIDSPELLS = { | 
| mischivin@33 | 23 	[PROSPECT] = true, | 
| mischivin@33 | 24 	[MILLING] = true, | 
| mischivin@33 | 25 	[MASS_PROSPECT_LEYSTONE] = true, | 
| mischivin@33 | 26 	[MASS_PROSPECT_FELSLATE] = true, | 
| mischivin@33 | 27 	[MASS_MILLING_YSERALLINE] = true, | 
| mischivin@33 | 28 } | 
| mischivin@33 | 29 | 
| mischivin@33 | 30 --[[ | 
| mischivin@33 | 31 Local Variables | 
| mischivin@33 | 32 ]] | 
| mischivin@33 | 33 local ContainerID = nil | 
| mischivin@33 | 34 local Table = {} | 
| mischivin@33 | 35 local ParseResults = false | 
| mischivin@33 | 36 local MassMultiplier = 1 | 
| mischivin@33 | 37 local Results = {} | 
| mischivin@33 | 38 | 
| mischivin@33 | 39 --[[ | 
| mischivin@33 | 40 Initialize - Dets default config variables if they don't exist, ensures all our functions exist and are included in the table in their current form. | 
| mischivin@33 | 41 ]] | 
| mischivin@33 | 42 local function Initialize() | 
| mischivin@33 | 43 	--[[ | 
| mischivin@33 | 44 	Sets Default Variables | 
| mischivin@33 | 45 	]] | 
| mischivin@33 | 46 	if not ProspectMe.Config then | 
| mischivin@33 | 47 		ProspectMe.Config = { | 
| mischivin@33 | 48 			ShowQualities = { | 
| mischivin@33 | 49 				Junk = false, | 
| mischivin@33 | 50 				Common = false, | 
| mischivin@33 | 51 				Uncommon = true, | 
| mischivin@33 | 52 				Rare = true, | 
| mischivin@33 | 53 				Epic = true, | 
| mischivin@33 | 54 			}, | 
| mischivin@33 | 55 			PerSession = false, | 
| mischivin@33 | 56 			ShowPercent = true, | 
| mischivin@33 | 57 			ShowNumber = true, | 
| mischivin@31 | 58 		} | 
| mischivin@33 | 59 	end | 
| mischivin@33 | 60 	if not ProspectMe.Results then | 
| mischivin@33 | 61 		ProspectMe.Results = {} | 
| mischivin@33 | 62 	end | 
| mischivin@33 | 63 	ProspectMe.Session = {} | 
| mischivin@33 | 64 | 
| mischivin@45 | 65 	--[[ | 
| mischivin@45 | 66 	Sets Global Constants | 
| mischivin@45 | 67 	]] | 
| mischivin@45 | 68 	if not ProspectMe.Vars then | 
| mischivin@45 | 69 		ProspectMe.Vars = {} | 
| mischivin@45 | 70 	end | 
| mischivin@45 | 71 	ProspectMe.Vars.ORE = select(7,GetItemInfo(123918)) -- Get Ore Subclass from a known quantity (leystone ore) | 
| mischivin@45 | 72 	ProspectMe.Vars.HERB = select(7,GetItemInfo(128304)) -- Get Herb Subclass from a known quantity (yseralline seed) | 
| mischivin@45 | 73 | 
| mischivin@45 | 74 | 
| mischivin@33 | 75 	ProspectMe.Debug = function (...) | 
| mischivin@33 | 76 		for k, v in pairs(...) do | 
| mischivin@33 | 77 			print("key: " .. k " | value: " .. v) | 
| mischivin@33 | 78 		end | 
| mischivin@33 | 79 	end | 
| mischivin@33 | 80 | 
| mischivin@33 | 81 	--[[ | 
| mischivin@33 | 82 	Begins the capture process, sets variables where we have them. Prospecting and Milling (non MASS) require an extra step to get the ContainerID | 
| mischivin@33 | 83 	]] | 
| mischivin@33 | 84 	ProspectMe.BeginCapture = function (event, ...) | 
| mischivin@33 | 85 		local unit, spell = ... | 
| mischivin@33 | 86 		if unit == "player" then | 
| mischivin@33 | 87 			if spell == PROSPECT or spell == MILLING then | 
| mischivin@33 | 88 				MassMultiplier = 1 | 
| mischivin@33 | 89 				ParseResults = true | 
| mischivin@33 | 90 			elseif spell == MASS_PROSPECT_FELSLATE or spell == MASS_PROSPECT_LEYSTONE or spell == MASS_MILLING_YSERALLINE then | 
| mischivin@33 | 91 				MassMultiplier = 4 | 
| mischivin@33 | 92 				ParseResults = true | 
| mischivin@43 | 93 				C_Timer.After(0.5, function () if ParseResults then ProspectMe.EndCapture() end end ) --Fallback if you're using the tradeskill buttons to craft with the window closed. | 
| mischivin@33 | 94 				if spell == MASS_PROSPECT_FELSLATE then | 
| mischivin@33 | 95 					ContainerID = 123919 | 
| mischivin@33 | 96 				end | 
| mischivin@33 | 97 				if spell ==  MASS_PROSPECT_LEYSTONE then | 
| mischivin@33 | 98 					ContainerID = 123918 | 
| mischivin@33 | 99 				end | 
| mischivin@33 | 100 				if spell == MASS_MILLING_YSERALLINE then | 
| mischivin@33 | 101 					ContainerID = 128304 | 
| mischivin@33 | 102 				end | 
| mischivin@33 | 103 			else | 
| mischivin@33 | 104 				ParseResults = false | 
| mischivin@33 | 105 			end | 
| mischivin@33 | 106 		end | 
| mischivin@33 | 107 		Results = {} | 
| mischivin@33 | 108 	end | 
| mischivin@33 | 109 | 
| mischivin@33 | 110 	--[[ | 
| mischivin@33 | 111 	Ends the capture process and resets variables so they're ready for use the next time. | 
| mischivin@33 | 112 	]] | 
| mischivin@33 | 113 	ProspectMe.EndCapture = function (event, ...) | 
| mischivin@33 | 114 		if ParseResults then | 
| mischivin@33 | 115 			ProspectMe.AddEntry(ContainerID, MassMultiplier, Results) | 
| mischivin@33 | 116 		end | 
| mischivin@33 | 117 		ParseResults = false | 
| mischivin@33 | 118 		MassMultiplier = 1 | 
| mischivin@33 | 119 		ContainerID = nil | 
| mischivin@33 | 120 	end | 
| mischivin@33 | 121 | 
| mischivin@33 | 122 	--[[ | 
| mischivin@33 | 123 	Creates an table entry, if it does not exist, and adds results to the entry. | 
| mischivin@33 | 124 	Expects the Item ID and pairs of arguments in table with key being the result's ItemID and value being the quantity returned | 
| mischivin@33 | 125 	]] | 
| mischivin@33 | 126 	ProspectMe.AddEntry = function (ItemID, BatchSize, ResultsTable) | 
| mischivin@33 | 127 		if not ProspectMe.Results[ItemID] then | 
| mischivin@33 | 128 			ProspectMe.Results[ItemID] = { TimesProspected = 0 } | 
| mischivin@33 | 129 		end | 
| mischivin@33 | 130 		if not ProspectMe.Session[ItemID] then | 
| mischivin@33 | 131 			ProspectMe.Session[ItemID] = { TimesProspected = 0 } | 
| mischivin@33 | 132 		end | 
| mischivin@33 | 133 		for k, v in pairs(ResultsTable) do | 
| mischivin@33 | 134 			if not ProspectMe.Results[ItemID][k] then | 
| mischivin@33 | 135 				ProspectMe.Results[ItemID][k] = v | 
| mischivin@33 | 136 			else | 
| mischivin@33 | 137 				ProspectMe.Results[ItemID][k] = ProspectMe.Results[ItemID][k] + v | 
| mischivin@33 | 138 			end | 
| mischivin@33 | 139 			if not ProspectMe.Session[ItemID][k] then | 
| mischivin@33 | 140 				ProspectMe.Session[ItemID][k] = v | 
| mischivin@33 | 141 			else | 
| mischivin@33 | 142 				ProspectMe.Session[ItemID][k] = ProspectMe.Session[ItemID][k] + v | 
| mischivin@33 | 143 			end | 
| mischivin@33 | 144 		end | 
| mischivin@33 | 145 		ProspectMe.Results[ItemID].TimesProspected = ProspectMe.Results[ItemID].TimesProspected + BatchSize | 
| mischivin@33 | 146 		ProspectMe.Session[ItemID].TimesProspected = ProspectMe.Session[ItemID].TimesProspected + BatchSize | 
| mischivin@33 | 147 | 
| mischivin@33 | 148 	end | 
| mischivin@33 | 149 | 
| mischivin@33 | 150 	--[[ | 
| mischivin@33 | 151 	Parses the results of the spellcast or loot containerand returns a table of those results in key/value pairs of item/quantity. | 
| mischivin@33 | 152 	Expects an event and a set of arguments if the event has them. | 
| mischivin@33 | 153 	]] | 
| mischivin@33 | 154 	ProspectMe.GetResults = function (event, ...) | 
| mischivin@33 | 155 		if event == "CHAT_MSG_LOOT" then | 
| mischivin@33 | 156 			local ItemID = tonumber((...):match("Hitem:(%d+)")) | 
| mischivin@33 | 157 			if ItemID == 129099 or ItemID == 130200 or ItemID == 130201 or ItemID == 130202 or ItemID == 130203 or ItemID == 130204 then | 
| mischivin@33 | 158 				ItemID = 129100 | 
| mischivin@33 | 159 			end | 
| mischivin@33 | 160 			local Quantity = tonumber((...):match("|h|rx(%d+)")) | 
| mischivin@33 | 161 			if Quantity == nil then | 
| mischivin@33 | 162 				Quantity = 1 | 
| mischivin@33 | 163 			end | 
| mischivin@33 | 164 			Results[ItemID] = Quantity | 
| mischivin@33 | 165 		end | 
| mischivin@33 | 166 		if event == "LOOT_OPENED" then | 
| mischivin@33 | 167 			for i = 1, GetNumLootItems() do | 
| mischivin@33 | 168 	        	local ItemID = tonumber(GetLootSlotLink(i):match("Hitem:(%d+)")) | 
| mischivin@33 | 169 	        	if ItemID == 129099 or ItemID == 130200 or ItemID == 130201 or ItemID == 130202 or ItemID == 130203 or ItemID == 130204 then | 
| mischivin@33 | 170 	           		ItemID = 129100 | 
| mischivin@33 | 171 	        	end | 
| mischivin@33 | 172 				local Quantity = select(3, GetLootSlotInfo(i)) | 
| mischivin@33 | 173 	        	Results[ItemID] = Quantity | 
| mischivin@33 | 174 	        end | 
| mischivin@33 | 175 	    end | 
| mischivin@33 | 176 	end | 
| mischivin@31 | 177 end | 
| mischivin@31 | 178 | 
| mischivin@33 | 179 | 
| mischivin@33 | 180 local function EventHandler(self, event, ...) | 
| mischivin@33 | 181 	if event == "VARIABLES_LOADED" then | 
| mischivin@33 | 182 		Initialize() | 
| mischivin@31 | 183 	end | 
| mischivin@33 | 184 	if event == "UNIT_SPELLCAST_SUCCEEDED" then | 
| mischivin@33 | 185 		local unit, spell = ... | 
| mischivin@33 | 186 		if unit == "player" and VALIDSPELLS[spell] then | 
| mischivin@33 | 187 			ProspectMe.BeginCapture(event, ...) | 
| mischivin@32 | 188 		end | 
| mischivin@32 | 189 	end | 
| mischivin@33 | 190 	if event == "CHAT_MSG_LOOT" or "LOOT_OPENED" then | 
| mischivin@33 | 191 		if ParseResults then | 
| mischivin@33 | 192 			ProspectMe.GetResults(event, ...) | 
| mischivin@33 | 193 		end | 
| mischivin@33 | 194 		ProspectMeDebug = Results | 
| mischivin@21 | 195 	end | 
| mischivin@33 | 196 	if event == "ITEM_LOCKED" then | 
| mischivin@40 | 197 		if ParseResults then | 
| mischivin@40 | 198 			local bag, slot = ... | 
| mischivin@40 | 199 			ContainerID = select(10, GetContainerItemInfo(bag, slot)) | 
| mischivin@40 | 200 		end | 
| mischivin@33 | 201 	end | 
| mischivin@33 | 202 	if event == "TRADE_SKILL_LIST_UPDATE" or event == "LOOT_CLOSED" then | 
| mischivin@33 | 203 		if ParseResults then | 
| mischivin@33 | 204 			ProspectMe.EndCapture() | 
| Vynn@0 | 205 		end | 
| Vynn@0 | 206 	end | 
| Vynn@0 | 207 end | 
| Vynn@0 | 208 | 
| mischivin@33 | 209 local frame = CreateFrame("FRAME", "ProspectMe") | 
| Vynn@0 | 210 frame:RegisterEvent("VARIABLES_LOADED") | 
| mischivin@33 | 211 frame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") | 
| mischivin@33 | 212 frame:RegisterEvent("CHAT_MSG_LOOT") | 
| Vynn@0 | 213 frame:RegisterEvent("LOOT_OPENED") | 
| mischivin@33 | 214 frame:RegisterEvent("ITEM_LOCKED") | 
| Vynn@0 | 215 frame:RegisterEvent("LOOT_CLOSED") | 
| mischivin@33 | 216 frame:RegisterEvent("TRADE_SKILL_LIST_UPDATE") | 
| Vynn@0 | 217 frame:RegisterEvent("AUCTION_ITEM_LIST_UPDATE") | 
| mischivin@33 | 218 frame:SetScript("OnEvent", EventHandler) |