annotate Main.lua @ 6:e987658a8c7d

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