annotate Main.lua @ 5:59400bdcf95c

Record items/costs for merchants. Fix nil error in ParseGUID().
author James D. Callahan III <jcallahan@curse.com>
date Mon, 30 Apr 2012 00:09:59 -0500
parents 24a1d78e2e8c
children e987658a8c7d
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@1 68 local function CurrentLocationData()
jcallahan@1 69 local map_level = _G.GetCurrentMapDungeonLevel() or 0
jcallahan@1 70 local x, y = _G.GetPlayerMapPosition("player")
jcallahan@1 71
jcallahan@1 72 x = x or 0
jcallahan@1 73 y = y or 0
jcallahan@1 74
jcallahan@1 75 if x == 0 and y == 0 then
jcallahan@1 76 for level_index = 1, _G.GetNumDungeonMapLevels() do
jcallahan@1 77 _G.SetDungeonMapLevel(level_index)
jcallahan@1 78 x, y = _G.GetPlayerMapPosition("player")
jcallahan@1 79
jcallahan@1 80 if x and y and (x > 0 or y > 0) then
jcallahan@1 81 _G.SetDungeonMapLevel(map_level)
jcallahan@1 82 map_level = level_index
jcallahan@1 83 break
jcallahan@1 84 end
jcallahan@1 85 end
jcallahan@1 86 end
jcallahan@1 87
jcallahan@1 88 if _G.DungeonUsesTerrainMap() then
jcallahan@1 89 map_level = map_level - 1
jcallahan@1 90 end
jcallahan@2 91 return _G.GetRealZoneText(), ("%.2f"):format(x * 100), ("%.2f"):format(y * 100), map_level or 0
jcallahan@1 92 end
jcallahan@1 93
jcallahan@1 94
jcallahan@1 95 local function ItemLinkToID(item_link)
jcallahan@1 96 if not item_link then
jcallahan@1 97 return
jcallahan@1 98 end
jcallahan@1 99 local id = item_link:match("item:(%d+)")
jcallahan@1 100 return id and tonumber(id) or nil
jcallahan@1 101 end
jcallahan@0 102
jcallahan@4 103
jcallahan@4 104 do
jcallahan@4 105 local UNIT_TYPE_BITMASK = 0x007
jcallahan@4 106
jcallahan@4 107 function WDP:ParseGUID(guid)
jcallahan@5 108 if not guid then
jcallahan@5 109 return
jcallahan@5 110 end
jcallahan@4 111 local types = private.UNIT_TYPES
jcallahan@4 112 local unit_type = _G.bit.band(tonumber(guid:sub(1, 5)), UNIT_TYPE_BITMASK)
jcallahan@4 113
jcallahan@4 114 if unit_type ~= types.PLAYER or unit_type ~= types.OBJECT or unit_type ~= types.PET then
jcallahan@4 115 return unit_type, tonumber(guid:sub(-12, -9), 16)
jcallahan@4 116 end
jcallahan@4 117
jcallahan@4 118 return unit_type
jcallahan@4 119 end
jcallahan@4 120 end -- do-block
jcallahan@4 121
jcallahan@4 122
jcallahan@0 123 -----------------------------------------------------------------------
jcallahan@0 124 -- Methods.
jcallahan@0 125 -----------------------------------------------------------------------
jcallahan@0 126 function WDP:OnInitialize()
jcallahan@0 127 db = LibStub("AceDB-3.0"):New("WoWDBProfilerData", DATABASE_DEFAULTS, "Default").global
jcallahan@0 128 end
jcallahan@0 129
jcallahan@0 130
jcallahan@0 131 function WDP:OnEnable()
jcallahan@0 132 for event_name, mapping in pairs(EVENT_MAPPING) do
jcallahan@1 133 self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil)
jcallahan@0 134 end
jcallahan@0 135 durability_timer_handle = self:ScheduleRepeatingTimer("ProcessDurability", 30)
jcallahan@2 136 target_location_timer_handle = self:ScheduleRepeatingTimer("UpdateTargetLocation", 0.2)
jcallahan@0 137 end
jcallahan@0 138
jcallahan@0 139
jcallahan@0 140 local function RecordDurability(item_id, durability)
jcallahan@0 141 if not durability or durability <= 0 then
jcallahan@0 142 return
jcallahan@0 143 end
jcallahan@0 144
jcallahan@0 145 if not db.items[item_id] then
jcallahan@0 146 db.items[item_id] = {}
jcallahan@0 147 end
jcallahan@0 148 db.items[item_id].durability = durability
jcallahan@0 149 end
jcallahan@0 150
jcallahan@0 151
jcallahan@0 152 function WDP:ProcessDurability()
jcallahan@0 153 for slot_index = 0, _G.INVSLOT_LAST_EQUIPPED do
jcallahan@1 154 local item_id = _G.GetInventoryItemID("player", slot_index)
jcallahan@0 155
jcallahan@0 156 if item_id and item_id > 0 then
jcallahan@1 157 local _, max_durability = _G.GetInventoryItemDurability(slot_index)
jcallahan@0 158 RecordDurability(item_id, max_durability)
jcallahan@0 159 end
jcallahan@0 160 end
jcallahan@0 161
jcallahan@0 162 for bag_index = 0, _G.NUM_BAG_SLOTS do
jcallahan@0 163 for slot_index = 1, _G.GetContainerNumSlots(bag_index) do
jcallahan@1 164 local item_id = _G.GetContainerItemID(bag_index, slot_index)
jcallahan@0 165
jcallahan@0 166 if item_id and item_id > 0 then
jcallahan@1 167 local _, max_durability = _G.GetContainerItemDurability(bag_index, slot_index)
jcallahan@0 168 RecordDurability(item_id, max_durability)
jcallahan@0 169 end
jcallahan@0 170 end
jcallahan@0 171 end
jcallahan@0 172 end
jcallahan@0 173
jcallahan@0 174
jcallahan@2 175 function WDP:UpdateTargetLocation()
jcallahan@2 176 if not _G.UnitExists("target") or _G.UnitPlayerControlled("target") or _G.UnitIsTapped("target") then
jcallahan@2 177 return
jcallahan@2 178 end
jcallahan@2 179
jcallahan@2 180 for index = 1, 4 do
jcallahan@2 181 if not _G.CheckInteractDistance("target", index) then
jcallahan@2 182 return
jcallahan@2 183 end
jcallahan@2 184 end
jcallahan@2 185
jcallahan@2 186 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target"))
jcallahan@2 187
jcallahan@2 188 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then
jcallahan@2 189 return
jcallahan@2 190 end
jcallahan@2 191 local zone_name, x, y, map_level = CurrentLocationData()
jcallahan@2 192 local npc_data = db.npcs[unit_idnum].stats[("level_%d"):format(_G.UnitLevel("target"))]
jcallahan@2 193
jcallahan@2 194 if not npc_data.locations then
jcallahan@2 195 npc_data.locations = {}
jcallahan@2 196 end
jcallahan@2 197
jcallahan@2 198 if not npc_data.locations[zone_name] then
jcallahan@2 199 npc_data.locations[zone_name] = {}
jcallahan@2 200 end
jcallahan@2 201 npc_data.locations[zone_name][("%s:%s:%s"):format(map_level, x, y)] = true
jcallahan@2 202 end
jcallahan@2 203
jcallahan@2 204
jcallahan@0 205 -----------------------------------------------------------------------
jcallahan@0 206 -- Event handlers.
jcallahan@0 207 -----------------------------------------------------------------------
jcallahan@1 208 local re_gold = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)")
jcallahan@1 209 local re_silver = _G.SILVER_AMOUNT:gsub("%%d", "(%%d+)")
jcallahan@1 210 local re_copper = _G.COPPER_AMOUNT:gsub("%%d", "(%%d+)")
jcallahan@1 211
jcallahan@1 212
jcallahan@1 213 local function _moneyMatch(money, re)
jcallahan@1 214 return money:match(re) or 0
jcallahan@0 215 end
jcallahan@0 216
jcallahan@0 217
jcallahan@1 218 local function _toCopper(money)
jcallahan@1 219 if not money then
jcallahan@1 220 return 0
jcallahan@1 221 end
jcallahan@1 222
jcallahan@1 223 return _moneyMatch(money, re_gold) * 10000 + _moneyMatch(money, re_silver) * 100 + _moneyMatch(money, re_copper)
jcallahan@0 224 end
jcallahan@0 225
jcallahan@0 226
jcallahan@1 227 local LOOT_VERIFY_FUNCS = {
jcallahan@1 228 [AF.NPC] = function()
jcallahan@1 229 local fishing_loot = _G.IsFishingLoot()
jcallahan@1 230
jcallahan@1 231 if not fishing_loot and _G.UnitExists("target") and not _G.UnitIsFriend("player", "target") and _G.UnitIsDead("target") then
jcallahan@1 232 if _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then
jcallahan@1 233 return false
jcallahan@1 234 end
jcallahan@1 235 local unit_type, id_num = WDP:ParseGUID(_G.UnitGUID("target"))
jcallahan@1 236 action_data.id_num = id_num
jcallahan@1 237 end
jcallahan@1 238 return true
jcallahan@1 239 end,
jcallahan@1 240 }
jcallahan@1 241
jcallahan@4 242
jcallahan@1 243 local LOOT_UPDATE_FUNCS = {
jcallahan@1 244 [AF.NPC] = function()
jcallahan@1 245 local npc = db.npcs[action_data.id_num]
jcallahan@1 246
jcallahan@1 247 if not npc then
jcallahan@1 248 db.npcs[action_data.id_num] = {}
jcallahan@1 249 npc = db.npcs[action_data.id_num]
jcallahan@1 250 end
jcallahan@1 251 npc.drops = npc.drops or {}
jcallahan@1 252
jcallahan@1 253 for index = 1, #action_data.drops do
jcallahan@1 254 table.insert(npc.drops, action_data.drops[index])
jcallahan@1 255 end
jcallahan@1 256 end,
jcallahan@1 257 }
jcallahan@1 258
jcallahan@1 259
jcallahan@1 260 function WDP:LOOT_OPENED()
jcallahan@1 261 if not action_data.type then
jcallahan@1 262 action_data.type = AF.NPC
jcallahan@1 263 end
jcallahan@1 264 local verify_func = LOOT_VERIFY_FUNCS[action_data.type]
jcallahan@2 265 local update_func = LOOT_UPDATE_FUNCS[action_data.type]
jcallahan@1 266
jcallahan@1 267 if not verify_func or not update_func or not verify_func() then
jcallahan@1 268 return
jcallahan@1 269 end
jcallahan@1 270
jcallahan@1 271 local loot_registry = {}
jcallahan@1 272 action_data.drops = {}
jcallahan@1 273
jcallahan@1 274 for loot_slot = 1, _G.GetNumLootItems() do
jcallahan@1 275 local texture, item, quantity, quality, locked = _G.GetLootSlotInfo(loot_slot)
jcallahan@1 276
jcallahan@1 277 if _G.LootSlotIsItem(loot_slot) then
jcallahan@1 278 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot))
jcallahan@1 279 loot_registry[item_id] = (loot_registry[item_id]) or 0 + quantity
jcallahan@1 280 elseif _G.LootSlotIsCoin(loot_slot) then
jcallahan@1 281 table.insert(action_data.drops, ("money:%d"):format(_toCopper(item)))
jcallahan@1 282 elseif _G.LootSlotIsCurrency(loot_slot) then
jcallahan@1 283 end
jcallahan@1 284 end
jcallahan@1 285
jcallahan@1 286 for item_id, quantity in pairs(loot_registry) do
jcallahan@1 287 table.insert(action_data.drops, ("%d:%d"):format(item_id, quantity))
jcallahan@1 288 end
jcallahan@1 289 update_func()
jcallahan@0 290 end
jcallahan@0 291
jcallahan@0 292
jcallahan@5 293 local POINT_MATCH_PATTERNS = {
jcallahan@5 294 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING:gsub("%%d", "(%%d+)")), -- May no longer be necessary
jcallahan@5 295 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3:gsub("%%d", "(%%d+)")), -- May no longer be necessary
jcallahan@5 296 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_5V5:gsub("%%d", "(%%d+)")), -- May no longer be necessary
jcallahan@5 297 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_BG:gsub("%%d", "(%%d+)")),
jcallahan@5 298 ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3_BG:gsub("%%d", "(%%d+)")),
jcallahan@5 299 }
jcallahan@5 300
jcallahan@5 301
jcallahan@4 302 function WDP:MERCHANT_UPDATE()
jcallahan@4 303 local unit_type, unit_idnum = self:ParseGUID(_G.UnitGUID("target"))
jcallahan@4 304
jcallahan@4 305 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then
jcallahan@4 306 return
jcallahan@4 307 end
jcallahan@5 308 local npc = db.npcs[unit_idnum]
jcallahan@4 309
jcallahan@5 310 if not npc then
jcallahan@5 311 db.npcs[unit_idnum] = {}
jcallahan@5 312 npc = db.npcs[unit_idnum]
jcallahan@5 313 end
jcallahan@5 314 npc.sells = npc.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@5 374 npc.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@2 417
jcallahan@2 418 local npc = db.npcs[unit_idnum]
jcallahan@2 419
jcallahan@2 420 if not npc then
jcallahan@2 421 db.npcs[unit_idnum] = {}
jcallahan@2 422 npc = db.npcs[unit_idnum]
jcallahan@2 423 end
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@4 449 function WDP:QUEST_LOG_UPDATE()
jcallahan@4 450 self:UnregisterEvent("QUEST_LOG_UPDATE")
jcallahan@4 451 end
jcallahan@4 452
jcallahan@4 453
jcallahan@4 454 function WDP:UNIT_QUEST_LOG_CHANGED(event, unit_id)
jcallahan@4 455 if unit_id ~= "player" then
jcallahan@4 456 return
jcallahan@4 457 end
jcallahan@4 458 self:RegisterEvent("QUEST_LOG_UPDATE")
jcallahan@4 459 end
jcallahan@4 460
jcallahan@4 461
jcallahan@1 462 function WDP:UNIT_SPELLCAST_SENT(event_name, unit_id, spell_name, spell_rank, target_name, spell_line)
jcallahan@1 463 if private.tracked_line or unit_id ~= "player" then
jcallahan@1 464 return
jcallahan@1 465 end
jcallahan@1 466 local spell_label = private.SPELL_LABELS_BY_NAME[spell_name]
jcallahan@1 467
jcallahan@1 468 if not spell_label then
jcallahan@1 469 return
jcallahan@1 470 end
jcallahan@1 471 action_data.type = nil -- This will be set as appropriate below
jcallahan@1 472
jcallahan@1 473 local tt_item_name, tt_item_link = _G.GameTooltip:GetItem()
jcallahan@1 474 local tt_unit_name, tt_unit_id = _G.GameTooltip:GetUnit()
jcallahan@1 475
jcallahan@1 476 if not tt_unit_name and _G.UnitName("target") == target_name then
jcallahan@1 477 tt_unit_name = target_name
jcallahan@1 478 tt_unit_id = "target"
jcallahan@1 479 end
jcallahan@1 480 local spell_flags = private.SPELL_FLAGS_BY_LABEL[spell_label]
jcallahan@1 481
jcallahan@1 482 if not tt_item_name and not tt_unit_name then
jcallahan@1 483 if target_name == "" then
jcallahan@1 484 return
jcallahan@1 485 end
jcallahan@1 486
jcallahan@1 487 local zone_name, x, y, map_level = CurrentLocationData()
jcallahan@1 488
jcallahan@1 489 if bit.band(spell_flags, AF.OBJECT) == AF.OBJECT then
jcallahan@1 490 action_data.map_level = map_level
jcallahan@1 491 action_data.name = target_name
jcallahan@1 492 action_data.type = AF.OBJECT
jcallahan@1 493 action_data.x = x
jcallahan@1 494 action_data.y = y
jcallahan@1 495 action_data.zone = zone_name
jcallahan@2 496 print(("Found spell flagged for OBJECT: %s (%s, %s)"):format(zone_name, x, y))
jcallahan@1 497 elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then
jcallahan@1 498 print("Found spell flagged for ZONE")
jcallahan@1 499 end
jcallahan@1 500 elseif tt_unit_name and not tt_item_name then
jcallahan@1 501 if bit.band(spell_flags, AF.NPC) == AF.NPC then
jcallahan@1 502 print("Found spell flagged for NPC")
jcallahan@1 503 end
jcallahan@1 504 elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then
jcallahan@1 505 print("Found spell flagged for ITEM")
jcallahan@1 506 else
jcallahan@1 507 print(("%s: We have an issue with types and flags."), event_name)
jcallahan@1 508 end
jcallahan@1 509
jcallahan@1 510 print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, target_name, spell_line))
jcallahan@1 511 private.tracked_line = spell_line
jcallahan@0 512 end
jcallahan@0 513
jcallahan@0 514
jcallahan@1 515 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)
jcallahan@1 516 if unit_id ~= "player" then
jcallahan@1 517 return
jcallahan@1 518 end
jcallahan@1 519
jcallahan@1 520 if action_data.type == AF.OBJECT then
jcallahan@1 521 end
jcallahan@1 522
jcallahan@1 523 if private.SPELL_LABELS_BY_NAME[spell_name] then
jcallahan@1 524 print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id))
jcallahan@1 525 end
jcallahan@1 526 private.tracked_line = nil
jcallahan@0 527 end
jcallahan@0 528
jcallahan@1 529 function WDP:HandleSpellFailure(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)
jcallahan@1 530 if unit_id ~= "player" then
jcallahan@1 531 return
jcallahan@1 532 end
jcallahan@0 533
jcallahan@1 534 if private.tracked_line == spell_line then
jcallahan@1 535 private.tracked_line = nil
jcallahan@1 536 end
jcallahan@0 537 end