annotate Main.lua @ 7:17900d196389

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