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) |