comparison Main.lua @ 347:fb1d08480f67 WoD

Added timer-based support for salvage crate drops. Hopefully only temporary while Blizzard fixes SHOW_LOOT_TOAST events for them.
author MMOSimca <MMOSimca@gmail.com>
date Fri, 03 Oct 2014 15:29:26 -0400
parents 04343b25c612
children 9f352e20204c
comparison
equal deleted inserted replaced
346:04343b25c612 347:fb1d08480f67
49 local PLAYER_RACE = _G.select(2, _G.UnitRace("player")) 49 local PLAYER_RACE = _G.select(2, _G.UnitRace("player"))
50 50
51 -- Ignoring NPC casts of the following spells 51 -- Ignoring NPC casts of the following spells
52 local CHI_WAVE_SPELL_ID = 132464 52 local CHI_WAVE_SPELL_ID = 132464
53 local DISGUISE_SPELL_ID = 121308 53 local DISGUISE_SPELL_ID = 121308
54
55 -- For timer-based loot gathering of abnormal containers (that don't use SHOW_LOOT_TOAST, sadly)
56 local CRATE_OF_SALVAGE_ITEM_ID = private.SALVAGE_SPELL_ID_TO_ITEM_ID_MAP[168179]
57 local BIG_CRATE_OF_SALVAGE_ITEM_ID = private.SALVAGE_SPELL_ID_TO_ITEM_ID_MAP[168180]
54 58
55 -- Constant for duplicate boss data; a dirty hack to get around world bosses that cannot be identified individually and cannot be linked on wowdb because they are not in a raid 59 -- Constant for duplicate boss data; a dirty hack to get around world bosses that cannot be identified individually and cannot be linked on wowdb because they are not in a raid
56 local DUPLICATE_WORLD_BOSS_IDS = { 60 local DUPLICATE_WORLD_BOSS_IDS = {
57 [71952] = { 71953, 71954, 71955, }, 61 [71952] = { 71953, 71954, 71955, },
58 } 62 }
157 local name_to_id_map = {} 161 local name_to_id_map = {}
158 local killed_boss_id_timer_handle 162 local killed_boss_id_timer_handle
159 local killed_npc_id 163 local killed_npc_id
160 local target_location_timer_handle 164 local target_location_timer_handle
161 local last_timber_spell_id 165 local last_timber_spell_id
166 local chat_loot_timer_handle
162 local current_target_id 167 local current_target_id
163 local current_area_id 168 local current_area_id
164 local current_loot 169 local current_loot
165 170
166 171
298 end 303 end
299 end 304 end
300 return math.floor(copper_cost / modifier) 305 return math.floor(copper_cost / modifier)
301 end 306 end
302 end -- do-block 307 end -- do-block
303
304
305 -- Called on a timer
306 local function ClearKilledNPC()
307 killed_npc_id = nil
308 end
309
310
311 local function ClearKilledBossID()
312 if killed_boss_id_timer_handle then
313 WDP:CancelTimer(killed_boss_id_timer_handle)
314 killed_boss_id_timer_handle = nil
315 end
316
317 table.wipe(boss_loot_toasting)
318 private.raid_boss_id = nil
319 end
320
321
322 local function ClearLootToastContainerID()
323 if loot_toast_container_timer_handle then
324 WDP:CancelTimer(loot_toast_container_timer_handle)
325 loot_toast_container_timer_handle = nil
326 end
327
328 private.container_loot_toasting = false
329 private.loot_toast_container_id = nil
330 end
331
332
333 local function ClearLootToastData()
334 -- cancel existing timer if found
335 if loot_toast_data_timer_handle then
336 WDP:CancelTimer(loot_toast_data_timer_handle)
337 loot_toast_data_timer_handle = nil
338 end
339
340 if loot_toast_data then
341 table.wipe(loot_toast_data)
342 end
343 end
344 308
345 309
346 local function InstanceDifficultyToken() 310 local function InstanceDifficultyToken()
347 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() 311 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo()
348 312
854 zone_data = current_action.zone_data, 818 zone_data = current_action.zone_data,
855 } 819 }
856 820
857 table.wipe(current_action) 821 table.wipe(current_action)
858 end 822 end
823
824
825 -- TIMERS -------------------------------------------------------------
826
827 local function ClearKilledNPC()
828 killed_npc_id = nil
829 end
830
831
832 local function ClearKilledBossID()
833 if killed_boss_id_timer_handle then
834 WDP:CancelTimer(killed_boss_id_timer_handle)
835 killed_boss_id_timer_handle = nil
836 end
837
838 table.wipe(boss_loot_toasting)
839 private.raid_boss_id = nil
840 end
841
842
843 local function ClearLootToastContainerID()
844 if loot_toast_container_timer_handle then
845 WDP:CancelTimer(loot_toast_container_timer_handle)
846 loot_toast_container_timer_handle = nil
847 end
848
849 private.container_loot_toasting = false
850 private.loot_toast_container_id = nil
851 end
852
853
854 local function ClearLootToastData()
855 -- cancel existing timer if found
856 if loot_toast_data_timer_handle then
857 WDP:CancelTimer(loot_toast_data_timer_handle)
858 loot_toast_data_timer_handle = nil
859 end
860
861 if loot_toast_data then
862 table.wipe(loot_toast_data)
863 end
864 end
865
866
867 local function ClearTimeBasedLootData()
868 if chat_loot_timer_handle then
869 WDP:CancelTimer(chat_loot_timer_handle)
870 chat_loot_timer_handle = nil
871 end
872
873 if current_loot and current_loot.identifier and (current_loot.identifier == CRATE_OF_SALVAGE_ITEM_ID or current_loot.identifier == BIG_CRATE_OF_SALVAGE_ITEM_ID) then
874 GenericLootUpdate("items")
875 end
876 current_loot = nil
877 end
878
859 879
860 -- METHODS ------------------------------------------------------------ 880 -- METHODS ------------------------------------------------------------
861 881
862 function WDP:OnInitialize() 882 function WDP:OnInitialize()
863 local db = LibStub("AceDB-3.0"):New("WoWDBProfilerData", DATABASE_DEFAULTS, "Default") 883 local db = LibStub("AceDB-3.0"):New("WoWDBProfilerData", DATABASE_DEFAULTS, "Default")
1355 end 1375 end
1356 1376
1357 1377
1358 do 1378 do
1359 local CHAT_MSG_LOOT_UPDATE_FUNCS = { 1379 local CHAT_MSG_LOOT_UPDATE_FUNCS = {
1380 [AF.ITEM] = function(item_id, quantity)
1381 local container_id = current_action.identifier -- For faster access, since this is going to be called 9 times in the next 3 lines
1382 -- Verify that we're still assigning data to the right items
1383 if container_id and container_id == CRATE_OF_SALVAGE_ITEM_ID or container_id == BIG_CRATE_OF_SALVAGE_ITEM_ID then
1384 Debug("CHAT_MSG_LOOT: AF.ITEM %d (%d)", item_id, quantity)
1385 InitializeCurrentLoot()
1386 current_loot.sources[container_id] = current_loot.sources[container_id] or {}
1387 current_loot.sources[container_id][item_id] = current_loot.sources[container_id][item_id] or 0 + quantity
1388 else -- If not, cancel the timer and wipe the loot table early
1389 Debug("CHAT_MSG_LOOT: We would have assigned the wrong loot to salvage crates!")
1390 WDP:CancelTimer(chat_loot_timer_handle)
1391 chat_loot_timer_handle = nil
1392 table.wipe(current_action)
1393 current_loot = nil
1394 end
1395 end,
1360 [AF.NPC] = function(item_id, quantity) 1396 [AF.NPC] = function(item_id, quantity)
1361 Debug("CHAT_MSG_LOOT: AF.NPC %d (%d)", item_id, quantity) 1397 Debug("CHAT_MSG_LOOT: AF.NPC %d (%d)", item_id, quantity)
1362 end, 1398 end,
1363 [AF.OBJECT] = function(item_id, quantity) 1399 [AF.OBJECT] = function(item_id, quantity)
1364 Debug("CHAT_MSG_LOOT: AF.OBJECT %d (%d)", item_id, quantity) 1400 Debug("CHAT_MSG_LOOT: AF.OBJECT %d (%d)", item_id, quantity)
1407 -- Recently changed from ~= "EXTRACT_GAS" because of some occassional bad data, and, as far as I know, no benefit. 1443 -- Recently changed from ~= "EXTRACT_GAS" because of some occassional bad data, and, as far as I know, no benefit.
1408 elseif current_action.spell_label == "FISHING" then 1444 elseif current_action.spell_label == "FISHING" then
1409 category = AF.ZONE 1445 category = AF.ZONE
1410 elseif private.raid_boss_id then 1446 elseif private.raid_boss_id then
1411 category = AF.NPC 1447 category = AF.NPC
1448 elseif chat_loot_timer_handle then
1449 category = AF.ITEM
1412 end 1450 end
1413 1451
1414 -- Take action based on update category 1452 -- Take action based on update category
1415 local update_func = CHAT_MSG_LOOT_UPDATE_FUNCS[category] 1453 local update_func = CHAT_MSG_LOOT_UPDATE_FUNCS[category]
1416 if not category or not update_func then 1454 if not category or not update_func then
2614 private.loot_toast_container_id = private.LOOT_SPELL_ID_TO_ITEM_ID_MAP[spell_id] 2652 private.loot_toast_container_id = private.LOOT_SPELL_ID_TO_ITEM_ID_MAP[spell_id]
2615 loot_toast_container_timer_handle = WDP:ScheduleTimer(ClearLootToastContainerID, 1) -- we need to assign a handle here to cancel it later 2653 loot_toast_container_timer_handle = WDP:ScheduleTimer(ClearLootToastContainerID, 1) -- we need to assign a handle here to cancel it later
2616 return 2654 return
2617 end 2655 end
2618 2656
2657 -- For Crates of Salvage (and potentially other items based on spell casts in the future which need manual handling)
2658 if private.SALVAGE_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then
2659 -- Set up timer
2660 chat_loot_timer_handle = WDP:ScheduleTimer(ClearTimeBasedLootData, 0.5)
2661
2662 -- Standard item handling setup
2663 table.wipe(current_action)
2664 current_loot = nil
2665 current_action.target_type = AF.ITEM
2666 current_action.identifier = item_id
2667 current_action.loot_label = "contains"
2668 return
2669 end
2670
2619 if anvil_spell_ids[spell_id] then 2671 if anvil_spell_ids[spell_id] then
2620 UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL) 2672 UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL)
2621 elseif forge_spell_ids[spell_id] then 2673 elseif forge_spell_ids[spell_id] then
2622 UpdateDBEntryLocation("objects", OBJECT_ID_FORGE) 2674 UpdateDBEntryLocation("objects", OBJECT_ID_FORGE)
2623 elseif spell_name:match("^Harvest.+") then 2675 elseif spell_name:match("^Harvest.+") then