comparison Main.lua @ 322:fdf96c61d1b7

Attempt to extrapolate valid current_action data in cases where it is invalid/incomplete when LOOT_OPENED fires.
author James D. Callahan III <jcallahan@curse.com>
date Mon, 14 Oct 2013 17:02:28 -0500
parents 10d45fef6ae1
children 901b9cd2a6c2
comparison
equal deleted inserted replaced
321:10d45fef6ae1 322:fdf96c61d1b7
34 local AF = private.ACTION_TYPE_FLAGS 34 local AF = private.ACTION_TYPE_FLAGS
35 local CLIENT_LOCALE = _G.GetLocale() 35 local CLIENT_LOCALE = _G.GetLocale()
36 local DB_VERSION = 18 36 local DB_VERSION = 18
37 local DEBUGGING = false 37 local DEBUGGING = false
38 local EVENT_DEBUG = false 38 local EVENT_DEBUG = false
39
39 local OBJECT_ID_ANVIL = 192628 40 local OBJECT_ID_ANVIL = 192628
41 local OBJECT_ID_FISHING_BOBBER = 35591
40 local OBJECT_ID_FORGE = 1685 42 local OBJECT_ID_FORGE = 1685
43
41 local PLAYER_CLASS = _G.select(2, _G.UnitClass("player")) 44 local PLAYER_CLASS = _G.select(2, _G.UnitClass("player"))
42 local PLAYER_FACTION = _G.UnitFactionGroup("player") 45 local PLAYER_FACTION = _G.UnitFactionGroup("player")
43 local PLAYER_GUID 46 local PLAYER_GUID
44 local PLAYER_NAME = _G.UnitName("player") 47 local PLAYER_NAME = _G.UnitName("player")
45 local PLAYER_RACE = _G.select(2, _G.UnitRace("player")) 48 local PLAYER_RACE = _G.select(2, _G.UnitRace("player"))
1686 return false 1689 return false
1687 end 1690 end
1688 current_action.identifier = locked_item_id 1691 current_action.identifier = locked_item_id
1689 return true 1692 return true
1690 end, 1693 end,
1691 [AF.NPC] = function() 1694 [AF.NPC] = true,
1692 if not _G.UnitExists("target") or _G.UnitIsFriend("player", "target") or _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then
1693 return false
1694 end
1695
1696 if not current_action.identifier then
1697 local unit_type, id_num = ParseGUID(_G.UnitGUID("target"))
1698 current_action.identifier = id_num
1699 end
1700 return true
1701 end,
1702 [AF.OBJECT] = true, 1695 [AF.OBJECT] = true,
1703 [AF.ZONE] = function() 1696 [AF.ZONE] = function()
1704 current_action.zone_data = UpdateDBEntryLocation("zones", current_action.identifier) 1697 current_action.zone_data = UpdateDBEntryLocation("zones", current_action.identifier)
1705 return _G.IsFishingLoot() 1698 return _G.IsFishingLoot()
1706 end, 1699 end,
1785 current_loot = nil 1778 current_loot = nil
1786 table.wipe(current_action) 1779 table.wipe(current_action)
1787 end 1780 end
1788 1781
1789 1782
1783 local function ExtrapolatedCurrentActionFromLootData(event_name)
1784 local extrapolated_guid_registry = {}
1785 local num_guids = 0
1786
1787 table.wipe(current_action)
1788
1789 for loot_slot = 1, _G.GetNumLootItems() do
1790 local loot_info = {
1791 _G.GetLootSourceInfo(loot_slot)
1792 }
1793
1794 for loot_index = 1, #loot_info, 2 do
1795 local source_guid = loot_info[loot_index]
1796
1797 if not extrapolated_guid_registry[source_guid] then
1798 local unit_type, unit_idnum = ParseGUID(source_guid)
1799
1800 if unit_type and unit_idnum then
1801 extrapolated_guid_registry[source_guid] = {
1802 unit_type,
1803 unit_idnum
1804 }
1805
1806 num_guids = num_guids + 1
1807 end
1808 end
1809 end
1810 end
1811 local log_source = event_name .. "- ExtrapolatedCurrentActionFromLootData"
1812
1813 if num_guids == 0 then
1814 Debug("%s: No GUIDs found in loot. Blank loot window?", log_source)
1815 return false
1816 end
1817 local num_npcs = 0
1818 local num_objects = 0
1819
1820 for source_guid, guid_data in pairs(extrapolated_guid_registry) do
1821 local unit_type = guid_data[1]
1822 local loot_label = (unit_type == private.UNIT_TYPES.OBJECT) and "opening" or (UnitTypeIsNPC(unit_type) and "drops" or nil)
1823
1824 if loot_label then
1825 local unit_idnum = guid_data[2]
1826
1827 if loot_guid_registry[loot_label] and loot_guid_registry[loot_label][source_guid] then
1828 Debug("%s: Previously scanned loot for unit with GUID %s and identifier %s.", log_source, source_guid, unit_idnum)
1829 elseif unit_type == private.UNIT_TYPES.OBJECT and unit_idnum ~= OBJECT_ID_FISHING_BOBBER then
1830 current_action.loot_label = loot_label
1831 current_action.spell_label = "OPENING"
1832 current_action.target_type = AF.OBJECT
1833 current_action.identifier = unit_idnum
1834 num_objects = num_objects + 1
1835 elseif UnitTypeIsNPC(unit_type) then
1836 current_action.loot_label = loot_label
1837 current_action.target_type = AF.NPC
1838 current_action.identifier = unit_idnum
1839 num_npcs = num_npcs + 1
1840 end
1841 else
1842 -- Bail here; not only do we not know what this unit is, but we don't want to attribute loot to something that doesn't actually drop it.
1843 Debug("%s: Unit with GUID %s has unsupported type for looting.", log_source, source_guid)
1844 return false
1845 end
1846 end
1847
1848 if not current_action.target_type then
1849 Debug("%s: Failure to obtain target_type.", log_source)
1850 return false
1851 end
1852
1853 -- We can't figure out what dropped the loot. This shouldn't ever happen, but hey - Blizzard does some awesome stuff on occasion.
1854 if num_npcs ~= 0 and num_objects ~= 0 then
1855 Debug("%s: Mixed target types are not supported.", log_source)
1856 return false
1857 end
1858
1859 Debug("%s: Successfully extrapolated information for current_action.", log_source)
1860 return true
1861 end
1862
1863
1790 function WDP:LOOT_OPENED(event_name) 1864 function WDP:LOOT_OPENED(event_name)
1791 if current_loot then 1865 if current_loot then
1792 Debug("%s: Previous loot did not process.", event_name) 1866 current_loot = nil
1793 return 1867 Debug("%s: Previous loot did not process in time for this event. Attempting to extrapolate current_action from loot data.", event_name)
1868
1869 if not ExtrapolatedCurrentActionFromLootData(event_name) then
1870 Debug("%s: Unable to extrapolate current_action. Aborting attempts to handle loot for now.", event_name)
1871 return
1872 end
1794 end 1873 end
1795 1874
1796 if not current_action.target_type then 1875 if not current_action.target_type then
1797 Debug("%s: No target type found.", event_name) 1876 Debug("%s: No target type found. Attempting to extrapolate current_action from loot data.", event_name)
1798 return 1877
1878 if not ExtrapolatedCurrentActionFromLootData(event_name) then
1879 Debug("%s: Unable to extrapolate current_action. Aborting attempts to handle loot for now.", event_name)
1880 return
1881 end
1799 end 1882 end
1800 local verify_func = LOOT_OPENED_VERIFY_FUNCS[current_action.target_type] 1883 local verify_func = LOOT_OPENED_VERIFY_FUNCS[current_action.target_type]
1801 local update_func = LOOT_OPENED_UPDATE_FUNCS[current_action.target_type] 1884 local update_func = LOOT_OPENED_UPDATE_FUNCS[current_action.target_type]
1802 1885
1803 if not verify_func or not update_func then 1886 if not verify_func or not update_func then
1887 Debug("%s: The current action's target type is unsupported or nil.", event_name)
1804 return 1888 return
1805 end 1889 end
1806 1890
1807 if _G.type(verify_func) == "function" and not verify_func() then 1891 if _G.type(verify_func) == "function" and not verify_func() then
1892 Debug("%s: The current action type, %s, is supported but has failed loot verification.", event_name, current_action.target_type)
1808 return 1893 return
1809 end 1894 end
1810 local guids_used = {} 1895 local guids_used = {}
1811 1896
1812 InitializeCurrentLoot() 1897 InitializeCurrentLoot()