| jcallahan@0 | 1 ----------------------------------------------------------------------- | 
| jcallahan@0 | 2 -- Upvalued Lua API. | 
| jcallahan@0 | 3 ----------------------------------------------------------------------- | 
| jcallahan@0 | 4 local _G = getfenv(0) | 
| jcallahan@0 | 5 | 
| jcallahan@0 | 6 local pairs = _G.pairs | 
| jcallahan@1 | 7 local tonumber = _G.tonumber | 
| jcallahan@1 | 8 | 
| jcallahan@1 | 9 local bit = _G.bit | 
| jcallahan@1 | 10 local math = _G.math | 
| jcallahan@1 | 11 local table = _G.table | 
| jcallahan@1 | 12 | 
| jcallahan@78 | 13 local select = _G.select | 
| jcallahan@78 | 14 | 
| jcallahan@0 | 15 | 
| jcallahan@0 | 16 ----------------------------------------------------------------------- | 
| jcallahan@0 | 17 -- AddOn namespace. | 
| jcallahan@0 | 18 ----------------------------------------------------------------------- | 
| jcallahan@0 | 19 local ADDON_NAME, private = ... | 
| jcallahan@0 | 20 | 
| jcallahan@0 | 21 local LibStub = _G.LibStub | 
| jcallahan@0 | 22 local WDP = LibStub("AceAddon-3.0"):NewAddon(ADDON_NAME, "AceEvent-3.0", "AceTimer-3.0") | 
| jcallahan@0 | 23 | 
| jcallahan@48 | 24 local deformat = LibStub("LibDeformat-3.0") | 
| jcallahan@115 | 25 local LPJ = LibStub("LibPetJournal-2.0") | 
| jcallahan@48 | 26 | 
| jcallahan@4 | 27 local DatamineTT = _G.CreateFrame("GameTooltip", "WDPDatamineTT", _G.UIParent, "GameTooltipTemplate") | 
| jcallahan@5 | 28 DatamineTT:SetOwner(_G.WorldFrame, "ANCHOR_NONE") | 
| jcallahan@5 | 29 | 
| jcallahan@0 | 30 | 
| jcallahan@0 | 31 ----------------------------------------------------------------------- | 
| jcallahan@0 | 32 -- Local constants. | 
| jcallahan@0 | 33 ----------------------------------------------------------------------- | 
| jcallahan@133 | 34 local DB_VERSION = 8 | 
| jcallahan@63 | 35 | 
| jcallahan@92 | 36 | 
| jcallahan@0 | 37 local DATABASE_DEFAULTS = { | 
| jcallahan@128 | 38     char = {}, | 
| jcallahan@0 | 39     global = { | 
| jcallahan@0 | 40         items = {}, | 
| jcallahan@0 | 41         npcs = {}, | 
| jcallahan@0 | 42         objects = {}, | 
| jcallahan@0 | 43         quests = {}, | 
| jcallahan@17 | 44         zones = {}, | 
| jcallahan@0 | 45     } | 
| jcallahan@0 | 46 } | 
| jcallahan@0 | 47 | 
| jcallahan@0 | 48 | 
| jcallahan@1 | 49 local EVENT_MAPPING = { | 
| jcallahan@90 | 50     AUCTION_HOUSE_SHOW = true, | 
| jcallahan@90 | 51     BANKFRAME_OPENED = true, | 
| jcallahan@90 | 52     BATTLEFIELDS_SHOW = true, | 
| jcallahan@56 | 53     BLACK_MARKET_ITEM_UPDATE = true, | 
| jcallahan@48 | 54     CHAT_MSG_LOOT = true, | 
| jcallahan@95 | 55     CHAT_MSG_MONSTER_SAY = "RecordQuote", | 
| jcallahan@95 | 56     CHAT_MSG_MONSTER_WHISPER = "RecordQuote", | 
| jcallahan@95 | 57     CHAT_MSG_MONSTER_YELL = "RecordQuote", | 
| jcallahan@40 | 58     CHAT_MSG_SYSTEM = true, | 
| jcallahan@23 | 59     COMBAT_LOG_EVENT_UNFILTERED = true, | 
| jcallahan@18 | 60     COMBAT_TEXT_UPDATE = true, | 
| jcallahan@90 | 61     FORGE_MASTER_OPENED = true, | 
| jcallahan@90 | 62     GOSSIP_SHOW = true, | 
| jcallahan@93 | 63     GUILDBANKFRAME_OPENED = true, | 
| jcallahan@42 | 64     ITEM_TEXT_BEGIN = true, | 
| jcallahan@124 | 65     LOOT_CLOSED = true, | 
| jcallahan@1 | 66     LOOT_OPENED = true, | 
| jcallahan@89 | 67     MAIL_SHOW = true, | 
| jcallahan@133 | 68     MERCHANT_CLOSED = true, | 
| jcallahan@7 | 69     MERCHANT_SHOW = "UpdateMerchantItems", | 
| jcallahan@61 | 70     MERCHANT_UPDATE = "UpdateMerchantItems", | 
| jcallahan@25 | 71     PET_BAR_UPDATE = true, | 
| jcallahan@115 | 72     PET_JOURNAL_LIST_UPDATE = true, | 
| jcallahan@2 | 73     PLAYER_TARGET_CHANGED = true, | 
| jcallahan@9 | 74     QUEST_COMPLETE = true, | 
| jcallahan@9 | 75     QUEST_DETAIL = true, | 
| jcallahan@9 | 76     QUEST_LOG_UPDATE = true, | 
| jcallahan@97 | 77     QUEST_PROGRESS = true, | 
| jcallahan@88 | 78     TAXIMAP_OPENED = true, | 
| jcallahan@92 | 79     TRADE_SKILL_SHOW = true, | 
| jcallahan@27 | 80     TRAINER_SHOW = true, | 
| jcallahan@90 | 81     TRANSMOGRIFY_OPEN = true, | 
| jcallahan@4 | 82     UNIT_QUEST_LOG_CHANGED = true, | 
| jcallahan@1 | 83     UNIT_SPELLCAST_FAILED = "HandleSpellFailure", | 
| jcallahan@1 | 84     UNIT_SPELLCAST_FAILED_QUIET = "HandleSpellFailure", | 
| jcallahan@1 | 85     UNIT_SPELLCAST_INTERRUPTED = "HandleSpellFailure", | 
| jcallahan@1 | 86     UNIT_SPELLCAST_SENT = true, | 
| jcallahan@1 | 87     UNIT_SPELLCAST_SUCCEEDED = true, | 
| jcallahan@90 | 88     VOID_STORAGE_OPEN = true, | 
| jcallahan@129 | 89     ZONE_CHANGED = "SetCurrentAreaID", | 
| jcallahan@129 | 90     ZONE_CHANGED_INDOORS = "SetCurrentAreaID", | 
| jcallahan@129 | 91     ZONE_CHANGED_NEW_AREA = "SetCurrentAreaID", | 
| jcallahan@0 | 92 } | 
| jcallahan@0 | 93 | 
| jcallahan@4 | 94 | 
| jcallahan@92 | 95 local OBJECT_ID_ANVIL = 192628 | 
| jcallahan@92 | 96 local OBJECT_ID_FORGE = 1685 | 
| jcallahan@92 | 97 | 
| jcallahan@92 | 98 | 
| jcallahan@1 | 99 local AF = private.ACTION_TYPE_FLAGS | 
| jcallahan@0 | 100 | 
| jcallahan@4 | 101 | 
| jcallahan@27 | 102 local PLAYER_CLASS = _G.select(2, _G.UnitClass("player")) | 
| jcallahan@100 | 103 local PLAYER_FACTION = _G.UnitFactionGroup("player") | 
| jcallahan@34 | 104 local PLAYER_GUID = _G.UnitGUID("player") | 
| jcallahan@95 | 105 local PLAYER_NAME = _G.UnitName("player") | 
| jcallahan@39 | 106 local PLAYER_RACE = _G.select(2, _G.UnitRace("player")) | 
| jcallahan@27 | 107 | 
| jcallahan@95 | 108 | 
| jcallahan@112 | 109 local CLIENT_LOCALE = _G.GetLocale() | 
| jcallahan@112 | 110 | 
| jcallahan@112 | 111 | 
| jcallahan@112 | 112 local ALLOWED_LOCALES = { | 
| jcallahan@112 | 113     enUS = true, | 
| jcallahan@112 | 114     enGB = true, | 
| jcallahan@112 | 115 } | 
| jcallahan@112 | 116 | 
| jcallahan@112 | 117 | 
| jcallahan@0 | 118 ----------------------------------------------------------------------- | 
| jcallahan@0 | 119 -- Local variables. | 
| jcallahan@0 | 120 ----------------------------------------------------------------------- | 
| jcallahan@92 | 121 local anvil_spell_ids = {} | 
| jcallahan@92 | 122 local currently_drunk | 
| jcallahan@128 | 123 local char_db | 
| jcallahan@128 | 124 local global_db | 
| jcallahan@0 | 125 local durability_timer_handle | 
| jcallahan@92 | 126 local faction_standings = {} | 
| jcallahan@92 | 127 local forge_spell_ids = {} | 
| jcallahan@95 | 128 local languages_known = {} | 
| jcallahan@95 | 129 local name_to_id_map = {} | 
| jcallahan@92 | 130 local reputation_npc_id | 
| jcallahan@2 | 131 local target_location_timer_handle | 
| jcallahan@86 | 132 local current_target_id | 
| jcallahan@126 | 133 local current_area_id | 
| jcallahan@131 | 134 local current_loot | 
| jcallahan@1 | 135 | 
| jcallahan@121 | 136 ----------------------------------------------------------------------- | 
| jcallahan@121 | 137 -- Data for our current action. Including possible values as a reference. | 
| jcallahan@121 | 138 ----------------------------------------------------------------------- | 
| jcallahan@122 | 139 local current_action = { | 
| jcallahan@121 | 140     identifier = nil, | 
| jcallahan@121 | 141     loot_label = nil, | 
| jcallahan@121 | 142     loot_list = nil, | 
| jcallahan@121 | 143     loot_sources = nil, | 
| jcallahan@121 | 144     map_level = nil, | 
| jcallahan@121 | 145     spell_label = nil, | 
| jcallahan@123 | 146     target_type = nil, | 
| jcallahan@121 | 147     x = nil, | 
| jcallahan@121 | 148     y = nil, | 
| jcallahan@121 | 149     zone_data = nil, | 
| jcallahan@121 | 150 } | 
| jcallahan@92 | 151 | 
| jcallahan@1 | 152 ----------------------------------------------------------------------- | 
| jcallahan@1 | 153 -- Helper Functions. | 
| jcallahan@1 | 154 ----------------------------------------------------------------------- | 
| jcallahan@39 | 155 local ActualCopperCost | 
| jcallahan@39 | 156 do | 
| jcallahan@39 | 157     local BARTERING_SPELL_ID = 83964 | 
| jcallahan@39 | 158 | 
| jcallahan@39 | 159     local STANDING_DISCOUNTS = { | 
| jcallahan@39 | 160         HATED = 0, | 
| jcallahan@39 | 161         HOSTILE = 0, | 
| jcallahan@39 | 162         UNFRIENDLY = 0, | 
| jcallahan@39 | 163         NEUTRAL = 0, | 
| jcallahan@39 | 164         FRIENDLY = 0.05, | 
| jcallahan@39 | 165         HONORED = 0.1, | 
| jcallahan@39 | 166         REVERED = 0.15, | 
| jcallahan@39 | 167         EXALTED = 0.2, | 
| jcallahan@39 | 168     } | 
| jcallahan@39 | 169 | 
| jcallahan@39 | 170 | 
| jcallahan@39 | 171     function ActualCopperCost(copper_cost, rep_standing) | 
| jcallahan@39 | 172         if not copper_cost or copper_cost == 0 then | 
| jcallahan@39 | 173             return 0 | 
| jcallahan@39 | 174         end | 
| jcallahan@39 | 175         local modifier = 1 | 
| jcallahan@39 | 176 | 
| jcallahan@39 | 177         if _G.IsSpellKnown(BARTERING_SPELL_ID) then | 
| jcallahan@39 | 178             modifier = modifier - 0.1 | 
| jcallahan@39 | 179         end | 
| jcallahan@39 | 180 | 
| jcallahan@39 | 181         if rep_standing then | 
| jcallahan@39 | 182             if PLAYER_RACE == "Goblin" then | 
| jcallahan@39 | 183                 modifier = modifier - STANDING_DISCOUNTS["EXALTED"] | 
| jcallahan@39 | 184             elseif STANDING_DISCOUNTS[rep_standing] then | 
| jcallahan@39 | 185                 modifier = modifier - STANDING_DISCOUNTS[rep_standing] | 
| jcallahan@39 | 186             end | 
| jcallahan@39 | 187         end | 
| jcallahan@39 | 188         return math.floor(copper_cost / modifier) | 
| jcallahan@39 | 189     end | 
| jcallahan@39 | 190 end -- do-block | 
| jcallahan@39 | 191 | 
| jcallahan@39 | 192 | 
| jcallahan@29 | 193 local function InstanceDifficultyToken() | 
| jcallahan@29 | 194     local _, instance_type, instance_difficulty, difficulty_name, _, _, is_dynamic = _G.GetInstanceInfo() | 
| jcallahan@59 | 195     if not difficulty_name or difficulty_name == "" then | 
| jcallahan@29 | 196         difficulty_name = "NONE" | 
| jcallahan@29 | 197     end | 
| jcallahan@59 | 198 | 
| jcallahan@59 | 199     if not instance_type or instance_type == "" then | 
| jcallahan@59 | 200         instance_type = "NONE" | 
| jcallahan@59 | 201     end | 
| jcallahan@137 | 202 | 
| jcallahan@137 | 203     -- Raid difficulty of 2 is 25-man | 
| jcallahan@137 | 204     if instance_type == "raid" and instance_difficulty == 2 and _G.IsPartyLFG() and _G.IsInLFGDungeon() then | 
| jcallahan@137 | 205         difficulty_name = "LOOKING_FOR_RAID" | 
| jcallahan@137 | 206     end | 
| jcallahan@29 | 207     return ("%s:%s:%s"):format(instance_type:upper(), difficulty_name:upper():gsub(" ", "_"), _G.tostring(is_dynamic)) | 
| jcallahan@29 | 208 end | 
| jcallahan@29 | 209 | 
| jcallahan@29 | 210 | 
| jcallahan@19 | 211 local function DBEntry(data_type, unit_id) | 
| jcallahan@19 | 212     if not data_type or not unit_id then | 
| jcallahan@6 | 213         return | 
| jcallahan@6 | 214     end | 
| jcallahan@128 | 215     local unit = global_db[data_type][unit_id] | 
| jcallahan@6 | 216 | 
| jcallahan@10 | 217     if not unit then | 
| jcallahan@128 | 218         global_db[data_type][unit_id] = {} | 
| jcallahan@128 | 219         unit = global_db[data_type][unit_id] | 
| jcallahan@6 | 220     end | 
| jcallahan@10 | 221     return unit | 
| jcallahan@6 | 222 end | 
| jcallahan@6 | 223 | 
| jcallahan@6 | 224 | 
| jcallahan@29 | 225 local function NPCEntry(identifier) | 
| jcallahan@29 | 226     local npc = DBEntry("npcs", identifier) | 
| jcallahan@29 | 227 | 
| jcallahan@29 | 228     if not npc then | 
| jcallahan@29 | 229         return | 
| jcallahan@22 | 230     end | 
| jcallahan@29 | 231     local instance_token = InstanceDifficultyToken() | 
| jcallahan@29 | 232     npc.encounter_data = npc.encounter_data or {} | 
| jcallahan@29 | 233     npc.encounter_data[instance_token] = npc.encounter_data[instance_token] or {} | 
| jcallahan@30 | 234     npc.encounter_data[instance_token].stats = npc.encounter_data[instance_token].stats or {} | 
| jcallahan@29 | 235     return npc | 
| jcallahan@22 | 236 end | 
| jcallahan@22 | 237 | 
| jcallahan@22 | 238 | 
| jcallahan@1 | 239 local function CurrentLocationData() | 
| jcallahan@1 | 240     local map_level = _G.GetCurrentMapDungeonLevel() or 0 | 
| jcallahan@1 | 241     local x, y = _G.GetPlayerMapPosition("player") | 
| jcallahan@1 | 242 | 
| jcallahan@1 | 243     x = x or 0 | 
| jcallahan@1 | 244     y = y or 0 | 
| jcallahan@1 | 245 | 
| jcallahan@1 | 246     if x == 0 and y == 0 then | 
| jcallahan@1 | 247         for level_index = 1, _G.GetNumDungeonMapLevels() do | 
| jcallahan@1 | 248             _G.SetDungeonMapLevel(level_index) | 
| jcallahan@1 | 249             x, y = _G.GetPlayerMapPosition("player") | 
| jcallahan@1 | 250 | 
| jcallahan@1 | 251             if x and y and (x > 0 or y > 0) then | 
| jcallahan@1 | 252                 _G.SetDungeonMapLevel(map_level) | 
| jcallahan@1 | 253                 map_level = level_index | 
| jcallahan@1 | 254                 break | 
| jcallahan@1 | 255             end | 
| jcallahan@1 | 256         end | 
| jcallahan@1 | 257     end | 
| jcallahan@1 | 258 | 
| jcallahan@1 | 259     if _G.DungeonUsesTerrainMap() then | 
| jcallahan@1 | 260         map_level = map_level - 1 | 
| jcallahan@1 | 261     end | 
| jcallahan@31 | 262     local x = _G.floor(x * 1000) | 
| jcallahan@31 | 263     local y = _G.floor(y * 1000) | 
| jcallahan@28 | 264 | 
| jcallahan@31 | 265     if x % 2 ~= 0 then | 
| jcallahan@31 | 266         x = x + 1 | 
| jcallahan@28 | 267     end | 
| jcallahan@28 | 268 | 
| jcallahan@31 | 269     if y % 2 ~= 0 then | 
| jcallahan@31 | 270         y = y + 1 | 
| jcallahan@28 | 271     end | 
| jcallahan@126 | 272     return _G.GetRealZoneText(), current_area_id, x, y, map_level, InstanceDifficultyToken() | 
| jcallahan@1 | 273 end | 
| jcallahan@1 | 274 | 
| jcallahan@1 | 275 | 
| jcallahan@1 | 276 local function ItemLinkToID(item_link) | 
| jcallahan@1 | 277     if not item_link then | 
| jcallahan@1 | 278         return | 
| jcallahan@1 | 279     end | 
| jcallahan@7 | 280     return tonumber(item_link:match("item:(%d+)")) | 
| jcallahan@1 | 281 end | 
| jcallahan@0 | 282 | 
| jcallahan@4 | 283 | 
| jcallahan@34 | 284 local ParseGUID | 
| jcallahan@4 | 285 do | 
| jcallahan@4 | 286     local UNIT_TYPE_BITMASK = 0x007 | 
| jcallahan@4 | 287 | 
| jcallahan@34 | 288     function ParseGUID(guid) | 
| jcallahan@5 | 289         if not guid then | 
| jcallahan@5 | 290             return | 
| jcallahan@5 | 291         end | 
| jcallahan@4 | 292         local types = private.UNIT_TYPES | 
| jcallahan@4 | 293         local unit_type = _G.bit.band(tonumber(guid:sub(1, 5)), UNIT_TYPE_BITMASK) | 
| jcallahan@4 | 294 | 
| jcallahan@10 | 295         if unit_type ~= types.PLAYER and unit_type ~= types.PET then | 
| jcallahan@66 | 296             return unit_type, tonumber(guid:sub(6, 10), 16) | 
| jcallahan@4 | 297         end | 
| jcallahan@4 | 298         return unit_type | 
| jcallahan@4 | 299     end | 
| jcallahan@4 | 300 end -- do-block | 
| jcallahan@4 | 301 | 
| jcallahan@4 | 302 | 
| jcallahan@128 | 303 local function UpdateBlacklistMaps() | 
| jcallahan@128 | 304     local empty_count = 0 | 
| jcallahan@128 | 305 | 
| jcallahan@128 | 306     for index = 1, _G.MAX_BLACKLIST_BATTLEGROUNDS do | 
| jcallahan@128 | 307         local map_id = _G.GetBlacklistMap(index) | 
| jcallahan@128 | 308         char_db.bg_blacklist = char_db.bg_blacklist or {} | 
| jcallahan@128 | 309         char_db.bg_blacklist[index] = map_id | 
| jcallahan@128 | 310 | 
| jcallahan@128 | 311         if map_id < 0 then | 
| jcallahan@128 | 312             empty_count = empty_count + 1 | 
| jcallahan@128 | 313         end | 
| jcallahan@128 | 314     end | 
| jcallahan@128 | 315 | 
| jcallahan@128 | 316     if empty_count == _G.MAX_BLACKLIST_BATTLEGROUNDS then | 
| jcallahan@128 | 317         char_db.bg_blacklist = nil | 
| jcallahan@128 | 318     end | 
| jcallahan@128 | 319 end | 
| jcallahan@128 | 320 | 
| jcallahan@128 | 321 | 
| jcallahan@52 | 322 local function UpdateDBEntryLocation(entry_type, identifier) | 
| jcallahan@10 | 323     if not identifier then | 
| jcallahan@10 | 324         return | 
| jcallahan@10 | 325     end | 
| jcallahan@31 | 326     local zone_name, area_id, x, y, map_level, difficulty_token = CurrentLocationData() | 
| jcallahan@41 | 327     local entry = DBEntry(entry_type, identifier) | 
| jcallahan@41 | 328     entry[difficulty_token] = entry[difficulty_token] or {} | 
| jcallahan@52 | 329     entry[difficulty_token].locations = entry[difficulty_token].locations or {} | 
| jcallahan@10 | 330 | 
| jcallahan@31 | 331     local zone_token = ("%s:%d"):format(zone_name, area_id) | 
| jcallahan@52 | 332     local zone_data = entry[difficulty_token].locations[zone_token] | 
| jcallahan@24 | 333 | 
| jcallahan@31 | 334     if not zone_data then | 
| jcallahan@31 | 335         zone_data = {} | 
| jcallahan@52 | 336         entry[difficulty_token].locations[zone_token] = zone_data | 
| jcallahan@10 | 337     end | 
| jcallahan@41 | 338     local location_token = ("%s:%s:%s"):format(map_level, x, y) | 
| jcallahan@41 | 339     zone_data[location_token] = zone_data[location_token] or true | 
| jcallahan@41 | 340     return zone_data | 
| jcallahan@10 | 341 end | 
| jcallahan@10 | 342 | 
| jcallahan@10 | 343 | 
| jcallahan@19 | 344 local function HandleItemUse(item_link, bag_index, slot_index) | 
| jcallahan@19 | 345     if not item_link then | 
| jcallahan@19 | 346         return | 
| jcallahan@19 | 347     end | 
| jcallahan@19 | 348     local item_id = ItemLinkToID(item_link) | 
| jcallahan@19 | 349 | 
| jcallahan@19 | 350     if not bag_index or not slot_index then | 
| jcallahan@19 | 351         for new_bag_index = 0, _G.NUM_BAG_FRAMES do | 
| jcallahan@19 | 352             for new_slot_index = 1, _G.GetContainerNumSlots(new_bag_index) do | 
| jcallahan@19 | 353                 if item_id == ItemLinkToID(_G.GetContainerItemLink(new_bag_index, new_slot_index)) then | 
| jcallahan@19 | 354                     bag_index = new_bag_index | 
| jcallahan@19 | 355                     slot_index = new_slot_index | 
| jcallahan@19 | 356                     break | 
| jcallahan@19 | 357                 end | 
| jcallahan@19 | 358             end | 
| jcallahan@19 | 359         end | 
| jcallahan@19 | 360     end | 
| jcallahan@19 | 361 | 
| jcallahan@19 | 362     if not bag_index or not slot_index then | 
| jcallahan@19 | 363         return | 
| jcallahan@19 | 364     end | 
| jcallahan@19 | 365     local _, _, _, _, _, is_lootable = _G.GetContainerItemInfo(bag_index, slot_index) | 
| jcallahan@19 | 366 | 
| jcallahan@19 | 367     if not is_lootable then | 
| jcallahan@19 | 368         return | 
| jcallahan@19 | 369     end | 
| jcallahan@19 | 370     DatamineTT:ClearLines() | 
| jcallahan@19 | 371     DatamineTT:SetBagItem(bag_index, slot_index) | 
| jcallahan@19 | 372 | 
| jcallahan@19 | 373     for line_index = 1, DatamineTT:NumLines() do | 
| jcallahan@19 | 374         local current_line = _G["WDPDatamineTTTextLeft" .. line_index] | 
| jcallahan@19 | 375 | 
| jcallahan@19 | 376         if not current_line then | 
| jcallahan@19 | 377             break | 
| jcallahan@19 | 378         end | 
| jcallahan@19 | 379 | 
| jcallahan@19 | 380         if current_line:GetText() == _G.ITEM_OPENABLE then | 
| jcallahan@122 | 381             table.wipe(current_action) | 
| jcallahan@123 | 382             current_action.target_type = AF.ITEM | 
| jcallahan@122 | 383             current_action.identifier = item_id | 
| jcallahan@122 | 384             current_action.loot_label = "contains" | 
| jcallahan@19 | 385             break | 
| jcallahan@19 | 386         end | 
| jcallahan@19 | 387     end | 
| jcallahan@19 | 388 end | 
| jcallahan@19 | 389 | 
| jcallahan@19 | 390 | 
| jcallahan@39 | 391 local UnitFactionStanding | 
| jcallahan@32 | 392 local UpdateFactionData | 
| jcallahan@32 | 393 do | 
| jcallahan@32 | 394     local MAX_FACTION_INDEX = 1000 | 
| jcallahan@20 | 395 | 
| jcallahan@32 | 396     local STANDING_NAMES = { | 
| jcallahan@32 | 397         "HATED", | 
| jcallahan@32 | 398         "HOSTILE", | 
| jcallahan@32 | 399         "UNFRIENDLY", | 
| jcallahan@32 | 400         "NEUTRAL", | 
| jcallahan@32 | 401         "FRIENDLY", | 
| jcallahan@32 | 402         "HONORED", | 
| jcallahan@32 | 403         "REVERED", | 
| jcallahan@32 | 404         "EXALTED", | 
| jcallahan@32 | 405     } | 
| jcallahan@32 | 406 | 
| jcallahan@39 | 407 | 
| jcallahan@39 | 408     function UnitFactionStanding(unit) | 
| jcallahan@135 | 409         local unit_name = _G.UnitName(unit) | 
| jcallahan@39 | 410         UpdateFactionData() | 
| jcallahan@39 | 411         DatamineTT:ClearLines() | 
| jcallahan@39 | 412         DatamineTT:SetUnit(unit) | 
| jcallahan@39 | 413 | 
| jcallahan@39 | 414         for line_index = 1, DatamineTT:NumLines() do | 
| jcallahan@64 | 415             local faction_name = _G["WDPDatamineTTTextLeft" .. line_index]:GetText():trim() | 
| jcallahan@39 | 416 | 
| jcallahan@135 | 417             if faction_name and faction_name ~= unit_name and faction_standings[faction_name] then | 
| jcallahan@39 | 418                 return faction_name, faction_standings[faction_name] | 
| jcallahan@39 | 419             end | 
| jcallahan@39 | 420         end | 
| jcallahan@39 | 421     end | 
| jcallahan@39 | 422 | 
| jcallahan@39 | 423 | 
| jcallahan@32 | 424     function UpdateFactionData() | 
| jcallahan@32 | 425         for faction_index = 1, MAX_FACTION_INDEX do | 
| jcallahan@32 | 426             local faction_name, _, current_standing, _, _, _, _, _, is_header = _G.GetFactionInfo(faction_index) | 
| jcallahan@32 | 427 | 
| jcallahan@86 | 428             if faction_name then | 
| jcallahan@32 | 429                 faction_standings[faction_name] = STANDING_NAMES[current_standing] | 
| jcallahan@32 | 430             elseif not faction_name then | 
| jcallahan@32 | 431                 break | 
| jcallahan@32 | 432             end | 
| jcallahan@20 | 433         end | 
| jcallahan@20 | 434     end | 
| jcallahan@32 | 435 end -- do-block | 
| jcallahan@20 | 436 | 
| jcallahan@48 | 437 | 
| jcallahan@75 | 438 local GenericLootUpdate | 
| jcallahan@75 | 439 do | 
| jcallahan@77 | 440     local function LootTable(entry, loot_type, top_field) | 
| jcallahan@75 | 441         if top_field then | 
| jcallahan@75 | 442             entry[top_field] = entry[top_field] or {} | 
| jcallahan@75 | 443             entry[top_field][loot_type] = entry[top_field][loot_type] or {} | 
| jcallahan@75 | 444             return entry[top_field][loot_type] | 
| jcallahan@75 | 445         end | 
| jcallahan@48 | 446         entry[loot_type] = entry[loot_type] or {} | 
| jcallahan@75 | 447         return entry[loot_type] | 
| jcallahan@48 | 448     end | 
| jcallahan@48 | 449 | 
| jcallahan@75 | 450     function GenericLootUpdate(data_type, top_field) | 
| jcallahan@132 | 451         local loot_type = current_loot.label | 
| jcallahan@75 | 452         local loot_count = ("%s_count"):format(loot_type) | 
| jcallahan@77 | 453         local source_list = {} | 
| jcallahan@75 | 454 | 
| jcallahan@131 | 455         if current_loot.sources then | 
| jcallahan@131 | 456             for source_guid, loot_data in pairs(current_loot.sources) do | 
| jcallahan@119 | 457                 local entry, source_id | 
| jcallahan@78 | 458 | 
| jcallahan@131 | 459                 if current_loot.target_type == AF.ITEM then | 
| jcallahan@119 | 460                     -- Items return the player as the source, so we need to use the item's ID (disenchant, milling, etc) | 
| jcallahan@131 | 461                     source_id = current_loot.identifier | 
| jcallahan@119 | 462                     entry = DBEntry(data_type, source_id) | 
| jcallahan@131 | 463                 elseif current_loot.target_type == AF.OBJECT then | 
| jcallahan@131 | 464                     source_id = ("%s:%s"):format(current_loot.spell_label, select(2, ParseGUID(source_guid))) | 
| jcallahan@119 | 465                     entry = DBEntry(data_type, source_id) | 
| jcallahan@119 | 466                 else | 
| jcallahan@119 | 467                     source_id = select(2, ParseGUID(source_guid)) | 
| jcallahan@119 | 468                     entry = DBEntry(data_type, source_id) | 
| jcallahan@119 | 469                 end | 
| jcallahan@75 | 470 | 
| jcallahan@119 | 471                 if entry then | 
| jcallahan@119 | 472                     local loot_table = LootTable(entry, loot_type, top_field) | 
| jcallahan@77 | 473 | 
| jcallahan@119 | 474                     if not source_list[source_guid] then | 
| jcallahan@119 | 475                         if top_field then | 
| jcallahan@119 | 476                             entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1 | 
| jcallahan@119 | 477                         else | 
| jcallahan@119 | 478                             entry[loot_count] = (entry[loot_count] or 0) + 1 | 
| jcallahan@119 | 479                         end | 
| jcallahan@119 | 480                         source_list[source_guid] = true | 
| jcallahan@77 | 481                     end | 
| jcallahan@119 | 482                     UpdateDBEntryLocation(data_type, source_id) | 
| jcallahan@75 | 483 | 
| jcallahan@119 | 484                     for item_id, quantity in pairs(loot_data) do | 
| jcallahan@119 | 485                         table.insert(loot_table, ("%d:%d"):format(item_id, quantity)) | 
| jcallahan@119 | 486                     end | 
| jcallahan@75 | 487                 end | 
| jcallahan@75 | 488             end | 
| jcallahan@75 | 489         end | 
| jcallahan@121 | 490 | 
| jcallahan@121 | 491         -- This is used for Gas Extractions. | 
| jcallahan@131 | 492         if #current_loot.list <= 0 then | 
| jcallahan@78 | 493             return | 
| jcallahan@78 | 494         end | 
| jcallahan@82 | 495         local entry | 
| jcallahan@82 | 496 | 
| jcallahan@82 | 497         -- At this point we only have a name if it's an object. | 
| jcallahan@131 | 498         if current_loot.target_type == AF.OBJECT then | 
| jcallahan@131 | 499             entry = DBEntry(data_type, ("%s:%s"):format(current_loot.spell_label, current_loot.object_name)) | 
| jcallahan@82 | 500         else | 
| jcallahan@131 | 501             entry = DBEntry(data_type, current_loot.identifier) | 
| jcallahan@82 | 502         end | 
| jcallahan@75 | 503 | 
| jcallahan@75 | 504         if not entry then | 
| jcallahan@75 | 505             return | 
| jcallahan@75 | 506         end | 
| jcallahan@77 | 507         local loot_table = LootTable(entry, loot_type, top_field) | 
| jcallahan@77 | 508 | 
| jcallahan@131 | 509         if not source_list[current_loot.identifier] then | 
| jcallahan@77 | 510             if top_field then | 
| jcallahan@77 | 511                 entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1 | 
| jcallahan@77 | 512             else | 
| jcallahan@77 | 513                 entry[loot_count] = (entry[loot_count] or 0) + 1 | 
| jcallahan@77 | 514             end | 
| jcallahan@77 | 515         end | 
| jcallahan@75 | 516 | 
| jcallahan@131 | 517         for index = 1, #current_loot.list do | 
| jcallahan@131 | 518             table.insert(loot_table, current_loot.list[index]) | 
| jcallahan@75 | 519         end | 
| jcallahan@48 | 520     end | 
| jcallahan@75 | 521 end -- do-block | 
| jcallahan@48 | 522 | 
| jcallahan@97 | 523 | 
| jcallahan@97 | 524 local ReplaceKeywords | 
| jcallahan@97 | 525 do | 
| jcallahan@97 | 526     local KEYWORD_SUBSTITUTIONS = { | 
| jcallahan@97 | 527         class = PLAYER_CLASS, | 
| jcallahan@97 | 528         name = PLAYER_NAME, | 
| jcallahan@97 | 529         race = PLAYER_RACE, | 
| jcallahan@97 | 530     } | 
| jcallahan@97 | 531 | 
| jcallahan@97 | 532 | 
| jcallahan@97 | 533     function ReplaceKeywords(text) | 
| jcallahan@97 | 534         if not text or text == "" then | 
| jcallahan@97 | 535             return "" | 
| jcallahan@97 | 536         end | 
| jcallahan@97 | 537 | 
| jcallahan@97 | 538         for category, lookup in pairs(KEYWORD_SUBSTITUTIONS) do | 
| jcallahan@97 | 539             local category_format = ("<%s>"):format(category) | 
| jcallahan@97 | 540             text = text:gsub(lookup, category_format):gsub(lookup:lower(), category_format) | 
| jcallahan@97 | 541         end | 
| jcallahan@97 | 542         return text | 
| jcallahan@97 | 543     end | 
| jcallahan@97 | 544 end -- do-block | 
| jcallahan@97 | 545 | 
| jcallahan@97 | 546 | 
| jcallahan@129 | 547 function WDP:SetCurrentAreaID(event_name) | 
| jcallahan@126 | 548     local map_area_id = _G.GetCurrentMapAreaID() | 
| jcallahan@126 | 549     _G.SetMapToCurrentZone() | 
| jcallahan@126 | 550 | 
| jcallahan@126 | 551     current_area_id = _G.GetCurrentMapAreaID() | 
| jcallahan@126 | 552     _G.SetMapByID(map_area_id) | 
| jcallahan@126 | 553 end | 
| jcallahan@126 | 554 | 
| jcallahan@126 | 555 | 
| jcallahan@0 | 556 ----------------------------------------------------------------------- | 
| jcallahan@0 | 557 -- Methods. | 
| jcallahan@0 | 558 ----------------------------------------------------------------------- | 
| jcallahan@0 | 559 function WDP:OnInitialize() | 
| jcallahan@128 | 560     local db = LibStub("AceDB-3.0"):New("WoWDBProfilerData", DATABASE_DEFAULTS, "Default") | 
| jcallahan@128 | 561     global_db = db.global | 
| jcallahan@128 | 562     char_db = db.char | 
| jcallahan@14 | 563 | 
| jcallahan@14 | 564     local raw_db = _G["WoWDBProfilerData"] | 
| jcallahan@18 | 565     local build_num = tonumber(private.build_num) | 
| jcallahan@14 | 566 | 
| jcallahan@136 | 567     if (raw_db.version and raw_db.version < DB_VERSION) or (raw_db.build_num and raw_db.build_num < build_num) then | 
| jcallahan@74 | 568         for entry in pairs(DATABASE_DEFAULTS.global) do | 
| jcallahan@128 | 569             global_db[entry] = {} | 
| jcallahan@74 | 570         end | 
| jcallahan@74 | 571     end | 
| jcallahan@35 | 572     raw_db.build_num = build_num | 
| jcallahan@63 | 573     raw_db.version = DB_VERSION | 
| jcallahan@0 | 574 end | 
| jcallahan@0 | 575 | 
| jcallahan@0 | 576 | 
| jcallahan@0 | 577 function WDP:OnEnable() | 
| jcallahan@0 | 578     for event_name, mapping in pairs(EVENT_MAPPING) do | 
| jcallahan@1 | 579         self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil) | 
| jcallahan@0 | 580     end | 
| jcallahan@95 | 581 | 
| jcallahan@95 | 582     for index = 1, _G.GetNumLanguages() do | 
| jcallahan@95 | 583         languages_known[_G.GetLanguageByIndex(index)] = true | 
| jcallahan@95 | 584     end | 
| jcallahan@0 | 585     durability_timer_handle = self:ScheduleRepeatingTimer("ProcessDurability", 30) | 
| jcallahan@31 | 586     target_location_timer_handle = self:ScheduleRepeatingTimer("UpdateTargetLocation", 0.5) | 
| jcallahan@19 | 587 | 
| jcallahan@19 | 588     _G.hooksecurefunc("UseContainerItem", function(bag_index, slot_index, target_unit) | 
| jcallahan@19 | 589         if target_unit then | 
| jcallahan@19 | 590             return | 
| jcallahan@19 | 591         end | 
| jcallahan@19 | 592         HandleItemUse(_G.GetContainerItemLink(bag_index, slot_index), bag_index, slot_index) | 
| jcallahan@19 | 593     end) | 
| jcallahan@19 | 594 | 
| jcallahan@19 | 595     _G.hooksecurefunc("UseItemByName", function(identifier, target_unit) | 
| jcallahan@19 | 596         if target_unit then | 
| jcallahan@19 | 597             return | 
| jcallahan@19 | 598         end | 
| jcallahan@19 | 599         local _, item_link = _G.GetItemInfo(identifier) | 
| jcallahan@19 | 600         HandleItemUse(item_link) | 
| jcallahan@19 | 601     end) | 
| jcallahan@129 | 602     self:SetCurrentAreaID("OnEnable") | 
| jcallahan@126 | 603 | 
| jcallahan@128 | 604     _G.hooksecurefunc("SetBlacklistMap", UpdateBlacklistMaps) | 
| jcallahan@128 | 605     _G.hooksecurefunc("ClearBlacklistMap", UpdateBlacklistMaps) | 
| jcallahan@128 | 606 | 
| jcallahan@128 | 607     UpdateBlacklistMaps() | 
| jcallahan@0 | 608 end | 
| jcallahan@0 | 609 | 
| jcallahan@0 | 610 | 
| jcallahan@0 | 611 local function RecordDurability(item_id, durability) | 
| jcallahan@0 | 612     if not durability or durability <= 0 then | 
| jcallahan@0 | 613         return | 
| jcallahan@0 | 614     end | 
| jcallahan@0 | 615 | 
| jcallahan@128 | 616     if not global_db.items[item_id] then | 
| jcallahan@128 | 617         global_db.items[item_id] = {} | 
| jcallahan@0 | 618     end | 
| jcallahan@128 | 619     global_db.items[item_id].durability = durability | 
| jcallahan@0 | 620 end | 
| jcallahan@0 | 621 | 
| jcallahan@0 | 622 | 
| jcallahan@0 | 623 function WDP:ProcessDurability() | 
| jcallahan@0 | 624     for slot_index = 0, _G.INVSLOT_LAST_EQUIPPED do | 
| jcallahan@1 | 625         local item_id = _G.GetInventoryItemID("player", slot_index) | 
| jcallahan@0 | 626 | 
| jcallahan@0 | 627         if item_id and item_id > 0 then | 
| jcallahan@1 | 628             local _, max_durability = _G.GetInventoryItemDurability(slot_index) | 
| jcallahan@0 | 629             RecordDurability(item_id, max_durability) | 
| jcallahan@0 | 630         end | 
| jcallahan@0 | 631     end | 
| jcallahan@0 | 632 | 
| jcallahan@0 | 633     for bag_index = 0, _G.NUM_BAG_SLOTS do | 
| jcallahan@0 | 634         for slot_index = 1, _G.GetContainerNumSlots(bag_index) do | 
| jcallahan@1 | 635             local item_id = _G.GetContainerItemID(bag_index, slot_index) | 
| jcallahan@0 | 636 | 
| jcallahan@0 | 637             if item_id and item_id > 0 then | 
| jcallahan@1 | 638                 local _, max_durability = _G.GetContainerItemDurability(bag_index, slot_index) | 
| jcallahan@0 | 639                 RecordDurability(item_id, max_durability) | 
| jcallahan@0 | 640             end | 
| jcallahan@0 | 641         end | 
| jcallahan@0 | 642     end | 
| jcallahan@0 | 643 end | 
| jcallahan@0 | 644 | 
| jcallahan@118 | 645 | 
| jcallahan@118 | 646 local PlayerTarget | 
| jcallahan@118 | 647 do | 
| jcallahan@118 | 648     local GENDER_NAMES = { | 
| jcallahan@118 | 649         "UNKNOWN", | 
| jcallahan@118 | 650         "MALE", | 
| jcallahan@118 | 651         "FEMALE", | 
| jcallahan@118 | 652     } | 
| jcallahan@118 | 653 | 
| jcallahan@118 | 654 | 
| jcallahan@118 | 655     local REACTION_NAMES = { | 
| jcallahan@118 | 656         "HATED", | 
| jcallahan@118 | 657         "HOSTILE", | 
| jcallahan@118 | 658         "UNFRIENDLY", | 
| jcallahan@118 | 659         "NEUTRAL", | 
| jcallahan@118 | 660         "FRIENDLY", | 
| jcallahan@118 | 661         "HONORED", | 
| jcallahan@118 | 662         "REVERED", | 
| jcallahan@118 | 663         "EXALTED", | 
| jcallahan@118 | 664     } | 
| jcallahan@118 | 665 | 
| jcallahan@118 | 666 | 
| jcallahan@118 | 667     local POWER_TYPE_NAMES = { | 
| jcallahan@118 | 668         ["0"] = "MANA", | 
| jcallahan@118 | 669         ["1"] = "RAGE", | 
| jcallahan@118 | 670         ["2"] = "FOCUS", | 
| jcallahan@118 | 671         ["3"] = "ENERGY", | 
| jcallahan@118 | 672         ["6"] = "RUNIC_POWER", | 
| jcallahan@118 | 673     } | 
| jcallahan@118 | 674 | 
| jcallahan@118 | 675 | 
| jcallahan@118 | 676     function PlayerTarget() | 
| jcallahan@118 | 677         if not _G.UnitExists("target") or _G.UnitPlayerControlled("target") or currently_drunk then | 
| jcallahan@118 | 678             current_target_id = nil | 
| jcallahan@118 | 679             return | 
| jcallahan@118 | 680         end | 
| jcallahan@118 | 681         local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("target")) | 
| jcallahan@118 | 682 | 
| jcallahan@118 | 683         if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 
| jcallahan@118 | 684             return | 
| jcallahan@118 | 685         end | 
| jcallahan@118 | 686         current_target_id = unit_idnum | 
| jcallahan@118 | 687 | 
| jcallahan@118 | 688         local npc = NPCEntry(unit_idnum) | 
| jcallahan@118 | 689         local _, class_token = _G.UnitClass("target") | 
| jcallahan@118 | 690         npc.class = class_token | 
| jcallahan@118 | 691         npc.faction = UnitFactionStanding("target") | 
| jcallahan@118 | 692         npc.genders = npc.genders or {} | 
| jcallahan@118 | 693         npc.genders[GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED"] = true | 
| jcallahan@118 | 694         npc.is_pvp = _G.UnitIsPVP("target") and true or nil | 
| jcallahan@118 | 695         npc.reaction = ("%s:%s:%s"):format(_G.UnitLevel("player"), _G.UnitFactionGroup("player"), REACTION_NAMES[_G.UnitReaction("player", "target")]) | 
| jcallahan@118 | 696 | 
| jcallahan@118 | 697         local encounter_data = npc.encounter_data[InstanceDifficultyToken()].stats | 
| jcallahan@118 | 698         local npc_level = ("level_%d"):format(_G.UnitLevel("target")) | 
| jcallahan@118 | 699 | 
| jcallahan@118 | 700         if not encounter_data[npc_level] then | 
| jcallahan@118 | 701             encounter_data[npc_level] = { | 
| jcallahan@118 | 702                 max_health = _G.UnitHealthMax("target"), | 
| jcallahan@118 | 703             } | 
| jcallahan@118 | 704 | 
| jcallahan@118 | 705             local max_power = _G.UnitManaMax("target") | 
| jcallahan@118 | 706 | 
| jcallahan@118 | 707             if max_power > 0 then | 
| jcallahan@118 | 708                 local power_type = _G.UnitPowerType("target") | 
| jcallahan@118 | 709                 encounter_data[npc_level].power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power) | 
| jcallahan@118 | 710             end | 
| jcallahan@118 | 711         end | 
| jcallahan@118 | 712         name_to_id_map[_G.UnitName("target")] = unit_idnum | 
| jcallahan@118 | 713 | 
| jcallahan@123 | 714         current_action.target_type = AF.NPC | 
| jcallahan@122 | 715         current_action.identifier = unit_idnum | 
| jcallahan@118 | 716         return npc, unit_idnum | 
| jcallahan@118 | 717     end | 
| jcallahan@118 | 718 end -- do-block | 
| jcallahan@118 | 719 | 
| jcallahan@118 | 720 | 
| jcallahan@113 | 721 do | 
| jcallahan@113 | 722     local COORD_MAX = 5 | 
| jcallahan@0 | 723 | 
| jcallahan@113 | 724     function WDP:UpdateTargetLocation() | 
| jcallahan@113 | 725         if currently_drunk or not _G.UnitExists("target") or _G.UnitPlayerControlled("target") or (_G.UnitIsTapped("target") and not _G.UnitIsDead("target")) then | 
| jcallahan@2 | 726             return | 
| jcallahan@2 | 727         end | 
| jcallahan@113 | 728 | 
| jcallahan@113 | 729         for index = 1, 4 do | 
| jcallahan@113 | 730             if not _G.CheckInteractDistance("target", index) then | 
| jcallahan@113 | 731                 return | 
| jcallahan@113 | 732             end | 
| jcallahan@113 | 733         end | 
| jcallahan@118 | 734         local npc = PlayerTarget() | 
| jcallahan@113 | 735 | 
| jcallahan@113 | 736         if not npc then | 
| jcallahan@113 | 737             return | 
| jcallahan@113 | 738         end | 
| jcallahan@113 | 739         local zone_name, area_id, x, y, map_level, difficulty_token = CurrentLocationData() | 
| jcallahan@113 | 740         local npc_data = npc.encounter_data[difficulty_token].stats[("level_%d"):format(_G.UnitLevel("target"))] | 
| jcallahan@113 | 741         local zone_token = ("%s:%d"):format(zone_name, area_id) | 
| jcallahan@118 | 742         npc_data.locations = npc_data.locations or {} -- TODO: Fix this. It is broken. Possibly something to do with the timed updates. | 
| jcallahan@113 | 743 | 
| jcallahan@113 | 744         local zone_data = npc_data.locations[zone_token] | 
| jcallahan@113 | 745 | 
| jcallahan@113 | 746         if not zone_data then | 
| jcallahan@113 | 747             zone_data = {} | 
| jcallahan@113 | 748             npc_data.locations[zone_token] = zone_data | 
| jcallahan@113 | 749         end | 
| jcallahan@113 | 750 | 
| jcallahan@113 | 751         for location_token in pairs(zone_data) do | 
| jcallahan@113 | 752             local loc_level, loc_x, loc_y = (":"):split(location_token) | 
| jcallahan@113 | 753             loc_level = tonumber(loc_level) | 
| jcallahan@113 | 754 | 
| jcallahan@113 | 755             if map_level == loc_level and math.abs(x - loc_x) <= COORD_MAX and math.abs(y - loc_y) <= COORD_MAX then | 
| jcallahan@113 | 756                 return | 
| jcallahan@113 | 757             end | 
| jcallahan@113 | 758         end | 
| jcallahan@113 | 759         zone_data[("%s:%s:%s"):format(map_level, x, y)] = true | 
| jcallahan@2 | 760     end | 
| jcallahan@113 | 761 end -- do-block | 
| jcallahan@2 | 762 | 
| jcallahan@118 | 763 | 
| jcallahan@0 | 764 ----------------------------------------------------------------------- | 
| jcallahan@0 | 765 -- Event handlers. | 
| jcallahan@0 | 766 ----------------------------------------------------------------------- | 
| jcallahan@90 | 767 function WDP:BLACK_MARKET_ITEM_UPDATE(event_name) | 
| jcallahan@56 | 768     local num_items = _G.C_BlackMarket.GetNumItems() | 
| jcallahan@56 | 769 | 
| jcallahan@56 | 770     for index = 1, num_items do | 
| jcallahan@56 | 771         local name, texture, quantity, item_type, is_usable, level, level_type, seller_name, min_bid, min_increment, current_bid, has_high_bid, num_bids, time_left, item_link, market_id = _G.C_BlackMarket.GetItemInfoByIndex(index); | 
| jcallahan@56 | 772 | 
| jcallahan@56 | 773         if item_link then | 
| jcallahan@56 | 774             DBEntry("items", ItemLinkToID(item_link)).black_market = seller_name or "UNKNOWN" | 
| jcallahan@56 | 775         end | 
| jcallahan@56 | 776     end | 
| jcallahan@56 | 777 end | 
| jcallahan@56 | 778 | 
| jcallahan@56 | 779 | 
| jcallahan@75 | 780 function WDP:CHAT_MSG_LOOT(event_name, message) | 
| jcallahan@122 | 781     if current_action.spell_label ~= "EXTRACT_GAS" then | 
| jcallahan@48 | 782         return | 
| jcallahan@48 | 783     end | 
| jcallahan@48 | 784     local item_link, quantity = deformat(message, _G.LOOT_ITEM_PUSHED_SELF_MULTIPLE) | 
| jcallahan@48 | 785 | 
| jcallahan@48 | 786     if not item_link then | 
| jcallahan@48 | 787         quantity, item_link = 1, deformat(message, _G.LOOT_ITEM_PUSHED_SELF) | 
| jcallahan@48 | 788     end | 
| jcallahan@48 | 789 | 
| jcallahan@48 | 790     if not item_link then | 
| jcallahan@48 | 791         return | 
| jcallahan@48 | 792     end | 
| jcallahan@48 | 793     local item_id = ItemLinkToID(item_link) | 
| jcallahan@48 | 794 | 
| jcallahan@48 | 795     if not item_id then | 
| jcallahan@48 | 796         return | 
| jcallahan@48 | 797     end | 
| jcallahan@131 | 798     current_loot = { | 
| jcallahan@131 | 799         list = { | 
| jcallahan@131 | 800             ("%d:%d"):format(item_id, quantity) | 
| jcallahan@131 | 801         }, | 
| jcallahan@131 | 802         identifier = current_action.identifier, | 
| jcallahan@132 | 803         label = current_action.loot_label or "drops", | 
| jcallahan@131 | 804         map_level = current_action.map_level, | 
| jcallahan@131 | 805         object_name = current_action.object_name, | 
| jcallahan@131 | 806         spell_label = current_action.spell_label, | 
| jcallahan@131 | 807         target_type = current_action.target_type, | 
| jcallahan@131 | 808         x = current_action.x, | 
| jcallahan@131 | 809         y = current_action.y, | 
| jcallahan@131 | 810         zone_data = current_action.zone_data, | 
| jcallahan@48 | 811     } | 
| jcallahan@131 | 812     table.wipe(current_action) | 
| jcallahan@48 | 813     GenericLootUpdate("zones") | 
| jcallahan@48 | 814 end | 
| jcallahan@48 | 815 | 
| jcallahan@48 | 816 | 
| jcallahan@97 | 817 function WDP:RecordQuote(event_name, message, source_name, language_name) | 
| jcallahan@112 | 818     if not ALLOWED_LOCALES[CLIENT_LOCALE] or not source_name or not name_to_id_map[source_name] or (language_name ~= "" and not languages_known[language_name]) then | 
| jcallahan@97 | 819         return | 
| jcallahan@95 | 820     end | 
| jcallahan@97 | 821     local npc = NPCEntry(name_to_id_map[source_name]) | 
| jcallahan@97 | 822     npc.quotes = npc.quotes or {} | 
| jcallahan@97 | 823     npc.quotes[event_name] = npc.quotes[event_name] or {} | 
| jcallahan@97 | 824     npc.quotes[event_name][ReplaceKeywords(message)] = true | 
| jcallahan@97 | 825 end | 
| jcallahan@95 | 826 | 
| jcallahan@95 | 827 | 
| jcallahan@95 | 828 do | 
| jcallahan@40 | 829     local SOBER_MATCH = _G.DRUNK_MESSAGE_ITEM_SELF1:gsub("%%s", ".+") | 
| jcallahan@40 | 830 | 
| jcallahan@40 | 831     local DRUNK_COMPARES = { | 
| jcallahan@40 | 832         _G.DRUNK_MESSAGE_SELF2, | 
| jcallahan@40 | 833         _G.DRUNK_MESSAGE_SELF3, | 
| jcallahan@40 | 834         _G.DRUNK_MESSAGE_SELF4, | 
| jcallahan@40 | 835     } | 
| jcallahan@40 | 836 | 
| jcallahan@40 | 837     local DRUNK_MATCHES = { | 
| jcallahan@40 | 838         _G.DRUNK_MESSAGE_SELF2:gsub("%%s", ".+"), | 
| jcallahan@40 | 839         _G.DRUNK_MESSAGE_SELF3:gsub("%%s", ".+"), | 
| jcallahan@40 | 840         _G.DRUNK_MESSAGE_SELF4:gsub("%%s", ".+"), | 
| jcallahan@40 | 841     } | 
| jcallahan@40 | 842 | 
| jcallahan@92 | 843     function WDP:CHAT_MSG_SYSTEM(event_name, message) | 
| jcallahan@40 | 844         if currently_drunk then | 
| jcallahan@40 | 845             if message == _G.DRUNK_MESSAGE_SELF1 or message:match(SOBER_MATCH) then | 
| jcallahan@40 | 846                 currently_drunk = nil | 
| jcallahan@40 | 847             end | 
| jcallahan@40 | 848             return | 
| jcallahan@40 | 849         end | 
| jcallahan@40 | 850 | 
| jcallahan@40 | 851         for index = 1, #DRUNK_MATCHES do | 
| jcallahan@40 | 852             if message == DRUNK_COMPARES[index] or message:match(DRUNK_MATCHES[index]) then | 
| jcallahan@40 | 853                 currently_drunk = true | 
| jcallahan@40 | 854                 break | 
| jcallahan@40 | 855             end | 
| jcallahan@40 | 856         end | 
| jcallahan@40 | 857     end | 
| jcallahan@40 | 858 end | 
| jcallahan@40 | 859 | 
| jcallahan@40 | 860 -- do-block | 
| jcallahan@40 | 861 | 
| jcallahan@40 | 862 do | 
| jcallahan@23 | 863     local FLAGS_NPC = bit.bor(_G.COMBATLOG_OBJECT_TYPE_GUARDIAN, _G.COMBATLOG_OBJECT_CONTROL_NPC) | 
| jcallahan@23 | 864     local FLAGS_NPC_CONTROL = bit.bor(_G.COMBATLOG_OBJECT_AFFILIATION_OUTSIDER, _G.COMBATLOG_OBJECT_CONTROL_NPC) | 
| jcallahan@23 | 865 | 
| jcallahan@23 | 866     local function RecordNPCSpell(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name) | 
| jcallahan@23 | 867         if not spell_id then | 
| jcallahan@23 | 868             return | 
| jcallahan@23 | 869         end | 
| jcallahan@34 | 870         local source_type, source_id = ParseGUID(source_guid) | 
| jcallahan@23 | 871 | 
| jcallahan@23 | 872         if not source_id or source_type ~= private.UNIT_TYPES.NPC then | 
| jcallahan@23 | 873             return | 
| jcallahan@23 | 874         end | 
| jcallahan@23 | 875 | 
| jcallahan@23 | 876         if bit.band(FLAGS_NPC_CONTROL, source_flags) == FLAGS_NPC_CONTROL and bit.band(FLAGS_NPC, source_flags) ~= 0 then | 
| jcallahan@29 | 877             local encounter_data = NPCEntry(source_id).encounter_data[InstanceDifficultyToken()] | 
| jcallahan@28 | 878             encounter_data.spells = encounter_data.spells or {} | 
| jcallahan@28 | 879             encounter_data.spells[spell_id] = (encounter_data.spells[spell_id] or 0) + 1 | 
| jcallahan@23 | 880         end | 
| jcallahan@23 | 881     end | 
| jcallahan@23 | 882 | 
| jcallahan@115 | 883     local HEAL_BATTLE_PETS_SPELL_ID = 125801 | 
| jcallahan@115 | 884 | 
| jcallahan@23 | 885     local COMBAT_LOG_FUNCS = { | 
| jcallahan@23 | 886         SPELL_AURA_APPLIED = RecordNPCSpell, | 
| jcallahan@23 | 887         SPELL_CAST_START = RecordNPCSpell, | 
| jcallahan@115 | 888         SPELL_CAST_SUCCESS = function(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name) | 
| jcallahan@115 | 889             if spell_id == HEAL_BATTLE_PETS_SPELL_ID then | 
| jcallahan@115 | 890                 local unit_type, unit_idnum = ParseGUID(source_guid) | 
| jcallahan@115 | 891 | 
| jcallahan@115 | 892                 if unit_type == private.UNIT_TYPES.NPC and unit_idnum then | 
| jcallahan@115 | 893                     NPCEntry(unit_idnum).stable_master = true | 
| jcallahan@115 | 894                 end | 
| jcallahan@115 | 895             end | 
| jcallahan@115 | 896             RecordNPCSpell(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name) | 
| jcallahan@115 | 897         end, | 
| jcallahan@65 | 898         UNIT_DIED = function(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name) | 
| jcallahan@65 | 899             local unit_type, unit_idnum = ParseGUID(dest_guid) | 
| jcallahan@65 | 900 | 
| jcallahan@65 | 901             if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 
| jcallahan@67 | 902                 reputation_npc_id = nil | 
| jcallahan@98 | 903                 private.harvesting = nil | 
| jcallahan@65 | 904                 return | 
| jcallahan@65 | 905             end | 
| jcallahan@67 | 906             reputation_npc_id = unit_idnum | 
| jcallahan@65 | 907         end, | 
| jcallahan@23 | 908     } | 
| jcallahan@23 | 909 | 
| jcallahan@23 | 910 | 
| jcallahan@92 | 911     function WDP:COMBAT_LOG_EVENT_UNFILTERED(event_name, time_stamp, sub_event, hide_caster, source_guid, source_name, source_flags, source_raid_flags, dest_guid, dest_name, dest_flags, dest_raid_flags, ...) | 
| jcallahan@23 | 912         local combat_log_func = COMBAT_LOG_FUNCS[sub_event] | 
| jcallahan@23 | 913 | 
| jcallahan@23 | 914         if not combat_log_func then | 
| jcallahan@23 | 915             return | 
| jcallahan@23 | 916         end | 
| jcallahan@23 | 917         combat_log_func(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, ...) | 
| jcallahan@23 | 918     end | 
| jcallahan@23 | 919 | 
| jcallahan@44 | 920     local DIPLOMACY_SPELL_ID = 20599 | 
| jcallahan@44 | 921     local MR_POP_RANK1_SPELL_ID = 78634 | 
| jcallahan@44 | 922     local MR_POP_RANK2_SPELL_ID = 78635 | 
| jcallahan@44 | 923 | 
| jcallahan@44 | 924     local REP_BUFFS = { | 
| jcallahan@44 | 925         [_G.GetSpellInfo(30754)] = "CENARION_FAVOR", | 
| jcallahan@44 | 926         [_G.GetSpellInfo(24705)] = "GRIM_VISAGE", | 
| jcallahan@44 | 927         [_G.GetSpellInfo(32098)] = "HONOR_HOLD_FAVOR", | 
| jcallahan@44 | 928         [_G.GetSpellInfo(39913)] = "NAZGRELS_FERVOR", | 
| jcallahan@44 | 929         [_G.GetSpellInfo(39953)] = "SONG_OF_BATTLE", | 
| jcallahan@44 | 930         [_G.GetSpellInfo(61849)] = "SPIRIT_OF_SHARING", | 
| jcallahan@44 | 931         [_G.GetSpellInfo(32096)] = "THRALLMARS_FAVOR", | 
| jcallahan@44 | 932         [_G.GetSpellInfo(39911)] = "TROLLBANES_COMMAND", | 
| jcallahan@44 | 933         [_G.GetSpellInfo(95987)] = "UNBURDENED", | 
| jcallahan@44 | 934         [_G.GetSpellInfo(100951)] = "WOW_ANNIVERSARY", | 
| jcallahan@44 | 935     } | 
| jcallahan@44 | 936 | 
| jcallahan@44 | 937 | 
| jcallahan@44 | 938     local FACTION_NAMES = { | 
| jcallahan@44 | 939         CENARION_CIRCLE = _G.GetFactionInfoByID(609), | 
| jcallahan@44 | 940         HONOR_HOLD = _G.GetFactionInfoByID(946), | 
| jcallahan@44 | 941         THE_SHATAR = _G.GetFactionInfoByID(935), | 
| jcallahan@44 | 942         THRALLMAR = _G.GetFactionInfoByID(947), | 
| jcallahan@44 | 943     } | 
| jcallahan@44 | 944 | 
| jcallahan@44 | 945 | 
| jcallahan@44 | 946     local MODIFIERS = { | 
| jcallahan@44 | 947         CENARION_FAVOR = { | 
| jcallahan@44 | 948             faction = FACTION_NAMES.CENARION_CIRCLE, | 
| jcallahan@44 | 949             modifier = 0.25, | 
| jcallahan@44 | 950         }, | 
| jcallahan@44 | 951         GRIM_VISAGE = { | 
| jcallahan@44 | 952             modifier = 0.1, | 
| jcallahan@44 | 953         }, | 
| jcallahan@44 | 954         HONOR_HOLD_FAVOR = { | 
| jcallahan@44 | 955             faction = FACTION_NAMES.HONOR_HOLD, | 
| jcallahan@44 | 956             modifier = 0.25, | 
| jcallahan@44 | 957         }, | 
| jcallahan@44 | 958         NAZGRELS_FERVOR = { | 
| jcallahan@44 | 959             faction = FACTION_NAMES.THRALLMAR, | 
| jcallahan@44 | 960             modifier = 0.1, | 
| jcallahan@44 | 961         }, | 
| jcallahan@44 | 962         SONG_OF_BATTLE = { | 
| jcallahan@44 | 963             faction = FACTION_NAMES.THE_SHATAR, | 
| jcallahan@44 | 964             modifier = 0.1, | 
| jcallahan@44 | 965         }, | 
| jcallahan@44 | 966         SPIRIT_OF_SHARING = { | 
| jcallahan@44 | 967             modifier = 0.1, | 
| jcallahan@44 | 968         }, | 
| jcallahan@44 | 969         THRALLMARS_FAVOR = { | 
| jcallahan@44 | 970             faction = FACTION_NAMES.THRALLMAR, | 
| jcallahan@44 | 971             modifier = 0.25, | 
| jcallahan@44 | 972         }, | 
| jcallahan@44 | 973         TROLLBANES_COMMAND = { | 
| jcallahan@44 | 974             faction = FACTION_NAMES.HONOR_HOLD, | 
| jcallahan@44 | 975             modifier = 0.1, | 
| jcallahan@44 | 976         }, | 
| jcallahan@44 | 977         UNBURDENED = { | 
| jcallahan@44 | 978             modifier = 0.1, | 
| jcallahan@44 | 979         }, | 
| jcallahan@44 | 980         WOW_ANNIVERSARY = { | 
| jcallahan@44 | 981             modifier = 0.08, | 
| jcallahan@44 | 982         } | 
| jcallahan@44 | 983     } | 
| jcallahan@44 | 984 | 
| jcallahan@44 | 985 | 
| jcallahan@92 | 986     function WDP:COMBAT_TEXT_UPDATE(event_name, message_type, faction_name, amount) | 
| jcallahan@67 | 987         if message_type ~= "FACTION" or not reputation_npc_id then | 
| jcallahan@44 | 988             return | 
| jcallahan@44 | 989         end | 
| jcallahan@44 | 990         UpdateFactionData() | 
| jcallahan@44 | 991 | 
| jcallahan@46 | 992         if not faction_name or not faction_standings[faction_name] then | 
| jcallahan@46 | 993             return | 
| jcallahan@46 | 994         end | 
| jcallahan@67 | 995         local npc = NPCEntry(reputation_npc_id) | 
| jcallahan@98 | 996         reputation_npc_id = nil | 
| jcallahan@46 | 997 | 
| jcallahan@44 | 998         if not npc then | 
| jcallahan@98 | 999             private.harvesting = nil | 
| jcallahan@44 | 1000             return | 
| jcallahan@44 | 1001         end | 
| jcallahan@98 | 1002         npc.harvested = private.harvesting | 
| jcallahan@98 | 1003         private.harvesting = nil | 
| jcallahan@98 | 1004 | 
| jcallahan@44 | 1005         local modifier = 1 | 
| jcallahan@44 | 1006 | 
| jcallahan@44 | 1007         if _G.IsSpellKnown(DIPLOMACY_SPELL_ID) then | 
| jcallahan@44 | 1008             modifier = modifier + 0.1 | 
| jcallahan@44 | 1009         end | 
| jcallahan@44 | 1010 | 
| jcallahan@44 | 1011         if _G.IsSpellKnown(MR_POP_RANK2_SPELL_ID) then | 
| jcallahan@44 | 1012             modifier = modifier + 0.1 | 
| jcallahan@44 | 1013         elseif _G.IsSpellKnown(MR_POP_RANK1_SPELL_ID) then | 
| jcallahan@44 | 1014             modifier = modifier + 0.05 | 
| jcallahan@44 | 1015         end | 
| jcallahan@44 | 1016 | 
| jcallahan@44 | 1017         for buff_name, buff_label in pairs(REP_BUFFS) do | 
| jcallahan@44 | 1018             if _G.UnitBuff("player", buff_name) then | 
| jcallahan@44 | 1019                 local modded_faction = MODIFIERS[buff_label].faction | 
| jcallahan@44 | 1020 | 
| jcallahan@44 | 1021                 if not modded_faction or faction_name == modded_faction then | 
| jcallahan@44 | 1022                     modifier = modifier + MODIFIERS[buff_label].modifier | 
| jcallahan@44 | 1023                 end | 
| jcallahan@44 | 1024             end | 
| jcallahan@44 | 1025         end | 
| jcallahan@65 | 1026         npc.reputations = npc.reputations or {} | 
| jcallahan@65 | 1027         npc.reputations[("%s:%s"):format(faction_name, faction_standings[faction_name])] = math.floor(amount / modifier) | 
| jcallahan@32 | 1028     end | 
| jcallahan@44 | 1029 end -- do-block | 
| jcallahan@18 | 1030 | 
| jcallahan@18 | 1031 | 
| jcallahan@92 | 1032 function WDP:ITEM_TEXT_BEGIN(event_name) | 
| jcallahan@42 | 1033     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc")) | 
| jcallahan@42 | 1034 | 
| jcallahan@42 | 1035     if not unit_idnum or unit_type ~= private.UNIT_TYPES.OBJECT or _G.UnitName("npc") ~= _G.ItemTextGetItem() then | 
| jcallahan@42 | 1036         return | 
| jcallahan@42 | 1037     end | 
| jcallahan@42 | 1038     UpdateDBEntryLocation("objects", unit_idnum) | 
| jcallahan@42 | 1039 end | 
| jcallahan@42 | 1040 | 
| jcallahan@42 | 1041 | 
| jcallahan@13 | 1042 do | 
| jcallahan@40 | 1043     local RE_GOLD = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)") | 
| jcallahan@40 | 1044     local RE_SILVER = _G.SILVER_AMOUNT:gsub("%%d", "(%%d+)") | 
| jcallahan@40 | 1045     local RE_COPPER = _G.COPPER_AMOUNT:gsub("%%d", "(%%d+)") | 
| jcallahan@13 | 1046 | 
| jcallahan@13 | 1047 | 
| jcallahan@13 | 1048     local function _moneyMatch(money, re) | 
| jcallahan@13 | 1049         return money:match(re) or 0 | 
| jcallahan@1 | 1050     end | 
| jcallahan@1 | 1051 | 
| jcallahan@0 | 1052 | 
| jcallahan@13 | 1053     local function _toCopper(money) | 
| jcallahan@13 | 1054         if not money then | 
| jcallahan@13 | 1055             return 0 | 
| jcallahan@13 | 1056         end | 
| jcallahan@40 | 1057         return _moneyMatch(money, RE_GOLD) * 10000 + _moneyMatch(money, RE_SILVER) * 100 + _moneyMatch(money, RE_COPPER) | 
| jcallahan@1 | 1058     end | 
| jcallahan@1 | 1059 | 
| jcallahan@1 | 1060 | 
| jcallahan@13 | 1061     local LOOT_VERIFY_FUNCS = { | 
| jcallahan@16 | 1062         [AF.ITEM] = function() | 
| jcallahan@16 | 1063             local locked_item_id | 
| jcallahan@16 | 1064 | 
| jcallahan@16 | 1065             for bag_index = 0, _G.NUM_BAG_FRAMES do | 
| jcallahan@16 | 1066                 for slot_index = 1, _G.GetContainerNumSlots(bag_index) do | 
| jcallahan@16 | 1067                     local _, _, is_locked = _G.GetContainerItemInfo(bag_index, slot_index) | 
| jcallahan@16 | 1068 | 
| jcallahan@16 | 1069                     if is_locked then | 
| jcallahan@16 | 1070                         locked_item_id = ItemLinkToID(_G.GetContainerItemLink(bag_index, slot_index)) | 
| jcallahan@16 | 1071                     end | 
| jcallahan@16 | 1072                 end | 
| jcallahan@16 | 1073             end | 
| jcallahan@16 | 1074 | 
| jcallahan@122 | 1075             if not locked_item_id or (current_action.identifier and current_action.identifier ~= locked_item_id) then | 
| jcallahan@16 | 1076                 return false | 
| jcallahan@16 | 1077             end | 
| jcallahan@122 | 1078             current_action.identifier = locked_item_id | 
| jcallahan@16 | 1079             return true | 
| jcallahan@16 | 1080         end, | 
| jcallahan@13 | 1081         [AF.NPC] = function() | 
| jcallahan@17 | 1082             if not _G.UnitExists("target") or _G.UnitIsFriend("player", "target") or _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then | 
| jcallahan@15 | 1083                 return false | 
| jcallahan@13 | 1084             end | 
| jcallahan@34 | 1085             local unit_type, id_num = ParseGUID(_G.UnitGUID("target")) | 
| jcallahan@122 | 1086             current_action.identifier = id_num | 
| jcallahan@13 | 1087             return true | 
| jcallahan@13 | 1088         end, | 
| jcallahan@14 | 1089         [AF.OBJECT] = true, | 
| jcallahan@17 | 1090         [AF.ZONE] = function() | 
| jcallahan@38 | 1091             return _G.IsFishingLoot() | 
| jcallahan@17 | 1092         end, | 
| jcallahan@13 | 1093     } | 
| jcallahan@13 | 1094 | 
| jcallahan@13 | 1095 | 
| jcallahan@13 | 1096     local LOOT_UPDATE_FUNCS = { | 
| jcallahan@16 | 1097         [AF.ITEM] = function() | 
| jcallahan@28 | 1098             GenericLootUpdate("items") | 
| jcallahan@28 | 1099         end, | 
| jcallahan@28 | 1100         [AF.NPC] = function() | 
| jcallahan@75 | 1101             local difficulty_token = InstanceDifficultyToken() | 
| jcallahan@132 | 1102             local loot_type = current_loot.label | 
| jcallahan@77 | 1103             local source_list = {} | 
| jcallahan@75 | 1104 | 
| jcallahan@131 | 1105             for source_guid, loot_data in pairs(current_loot.sources) do | 
| jcallahan@78 | 1106                 local source_id = select(2, ParseGUID(source_guid)) | 
| jcallahan@75 | 1107                 local npc = NPCEntry(source_id) | 
| jcallahan@75 | 1108 | 
| jcallahan@75 | 1109                 if npc then | 
| jcallahan@75 | 1110                     local encounter_data = npc.encounter_data[difficulty_token] | 
| jcallahan@75 | 1111                     encounter_data[loot_type] = encounter_data[loot_type] or {} | 
| jcallahan@75 | 1112 | 
| jcallahan@78 | 1113                     if not source_list[source_guid] then | 
| jcallahan@77 | 1114                         encounter_data.loot_counts = encounter_data.loot_counts or {} | 
| jcallahan@77 | 1115                         encounter_data.loot_counts[loot_type] = (encounter_data.loot_counts[loot_type] or 0) + 1 | 
| jcallahan@77 | 1116                         source_list[source_id] = true | 
| jcallahan@77 | 1117                     end | 
| jcallahan@77 | 1118 | 
| jcallahan@75 | 1119                     for item_id, quantity in pairs(loot_data) do | 
| jcallahan@75 | 1120                         table.insert(encounter_data[loot_type], ("%d:%d"):format(item_id, quantity)) | 
| jcallahan@75 | 1121                     end | 
| jcallahan@75 | 1122                 end | 
| jcallahan@75 | 1123             end | 
| jcallahan@75 | 1124 | 
| jcallahan@75 | 1125             -- TODO: Remove this when GetLootSourceInfo() has values for money | 
| jcallahan@131 | 1126             if #current_loot.list <= 0 then | 
| jcallahan@79 | 1127                 return | 
| jcallahan@79 | 1128             end | 
| jcallahan@131 | 1129             local npc = NPCEntry(current_loot.identifier) | 
| jcallahan@28 | 1130 | 
| jcallahan@28 | 1131             if not npc then | 
| jcallahan@28 | 1132                 return | 
| jcallahan@28 | 1133             end | 
| jcallahan@75 | 1134             local encounter_data = npc.encounter_data[difficulty_token] | 
| jcallahan@29 | 1135             encounter_data[loot_type] = encounter_data[loot_type] or {} | 
| jcallahan@16 | 1136 | 
| jcallahan@131 | 1137             if not source_list[current_loot.identifier] then | 
| jcallahan@77 | 1138                 encounter_data.loot_counts = encounter_data.loot_counts or {} | 
| jcallahan@77 | 1139                 encounter_data.loot_counts[loot_type] = (encounter_data.loot_counts[loot_type] or 0) + 1 | 
| jcallahan@77 | 1140             end | 
| jcallahan@77 | 1141 | 
| jcallahan@131 | 1142             for index = 1, #current_loot.list do | 
| jcallahan@131 | 1143                 table.insert(encounter_data[loot_type], current_loot.list[index]) | 
| jcallahan@16 | 1144             end | 
| jcallahan@16 | 1145         end, | 
| jcallahan@13 | 1146         [AF.OBJECT] = function() | 
| jcallahan@28 | 1147             GenericLootUpdate("objects", InstanceDifficultyToken()) | 
| jcallahan@17 | 1148         end, | 
| jcallahan@17 | 1149         [AF.ZONE] = function() | 
| jcallahan@131 | 1150             local location_token = ("%s:%s:%s"):format(current_loot.map_level, current_loot.x, current_loot.y) | 
| jcallahan@41 | 1151 | 
| jcallahan@41 | 1152             -- This will start life as a boolean true. | 
| jcallahan@131 | 1153             if _G.type(current_loot.zone_data[location_token]) ~= "table" then | 
| jcallahan@131 | 1154                 current_loot.zone_data[location_token] = { | 
| jcallahan@41 | 1155                     drops = {} | 
| jcallahan@41 | 1156                 } | 
| jcallahan@41 | 1157             end | 
| jcallahan@132 | 1158             local loot_count = ("%s_count"):format(current_loot.label) | 
| jcallahan@131 | 1159             current_loot.zone_data[location_token][loot_count] = (current_loot.zone_data[location_token][loot_count] or 0) + 1 | 
| jcallahan@41 | 1160 | 
| jcallahan@131 | 1161             if current_loot.sources then | 
| jcallahan@131 | 1162                 for source_guid, loot_data in pairs(current_loot.sources) do | 
| jcallahan@131 | 1163                     for item_id, quantity in pairs(loot_data) do | 
| jcallahan@131 | 1164                         table.insert(current_loot.zone_data[location_token].drops, ("%d:%d"):format(item_id, quantity)) | 
| jcallahan@131 | 1165                     end | 
| jcallahan@131 | 1166                 end | 
| jcallahan@131 | 1167             end | 
| jcallahan@131 | 1168 | 
| jcallahan@131 | 1169             if #current_loot.list <= 0 then | 
| jcallahan@131 | 1170                 return | 
| jcallahan@131 | 1171             end | 
| jcallahan@131 | 1172 | 
| jcallahan@131 | 1173             for index = 1, #current_loot.list do | 
| jcallahan@131 | 1174                 table.insert(current_loot.zone_data[location_token].drops, current_loot.loot_list[index]) | 
| jcallahan@41 | 1175             end | 
| jcallahan@13 | 1176         end, | 
| jcallahan@13 | 1177     } | 
| jcallahan@13 | 1178 | 
| jcallahan@79 | 1179     -- Prevent opening the same loot window multiple times from recording data multiple times. | 
| jcallahan@79 | 1180     local loot_guid_registry = {} | 
| jcallahan@124 | 1181 | 
| jcallahan@124 | 1182 | 
| jcallahan@124 | 1183     function WDP:LOOT_CLOSED(event_name) | 
| jcallahan@131 | 1184         current_loot = nil | 
| jcallahan@131 | 1185         table.wipe(current_action) | 
| jcallahan@124 | 1186     end | 
| jcallahan@124 | 1187 | 
| jcallahan@13 | 1188 | 
| jcallahan@92 | 1189     function WDP:LOOT_OPENED(event_name) | 
| jcallahan@132 | 1190         if current_loot then | 
| jcallahan@18 | 1191             return | 
| jcallahan@18 | 1192         end | 
| jcallahan@132 | 1193         current_action.target_type = current_action.target_type or AF.NPC | 
| jcallahan@132 | 1194 | 
| jcallahan@123 | 1195         local verify_func = LOOT_VERIFY_FUNCS[current_action.target_type] | 
| jcallahan@123 | 1196         local update_func = LOOT_UPDATE_FUNCS[current_action.target_type] | 
| jcallahan@13 | 1197 | 
| jcallahan@14 | 1198         if not verify_func or not update_func then | 
| jcallahan@13 | 1199             return | 
| jcallahan@13 | 1200         end | 
| jcallahan@13 | 1201 | 
| jcallahan@14 | 1202         if _G.type(verify_func) == "function" and not verify_func() then | 
| jcallahan@14 | 1203             return | 
| jcallahan@14 | 1204         end | 
| jcallahan@80 | 1205         local guids_used = {} | 
| jcallahan@132 | 1206 | 
| jcallahan@131 | 1207         current_loot = { | 
| jcallahan@131 | 1208             list = {}, | 
| jcallahan@131 | 1209             sources = {}, | 
| jcallahan@131 | 1210             identifier = current_action.identifier, | 
| jcallahan@132 | 1211             label = current_action.loot_label or "drops", | 
| jcallahan@131 | 1212             map_level = current_action.map_level, | 
| jcallahan@131 | 1213             object_name = current_action.object_name, | 
| jcallahan@131 | 1214             spell_label = current_action.spell_label, | 
| jcallahan@131 | 1215             target_type = current_action.target_type, | 
| jcallahan@131 | 1216             x = current_action.x, | 
| jcallahan@131 | 1217             y = current_action.y, | 
| jcallahan@131 | 1218             zone_data = current_action.zone_data, | 
| jcallahan@131 | 1219         } | 
| jcallahan@131 | 1220         table.wipe(current_action) | 
| jcallahan@13 | 1221 | 
| jcallahan@55 | 1222         for loot_slot = 1, _G.GetNumLootItems() do | 
| jcallahan@55 | 1223             local icon_texture, item_text, quantity, quality, locked = _G.GetLootSlotInfo(loot_slot) | 
| jcallahan@55 | 1224             local slot_type = _G.GetLootSlotType(loot_slot) | 
| jcallahan@13 | 1225 | 
| jcallahan@77 | 1226             -- TODO: Move LOOT_SLOT_X checks within loop when money is detectable via GetLootSourceInfo | 
| jcallahan@77 | 1227             if slot_type == _G.LOOT_SLOT_ITEM then | 
| jcallahan@78 | 1228                 local loot_info = { | 
| jcallahan@77 | 1229                     _G.GetLootSourceInfo(loot_slot) | 
| jcallahan@77 | 1230                 } | 
| jcallahan@75 | 1231 | 
| jcallahan@77 | 1232                 -- Odd index is GUID, even is count. | 
| jcallahan@78 | 1233                 for loot_index = 1, #loot_info, 2 do | 
| jcallahan@78 | 1234                     local source_guid = loot_info[loot_index] | 
| jcallahan@77 | 1235 | 
| jcallahan@79 | 1236                     if not loot_guid_registry[source_guid] then | 
| jcallahan@79 | 1237                         local loot_quantity = loot_info[loot_index + 1] | 
| jcallahan@79 | 1238                         local source_type, source_id = ParseGUID(source_guid) | 
| jcallahan@79 | 1239                         -- TODO: Remove debugging | 
| jcallahan@133 | 1240                         --                        local source_key = ("%s:%d"):format(private.UNIT_TYPE_NAMES[source_type + 1], source_id) | 
| jcallahan@133 | 1241                         --                        print(("GUID: %s - Type:ID: %s - Amount: %d"):format(loot_info[loot_index], source_key, loot_quantity)) | 
| jcallahan@79 | 1242 | 
| jcallahan@79 | 1243                         local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) | 
| jcallahan@131 | 1244                         current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} | 
| jcallahan@131 | 1245                         current_loot.sources[source_guid][item_id] = current_loot.sources[source_guid][item_id] or 0 + loot_quantity | 
| jcallahan@80 | 1246                         guids_used[source_guid] = true | 
| jcallahan@79 | 1247                     end | 
| jcallahan@75 | 1248                 end | 
| jcallahan@82 | 1249                 --            elseif slot_type == _G.LOOT_SLOT_MONEY then | 
| jcallahan@122 | 1250                 --                table.insert(current_action.loot_list, ("money:%d"):format(_toCopper(item_text))) | 
| jcallahan@77 | 1251             elseif slot_type == _G.LOOT_SLOT_CURRENCY then | 
| jcallahan@131 | 1252                 table.insert(current_loot.list, ("currency:%d:%s"):format(quantity, icon_texture:match("[^\\]+$"):lower())) | 
| jcallahan@13 | 1253             end | 
| jcallahan@13 | 1254         end | 
| jcallahan@80 | 1255 | 
| jcallahan@81 | 1256         for guid in pairs(guids_used) do | 
| jcallahan@80 | 1257             loot_guid_registry[guid] = true | 
| jcallahan@80 | 1258         end | 
| jcallahan@13 | 1259         update_func() | 
| jcallahan@1 | 1260     end | 
| jcallahan@13 | 1261 end -- do-block | 
| jcallahan@0 | 1262 | 
| jcallahan@0 | 1263 | 
| jcallahan@89 | 1264 function WDP:MAIL_SHOW(event_name) | 
| jcallahan@89 | 1265     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc")) | 
| jcallahan@89 | 1266 | 
| jcallahan@89 | 1267     if not unit_idnum or unit_type ~= private.UNIT_TYPES.OBJECT then | 
| jcallahan@89 | 1268         return | 
| jcallahan@89 | 1269     end | 
| jcallahan@89 | 1270     UpdateDBEntryLocation("objects", unit_idnum) | 
| jcallahan@89 | 1271 end | 
| jcallahan@89 | 1272 | 
| jcallahan@89 | 1273 | 
| jcallahan@44 | 1274 do | 
| jcallahan@44 | 1275     local POINT_MATCH_PATTERNS = { | 
| jcallahan@44 | 1276         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING:gsub("%%d", "(%%d+)")), -- May no longer be necessary | 
| jcallahan@44 | 1277         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3:gsub("%%d", "(%%d+)")), -- May no longer be necessary | 
| jcallahan@44 | 1278         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_5V5:gsub("%%d", "(%%d+)")), -- May no longer be necessary | 
| jcallahan@44 | 1279         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_BG:gsub("%%d", "(%%d+)")), | 
| jcallahan@44 | 1280         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3_BG:gsub("%%d", "(%%d+)")), | 
| jcallahan@44 | 1281     } | 
| jcallahan@5 | 1282 | 
| jcallahan@68 | 1283     local ITEM_REQ_REPUTATION_MATCH = "Requires (.-) %- (.*)" | 
| jcallahan@87 | 1284     local ITEM_REQ_QUEST_MATCH1 = "Requires: .*" | 
| jcallahan@87 | 1285     local ITEM_REQ_QUEST_MATCH2 = "Must have completed: .*" | 
| jcallahan@68 | 1286 | 
| jcallahan@133 | 1287     local current_merchant | 
| jcallahan@133 | 1288     local merchant_standing | 
| jcallahan@133 | 1289 | 
| jcallahan@133 | 1290     function WDP:MERCHANT_CLOSED(event_name) | 
| jcallahan@133 | 1291         current_merchant = nil | 
| jcallahan@133 | 1292         merchant_standing = nil | 
| jcallahan@133 | 1293     end | 
| jcallahan@133 | 1294 | 
| jcallahan@133 | 1295 | 
| jcallahan@89 | 1296     function WDP:UpdateMerchantItems(event_name) | 
| jcallahan@133 | 1297         if not current_merchant then | 
| jcallahan@133 | 1298             local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("target")) | 
| jcallahan@4 | 1299 | 
| jcallahan@133 | 1300             if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 
| jcallahan@133 | 1301                 return | 
| jcallahan@133 | 1302             end | 
| jcallahan@133 | 1303             merchant_standing = select(2, UnitFactionStanding("target")) | 
| jcallahan@133 | 1304             current_merchant = NPCEntry(unit_idnum) | 
| jcallahan@133 | 1305             current_merchant.sells = current_merchant.sells or {} | 
| jcallahan@44 | 1306         end | 
| jcallahan@133 | 1307         local num_items = _G.GetMerchantNumItems() | 
| jcallahan@55 | 1308         local current_filters = _G.GetMerchantFilter() | 
| jcallahan@57 | 1309         _G.SetMerchantFilter(_G.LE_LOOT_FILTER_ALL) | 
| jcallahan@57 | 1310         _G.MerchantFrame_Update() | 
| jcallahan@57 | 1311 | 
| jcallahan@44 | 1312         for item_index = 1, num_items do | 
| jcallahan@44 | 1313             local _, _, copper_price, stack_size, num_available, _, extended_cost = _G.GetMerchantItemInfo(item_index) | 
| jcallahan@44 | 1314             local item_id = ItemLinkToID(_G.GetMerchantItemLink(item_index)) | 
| jcallahan@5 | 1315 | 
| jcallahan@44 | 1316             if item_id and item_id > 0 then | 
| jcallahan@44 | 1317                 local price_string = ActualCopperCost(copper_price, merchant_standing) | 
| jcallahan@5 | 1318 | 
| jcallahan@68 | 1319                 DatamineTT:ClearLines() | 
| jcallahan@68 | 1320                 DatamineTT:SetMerchantItem(item_index) | 
| jcallahan@68 | 1321 | 
| jcallahan@68 | 1322                 local num_lines = DatamineTT:NumLines() | 
| jcallahan@68 | 1323 | 
| jcallahan@68 | 1324                 for line_index = 1, num_lines do | 
| jcallahan@68 | 1325                     local current_line = _G["WDPDatamineTTTextLeft" .. line_index] | 
| jcallahan@68 | 1326 | 
| jcallahan@68 | 1327                     if not current_line then | 
| jcallahan@68 | 1328                         break | 
| jcallahan@68 | 1329                     end | 
| jcallahan@68 | 1330                     local faction, reputation = current_line:GetText():match(ITEM_REQ_REPUTATION_MATCH) | 
| jcallahan@68 | 1331 | 
| jcallahan@68 | 1332                     if faction or reputation then | 
| jcallahan@68 | 1333                         DBEntry("items", item_id).req_reputation = ("%s:%s"):format(faction:gsub("-", ""), reputation:upper()) | 
| jcallahan@68 | 1334                         break | 
| jcallahan@68 | 1335                     end | 
| jcallahan@68 | 1336                 end | 
| jcallahan@68 | 1337 | 
| jcallahan@87 | 1338                 for line_index = 1, num_lines do | 
| jcallahan@87 | 1339                     local current_line = _G["WDPDatamineTTTextLeft" .. line_index] | 
| jcallahan@87 | 1340 | 
| jcallahan@87 | 1341                     if not current_line then | 
| jcallahan@87 | 1342                         break | 
| jcallahan@87 | 1343                     end | 
| jcallahan@87 | 1344                     local line_text = current_line:GetText() | 
| jcallahan@87 | 1345                     local quest_name = line_text:match(ITEM_REQ_QUEST_MATCH1) or line_text:match(ITEM_REQ_QUEST_MATCH2) | 
| jcallahan@87 | 1346 | 
| jcallahan@87 | 1347                     if quest_name then | 
| jcallahan@87 | 1348                         DBEntry("items", item_id).req_quest = ("%s"):format(quest_name:gsub("(.+): ", ""), quest_name) | 
| jcallahan@87 | 1349                         break | 
| jcallahan@87 | 1350                     end | 
| jcallahan@87 | 1351                 end | 
| jcallahan@87 | 1352 | 
| jcallahan@44 | 1353                 if extended_cost then | 
| jcallahan@53 | 1354                     local battleground_rating = 0 | 
| jcallahan@53 | 1355                     local personal_rating = 0 | 
| jcallahan@53 | 1356                     local required_season_amount | 
| jcallahan@5 | 1357 | 
| jcallahan@68 | 1358                     for line_index = 1, num_lines do | 
| jcallahan@44 | 1359                         local current_line = _G["WDPDatamineTTTextLeft" .. line_index] | 
| jcallahan@5 | 1360 | 
| jcallahan@44 | 1361                         if not current_line then | 
| jcallahan@44 | 1362                             break | 
| jcallahan@44 | 1363                         end | 
| jcallahan@53 | 1364                         required_season_amount = current_line:GetText():match("Requires earning a total of (%d+)\n(.-) for the season.") | 
| jcallahan@5 | 1365 | 
| jcallahan@44 | 1366                         for match_index = 1, #POINT_MATCH_PATTERNS do | 
| jcallahan@44 | 1367                             local match1, match2 = current_line:GetText():match(POINT_MATCH_PATTERNS[match_index]) | 
| jcallahan@53 | 1368                             personal_rating = personal_rating + (match1 or 0) | 
| jcallahan@53 | 1369                             battleground_rating = battleground_rating + (match2 or 0) | 
| jcallahan@5 | 1370 | 
| jcallahan@44 | 1371                             if match1 or match2 then | 
| jcallahan@44 | 1372                                 break | 
| jcallahan@44 | 1373                             end | 
| jcallahan@44 | 1374                         end | 
| jcallahan@5 | 1375                     end | 
| jcallahan@44 | 1376                     local currency_list = {} | 
| jcallahan@44 | 1377                     local item_count = _G.GetMerchantItemCostInfo(item_index) | 
| jcallahan@50 | 1378 | 
| jcallahan@50 | 1379                     -- Keeping this around in case Blizzard makes the two points diverge at some point. | 
| jcallahan@53 | 1380                     --                    price_string = ("%s:%s:%s:%s"):format(price_string, battleground_rating, personal_rating, required_season_amount or 0) | 
| jcallahan@53 | 1381                     price_string = ("%s:%s:%s"):format(price_string, personal_rating, required_season_amount or 0) | 
| jcallahan@5 | 1382 | 
| jcallahan@44 | 1383                     for cost_index = 1, item_count do | 
| jcallahan@44 | 1384                         local icon_texture, amount_required, currency_link = _G.GetMerchantItemCostItem(item_index, cost_index) | 
| jcallahan@44 | 1385                         local currency_id = currency_link and ItemLinkToID(currency_link) or nil | 
| jcallahan@44 | 1386 | 
| jcallahan@44 | 1387                         if (not currency_id or currency_id < 1) and icon_texture then | 
| jcallahan@44 | 1388                             currency_id = icon_texture:match("[^\\]+$"):lower() | 
| jcallahan@44 | 1389                         end | 
| jcallahan@44 | 1390 | 
| jcallahan@44 | 1391                         if currency_id then | 
| jcallahan@44 | 1392                             currency_list[#currency_list + 1] = ("(%s:%s)"):format(amount_required, currency_id) | 
| jcallahan@44 | 1393                         end | 
| jcallahan@44 | 1394                     end | 
| jcallahan@44 | 1395 | 
| jcallahan@44 | 1396                     for currency_index = 1, #currency_list do | 
| jcallahan@44 | 1397                         price_string = ("%s:%s"):format(price_string, currency_list[currency_index]) | 
| jcallahan@5 | 1398                     end | 
| jcallahan@5 | 1399                 end | 
| jcallahan@133 | 1400                 current_merchant.sells[item_id] = ("%s:%s:[%s]"):format(num_available, stack_size, price_string) | 
| jcallahan@44 | 1401             end | 
| jcallahan@44 | 1402         end | 
| jcallahan@5 | 1403 | 
| jcallahan@44 | 1404         if _G.CanMerchantRepair() then | 
| jcallahan@133 | 1405             current_merchant.can_repair = true | 
| jcallahan@5 | 1406         end | 
| jcallahan@57 | 1407         _G.SetMerchantFilter(current_filters) | 
| jcallahan@57 | 1408         _G.MerchantFrame_Update() | 
| jcallahan@4 | 1409     end | 
| jcallahan@44 | 1410 end -- do-block | 
| jcallahan@4 | 1411 | 
| jcallahan@89 | 1412 | 
| jcallahan@92 | 1413 function WDP:PET_BAR_UPDATE(event_name) | 
| jcallahan@122 | 1414     if current_action.spell_label ~= "MIND_CONTROL" then | 
| jcallahan@25 | 1415         return | 
| jcallahan@25 | 1416     end | 
| jcallahan@34 | 1417     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("pet")) | 
| jcallahan@25 | 1418 | 
| jcallahan@25 | 1419     if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 
| jcallahan@25 | 1420         return | 
| jcallahan@25 | 1421     end | 
| jcallahan@29 | 1422     NPCEntry(unit_idnum).mind_control = true | 
| jcallahan@122 | 1423     table.wipe(current_action) | 
| jcallahan@25 | 1424 end | 
| jcallahan@25 | 1425 | 
| jcallahan@25 | 1426 | 
| jcallahan@115 | 1427 function WDP:PET_JOURNAL_LIST_UPDATE(event_name) | 
| jcallahan@115 | 1428     local num_pets = LPJ:NumPets() | 
| jcallahan@115 | 1429 | 
| jcallahan@115 | 1430     for index, pet_id in LPJ:IteratePetIDs() do | 
| jcallahan@115 | 1431         local _, _, is_owned, _, level, _, _, name, icon, pet_type, npc_id, _, _, is_wild = _G.C_PetJournal.GetPetInfoByIndex(index) | 
| jcallahan@115 | 1432 | 
| jcallahan@115 | 1433         if is_owned then | 
| jcallahan@115 | 1434             local health, max_health, attack, speed, rarity = _G.C_PetJournal.GetPetStats(pet_id) | 
| jcallahan@115 | 1435 | 
| jcallahan@139 | 1436             if rarity then | 
| jcallahan@139 | 1437                 local rarity_name = _G["BATTLE_PET_BREED_QUALITY" .. rarity] | 
| jcallahan@139 | 1438                 local npc = NPCEntry(npc_id) | 
| jcallahan@139 | 1439                 npc.wild_pet = is_wild or nil | 
| jcallahan@139 | 1440                 npc.battle_pet_data = npc.battle_pet_data or {} | 
| jcallahan@139 | 1441                 npc.battle_pet_data[rarity_name] = npc.battle_pet_data[rarity_name] or {} | 
| jcallahan@139 | 1442                 npc.battle_pet_data[rarity_name]["level_" .. level] = npc.battle_pet_data[rarity_name]["level_" .. level] or {} | 
| jcallahan@139 | 1443 | 
| jcallahan@139 | 1444                 local data = npc.battle_pet_data[rarity_name]["level_" .. level] | 
| jcallahan@139 | 1445                 data.max_health = max_health | 
| jcallahan@139 | 1446                 data.attack = attack | 
| jcallahan@139 | 1447                 data.speed = speed | 
| jcallahan@139 | 1448             end | 
| jcallahan@115 | 1449         end | 
| jcallahan@115 | 1450     end | 
| jcallahan@115 | 1451 end | 
| jcallahan@115 | 1452 | 
| jcallahan@115 | 1453 | 
| jcallahan@118 | 1454 function WDP:PLAYER_TARGET_CHANGED(event_name) | 
| jcallahan@118 | 1455     if not PlayerTarget() then | 
| jcallahan@118 | 1456         return | 
| jcallahan@2 | 1457     end | 
| jcallahan@118 | 1458     self:UpdateTargetLocation() | 
| jcallahan@118 | 1459 end | 
| jcallahan@2 | 1460 | 
| jcallahan@89 | 1461 | 
| jcallahan@12 | 1462 do | 
| jcallahan@12 | 1463     local function UpdateQuestJuncture(point) | 
| jcallahan@12 | 1464         local unit_name = _G.UnitName("questnpc") | 
| jcallahan@9 | 1465 | 
| jcallahan@12 | 1466         if not unit_name then | 
| jcallahan@12 | 1467             return | 
| jcallahan@12 | 1468         end | 
| jcallahan@34 | 1469         local unit_type, unit_id = ParseGUID(_G.UnitGUID("questnpc")) | 
| jcallahan@9 | 1470 | 
| jcallahan@12 | 1471         if unit_type == private.UNIT_TYPES.OBJECT then | 
| jcallahan@38 | 1472             UpdateDBEntryLocation("objects", unit_id) | 
| jcallahan@12 | 1473         end | 
| jcallahan@19 | 1474         local quest = DBEntry("quests", _G.GetQuestID()) | 
| jcallahan@12 | 1475         quest[point] = quest[point] or {} | 
| jcallahan@12 | 1476         quest[point][("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type + 1], unit_id)] = true | 
| jcallahan@24 | 1477 | 
| jcallahan@24 | 1478         return quest | 
| jcallahan@12 | 1479     end | 
| jcallahan@10 | 1480 | 
| jcallahan@12 | 1481 | 
| jcallahan@92 | 1482     function WDP:QUEST_COMPLETE(event_name) | 
| jcallahan@97 | 1483         local quest = UpdateQuestJuncture("end") | 
| jcallahan@97 | 1484 | 
| jcallahan@112 | 1485         if ALLOWED_LOCALES[CLIENT_LOCALE] then | 
| jcallahan@112 | 1486             quest.reward_text = ReplaceKeywords(_G.GetRewardText()) | 
| jcallahan@112 | 1487         end | 
| jcallahan@67 | 1488         -- Make sure the quest NPC isn't erroneously recorded as giving reputation for quests which award it. | 
| jcallahan@67 | 1489         reputation_npc_id = nil | 
| jcallahan@10 | 1490     end | 
| jcallahan@10 | 1491 | 
| jcallahan@12 | 1492 | 
| jcallahan@92 | 1493     function WDP:QUEST_DETAIL(event_name) | 
| jcallahan@24 | 1494         local quest = UpdateQuestJuncture("begin") | 
| jcallahan@24 | 1495 | 
| jcallahan@46 | 1496         if not quest then | 
| jcallahan@46 | 1497             return | 
| jcallahan@46 | 1498         end | 
| jcallahan@24 | 1499         quest.classes = quest.classes or {} | 
| jcallahan@27 | 1500         quest.classes[PLAYER_CLASS] = true | 
| jcallahan@24 | 1501 | 
| jcallahan@24 | 1502         quest.races = quest.races or {} | 
| jcallahan@100 | 1503         quest.races[(PLAYER_RACE == "Pandaren") and ("%s_%s"):format(PLAYER_RACE, PLAYER_FACTION or "Neutral") or PLAYER_RACE] = true | 
| jcallahan@10 | 1504     end | 
| jcallahan@12 | 1505 end -- do-block | 
| jcallahan@9 | 1506 | 
| jcallahan@9 | 1507 | 
| jcallahan@92 | 1508 function WDP:QUEST_LOG_UPDATE(event_name) | 
| jcallahan@38 | 1509     local selected_quest = _G.GetQuestLogSelection() -- Save current selection to be restored when we're done. | 
| jcallahan@36 | 1510     local entry_index, processed_quests = 1, 0 | 
| jcallahan@36 | 1511     local _, num_quests = _G.GetNumQuestLogEntries() | 
| jcallahan@36 | 1512 | 
| jcallahan@36 | 1513     while processed_quests <= num_quests do | 
| jcallahan@36 | 1514         local _, _, _, _, is_header, _, _, _, quest_id = _G.GetQuestLogTitle(entry_index) | 
| jcallahan@36 | 1515 | 
| jcallahan@84 | 1516         if quest_id == 0 then | 
| jcallahan@84 | 1517             processed_quests = processed_quests + 1 | 
| jcallahan@84 | 1518         elseif not is_header then | 
| jcallahan@36 | 1519             _G.SelectQuestLogEntry(entry_index); | 
| jcallahan@36 | 1520 | 
| jcallahan@36 | 1521             local quest = DBEntry("quests", quest_id) | 
| jcallahan@36 | 1522             quest.timer = _G.GetQuestLogTimeLeft() | 
| jcallahan@37 | 1523             quest.can_share = _G.GetQuestLogPushable() and true or nil | 
| jcallahan@36 | 1524             processed_quests = processed_quests + 1 | 
| jcallahan@36 | 1525         end | 
| jcallahan@36 | 1526         entry_index = entry_index + 1 | 
| jcallahan@36 | 1527     end | 
| jcallahan@36 | 1528     _G.SelectQuestLogEntry(selected_quest) | 
| jcallahan@4 | 1529     self:UnregisterEvent("QUEST_LOG_UPDATE") | 
| jcallahan@4 | 1530 end | 
| jcallahan@4 | 1531 | 
| jcallahan@4 | 1532 | 
| jcallahan@97 | 1533 function WDP:QUEST_PROGRESS(event_name) | 
| jcallahan@112 | 1534     if not ALLOWED_LOCALES[CLIENT_LOCALE] then | 
| jcallahan@112 | 1535         return | 
| jcallahan@112 | 1536     end | 
| jcallahan@97 | 1537     DBEntry("quests", _G.GetQuestID()).progress_text = ReplaceKeywords(_G.GetProgressText()) | 
| jcallahan@97 | 1538 end | 
| jcallahan@97 | 1539 | 
| jcallahan@97 | 1540 | 
| jcallahan@92 | 1541 function WDP:UNIT_QUEST_LOG_CHANGED(event_name, unit_id) | 
| jcallahan@4 | 1542     if unit_id ~= "player" then | 
| jcallahan@4 | 1543         return | 
| jcallahan@4 | 1544     end | 
| jcallahan@4 | 1545     self:RegisterEvent("QUEST_LOG_UPDATE") | 
| jcallahan@4 | 1546 end | 
| jcallahan@4 | 1547 | 
| jcallahan@4 | 1548 | 
| jcallahan@92 | 1549 do | 
| jcallahan@92 | 1550     local TRADESKILL_TOOLS = { | 
| jcallahan@92 | 1551         Anvil = anvil_spell_ids, | 
| jcallahan@92 | 1552         Forge = forge_spell_ids, | 
| jcallahan@92 | 1553     } | 
| jcallahan@92 | 1554 | 
| jcallahan@92 | 1555 | 
| jcallahan@92 | 1556     function WDP:TRADE_SKILL_SHOW(event_name) | 
| jcallahan@92 | 1557         local profession_name, prof_level = _G.GetTradeSkillLine() | 
| jcallahan@92 | 1558 | 
| jcallahan@92 | 1559         if profession_name == _G.UNKNOWN then | 
| jcallahan@92 | 1560             return | 
| jcallahan@92 | 1561         end | 
| jcallahan@92 | 1562 | 
| jcallahan@92 | 1563         if _G.TradeSkillFrame and _G.TradeSkillFrame:IsVisible() then | 
| jcallahan@92 | 1564             -- Clear the search box focus so the scan will have correct results. | 
| jcallahan@92 | 1565             local search_box = _G.TradeSkillFrameSearchBox | 
| jcallahan@92 | 1566             search_box:SetText("") | 
| jcallahan@92 | 1567             _G.TradeSkillSearch_OnTextChanged(search_box) | 
| jcallahan@92 | 1568             search_box:ClearFocus() | 
| jcallahan@92 | 1569             search_box:GetScript("OnEditFocusLost")(search_box) | 
| jcallahan@92 | 1570         end | 
| jcallahan@92 | 1571         local header_list = {} | 
| jcallahan@92 | 1572 | 
| jcallahan@92 | 1573         -- Save the current state of the TradeSkillFrame so it can be restored after we muck with it. | 
| jcallahan@92 | 1574         local have_materials = _G.TradeSkillFrame.filterTbl.hasMaterials | 
| jcallahan@92 | 1575         local have_skillup = _G.TradeSkillFrame.filterTbl.hasSkillUp | 
| jcallahan@92 | 1576 | 
| jcallahan@92 | 1577         if have_materials then | 
| jcallahan@92 | 1578             _G.TradeSkillFrame.filterTbl.hasMaterials = false | 
| jcallahan@92 | 1579             _G.TradeSkillOnlyShowMakeable(false) | 
| jcallahan@92 | 1580         end | 
| jcallahan@92 | 1581 | 
| jcallahan@92 | 1582         if have_skillup then | 
| jcallahan@92 | 1583             _G.TradeSkillFrame.filterTbl.hasSkillUp = false | 
| jcallahan@92 | 1584             _G.TradeSkillOnlyShowSkillUps(false) | 
| jcallahan@92 | 1585         end | 
| jcallahan@92 | 1586         _G.SetTradeSkillInvSlotFilter(0, 1, 1) | 
| jcallahan@92 | 1587         _G.TradeSkillUpdateFilterBar() | 
| jcallahan@92 | 1588         _G.TradeSkillFrame_Update() | 
| jcallahan@92 | 1589 | 
| jcallahan@92 | 1590         -- Expand all headers so we can see all the recipes there are | 
| jcallahan@92 | 1591         for tradeskill_index = 1, _G.GetNumTradeSkills() do | 
| jcallahan@92 | 1592             local name, tradeskill_type, _, is_expanded = _G.GetTradeSkillInfo(tradeskill_index) | 
| jcallahan@92 | 1593 | 
| jcallahan@94 | 1594             if tradeskill_type == "header" or tradeskill_type == "subheader" then | 
| jcallahan@92 | 1595                 if not is_expanded then | 
| jcallahan@92 | 1596                     header_list[name] = true | 
| jcallahan@92 | 1597                     _G.ExpandTradeSkillSubClass(tradeskill_index) | 
| jcallahan@92 | 1598                 end | 
| jcallahan@92 | 1599             else | 
| jcallahan@92 | 1600                 local spell_id = tonumber(_G.GetTradeSkillRecipeLink(tradeskill_index):match("^|c%x%x%x%x%x%x%x%x|H%w+:(%d+)")) | 
| jcallahan@92 | 1601                 local required_tool = _G.GetTradeSkillTools(tradeskill_index) | 
| jcallahan@92 | 1602 | 
| jcallahan@92 | 1603                 if required_tool then | 
| jcallahan@92 | 1604                     for tool_name, registry in pairs(TRADESKILL_TOOLS) do | 
| jcallahan@92 | 1605                         if required_tool:find(tool_name) then | 
| jcallahan@92 | 1606                             registry[spell_id] = true | 
| jcallahan@92 | 1607                         end | 
| jcallahan@92 | 1608                     end | 
| jcallahan@92 | 1609                 end | 
| jcallahan@92 | 1610             end | 
| jcallahan@92 | 1611         end | 
| jcallahan@92 | 1612 | 
| jcallahan@92 | 1613         -- Restore the state of the things we changed. | 
| jcallahan@92 | 1614         for tradeskill_index = 1, _G.GetNumTradeSkills() do | 
| jcallahan@92 | 1615             local name, tradeskill_type, _, is_expanded = _G.GetTradeSkillInfo(tradeskill_index) | 
| jcallahan@92 | 1616 | 
| jcallahan@92 | 1617             if header_list[name] then | 
| jcallahan@92 | 1618                 _G.CollapseTradeSkillSubClass(tradeskill_index) | 
| jcallahan@92 | 1619             end | 
| jcallahan@92 | 1620         end | 
| jcallahan@92 | 1621         _G.TradeSkillFrame.filterTbl.hasMaterials = have_materials | 
| jcallahan@92 | 1622         _G.TradeSkillOnlyShowMakeable(have_materials) | 
| jcallahan@92 | 1623         _G.TradeSkillFrame.filterTbl.hasSkillUp = have_skillup | 
| jcallahan@92 | 1624         _G.TradeSkillOnlyShowSkillUps(have_skillup) | 
| jcallahan@92 | 1625 | 
| jcallahan@92 | 1626         _G.TradeSkillUpdateFilterBar() | 
| jcallahan@92 | 1627         _G.TradeSkillFrame_Update() | 
| jcallahan@92 | 1628     end | 
| jcallahan@92 | 1629 end -- do-block | 
| jcallahan@92 | 1630 | 
| jcallahan@92 | 1631 | 
| jcallahan@92 | 1632 function WDP:TRAINER_SHOW(event_name) | 
| jcallahan@34 | 1633     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("target")) | 
| jcallahan@29 | 1634     local npc = NPCEntry(unit_idnum) | 
| jcallahan@58 | 1635 | 
| jcallahan@58 | 1636     if not npc then | 
| jcallahan@58 | 1637         return | 
| jcallahan@58 | 1638     end | 
| jcallahan@27 | 1639     npc.teaches = npc.teaches or {} | 
| jcallahan@27 | 1640 | 
| jcallahan@27 | 1641     -- Get the initial trainer filters | 
| jcallahan@27 | 1642     local available = _G.GetTrainerServiceTypeFilter("available") | 
| jcallahan@27 | 1643     local unavailable = _G.GetTrainerServiceTypeFilter("unavailable") | 
| jcallahan@27 | 1644     local used = _G.GetTrainerServiceTypeFilter("used") | 
| jcallahan@27 | 1645 | 
| jcallahan@27 | 1646     -- Clear the trainer filters | 
| jcallahan@27 | 1647     _G.SetTrainerServiceTypeFilter("available", 1) | 
| jcallahan@27 | 1648     _G.SetTrainerServiceTypeFilter("unavailable", 1) | 
| jcallahan@27 | 1649     _G.SetTrainerServiceTypeFilter("used", 1) | 
| jcallahan@27 | 1650 | 
| jcallahan@27 | 1651     for index = 1, _G.GetNumTrainerServices(), 1 do | 
| jcallahan@27 | 1652         local spell_name, rank_name, _, _, required_level = _G.GetTrainerServiceInfo(index) | 
| jcallahan@27 | 1653 | 
| jcallahan@27 | 1654         if spell_name then | 
| jcallahan@27 | 1655             DatamineTT:ClearLines() | 
| jcallahan@27 | 1656             DatamineTT:SetTrainerService(index) | 
| jcallahan@27 | 1657 | 
| jcallahan@27 | 1658             local _, _, spell_id = DatamineTT:GetSpell() | 
| jcallahan@27 | 1659 | 
| jcallahan@43 | 1660             if spell_id then | 
| jcallahan@43 | 1661                 local profession, min_skill = _G.GetTrainerServiceSkillReq(index) | 
| jcallahan@43 | 1662                 profession = profession or "General" | 
| jcallahan@43 | 1663 | 
| jcallahan@43 | 1664                 local class_professions = npc.teaches[PLAYER_CLASS] | 
| jcallahan@43 | 1665                 if not class_professions then | 
| jcallahan@43 | 1666                     npc.teaches[PLAYER_CLASS] = {} | 
| jcallahan@43 | 1667                     class_professions = npc.teaches[PLAYER_CLASS] | 
| jcallahan@43 | 1668                 end | 
| jcallahan@43 | 1669 | 
| jcallahan@43 | 1670                 local profession_skills = class_professions[profession] | 
| jcallahan@43 | 1671                 if not profession_skills then | 
| jcallahan@43 | 1672                     class_professions[profession] = {} | 
| jcallahan@43 | 1673                     profession_skills = class_professions[profession] | 
| jcallahan@43 | 1674                 end | 
| jcallahan@43 | 1675                 profession_skills[spell_id] = ("%d:%d"):format(required_level, min_skill) | 
| jcallahan@27 | 1676             end | 
| jcallahan@27 | 1677         end | 
| jcallahan@27 | 1678     end | 
| jcallahan@27 | 1679     -- Reset the filters to what they were before | 
| jcallahan@27 | 1680     _G.SetTrainerServiceTypeFilter("available", available or 0) | 
| jcallahan@27 | 1681     _G.SetTrainerServiceTypeFilter("unavailable", unavailable or 0) | 
| jcallahan@27 | 1682     _G.SetTrainerServiceTypeFilter("used", used or 0) | 
| jcallahan@27 | 1683 end | 
| jcallahan@27 | 1684 | 
| jcallahan@27 | 1685 | 
| jcallahan@1 | 1686 function WDP:UNIT_SPELLCAST_SENT(event_name, unit_id, spell_name, spell_rank, target_name, spell_line) | 
| jcallahan@1 | 1687     if private.tracked_line or unit_id ~= "player" then | 
| jcallahan@1 | 1688         return | 
| jcallahan@1 | 1689     end | 
| jcallahan@1 | 1690     local spell_label = private.SPELL_LABELS_BY_NAME[spell_name] | 
| jcallahan@1 | 1691 | 
| jcallahan@1 | 1692     if not spell_label then | 
| jcallahan@1 | 1693         return | 
| jcallahan@1 | 1694     end | 
| jcallahan@122 | 1695     table.wipe(current_action) | 
| jcallahan@1 | 1696 | 
| jcallahan@1 | 1697     local tt_item_name, tt_item_link = _G.GameTooltip:GetItem() | 
| jcallahan@1 | 1698     local tt_unit_name, tt_unit_id = _G.GameTooltip:GetUnit() | 
| jcallahan@1 | 1699 | 
| jcallahan@1 | 1700     if not tt_unit_name and _G.UnitName("target") == target_name then | 
| jcallahan@1 | 1701         tt_unit_name = target_name | 
| jcallahan@1 | 1702         tt_unit_id = "target" | 
| jcallahan@1 | 1703     end | 
| jcallahan@1 | 1704     local spell_flags = private.SPELL_FLAGS_BY_LABEL[spell_label] | 
| jcallahan@28 | 1705     local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() | 
| jcallahan@28 | 1706 | 
| jcallahan@122 | 1707     current_action.instance_token = instance_token | 
| jcallahan@122 | 1708     current_action.map_level = map_level | 
| jcallahan@122 | 1709     current_action.x = x | 
| jcallahan@122 | 1710     current_action.y = y | 
| jcallahan@122 | 1711     current_action.zone_data = ("%s:%d"):format(zone_name, area_id) | 
| jcallahan@122 | 1712     current_action.spell_label = spell_label | 
| jcallahan@105 | 1713 | 
| jcallahan@105 | 1714     if not private.NON_LOOT_SPELL_LABELS[spell_label] then | 
| jcallahan@122 | 1715         current_action.loot_label = spell_label:lower() | 
| jcallahan@105 | 1716     end | 
| jcallahan@1 | 1717 | 
| jcallahan@16 | 1718     if tt_unit_name and not tt_item_name then | 
| jcallahan@16 | 1719         if bit.band(spell_flags, AF.NPC) == AF.NPC then | 
| jcallahan@16 | 1720             if not tt_unit_id or tt_unit_name ~= target_name then | 
| jcallahan@16 | 1721                 return | 
| jcallahan@16 | 1722             end | 
| jcallahan@123 | 1723             current_action.target_type = AF.NPC | 
| jcallahan@16 | 1724         end | 
| jcallahan@16 | 1725     elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then | 
| jcallahan@123 | 1726         current_action.target_type = AF.ITEM | 
| jcallahan@16 | 1727 | 
| jcallahan@16 | 1728         if tt_item_name and tt_item_name == target_name then | 
| jcallahan@122 | 1729             current_action.identifier = ItemLinkToID(tt_item_link) | 
| jcallahan@16 | 1730         elseif target_name and target_name ~= "" then | 
| jcallahan@16 | 1731             local _, target_item_link = _G.GetItemInfo(target_name) | 
| jcallahan@122 | 1732             current_action.identifier = ItemLinkToID(target_item_link) | 
| jcallahan@16 | 1733         end | 
| jcallahan@16 | 1734     elseif not tt_item_name and not tt_unit_name then | 
| jcallahan@1 | 1735         if bit.band(spell_flags, AF.OBJECT) == AF.OBJECT then | 
| jcallahan@17 | 1736             if target_name == "" then | 
| jcallahan@17 | 1737                 return | 
| jcallahan@17 | 1738             end | 
| jcallahan@122 | 1739             current_action.object_name = target_name | 
| jcallahan@123 | 1740             current_action.target_type = AF.OBJECT | 
| jcallahan@1 | 1741         elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then | 
| jcallahan@38 | 1742             local identifier = ("%s:%s"):format(spell_label, _G["GameTooltipTextLeft1"]:GetText() or "NONE") -- Possible fishing pool name. | 
| jcallahan@122 | 1743             current_action.zone_data = UpdateDBEntryLocation("zones", identifier) | 
| jcallahan@123 | 1744             current_action.target_type = AF.ZONE | 
| jcallahan@122 | 1745             current_action.identifier = identifier | 
| jcallahan@1 | 1746         end | 
| jcallahan@1 | 1747     end | 
| jcallahan@1 | 1748     private.tracked_line = spell_line | 
| jcallahan@0 | 1749 end | 
| jcallahan@0 | 1750 | 
| jcallahan@94 | 1751 | 
| jcallahan@1 | 1752 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) | 
| jcallahan@1 | 1753     if unit_id ~= "player" then | 
| jcallahan@1 | 1754         return | 
| jcallahan@1 | 1755     end | 
| jcallahan@1 | 1756     private.tracked_line = nil | 
| jcallahan@85 | 1757 | 
| jcallahan@86 | 1758     if spell_name:match("^Harvest.+") then | 
| jcallahan@86 | 1759         reputation_npc_id = current_target_id | 
| jcallahan@98 | 1760         private.harvesting = true | 
| jcallahan@85 | 1761     end | 
| jcallahan@92 | 1762 | 
| jcallahan@92 | 1763     if anvil_spell_ids[spell_id] then | 
| jcallahan@92 | 1764         UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL) | 
| jcallahan@92 | 1765     elseif forge_spell_ids[spell_id] then | 
| jcallahan@92 | 1766         UpdateDBEntryLocation("objects", OBJECT_ID_FORGE) | 
| jcallahan@92 | 1767     end | 
| jcallahan@0 | 1768 end | 
| jcallahan@0 | 1769 | 
| jcallahan@90 | 1770 | 
| jcallahan@1 | 1771 function WDP:HandleSpellFailure(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) | 
| jcallahan@1 | 1772     if unit_id ~= "player" then | 
| jcallahan@1 | 1773         return | 
| jcallahan@1 | 1774     end | 
| jcallahan@0 | 1775 | 
| jcallahan@1 | 1776     if private.tracked_line == spell_line then | 
| jcallahan@1 | 1777         private.tracked_line = nil | 
| jcallahan@122 | 1778         table.wipe(current_action) | 
| jcallahan@1 | 1779     end | 
| jcallahan@0 | 1780 end | 
| jcallahan@90 | 1781 | 
| jcallahan@90 | 1782 | 
| jcallahan@90 | 1783 do | 
| jcallahan@90 | 1784     local function SetUnitField(field, required_type) | 
| jcallahan@90 | 1785         local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc")) | 
| jcallahan@90 | 1786 | 
| jcallahan@90 | 1787         if not unit_idnum or (required_type and unit_type ~= required_type) then | 
| jcallahan@90 | 1788             return | 
| jcallahan@90 | 1789         end | 
| jcallahan@90 | 1790 | 
| jcallahan@90 | 1791         if unit_type == private.UNIT_TYPES.NPC then | 
| jcallahan@90 | 1792             NPCEntry(unit_idnum)[field] = true | 
| jcallahan@90 | 1793         elseif unit_type == private.UNIT_TYPES.OBJECT then | 
| jcallahan@90 | 1794             DBEntry("objects", unit_idnum)[field] = true | 
| jcallahan@93 | 1795             UpdateDBEntryLocation("objects", unit_idnum) | 
| jcallahan@90 | 1796         end | 
| jcallahan@90 | 1797     end | 
| jcallahan@90 | 1798 | 
| jcallahan@90 | 1799 | 
| jcallahan@90 | 1800     function WDP:AUCTION_HOUSE_SHOW(event_name) | 
| jcallahan@90 | 1801         SetUnitField("auctioneer", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1802     end | 
| jcallahan@90 | 1803 | 
| jcallahan@90 | 1804 | 
| jcallahan@90 | 1805     function WDP:BANKFRAME_OPENED(event_name) | 
| jcallahan@90 | 1806         SetUnitField("banker", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1807     end | 
| jcallahan@90 | 1808 | 
| jcallahan@90 | 1809 | 
| jcallahan@90 | 1810     function WDP:BATTLEFIELDS_SHOW(event_name) | 
| jcallahan@90 | 1811         SetUnitField("battlemaster", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1812     end | 
| jcallahan@90 | 1813 | 
| jcallahan@90 | 1814 | 
| jcallahan@92 | 1815     function WDP:FORGE_MASTER_OPENED(event_name) | 
| jcallahan@90 | 1816         SetUnitField("arcane_reforger", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1817     end | 
| jcallahan@90 | 1818 | 
| jcallahan@90 | 1819 | 
| jcallahan@92 | 1820     function WDP:GOSSIP_SHOW(event_name) | 
| jcallahan@90 | 1821         local gossip_options = { _G.GetGossipOptions() } | 
| jcallahan@90 | 1822 | 
| jcallahan@90 | 1823         for index = 2, #gossip_options, 2 do | 
| jcallahan@90 | 1824             if gossip_options[index] == "binder" then | 
| jcallahan@90 | 1825                 SetUnitField("innkeeper", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1826                 return | 
| jcallahan@90 | 1827             end | 
| jcallahan@90 | 1828         end | 
| jcallahan@90 | 1829     end | 
| jcallahan@90 | 1830 | 
| jcallahan@90 | 1831 | 
| jcallahan@93 | 1832     function WDP:GUILDBANKFRAME_OPENED(event_name) | 
| jcallahan@93 | 1833         SetUnitField("guild_bank", private.UNIT_TYPES.OBJECT) | 
| jcallahan@93 | 1834     end | 
| jcallahan@93 | 1835 | 
| jcallahan@93 | 1836 | 
| jcallahan@90 | 1837     function WDP:TAXIMAP_OPENED(event_name) | 
| jcallahan@90 | 1838         SetUnitField("flight_master", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1839     end | 
| jcallahan@90 | 1840 | 
| jcallahan@90 | 1841 | 
| jcallahan@90 | 1842     function WDP:TRANSMOGRIFY_OPEN(event_name) | 
| jcallahan@90 | 1843         SetUnitField("transmogrifier", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1844     end | 
| jcallahan@90 | 1845 | 
| jcallahan@90 | 1846 | 
| jcallahan@90 | 1847     function WDP:VOID_STORAGE_OPEN(event_name) | 
| jcallahan@90 | 1848         SetUnitField("void_storage", private.UNIT_TYPES.NPC) | 
| jcallahan@90 | 1849     end | 
| jcallahan@90 | 1850 end -- do-block |