comparison ProspectMe.lua @ 49:9dae86337a41

Merge Prospect Me v2 Branch to default
author Vynn <mischivin@gmail.com>
date Thu, 17 Nov 2016 16:24:48 -0500
parents b267cddd6496
children f9b6c0305908
comparison
equal deleted inserted replaced
28:dc1504b4c03c 49:9dae86337a41
1 local PROSPECT_ID = 31252 1 --[[
2 local MILLING_ID = 51005 2 Event Flow --> UNIT_SPELLCAST_SUCCEDED --> Prospecting --> Set Multiplier --> LOOT_OPENED --> parse --> ITEM_LOCKED (Get Item ID) --> LOOT_CLOSED (Add Results)
3 local MASS_PROSPECT_FELSLATE_ID = 225902 3 --> Mass Prospecting (Get Item ID from spell) --> Set Multiplier --> CHAT_MSG_LOOT --> parse --> TRADE_SKILL_UPDATE (Add Results)
4 local MASS_PROSPECT_LEYSTONE_ID = 225902 4
5 local MASS_MILLING_YSERALLINE_ID = 210116 5 ]]
6 local PROSPECT = GetSpellInfo(PROSPECT_ID):lower() 6
7 local MILLING = GetSpellInfo(MILLING_ID):lower() 7 --[[
8 local MASS_PROSPECT_FELSLATE = GetSpellInfo(MASS_PROSPECT_FELSLATE_ID):lower() 8 Declarations of constants.
9 local MASS_PROSPECT_LEYSTONE = GetSpellInfo(MASS_PROSPECT_FELSLATE_ID):lower() 9 ]]
10 local MASS_MILLING_YSERALLINE = GetSpellInfo(MASS_PROSPECT_FELSLATE_ID):lower() 10
11 local containerID, containerLink = nil, nil 11 local PROSPECT_SPELLID = 31252
12 local getContents = false 12 local MILLING_SPELLID = 51005
13 local bulkMultiplier = 1 --This will be used for mass prospecting/milling in Legion 13 local MASS_PROSPECT_FELSLATE_SPELLID = 225904
14 14 local MASS_PROSPECT_LEYSTONE_SPELLID = 225902
15 local function CreateTableEntry(id) 15 local MASS_MILLING_YSERALLINE_SPELLID = 210116
16 local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(id) 16 local PROSPECT = GetSpellInfo(PROSPECT_SPELLID)
17 PM_ItemTable[id] = {} 17 local MILLING = GetSpellInfo(MILLING_SPELLID)
18 PM_ItemTable[id].name = name 18 local MASS_PROSPECT_FELSLATE = GetSpellInfo(MASS_PROSPECT_FELSLATE_SPELLID)
19 PM_ItemTable[id].link = link 19 local MASS_PROSPECT_LEYSTONE = GetSpellInfo(MASS_PROSPECT_LEYSTONE_SPELLID)
20 PM_ItemTable[id].quality = quality 20 local MASS_MILLING_YSERALLINE = GetSpellInfo(MASS_MILLING_YSERALLINE_SPELLID)
21 PM_ItemTable[id].iLevel = iLevel 21
22 PM_ItemTable[id].reqLevel = reqLevel 22 local VALIDSPELLS = {
23 PM_ItemTable[id].class = class 23 [PROSPECT] = true,
24 PM_ItemTable[id].subclass = subclass 24 [MILLING] = true,
25 PM_ItemTable[id].maxStack = maxStack 25 [MASS_PROSPECT_LEYSTONE] = true,
26 PM_ItemTable[id].equipSlot = equipSlot 26 [MASS_PROSPECT_FELSLATE] = true,
27 PM_ItemTable[id].texture = texture 27 [MASS_MILLING_YSERALLINE] = true,
28 PM_ItemTable[id].vendorPrice = vendorPrice 28 }
29 PM_ItemTable[id].price = PM_GetItemValue(id) 29
30 --[[
31 Local Variables
32 ]]
33 local ContainerID = nil
34 local Table = {}
35 local ParseResults = false
36 local MassMultiplier = 1
37 local Results = {}
38
39 --[[
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.
41 ]]
42 local function Initialize()
43 --[[
44 Sets Default Variables
45 ]]
46 if not ProspectMe.Config then
47 ProspectMe.Config = {
48 ShowQualities = {
49 Junk = false,
50 Common = false,
51 Uncommon = true,
52 Rare = true,
53 Epic = true,
54 },
55 PerSession = false,
56 ShowPercent = true,
57 ShowNumber = true,
58 }
59 end
60 if not ProspectMe.Results then
61 ProspectMe.Results = {}
62 end
63 ProspectMe.Session = {}
64
65 --[[
66 Sets Global Constants
67 ]]
68 if not ProspectMe.Vars then
69 ProspectMe.Vars = {}
70 end
71 ProspectMe.Vars.ORE = select(7,GetItemInfo(123918)) -- Get Ore Subclass from a known quantity (leystone ore)
72 ProspectMe.Vars.HERB = select(7,GetItemInfo(128304)) -- Get Herb Subclass from a known quantity (yseralline seed)
73
74
75 ProspectMe.Debug = function (...)
76 for k, v in pairs(...) do
77 print("key: " .. k " | value: " .. v)
78 end
79 end
80
81 --[[
82 Begins the capture process, sets variables where we have them. Prospecting and Milling (non MASS) require an extra step to get the ContainerID
83 ]]
84 ProspectMe.BeginCapture = function (event, ...)
85 local unit, spell = ...
86 if unit == "player" then
87 if spell == PROSPECT or spell == MILLING then
88 MassMultiplier = 1
89 ParseResults = true
90 elseif spell == MASS_PROSPECT_FELSLATE or spell == MASS_PROSPECT_LEYSTONE or spell == MASS_MILLING_YSERALLINE then
91 MassMultiplier = 4
92 ParseResults = true
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.
94 if spell == MASS_PROSPECT_FELSLATE then
95 ContainerID = 123919
96 end
97 if spell == MASS_PROSPECT_LEYSTONE then
98 ContainerID = 123918
99 end
100 if spell == MASS_MILLING_YSERALLINE then
101 ContainerID = 128304
102 end
103 else
104 ParseResults = false
105 end
106 end
107 Results = {}
108 end
109
110 --[[
111 Ends the capture process and resets variables so they're ready for use the next time.
112 ]]
113 ProspectMe.EndCapture = function (event, ...)
114 if ParseResults then
115 ProspectMe.AddEntry(ContainerID, MassMultiplier, Results)
116 end
117 ParseResults = false
118 MassMultiplier = 1
119 ContainerID = nil
120 end
121
122 --[[
123 Creates an table entry, if it does not exist, and adds results to the entry.
124 Expects the Item ID and pairs of arguments in table with key being the result's ItemID and value being the quantity returned
125 ]]
126 ProspectMe.AddEntry = function (ItemID, BatchSize, ResultsTable)
127 if not ProspectMe.Results[ItemID] then
128 ProspectMe.Results[ItemID] = { TimesProspected = 0 }
129 end
130 if not ProspectMe.Session[ItemID] then
131 ProspectMe.Session[ItemID] = { TimesProspected = 0 }
132 end
133 for k, v in pairs(ResultsTable) do
134 if not ProspectMe.Results[ItemID][k] then
135 ProspectMe.Results[ItemID][k] = v
136 else
137 ProspectMe.Results[ItemID][k] = ProspectMe.Results[ItemID][k] + v
138 end
139 if not ProspectMe.Session[ItemID][k] then
140 ProspectMe.Session[ItemID][k] = v
141 else
142 ProspectMe.Session[ItemID][k] = ProspectMe.Session[ItemID][k] + v
143 end
144 end
145 ProspectMe.Results[ItemID].TimesProspected = ProspectMe.Results[ItemID].TimesProspected + BatchSize
146 ProspectMe.Session[ItemID].TimesProspected = ProspectMe.Session[ItemID].TimesProspected + BatchSize
147
148 end
149
150 --[[
151 Parses the results of the spellcast or loot containerand returns a table of those results in key/value pairs of item/quantity.
152 Expects an event and a set of arguments if the event has them.
153 ]]
154 ProspectMe.GetResults = function (event, ...)
155 if event == "CHAT_MSG_LOOT" then
156 local ItemID = tonumber((...):match("Hitem:(%d+)"))
157 if ItemID == 129099 or ItemID == 130200 or ItemID == 130201 or ItemID == 130202 or ItemID == 130203 or ItemID == 130204 then
158 ItemID = 129100
159 end
160 local Quantity = tonumber((...):match("|h|rx(%d+)"))
161 if Quantity == nil then
162 Quantity = 1
163 end
164 Results[ItemID] = Quantity
165 end
166 if event == "LOOT_OPENED" then
167 for i = 1, GetNumLootItems() do
168 local ItemID = tonumber(GetLootSlotLink(i):match("Hitem:(%d+)"))
169 if ItemID == 129099 or ItemID == 130200 or ItemID == 130201 or ItemID == 130202 or ItemID == 130203 or ItemID == 130204 then
170 ItemID = 129100
171 end
172 local Quantity = select(3, GetLootSlotInfo(i))
173 Results[ItemID] = Quantity
174 end
175 end
176 end
30 end 177 end
31 178
32 function PM_GemCleanup()
33 local cleanupIDs = { "129099", "130200", "130201", "130202", "130203", "130204" }
34 if not PM_ItemTable["129100"] then
35 CreateTableEntry("129100")
36 end
37 for i, r in pairs(PM_ResultsTable) do
38 for k, v in pairs(cleanupIDs) do
39 if PM_ResultsTable[i][v] then
40 if not PM_ResultsTable[i]["129100"] then
41 PM_ResultsTable[i]["129100"] = 0
42 end
43 PM_ResultsTable[i]["129100"] = PM_ResultsTable[i]["129100"] + PM_ResultsTable[i][v]
44 PM_ResultsTable[i][v] = nil
45 end
46 end
47 end
48 for k, v in pairs(cleanupIDs) do
49 if PM_ItemTable[v] then
50 PM_ItemTable[v] = nil
51 end
52 end
53 end
54
55 local function PM_Init()
56 if not PM_ResultsTable then
57 PM_ResultsTable = {}
58 PM_ItemTable = {}
59 end
60 PM_SessionTable = {}
61 PM_GemCleanup() --Run cleanup on excess Gem Chips created in v1.7.0.2 and earlier
62 end
63
64 --debugging function to print the databases results
65 function PM_PrintResults()
66 for container, k in pairs(PM_ResultsTable) do
67 print(PM_ItemTable[container].link, PM_ResultsTable[container].timesProspected)
68 for i, num in pairs(k) do
69 if i ~= "timesProspected" then
70 print(PM_ItemTable[i].link, num)
71 end
72 end
73 end
74 end
75
76 local function GetResults()
77 --Create tables for the Container if it doesn't exist yet
78 if not PM_ResultsTable[containerID] then
79 PM_ResultsTable[containerID] = {timesProspected = 0}
80 CreateTableEntry(containerID)
81 end
82
83 --Creates a session table entry, this will be cleared on log out/UI reload
84 if not PM_SessionTable[containerID] then
85 PM_SessionTable[containerID] = {timesProspected = 0}
86 end
87
88 for i = 1, GetNumLootItems() do
89 local itemID = GetLootSlotLink(i):match("Hitem:(%d+)")
90 if itemID == "129099" or itemID == "130200" or itemID == "130201" or itemID == "130202" or itemID == "130203" or itemID == "130204" then --consolidate Colored Gem Chips into their resulting item
91 itemID = "129100"
92 end
93 local quantity = select(3, GetLootSlotInfo(i))
94 if not PM_ItemTable[itemID] then
95 CreateTableEntry(itemID)
96 end
97 if PM_ResultsTable[containerID][itemID] then
98 PM_ResultsTable[containerID][itemID] = PM_ResultsTable[containerID][itemID] + quantity
99 else
100 PM_ResultsTable[containerID][itemID] = quantity
101 end
102 if PM_SessionTable[containerID][itemID] then
103 PM_SessionTable[containerID][itemID] = PM_SessionTable[containerID][itemID] + quantity
104 else
105 PM_SessionTable[containerID][itemID] = quantity
106 end
107 end
108
109 PM_ResultsTable[containerID].timesProspected = PM_ResultsTable[containerID].timesProspected + bulkMultiplier
110 PM_SessionTable[containerID].timesProspected = PM_SessionTable[containerID].timesProspected + bulkMultiplier
111 end
112 179
113 local function EventHandler(self, event, ...) 180 local function EventHandler(self, event, ...)
114 if event == "VARIABLES_LOADED" then 181 if event == "VARIABLES_LOADED" then
115 PM_Init() 182 Initialize()
116 PM_UpdateValues() 183 end
117 end 184 if event == "UNIT_SPELLCAST_SUCCEEDED" then
118 if event == "UNIT_SPELLCAST_INTERRUPTED" then 185 local unit, spell = ...
119 local unitID, spell, rank = ... 186 if unit == "player" and VALIDSPELLS[spell] then
120 spell = spell:lower() 187 ProspectMe.BeginCapture(event, ...)
121 if unitID == "player" and (spell == PROSPECT or spell == MILLING or spell == MASS_PROSPECT_FELSLATE or spell == MASS_PROSPECT_LEYSTONE or spell == MASS_MILLING_YSERALLINE)then 188 end
122 getContents = false 189 end
123 end 190 if event == "CHAT_MSG_LOOT" or "LOOT_OPENED" then
124 end 191 if ParseResults then
125 if event == "LOOT_OPENED" then 192 ProspectMe.GetResults(event, ...)
126 if getContents then 193 end
127 GetResults() 194 ProspectMeDebug = Results
128 end 195 end
129 end 196 if event == "ITEM_LOCKED" then
130 if event == "LOOT_CLOSED" then 197 if ParseResults then
131 getContents = false 198 local bag, slot = ...
132 end 199 ContainerID = select(10, GetContainerItemInfo(bag, slot))
133 if event == "AUCTION_ITEM_LIST_UPDATE" then 200 end
134 PM_UpdateValues() 201 end
202 if event == "TRADE_SKILL_LIST_UPDATE" or event == "LOOT_CLOSED" then
203 if ParseResults then
204 ProspectMe.EndCapture()
205 end
135 end 206 end
136 end 207 end
137 208
138 local frame = CreateFrame("FRAME", "PM_Frame") 209 local frame = CreateFrame("FRAME", "ProspectMe")
139 frame:RegisterEvent("VARIABLES_LOADED") 210 frame:RegisterEvent("VARIABLES_LOADED")
140 frame:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED") 211 frame:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
212 frame:RegisterEvent("CHAT_MSG_LOOT")
141 frame:RegisterEvent("LOOT_OPENED") 213 frame:RegisterEvent("LOOT_OPENED")
214 frame:RegisterEvent("ITEM_LOCKED")
142 frame:RegisterEvent("LOOT_CLOSED") 215 frame:RegisterEvent("LOOT_CLOSED")
216 frame:RegisterEvent("TRADE_SKILL_LIST_UPDATE")
143 frame:RegisterEvent("AUCTION_ITEM_LIST_UPDATE") 217 frame:RegisterEvent("AUCTION_ITEM_LIST_UPDATE")
144 frame:SetScript("OnEvent", EventHandler) 218 frame:SetScript("OnEvent", EventHandler)
145
146 hooksecurefunc("UseContainerItem", function(...)
147 if getContents then
148 containerLink = GetContainerItemLink(...)
149 containerID = containerLink:match("Hitem:(%d+)")
150 end
151
152 end)
153
154 hooksecurefunc("UseItemByName", function(itemName)
155 if getContents then
156 containerLink = select(2, GetItemInfo(itemName))
157 containerID = containerLink:match("Hitem:(%d+)")
158 end
159 end)
160
161 hooksecurefunc("SpellTargetItem", function(itemName)
162 if getContents then
163 containerLink = select(2, GetItemInfo(itemName))
164 containerID = containerLink:match("Hitem:(%d+)")
165 end
166 end)
167
168 hooksecurefunc("CastSpell", function(...)
169 local spellName = GetSpellInfo(...):lower()
170 if spellName == PROSPECT or spellName == MILLING or spellName == MASS_PROSPECT_FELSLATE or spellName == MASS_PROSPECT_LEYSTONE or spellName == MASS_MILLING_YSERALLINE then
171 getContents = true
172 if spellName == MASS_PROSPECT_FELSLATE or spellName == MASS_PROSPECT_LEYSTONE or spellName == MASS_MILLING_YSERALLINE then
173 bulkMultiplier = 4
174 else
175 bulkMultiplier = 1
176 end
177 end
178 end)
179
180 hooksecurefunc("CastSpellByID", function(spellID)
181 if spellID == PROSPECT_ID or spellID == MILLING_ID or spellID == MASS_PROSPECT_FELSTATE_ID or spellID == MASS_PROSPECT_LEYSTONE_ID or spellID == MASS_MILLING_YSERALLINE_ID then
182 getContents = true
183 if spellID == MASS_PROSPECT_FELSTATE_ID or spellID == MASS_PROSPECT_LEYSTONE_ID or spellID == MASS_MILLING_YSERALLINE_ID then
184 bulkMultiplier = 4
185 else
186 bulkMultiplier = 1
187 end
188 end
189 end)
190
191 hooksecurefunc("UseAction", function(actionID)
192 local spellID = select(2, GetActionInfo(actionID))
193 if spellID == PROSPECT_ID or spellID == MILLING_ID or spellID == MASS_PROSPECT_FELSTATE_ID or spellID == MASS_PROSPECT_LEYSTONE_ID or spellID == MASS_MILLING_YSERALLINE_ID then
194 getContents = true
195 if spellID == MASS_PROSPECT_FELSTATE_ID or spellID == MASS_PROSPECT_LEYSTONE_ID or spellID == MASS_MILLING_YSERALLINE_ID then
196 bulkMultiplier = 4
197 else
198 bulkMultiplier = 1
199 end
200 end
201 end)
202
203 hooksecurefunc("CastSpellByName", function(spellName, onSelf)
204 spellName = spellName:lower()
205 if spellName == PROSPECT or spellName == MILLING or spellName == MASS_PROSPECT_FELSLATE or spellName == MASS_PROSPECT_LEYSTONE or spellName == MASS_MILLING_YSERALLINE then
206 getContents = true
207 if spellName == MASS_PROSPECT_FELSLATE or spellName == MASS_PROSPECT_LEYSTONE or spellName == MASS_MILLING_YSERALLINE then
208 bulkMultiplier = 4
209 else
210 bulkMultiplier = 1
211 end
212 end
213 end)