comparison Main.lua @ 387:b4a0a56ab3ae

Assorted code cleanup and reorganization as preparation for new data collection methods.
author MMOSimca <MMOSimca@gmail.com>
date Tue, 16 Dec 2014 20:46:14 -0500
parents bc1b8234c659
children 1c6098b69ec9
comparison
equal deleted inserted replaced
386:bc1b8234c659 387:b4a0a56ab3ae
162 local item_process_timer_handle 162 local item_process_timer_handle
163 local faction_standings = {} 163 local faction_standings = {}
164 local forge_spell_ids = {} 164 local forge_spell_ids = {}
165 local languages_known = {} 165 local languages_known = {}
166 local boss_loot_toasting = {} 166 local boss_loot_toasting = {}
167 local container_loot_toasting
168 local loot_toast_container_id
169 local raid_boss_id
167 local loot_toast_container_timer_handle 170 local loot_toast_container_timer_handle
168 local loot_toast_data 171 local loot_toast_data
169 local loot_toast_data_timer_handle 172 local loot_toast_data_timer_handle
170 local name_to_id_map = {} 173 local name_to_id_map = {}
171 local killed_boss_id_timer_handle 174 local killed_boss_id_timer_handle
682 local loot_table = LootTable(entry, loot_type, top_field) 685 local loot_table = LootTable(entry, loot_type, top_field)
683 686
684 if not source_list[source_id] then 687 if not source_list[source_id] then
685 if top_field then 688 if top_field then
686 entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1 689 entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1
687 elseif not private.container_loot_toasting then 690 elseif not container_loot_toasting then
688 entry[loot_count] = (entry[loot_count] or 0) + 1 691 entry[loot_count] = (entry[loot_count] or 0) + 1
689 end 692 end
690 source_list[source_id] = true 693 source_list[source_id] = true
691 end 694 end
692 UpdateDBEntryLocation(data_type, source_id) 695 UpdateDBEntryLocation(data_type, source_id)
854 killed_boss_id_timer_handle:Cancel() 857 killed_boss_id_timer_handle:Cancel()
855 killed_boss_id_timer_handle = nil 858 killed_boss_id_timer_handle = nil
856 end 859 end
857 860
858 table.wipe(boss_loot_toasting) 861 table.wipe(boss_loot_toasting)
859 private.raid_boss_id = nil 862 raid_boss_id = nil
860 end 863 end
861 864
862 865
863 local function ClearLootToastContainerID() 866 local function ClearLootToastContainerID()
864 if loot_toast_container_timer_handle then 867 if loot_toast_container_timer_handle then
865 loot_toast_container_timer_handle:Cancel() 868 loot_toast_container_timer_handle:Cancel()
866 loot_toast_container_timer_handle = nil 869 loot_toast_container_timer_handle = nil
867 end 870 end
868 871
869 private.container_loot_toasting = false 872 container_loot_toasting = false
870 private.loot_toast_container_id = nil 873 loot_toast_container_id = nil
871 end 874 end
872 875
873 876
874 local function ClearLootToastData() 877 local function ClearLootToastData()
875 if loot_toast_data_timer_handle then 878 if loot_toast_data_timer_handle then
881 table.wipe(loot_toast_data) 884 table.wipe(loot_toast_data)
882 end 885 end
883 end 886 end
884 887
885 888
886 local function ClearTimeBasedLootData() 889 local function ClearChatLootData()
887 Debug("ClearTimeBasedLootData: Ending salvage loot timer.") 890 Debug("ClearChatLootData: Ending chat-based loot timer.")
888 if chat_loot_timer_handle then 891 if chat_loot_timer_handle then
889 chat_loot_timer_handle:Cancel() 892 chat_loot_timer_handle:Cancel()
890 chat_loot_timer_handle = nil 893 chat_loot_timer_handle = nil
891 end 894 end
892 895
1316 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity, spec_ID, sex_ID, is_personal, loot_source) 1319 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity, spec_ID, sex_ID, is_personal, loot_source)
1317 if not loot_type or (loot_type ~= "item" and loot_type ~= "money" and loot_type ~= "currency") then 1320 if not loot_type or (loot_type ~= "item" and loot_type ~= "money" and loot_type ~= "currency") then
1318 Debug("%s: loot_type is %s. Item link is %s, and quantity is %d.", event_name, loot_type, item_link, quantity) 1321 Debug("%s: loot_type is %s. Item link is %s, and quantity is %d.", event_name, loot_type, item_link, quantity)
1319 return 1322 return
1320 end 1323 end
1321 local container_id = private.loot_toast_container_id
1322 local npc_id = private.raid_boss_id
1323 1324
1324 -- Need information on the most recent args, so using this complete debug statement for now 1325 -- Need information on the most recent args, so using this complete debug statement for now
1325 Debug("%s: loot_type: %s, item_link: %s, quantity: %s, spec_ID: %s, sex_ID: %s, is_personal: %s, loot_source: %s", event_name, loot_type, item_link, quantity, spec_ID, sex_ID, is_personal, loot_source) 1326 Debug("%s: loot_type: %s, item_link: %s, quantity: %s, spec_ID: %s, sex_ID: %s, is_personal: %s, loot_source: %s", event_name, loot_type, item_link, quantity, spec_ID, sex_ID, is_personal, loot_source)
1326 1327
1327 -- Handle Garrison cache specially 1328 -- Handle Garrison cache specially
1346 Debug("%s: When handling the Garrison cache, the top level loot data was missing for objectID %d.", event_name, last_garrison_cache_object_id) 1347 Debug("%s: When handling the Garrison cache, the top level loot data was missing for objectID %d.", event_name, last_garrison_cache_object_id)
1347 end 1348 end
1348 else 1349 else
1349 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) 1350 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link)
1350 end 1351 end
1351 elseif npc_id then 1352 elseif raid_boss_id then
1352 -- Slightly messy hack to workaround duplicate world bosses 1353 -- Slightly messy hack to workaround duplicate world bosses
1353 local upper_limit = 0 1354 local upper_limit = 0
1354 if DUPLICATE_WORLD_BOSS_IDS[npc_id] then 1355 if DUPLICATE_WORLD_BOSS_IDS[raid_boss_id] then
1355 upper_limit = #DUPLICATE_WORLD_BOSS_IDS[npc_id] 1356 upper_limit = #DUPLICATE_WORLD_BOSS_IDS[raid_boss_id]
1356 end 1357 end
1357 for i = 0, upper_limit do 1358 for i = 0, upper_limit do
1358 local temp_npc_id = npc_id 1359 local temp_npc_id = raid_boss_id
1359 1360
1360 if i > 0 then 1361 if i > 0 then
1361 temp_npc_id = DUPLICATE_WORLD_BOSS_IDS[npc_id][i] 1362 temp_npc_id = DUPLICATE_WORLD_BOSS_IDS[raid_boss_id][i]
1362 end 1363 end
1363 1364
1364 local npc = NPCEntry(temp_npc_id) 1365 local npc = NPCEntry(temp_npc_id)
1365 if npc then 1366 if npc then
1366 local loot_label = "drops" 1367 local loot_label = "drops"
1396 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 1397 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1
1397 boss_loot_toasting[temp_npc_id] = true -- Do not count further loots until timer expires or another boss is killed 1398 boss_loot_toasting[temp_npc_id] = true -- Do not count further loots until timer expires or another boss is killed
1398 end 1399 end
1399 end 1400 end
1400 end 1401 end
1401 elseif container_id then 1402 elseif loot_toast_container_id then
1402 InitializeCurrentLoot() 1403 InitializeCurrentLoot()
1403 1404
1404 -- Fake the loot characteristics to match that of an actual container item 1405 -- Fake the loot characteristics to match that of an actual container item
1405 current_loot.identifier = container_id 1406 current_loot.identifier = loot_toast_container_id
1406 current_loot.label = "contains" 1407 current_loot.label = "contains"
1407 current_loot.target_type = AF.ITEM 1408 current_loot.target_type = AF.ITEM
1408 1409
1409 current_loot.sources[container_id] = current_loot.sources[container_id] or {} 1410 current_loot.sources[loot_toast_container_id] = current_loot.sources[loot_toast_container_id] or {}
1410 1411
1411 if loot_type == "item" then 1412 if loot_type == "item" then
1412 local item_id = ItemLinkToID(item_link) 1413 local item_id = ItemLinkToID(item_link)
1413 if item_id then 1414 if item_id then
1414 Debug("%s: %s X %d (%d)", event_name, item_link, quantity, item_id) 1415 Debug("%s: %s X %d (%d)", event_name, item_link, quantity, item_id)
1415 RecordItemData(item_id, item_link, true) 1416 RecordItemData(item_id, item_link, true)
1416 current_loot.sources[container_id][item_id] = (current_loot.sources[container_id][item_id] or 0) + quantity 1417 current_loot.sources[loot_toast_container_id][item_id] = (current_loot.sources[loot_toast_container_id][item_id] or 0) + quantity
1417 else 1418 else
1418 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) 1419 Debug("%s: ItemID is nil, from item link %s", event_name, item_link)
1419 current_loot = nil 1420 current_loot = nil
1420 return 1421 return
1421 end 1422 end
1422 elseif loot_type == "money" then 1423 elseif loot_type == "money" then
1423 Debug("%s: money X %d", event_name, quantity) 1424 Debug("%s: money X %d", event_name, quantity)
1424 current_loot.sources[container_id]["money"] = (current_loot.sources[container_id]["money"] or 0) + quantity 1425 current_loot.sources[loot_toast_container_id]["money"] = (current_loot.sources[loot_toast_container_id]["money"] or 0) + quantity
1425 elseif loot_type == "currency" then 1426 elseif loot_type == "currency" then
1426 local currency_texture = CurrencyLinkToTexture(item_link) 1427 local currency_texture = CurrencyLinkToTexture(item_link)
1427 if currency_texture and currency_texture ~= "" then 1428 if currency_texture and currency_texture ~= "" then
1428 Debug("%s: %s X %d", event_name, currency_texture, quantity) 1429 Debug("%s: %s X %d", event_name, currency_texture, quantity)
1429 local currency_token = ("currency:%s"):format(currency_texture) 1430 local currency_token = ("currency:%s"):format(currency_texture)
1430 current_loot.sources[container_id][currency_token] = (current_loot.sources[container_id][currency_token] or 0) + quantity 1431 current_loot.sources[loot_toast_container_id][currency_token] = (current_loot.sources[loot_toast_container_id][currency_token] or 0) + quantity
1431 else 1432 else
1432 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) 1433 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link)
1433 current_loot = nil 1434 current_loot = nil
1434 return 1435 return
1435 end 1436 end
1436 end 1437 end
1437 1438
1438 GenericLootUpdate("items") 1439 GenericLootUpdate("items")
1439 current_loot = nil 1440 current_loot = nil
1440 private.container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened 1441 container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened
1441 else 1442 else
1442 Debug("%s: NPC and Container are nil, storing loot toast data for 5 seconds.", event_name) 1443 Debug("%s: NPC and Container are nil, storing loot toast data for 5 seconds.", event_name)
1443 1444
1444 loot_toast_data = loot_toast_data or {} 1445 loot_toast_data = loot_toast_data or {}
1445 loot_toast_data[#loot_toast_data + 1] = { loot_type, item_link, quantity } 1446 loot_toast_data[#loot_toast_data + 1] = { loot_type, item_link, quantity }
1462 if container_id and (container_id == BAG_OF_SALVAGE_ITEM_ID or container_id == CRATE_OF_SALVAGE_ITEM_ID or container_id == BIG_CRATE_OF_SALVAGE_ITEM_ID) then 1463 if container_id and (container_id == BAG_OF_SALVAGE_ITEM_ID or container_id == CRATE_OF_SALVAGE_ITEM_ID or container_id == BIG_CRATE_OF_SALVAGE_ITEM_ID) then
1463 Debug("CHAT_MSG_LOOT: AF.ITEM %d (%d)", item_id, quantity) 1464 Debug("CHAT_MSG_LOOT: AF.ITEM %d (%d)", item_id, quantity)
1464 current_loot.sources[container_id] = current_loot.sources[container_id] or {} 1465 current_loot.sources[container_id] = current_loot.sources[container_id] or {}
1465 current_loot.sources[container_id][item_id] = (current_loot.sources[container_id][item_id] or 0) + quantity 1466 current_loot.sources[container_id][item_id] = (current_loot.sources[container_id][item_id] or 0) + quantity
1466 else -- If not, cancel the timer and wipe the loot table early 1467 else -- If not, cancel the timer and wipe the loot table early
1467 Debug("CHAT_MSG_LOOT: We would have assigned the wrong loot to salvage crates!") 1468 Debug("CHAT_MSG_LOOT: We would have assigned the wrong loot!")
1468 ClearTimeBasedLootData() 1469 ClearChatLootData()
1469 end 1470 end
1470 end, 1471 end,
1471 [AF.NPC] = function(item_id, quantity) 1472 [AF.NPC] = function(item_id, quantity)
1472 Debug("CHAT_MSG_LOOT: AF.NPC %d (%d)", item_id, quantity) 1473 Debug("CHAT_MSG_LOOT: AF.NPC %d (%d)", item_id, quantity)
1473 end, 1474 end,
1495 current_loot = nil 1496 current_loot = nil
1496 end, 1497 end,
1497 } 1498 }
1498 1499
1499 1500
1500 function WDP:CHAT_MSG_LOOT(event_name, message) 1501 function WDP:CHAT_MSG_CURRENCY(event_name, message)
1501 local category 1502 local category
1502 1503
1503 local item_link, quantity = deformat(message, _G.LOOT_ITEM_PUSHED_SELF_MULTIPLE) 1504 local item_link, quantity = deformat(message, _G.LOOT_ITEM_PUSHED_SELF_MULTIPLE)
1504 if not item_link then 1505 if not item_link then
1505 quantity, item_link = 1, deformat(message, _G.LOOT_ITEM_PUSHED_SELF) 1506 quantity, item_link = 1, deformat(message, _G.LOOT_ITEM_PUSHED_SELF)
2058 return true 2059 return true
2059 end 2060 end
2060 2061
2061 2062
2062 function WDP:LOOT_OPENED(event_name) 2063 function WDP:LOOT_OPENED(event_name)
2064 if chat_loot_timer_handle then
2065 ClearChatLootData()
2066 end
2067
2063 if current_loot then 2068 if current_loot then
2064 current_loot = nil 2069 current_loot = nil
2065 Debug("%s: Previous loot did not process in time for this event. Attempting to extrapolate current_action from loot data.", event_name) 2070 Debug("%s: Previous loot did not process in time for this event. Attempting to extrapolate current_action from loot data.", event_name)
2066 2071
2067 if not ExtrapolatedCurrentActionFromLootData(event_name) then 2072 if not ExtrapolatedCurrentActionFromLootData(event_name) then
2648 2653
2649 function WDP:SPELL_CONFIRMATION_PROMPT(event_name, spell_id, confirm_type, text, duration, currency_id_cost) 2654 function WDP:SPELL_CONFIRMATION_PROMPT(event_name, spell_id, confirm_type, text, duration, currency_id_cost)
2650 if private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then 2655 if private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then
2651 ClearKilledBossID() 2656 ClearKilledBossID()
2652 ClearLootToastContainerID() 2657 ClearLootToastContainerID()
2653 private.raid_boss_id = private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] 2658 raid_boss_id = private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id]
2654 else 2659 else
2655 Debug("%s: Spell ID %d is not a known raid boss 'Bonus' spell.", event_name, spell_id) 2660 Debug("%s: Spell ID %d is not a known raid boss 'Bonus' spell.", event_name, spell_id)
2656 return 2661 return
2657 end 2662 end
2658 2663
2659 -- Assign existing loot data to boss if it exists 2664 -- Assign existing loot data to boss if it exists
2660 if loot_toast_data then 2665 if loot_toast_data then
2661 local npc_id = private.raid_boss_id 2666 local npc_id = raid_boss_id
2662 2667
2663 -- Slightly messy hack to workaround duplicate world bosses 2668 -- Slightly messy hack to workaround duplicate world bosses
2664 local upper_limit = 0 2669 local upper_limit = 0
2665 if DUPLICATE_WORLD_BOSS_IDS[npc_id] then 2670 if DUPLICATE_WORLD_BOSS_IDS[npc_id] then
2666 upper_limit = #DUPLICATE_WORLD_BOSS_IDS[npc_id] 2671 upper_limit = #DUPLICATE_WORLD_BOSS_IDS[npc_id]
2735 if private.LOOT_TOAST_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then 2740 if private.LOOT_TOAST_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then
2736 ClearKilledBossID() 2741 ClearKilledBossID()
2737 ClearLootToastContainerID() 2742 ClearLootToastContainerID()
2738 ClearLootToastData() 2743 ClearLootToastData()
2739 2744
2740 private.loot_toast_container_id = private.LOOT_TOAST_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] 2745 loot_toast_container_id = private.LOOT_TOAST_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id]
2741 loot_toast_container_timer_handle = C_Timer.NewTimer(1, ClearLootToastContainerID) -- we need to assign a handle here to cancel it later 2746 loot_toast_container_timer_handle = C_Timer.NewTimer(1, ClearLootToastContainerID) -- we need to assign a handle here to cancel it later
2742 return 2747 return
2743 end 2748 end
2744 2749
2745 -- For Crates of Salvage (and potentially other items based on spell casts in the future which need manual handling) 2750 -- For Crates of Salvage (and potentially other items based on spell casts in the future which need manual handling)
2746 if private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then 2751 if private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then
2747 -- Set up timer 2752 -- Set up timer
2748 Debug("%s: Beginning Salvage loot timer for spellID %d", event_name, spell_id) 2753 Debug("%s: Beginning Salvage loot timer for spellID %d", event_name, spell_id)
2749 chat_loot_timer_handle = C_Timer.NewTimer(1, ClearTimeBasedLootData) 2754 chat_loot_timer_handle = C_Timer.NewTimer(1, ClearChatLootData)
2750 2755
2751 -- Standard item handling setup 2756 -- Standard item handling setup
2752 table.wipe(current_action) 2757 table.wipe(current_action)
2753 current_loot = nil 2758 current_loot = nil
2754 current_action.target_type = AF.ITEM 2759 current_action.target_type = AF.ITEM