Mercurial > wow > wowdb-profiler
comparison Main.lua @ 13:39972835bdc9
Added proper support for Herbalism and Mining from NPC corpses. Wipe action_data when LOOT_CLOSED fires.
author | James D. Callahan III <jcallahan@curse.com> |
---|---|
date | Tue, 01 May 2012 16:07:13 -0500 |
parents | be3d67c28a27 |
children | 27c153c3a1ed |
comparison
equal
deleted
inserted
replaced
12:be3d67c28a27 | 13:39972835bdc9 |
---|---|
35 } | 35 } |
36 } | 36 } |
37 | 37 |
38 | 38 |
39 local EVENT_MAPPING = { | 39 local EVENT_MAPPING = { |
40 LOOT_CLOSED = true, | |
40 LOOT_OPENED = true, | 41 LOOT_OPENED = true, |
41 MERCHANT_SHOW = "UpdateMerchantItems", | 42 MERCHANT_SHOW = "UpdateMerchantItems", |
42 MERCHANT_UPDATE = "UpdateMerchantItems", | 43 MERCHANT_UPDATE = "UpdateMerchantItems", |
43 PLAYER_TARGET_CHANGED = true, | 44 PLAYER_TARGET_CHANGED = true, |
44 QUEST_COMPLETE = true, | 45 QUEST_COMPLETE = true, |
233 | 234 |
234 | 235 |
235 ----------------------------------------------------------------------- | 236 ----------------------------------------------------------------------- |
236 -- Event handlers. | 237 -- Event handlers. |
237 ----------------------------------------------------------------------- | 238 ----------------------------------------------------------------------- |
238 local re_gold = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)") | 239 function WDP:LOOT_CLOSED() |
239 local re_silver = _G.SILVER_AMOUNT:gsub("%%d", "(%%d+)") | 240 table.wipe(action_data) |
240 local re_copper = _G.COPPER_AMOUNT:gsub("%%d", "(%%d+)") | 241 end |
241 | 242 |
242 | 243 |
243 local function _moneyMatch(money, re) | 244 do |
244 return money:match(re) or 0 | 245 local re_gold = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)") |
245 end | 246 local re_silver = _G.SILVER_AMOUNT:gsub("%%d", "(%%d+)") |
246 | 247 local re_copper = _G.COPPER_AMOUNT:gsub("%%d", "(%%d+)") |
247 | 248 |
248 local function _toCopper(money) | 249 |
249 if not money then | 250 local function _moneyMatch(money, re) |
250 return 0 | 251 return money:match(re) or 0 |
251 end | 252 end |
252 | 253 |
253 return _moneyMatch(money, re_gold) * 10000 + _moneyMatch(money, re_silver) * 100 + _moneyMatch(money, re_copper) | 254 |
254 end | 255 local function _toCopper(money) |
255 | 256 if not money then |
256 | 257 return 0 |
257 local LOOT_VERIFY_FUNCS = { | 258 end |
258 [AF.NPC] = function() | 259 |
259 local fishing_loot = _G.IsFishingLoot() | 260 return _moneyMatch(money, re_gold) * 10000 + _moneyMatch(money, re_silver) * 100 + _moneyMatch(money, re_copper) |
260 | 261 end |
261 if not fishing_loot and _G.UnitExists("target") and not _G.UnitIsFriend("player", "target") and _G.UnitIsDead("target") then | 262 |
262 if _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then | 263 |
263 return false | 264 local LOOT_VERIFY_FUNCS = { |
264 end | 265 [AF.NPC] = function() |
265 local unit_type, id_num = WDP:ParseGUID(_G.UnitGUID("target")) | 266 local fishing_loot = _G.IsFishingLoot() |
266 action_data.id_num = id_num | 267 |
267 end | 268 if not fishing_loot and _G.UnitExists("target") and not _G.UnitIsFriend("player", "target") and _G.UnitIsDead("target") then |
268 return true | 269 if _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then |
269 end, | 270 return false |
270 [AF.OBJECT] = function() | 271 end |
271 return true | 272 local unit_type, id_num = WDP:ParseGUID(_G.UnitGUID("target")) |
272 end, | 273 action_data.id_num = id_num |
273 } | 274 end |
274 | 275 return true |
275 | 276 end, |
276 local LOOT_UPDATE_FUNCS = { | 277 [AF.OBJECT] = function() |
277 [AF.NPC] = function() | 278 return true |
278 local npc = UnitEntry("npcs", action_data.id_num) | 279 end, |
279 npc.drops = npc.drops or {} | 280 } |
280 | 281 |
281 for index = 1, #action_data.drops do | 282 |
282 table.insert(npc.drops, action_data.drops[index]) | 283 local LOOT_UPDATE_FUNCS = { |
283 end | 284 [AF.NPC] = function() |
284 end, | 285 local npc = UnitEntry("npcs", action_data.id_num) |
285 [AF.OBJECT] = function() | 286 local loot_type = action_data.loot_type or "drops" |
286 local object = UnitEntry("objects", action_data.identifier) | 287 npc[loot_type] = npc[loot_type] or {} |
287 object.drops = object.drops or {} | 288 |
288 | 289 for index = 1, #action_data.drops do |
289 for index = 1, #action_data.drops do | 290 table.insert(npc[loot_type], action_data.drops[index]) |
290 table.insert(object.drops, action_data.drops[index]) | 291 end |
291 end | 292 end, |
292 end, | 293 [AF.OBJECT] = function() |
293 } | 294 local object = UnitEntry("objects", action_data.identifier) |
294 | 295 object.drops = object.drops or {} |
295 | 296 |
296 function WDP:LOOT_OPENED() | 297 for index = 1, #action_data.drops do |
297 if not action_data.type then | 298 table.insert(object.drops, action_data.drops[index]) |
298 action_data.type = AF.NPC | 299 end |
299 end | 300 end, |
300 local verify_func = LOOT_VERIFY_FUNCS[action_data.type] | 301 } |
301 local update_func = LOOT_UPDATE_FUNCS[action_data.type] | 302 |
302 | 303 |
303 if not verify_func or not update_func or not verify_func() then | 304 function WDP:LOOT_OPENED() |
304 return | 305 if not action_data.type then |
305 end | 306 action_data.type = AF.NPC |
306 | 307 end |
307 local loot_registry = {} | 308 local verify_func = LOOT_VERIFY_FUNCS[action_data.type] |
308 action_data.drops = {} | 309 local update_func = LOOT_UPDATE_FUNCS[action_data.type] |
309 | 310 |
310 for loot_slot = 1, _G.GetNumLootItems() do | 311 if not verify_func or not update_func or not verify_func() then |
311 local icon_texture, item_text, quantity, quality, locked = _G.GetLootSlotInfo(loot_slot) | 312 return |
312 | 313 end |
313 if _G.LootSlotIsItem(loot_slot) then | 314 |
314 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) | 315 local loot_registry = {} |
315 loot_registry[item_id] = (loot_registry[item_id]) or 0 + quantity | 316 action_data.drops = {} |
316 elseif _G.LootSlotIsCoin(loot_slot) then | 317 |
317 table.insert(action_data.drops, ("money:%d"):format(_toCopper(item_text))) | 318 for loot_slot = 1, _G.GetNumLootItems() do |
318 elseif _G.LootSlotIsCurrency(loot_slot) then | 319 local icon_texture, item_text, quantity, quality, locked = _G.GetLootSlotInfo(loot_slot) |
319 table.insert(action_data.drops, ("currency:%d:%s"):format(quantity, icon_texture:match("[^\\]+$"):lower())) | 320 |
320 end | 321 if _G.LootSlotIsItem(loot_slot) then |
321 end | 322 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) |
322 | 323 loot_registry[item_id] = (loot_registry[item_id]) or 0 + quantity |
323 for item_id, quantity in pairs(loot_registry) do | 324 elseif _G.LootSlotIsCoin(loot_slot) then |
324 table.insert(action_data.drops, ("%d:%d"):format(item_id, quantity)) | 325 table.insert(action_data.drops, ("money:%d"):format(_toCopper(item_text))) |
325 end | 326 elseif _G.LootSlotIsCurrency(loot_slot) then |
326 update_func() | 327 table.insert(action_data.drops, ("currency:%d:%s"):format(quantity, icon_texture:match("[^\\]+$"):lower())) |
327 end | 328 end |
329 end | |
330 | |
331 for item_id, quantity in pairs(loot_registry) do | |
332 table.insert(action_data.drops, ("%d:%d"):format(item_id, quantity)) | |
333 end | |
334 update_func() | |
335 end | |
336 end -- do-block | |
328 | 337 |
329 | 338 |
330 local POINT_MATCH_PATTERNS = { | 339 local POINT_MATCH_PATTERNS = { |
331 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING:gsub("%%d", "(%%d+)")), -- May no longer be necessary | 340 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING:gsub("%%d", "(%%d+)")), -- May no longer be necessary |
332 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3:gsub("%%d", "(%%d+)")), -- May no longer be necessary | 341 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3:gsub("%%d", "(%%d+)")), -- May no longer be necessary |
467 if max_power > 0 then | 476 if max_power > 0 then |
468 local power_type = _G.UnitPowerType("target") | 477 local power_type = _G.UnitPowerType("target") |
469 npc.stats[npc_level].power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power) | 478 npc.stats[npc_level].power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power) |
470 end | 479 end |
471 end | 480 end |
472 action_data.type = AF.NPC -- This will be set as appropriate below | |
473 end | 481 end |
474 | 482 |
475 | 483 |
476 do | 484 do |
477 local function UpdateQuestJuncture(point) | 485 local function UpdateQuestJuncture(point) |
555 action_data.type = AF.OBJECT | 563 action_data.type = AF.OBJECT |
556 action_data.x = x | 564 action_data.x = x |
557 action_data.y = y | 565 action_data.y = y |
558 action_data.zone = zone_name | 566 action_data.zone = zone_name |
559 action_data.identifier = identifier | 567 action_data.identifier = identifier |
560 print(("Found spell flagged for OBJECT: %s (%s, %s)"):format(zone_name, x, y)) | |
561 elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then | 568 elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then |
562 print("Found spell flagged for ZONE") | 569 print("Found spell flagged for ZONE") |
563 end | 570 end |
564 elseif tt_unit_name and not tt_item_name then | 571 elseif tt_unit_name and not tt_item_name then |
565 if bit.band(spell_flags, AF.NPC) == AF.NPC then | 572 if bit.band(spell_flags, AF.NPC) == AF.NPC then |
566 print("Found spell flagged for NPC") | 573 if not tt_unit_id or tt_unit_name ~= target_name then |
574 return | |
575 end | |
576 action_data.type = AF.NPC | |
577 action_data.loot_type = spell_label:lower() | |
567 end | 578 end |
568 elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then | 579 elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then |
569 print("Found spell flagged for ITEM") | 580 print("Found spell flagged for ITEM") |
570 else | 581 else |
571 print(("%s: We have an issue with types and flags."), event_name) | 582 print(("%s: We have an issue with types and flags."), event_name) |
579 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) | 590 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) |
580 if unit_id ~= "player" then | 591 if unit_id ~= "player" then |
581 return | 592 return |
582 end | 593 end |
583 | 594 |
584 if action_data.type == AF.OBJECT then | |
585 end | |
586 | |
587 if private.SPELL_LABELS_BY_NAME[spell_name] then | 595 if private.SPELL_LABELS_BY_NAME[spell_name] then |
588 print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)) | 596 print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)) |
589 end | 597 end |
590 private.tracked_line = nil | 598 private.tracked_line = nil |
591 end | 599 end |