Mercurial > wow > wowdb-profiler
comparison Main.lua @ 329:84817627cb22 WoD
Many changes for WoD, including support for Itembonuses, the new GUID format, and LOOT_READY.
| author | MMOSimca <MMOSimca@gmail.com> |
|---|---|
| date | Wed, 06 Aug 2014 04:39:26 -0400 |
| parents | 3487529df8e5 |
| children | 267e7100407c 998f3264b482 |
comparison
equal
deleted
inserted
replaced
| 328:3487529df8e5 | 329:84817627cb22 |
|---|---|
| 90 GROUP_ROSTER_UPDATE = true, | 90 GROUP_ROSTER_UPDATE = true, |
| 91 GUILDBANKFRAME_OPENED = true, | 91 GUILDBANKFRAME_OPENED = true, |
| 92 ITEM_TEXT_BEGIN = true, | 92 ITEM_TEXT_BEGIN = true, |
| 93 ITEM_UPGRADE_MASTER_OPENED = true, | 93 ITEM_UPGRADE_MASTER_OPENED = true, |
| 94 LOOT_CLOSED = true, | 94 LOOT_CLOSED = true, |
| 95 LOOT_OPENED = true, | 95 LOOT_READY = true, |
| 96 MAIL_SHOW = true, | 96 MAIL_SHOW = true, |
| 97 MERCHANT_CLOSED = true, | 97 MERCHANT_CLOSED = true, |
| 98 MERCHANT_SHOW = "UpdateMerchantItems", | 98 MERCHANT_SHOW = "UpdateMerchantItems", |
| 99 MERCHANT_UPDATE = "UpdateMerchantItems", | 99 MERCHANT_UPDATE = "UpdateMerchantItems", |
| 100 PET_BAR_UPDATE = true, | 100 PET_BAR_UPDATE = true, |
| 461 | 461 |
| 462 | 462 |
| 463 local ParseGUID | 463 local ParseGUID |
| 464 do | 464 do |
| 465 local UNIT_TYPES = private.UNIT_TYPES | 465 local UNIT_TYPES = private.UNIT_TYPES |
| 466 local UNIT_TYPE_BITMASK = 0x007 | |
| 467 | 466 |
| 468 local NPC_ID_MAPPING = { | 467 local NPC_ID_MAPPING = { |
| 469 [62164] = 63191, -- Garalon | 468 [62164] = 63191, -- Garalon |
| 470 } | 469 } |
| 471 | 470 |
| 472 | 471 |
| 472 function MatchUnitTypes(unit_type_name) | |
| 473 if not unit_type_name then | |
| 474 return UNIT_TYPES.UNKNOWN | |
| 475 end | |
| 476 | |
| 477 for def, text in next, UNIT_TYPES do | |
| 478 if unit_type_name == text then | |
| 479 return UNIT_TYPES[def] | |
| 480 end | |
| 481 end | |
| 482 return UNIT_TYPES.UNKNOWN | |
| 483 end | |
| 484 | |
| 485 | |
| 473 function ParseGUID(guid) | 486 function ParseGUID(guid) |
| 474 if not guid then | 487 if not guid then |
| 475 return | 488 return |
| 476 end | 489 end |
| 477 local bitfield = tonumber(guid:sub(1, 5)) | 490 |
| 478 | 491 -- We might want to use some of this new information later, but leaving the returns alone for now |
| 479 if not bitfield then | 492 local unit_type_name, unk_id1, server_id, instance_id, unk_id2, unit_idnum, spawn_id = (":"):split(guid) |
| 480 return UNIT_TYPES.UNKNOWN | 493 |
| 481 end | 494 unit_type = MatchUnitTypes(unit_type_name) |
| 482 local unit_type = _G.bit.band(bitfield, UNIT_TYPE_BITMASK) | 495 if unit_type ~= UNIT_TYPES.PLAYER and unit_type ~= UNIT_TYPES.PET and unit_type ~= UNIT_TYPES.ITEM then |
| 483 | 496 |
| 484 if unit_type ~= UNIT_TYPES.PLAYER and unit_type ~= UNIT_TYPES.PET then | |
| 485 local unit_idnum = tonumber(guid:sub(6, 10), 16) | |
| 486 local id_mapping = NPC_ID_MAPPING[unit_idnum] | 497 local id_mapping = NPC_ID_MAPPING[unit_idnum] |
| 487 | 498 |
| 488 if id_mapping and UnitTypeIsNPC(unit_type) then | 499 if id_mapping and UnitTypeIsNPC(unit_type) then |
| 489 unit_idnum = id_mapping | 500 unit_idnum = id_mapping |
| 490 end | 501 end |
| 595 current_action.identifier = item_id | 606 current_action.identifier = item_id |
| 596 current_action.loot_label = "contains" | 607 current_action.loot_label = "contains" |
| 597 return | 608 return |
| 598 end | 609 end |
| 599 end | 610 end |
| 600 | |
| 601 Debug("HandleItemUse: Item with ID %d and link %s did not have a tooltip that contained the string %s.", item_id, item_link, _G.ITEM_OPENABLE) | 611 Debug("HandleItemUse: Item with ID %d and link %s did not have a tooltip that contained the string %s.", item_id, item_link, _G.ITEM_OPENABLE) |
| 602 end | 612 end |
| 603 | 613 |
| 604 | 614 |
| 605 local UnitFactionStanding | 615 local UnitFactionStanding |
| 947 break | 957 break |
| 948 end | 958 end |
| 949 local amount, stat = left_text:match("+(.-) (.*)") | 959 local amount, stat = left_text:match("+(.-) (.*)") |
| 950 | 960 |
| 951 if amount and stat then | 961 if amount and stat then |
| 952 if reforge_id and reforge_id ~= 0 then | |
| 953 local reforge_string = stat:find("Reforged") | |
| 954 | |
| 955 if reforge_string then | |
| 956 stat = stat:sub(0, reforge_string - 3) | |
| 957 intermediary.reforge_id = reforge_id | |
| 958 end | |
| 959 end | |
| 960 create_entry = true | 962 create_entry = true |
| 961 intermediary[stat:lower():gsub(" ", "_"):gsub("|r", "")] = tonumber((amount:gsub(",", ""))) | 963 intermediary[stat:lower():gsub(" ", "_"):gsub("|r", "")] = tonumber((amount:gsub(",", ""))) |
| 962 end | 964 end |
| 963 end | 965 end |
| 964 | 966 |
| 982 local function RecordItemData(item_id, item_link, durability) | 984 local function RecordItemData(item_id, item_link, durability) |
| 983 local item_string = select(3, item_link:find("^|%x+|H(.+)|h%[.+%]")) | 985 local item_string = select(3, item_link:find("^|%x+|H(.+)|h%[.+%]")) |
| 984 local item | 986 local item |
| 985 | 987 |
| 986 if item_string then | 988 if item_string then |
| 987 local _, _, _, _, _, _, _, suffix_id, unique_id, _, reforge_id, upgrade_id = (":"):split(item_string) | 989 local _, _, _, _, _, _, _, suffix_id, unique_id, _, upgrade_id, instance_difficulty_id, num_bonus_ids = (":"):split(item_string) |
| 988 suffix_id = tonumber(suffix_id) | 990 local bonus_ids = {select(14, (":"):split(item_string))} |
| 989 upgrade_id = tonumber(upgrade_id) | 991 upgrade_id = tonumber(upgrade_id) |
| 990 | 992 instance_difficulty_id = tonumber(instance_difficulty_id) |
| 991 if suffix_id and suffix_id ~= 0 then | 993 num_bonus_ids = tonumber(num_bonus_ids) |
| 994 if (not num_bonus_ids) or (num_bonus_ids == 0) then | |
| 995 if (suffix_id and suffix_id ~= 0) or (instance_difficulty_id and instance_difficulty_id ~= 0) then | |
| 996 item = DBEntry("items", item_id) | |
| 997 item.unique_id = bit.band(unique_id, 0xFFFF) | |
| 998 if (suffix_id and suffix_id ~= 0) then | |
| 999 item.suffix_id = suffix_id | |
| 1000 end | |
| 1001 if (instance_difficulty_id and instance_difficulty_id ~= 0) then | |
| 1002 item.instance_difficulty_id = instance_difficulty_id | |
| 1003 end | |
| 1004 end | |
| 1005 elseif num_bonus_ids > 0 then | |
| 992 item = DBEntry("items", item_id) | 1006 item = DBEntry("items", item_id) |
| 993 item.suffix_id = suffix_id | 1007 |
| 994 item.unique_id = bit.band(unique_id, 0xFFFF) | 1008 item.unique_id = bit.band(unique_id, 0xFFFF) |
| 995 end | 1009 item.instance_difficulty_id = instance_difficulty_id |
| 996 | 1010 |
| 1011 if not item.bonus_ids then | |
| 1012 item.bonus_ids = {} | |
| 1013 end | |
| 1014 | |
| 1015 for bonus_index = 1, num_bonus_ids do | |
| 1016 item.bonus_ids[bonus_ids[bonus_index]] = true | |
| 1017 end | |
| 1018 else | |
| 1019 Debug("RecordItemData: Item_system is supposed to be 0 or positive, instead it was %s.", item_system) | |
| 1020 end | |
| 997 if upgrade_id and upgrade_id ~= 0 then | 1021 if upgrade_id and upgrade_id ~= 0 then |
| 998 DatamineTT:SetHyperlink(item_link) | 1022 DatamineTT:SetHyperlink(item_link) |
| 999 ScrapeItemUpgradeStats(item_id, upgrade_id, reforge_id) | 1023 ScrapeItemUpgradeStats(item_id, upgrade_id) |
| 1000 end | 1024 end |
| 1001 end | 1025 end |
| 1002 | 1026 |
| 1003 if durability and durability > 0 then | 1027 if durability and durability > 0 then |
| 1004 item = item or DBEntry("items", item_id) | 1028 item = item or DBEntry("items", item_id) |
| 1684 UpdateDBEntryLocation("objects", unit_idnum) | 1708 UpdateDBEntryLocation("objects", unit_idnum) |
| 1685 end | 1709 end |
| 1686 | 1710 |
| 1687 | 1711 |
| 1688 do | 1712 do |
| 1689 local LOOT_OPENED_VERIFY_FUNCS = { | 1713 local LOOT_READY_VERIFY_FUNCS = { |
| 1690 -- Item containers can be AOE-looted in Patch 5.4.2 if the user clicks fast enough, but this verification still works as long as they both have loot. | 1714 -- Item containers can be AOE-looted in Patch 5.4.2 if the user clicks fast enough, but this verification still works as long as they both have loot. |
| 1691 [AF.ITEM] = function() | 1715 [AF.ITEM] = function() |
| 1692 local locked_item_id | 1716 local locked_item_id |
| 1693 | 1717 |
| 1694 for bag_index = 0, _G.NUM_BAG_FRAMES do | 1718 for bag_index = 0, _G.NUM_BAG_FRAMES do |
| 1719 return _G.IsFishingLoot() | 1743 return _G.IsFishingLoot() |
| 1720 end, | 1744 end, |
| 1721 } | 1745 } |
| 1722 | 1746 |
| 1723 | 1747 |
| 1724 local LOOT_OPENED_UPDATE_FUNCS = { | 1748 local LOOT_READY_UPDATE_FUNCS = { |
| 1725 [AF.ITEM] = function() | 1749 [AF.ITEM] = function() |
| 1726 GenericLootUpdate("items") | 1750 GenericLootUpdate("items") |
| 1727 end, | 1751 end, |
| 1728 [AF.NPC] = function() | 1752 [AF.NPC] = function() |
| 1729 local difficulty_token = InstanceDifficultyToken() | 1753 local difficulty_token = InstanceDifficultyToken() |
| 1836 | 1860 |
| 1837 if num_guids == 0 then | 1861 if num_guids == 0 then |
| 1838 Debug("%s: No GUIDs found in loot. Blank loot window?", log_source) | 1862 Debug("%s: No GUIDs found in loot. Blank loot window?", log_source) |
| 1839 return false | 1863 return false |
| 1840 end | 1864 end |
| 1841 | |
| 1842 if private.previous_spell_id and private.EXTRAPOLATION_BANNED_SPELL_IDS[private.previous_spell_id] then | 1865 if private.previous_spell_id and private.EXTRAPOLATION_BANNED_SPELL_IDS[private.previous_spell_id] then |
| 1843 Debug("%s: Problematic spell id %s found. Loot extrapolation for this set of loot would have run an increased risk of introducing bad data into the system.", log_source, private.previous_spell_id) | 1866 Debug("%s: Problematic spell id %s found. Loot extrapolation for this set of loot would have run an increased risk of introducing bad data into the system.", log_source, private.previous_spell_id) |
| 1844 return false | 1867 return false |
| 1845 end | 1868 end |
| 1846 | 1869 |
| 1896 Debug("%s: Successfully extrapolated information for current_action.", log_source) | 1919 Debug("%s: Successfully extrapolated information for current_action.", log_source) |
| 1897 return true | 1920 return true |
| 1898 end | 1921 end |
| 1899 | 1922 |
| 1900 | 1923 |
| 1901 function WDP:LOOT_OPENED(event_name) | 1924 function WDP:LOOT_READY(event_name) |
| 1902 if current_loot then | 1925 if current_loot then |
| 1903 current_loot = nil | 1926 current_loot = nil |
| 1904 Debug("%s: Previous loot did not process in time for this event. Attempting to extrapolate current_action from loot data.", event_name) | 1927 Debug("%s: Previous loot did not process in time for this event. Attempting to extrapolate current_action from loot data.", event_name) |
| 1905 | 1928 |
| 1906 if not ExtrapolatedCurrentActionFromLootData(event_name) then | 1929 if not ExtrapolatedCurrentActionFromLootData(event_name) then |
| 1915 if not ExtrapolatedCurrentActionFromLootData(event_name) then | 1938 if not ExtrapolatedCurrentActionFromLootData(event_name) then |
| 1916 Debug("%s: Unable to extrapolate current_action. Aborting attempts to handle loot for now.", event_name) | 1939 Debug("%s: Unable to extrapolate current_action. Aborting attempts to handle loot for now.", event_name) |
| 1917 return | 1940 return |
| 1918 end | 1941 end |
| 1919 end | 1942 end |
| 1920 local verify_func = LOOT_OPENED_VERIFY_FUNCS[current_action.target_type] | 1943 local verify_func = LOOT_READY_VERIFY_FUNCS[current_action.target_type] |
| 1921 local update_func = LOOT_OPENED_UPDATE_FUNCS[current_action.target_type] | 1944 local update_func = LOOT_READY_UPDATE_FUNCS[current_action.target_type] |
| 1922 | 1945 |
| 1923 if not verify_func or not update_func then | 1946 if not verify_func or not update_func then |
| 1924 Debug("%s: The current action's target type is unsupported or nil.", event_name) | 1947 Debug("%s: The current action's target type is unsupported or nil.", event_name) |
| 1925 return | 1948 return |
| 1926 end | 1949 end |
| 1945 for loot_index = 1, #loot_info, 2 do | 1968 for loot_index = 1, #loot_info, 2 do |
| 1946 local source_guid = loot_info[loot_index] | 1969 local source_guid = loot_info[loot_index] |
| 1947 | 1970 |
| 1948 if not loot_guid_registry[current_loot.label][source_guid] then | 1971 if not loot_guid_registry[current_loot.label][source_guid] then |
| 1949 local loot_quantity = loot_info[loot_index + 1] | 1972 local loot_quantity = loot_info[loot_index + 1] |
| 1950 | |
| 1951 -- There is a new bug in 5.4.0 that causes GetLootSlotInfo() to (rarely) return nil values for slot_quantity. | 1973 -- There is a new bug in 5.4.0 that causes GetLootSlotInfo() to (rarely) return nil values for slot_quantity. |
| 1952 if slot_quantity then | 1974 if slot_quantity then |
| 1953 -- We need slot_quantity to account for an old bug where loot_quantity is sometimes '1' for stacks of items, such as cloth. | 1975 -- We need slot_quantity to account for an old bug where loot_quantity is sometimes '1' for stacks of items, such as cloth. |
| 1954 if slot_quantity > loot_quantity then | 1976 if slot_quantity > loot_quantity then |
| 1955 loot_quantity = slot_quantity | 1977 loot_quantity = slot_quantity |
| 1956 end | 1978 end |
| 1957 | |
| 1958 local source_type, source_id = ParseGUID(source_guid) | 1979 local source_type, source_id = ParseGUID(source_guid) |
| 1959 local source_key = ("%s:%d"):format(private.UNIT_TYPE_NAMES[source_type + 1], source_id) | 1980 local source_key = ("%s:%d"):format(source_type, source_id) |
| 1960 | 1981 |
| 1961 if slot_type == _G.LOOT_SLOT_ITEM then | 1982 if slot_type == _G.LOOT_SLOT_ITEM then |
| 1962 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) | 1983 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) |
| 1963 Debug("GUID: %s - Type:ID: %s - ItemID: %d - Amount: %d (%d)", loot_info[loot_index], source_key, item_id, loot_info[loot_index + 1], slot_quantity) | 1984 Debug("GUID: %s - Type:ID: %s - ItemID: %d - Amount: %d (%d)", loot_info[loot_index], source_key, item_id, loot_info[loot_index + 1], slot_quantity) |
| 1964 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} | 1985 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} |
| 2249 if unit_type == private.UNIT_TYPES.OBJECT then | 2270 if unit_type == private.UNIT_TYPES.OBJECT then |
| 2250 UpdateDBEntryLocation("objects", unit_id) | 2271 UpdateDBEntryLocation("objects", unit_id) |
| 2251 end | 2272 end |
| 2252 local quest = DBEntry("quests", _G.GetQuestID()) | 2273 local quest = DBEntry("quests", _G.GetQuestID()) |
| 2253 quest[point] = quest[point] or {} | 2274 quest[point] = quest[point] or {} |
| 2254 quest[point][("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type + 1], unit_id)] = true | 2275 quest[point][("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type], unit_id)] = true |
| 2255 | 2276 |
| 2256 return quest | 2277 return quest |
| 2257 end | 2278 end |
| 2258 | 2279 |
| 2259 | 2280 |
| 2287 local selected_quest = _G.GetQuestLogSelection() -- Save current selection to be restored when we're done. | 2308 local selected_quest = _G.GetQuestLogSelection() -- Save current selection to be restored when we're done. |
| 2288 local entry_index, processed_quests = 1, 0 | 2309 local entry_index, processed_quests = 1, 0 |
| 2289 local _, num_quests = _G.GetNumQuestLogEntries() | 2310 local _, num_quests = _G.GetNumQuestLogEntries() |
| 2290 | 2311 |
| 2291 while processed_quests <= num_quests do | 2312 while processed_quests <= num_quests do |
| 2292 local _, _, _, _, is_header, _, _, _, quest_id = _G.GetQuestLogTitle(entry_index) | 2313 local _, _, _, is_header, _, _, _, quest_id = _G.GetQuestLogTitle(entry_index) |
| 2293 | 2314 |
| 2294 if quest_id == 0 then | 2315 if quest_id == 0 then |
| 2295 processed_quests = processed_quests + 1 | 2316 processed_quests = processed_quests + 1 |
| 2296 elseif not is_header then | 2317 elseif not is_header then |
| 2297 _G.SelectQuestLogEntry(entry_index); | 2318 _G.SelectQuestLogEntry(entry_index); |
