Mercurial > wow > wowdb-profiler
comparison Main.lua @ 496:3938b87cfcd3
Radically rewrote currency support for WoWDBProfiler. It now uses currencyIDs everywhere instead of texture paths.
| author | MMOSimca <mmosimca@gmail.com> |
|---|---|
| date | Tue, 11 Oct 2016 06:13:22 -0400 |
| parents | 1d1bbcad6563 |
| children | c8a8231c2336 |
comparison
equal
deleted
inserted
replaced
| 495:1d1bbcad6563 | 496:3938b87cfcd3 |
|---|---|
| 14 local select = _G.select | 14 local select = _G.select |
| 15 local type = _G.type | 15 local type = _G.type |
| 16 local unpack = _G.unpack | 16 local unpack = _G.unpack |
| 17 | 17 |
| 18 local C_Timer = _G.C_Timer | 18 local C_Timer = _G.C_Timer |
| 19 local GetCurrencyInfo = _G.GetCurrencyInfo | |
| 19 | 20 |
| 20 | 21 |
| 21 -- ADDON NAMESPACE ---------------------------------------------------- | 22 -- ADDON NAMESPACE ---------------------------------------------------- |
| 22 | 23 |
| 23 local ADDON_NAME, private = ... | 24 local ADDON_NAME, private = ... |
| 314 return math.floor(copper_cost / modifier) | 315 return math.floor(copper_cost / modifier) |
| 315 end | 316 end |
| 316 end -- do-block | 317 end -- do-block |
| 317 | 318 |
| 318 | 319 |
| 320 local CurrencyInfoToID | |
| 321 local PopulateCurrencyInfoLookup | |
| 322 do | |
| 323 local MAX_CURRENCY_ID_GAP = 800 | |
| 324 | |
| 325 local currency_info_lookup = {} | |
| 326 | |
| 327 | |
| 328 function CurrencyInfoToID(name, texture) | |
| 329 return currency_info_lookup[("%s:%s"):format(name, texture)] | |
| 330 end | |
| 331 | |
| 332 | |
| 333 function PopulateCurrencyInfoLookup() | |
| 334 local currency_index = 1 | |
| 335 local gap_since_last_currency = 0 | |
| 336 repeat | |
| 337 -- Store ID by info (name and texture combined) | |
| 338 local name, _, texture = GetCurrencyInfo(currency_index) | |
| 339 currency_info_lookup[("%s:%s"):format(name, texture)] = currency_index | |
| 340 | |
| 341 -- If we found nothing, increment gap | |
| 342 if not name or not texture or (name == "" and texture == "") then | |
| 343 gap_since_last_currency = gap_since_last_currency + 1 | |
| 344 else | |
| 345 gap_since_last_currency = 0 | |
| 346 end | |
| 347 | |
| 348 -- Increment loop counter | |
| 349 currency_index = currency_index + 1 | |
| 350 | |
| 351 until (gap_since_last_currency > MAX_CURRENCY_ID_GAP) | |
| 352 end | |
| 353 end | |
| 354 | |
| 355 | |
| 319 local function InstanceDifficultyToken() | 356 local function InstanceDifficultyToken() |
| 320 -- Sometimes, instance information is returned when not in an instance. This check protects against that. | 357 -- Sometimes, instance information is returned when not in an instance. This check protects against that. |
| 321 if _G.IsInInstance() then | 358 if _G.IsInInstance() then |
| 322 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() | 359 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() |
| 323 | 360 |
| 470 return zone_data | 507 return zone_data |
| 471 end | 508 end |
| 472 end -- do-block | 509 end -- do-block |
| 473 | 510 |
| 474 | 511 |
| 475 local function CurrencyLinkToTexture(currency_link) | 512 local function CurrencyLinkToID(currency_link) |
| 476 if not currency_link then | 513 if not currency_link then |
| 477 return | 514 return nil |
| 478 end | 515 end |
| 479 local _, _, texture_path = _G.GetCurrencyInfo(tonumber(currency_link:match("currency:(%d+)"))) | 516 return tonumber(currency_link:match("currency:(%d+)")) or 0 |
| 480 return texture_path:match("[^\\]+$"):lower() | 517 --texture_path:match("[^\\]+$"):lower() |
| 481 end | 518 end |
| 482 | 519 |
| 483 | 520 |
| 484 local function ItemLinkToID(item_link) | 521 local function ItemLinkToID(item_link) |
| 485 if not item_link then | 522 if not item_link then |
| 696 for item_id, quantity in pairs(loot_data) do | 733 for item_id, quantity in pairs(loot_data) do |
| 697 table.insert(loot_table, ("%d:%d"):format(item_id, quantity)) | 734 table.insert(loot_table, ("%d:%d"):format(item_id, quantity)) |
| 698 end | 735 end |
| 699 else | 736 else |
| 700 for loot_token, quantity in pairs(loot_data) do | 737 for loot_token, quantity in pairs(loot_data) do |
| 701 local label, currency_texture = (":"):split(loot_token) | 738 local label, currency_id = (":"):split(loot_token) |
| 702 | 739 |
| 703 if label == "currency" and currency_texture then | 740 if label == "currency" and currency_id then |
| 704 table.insert(loot_table, ("currency:%d:%s"):format(quantity, currency_texture)) | 741 -- Convert currency_id back into number from string |
| 742 currency_id = tonumber(currency_id) or 0 | |
| 743 if currency_id ~= 0 then | |
| 744 table.insert(loot_table, ("currency:%d:%d"):format(quantity, currency_id)) | |
| 745 end | |
| 705 elseif loot_token == "money" then | 746 elseif loot_token == "money" then |
| 706 table.insert(loot_table, ("money:%d"):format(quantity)) | 747 table.insert(loot_table, ("money:%d"):format(quantity)) |
| 707 else | 748 else |
| 708 table.insert(loot_table, ("%d:%d"):format(loot_token, quantity)) | 749 table.insert(loot_table, ("%d:%d"):format(loot_token, quantity)) |
| 709 end | 750 end |
| 830 if entry then | 871 if entry then |
| 831 local loot_table = LootTable(entry, "contains") | 872 local loot_table = LootTable(entry, "contains") |
| 832 entry["contains_count"] = (entry["contains_count"] or 0) + 1 | 873 entry["contains_count"] = (entry["contains_count"] or 0) + 1 |
| 833 | 874 |
| 834 for loot_token, quantity in pairs(chat_loot_data.loot) do | 875 for loot_token, quantity in pairs(chat_loot_data.loot) do |
| 835 local label, currency_texture = (":"):split(loot_token) | 876 local label, currency_id = (":"):split(loot_token) |
| 836 | 877 |
| 837 if label == "currency" and currency_texture then | 878 if label == "currency" and currency_id then |
| 838 table.insert(loot_table, ("currency:%d:%s"):format(quantity, currency_texture)) | 879 -- Convert currency_id back into number from string |
| 880 currency_id = tonumber(currency_id) or 0 | |
| 881 if currency_id ~= 0 then | |
| 882 table.insert(loot_table, ("currency:%d:%d"):format(quantity, currency_id)) | |
| 883 end | |
| 839 elseif loot_token == "money" then | 884 elseif loot_token == "money" then |
| 840 table.insert(loot_table, ("money:%d"):format(quantity)) | 885 table.insert(loot_table, ("money:%d"):format(quantity)) |
| 841 else | 886 else |
| 842 table.insert(loot_table, ("%d:%d"):format(loot_token, quantity)) | 887 table.insert(loot_table, ("%d:%d"):format(loot_token, quantity)) |
| 843 end | 888 end |
| 911 else | 956 else |
| 912 self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil) | 957 self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil) |
| 913 end | 958 end |
| 914 end | 959 end |
| 915 | 960 |
| 961 -- Gather known languages | |
| 916 for index = 1, _G.GetNumLanguages() do | 962 for index = 1, _G.GetNumLanguages() do |
| 917 languages_known[_G.GetLanguageByIndex(index)] = true | 963 languages_known[_G.GetLanguageByIndex(index)] = true |
| 918 end | 964 end |
| 965 | |
| 966 -- Populate currency data from known currency information | |
| 967 PopulateCurrencyInfoLookup() | |
| 919 | 968 |
| 920 -- These timers loop indefinitely using Lua's infinity constant | 969 -- These timers loop indefinitely using Lua's infinity constant |
| 921 item_process_timer_handle = C_Timer.NewTicker(DELAY_PROCESS_ITEMS, WDP.ProcessItems, math.huge) | 970 item_process_timer_handle = C_Timer.NewTicker(DELAY_PROCESS_ITEMS, WDP.ProcessItems, math.huge) |
| 922 target_location_timer_handle = C_Timer.NewTicker(DELAY_UPDATE_TARGET_LOCATION, WDP.UpdateTargetLocation, math.huge) | 971 target_location_timer_handle = C_Timer.NewTicker(DELAY_UPDATE_TARGET_LOCATION, WDP.UpdateTargetLocation, math.huge) |
| 923 world_quest_timer_handle = C_Timer.NewTicker(DELAY_PROCESS_WORLD_QUESTS, WDP.ProcessWorldQuests, math.huge) | 972 world_quest_timer_handle = C_Timer.NewTicker(DELAY_PROCESS_WORLD_QUESTS, WDP.ProcessWorldQuests, math.huge) |
| 974 entry["rewards"]["honor"] = tonumber(_G.GetQuestLogRewardHonor(quest_id)) or 0 | 1023 entry["rewards"]["honor"] = tonumber(_G.GetQuestLogRewardHonor(quest_id)) or 0 |
| 975 | 1024 |
| 976 -- Record currencies | 1025 -- Record currencies |
| 977 entry["rewards"]["currency_count"] = tonumber(_G.GetNumQuestLogRewardCurrencies(quest_id)) or 0 | 1026 entry["rewards"]["currency_count"] = tonumber(_G.GetNumQuestLogRewardCurrencies(quest_id)) or 0 |
| 978 | 1027 |
| 1028 -- Create currency rewards sub-table and fill | |
| 979 if entry["rewards"]["currency_count"] > 0 then | 1029 if entry["rewards"]["currency_count"] > 0 then |
| 980 | |
| 981 -- Create currency rewards sub-table and fill | |
| 982 entry["rewards"]["currencies"] = {} | 1030 entry["rewards"]["currencies"] = {} |
| 983 for i = 1, entry["rewards"]["currency_count"] do | 1031 for i = 1, entry["rewards"]["currency_count"] do |
| 984 local name, texture_path, quantity = _G.GetQuestLogRewardCurrencyInfo(i, quest_id) | 1032 local name, texture_path, quantity = _G.GetQuestLogRewardCurrencyInfo(i, quest_id) |
| 985 local currency_texture = texture_path:match("[^\\]+$"):lower() | 1033 local currency_id = CurrencyInfoToID(name, texture_path) |
| 986 table.insert(entry["rewards"]["currencies"], ("%d:%s"):format(quantity, currency_texture)) | 1034 table.insert(entry["rewards"]["currencies"], ("%d:%d"):format(quantity, currency_id)) |
| 987 end | 1035 end |
| 988 end | 1036 end |
| 989 | 1037 |
| 990 -- Record items | 1038 -- Record items |
| 991 entry["rewards"]["item_count"] = tonumber(_G.GetNumQuestLogRewards(quest_id)) or 0 | 1039 entry["rewards"]["item_count"] = tonumber(_G.GetNumQuestLogRewards(quest_id)) or 0 |
| 992 | 1040 |
| 1041 -- Create item rewards sub-table and fill | |
| 993 if entry["rewards"]["item_count"] > 0 then | 1042 if entry["rewards"]["item_count"] > 0 then |
| 994 | |
| 995 -- Create item rewards sub-table and fill | |
| 996 entry["rewards"]["items"] = {} | 1043 entry["rewards"]["items"] = {} |
| 997 for i = 1, entry["rewards"]["item_count"] do | 1044 for i = 1, entry["rewards"]["item_count"] do |
| 998 local item_name, item_texture, quantity, quality, is_usable, item_id = _G.GetQuestLogRewardInfo(i, quest_id) | 1045 local item_name, item_texture, quantity, quality, is_usable, item_id = _G.GetQuestLogRewardInfo(i, quest_id) |
| 999 table.insert(entry["rewards"]["items"], ("%d:%d"):format(item_id, quantity)) | 1046 table.insert(entry["rewards"]["items"], ("%d:%d"):format(item_id, quantity)) |
| 1000 end | 1047 end |
| 1170 "REVERED", | 1217 "REVERED", |
| 1171 "EXALTED", | 1218 "EXALTED", |
| 1172 } | 1219 } |
| 1173 | 1220 |
| 1174 | 1221 |
| 1222 -- We should just use IDs here someday; WoWDB site knows all about different power types | |
| 1175 local POWER_TYPE_NAMES = { | 1223 local POWER_TYPE_NAMES = { |
| 1176 ["0"] = "MANA", | 1224 ["0"] = "MANA", |
| 1177 ["1"] = "RAGE", | 1225 ["1"] = "RAGE", |
| 1178 ["2"] = "FOCUS", | 1226 ["2"] = "FOCUS", |
| 1179 ["3"] = "ENERGY", | 1227 ["3"] = "ENERGY", |
| 1210 level_data = {} | 1258 level_data = {} |
| 1211 encounter_data[npc_level] = level_data | 1259 encounter_data[npc_level] = level_data |
| 1212 end | 1260 end |
| 1213 level_data.max_health = level_data.max_health or _G.UnitHealthMax("target") | 1261 level_data.max_health = level_data.max_health or _G.UnitHealthMax("target") |
| 1214 | 1262 |
| 1263 -- May not capture as much data as it could, since the API changed in Legion to report multiple types of power | |
| 1215 if not level_data.power then | 1264 if not level_data.power then |
| 1216 local max_power = _G.UnitPowerMax("target") | 1265 local max_power = _G.UnitPowerMax("target") |
| 1217 | 1266 |
| 1218 if max_power > 0 then | 1267 if max_power > 0 then |
| 1219 local power_type = _G.UnitPowerType("target") | 1268 local power_type = _G.UnitPowerType("target") |
| 1383 if loot_source and (loot_source == LOOT_SOURCE_ID_GARRISON_CACHE) and last_garrison_cache_object_id then | 1432 if loot_source and (loot_source == LOOT_SOURCE_ID_GARRISON_CACHE) and last_garrison_cache_object_id then |
| 1384 -- Record location data for cache | 1433 -- Record location data for cache |
| 1385 UpdateDBEntryLocation("objects", ("OPENING:%d"):format(last_garrison_cache_object_id)) | 1434 UpdateDBEntryLocation("objects", ("OPENING:%d"):format(last_garrison_cache_object_id)) |
| 1386 | 1435 |
| 1387 -- Add drop data | 1436 -- Add drop data |
| 1388 local currency_texture = CurrencyLinkToTexture(item_link) | 1437 local currency_id = CurrencyLinkToID(item_link) |
| 1389 if currency_texture and currency_texture ~= "" then | 1438 if currency_id and currency_id ~= 0 then |
| 1390 -- Check for top level object data | 1439 -- Check for top level object data |
| 1391 local object_entry = DBEntry("objects", ("OPENING:%d"):format(last_garrison_cache_object_id)) | 1440 local object_entry = DBEntry("objects", ("OPENING:%d"):format(last_garrison_cache_object_id)) |
| 1392 local difficulty_token = InstanceDifficultyToken() | 1441 local difficulty_token = InstanceDifficultyToken() |
| 1393 if object_entry[difficulty_token] then | 1442 if object_entry[difficulty_token] then |
| 1394 -- Increment loot count | 1443 -- Increment loot count |
| 1395 object_entry[difficulty_token]["opening_count"] = (object_entry[difficulty_token]["opening_count"] or 0) + 1 | 1444 object_entry[difficulty_token]["opening_count"] = (object_entry[difficulty_token]["opening_count"] or 0) + 1 |
| 1396 | 1445 |
| 1397 Debug("%s: %s X %d", event_name, currency_texture, quantity) | 1446 Debug("%s: %d X %d", event_name, currency_id, quantity) |
| 1398 object_entry[difficulty_token]["opening"] = object_entry[difficulty_token]["opening"] or {} | 1447 object_entry[difficulty_token]["opening"] = object_entry[difficulty_token]["opening"] or {} |
| 1399 table.insert(object_entry[difficulty_token]["opening"], ("currency:%d:%s"):format(quantity, currency_texture)) | 1448 table.insert(object_entry[difficulty_token]["opening"], ("currency:%d:%d"):format(quantity, currency_id)) |
| 1400 else | 1449 else |
| 1401 Debug("%s: When handling the Garrison cache, the top level loot data was missing for objectID %d.", event_name, last_garrison_cache_object_id) | 1450 Debug("%s: When handling the Garrison cache, the top level loot data was missing for objectID %d.", event_name, last_garrison_cache_object_id) |
| 1402 end | 1451 end |
| 1403 else | 1452 else |
| 1404 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) | 1453 Debug("%s: Currency ID is nil or 0, from currency link %s", event_name, item_link) |
| 1405 end | 1454 end |
| 1406 | 1455 |
| 1407 -- Wipe object ID until future mouseover | 1456 -- Wipe object ID until future mouseover |
| 1408 last_garrison_cache_object_id = nil | 1457 last_garrison_cache_object_id = nil |
| 1409 elseif raid_boss_id then | 1458 elseif raid_boss_id then |
| 1426 end | 1475 end |
| 1427 elseif loot_type == "money" then | 1476 elseif loot_type == "money" then |
| 1428 Debug("%s: money X %d", event_name, quantity) | 1477 Debug("%s: money X %d", event_name, quantity) |
| 1429 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | 1478 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) |
| 1430 elseif loot_type == "currency" then | 1479 elseif loot_type == "currency" then |
| 1431 local currency_texture = CurrencyLinkToTexture(item_link) | 1480 local currency_id = CurrencyLinkToID(item_link) |
| 1432 if currency_texture and currency_texture ~= "" then | 1481 if currency_id and currency_id ~= 0 then |
| 1433 Debug("%s: %s X %d", event_name, currency_texture, quantity) | 1482 Debug("%s: %d X %d", event_name, currency_id, quantity) |
| 1434 table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture)) | 1483 table.insert(encounter_data[loot_label], ("currency:%d:%d"):format(quantity, currency_id)) |
| 1435 else | 1484 else |
| 1436 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) | 1485 Debug("%s: Currency ID is nil or 0, from currency link %s", event_name, item_link) |
| 1437 return | 1486 return |
| 1438 end | 1487 end |
| 1439 end | 1488 end |
| 1440 | 1489 |
| 1441 if not boss_loot_toasting[raid_boss_id] then | 1490 if not boss_loot_toasting[raid_boss_id] then |
| 1466 end | 1515 end |
| 1467 elseif loot_type == "money" then | 1516 elseif loot_type == "money" then |
| 1468 Debug("%s: money X %d", event_name, quantity) | 1517 Debug("%s: money X %d", event_name, quantity) |
| 1469 current_loot.sources[loot_toast_container_id]["money"] = (current_loot.sources[loot_toast_container_id]["money"] or 0) + quantity | 1518 current_loot.sources[loot_toast_container_id]["money"] = (current_loot.sources[loot_toast_container_id]["money"] or 0) + quantity |
| 1470 elseif loot_type == "currency" then | 1519 elseif loot_type == "currency" then |
| 1471 local currency_texture = CurrencyLinkToTexture(item_link) | 1520 local currency_id = CurrencyLinkToID(item_link) |
| 1472 if currency_texture and currency_texture ~= "" then | 1521 if currency_id and currency_id ~= 0 then |
| 1473 Debug("%s: %s X %d", event_name, currency_texture, quantity) | 1522 Debug("%s: %d X %d", event_name, currency_id, quantity) |
| 1474 local currency_token = ("currency:%s"):format(currency_texture) | 1523 local currency_token = ("currency:%d"):format(currency_id) |
| 1475 current_loot.sources[loot_toast_container_id][currency_token] = (current_loot.sources[loot_toast_container_id][currency_token] or 0) + quantity | 1524 current_loot.sources[loot_toast_container_id][currency_token] = (current_loot.sources[loot_toast_container_id][currency_token] or 0) + quantity |
| 1476 else | 1525 else |
| 1477 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) | 1526 Debug("%s: Currency ID is nil or 0, from currency link %s", event_name, item_link) |
| 1478 current_loot = nil | 1527 current_loot = nil |
| 1479 return | 1528 return |
| 1480 end | 1529 end |
| 1481 end | 1530 end |
| 1482 | 1531 |
| 1484 current_loot = nil | 1533 current_loot = nil |
| 1485 container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened | 1534 container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened |
| 1486 elseif loot_source and (loot_source == LOOT_SOURCE_ID_REDUNDANT) and chat_loot_timer_handle then | 1535 elseif loot_source and (loot_source == LOOT_SOURCE_ID_REDUNDANT) and chat_loot_timer_handle then |
| 1487 -- Handle currency loot toasts for chat-based loot (we do this instead of reading currency chat messages because the chat messages are very delayed) | 1536 -- Handle currency loot toasts for chat-based loot (we do this instead of reading currency chat messages because the chat messages are very delayed) |
| 1488 if loot_type == "currency" then | 1537 if loot_type == "currency" then |
| 1489 local currency_texture = CurrencyLinkToTexture(item_link) | 1538 local currency_id = CurrencyLinkToID(item_link) |
| 1490 if currency_texture and currency_texture ~= "" then | 1539 if currency_id and currency_id ~= 0 then |
| 1491 -- Verify that we're still assigning data to the right items | 1540 -- Verify that we're still assigning data to the right items |
| 1492 if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then | 1541 if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then |
| 1493 local currency_token = ("currency:%s"):format(currency_texture) | 1542 Debug("%s: Captured currency for chat-based loot recording. %d X %d", event_name, currency_id, quantity) |
| 1494 Debug("%s: Captured currency for chat-based loot recording. %s X %d", event_name, currency_token, quantity) | 1543 local currency_token = ("currency:%d"):format(currency_id) |
| 1495 chat_loot_data.loot = chat_loot_data.loot or {} | 1544 chat_loot_data.loot = chat_loot_data.loot or {} |
| 1496 chat_loot_data.loot[currency_token] = (chat_loot_data.loot[currency_token] or 0) + quantity | 1545 chat_loot_data.loot[currency_token] = (chat_loot_data.loot[currency_token] or 0) + quantity |
| 1497 else -- If not, cancel the timer and wipe the loot table early | 1546 else -- If not, cancel the timer and wipe the loot table early |
| 1498 Debug("%s: Canceled chat-based loot recording because we would have assigned the wrong loot!", event_name) | 1547 Debug("%s: Canceled chat-based loot recording because we would have assigned the wrong loot!", event_name) |
| 1499 ClearChatLootData() | 1548 ClearChatLootData() |
| 1500 end | 1549 end |
| 1501 else | 1550 else |
| 1502 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) | 1551 Debug("%s: Currency ID is nil or 0, from currency link %s", event_name, item_link) |
| 1503 end | 1552 end |
| 1504 -- Handle money loot toasts for chat-based loot (we do this instead of reading money chat messages because the chat messages are very delayed) | 1553 -- Handle money loot toasts for chat-based loot (we do this instead of reading money chat messages because the chat messages are very delayed) |
| 1505 elseif loot_type == "money" then | 1554 elseif loot_type == "money" then |
| 1506 -- Verify that we're still assigning data to the right items | 1555 -- Verify that we're still assigning data to the right items |
| 1507 if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then | 1556 if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then |
| 1529 end | 1578 end |
| 1530 | 1579 |
| 1531 | 1580 |
| 1532 do | 1581 do |
| 1533 local CHAT_MSG_CURRENCY_UPDATE_FUNCS = { | 1582 local CHAT_MSG_CURRENCY_UPDATE_FUNCS = { |
| 1534 [AF.NPC] = function(currency_texture, quantity) | 1583 [AF.NPC] = function(currency_id, quantity) |
| 1535 Debug("CHAT_MSG_CURRENCY: AF.NPC currency:%s (%d)", currency_texture, quantity) | 1584 Debug("CHAT_MSG_CURRENCY: AF.NPC currency:%d (%d)", currency_id, quantity) |
| 1536 end, | 1585 end, |
| 1537 [AF.ZONE] = function(currency_texture, quantity) | 1586 [AF.ZONE] = function(currency_id, quantity) |
| 1538 local currency_token = ("currency:%s"):format(currency_texture) | 1587 Debug("CHAT_MSG_CURRENCY: AF.ZONE currency:%d (%d)", currency_id, quantity) |
| 1539 Debug("CHAT_MSG_CURRENCY: AF.ZONE %s (%d)", currency_token, quantity) | |
| 1540 InitializeCurrentLoot() | 1588 InitializeCurrentLoot() |
| 1541 current_loot.list[1] = ("%s:%d"):format(currency_token, quantity) | 1589 current_loot.list[1] = ("currency:%d:%d"):format(quantity, currency_id) |
| 1542 GenericLootUpdate("zones") | 1590 GenericLootUpdate("zones") |
| 1543 current_loot = nil | 1591 current_loot = nil |
| 1544 end, | 1592 end, |
| 1545 } | 1593 } |
| 1546 | 1594 |
| 1550 | 1598 |
| 1551 local currency_link, quantity = deformat(message, _G.CURRENCY_GAINED_MULTIPLE) | 1599 local currency_link, quantity = deformat(message, _G.CURRENCY_GAINED_MULTIPLE) |
| 1552 if not currency_link then | 1600 if not currency_link then |
| 1553 quantity, currency_link = 1, deformat(message, _G.CURRENCY_GAINED) | 1601 quantity, currency_link = 1, deformat(message, _G.CURRENCY_GAINED) |
| 1554 end | 1602 end |
| 1555 local currency_texture = CurrencyLinkToTexture(currency_link) | 1603 local currency_id = CurrencyLinkToID(currency_link) |
| 1556 | 1604 |
| 1557 if not currency_texture or currency_texture == "" then | 1605 if not currency_id or currency_id == 0 then |
| 1558 return | 1606 return |
| 1559 end | 1607 end |
| 1560 | 1608 |
| 1561 -- Set update category | 1609 -- Set update category |
| 1562 if current_action.spell_label == "FISHING" then | 1610 if current_action.spell_label == "FISHING" then |
| 1568 -- Take action based on update category | 1616 -- Take action based on update category |
| 1569 local update_func = CHAT_MSG_CURRENCY_UPDATE_FUNCS[category] | 1617 local update_func = CHAT_MSG_CURRENCY_UPDATE_FUNCS[category] |
| 1570 if not category or not update_func then | 1618 if not category or not update_func then |
| 1571 return | 1619 return |
| 1572 end | 1620 end |
| 1573 update_func(currency_texture, quantity) | 1621 update_func(currency_id, quantity) |
| 1574 end | 1622 end |
| 1575 | 1623 |
| 1576 | 1624 |
| 1577 local BLACKLISTED_ITEMS = { | 1625 local BLACKLISTED_ITEMS = { |
| 1578 [114116] = true, | 1626 [114116] = true, |
| 1783 [213738] = true, -- Taste of Blood (applied by Fate and Fortune, Combat Rogue artifacts) | 1831 [213738] = true, -- Taste of Blood (applied by Fate and Fortune, Combat Rogue artifacts) |
| 1784 [213877] = true, -- Vampiric Aura (used by Nathrezim Invasion bosses and transformed players) | 1832 [213877] = true, -- Vampiric Aura (used by Nathrezim Invasion bosses and transformed players) |
| 1785 [215377] = true, -- The Maw Must Feed (applied by Maw of the Damned, Blood Death Knight artifact) | 1833 [215377] = true, -- The Maw Must Feed (applied by Maw of the Damned, Blood Death Knight artifact) |
| 1786 [224762] = true, -- Leyline Rift (summoned by players with Leyline Mastery in Suramar) | 1834 [224762] = true, -- Leyline Rift (summoned by players with Leyline Mastery in Suramar) |
| 1787 [225832] = true, -- Nightglow Wisp (cast by players using Wisp in a Bottle toy) | 1835 [225832] = true, -- Nightglow Wisp (cast by players using Wisp in a Bottle toy) |
| 1788 | |
| 1789 } | 1836 } |
| 1790 | 1837 |
| 1791 local function RecordNPCSpell(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name) | 1838 local function RecordNPCSpell(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name) |
| 1792 if not spell_id or BLACKLISTED_SPELLS[spell_id] then | 1839 if not spell_id or BLACKLISTED_SPELLS[spell_id] then |
| 1793 return | 1840 return |
| 2066 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 | 2113 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 |
| 2067 source_list[source_guid] = true | 2114 source_list[source_guid] = true |
| 2068 end | 2115 end |
| 2069 | 2116 |
| 2070 for loot_token, quantity in pairs(loot_data) do | 2117 for loot_token, quantity in pairs(loot_data) do |
| 2071 local loot_type, currency_texture = (":"):split(loot_token) | 2118 local loot_type, currency_id = (":"):split(loot_token) |
| 2072 | 2119 |
| 2073 if loot_type == "currency" and currency_texture then | 2120 if loot_type == "currency" and currency_id then |
| 2074 table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture)) | 2121 -- Convert currency_id back into number from string |
| 2122 currency_id = tonumber(currency_id) or 0 | |
| 2123 if currency_id ~= 0 then | |
| 2124 table.insert(encounter_data[loot_label], ("currency:%d:%d"):format(quantity, currency_id)) | |
| 2125 end | |
| 2075 elseif loot_token == "money" then | 2126 elseif loot_token == "money" then |
| 2076 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | 2127 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) |
| 2077 else | 2128 else |
| 2078 table.insert(encounter_data[loot_label], ("%d:%d"):format(loot_token, quantity)) | 2129 table.insert(encounter_data[loot_label], ("%d:%d"):format(loot_token, quantity)) |
| 2079 end | 2130 end |
| 2278 | 2329 |
| 2279 InitializeCurrentLoot() | 2330 InitializeCurrentLoot() |
| 2280 loot_guid_registry[current_loot.label] = loot_guid_registry[current_loot.label] or {} | 2331 loot_guid_registry[current_loot.label] = loot_guid_registry[current_loot.label] or {} |
| 2281 | 2332 |
| 2282 for loot_slot = 1, _G.GetNumLootItems() do | 2333 for loot_slot = 1, _G.GetNumLootItems() do |
| 2283 local texturefiledataID, item_text, slot_quantity, quality, locked = _G.GetLootSlotInfo(loot_slot) | 2334 local texture_filedata_id, item_text, slot_quantity, quality, locked = _G.GetLootSlotInfo(loot_slot) |
| 2284 local slot_type = _G.GetLootSlotType(loot_slot) | 2335 local slot_type = _G.GetLootSlotType(loot_slot) |
| 2285 local loot_info = { _G.GetLootSourceInfo(loot_slot) } | 2336 local loot_info = { _G.GetLootSourceInfo(loot_slot) } |
| 2286 local loot_link = _G.GetLootSlotLink(loot_slot) | 2337 local loot_link = _G.GetLootSlotLink(loot_slot) |
| 2287 | 2338 |
| 2288 -- Odd index is GUID, even is count. | 2339 -- Odd index is GUID, even is count. |
| 2320 guids_used[source_guid] = true | 2371 guids_used[source_guid] = true |
| 2321 end | 2372 end |
| 2322 elseif slot_type == LOOT_SLOT_CURRENCY then | 2373 elseif slot_type == LOOT_SLOT_CURRENCY then |
| 2323 -- Same bug with GetLootSlotInfo() will screw up currency when it happens, so we won't process this slot's loot. | 2374 -- Same bug with GetLootSlotInfo() will screw up currency when it happens, so we won't process this slot's loot. |
| 2324 if loot_link then | 2375 if loot_link then |
| 2325 local icon_texture = CurrencyLinkToTexture(loot_link) | 2376 local currency_id = CurrencyLinkToID(loot_link) |
| 2326 Debug("GUID: %s - Type:ID: %s - Currency: %s - Amount: %d (%d)", loot_info[loot_index], source_key, icon_texture, loot_info[loot_index + 1], slot_quantity) | 2377 Debug("GUID: %s - Type:ID: %s - Currency: %d - Amount: %d (%d)", loot_info[loot_index], source_key, currency_id, loot_info[loot_index + 1], slot_quantity) |
| 2327 if current_loot.target_type == AF.ZONE then | 2378 if current_loot.target_type == AF.ZONE then |
| 2328 table.insert(current_loot.list, ("currency:%d:%s"):format(loot_quantity, icon_texture)) | 2379 table.insert(current_loot.list, ("currency:%d:%d"):format(loot_quantity, currency_id)) |
| 2329 else | 2380 else |
| 2330 local currency_token = ("currency:%s"):format(icon_texture) | 2381 local currency_token = ("currency:%d"):format(currency_id) |
| 2331 | 2382 |
| 2332 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} | 2383 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} |
| 2333 current_loot.sources[source_guid][currency_token] = (current_loot.sources[source_guid][currency_token] or 0) + loot_quantity | 2384 current_loot.sources[source_guid][currency_token] = (current_loot.sources[source_guid][currency_token] or 0) + loot_quantity |
| 2334 guids_used[source_guid] = true | 2385 guids_used[source_guid] = true |
| 2335 end | 2386 end |
| 2483 -- price_string = ("%s:%s:%s:%s"):format(price_string, battleground_rating, personal_rating, required_season_amount or 0) | 2534 -- price_string = ("%s:%s:%s:%s"):format(price_string, battleground_rating, personal_rating, required_season_amount or 0) |
| 2484 price_string = ("%s:%s:%s"):format(price_string, personal_rating, required_season_amount or 0) | 2535 price_string = ("%s:%s:%s"):format(price_string, personal_rating, required_season_amount or 0) |
| 2485 | 2536 |
| 2486 for cost_index = 1, item_count do | 2537 for cost_index = 1, item_count do |
| 2487 -- The third return (Blizz calls "currency_link") of GetMerchantItemCostItem only returns item links as of Patch 5.3.0. | 2538 -- The third return (Blizz calls "currency_link") of GetMerchantItemCostItem only returns item links as of Patch 5.3.0. |
| 2488 local icon_texture, amount_required, item_link = _G.GetMerchantItemCostItem(item_index, cost_index) | 2539 local texture_path, amount_required, item_link, name = _G.GetMerchantItemCostItem(item_index, cost_index) |
| 2489 local currency_identifier = item_link and ItemLinkToID(item_link) or nil | 2540 |
| 2490 | 2541 -- Try to detect if this is actually a currency by looking for a nil item_link or item ID |
| 2491 if (not currency_identifier or currency_identifier < 1) and icon_texture then | 2542 local is_item = item_link and ItemLinkToID(item_link) |
| 2492 currency_identifier = icon_texture:match("[^\\]+$"):lower() | 2543 |
| 2493 end | 2544 if not is_item then |
| 2494 | 2545 local currency_id = CurrencyInfoToID(name, texture_path) |
| 2495 if currency_identifier then | 2546 currency_list[#currency_list + 1] = ("(%s:%d)"):format(amount_required, currency_id) |
| 2496 currency_list[#currency_list + 1] = ("(%s:%s)"):format(amount_required, currency_identifier) | |
| 2497 end | 2547 end |
| 2498 end | 2548 end |
| 2499 | 2549 |
| 2500 for currency_index = 1, #currency_list do | 2550 for currency_index = 1, #currency_list do |
| 2501 price_string = ("%s:%s"):format(price_string, currency_list[currency_index]) | 2551 price_string = ("%s:%s"):format(price_string, currency_list[currency_index]) |
| 2871 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) | 2921 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) |
| 2872 elseif loot_type == "money" then | 2922 elseif loot_type == "money" then |
| 2873 Debug("%s: Assigned stored money loot data - money:%d", event_name, quantity) | 2923 Debug("%s: Assigned stored money loot data - money:%d", event_name, quantity) |
| 2874 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | 2924 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) |
| 2875 elseif loot_type == "currency" then | 2925 elseif loot_type == "currency" then |
| 2876 local currency_texture = CurrencyLinkToTexture(hyperlink) | 2926 local currency_id = CurrencyLinkToID(hyperlink) |
| 2877 Debug("%s: Assigned stored currency loot data - %s - currency:%d:%s", event_name, hyperlink, currency_texture, quantity) | 2927 Debug("%s: Assigned stored currency loot data - %s - currency:%d (%d)", event_name, hyperlink, currency_id, quantity) |
| 2878 table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture)) | 2928 table.insert(encounter_data[loot_label], ("currency:%d:%d"):format(quantity, currency_id)) |
| 2879 end | 2929 end |
| 2880 end | 2930 end |
| 2881 | 2931 |
| 2882 if not boss_loot_toasting[raid_boss_id] then | 2932 if not boss_loot_toasting[raid_boss_id] then |
| 2883 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 | 2933 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 |
