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