annotate Main.lua @ 9:796bf179557a

Actually record currency drops.
author James D. Callahan III <jcallahan@curse.com>
date Mon, 30 Apr 2012 15:42:28 -0500
parents 1b4111ac80c6
children 94bc939c2ca6
rev   line source
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@0 13
jcallahan@0 14 -----------------------------------------------------------------------
jcallahan@0 15 -- AddOn namespace.
jcallahan@0 16 -----------------------------------------------------------------------
jcallahan@0 17 local ADDON_NAME, private = ...
jcallahan@0 18
jcallahan@0 19 local LibStub = _G.LibStub
jcallahan@0 20 local WDP = LibStub("AceAddon-3.0"):NewAddon(ADDON_NAME, "AceEvent-3.0", "AceTimer-3.0")
jcallahan@0 21
jcallahan@4 22 local DatamineTT = _G.CreateFrame("GameTooltip", "WDPDatamineTT", _G.UIParent, "GameTooltipTemplate")
jcallahan@5 23 DatamineTT:SetOwner(_G.WorldFrame, "ANCHOR_NONE")
jcallahan@5 24
jcallahan@0 25
jcallahan@0 26 -----------------------------------------------------------------------
jcallahan@0 27 -- Local constants.
jcallahan@0 28 -----------------------------------------------------------------------
jcallahan@0 29 local DATABASE_DEFAULTS = {
jcallahan@0 30 global = {
jcallahan@0 31 items = {},
jcallahan@0 32 npcs = {},
jcallahan@0 33 objects = {},
jcallahan@0 34 quests = {},
jcallahan@0 35 }
jcallahan@0 36 }
jcallahan@0 37
jcallahan@0 38
jcallahan@1 39 local EVENT_MAPPING = {
jcallahan@1 40 LOOT_OPENED = true,
jcallahan@7 41 MERCHANT_SHOW = "UpdateMerchantItems",
jcallahan@7 42 MERCHANT_UPDATE = "UpdateMerchantItems",
jcallahan@2 43 PLAYER_TARGET_CHANGED = true,
jcallahan@9 44 QUEST_COMPLETE = true,
jcallahan@9 45 QUEST_DETAIL = true,
jcallahan@9 46 QUEST_LOG_UPDATE = true,
jcallahan@9 47 QUEST_PROGRESS = true,
jcallahan@4 48 UNIT_QUEST_LOG_CHANGED = true,
jcallahan@1 49 UNIT_SPELLCAST_FAILED = "HandleSpellFailure",
jcallahan@1 50 UNIT_SPELLCAST_FAILED_QUIET = "HandleSpellFailure",
jcallahan@1 51 UNIT_SPELLCAST_INTERRUPTED = "HandleSpellFailure",
jcallahan@1 52 UNIT_SPELLCAST_SENT = true,
jcallahan@1 53 UNIT_SPELLCAST_SUCCEEDED = true,
jcallahan@0 54 }
jcallahan@0 55
jcallahan@4 56
jcallahan@1 57 local AF = private.ACTION_TYPE_FLAGS
jcallahan@0 58
jcallahan@4 59
jcallahan@0 60 -----------------------------------------------------------------------
jcallahan@0 61 -- Local variables.
jcallahan@0 62 -----------------------------------------------------------------------
jcallahan@0 63 local db
jcallahan@0 64 local durability_timer_handle
jcallahan@2 65 local target_location_timer_handle
jcallahan@1 66 local action_data = {}
jcallahan@0 67
jcallahan@1 68
jcallahan@1 69 -----------------------------------------------------------------------
jcallahan@1 70 -- Helper Functions.
jcallahan@1 71 -----------------------------------------------------------------------
jcallahan@6 72 local function NPCEntry(id_num)
jcallahan@6 73 if not id_num then
jcallahan@6 74 return
jcallahan@6 75 end
jcallahan@6 76 local npc = db.npcs[id_num]
jcallahan@6 77
jcallahan@6 78 if not npc then
jcallahan@6 79 db.npcs[id_num] = {}
jcallahan@6 80 npc = db.npcs[id_num]
jcallahan@6 81 end
jcallahan@6 82 return npc
jcallahan@6 83 end
jcallahan@6 84
jcallahan@6 85
jcallahan@1 86 local function CurrentLocationData()
jcallahan@1 87 local map_level = _G.GetCurrentMapDungeonLevel() or 0
jcallahan@1 88 local x, y = _G.GetPlayerMapPosition("player")
jcallahan@1 89
jcallahan@1 90 x = x or 0
jcallahan@1 91 y = y or 0
jcallahan@1 92
jcallahan@1 93 if x == 0 and y == 0 then
jcallahan@1 94 for level_index = 1, _G.GetNumDungeonMapLevels() do
jcallahan@1 95 _G.SetDungeonMapLevel(level_index)
jcallahan@1 96 x, y = _G.GetPlayerMapPosition("player")
jcallahan@1 97
jcallahan@1 98 if x and y and (x > 0 or y > 0) then
jcallahan@1 99 _G.SetDungeonMapLevel(map_level)
jcallahan@1 100 map_level = level_index
jcallahan@1 101 break
jcallahan@1 102 end
jcallahan@1 103 end
jcallahan@1 104 end
jcallahan@1 105
jcallahan@1 106 if _G.DungeonUsesTerrainMap() then
jcallahan@1 107 map_level = map_level - 1
jcallahan@1 108 end
jcallahan@8 109 local _, instance_type = _G.IsInInstance()
jcallahan@8 110 return _G.GetRealZoneText(), ("%.2f"):format(x * 100), ("%.2f"):format(y * 100), map_level or 0, instance_type:upper()
jcallahan@1 111 end
jcallahan@1 112
jcallahan@1 113
jcallahan@1 114 local function ItemLinkToID(item_link)
jcallahan@1 115 if not item_link then
jcallahan@1 116 return
jcallahan@1 117 end
jcallahan@7 118 return tonumber(item_link:match("item:(%d+)"))
jcallahan@1 119 end
jcallahan@0 120
jcallahan@4 121
jcallahan@4 122 do
jcallahan@4 123 local UNIT_TYPE_BITMASK = 0x007
jcallahan@4 124
jcallahan@4 125 function WDP:ParseGUID(guid)
jcallahan@5 126 if not guid then
jcallahan@5 127 return
jcallahan@5 128 end
jcallahan@4 129 local types = private.UNIT_TYPES
jcallahan@4 130 local unit_type = _G.bit.band(tonumber(guid:sub(1, 5)), UNIT_TYPE_BITMASK)
jcallahan@4 131
jcallahan@4 132 if unit_type ~= types.PLAYER or unit_type ~= types.OBJECT or unit_type ~= types.PET then
jcallahan@4 133 return unit_type, tonumber(guid:sub(-12, -9), 16)
jcallahan@4 134 end
jcallahan@4 135
jcallahan@4 136 return unit_type
jcallahan@4 137 end
jcallahan@4 138 end -- do-block
jcallahan@4 139
jcallahan@4 140
jcallahan@0 141 -----------------------------------------------------------------------
jcallahan@0 142 -- Methods.
jcallahan@0 143 -----------------------------------------------------------------------
jcallahan@0 144 function WDP:OnInitialize()
jcallahan@0 145 db = LibStub("AceDB-3.0"):New("WoWDBProfilerData", DATABASE_DEFAULTS, "Default").global
jcallahan@0 146 end
jcallahan@0 147
jcallahan@0 148
jcallahan@0 149 function WDP:OnEnable()
jcallahan@0 150 for event_name, mapping in pairs(EVENT_MAPPING) do
jcallahan@1 151 self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil)
jcallahan@0 152 end
jcallahan@0 153 durability_timer_handle = self:ScheduleRepeatingTimer("ProcessDurability", 30)
jcallahan@2 154 target_location_timer_handle = self:ScheduleRepeatingTimer("UpdateTargetLocation", 0.2)
jcallahan@0 155 end
jcallahan@0 156
jcallahan@0 157
jcallahan@0 158 local function RecordDurability(item_id, durability)
jcallahan@0 159 if not durability or durability <= 0 then
jcallahan@0 160 return
jcallahan@0 161 end
jcallahan@0 162
jcallahan@0 163 if not db.items[item_id] then
jcallahan@0 164 db.items[item_id] = {}
jcallahan@0 165 end
jcallahan@0 166 db.items[item_id].durability = durability
jcallahan@0 167 end
jcallahan@0 168
jcallahan@0 169
jcallahan@0 170 function WDP:ProcessDurability()
jcallahan@0 171 for slot_index = 0, _G.INVSLOT_LAST_EQUIPPED do
jcallahan@1 172 local item_id = _G.GetInventoryItemID("player", slot_index)
jcallahan@0 173
jcallahan@0 174 if item_id and item_id > 0 then
jcallahan@1 175 local _, max_durability = _G.GetInventoryItemDurability(slot_index)
jcallahan@0 176 RecordDurability(item_id, max_durability)
jcallahan@0 177 end
jcallahan@0 178 end
jcallahan@0 179
jcallahan@0 180 for bag_index = 0, _G.NUM_BAG_SLOTS do
jcallahan@0 181 for slot_index = 1, _G.GetContainerNumSlots(bag_index) do
jcallahan@1 182 local item_id = _G.GetContainerItemID(bag_index, slot_index)
jcallahan@0 183
jcallahan@0 184 if item_id and item_id > 0 then
jcallahan@1 185 local _, max_durability = _G.GetContainerItemDurability(bag_index, slot_index)
jcallahan@0 186 RecordDurability(item_id, max_durability)
jcallahan@0 187 end
jcallahan@0 188 end
jcallahan@0 189 end
jcallahan@0 190 end
jcallahan@0 191
jcallahan@0 192
jcallahan@2 193 function WDP:UpdateTargetLocation()
jcallahan@2 194 if not _G.UnitExists("target") or _G.UnitPlayerControlled("target") or _G.UnitIsTapped("target") then
jcallahan@2 195 return
jcallahan@2 196 end
jcallahan@2 197
jcallahan@2 198 for index = 1, 4 do
jcallahan@2 199 if not _G.CheckInteractDistance("target", index) then
jcallahan@2 200 return
jcallahan@2 201 end
jcallahan@2 202 end
jcallahan@2 203
jcallahan@2 204 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target"))
jcallahan@2 205
jcallahan@2 206 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then
jcallahan@2 207 return
jcallahan@2 208 end
jcallahan@8 209 local zone_name, x, y, map_level, instance_type = CurrentLocationData()
jcallahan@6 210 local npc_data = NPCEntry(unit_idnum).stats[("level_%d"):format(_G.UnitLevel("target"))]
jcallahan@6 211 npc_data.locations = npc_data.locations or {}
jcallahan@2 212
jcallahan@2 213 if not npc_data.locations[zone_name] then
jcallahan@2 214 npc_data.locations[zone_name] = {}
jcallahan@2 215 end
jcallahan@8 216 npc_data.locations[zone_name][("%s:%s:%s:%s"):format(instance_type, map_level, x, y)] = true
jcallahan@2 217 end
jcallahan@2 218
jcallahan@2 219
jcallahan@0 220 -----------------------------------------------------------------------
jcallahan@0 221 -- Event handlers.
jcallahan@0 222 -----------------------------------------------------------------------
jcallahan@1 223 local re_gold = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)")
jcallahan@1 224 local re_silver = _G.SILVER_AMOUNT:gsub("%%d", "(%%d+)")
jcallahan@1 225 local re_copper = _G.COPPER_AMOUNT:gsub("%%d", "(%%d+)")
jcallahan@1 226
jcallahan@1 227
jcallahan@1 228 local function _moneyMatch(money, re)
jcallahan@1 229 return money:match(re) or 0
jcallahan@0 230 end
jcallahan@0 231
jcallahan@0 232
jcallahan@1 233 local function _toCopper(money)
jcallahan@1 234 if not money then
jcallahan@1 235 return 0
jcallahan@1 236 end
jcallahan@1 237
jcallahan@1 238 return _moneyMatch(money, re_gold) * 10000 + _moneyMatch(money, re_silver) * 100 + _moneyMatch(money, re_copper)
jcallahan@0 239 end
jcallahan@0 240
jcallahan@0 241
jcallahan@1 242 local LOOT_VERIFY_FUNCS = {
jcallahan@1 243 [AF.NPC] = function()
jcallahan@1 244 local fishing_loot = _G.IsFishingLoot()
jcallahan@1 245
jcallahan@1 246 if not fishing_loot and _G.UnitExists("target") and not _G.UnitIsFriend("player", "target") and _G.UnitIsDead("target") then
jcallahan@1 247 if _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then
jcallahan@1 248 return false
jcallahan@1 249 end
jcallahan@1 250 local unit_type, id_num = WDP:ParseGUID(_G.UnitGUID("target"))
jcallahan@1 251 action_data.id_num = id_num
jcallahan@1 252 end
jcallahan@1 253 return true
jcallahan@1 254 end,
jcallahan@1 255 }
jcallahan@1 256
jcallahan@4 257
jcallahan@1 258 local LOOT_UPDATE_FUNCS = {
jcallahan@1 259 [AF.NPC] = function()
jcallahan@6 260 local npc = NPCEntry(action_data.id_num)
jcallahan@1 261 npc.drops = npc.drops or {}
jcallahan@1 262
jcallahan@1 263 for index = 1, #action_data.drops do
jcallahan@1 264 table.insert(npc.drops, action_data.drops[index])
jcallahan@1 265 end
jcallahan@1 266 end,
jcallahan@1 267 }
jcallahan@1 268
jcallahan@1 269
jcallahan@1 270 function WDP:LOOT_OPENED()
jcallahan@1 271 if not action_data.type then
jcallahan@1 272 action_data.type = AF.NPC
jcallahan@1 273 end
jcallahan@1 274 local verify_func = LOOT_VERIFY_FUNCS[action_data.type]
jcallahan@2 275 local update_func = LOOT_UPDATE_FUNCS[action_data.type]
jcallahan@1 276
jcallahan@1 277 if not verify_func or not update_func or not verify_func() then
jcallahan@1 278 return
jcallahan@1 279 end
jcallahan@1 280
jcallahan@1 281 local loot_registry = {}
jcallahan@1 282 action_data.drops = {}
jcallahan@1 283
jcallahan@1 284 for loot_slot = 1, _G.GetNumLootItems() do
jcallahan@9 285 local icon_texture, item_text, quantity, quality, locked = _G.GetLootSlotInfo(loot_slot)
jcallahan@1 286
jcallahan@1 287 if _G.LootSlotIsItem(loot_slot) then
jcallahan@1 288 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot))
jcallahan@1 289 loot_registry[item_id] = (loot_registry[item_id]) or 0 + quantity
jcallahan@1 290 elseif _G.LootSlotIsCoin(loot_slot) then
jcallahan@9 291 table.insert(action_data.drops, ("money:%d"):format(_toCopper(item_text)))
jcallahan@1 292 elseif _G.LootSlotIsCurrency(loot_slot) then
jcallahan@9 293 table.insert(action_data.drops, ("currency:%d:%s"):format(quantity, icon_texture:match("[^\\]+$"):lower()))
jcallahan@1 294 end
jcallahan@1 295 end
jcallahan@1 296
jcallahan@1 297 for item_id, quantity in pairs(loot_registry) do
jcallahan@1 298 table.insert(action_data.drops, ("%d:%d"):format(item_id, quantity))
jcallahan@1 299 end
jcallahan@1 300 update_func()
jcallahan@0 301 end
jcallahan@0 302
jcallahan@0 303
jcallahan@5 304 local POINT_MATCH_PATTERNS = {
jcallahan@5 305 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING:gsub("%%d", "(%%d+)")), -- May no longer be necessary
jcallahan@5 306 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3:gsub("%%d", "(%%d+)")), -- May no longer be necessary
jcallahan@5 307 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_5V5:gsub("%%d", "(%%d+)")), -- May no longer be necessary
jcallahan@5 308 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_BG:gsub("%%d", "(%%d+)")),
jcallahan@5 309 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3_BG:gsub("%%d", "(%%d+)")),
jcallahan@5 310 }
jcallahan@5 311
jcallahan@5 312
jcallahan@7 313 function WDP:UpdateMerchantItems()
jcallahan@4 314 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target"))
jcallahan@4 315
jcallahan@4 316 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then
jcallahan@4 317 return
jcallahan@4 318 end
jcallahan@6 319 local merchant = NPCEntry(unit_idnum)
jcallahan@6 320 merchant.sells = merchant.sells or {}
jcallahan@5 321
jcallahan@5 322 for item_index = 1, _G.GetMerchantNumItems() do
jcallahan@5 323 local _, _, copper_price, stack_size, num_available, _, extended_cost = _G.GetMerchantItemInfo(item_index)
jcallahan@5 324 local item_id = ItemLinkToID(_G.GetMerchantItemLink(item_index))
jcallahan@5 325
jcallahan@5 326 if item_id and item_id > 0 then
jcallahan@5 327 local price_string = copper_price
jcallahan@5 328
jcallahan@5 329 if extended_cost then
jcallahan@5 330 local bg_points = 0
jcallahan@5 331 local personal_points = 0
jcallahan@5 332
jcallahan@5 333 DatamineTT:ClearLines()
jcallahan@5 334 DatamineTT:SetMerchantItem(item_index)
jcallahan@5 335
jcallahan@5 336 for line_index = 1, DatamineTT:NumLines() do
jcallahan@5 337 local current_line = _G["WDPDatamineTTTextLeft" .. line_index]
jcallahan@5 338
jcallahan@5 339 if not current_line then
jcallahan@5 340 break
jcallahan@5 341 end
jcallahan@5 342 local breakout
jcallahan@5 343
jcallahan@5 344 for match_index = 1, #POINT_MATCH_PATTERNS do
jcallahan@5 345 local match1, match2 = current_line:GetText():match(POINT_MATCH_PATTERNS[match_index])
jcallahan@5 346 personal_points = personal_points + (match1 or 0)
jcallahan@5 347 bg_points = bg_points + (match2 or 0)
jcallahan@5 348
jcallahan@5 349 if match1 or match2 then
jcallahan@5 350 breakout = true
jcallahan@5 351 break
jcallahan@5 352 end
jcallahan@5 353 end
jcallahan@5 354
jcallahan@5 355 if breakout then
jcallahan@5 356 break
jcallahan@5 357 end
jcallahan@5 358 end
jcallahan@5 359 local currency_list = {}
jcallahan@5 360
jcallahan@5 361 price_string = ("%s:%s:%s"):format(price_string, bg_points, personal_points)
jcallahan@5 362
jcallahan@5 363 for cost_index = 1, _G.GetMerchantItemCostInfo(item_index) do
jcallahan@5 364 local icon_texture, amount_required, currency_link = _G.GetMerchantItemCostItem(item_index, cost_index)
jcallahan@5 365 local currency_id = currency_link and ItemLinkToID(currency_link) or nil
jcallahan@5 366
jcallahan@5 367 if not currency_id or currency_id < 1 then
jcallahan@5 368 if not icon_texture then
jcallahan@5 369 return
jcallahan@5 370 end
jcallahan@5 371 currency_id = icon_texture:match("[^\\]+$"):lower()
jcallahan@5 372 end
jcallahan@5 373 currency_list[#currency_list + 1] = ("(%s:%s)"):format(amount_required, currency_id)
jcallahan@5 374 end
jcallahan@5 375
jcallahan@5 376 for currency_index = 1, #currency_list do
jcallahan@5 377 price_string = ("%s:%s"):format(price_string, currency_list[currency_index])
jcallahan@5 378 end
jcallahan@5 379 end
jcallahan@6 380 merchant.sells[("%s:%s:[%s]"):format(item_id, stack_size, price_string)] = num_available
jcallahan@5 381 end
jcallahan@4 382 end
jcallahan@4 383 end
jcallahan@4 384
jcallahan@4 385
jcallahan@2 386 local GENDER_NAMES = {
jcallahan@2 387 "UNKNOWN",
jcallahan@2 388 "MALE",
jcallahan@2 389 "FEMALE",
jcallahan@2 390 }
jcallahan@2 391
jcallahan@2 392
jcallahan@2 393 local REACTION_NAMES = {
jcallahan@2 394 "HATED",
jcallahan@2 395 "HOSTILE",
jcallahan@2 396 "UNFRIENDLY",
jcallahan@2 397 "NEUTRAL",
jcallahan@2 398 "FRIENDLY",
jcallahan@2 399 "HONORED",
jcallahan@2 400 "REVERED",
jcallahan@2 401 "EXALTED",
jcallahan@2 402 }
jcallahan@2 403
jcallahan@2 404
jcallahan@2 405 local POWER_TYPE_NAMES = {
jcallahan@2 406 ["0"] = "MANA",
jcallahan@2 407 ["1"] = "RAGE",
jcallahan@2 408 ["2"] = "FOCUS",
jcallahan@2 409 ["3"] = "ENERGY",
jcallahan@2 410 ["6"] = "RUNIC_POWER",
jcallahan@2 411 }
jcallahan@2 412
jcallahan@2 413
jcallahan@2 414 function WDP:PLAYER_TARGET_CHANGED()
jcallahan@2 415 if not _G.UnitExists("target") or _G.UnitPlayerControlled("target") then
jcallahan@2 416 return
jcallahan@2 417 end
jcallahan@2 418 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target"))
jcallahan@2 419
jcallahan@2 420 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then
jcallahan@2 421 return
jcallahan@2 422 end
jcallahan@6 423 local npc = NPCEntry(unit_idnum)
jcallahan@2 424 local _, class_token = _G.UnitClass("target")
jcallahan@2 425 npc.class = class_token
jcallahan@2 426 -- TODO: Add faction here
jcallahan@2 427 npc.gender = GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED"
jcallahan@3 428 npc.is_pvp = _G.UnitIsPVP("target") and true or nil
jcallahan@2 429 npc.reaction = ("%s:%s:%s"):format(_G.UnitLevel("player"), _G.UnitFactionGroup("player"), REACTION_NAMES[_G.UnitReaction("player", "target")])
jcallahan@2 430 npc.stats = npc.stats or {}
jcallahan@2 431
jcallahan@2 432 local npc_level = ("level_%d"):format(_G.UnitLevel("target"))
jcallahan@2 433
jcallahan@2 434 if not npc.stats[npc_level] then
jcallahan@2 435 npc.stats[npc_level] = {
jcallahan@2 436 max_health = _G.UnitHealthMax("target"),
jcallahan@2 437 }
jcallahan@3 438
jcallahan@3 439 local max_power = _G.UnitManaMax("target")
jcallahan@3 440
jcallahan@3 441 if max_power > 0 then
jcallahan@3 442 local power_type = _G.UnitPowerType("target")
jcallahan@3 443 npc.stats[npc_level].power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power)
jcallahan@3 444 end
jcallahan@2 445 end
jcallahan@2 446 end
jcallahan@2 447
jcallahan@2 448
jcallahan@9 449 function WDP:QUEST_COMPLETE()
jcallahan@9 450 end
jcallahan@9 451
jcallahan@9 452
jcallahan@9 453 function WDP:QUEST_DETAIL()
jcallahan@9 454 end
jcallahan@9 455
jcallahan@9 456
jcallahan@4 457 function WDP:QUEST_LOG_UPDATE()
jcallahan@4 458 self:UnregisterEvent("QUEST_LOG_UPDATE")
jcallahan@4 459 end
jcallahan@4 460
jcallahan@4 461
jcallahan@9 462 function WDP:QUEST_PROGRESS()
jcallahan@9 463 end
jcallahan@9 464
jcallahan@4 465 function WDP:UNIT_QUEST_LOG_CHANGED(event, unit_id)
jcallahan@4 466 if unit_id ~= "player" then
jcallahan@4 467 return
jcallahan@4 468 end
jcallahan@4 469 self:RegisterEvent("QUEST_LOG_UPDATE")
jcallahan@4 470 end
jcallahan@4 471
jcallahan@4 472
jcallahan@1 473 function WDP:UNIT_SPELLCAST_SENT(event_name, unit_id, spell_name, spell_rank, target_name, spell_line)
jcallahan@1 474 if private.tracked_line or unit_id ~= "player" then
jcallahan@1 475 return
jcallahan@1 476 end
jcallahan@1 477 local spell_label = private.SPELL_LABELS_BY_NAME[spell_name]
jcallahan@1 478
jcallahan@1 479 if not spell_label then
jcallahan@1 480 return
jcallahan@1 481 end
jcallahan@1 482 action_data.type = nil -- This will be set as appropriate below
jcallahan@1 483
jcallahan@1 484 local tt_item_name, tt_item_link = _G.GameTooltip:GetItem()
jcallahan@1 485 local tt_unit_name, tt_unit_id = _G.GameTooltip:GetUnit()
jcallahan@1 486
jcallahan@1 487 if not tt_unit_name and _G.UnitName("target") == target_name then
jcallahan@1 488 tt_unit_name = target_name
jcallahan@1 489 tt_unit_id = "target"
jcallahan@1 490 end
jcallahan@1 491 local spell_flags = private.SPELL_FLAGS_BY_LABEL[spell_label]
jcallahan@1 492
jcallahan@1 493 if not tt_item_name and not tt_unit_name then
jcallahan@1 494 if target_name == "" then
jcallahan@1 495 return
jcallahan@1 496 end
jcallahan@1 497
jcallahan@8 498 local zone_name, x, y, map_level, instance_type = CurrentLocationData()
jcallahan@1 499
jcallahan@1 500 if bit.band(spell_flags, AF.OBJECT) == AF.OBJECT then
jcallahan@8 501 action_data.instance_type = instance_type
jcallahan@1 502 action_data.map_level = map_level
jcallahan@1 503 action_data.name = target_name
jcallahan@1 504 action_data.type = AF.OBJECT
jcallahan@1 505 action_data.x = x
jcallahan@1 506 action_data.y = y
jcallahan@1 507 action_data.zone = zone_name
jcallahan@2 508 print(("Found spell flagged for OBJECT: %s (%s, %s)"):format(zone_name, x, y))
jcallahan@1 509 elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then
jcallahan@1 510 print("Found spell flagged for ZONE")
jcallahan@1 511 end
jcallahan@1 512 elseif tt_unit_name and not tt_item_name then
jcallahan@1 513 if bit.band(spell_flags, AF.NPC) == AF.NPC then
jcallahan@1 514 print("Found spell flagged for NPC")
jcallahan@1 515 end
jcallahan@1 516 elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then
jcallahan@1 517 print("Found spell flagged for ITEM")
jcallahan@1 518 else
jcallahan@1 519 print(("%s: We have an issue with types and flags."), event_name)
jcallahan@1 520 end
jcallahan@1 521
jcallahan@1 522 print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, target_name, spell_line))
jcallahan@1 523 private.tracked_line = spell_line
jcallahan@0 524 end
jcallahan@0 525
jcallahan@0 526
jcallahan@1 527 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)
jcallahan@1 528 if unit_id ~= "player" then
jcallahan@1 529 return
jcallahan@1 530 end
jcallahan@1 531
jcallahan@1 532 if action_data.type == AF.OBJECT then
jcallahan@1 533 end
jcallahan@1 534
jcallahan@1 535 if private.SPELL_LABELS_BY_NAME[spell_name] then
jcallahan@1 536 print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id))
jcallahan@1 537 end
jcallahan@1 538 private.tracked_line = nil
jcallahan@0 539 end
jcallahan@0 540
jcallahan@1 541 function WDP:HandleSpellFailure(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)
jcallahan@1 542 if unit_id ~= "player" then
jcallahan@1 543 return
jcallahan@1 544 end
jcallahan@0 545
jcallahan@1 546 if private.tracked_line == spell_line then
jcallahan@1 547 private.tracked_line = nil
jcallahan@1 548 end
jcallahan@0 549 end