Mercurial > wow > wowdb-profiler
comparison Main.lua @ 414:d97e37b1e239
Redesigned CHAT_LOOT_x timer system to no longer use current_loot (except for fishing).
| author | MMOSimca <MMOSimca@gmail.com> | 
|---|---|
| date | Sun, 04 Jan 2015 13:16:29 -0500 | 
| parents | e2f7f33cf5f7 | 
| children | 837a3a525a76 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 413:d45238345b6e | 414:d97e37b1e239 | 
|---|---|
| 170 local killed_boss_id_timer_handle | 170 local killed_boss_id_timer_handle | 
| 171 local killed_npc_id | 171 local killed_npc_id | 
| 172 local target_location_timer_handle | 172 local target_location_timer_handle | 
| 173 local last_timber_spell_id | 173 local last_timber_spell_id | 
| 174 local last_garrison_cache_object_id | 174 local last_garrison_cache_object_id | 
| 175 local chat_loot_data | |
| 175 local chat_loot_timer_handle | 176 local chat_loot_timer_handle | 
| 176 local current_target_id | 177 local current_target_id | 
| 177 local current_area_id | 178 local current_area_id | 
| 178 local current_loot | 179 local current_loot | 
| 179 | 180 | 
| 591 if private.CONTAINER_ITEM_ID_LIST[item_id] ~= nil then | 592 if private.CONTAINER_ITEM_ID_LIST[item_id] ~= nil then | 
| 592 any_loot = true | 593 any_loot = true | 
| 593 end | 594 end | 
| 594 | 595 | 
| 595 if any_loot then | 596 if any_loot then | 
| 596 table.wipe(current_action) | 597 -- For item containers that open instantly with no spell cast | 
| 597 current_loot = nil | |
| 598 current_action.target_type = AF.ITEM | |
| 599 current_action.identifier = item_id | |
| 600 current_action.loot_label = "contains" | |
| 601 | |
| 602 -- For items that open instantly with no spell cast | |
| 603 if (private.CONTAINER_ITEM_ID_LIST[item_id] == true) and ((not _G.GetNumLootItems()) or (_G.GetNumLootItems() == 0)) then | 598 if (private.CONTAINER_ITEM_ID_LIST[item_id] == true) and ((not _G.GetNumLootItems()) or (_G.GetNumLootItems() == 0)) then | 
| 604 ClearChatLootData() | 599 ClearChatLootData() | 
| 605 Debug("HandleItemUse: Beginning chat-based loot timer for item with ID %d.", item_id) | 600 Debug("HandleItemUse: Beginning chat-based loot timer for item with ID %d.", item_id) | 
| 606 chat_loot_timer_handle = C_Timer.NewTimer(1, ClearChatLootData) | 601 chat_loot_timer_handle = C_Timer.NewTimer(1, ClearChatLootData) | 
| 607 InitializeCurrentLoot() | 602 chat_loot_data = chat_loot_data or {} | 
| 603 chat_loot_data.identifier = item_id | |
| 604 chat_loot_data.sources = {} | |
| 605 -- For normal item containers | |
| 606 else | |
| 607 table.wipe(current_action) | |
| 608 current_loot = nil | |
| 609 current_action.target_type = AF.ITEM | |
| 610 current_action.identifier = item_id | |
| 611 current_action.loot_label = "contains" | |
| 608 end | 612 end | 
| 609 end | 613 end | 
| 610 end | 614 end | 
| 611 | 615 | 
| 612 | 616 | 
| 887 end | 891 end | 
| 888 Debug("ClearChatLootData: Ending chat-based loot timer.") | 892 Debug("ClearChatLootData: Ending chat-based loot timer.") | 
| 889 chat_loot_timer_handle:Cancel() | 893 chat_loot_timer_handle:Cancel() | 
| 890 chat_loot_timer_handle = nil | 894 chat_loot_timer_handle = nil | 
| 891 | 895 | 
| 892 if current_loot and current_loot.identifier and (private.CONTAINER_ITEM_ID_LIST[current_loot.identifier] ~= nil) then | 896 if chat_loot_data and chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) and chat_loot_data.sources and (#chat_loot_data.sources > 0) then | 
| 893 GenericLootUpdate("items") | 897 -- A slimmed down (and more importantly, separate) version of GenericLootUpdate, specifically for AF.ITEM and chat_loot_data | 
| 894 end | 898 local entry = DBEntry("items", chat_loot_data.identifier) | 
| 895 current_loot = nil | 899 | 
| 900 if entry then | |
| 901 local loot_table = LootTable(entry, "contains") | |
| 902 entry["contains_count"] = (entry["contains_count"] or 0) + 1 | |
| 903 | |
| 904 for loot_token, quantity in pairs(chat_loot_data.sources[chat_loot_data.identifier]) do | |
| 905 local label, currency_texture = (":"):split(loot_token) | |
| 906 | |
| 907 if label == "currency" and currency_texture then | |
| 908 table.insert(loot_table, ("currency:%d:%s"):format(quantity, currency_texture)) | |
| 909 elseif loot_token == "money" then | |
| 910 table.insert(loot_table, ("money:%d"):format(quantity)) | |
| 911 else | |
| 912 table.insert(loot_table, ("%d:%d"):format(loot_token, quantity)) | |
| 913 end | |
| 914 end | |
| 915 end | |
| 916 end | |
| 917 if chat_loot_data then | |
| 918 table.wipe(chat_loot_data) | |
| 919 end | |
| 896 end | 920 end | 
| 897 | 921 | 
| 898 | 922 | 
| 899 -- METHODS ------------------------------------------------------------ | 923 -- METHODS ------------------------------------------------------------ | 
| 900 | 924 | 
| 1466 | 1490 | 
| 1467 | 1491 | 
| 1468 do | 1492 do | 
| 1469 local CHAT_MSG_CURRENCY_UPDATE_FUNCS = { | 1493 local CHAT_MSG_CURRENCY_UPDATE_FUNCS = { | 
| 1470 [AF.ITEM] = function(currency_texture, quantity) | 1494 [AF.ITEM] = function(currency_texture, quantity) | 
| 1471 local currency_token = ("currency:%s"):format(currency_texture) | 1495 local container_id = chat_loot_data.identifier -- For faster access, since this is going to be called 9 times in the next 3 lines | 
| 1472 local container_id = current_loot.identifier -- For faster access, since this is going to be called 9 times in the next 3 lines | |
| 1473 -- Verify that we're still assigning data to the right items | 1496 -- Verify that we're still assigning data to the right items | 
| 1474 if container_id and (private.CONTAINER_ITEM_ID_LIST[container_id] ~= nil) then | 1497 if container_id and (private.CONTAINER_ITEM_ID_LIST[container_id] ~= nil) then | 
| 1475 Debug("CHAT_MSG_CURRENCY: AF.ITEM %s (%d)", currency_token, quantity) | 1498 Debug("CHAT_MSG_CURRENCY: AF.ITEM %s (%d)", currency_token, quantity) | 
| 1476 current_loot.sources[container_id] = current_loot.sources[container_id] or {} | 1499 local currency_token = ("currency:%s"):format(currency_texture:match("[^\\]+$"):lower()) | 
| 1477 current_loot.sources[container_id][currency_token] = (current_loot.sources[container_id][currency_token] or 0) + quantity | 1500 chat_loot_data.sources[container_id] = chat_loot_data.sources[container_id] or {} | 
| 1501 chat_loot_data.sources[container_id][currency_token] = (chat_loot_data.sources[container_id][currency_token] or 0) + quantity | |
| 1478 else -- If not, cancel the timer and wipe the loot table early | 1502 else -- If not, cancel the timer and wipe the loot table early | 
| 1479 Debug("CHAT_MSG_CURRENCY: We would have assigned the wrong loot!") | 1503 Debug("CHAT_MSG_CURRENCY: We would have assigned the wrong loot!") | 
| 1480 ClearChatLootData() | 1504 ClearChatLootData() | 
| 1481 end | 1505 end | 
| 1482 end, | 1506 end, | 
| 2856 if private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then | 2880 if private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then | 
| 2857 -- Set up timer | 2881 -- Set up timer | 
| 2858 ClearChatLootData() | 2882 ClearChatLootData() | 
| 2859 Debug("%s: Beginning chat-based loot timer for spellID %d", event_name, spell_id) | 2883 Debug("%s: Beginning chat-based loot timer for spellID %d", event_name, spell_id) | 
| 2860 chat_loot_timer_handle = C_Timer.NewTimer(1.5, ClearChatLootData) | 2884 chat_loot_timer_handle = C_Timer.NewTimer(1.5, ClearChatLootData) | 
| 2861 | 2885 chat_loot_data = chat_loot_data or {} | 
| 2862 -- Standard item handling setup | 2886 chat_loot_data.identifier = private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] | 
| 2863 table.wipe(current_action) | 2887 chat_loot_data.sources = {} | 
| 2864 current_loot = nil | |
| 2865 current_action.target_type = AF.ITEM | |
| 2866 current_action.identifier = private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] | |
| 2867 current_action.loot_label = "contains" | |
| 2868 InitializeCurrentLoot() | |
| 2869 return | 2888 return | 
| 2870 end | 2889 end | 
| 2871 | 2890 | 
| 2872 if anvil_spell_ids[spell_id] then | 2891 if anvil_spell_ids[spell_id] then | 
| 2873 UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL) | 2892 UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL) | 
