| 
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@312
 | 
     6 local tostring = _G.tostring
 | 
| 
jcallahan@1
 | 
     7 local tonumber = _G.tonumber
 | 
| 
jcallahan@1
 | 
     8 
 | 
| 
jcallahan@1
 | 
     9 local bit = _G.bit
 | 
| 
jcallahan@1
 | 
    10 local math = _G.math
 | 
| 
jcallahan@1
 | 
    11 local table = _G.table
 | 
| 
jcallahan@1
 | 
    12 
 | 
| 
jcallahan@334
 | 
    13 local next = _G.next
 | 
| 
jcallahan@78
 | 
    14 local select = _G.select
 | 
| 
jcallahan@306
 | 
    15 local unpack = _G.unpack
 | 
| 
jcallahan@78
 | 
    16 
 | 
| 
MMOSimca@383
 | 
    17 local C_Timer = _G.C_Timer
 | 
| 
MMOSimca@383
 | 
    18 
 | 
| 
jcallahan@0
 | 
    19 
 | 
| 
jcallahan@246
 | 
    20 -- ADDON NAMESPACE ----------------------------------------------------
 | 
| 
jcallahan@246
 | 
    21 
 | 
| 
jcallahan@0
 | 
    22 local ADDON_NAME, private = ...
 | 
| 
jcallahan@0
 | 
    23 
 | 
| 
jcallahan@0
 | 
    24 local LibStub = _G.LibStub
 | 
| 
MMOSimca@383
 | 
    25 local WDP = LibStub("AceAddon-3.0"):NewAddon(ADDON_NAME, "AceConsole-3.0", "AceEvent-3.0")
 | 
| 
jcallahan@0
 | 
    26 
 | 
| 
jcallahan@48
 | 
    27 local deformat = LibStub("LibDeformat-3.0")
 | 
| 
jcallahan@48
 | 
    28 
 | 
| 
jcallahan@4
 | 
    29 local DatamineTT = _G.CreateFrame("GameTooltip", "WDPDatamineTT", _G.UIParent, "GameTooltipTemplate")
 | 
| 
jcallahan@5
 | 
    30 DatamineTT:SetOwner(_G.WorldFrame, "ANCHOR_NONE")
 | 
| 
jcallahan@5
 | 
    31 
 | 
| 
jcallahan@0
 | 
    32 
 | 
| 
jcallahan@246
 | 
    33 -- CONSTANTS ----------------------------------------------------------
 | 
| 
jcallahan@246
 | 
    34 
 | 
| 
jcallahan@246
 | 
    35 local AF = private.ACTION_TYPE_FLAGS
 | 
| 
jcallahan@246
 | 
    36 local CLIENT_LOCALE = _G.GetLocale()
 | 
| 
jcallahan@313
 | 
    37 local DB_VERSION = 18
 | 
| 
MMOSimca@346
 | 
    38 local DEBUGGING = false
 | 
| 
jcallahan@156
 | 
    39 local EVENT_DEBUG = false
 | 
| 
jcallahan@322
 | 
    40 
 | 
| 
MMOSimca@405
 | 
    41 local ITEM_ID_TIMBER = 114781
 | 
| 
MMOSimca@405
 | 
    42 
 | 
| 
MMOSimca@422
 | 
    43 local LOOT_SOURCE_ID_REDUNDANT = 3
 | 
| 
MMOSimca@422
 | 
    44 local LOOT_SOURCE_ID_GARRISON_CACHE = 10
 | 
| 
MMOSimca@422
 | 
    45 
 | 
| 
jcallahan@246
 | 
    46 local OBJECT_ID_ANVIL = 192628
 | 
| 
jcallahan@322
 | 
    47 local OBJECT_ID_FISHING_BOBBER = 35591
 | 
| 
jcallahan@246
 | 
    48 local OBJECT_ID_FORGE = 1685
 | 
| 
jcallahan@322
 | 
    49 
 | 
| 
MMOSimca@454
 | 
    50 local PLAYER_CLASS, PLAYER_CLASS_ID = _G.select(2, _G.UnitClass("player"))
 | 
| 
jcallahan@246
 | 
    51 local PLAYER_FACTION = _G.UnitFactionGroup("player")
 | 
| 
jcallahan@300
 | 
    52 local PLAYER_GUID
 | 
| 
jcallahan@246
 | 
    53 local PLAYER_NAME = _G.UnitName("player")
 | 
| 
jcallahan@246
 | 
    54 local PLAYER_RACE = _G.select(2, _G.UnitRace("player"))
 | 
| 
jcallahan@246
 | 
    55 
 | 
| 
MMOSimca@377
 | 
    56 local LOOT_SLOT_CURRENCY = _G.LOOT_SLOT_CURRENCY
 | 
| 
MMOSimca@377
 | 
    57 local LOOT_SLOT_ITEM = _G.LOOT_SLOT_ITEM
 | 
| 
MMOSimca@377
 | 
    58 local LOOT_SLOT_MONEY = _G.LOOT_SLOT_MONEY
 | 
| 
MMOSimca@377
 | 
    59 
 | 
| 
jcallahan@246
 | 
    60 local ALLOWED_LOCALES = {
 | 
| 
jcallahan@246
 | 
    61     enUS = true,
 | 
| 
jcallahan@246
 | 
    62     enGB = true,
 | 
| 
MMOSimca@336
 | 
    63     enTW = true,
 | 
| 
MMOSimca@336
 | 
    64     enCN = true,
 | 
| 
jcallahan@246
 | 
    65 }
 | 
| 
jcallahan@157
 | 
    66 
 | 
| 
jcallahan@0
 | 
    67 local DATABASE_DEFAULTS = {
 | 
| 
jcallahan@128
 | 
    68     char = {},
 | 
| 
jcallahan@0
 | 
    69     global = {
 | 
| 
jcallahan@270
 | 
    70         config = {
 | 
| 
jcallahan@270
 | 
    71             minimap_icon = {
 | 
| 
jcallahan@270
 | 
    72                 hide = true,
 | 
| 
jcallahan@270
 | 
    73             },
 | 
| 
jcallahan@270
 | 
    74         },
 | 
| 
jcallahan@0
 | 
    75         items = {},
 | 
| 
jcallahan@0
 | 
    76         npcs = {},
 | 
| 
jcallahan@0
 | 
    77         objects = {},
 | 
| 
jcallahan@0
 | 
    78         quests = {},
 | 
| 
jcallahan@167
 | 
    79         spells = {},
 | 
| 
jcallahan@17
 | 
    80         zones = {},
 | 
| 
jcallahan@0
 | 
    81     }
 | 
| 
jcallahan@0
 | 
    82 }
 | 
| 
jcallahan@0
 | 
    83 
 | 
| 
jcallahan@1
 | 
    84 local EVENT_MAPPING = {
 | 
| 
MMOSimca@436
 | 
    85     AUCTION_HOUSE_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@436
 | 
    86     AUCTION_HOUSE_SHOW = true, -- also triggers StopChatLootRecording
 | 
| 
MMOSimca@436
 | 
    87     BANKFRAME_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@436
 | 
    88     BANKFRAME_OPENED = true, -- also triggers StopChatLootRecording
 | 
| 
jcallahan@90
 | 
    89     BATTLEFIELDS_SHOW = true,
 | 
| 
jcallahan@56
 | 
    90     BLACK_MARKET_ITEM_UPDATE = true,
 | 
| 
MMOSimca@408
 | 
    91     BONUS_ROLL_RESULT = true,
 | 
| 
MMOSimca@388
 | 
    92     CHAT_MSG_CURRENCY = true,
 | 
| 
jcallahan@48
 | 
    93     CHAT_MSG_LOOT = true,
 | 
| 
jcallahan@95
 | 
    94     CHAT_MSG_MONSTER_SAY = "RecordQuote",
 | 
| 
jcallahan@95
 | 
    95     CHAT_MSG_MONSTER_WHISPER = "RecordQuote",
 | 
| 
jcallahan@95
 | 
    96     CHAT_MSG_MONSTER_YELL = "RecordQuote",
 | 
| 
jcallahan@40
 | 
    97     CHAT_MSG_SYSTEM = true,
 | 
| 
jcallahan@23
 | 
    98     COMBAT_LOG_EVENT_UNFILTERED = true,
 | 
| 
jcallahan@18
 | 
    99     COMBAT_TEXT_UPDATE = true,
 | 
| 
jcallahan@140
 | 
   100     CURSOR_UPDATE = true,
 | 
| 
jcallahan@90
 | 
   101     FORGE_MASTER_OPENED = true,
 | 
| 
MMOSimca@436
 | 
   102     GARRISON_MISSION_NPC_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@436
 | 
   103     GARRISON_MISSION_NPC_OPENED = "StopChatLootRecording",
 | 
| 
MMOSimca@450
 | 
   104     GARRISON_SHIPYARD_NPC_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@450
 | 
   105     GARRISON_SHIPYARD_NPC_OPENED = "StopChatLootRecording",
 | 
| 
MMOSimca@436
 | 
   106     GOSSIP_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@436
 | 
   107     GOSSIP_SHOW = true, -- also triggers StopChatLootRecording
 | 
| 
jcallahan@290
 | 
   108     GROUP_ROSTER_UPDATE = true,
 | 
| 
MMOSimca@436
 | 
   109     GUILDBANKFRAME_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@436
 | 
   110     GUILDBANKFRAME_OPENED = true, -- also triggers StopChatLootRecording
 | 
| 
jcallahan@42
 | 
   111     ITEM_TEXT_BEGIN = true,
 | 
| 
jcallahan@189
 | 
   112     ITEM_UPGRADE_MASTER_OPENED = true,
 | 
| 
jcallahan@124
 | 
   113     LOOT_CLOSED = true,
 | 
| 
MMOSimca@343
 | 
   114     LOOT_OPENED = true,
 | 
| 
MMOSimca@412
 | 
   115     LOOT_SLOT_CLEARED = "HandleBadChatLootData",
 | 
| 
MMOSimca@436
 | 
   116     MAIL_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@436
 | 
   117     MAIL_SHOW = true, -- also triggers StopChatLootRecording
 | 
| 
MMOSimca@436
 | 
   118     MERCHANT_CLOSED = true, -- also triggers ResumeChatLootRecording
 | 
| 
MMOSimca@436
 | 
   119     MERCHANT_SHOW = "UpdateMerchantItems", -- also triggers StopChatLootRecording
 | 
| 
jcallahan@61
 | 
   120     MERCHANT_UPDATE = "UpdateMerchantItems",
 | 
| 
jcallahan@25
 | 
   121     PET_BAR_UPDATE = true,
 | 
| 
MMOSimca@368
 | 
   122     --PET_JOURNAL_LIST_UPDATE = true,
 | 
| 
jcallahan@156
 | 
   123     PLAYER_REGEN_DISABLED = true,
 | 
| 
jcallahan@156
 | 
   124     PLAYER_REGEN_ENABLED = true,
 | 
| 
jcallahan@2
 | 
   125     PLAYER_TARGET_CHANGED = true,
 | 
| 
jcallahan@9
 | 
   126     QUEST_COMPLETE = true,
 | 
| 
jcallahan@9
 | 
   127     QUEST_DETAIL = true,
 | 
| 
jcallahan@9
 | 
   128     QUEST_LOG_UPDATE = true,
 | 
| 
jcallahan@97
 | 
   129     QUEST_PROGRESS = true,
 | 
| 
jcallahan@178
 | 
   130     SHOW_LOOT_TOAST = true,
 | 
| 
jcallahan@306
 | 
   131     SPELL_CONFIRMATION_PROMPT = true,
 | 
| 
jcallahan@88
 | 
   132     TAXIMAP_OPENED = true,
 | 
| 
MMOSimca@437
 | 
   133     TRADE_CLOSED = "ResumeChatLootRecording",
 | 
| 
MMOSimca@437
 | 
   134     TRADE_SHOW = "StopChatLootRecording",
 | 
| 
jcallahan@92
 | 
   135     TRADE_SKILL_SHOW = true,
 | 
| 
jcallahan@167
 | 
   136     TRAINER_CLOSED = true,
 | 
| 
jcallahan@27
 | 
   137     TRAINER_SHOW = true,
 | 
| 
jcallahan@90
 | 
   138     TRANSMOGRIFY_OPEN = true,
 | 
| 
jcallahan@246
 | 
   139     UNIT_PET = true,
 | 
| 
jcallahan@4
 | 
   140     UNIT_QUEST_LOG_CHANGED = true,
 | 
| 
jcallahan@1
 | 
   141     UNIT_SPELLCAST_FAILED = "HandleSpellFailure",
 | 
| 
jcallahan@1
 | 
   142     UNIT_SPELLCAST_FAILED_QUIET = "HandleSpellFailure",
 | 
| 
jcallahan@1
 | 
   143     UNIT_SPELLCAST_INTERRUPTED = "HandleSpellFailure",
 | 
| 
jcallahan@1
 | 
   144     UNIT_SPELLCAST_SENT = true,
 | 
| 
jcallahan@1
 | 
   145     UNIT_SPELLCAST_SUCCEEDED = true,
 | 
| 
jcallahan@90
 | 
   146     VOID_STORAGE_OPEN = true,
 | 
| 
jcallahan@299
 | 
   147     ZONE_CHANGED = "HandleZoneChange",
 | 
| 
jcallahan@299
 | 
   148     ZONE_CHANGED_INDOORS = "HandleZoneChange",
 | 
| 
jcallahan@299
 | 
   149     ZONE_CHANGED_NEW_AREA = "HandleZoneChange",
 | 
| 
jcallahan@0
 | 
   150 }
 | 
| 
jcallahan@0
 | 
   151 
 | 
| 
jcallahan@4
 | 
   152 
 | 
| 
jcallahan@246
 | 
   153 -- VARIABLES ----------------------------------------------------------
 | 
| 
jcallahan@246
 | 
   154 
 | 
| 
jcallahan@92
 | 
   155 local anvil_spell_ids = {}
 | 
| 
jcallahan@92
 | 
   156 local currently_drunk
 | 
| 
jcallahan@128
 | 
   157 local char_db
 | 
| 
jcallahan@128
 | 
   158 local global_db
 | 
| 
jcallahan@299
 | 
   159 local group_member_guids = {}
 | 
| 
jcallahan@246
 | 
   160 local group_owner_guids_to_pet_guids = {}
 | 
| 
jcallahan@246
 | 
   161 local group_pet_guids = {}
 | 
| 
jcallahan@299
 | 
   162 local in_instance
 | 
| 
jcallahan@187
 | 
   163 local item_process_timer_handle
 | 
| 
jcallahan@92
 | 
   164 local faction_standings = {}
 | 
| 
jcallahan@92
 | 
   165 local forge_spell_ids = {}
 | 
| 
jcallahan@95
 | 
   166 local languages_known = {}
 | 
| 
jcallahan@317
 | 
   167 local boss_loot_toasting = {}
 | 
| 
MMOSimca@387
 | 
   168 local container_loot_toasting
 | 
| 
MMOSimca@387
 | 
   169 local loot_toast_container_id
 | 
| 
MMOSimca@387
 | 
   170 local raid_boss_id
 | 
| 
jcallahan@306
 | 
   171 local loot_toast_container_timer_handle
 | 
| 
jcallahan@307
 | 
   172 local loot_toast_data
 | 
| 
jcallahan@307
 | 
   173 local loot_toast_data_timer_handle
 | 
| 
jcallahan@95
 | 
   174 local name_to_id_map = {}
 | 
| 
jcallahan@306
 | 
   175 local killed_boss_id_timer_handle
 | 
| 
jcallahan@177
 | 
   176 local killed_npc_id
 | 
| 
jcallahan@2
 | 
   177 local target_location_timer_handle
 | 
| 
MMOSimca@345
 | 
   178 local last_timber_spell_id
 | 
| 
MMOSimca@355
 | 
   179 local last_garrison_cache_object_id
 | 
| 
MMOSimca@436
 | 
   180 local block_chat_loot_data
 | 
| 
MMOSimca@435
 | 
   181 local chat_loot_data = {}
 | 
| 
MMOSimca@347
 | 
   182 local chat_loot_timer_handle
 | 
| 
jcallahan@86
 | 
   183 local current_target_id
 | 
| 
jcallahan@126
 | 
   184 local current_area_id
 | 
| 
jcallahan@131
 | 
   185 local current_loot
 | 
| 
jcallahan@1
 | 
   186 
 | 
| 
jcallahan@312
 | 
   187 
 | 
| 
jcallahan@121
 | 
   188 -- Data for our current action. Including possible values as a reference.
 | 
| 
jcallahan@122
 | 
   189 local current_action = {
 | 
| 
jcallahan@121
 | 
   190     identifier = nil,
 | 
| 
jcallahan@121
 | 
   191     loot_label = nil,
 | 
| 
jcallahan@121
 | 
   192     loot_list = nil,
 | 
| 
jcallahan@121
 | 
   193     loot_sources = nil,
 | 
| 
jcallahan@121
 | 
   194     map_level = nil,
 | 
| 
jcallahan@121
 | 
   195     spell_label = nil,
 | 
| 
jcallahan@123
 | 
   196     target_type = nil,
 | 
| 
jcallahan@121
 | 
   197     x = nil,
 | 
| 
jcallahan@121
 | 
   198     y = nil,
 | 
| 
jcallahan@121
 | 
   199     zone_data = nil,
 | 
| 
jcallahan@121
 | 
   200 }
 | 
| 
jcallahan@92
 | 
   201 
 | 
| 
jcallahan@246
 | 
   202 
 | 
| 
MMOSimca@393
 | 
   203 -- Timer prototypes
 | 
| 
MMOSimca@393
 | 
   204 local ClearKilledNPC, ClearKilledBossID, ClearLootToastContainerID, ClearLootToastData, ClearChatLootData
 | 
| 
MMOSimca@393
 | 
   205 
 | 
| 
MMOSimca@393
 | 
   206 
 | 
| 
jcallahan@246
 | 
   207 -- HELPERS ------------------------------------------------------------
 | 
| 
jcallahan@246
 | 
   208 
 | 
| 
jcallahan@245
 | 
   209 local function Debug(message, ...)
 | 
| 
MMOSimca@350
 | 
   210     if not DEBUGGING or not message then
 | 
| 
jcallahan@151
 | 
   211         return
 | 
| 
jcallahan@151
 | 
   212     end
 | 
| 
MMOSimca@350
 | 
   213     
 | 
| 
MMOSimca@350
 | 
   214     if ... then
 | 
| 
MMOSimca@350
 | 
   215         local args = { ... }
 | 
| 
MMOSimca@350
 | 
   216 
 | 
| 
MMOSimca@350
 | 
   217         for index = 1, #args do
 | 
| 
MMOSimca@377
 | 
   218             args[index] = tostring(args[index])
 | 
| 
jcallahan@306
 | 
   219         end
 | 
| 
MMOSimca@350
 | 
   220         _G.print(message:format(unpack(args)))
 | 
| 
MMOSimca@350
 | 
   221     else
 | 
| 
MMOSimca@350
 | 
   222         _G.print(message)
 | 
| 
jcallahan@306
 | 
   223     end
 | 
| 
jcallahan@151
 | 
   224 end
 | 
| 
jcallahan@151
 | 
   225 
 | 
| 
jcallahan@151
 | 
   226 
 | 
| 
MMOSimca@393
 | 
   227 local function InitializeCurrentLoot()
 | 
| 
MMOSimca@393
 | 
   228     current_loot = {
 | 
| 
MMOSimca@393
 | 
   229         list = {},
 | 
| 
MMOSimca@393
 | 
   230         sources = {},
 | 
| 
MMOSimca@393
 | 
   231         identifier = current_action.identifier,
 | 
| 
MMOSimca@393
 | 
   232         label = current_action.loot_label or "drops",
 | 
| 
MMOSimca@393
 | 
   233         map_level = current_action.map_level,
 | 
| 
MMOSimca@393
 | 
   234         object_name = current_action.object_name,
 | 
| 
MMOSimca@393
 | 
   235         spell_label = current_action.spell_label,
 | 
| 
MMOSimca@393
 | 
   236         target_type = current_action.target_type,
 | 
| 
MMOSimca@393
 | 
   237         x = current_action.x,
 | 
| 
MMOSimca@393
 | 
   238         y = current_action.y,
 | 
| 
MMOSimca@393
 | 
   239         zone_data = current_action.zone_data,
 | 
| 
MMOSimca@393
 | 
   240     }
 | 
| 
MMOSimca@393
 | 
   241 
 | 
| 
MMOSimca@393
 | 
   242     table.wipe(current_action)
 | 
| 
MMOSimca@393
 | 
   243 end
 | 
| 
MMOSimca@393
 | 
   244 
 | 
| 
MMOSimca@393
 | 
   245 
 | 
| 
jcallahan@169
 | 
   246 local TradeSkillExecutePer
 | 
| 
jcallahan@169
 | 
   247 do
 | 
| 
jcallahan@169
 | 
   248     local header_list = {}
 | 
| 
jcallahan@169
 | 
   249 
 | 
| 
jcallahan@169
 | 
   250     function TradeSkillExecutePer(iter_func)
 | 
| 
jcallahan@169
 | 
   251         if not _G.TradeSkillFrame or not _G.TradeSkillFrame:IsVisible() then
 | 
| 
jcallahan@169
 | 
   252             return
 | 
| 
jcallahan@169
 | 
   253         end
 | 
| 
jcallahan@167
 | 
   254         -- Clear the search box focus so the scan will have correct results.
 | 
| 
jcallahan@167
 | 
   255         local search_box = _G.TradeSkillFrameSearchBox
 | 
| 
jcallahan@167
 | 
   256         search_box:SetText("")
 | 
| 
jcallahan@169
 | 
   257 
 | 
| 
jcallahan@167
 | 
   258         _G.TradeSkillSearch_OnTextChanged(search_box)
 | 
| 
jcallahan@167
 | 
   259         search_box:ClearFocus()
 | 
| 
jcallahan@167
 | 
   260         search_box:GetScript("OnEditFocusLost")(search_box)
 | 
| 
jcallahan@169
 | 
   261 
 | 
| 
jcallahan@169
 | 
   262         table.wipe(header_list)
 | 
| 
jcallahan@169
 | 
   263 
 | 
| 
jcallahan@169
 | 
   264         -- Save the current state of the TradeSkillFrame so it can be restored after we muck with it.
 | 
| 
jcallahan@169
 | 
   265         local have_materials = _G.TradeSkillFrame.filterTbl.hasMaterials
 | 
| 
jcallahan@169
 | 
   266         local have_skillup = _G.TradeSkillFrame.filterTbl.hasSkillUp
 | 
| 
jcallahan@169
 | 
   267 
 | 
| 
jcallahan@169
 | 
   268         if have_materials then
 | 
| 
jcallahan@169
 | 
   269             _G.TradeSkillFrame.filterTbl.hasMaterials = false
 | 
| 
jcallahan@169
 | 
   270             _G.TradeSkillOnlyShowMakeable(false)
 | 
| 
jcallahan@169
 | 
   271         end
 | 
| 
jcallahan@169
 | 
   272 
 | 
| 
jcallahan@169
 | 
   273         if have_skillup then
 | 
| 
jcallahan@169
 | 
   274             _G.TradeSkillFrame.filterTbl.hasSkillUp = false
 | 
| 
jcallahan@169
 | 
   275             _G.TradeSkillOnlyShowSkillUps(false)
 | 
| 
jcallahan@169
 | 
   276         end
 | 
| 
MMOSimca@330
 | 
   277         _G.SetTradeSkillInvSlotFilter(0, true, true)
 | 
| 
jcallahan@169
 | 
   278         _G.TradeSkillUpdateFilterBar()
 | 
| 
jcallahan@169
 | 
   279         _G.TradeSkillFrame_Update()
 | 
| 
jcallahan@169
 | 
   280 
 | 
| 
jcallahan@169
 | 
   281         -- Expand all headers so we can see all the recipes there are
 | 
| 
jcallahan@169
 | 
   282         for tradeskill_index = 1, _G.GetNumTradeSkills() do
 | 
| 
jcallahan@169
 | 
   283             local name, tradeskill_type, _, is_expanded = _G.GetTradeSkillInfo(tradeskill_index)
 | 
| 
jcallahan@169
 | 
   284 
 | 
| 
jcallahan@169
 | 
   285             if tradeskill_type == "header" or tradeskill_type == "subheader" then
 | 
| 
jcallahan@169
 | 
   286                 if not is_expanded then
 | 
| 
jcallahan@169
 | 
   287                     header_list[name] = true
 | 
| 
jcallahan@169
 | 
   288                     _G.ExpandTradeSkillSubClass(tradeskill_index)
 | 
| 
jcallahan@169
 | 
   289                 end
 | 
| 
jcallahan@169
 | 
   290             elseif iter_func(name, tradeskill_index) then
 | 
| 
jcallahan@169
 | 
   291                 break
 | 
| 
jcallahan@169
 | 
   292             end
 | 
| 
jcallahan@169
 | 
   293         end
 | 
| 
jcallahan@169
 | 
   294 
 | 
| 
jcallahan@169
 | 
   295         -- Restore the state of the things we changed.
 | 
| 
jcallahan@169
 | 
   296         for tradeskill_index = 1, _G.GetNumTradeSkills() do
 | 
| 
jcallahan@169
 | 
   297             local name, tradeskill_type, _, is_expanded = _G.GetTradeSkillInfo(tradeskill_index)
 | 
| 
jcallahan@169
 | 
   298 
 | 
| 
jcallahan@169
 | 
   299             if header_list[name] then
 | 
| 
jcallahan@169
 | 
   300                 _G.CollapseTradeSkillSubClass(tradeskill_index)
 | 
| 
jcallahan@169
 | 
   301             end
 | 
| 
jcallahan@169
 | 
   302         end
 | 
| 
jcallahan@169
 | 
   303         _G.TradeSkillFrame.filterTbl.hasMaterials = have_materials
 | 
| 
jcallahan@169
 | 
   304         _G.TradeSkillOnlyShowMakeable(have_materials)
 | 
| 
jcallahan@169
 | 
   305         _G.TradeSkillFrame.filterTbl.hasSkillUp = have_skillup
 | 
| 
jcallahan@169
 | 
   306         _G.TradeSkillOnlyShowSkillUps(have_skillup)
 | 
| 
jcallahan@169
 | 
   307 
 | 
| 
jcallahan@169
 | 
   308         _G.TradeSkillUpdateFilterBar()
 | 
| 
jcallahan@169
 | 
   309         _G.TradeSkillFrame_Update()
 | 
| 
jcallahan@167
 | 
   310     end
 | 
| 
jcallahan@169
 | 
   311 end -- do-block
 | 
| 
jcallahan@167
 | 
   312 
 | 
| 
jcallahan@167
 | 
   313 
 | 
| 
jcallahan@39
 | 
   314 local ActualCopperCost
 | 
| 
jcallahan@39
 | 
   315 do
 | 
| 
jcallahan@39
 | 
   316     local BARTERING_SPELL_ID = 83964
 | 
| 
jcallahan@39
 | 
   317 
 | 
| 
jcallahan@39
 | 
   318     local STANDING_DISCOUNTS = {
 | 
| 
jcallahan@39
 | 
   319         HATED = 0,
 | 
| 
jcallahan@39
 | 
   320         HOSTILE = 0,
 | 
| 
jcallahan@39
 | 
   321         UNFRIENDLY = 0,
 | 
| 
jcallahan@39
 | 
   322         NEUTRAL = 0,
 | 
| 
jcallahan@39
 | 
   323         FRIENDLY = 0.05,
 | 
| 
jcallahan@39
 | 
   324         HONORED = 0.1,
 | 
| 
jcallahan@39
 | 
   325         REVERED = 0.15,
 | 
| 
jcallahan@39
 | 
   326         EXALTED = 0.2,
 | 
| 
jcallahan@39
 | 
   327     }
 | 
| 
jcallahan@39
 | 
   328 
 | 
| 
jcallahan@39
 | 
   329 
 | 
| 
jcallahan@39
 | 
   330     function ActualCopperCost(copper_cost, rep_standing)
 | 
| 
jcallahan@39
 | 
   331         if not copper_cost or copper_cost == 0 then
 | 
| 
jcallahan@39
 | 
   332             return 0
 | 
| 
jcallahan@39
 | 
   333         end
 | 
| 
jcallahan@39
 | 
   334         local modifier = 1
 | 
| 
jcallahan@39
 | 
   335 
 | 
| 
jcallahan@39
 | 
   336         if _G.IsSpellKnown(BARTERING_SPELL_ID) then
 | 
| 
jcallahan@39
 | 
   337             modifier = modifier - 0.1
 | 
| 
jcallahan@39
 | 
   338         end
 | 
| 
jcallahan@39
 | 
   339 
 | 
| 
jcallahan@39
 | 
   340         if rep_standing then
 | 
| 
jcallahan@39
 | 
   341             if PLAYER_RACE == "Goblin" then
 | 
| 
jcallahan@39
 | 
   342                 modifier = modifier - STANDING_DISCOUNTS["EXALTED"]
 | 
| 
jcallahan@39
 | 
   343             elseif STANDING_DISCOUNTS[rep_standing] then
 | 
| 
jcallahan@39
 | 
   344                 modifier = modifier - STANDING_DISCOUNTS[rep_standing]
 | 
| 
jcallahan@39
 | 
   345             end
 | 
| 
jcallahan@39
 | 
   346         end
 | 
| 
jcallahan@39
 | 
   347         return math.floor(copper_cost / modifier)
 | 
| 
jcallahan@39
 | 
   348     end
 | 
| 
jcallahan@39
 | 
   349 end -- do-block
 | 
| 
jcallahan@39
 | 
   350 
 | 
| 
jcallahan@39
 | 
   351 
 | 
| 
jcallahan@29
 | 
   352 local function InstanceDifficultyToken()
 | 
| 
MMOSimca@440
 | 
   353     -- Sometimes, instance information is returned when not in an instance. This check protects against that.
 | 
| 
MMOSimca@440
 | 
   354     if _G.IsInInstance() then
 | 
| 
MMOSimca@440
 | 
   355         local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo()
 | 
| 
MMOSimca@440
 | 
   356 
 | 
| 
MMOSimca@440
 | 
   357         if not instance_type or instance_type == "" then
 | 
| 
MMOSimca@440
 | 
   358             instance_type = "NONE"
 | 
| 
MMOSimca@440
 | 
   359         end
 | 
| 
MMOSimca@440
 | 
   360         return ("%s:%d:%s"):format(instance_type:upper(), instance_difficulty, tostring(is_dynamic))
 | 
| 
jcallahan@59
 | 
   361     end
 | 
| 
MMOSimca@440
 | 
   362     return "NONE:0:false"
 | 
| 
jcallahan@29
 | 
   363 end
 | 
| 
jcallahan@29
 | 
   364 
 | 
| 
jcallahan@29
 | 
   365 
 | 
| 
jcallahan@1
 | 
   366 local function CurrentLocationData()
 | 
| 
jcallahan@161
 | 
   367     if _G.GetCurrentMapAreaID() ~= current_area_id then
 | 
| 
jcallahan@145
 | 
   368         return _G.GetRealZoneText(), current_area_id, 0, 0, 0, InstanceDifficultyToken()
 | 
| 
jcallahan@145
 | 
   369     end
 | 
| 
jcallahan@1
 | 
   370     local map_level = _G.GetCurrentMapDungeonLevel() or 0
 | 
| 
jcallahan@1
 | 
   371     local x, y = _G.GetPlayerMapPosition("player")
 | 
| 
jcallahan@1
 | 
   372 
 | 
| 
jcallahan@1
 | 
   373     x = x or 0
 | 
| 
jcallahan@1
 | 
   374     y = y or 0
 | 
| 
jcallahan@1
 | 
   375 
 | 
| 
jcallahan@1
 | 
   376     if x == 0 and y == 0 then
 | 
| 
jcallahan@1
 | 
   377         for level_index = 1, _G.GetNumDungeonMapLevels() do
 | 
| 
jcallahan@1
 | 
   378             _G.SetDungeonMapLevel(level_index)
 | 
| 
jcallahan@1
 | 
   379             x, y = _G.GetPlayerMapPosition("player")
 | 
| 
jcallahan@1
 | 
   380 
 | 
| 
jcallahan@1
 | 
   381             if x and y and (x > 0 or y > 0) then
 | 
| 
jcallahan@1
 | 
   382                 _G.SetDungeonMapLevel(map_level)
 | 
| 
jcallahan@1
 | 
   383                 map_level = level_index
 | 
| 
jcallahan@1
 | 
   384                 break
 | 
| 
jcallahan@1
 | 
   385             end
 | 
| 
jcallahan@1
 | 
   386         end
 | 
| 
jcallahan@1
 | 
   387     end
 | 
| 
jcallahan@1
 | 
   388 
 | 
| 
jcallahan@1
 | 
   389     if _G.DungeonUsesTerrainMap() then
 | 
| 
jcallahan@1
 | 
   390         map_level = map_level - 1
 | 
| 
jcallahan@1
 | 
   391     end
 | 
| 
jcallahan@31
 | 
   392     local x = _G.floor(x * 1000)
 | 
| 
jcallahan@31
 | 
   393     local y = _G.floor(y * 1000)
 | 
| 
jcallahan@28
 | 
   394 
 | 
| 
jcallahan@31
 | 
   395     if x % 2 ~= 0 then
 | 
| 
jcallahan@31
 | 
   396         x = x + 1
 | 
| 
jcallahan@28
 | 
   397     end
 | 
| 
jcallahan@28
 | 
   398 
 | 
| 
jcallahan@31
 | 
   399     if y % 2 ~= 0 then
 | 
| 
jcallahan@31
 | 
   400         y = y + 1
 | 
| 
jcallahan@28
 | 
   401     end
 | 
| 
jcallahan@126
 | 
   402     return _G.GetRealZoneText(), current_area_id, x, y, map_level, InstanceDifficultyToken()
 | 
| 
jcallahan@1
 | 
   403 end
 | 
| 
jcallahan@1
 | 
   404 
 | 
| 
jcallahan@1
 | 
   405 
 | 
| 
MMOSimca@441
 | 
   406 local function DBEntry(data_type, unit_id)
 | 
| 
MMOSimca@441
 | 
   407     if not data_type or not unit_id then
 | 
| 
jcallahan@312
 | 
   408         return
 | 
| 
jcallahan@312
 | 
   409     end
 | 
| 
MMOSimca@441
 | 
   410     local category = global_db[data_type]
 | 
| 
MMOSimca@441
 | 
   411 
 | 
| 
MMOSimca@441
 | 
   412     if not category then
 | 
| 
MMOSimca@441
 | 
   413         category = {}
 | 
| 
MMOSimca@441
 | 
   414         global_db[data_type] = category
 | 
| 
MMOSimca@441
 | 
   415     end
 | 
| 
MMOSimca@441
 | 
   416     local unit = category[unit_id]
 | 
| 
MMOSimca@441
 | 
   417 
 | 
| 
MMOSimca@441
 | 
   418     if not unit then
 | 
| 
MMOSimca@441
 | 
   419         unit = {}
 | 
| 
MMOSimca@441
 | 
   420         category[unit_id] = unit
 | 
| 
MMOSimca@441
 | 
   421     end
 | 
| 
MMOSimca@441
 | 
   422     return unit
 | 
| 
jcallahan@312
 | 
   423 end
 | 
| 
jcallahan@312
 | 
   424 
 | 
| 
MMOSimca@441
 | 
   425 private.DBEntry = DBEntry
 | 
| 
MMOSimca@441
 | 
   426 
 | 
| 
MMOSimca@441
 | 
   427 local NPCEntry
 | 
| 
MMOSimca@441
 | 
   428 do
 | 
| 
MMOSimca@441
 | 
   429     local npc_prototype = {}
 | 
| 
MMOSimca@441
 | 
   430     local npc_meta = {
 | 
| 
MMOSimca@441
 | 
   431         __index = npc_prototype
 | 
| 
MMOSimca@441
 | 
   432     }
 | 
| 
MMOSimca@441
 | 
   433 
 | 
| 
MMOSimca@441
 | 
   434     function NPCEntry(identifier)
 | 
| 
MMOSimca@441
 | 
   435         local npc = DBEntry("npcs", identifier)
 | 
| 
MMOSimca@441
 | 
   436         return npc and _G.setmetatable(npc, npc_meta) or nil
 | 
| 
jcallahan@1
 | 
   437     end
 | 
| 
MMOSimca@441
 | 
   438 
 | 
| 
MMOSimca@441
 | 
   439     function npc_prototype:EncounterData(difficulty_token)
 | 
| 
MMOSimca@441
 | 
   440         self.encounter_data = self.encounter_data or {}
 | 
| 
MMOSimca@441
 | 
   441         self.encounter_data[difficulty_token] = self.encounter_data[difficulty_token] or {}
 | 
| 
MMOSimca@441
 | 
   442         self.encounter_data[difficulty_token].stats = self.encounter_data[difficulty_token].stats or {}
 | 
| 
MMOSimca@441
 | 
   443 
 | 
| 
MMOSimca@441
 | 
   444         return self.encounter_data[difficulty_token]
 | 
| 
MMOSimca@441
 | 
   445     end
 | 
| 
jcallahan@1
 | 
   446 end
 | 
| 
jcallahan@270
 | 
   447 
 | 
| 
jcallahan@4
 | 
   448 
 | 
| 
jcallahan@141
 | 
   449 local UpdateDBEntryLocation
 | 
| 
jcallahan@141
 | 
   450 do
 | 
| 
jcallahan@141
 | 
   451     -- Fishing node coordinate code based on code in GatherMate2 with permission from Kagaro.
 | 
| 
jcallahan@141
 | 
   452     local function FishingCoordinates(x, y, yard_width, yard_height)
 | 
| 
jcallahan@141
 | 
   453         local facing = _G.GetPlayerFacing()
 | 
| 
jcallahan@141
 | 
   454 
 | 
| 
jcallahan@141
 | 
   455         if not facing then
 | 
| 
jcallahan@141
 | 
   456             return x, y
 | 
| 
jcallahan@141
 | 
   457         end
 | 
| 
jcallahan@246
 | 
   458         local rad = facing + math.pi
 | 
| 
jcallahan@141
 | 
   459         return x + math.sin(rad) * 15 / yard_width, y + math.cos(rad) * 15 / yard_height
 | 
| 
jcallahan@10
 | 
   460     end
 | 
| 
jcallahan@10
 | 
   461 
 | 
| 
jcallahan@24
 | 
   462 
 | 
| 
jcallahan@141
 | 
   463     function UpdateDBEntryLocation(entry_type, identifier)
 | 
| 
jcallahan@141
 | 
   464         if not identifier then
 | 
| 
jcallahan@141
 | 
   465             return
 | 
| 
jcallahan@141
 | 
   466         end
 | 
| 
jcallahan@141
 | 
   467         local zone_name, area_id, x, y, map_level, difficulty_token = CurrentLocationData()
 | 
| 
MMOSimca@328
 | 
   468         if not (zone_name and area_id and x and y and map_level) then
 | 
| 
MMOSimca@328
 | 
   469             Debug("UpdateDBEntryLocation: Missing current location data - %s, %d, %d, %d, %d.", zone_name, area_id, x, y, map_level)
 | 
| 
MMOSimca@328
 | 
   470             return
 | 
| 
MMOSimca@328
 | 
   471         end
 | 
| 
jcallahan@141
 | 
   472         local entry = DBEntry(entry_type, identifier)
 | 
| 
jcallahan@141
 | 
   473         entry[difficulty_token] = entry[difficulty_token] or {}
 | 
| 
jcallahan@141
 | 
   474         entry[difficulty_token].locations = entry[difficulty_token].locations or {}
 | 
| 
jcallahan@141
 | 
   475 
 | 
| 
jcallahan@141
 | 
   476         local zone_token = ("%s:%d"):format(zone_name, area_id)
 | 
| 
jcallahan@141
 | 
   477         local zone_data = entry[difficulty_token].locations[zone_token]
 | 
| 
jcallahan@141
 | 
   478 
 | 
| 
jcallahan@141
 | 
   479         if not zone_data then
 | 
| 
jcallahan@141
 | 
   480             zone_data = {}
 | 
| 
jcallahan@141
 | 
   481             entry[difficulty_token].locations[zone_token] = zone_data
 | 
| 
jcallahan@141
 | 
   482         end
 | 
| 
jcallahan@141
 | 
   483 
 | 
| 
jcallahan@141
 | 
   484         -- Special case for Fishing.
 | 
| 
jcallahan@141
 | 
   485         if current_action.spell_label == "FISHING" then
 | 
| 
MMOSimca@441
 | 
   486             local _, qx, qy = _G.GetWorldLocFromMapPos(0, 0)
 | 
| 
MMOSimca@441
 | 
   487             local _, wx, wy = _G.GetWorldLocFromMapPos(1, 1)
 | 
| 
MMOSimca@441
 | 
   488             local yard_width, yard_height = qy - wy, qx - wx
 | 
| 
jcallahan@141
 | 
   489 
 | 
| 
jcallahan@141
 | 
   490             if yard_width > 0 and yard_height > 0 then
 | 
| 
jcallahan@141
 | 
   491                 x, y = FishingCoordinates(x, y, yard_width, yard_height)
 | 
| 
jcallahan@141
 | 
   492                 current_action.x = x
 | 
| 
jcallahan@141
 | 
   493                 current_action.y = y
 | 
| 
jcallahan@141
 | 
   494             end
 | 
| 
jcallahan@141
 | 
   495         end
 | 
| 
jcallahan@141
 | 
   496         local location_token = ("%d:%d:%d"):format(map_level, x, y)
 | 
| 
jcallahan@141
 | 
   497 
 | 
| 
jcallahan@141
 | 
   498         zone_data[location_token] = zone_data[location_token] or true
 | 
| 
jcallahan@141
 | 
   499         return zone_data
 | 
| 
jcallahan@10
 | 
   500     end
 | 
| 
jcallahan@141
 | 
   501 end -- do-block
 | 
| 
jcallahan@10
 | 
   502 
 | 
| 
jcallahan@10
 | 
   503 
 | 
| 
MMOSimca@441
 | 
   504 local function CurrencyLinkToTexture(currency_link)
 | 
| 
MMOSimca@441
 | 
   505     if not currency_link then
 | 
| 
MMOSimca@441
 | 
   506         return
 | 
| 
MMOSimca@441
 | 
   507     end
 | 
| 
MMOSimca@441
 | 
   508     local _, _, texture_path = _G.GetCurrencyInfo(tonumber(currency_link:match("currency:(%d+)")))
 | 
| 
MMOSimca@441
 | 
   509     return texture_path:match("[^\\]+$"):lower()
 | 
| 
MMOSimca@441
 | 
   510 end
 | 
| 
MMOSimca@441
 | 
   511 
 | 
| 
MMOSimca@441
 | 
   512 
 | 
| 
MMOSimca@441
 | 
   513 local function ItemLinkToID(item_link)
 | 
| 
MMOSimca@441
 | 
   514     if not item_link then
 | 
| 
MMOSimca@441
 | 
   515         return
 | 
| 
MMOSimca@441
 | 
   516     end
 | 
| 
MMOSimca@441
 | 
   517     return tonumber(tostring(item_link):match("item:(%d+)"))
 | 
| 
MMOSimca@441
 | 
   518 end
 | 
| 
MMOSimca@441
 | 
   519 
 | 
| 
MMOSimca@441
 | 
   520 private.ItemLinkToID = ItemLinkToID
 | 
| 
MMOSimca@441
 | 
   521 
 | 
| 
MMOSimca@441
 | 
   522 local function UnitTypeIsNPC(unit_type)
 | 
| 
MMOSimca@441
 | 
   523     return unit_type == private.UNIT_TYPES.NPC or unit_type == private.UNIT_TYPES.VEHICLE
 | 
| 
MMOSimca@441
 | 
   524 end
 | 
| 
MMOSimca@441
 | 
   525 
 | 
| 
MMOSimca@441
 | 
   526 
 | 
| 
MMOSimca@441
 | 
   527 local ParseGUID
 | 
| 
MMOSimca@441
 | 
   528 do
 | 
| 
MMOSimca@441
 | 
   529     local UNIT_TYPES = private.UNIT_TYPES
 | 
| 
MMOSimca@441
 | 
   530 
 | 
| 
MMOSimca@441
 | 
   531     local NPC_ID_MAPPING = {
 | 
| 
MMOSimca@441
 | 
   532         [62164] = 63191, -- Garalon
 | 
| 
MMOSimca@441
 | 
   533     }
 | 
| 
MMOSimca@441
 | 
   534 
 | 
| 
MMOSimca@441
 | 
   535 
 | 
| 
MMOSimca@441
 | 
   536     local function MatchUnitTypes(unit_type_name)
 | 
| 
MMOSimca@441
 | 
   537         if not unit_type_name then
 | 
| 
MMOSimca@441
 | 
   538             return UNIT_TYPES.UNKNOWN
 | 
| 
MMOSimca@441
 | 
   539         end
 | 
| 
MMOSimca@441
 | 
   540 
 | 
| 
MMOSimca@441
 | 
   541         for def, text in next, UNIT_TYPES do
 | 
| 
MMOSimca@441
 | 
   542             if unit_type_name == text then
 | 
| 
MMOSimca@441
 | 
   543                 return UNIT_TYPES[def]
 | 
| 
MMOSimca@441
 | 
   544             end
 | 
| 
MMOSimca@441
 | 
   545         end
 | 
| 
MMOSimca@441
 | 
   546         return UNIT_TYPES.UNKNOWN
 | 
| 
MMOSimca@441
 | 
   547     end
 | 
| 
MMOSimca@441
 | 
   548 
 | 
| 
MMOSimca@441
 | 
   549 
 | 
| 
MMOSimca@441
 | 
   550     function ParseGUID(guid)
 | 
| 
MMOSimca@441
 | 
   551         if not guid then
 | 
| 
MMOSimca@441
 | 
   552             return
 | 
| 
MMOSimca@441
 | 
   553         end
 | 
| 
MMOSimca@441
 | 
   554 
 | 
| 
MMOSimca@441
 | 
   555         -- We might want to use some of this new information later, but leaving the returns alone for now
 | 
| 
MMOSimca@441
 | 
   556         local unit_type_name, unk_id1, server_id, instance_id, unk_id2, unit_idnum, spawn_id = ("-"):split(guid)
 | 
| 
MMOSimca@441
 | 
   557 
 | 
| 
MMOSimca@441
 | 
   558         local unit_type = MatchUnitTypes(unit_type_name)
 | 
| 
MMOSimca@441
 | 
   559         if unit_type ~= UNIT_TYPES.PLAYER and unit_type ~= UNIT_TYPES.PET and unit_type ~= UNIT_TYPES.ITEM then
 | 
| 
MMOSimca@441
 | 
   560 
 | 
| 
MMOSimca@441
 | 
   561             local id_mapping = NPC_ID_MAPPING[unit_idnum]
 | 
| 
MMOSimca@441
 | 
   562 
 | 
| 
MMOSimca@441
 | 
   563             if id_mapping and UnitTypeIsNPC(unit_type) then
 | 
| 
MMOSimca@441
 | 
   564                 unit_idnum = id_mapping
 | 
| 
MMOSimca@441
 | 
   565             end
 | 
| 
MMOSimca@441
 | 
   566             return unit_type, unit_idnum
 | 
| 
MMOSimca@441
 | 
   567         end
 | 
| 
MMOSimca@441
 | 
   568         return unit_type
 | 
| 
MMOSimca@441
 | 
   569     end
 | 
| 
MMOSimca@441
 | 
   570 
 | 
| 
MMOSimca@441
 | 
   571     private.ParseGUID = ParseGUID
 | 
| 
MMOSimca@441
 | 
   572 end -- do-block
 | 
| 
MMOSimca@441
 | 
   573 
 | 
| 
MMOSimca@441
 | 
   574 
 | 
| 
jcallahan@19
 | 
   575 local function HandleItemUse(item_link, bag_index, slot_index)
 | 
| 
jcallahan@19
 | 
   576     if not item_link then
 | 
| 
jcallahan@19
 | 
   577         return
 | 
| 
jcallahan@19
 | 
   578     end
 | 
| 
jcallahan@19
 | 
   579     local item_id = ItemLinkToID(item_link)
 | 
| 
jcallahan@19
 | 
   580 
 | 
| 
jcallahan@19
 | 
   581     if not bag_index or not slot_index then
 | 
| 
jcallahan@19
 | 
   582         for new_bag_index = 0, _G.NUM_BAG_FRAMES do
 | 
| 
jcallahan@19
 | 
   583             for new_slot_index = 1, _G.GetContainerNumSlots(new_bag_index) do
 | 
| 
jcallahan@19
 | 
   584                 if item_id == ItemLinkToID(_G.GetContainerItemLink(new_bag_index, new_slot_index)) then
 | 
| 
jcallahan@19
 | 
   585                     bag_index = new_bag_index
 | 
| 
jcallahan@19
 | 
   586                     slot_index = new_slot_index
 | 
| 
jcallahan@19
 | 
   587                     break
 | 
| 
jcallahan@19
 | 
   588                 end
 | 
| 
jcallahan@19
 | 
   589             end
 | 
| 
jcallahan@19
 | 
   590         end
 | 
| 
jcallahan@19
 | 
   591     end
 | 
| 
jcallahan@19
 | 
   592 
 | 
| 
MMOSimca@410
 | 
   593     local any_loot = false
 | 
| 
MMOSimca@410
 | 
   594 
 | 
| 
MMOSimca@411
 | 
   595     -- Check if Blizzard has marked this item as officially having a chance of containing loot
 | 
| 
MMOSimca@410
 | 
   596     if bag_index and slot_index then
 | 
| 
MMOSimca@410
 | 
   597         local _, _, _, _, _, is_lootable = _G.GetContainerItemInfo(bag_index, slot_index)
 | 
| 
MMOSimca@410
 | 
   598         if is_lootable then
 | 
| 
MMOSimca@410
 | 
   599             any_loot = true
 | 
| 
MMOSimca@410
 | 
   600         end
 | 
| 
jcallahan@19
 | 
   601     end
 | 
| 
MMOSimca@410
 | 
   602     
 | 
| 
MMOSimca@410
 | 
   603     -- Check if we've marked this item as one Blizzard provides bad is_lootable data for
 | 
| 
MMOSimca@410
 | 
   604     if private.CONTAINER_ITEM_ID_LIST[item_id] ~= nil then
 | 
| 
MMOSimca@410
 | 
   605         any_loot = true
 | 
| 
jcallahan@19
 | 
   606     end
 | 
| 
MMOSimca@368
 | 
   607 
 | 
| 
MMOSimca@436
 | 
   608     -- Going to block 'chat-loot data' at this level for now because I don't think we actually want normal item containers being recorded in these scenarios either.
 | 
| 
MMOSimca@436
 | 
   609     if any_loot and not block_chat_loot_data then
 | 
| 
MMOSimca@414
 | 
   610         -- For item containers that open instantly with no spell cast
 | 
| 
MMOSimca@410
 | 
   611         if (private.CONTAINER_ITEM_ID_LIST[item_id] == true) and ((not _G.GetNumLootItems()) or (_G.GetNumLootItems() == 0)) then
 | 
| 
MMOSimca@410
 | 
   612             ClearChatLootData()
 | 
| 
MMOSimca@410
 | 
   613             Debug("HandleItemUse: Beginning chat-based loot timer for item with ID %d.", item_id)
 | 
| 
MMOSimca@423
 | 
   614             chat_loot_timer_handle = C_Timer.NewTimer(1.5, ClearChatLootData)
 | 
| 
MMOSimca@414
 | 
   615             chat_loot_data.identifier = item_id
 | 
| 
MMOSimca@414
 | 
   616         -- For normal item containers
 | 
| 
MMOSimca@414
 | 
   617         else
 | 
| 
MMOSimca@414
 | 
   618             table.wipe(current_action)
 | 
| 
MMOSimca@414
 | 
   619             current_loot = nil
 | 
| 
MMOSimca@414
 | 
   620             current_action.target_type = AF.ITEM
 | 
| 
MMOSimca@414
 | 
   621             current_action.identifier = item_id
 | 
| 
MMOSimca@414
 | 
   622             current_action.loot_label = "contains"
 | 
| 
MMOSimca@410
 | 
   623         end
 | 
| 
MMOSimca@393
 | 
   624     end
 | 
| 
jcallahan@19
 | 
   625 end
 | 
| 
jcallahan@19
 | 
   626 
 | 
| 
jcallahan@19
 | 
   627 
 | 
| 
jcallahan@39
 | 
   628 local UnitFactionStanding
 | 
| 
jcallahan@32
 | 
   629 local UpdateFactionData
 | 
| 
jcallahan@32
 | 
   630 do
 | 
| 
jcallahan@32
 | 
   631     local MAX_FACTION_INDEX = 1000
 | 
| 
jcallahan@20
 | 
   632 
 | 
| 
jcallahan@32
 | 
   633     local STANDING_NAMES = {
 | 
| 
jcallahan@32
 | 
   634         "HATED",
 | 
| 
jcallahan@32
 | 
   635         "HOSTILE",
 | 
| 
jcallahan@32
 | 
   636         "UNFRIENDLY",
 | 
| 
jcallahan@32
 | 
   637         "NEUTRAL",
 | 
| 
jcallahan@32
 | 
   638         "FRIENDLY",
 | 
| 
jcallahan@32
 | 
   639         "HONORED",
 | 
| 
jcallahan@32
 | 
   640         "REVERED",
 | 
| 
jcallahan@32
 | 
   641         "EXALTED",
 | 
| 
jcallahan@32
 | 
   642     }
 | 
| 
jcallahan@32
 | 
   643 
 | 
| 
jcallahan@39
 | 
   644 
 | 
| 
jcallahan@39
 | 
   645     function UnitFactionStanding(unit)
 | 
| 
jcallahan@135
 | 
   646         local unit_name = _G.UnitName(unit)
 | 
| 
jcallahan@39
 | 
   647         UpdateFactionData()
 | 
| 
jcallahan@39
 | 
   648         DatamineTT:ClearLines()
 | 
| 
jcallahan@39
 | 
   649         DatamineTT:SetUnit(unit)
 | 
| 
jcallahan@39
 | 
   650 
 | 
| 
jcallahan@39
 | 
   651         for line_index = 1, DatamineTT:NumLines() do
 | 
| 
jcallahan@64
 | 
   652             local faction_name = _G["WDPDatamineTTTextLeft" .. line_index]:GetText():trim()
 | 
| 
jcallahan@39
 | 
   653 
 | 
| 
jcallahan@135
 | 
   654             if faction_name and faction_name ~= unit_name and faction_standings[faction_name] then
 | 
| 
jcallahan@39
 | 
   655                 return faction_name, faction_standings[faction_name]
 | 
| 
jcallahan@39
 | 
   656             end
 | 
| 
jcallahan@39
 | 
   657         end
 | 
| 
jcallahan@39
 | 
   658     end
 | 
| 
jcallahan@39
 | 
   659 
 | 
| 
jcallahan@39
 | 
   660 
 | 
| 
jcallahan@32
 | 
   661     function UpdateFactionData()
 | 
| 
jcallahan@32
 | 
   662         for faction_index = 1, MAX_FACTION_INDEX do
 | 
| 
jcallahan@32
 | 
   663             local faction_name, _, current_standing, _, _, _, _, _, is_header = _G.GetFactionInfo(faction_index)
 | 
| 
jcallahan@32
 | 
   664 
 | 
| 
jcallahan@86
 | 
   665             if faction_name then
 | 
| 
jcallahan@32
 | 
   666                 faction_standings[faction_name] = STANDING_NAMES[current_standing]
 | 
| 
jcallahan@32
 | 
   667             elseif not faction_name then
 | 
| 
jcallahan@32
 | 
   668                 break
 | 
| 
jcallahan@32
 | 
   669             end
 | 
| 
jcallahan@20
 | 
   670         end
 | 
| 
jcallahan@20
 | 
   671     end
 | 
| 
jcallahan@32
 | 
   672 end -- do-block
 | 
| 
jcallahan@20
 | 
   673 
 | 
| 
jcallahan@48
 | 
   674 
 | 
| 
MMOSimca@429
 | 
   675 local GenericLootUpdate, LootTable
 | 
| 
jcallahan@75
 | 
   676 do
 | 
| 
MMOSimca@429
 | 
   677     function LootTable(entry, loot_type, top_field)
 | 
| 
jcallahan@75
 | 
   678         if top_field then
 | 
| 
jcallahan@75
 | 
   679             entry[top_field] = entry[top_field] or {}
 | 
| 
jcallahan@75
 | 
   680             entry[top_field][loot_type] = entry[top_field][loot_type] or {}
 | 
| 
jcallahan@75
 | 
   681             return entry[top_field][loot_type]
 | 
| 
jcallahan@75
 | 
   682         end
 | 
| 
jcallahan@48
 | 
   683         entry[loot_type] = entry[loot_type] or {}
 | 
| 
jcallahan@75
 | 
   684         return entry[loot_type]
 | 
| 
jcallahan@48
 | 
   685     end
 | 
| 
jcallahan@48
 | 
   686 
 | 
| 
jcallahan@75
 | 
   687     function GenericLootUpdate(data_type, top_field)
 | 
| 
jcallahan@132
 | 
   688         local loot_type = current_loot.label
 | 
| 
jcallahan@75
 | 
   689         local loot_count = ("%s_count"):format(loot_type)
 | 
| 
jcallahan@77
 | 
   690         local source_list = {}
 | 
| 
jcallahan@75
 | 
   691 
 | 
| 
jcallahan@131
 | 
   692         if current_loot.sources then
 | 
| 
jcallahan@131
 | 
   693             for source_guid, loot_data in pairs(current_loot.sources) do
 | 
| 
jcallahan@304
 | 
   694                 local source_id
 | 
| 
jcallahan@78
 | 
   695 
 | 
| 
jcallahan@131
 | 
   696                 if current_loot.target_type == AF.ITEM then
 | 
| 
jcallahan@119
 | 
   697                     -- Items return the player as the source, so we need to use the item's ID (disenchant, milling, etc)
 | 
| 
jcallahan@131
 | 
   698                     source_id = current_loot.identifier
 | 
| 
jcallahan@119
 | 
   699                 else
 | 
| 
jcallahan@331
 | 
   700                     local _, unit_ID = ParseGUID(source_guid)
 | 
| 
MMOSimca@328
 | 
   701                     if unit_ID then
 | 
| 
MMOSimca@328
 | 
   702                         if current_loot.target_type == AF.OBJECT then
 | 
| 
MMOSimca@328
 | 
   703                             source_id = ("%s:%s"):format(current_loot.spell_label, unit_ID)
 | 
| 
MMOSimca@328
 | 
   704                         else
 | 
| 
MMOSimca@328
 | 
   705                             source_id = unit_ID
 | 
| 
MMOSimca@328
 | 
   706                         end
 | 
| 
MMOSimca@328
 | 
   707                     end
 | 
| 
jcallahan@119
 | 
   708                 end
 | 
| 
jcallahan@304
 | 
   709                 local entry = DBEntry(data_type, source_id)
 | 
| 
jcallahan@75
 | 
   710 
 | 
| 
jcallahan@119
 | 
   711                 if entry then
 | 
| 
jcallahan@119
 | 
   712                     local loot_table = LootTable(entry, loot_type, top_field)
 | 
| 
jcallahan@77
 | 
   713 
 | 
| 
jcallahan@304
 | 
   714                     if not source_list[source_id] then
 | 
| 
jcallahan@119
 | 
   715                         if top_field then
 | 
| 
jcallahan@119
 | 
   716                             entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1
 | 
| 
MMOSimca@387
 | 
   717                         elseif not container_loot_toasting then
 | 
| 
jcallahan@119
 | 
   718                             entry[loot_count] = (entry[loot_count] or 0) + 1
 | 
| 
jcallahan@119
 | 
   719                         end
 | 
| 
jcallahan@304
 | 
   720                         source_list[source_id] = true
 | 
| 
jcallahan@77
 | 
   721                     end
 | 
| 
jcallahan@119
 | 
   722                     UpdateDBEntryLocation(data_type, source_id)
 | 
| 
jcallahan@75
 | 
   723 
 | 
| 
jcallahan@309
 | 
   724                     if current_loot.target_type == AF.ZONE then
 | 
| 
jcallahan@309
 | 
   725                         for item_id, quantity in pairs(loot_data) do
 | 
| 
jcallahan@309
 | 
   726                             table.insert(loot_table, ("%d:%d"):format(item_id, quantity))
 | 
| 
jcallahan@309
 | 
   727                         end
 | 
| 
jcallahan@309
 | 
   728                     else
 | 
| 
jcallahan@308
 | 
   729                         for loot_token, quantity in pairs(loot_data) do
 | 
| 
jcallahan@308
 | 
   730                             local label, currency_texture = (":"):split(loot_token)
 | 
| 
jcallahan@308
 | 
   731 
 | 
| 
jcallahan@308
 | 
   732                             if label == "currency" and currency_texture then
 | 
| 
jcallahan@308
 | 
   733                                 table.insert(loot_table, ("currency:%d:%s"):format(quantity, currency_texture))
 | 
| 
jcallahan@308
 | 
   734                             elseif loot_token == "money" then
 | 
| 
jcallahan@308
 | 
   735                                 table.insert(loot_table, ("money:%d"):format(quantity))
 | 
| 
jcallahan@308
 | 
   736                             else
 | 
| 
jcallahan@308
 | 
   737                                 table.insert(loot_table, ("%d:%d"):format(loot_token, quantity))
 | 
| 
jcallahan@308
 | 
   738                             end
 | 
| 
jcallahan@308
 | 
   739                         end
 | 
| 
jcallahan@119
 | 
   740                     end
 | 
| 
jcallahan@75
 | 
   741                 end
 | 
| 
jcallahan@75
 | 
   742             end
 | 
| 
jcallahan@75
 | 
   743         end
 | 
| 
jcallahan@121
 | 
   744 
 | 
| 
jcallahan@121
 | 
   745         -- This is used for Gas Extractions.
 | 
| 
jcallahan@131
 | 
   746         if #current_loot.list <= 0 then
 | 
| 
jcallahan@78
 | 
   747             return
 | 
| 
jcallahan@78
 | 
   748         end
 | 
| 
jcallahan@82
 | 
   749         local entry
 | 
| 
jcallahan@82
 | 
   750 
 | 
| 
jcallahan@82
 | 
   751         -- At this point we only have a name if it's an object.
 | 
| 
MMOSimca@388
 | 
   752         -- (As of 5.x, the above statement is almost never true, but there are a few cases, like gas extractions.)
 | 
| 
jcallahan@131
 | 
   753         if current_loot.target_type == AF.OBJECT then
 | 
| 
jcallahan@131
 | 
   754             entry = DBEntry(data_type, ("%s:%s"):format(current_loot.spell_label, current_loot.object_name))
 | 
| 
jcallahan@82
 | 
   755         else
 | 
| 
jcallahan@131
 | 
   756             entry = DBEntry(data_type, current_loot.identifier)
 | 
| 
jcallahan@82
 | 
   757         end
 | 
| 
jcallahan@75
 | 
   758 
 | 
| 
jcallahan@75
 | 
   759         if not entry then
 | 
| 
jcallahan@75
 | 
   760             return
 | 
| 
jcallahan@75
 | 
   761         end
 | 
| 
jcallahan@77
 | 
   762         local loot_table = LootTable(entry, loot_type, top_field)
 | 
| 
jcallahan@77
 | 
   763 
 | 
| 
jcallahan@307
 | 
   764         if current_loot.identifier then
 | 
| 
jcallahan@307
 | 
   765             if not source_list[current_loot.identifier] then
 | 
| 
jcallahan@307
 | 
   766                 if top_field then
 | 
| 
jcallahan@307
 | 
   767                     entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1
 | 
| 
jcallahan@307
 | 
   768                 else
 | 
| 
jcallahan@307
 | 
   769                     entry[loot_count] = (entry[loot_count] or 0) + 1
 | 
| 
jcallahan@307
 | 
   770                 end
 | 
| 
jcallahan@307
 | 
   771                 source_list[current_loot.identifier] = true
 | 
| 
jcallahan@77
 | 
   772             end
 | 
| 
jcallahan@77
 | 
   773         end
 | 
| 
jcallahan@75
 | 
   774 
 | 
| 
jcallahan@131
 | 
   775         for index = 1, #current_loot.list do
 | 
| 
jcallahan@131
 | 
   776             table.insert(loot_table, current_loot.list[index])
 | 
| 
jcallahan@75
 | 
   777         end
 | 
| 
jcallahan@48
 | 
   778     end
 | 
| 
jcallahan@75
 | 
   779 end -- do-block
 | 
| 
jcallahan@48
 | 
   780 
 | 
| 
jcallahan@97
 | 
   781 
 | 
| 
jcallahan@97
 | 
   782 local ReplaceKeywords
 | 
| 
jcallahan@97
 | 
   783 do
 | 
| 
jcallahan@97
 | 
   784     local KEYWORD_SUBSTITUTIONS = {
 | 
| 
jcallahan@97
 | 
   785         class = PLAYER_CLASS,
 | 
| 
jcallahan@97
 | 
   786         name = PLAYER_NAME,
 | 
| 
jcallahan@97
 | 
   787         race = PLAYER_RACE,
 | 
| 
jcallahan@97
 | 
   788     }
 | 
| 
jcallahan@97
 | 
   789 
 | 
| 
jcallahan@97
 | 
   790 
 | 
| 
jcallahan@97
 | 
   791     function ReplaceKeywords(text)
 | 
| 
jcallahan@97
 | 
   792         if not text or text == "" then
 | 
| 
jcallahan@97
 | 
   793             return ""
 | 
| 
jcallahan@97
 | 
   794         end
 | 
| 
jcallahan@97
 | 
   795 
 | 
| 
jcallahan@97
 | 
   796         for category, lookup in pairs(KEYWORD_SUBSTITUTIONS) do
 | 
| 
jcallahan@97
 | 
   797             local category_format = ("<%s>"):format(category)
 | 
| 
jcallahan@97
 | 
   798             text = text:gsub(lookup, category_format):gsub(lookup:lower(), category_format)
 | 
| 
jcallahan@97
 | 
   799         end
 | 
| 
jcallahan@97
 | 
   800         return text
 | 
| 
jcallahan@97
 | 
   801     end
 | 
| 
jcallahan@97
 | 
   802 end -- do-block
 | 
| 
jcallahan@97
 | 
   803 
 | 
| 
jcallahan@97
 | 
   804 
 | 
| 
jcallahan@154
 | 
   805 -- Contains a dirty hack due to Blizzard's strange handling of Micro Dungeons; GetMapInfo() will not return correct information
 | 
| 
jcallahan@154
 | 
   806 -- unless the WorldMapFrame is shown.
 | 
| 
jcallahan@143
 | 
   807 do
 | 
| 
jcallahan@143
 | 
   808     -- MapFileName = MapAreaID
 | 
| 
jcallahan@143
 | 
   809     local MICRO_DUNGEON_IDS = {
 | 
| 
jcallahan@143
 | 
   810         ShrineofTwoMoons = 903,
 | 
| 
jcallahan@143
 | 
   811         ShrineofSevenStars = 905,
 | 
| 
jcallahan@143
 | 
   812     }
 | 
| 
jcallahan@126
 | 
   813 
 | 
| 
jcallahan@299
 | 
   814     local function SetCurrentAreaID()
 | 
| 
jcallahan@156
 | 
   815         if private.in_combat then
 | 
| 
jcallahan@156
 | 
   816             private.set_area_id = true
 | 
| 
jcallahan@156
 | 
   817             return
 | 
| 
jcallahan@156
 | 
   818         end
 | 
| 
jcallahan@155
 | 
   819         local map_area_id = _G.GetCurrentMapAreaID()
 | 
| 
jcallahan@155
 | 
   820 
 | 
| 
jcallahan@155
 | 
   821         if map_area_id == current_area_id then
 | 
| 
jcallahan@155
 | 
   822             return
 | 
| 
jcallahan@155
 | 
   823         end
 | 
| 
jcallahan@143
 | 
   824         local world_map = _G.WorldMapFrame
 | 
| 
jcallahan@143
 | 
   825         local map_visible = world_map:IsVisible()
 | 
| 
jcallahan@312
 | 
   826         local sfx_value = tonumber(_G.GetCVar("Sound_EnableSFX"))
 | 
| 
jcallahan@143
 | 
   827 
 | 
| 
jcallahan@143
 | 
   828         if not map_visible then
 | 
| 
jcallahan@143
 | 
   829             _G.SetCVar("Sound_EnableSFX", 0)
 | 
| 
jcallahan@143
 | 
   830             world_map:Show()
 | 
| 
jcallahan@143
 | 
   831         end
 | 
| 
jcallahan@331
 | 
   832         local _, _, _, _, micro_dungeon_map_name = _G.GetMapInfo()
 | 
| 
jcallahan@331
 | 
   833         local micro_dungeon_id = MICRO_DUNGEON_IDS[micro_dungeon_map_name]
 | 
| 
jcallahan@143
 | 
   834 
 | 
| 
jcallahan@154
 | 
   835         _G.SetMapToCurrentZone()
 | 
| 
jcallahan@154
 | 
   836 
 | 
| 
jcallahan@143
 | 
   837         if micro_dungeon_id then
 | 
| 
jcallahan@143
 | 
   838             current_area_id = micro_dungeon_id
 | 
| 
jcallahan@143
 | 
   839         else
 | 
| 
jcallahan@143
 | 
   840             current_area_id = _G.GetCurrentMapAreaID()
 | 
| 
jcallahan@143
 | 
   841         end
 | 
| 
jcallahan@143
 | 
   842 
 | 
| 
jcallahan@154
 | 
   843         if map_visible then
 | 
| 
jcallahan@154
 | 
   844             _G.SetMapByID(map_area_id)
 | 
| 
jcallahan@154
 | 
   845         else
 | 
| 
jcallahan@143
 | 
   846             world_map:Hide()
 | 
| 
jcallahan@143
 | 
   847             _G.SetCVar("Sound_EnableSFX", sfx_value)
 | 
| 
jcallahan@143
 | 
   848         end
 | 
| 
jcallahan@143
 | 
   849     end
 | 
| 
jcallahan@299
 | 
   850 
 | 
| 
jcallahan@299
 | 
   851     function WDP:HandleZoneChange(event_name)
 | 
| 
jcallahan@299
 | 
   852         in_instance = _G.IsInInstance()
 | 
| 
jcallahan@299
 | 
   853         SetCurrentAreaID()
 | 
| 
jcallahan@299
 | 
   854     end
 | 
| 
jcallahan@154
 | 
   855 end
 | 
| 
jcallahan@126
 | 
   856 
 | 
| 
MMOSimca@347
 | 
   857 
 | 
| 
MMOSimca@347
 | 
   858 -- TIMERS -------------------------------------------------------------
 | 
| 
MMOSimca@347
 | 
   859 
 | 
| 
MMOSimca@393
 | 
   860 function ClearKilledNPC()
 | 
| 
MMOSimca@347
 | 
   861     killed_npc_id = nil
 | 
| 
MMOSimca@347
 | 
   862 end
 | 
| 
MMOSimca@347
 | 
   863 
 | 
| 
MMOSimca@347
 | 
   864 
 | 
| 
MMOSimca@393
 | 
   865 function ClearKilledBossID()
 | 
| 
MMOSimca@347
 | 
   866     if killed_boss_id_timer_handle then
 | 
| 
MMOSimca@383
 | 
   867         killed_boss_id_timer_handle:Cancel()
 | 
| 
MMOSimca@347
 | 
   868         killed_boss_id_timer_handle = nil
 | 
| 
MMOSimca@347
 | 
   869     end
 | 
| 
MMOSimca@347
 | 
   870 
 | 
| 
MMOSimca@347
 | 
   871     table.wipe(boss_loot_toasting)
 | 
| 
MMOSimca@387
 | 
   872     raid_boss_id = nil
 | 
| 
MMOSimca@347
 | 
   873 end
 | 
| 
MMOSimca@347
 | 
   874 
 | 
| 
MMOSimca@347
 | 
   875 
 | 
| 
MMOSimca@393
 | 
   876 function ClearLootToastContainerID()
 | 
| 
MMOSimca@347
 | 
   877     if loot_toast_container_timer_handle then
 | 
| 
MMOSimca@383
 | 
   878         loot_toast_container_timer_handle:Cancel()
 | 
| 
MMOSimca@347
 | 
   879         loot_toast_container_timer_handle = nil
 | 
| 
MMOSimca@347
 | 
   880     end
 | 
| 
MMOSimca@347
 | 
   881 
 | 
| 
MMOSimca@387
 | 
   882     container_loot_toasting = false
 | 
| 
MMOSimca@387
 | 
   883     loot_toast_container_id = nil
 | 
| 
MMOSimca@347
 | 
   884 end
 | 
| 
MMOSimca@347
 | 
   885 
 | 
| 
MMOSimca@347
 | 
   886 
 | 
| 
MMOSimca@393
 | 
   887 function ClearLootToastData()
 | 
| 
MMOSimca@347
 | 
   888     if loot_toast_data_timer_handle then
 | 
| 
MMOSimca@383
 | 
   889         loot_toast_data_timer_handle:Cancel()
 | 
| 
MMOSimca@347
 | 
   890         loot_toast_data_timer_handle = nil
 | 
| 
MMOSimca@347
 | 
   891     end
 | 
| 
MMOSimca@347
 | 
   892 
 | 
| 
MMOSimca@347
 | 
   893     if loot_toast_data then
 | 
| 
MMOSimca@347
 | 
   894         table.wipe(loot_toast_data)
 | 
| 
MMOSimca@347
 | 
   895     end
 | 
| 
MMOSimca@347
 | 
   896 end
 | 
| 
MMOSimca@347
 | 
   897 
 | 
| 
MMOSimca@347
 | 
   898 
 | 
| 
MMOSimca@393
 | 
   899 function ClearChatLootData()
 | 
| 
MMOSimca@398
 | 
   900     if not chat_loot_timer_handle then
 | 
| 
MMOSimca@435
 | 
   901         table.wipe(chat_loot_data)
 | 
| 
MMOSimca@398
 | 
   902         return
 | 
| 
MMOSimca@398
 | 
   903     end
 | 
| 
MMOSimca@398
 | 
   904     Debug("ClearChatLootData: Ending chat-based loot timer.")
 | 
| 
MMOSimca@398
 | 
   905     chat_loot_timer_handle:Cancel()
 | 
| 
MMOSimca@398
 | 
   906     chat_loot_timer_handle = nil
 | 
| 
MMOSimca@398
 | 
   907 
 | 
| 
MMOSimca@435
 | 
   908     if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) and chat_loot_data.loot then
 | 
| 
MMOSimca@414
 | 
   909         -- A slimmed down (and more importantly, separate) version of GenericLootUpdate, specifically for AF.ITEM and chat_loot_data
 | 
| 
MMOSimca@414
 | 
   910         local entry = DBEntry("items", chat_loot_data.identifier)
 | 
| 
MMOSimca@414
 | 
   911 
 | 
| 
MMOSimca@414
 | 
   912         if entry then
 | 
| 
MMOSimca@414
 | 
   913             local loot_table = LootTable(entry, "contains")
 | 
| 
MMOSimca@414
 | 
   914             entry["contains_count"] = (entry["contains_count"] or 0) + 1
 | 
| 
MMOSimca@414
 | 
   915 
 | 
| 
MMOSimca@435
 | 
   916             for loot_token, quantity in pairs(chat_loot_data.loot) do
 | 
| 
MMOSimca@414
 | 
   917                 local label, currency_texture = (":"):split(loot_token)
 | 
| 
MMOSimca@414
 | 
   918 
 | 
| 
MMOSimca@414
 | 
   919                 if label == "currency" and currency_texture then
 | 
| 
MMOSimca@414
 | 
   920                     table.insert(loot_table, ("currency:%d:%s"):format(quantity, currency_texture))
 | 
| 
MMOSimca@414
 | 
   921                 elseif loot_token == "money" then
 | 
| 
MMOSimca@414
 | 
   922                     table.insert(loot_table, ("money:%d"):format(quantity))
 | 
| 
MMOSimca@414
 | 
   923                 else
 | 
| 
MMOSimca@414
 | 
   924                     table.insert(loot_table, ("%d:%d"):format(loot_token, quantity))
 | 
| 
MMOSimca@414
 | 
   925                 end
 | 
| 
MMOSimca@414
 | 
   926             end
 | 
| 
MMOSimca@414
 | 
   927         end
 | 
| 
MMOSimca@347
 | 
   928     end
 | 
| 
MMOSimca@435
 | 
   929     table.wipe(chat_loot_data)
 | 
| 
MMOSimca@347
 | 
   930 end
 | 
| 
MMOSimca@347
 | 
   931 
 | 
| 
MMOSimca@347
 | 
   932 
 | 
| 
jcallahan@246
 | 
   933 -- METHODS ------------------------------------------------------------
 | 
| 
jcallahan@246
 | 
   934 
 | 
| 
jcallahan@0
 | 
   935 function WDP:OnInitialize()
 | 
| 
jcallahan@128
 | 
   936     local db = LibStub("AceDB-3.0"):New("WoWDBProfilerData", DATABASE_DEFAULTS, "Default")
 | 
| 
jcallahan@270
 | 
   937     private.db = db
 | 
| 
jcallahan@128
 | 
   938     global_db = db.global
 | 
| 
jcallahan@128
 | 
   939     char_db = db.char
 | 
| 
jcallahan@14
 | 
   940 
 | 
| 
jcallahan@270
 | 
   941     local raw_db = _G.WoWDBProfilerData
 | 
| 
jcallahan@18
 | 
   942     local build_num = tonumber(private.build_num)
 | 
| 
jcallahan@14
 | 
   943 
 | 
| 
jcallahan@136
 | 
   944     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
 | 
   945         for entry in pairs(DATABASE_DEFAULTS.global) do
 | 
| 
jcallahan@128
 | 
   946             global_db[entry] = {}
 | 
| 
jcallahan@74
 | 
   947         end
 | 
| 
jcallahan@74
 | 
   948     end
 | 
| 
jcallahan@35
 | 
   949     raw_db.build_num = build_num
 | 
| 
MMOSimca@330
 | 
   950     raw_db.region = private.region
 | 
| 
jcallahan@63
 | 
   951     raw_db.version = DB_VERSION
 | 
| 
jcallahan@249
 | 
   952 
 | 
| 
jcallahan@312
 | 
   953     private.InitializeCommentSystem()
 | 
| 
jcallahan@312
 | 
   954     self:RegisterChatCommand("comment", private.ProcessCommentCommand)
 | 
| 
jcallahan@0
 | 
   955 end
 | 
| 
jcallahan@0
 | 
   956 
 | 
| 
jcallahan@0
 | 
   957 
 | 
| 
jcallahan@153
 | 
   958 function WDP:EventDispatcher(...)
 | 
| 
jcallahan@153
 | 
   959     local event_name = ...
 | 
| 
jcallahan@153
 | 
   960 
 | 
| 
MMOSimca@346
 | 
   961     if DEBUGGING then
 | 
| 
jcallahan@154
 | 
   962         if event_name == "COMBAT_LOG_EVENT_UNFILTERED" then
 | 
| 
jcallahan@154
 | 
   963             Debug(event_name)
 | 
| 
jcallahan@154
 | 
   964         else
 | 
| 
jcallahan@154
 | 
   965             Debug(...)
 | 
| 
jcallahan@153
 | 
   966         end
 | 
| 
jcallahan@153
 | 
   967     end
 | 
| 
jcallahan@153
 | 
   968     local func = EVENT_MAPPING[event_name]
 | 
| 
jcallahan@153
 | 
   969 
 | 
| 
jcallahan@153
 | 
   970     if _G.type(func) == "boolean" then
 | 
| 
jcallahan@153
 | 
   971         self[event_name](self, ...)
 | 
| 
jcallahan@153
 | 
   972     elseif _G.type(func) == "function" then
 | 
| 
jcallahan@159
 | 
   973         self[func](self, ...)
 | 
| 
jcallahan@153
 | 
   974     end
 | 
| 
jcallahan@153
 | 
   975 end
 | 
| 
jcallahan@153
 | 
   976 
 | 
| 
jcallahan@153
 | 
   977 
 | 
| 
jcallahan@0
 | 
   978 function WDP:OnEnable()
 | 
| 
jcallahan@300
 | 
   979     PLAYER_GUID = _G.UnitGUID("player")
 | 
| 
jcallahan@300
 | 
   980 
 | 
| 
jcallahan@0
 | 
   981     for event_name, mapping in pairs(EVENT_MAPPING) do
 | 
| 
jcallahan@156
 | 
   982         if EVENT_DEBUG then
 | 
| 
jcallahan@153
 | 
   983             self:RegisterEvent(event_name, "EventDispatcher")
 | 
| 
jcallahan@153
 | 
   984         else
 | 
| 
jcallahan@153
 | 
   985             self:RegisterEvent(event_name, (_G.type(mapping) ~= "boolean") and mapping or nil)
 | 
| 
jcallahan@153
 | 
   986         end
 | 
| 
jcallahan@0
 | 
   987     end
 | 
| 
jcallahan@95
 | 
   988 
 | 
| 
jcallahan@95
 | 
   989     for index = 1, _G.GetNumLanguages() do
 | 
| 
jcallahan@95
 | 
   990         languages_known[_G.GetLanguageByIndex(index)] = true
 | 
| 
jcallahan@95
 | 
   991     end
 | 
| 
MMOSimca@383
 | 
   992 
 | 
| 
MMOSimca@459
 | 
   993     -- These two timers loop indefinitely using Lua's infinity constant
 | 
| 
MMOSimca@459
 | 
   994     item_process_timer_handle = C_Timer.NewTicker(30, WDP.ProcessItems, math.huge)
 | 
| 
MMOSimca@459
 | 
   995     target_location_timer_handle = C_Timer.NewTicker(0.5, WDP.UpdateTargetLocation, math.huge)
 | 
| 
jcallahan@19
 | 
   996 
 | 
| 
jcallahan@19
 | 
   997     _G.hooksecurefunc("UseContainerItem", function(bag_index, slot_index, target_unit)
 | 
| 
jcallahan@19
 | 
   998         if target_unit then
 | 
| 
jcallahan@19
 | 
   999             return
 | 
| 
jcallahan@19
 | 
  1000         end
 | 
| 
jcallahan@19
 | 
  1001         HandleItemUse(_G.GetContainerItemLink(bag_index, slot_index), bag_index, slot_index)
 | 
| 
jcallahan@19
 | 
  1002     end)
 | 
| 
jcallahan@19
 | 
  1003 
 | 
| 
jcallahan@19
 | 
  1004     _G.hooksecurefunc("UseItemByName", function(identifier, target_unit)
 | 
| 
jcallahan@19
 | 
  1005         if target_unit then
 | 
| 
jcallahan@19
 | 
  1006             return
 | 
| 
jcallahan@19
 | 
  1007         end
 | 
| 
jcallahan@19
 | 
  1008         local _, item_link = _G.GetItemInfo(identifier)
 | 
| 
jcallahan@19
 | 
  1009         HandleItemUse(item_link)
 | 
| 
jcallahan@19
 | 
  1010     end)
 | 
| 
jcallahan@263
 | 
  1011 
 | 
| 
jcallahan@299
 | 
  1012     self:HandleZoneChange("OnEnable")
 | 
| 
jcallahan@290
 | 
  1013     self:GROUP_ROSTER_UPDATE()
 | 
| 
jcallahan@0
 | 
  1014 end
 | 
| 
jcallahan@0
 | 
  1015 
 | 
| 
jcallahan@0
 | 
  1016 
 | 
| 
MMOSimca@340
 | 
  1017 local function RecordItemData(item_id, item_link, process_bonus_ids, durability)
 | 
| 
jcallahan@331
 | 
  1018     local _, _, item_string = item_link:find("^|%x+|H(.+)|h%[.+%]")
 | 
| 
jcallahan@219
 | 
  1019     local item
 | 
| 
jcallahan@0
 | 
  1020 
 | 
| 
jcallahan@191
 | 
  1021     if item_string then
 | 
| 
MMOSimca@338
 | 
  1022         local item_results = { (":"):split(item_string) }
 | 
| 
MMOSimca@338
 | 
  1023 
 | 
| 
MMOSimca@460
 | 
  1024         local suffix_id = tonumber(item_results[8]) or 0
 | 
| 
MMOSimca@462
 | 
  1025         local unique_id = tonumber(item_results[9]) or 0
 | 
| 
MMOSimca@447
 | 
  1026         --local level = tonumber(item_results[10])
 | 
| 
MMOSimca@460
 | 
  1027         --local specialization_id = tonumber(item_results[11])
 | 
| 
MMOSimca@460
 | 
  1028         --local unknown_upgrade_related_id = tonumber(item_results[12])
 | 
| 
MMOSimca@460
 | 
  1029         local instance_difficulty_id = tonumber(item_results[13]) or 0
 | 
| 
MMOSimca@460
 | 
  1030         local num_bonus_ids = tonumber(item_results[14]) or 0
 | 
| 
MMOSimca@460
 | 
  1031         -- upgrade_id is optional since 6.2! can probably be detected using unknown_upgrade_related_id, but it's just as easy to check like this
 | 
| 
MMOSimca@460
 | 
  1032         local upgrade_id = tonumber(item_results[15 + num_bonus_ids]) or 0
 | 
| 
MMOSimca@462
 | 
  1033         
 | 
| 
MMOSimca@462
 | 
  1034         -- LEGION
 | 
| 
MMOSimca@462
 | 
  1035         if private.isLegion then
 | 
| 
MMOSimca@462
 | 
  1036             local unkItemField1 = tonumber(item_results[16 + num_bonus_ids]) or 0
 | 
| 
MMOSimca@462
 | 
  1037             local unkItemField2 = tonumber(item_results[17 + num_bonus_ids]) or 0
 | 
| 
MMOSimca@462
 | 
  1038             if unkItemField1 > 0 then Debug("unkItemField1 is non-zero, specifically %d.", unkItemField1) end
 | 
| 
MMOSimca@462
 | 
  1039             if unkItemField2 > 0 then Debug("unkItemField2 is non-zero, specifically %d.", unkItemField2) end
 | 
| 
MMOSimca@462
 | 
  1040         end
 | 
| 
MMOSimca@460
 | 
  1041 
 | 
| 
MMOSimca@460
 | 
  1042         -- If there is anything special (non-zero) for this item then we need to make note of everything
 | 
| 
MMOSimca@460
 | 
  1043         if math.max(suffix_id, instance_difficulty_id, num_bonus_ids, upgrade_id) ~= 0 then
 | 
| 
MMOSimca@460
 | 
  1044             item = DBEntry("items", item_id)
 | 
| 
MMOSimca@460
 | 
  1045             item.suffix_id = suffix_id
 | 
| 
MMOSimca@460
 | 
  1046             item.unique_id = bit.band(unique_id, 0xFFFF)
 | 
| 
MMOSimca@460
 | 
  1047             item.instance_difficulty_id = instance_difficulty_id
 | 
| 
MMOSimca@460
 | 
  1048             item.upgrade_id = upgrade_id
 | 
| 
MMOSimca@460
 | 
  1049 
 | 
| 
MMOSimca@460
 | 
  1050             if process_bonus_ids then
 | 
| 
MMOSimca@460
 | 
  1051 
 | 
| 
MMOSimca@460
 | 
  1052                 -- Get ready for bonus IDs
 | 
| 
MMOSimca@384
 | 
  1053                 if not item.seen_bonuses then
 | 
| 
MMOSimca@384
 | 
  1054                     item.seen_bonuses = {}
 | 
| 
MMOSimca@372
 | 
  1055                 end
 | 
| 
MMOSimca@460
 | 
  1056             
 | 
| 
MMOSimca@460
 | 
  1057                 if num_bonus_ids > 0 then
 | 
| 
MMOSimca@460
 | 
  1058                     -- We want the bonus ID combo output to be in the form ["bonusID1:bonusID2:bonusID3"] = true
 | 
| 
MMOSimca@460
 | 
  1059                     -- And sorted numerically with the smallest bonusID first
 | 
| 
MMOSimca@460
 | 
  1060                     local sorted_bonus_string = ""
 | 
| 
MMOSimca@460
 | 
  1061                     local min_bonus_id_array = {}
 | 
| 
MMOSimca@460
 | 
  1062                     for iterations = 1, num_bonus_ids do
 | 
| 
MMOSimca@460
 | 
  1063                         -- Find minimum of this iteration
 | 
| 
MMOSimca@460
 | 
  1064                         local min_bonus_id = 100000
 | 
| 
MMOSimca@460
 | 
  1065                         for bonus_index = 1, num_bonus_ids do
 | 
| 
MMOSimca@460
 | 
  1066                             local temp_bonus_id = tonumber(item_results[14 + bonus_index])
 | 
| 
MMOSimca@460
 | 
  1067                             if temp_bonus_id and (not min_bonus_id_array[temp_bonus_id]) and (temp_bonus_id < min_bonus_id) then
 | 
| 
MMOSimca@460
 | 
  1068                                 min_bonus_id = temp_bonus_id
 | 
| 
MMOSimca@460
 | 
  1069                             end
 | 
| 
MMOSimca@460
 | 
  1070                         end
 | 
| 
MMOSimca@460
 | 
  1071 
 | 
| 
MMOSimca@460
 | 
  1072                         -- Keep track of already processed IDs
 | 
| 
MMOSimca@460
 | 
  1073                         min_bonus_id_array[min_bonus_id] = true
 | 
| 
MMOSimca@460
 | 
  1074 
 | 
| 
MMOSimca@460
 | 
  1075                         -- Build string
 | 
| 
MMOSimca@460
 | 
  1076                         if iterations == 1 then
 | 
| 
MMOSimca@460
 | 
  1077                             sorted_bonus_string = sorted_bonus_string .. tostring(min_bonus_id)
 | 
| 
MMOSimca@460
 | 
  1078                         else
 | 
| 
MMOSimca@460
 | 
  1079                             sorted_bonus_string = sorted_bonus_string .. ":" .. tostring(min_bonus_id)
 | 
| 
MMOSimca@460
 | 
  1080                         end
 | 
| 
MMOSimca@384
 | 
  1081                     end
 | 
| 
MMOSimca@460
 | 
  1082 
 | 
| 
MMOSimca@460
 | 
  1083                     item.seen_bonuses[sorted_bonus_string] = true
 | 
| 
MMOSimca@460
 | 
  1084                     Debug("RecordItemData: Recorded bonus IDs %s for item %d.", sorted_bonus_string, item_id)
 | 
| 
MMOSimca@384
 | 
  1085                 else
 | 
| 
MMOSimca@460
 | 
  1086                     item.seen_bonuses["0"] = true
 | 
| 
MMOSimca@384
 | 
  1087                 end
 | 
| 
MMOSimca@329
 | 
  1088             end
 | 
| 
jcallahan@191
 | 
  1089         end
 | 
| 
jcallahan@0
 | 
  1090     end
 | 
| 
jcallahan@212
 | 
  1091 
 | 
| 
jcallahan@212
 | 
  1092     if durability and durability > 0 then
 | 
| 
jcallahan@219
 | 
  1093         item = item or DBEntry("items", item_id)
 | 
| 
jcallahan@212
 | 
  1094         item.durability = durability
 | 
| 
jcallahan@212
 | 
  1095     end
 | 
| 
jcallahan@0
 | 
  1096 end
 | 
| 
jcallahan@0
 | 
  1097 
 | 
| 
jcallahan@0
 | 
  1098 
 | 
| 
jcallahan@187
 | 
  1099 function WDP:ProcessItems()
 | 
| 
jcallahan@187
 | 
  1100     for slot_index = _G.INVSLOT_FIRST_EQUIPPED, _G.INVSLOT_LAST_EQUIPPED do
 | 
| 
jcallahan@1
 | 
  1101         local item_id = _G.GetInventoryItemID("player", slot_index)
 | 
| 
jcallahan@0
 | 
  1102 
 | 
| 
jcallahan@0
 | 
  1103         if item_id and item_id > 0 then
 | 
| 
jcallahan@1
 | 
  1104             local _, max_durability = _G.GetInventoryItemDurability(slot_index)
 | 
| 
MMOSimca@340
 | 
  1105             RecordItemData(item_id, _G.GetInventoryItemLink("player", slot_index), false, max_durability)
 | 
| 
jcallahan@0
 | 
  1106         end
 | 
| 
jcallahan@0
 | 
  1107     end
 | 
| 
jcallahan@0
 | 
  1108 
 | 
| 
jcallahan@0
 | 
  1109     for bag_index = 0, _G.NUM_BAG_SLOTS do
 | 
| 
jcallahan@0
 | 
  1110         for slot_index = 1, _G.GetContainerNumSlots(bag_index) do
 | 
| 
jcallahan@1
 | 
  1111             local item_id = _G.GetContainerItemID(bag_index, slot_index)
 | 
| 
jcallahan@0
 | 
  1112 
 | 
| 
jcallahan@0
 | 
  1113             if item_id and item_id > 0 then
 | 
| 
jcallahan@1
 | 
  1114                 local _, max_durability = _G.GetContainerItemDurability(bag_index, slot_index)
 | 
| 
MMOSimca@340
 | 
  1115                 RecordItemData(item_id, _G.GetContainerItemLink(bag_index, slot_index), false, max_durability)
 | 
| 
jcallahan@0
 | 
  1116             end
 | 
| 
jcallahan@0
 | 
  1117         end
 | 
| 
jcallahan@0
 | 
  1118     end
 | 
| 
jcallahan@0
 | 
  1119 end
 | 
| 
jcallahan@0
 | 
  1120 
 | 
| 
jcallahan@118
 | 
  1121 
 | 
| 
jcallahan@215
 | 
  1122 local TargetedNPC
 | 
| 
jcallahan@118
 | 
  1123 do
 | 
| 
jcallahan@118
 | 
  1124     local GENDER_NAMES = {
 | 
| 
jcallahan@118
 | 
  1125         "UNKNOWN",
 | 
| 
jcallahan@118
 | 
  1126         "MALE",
 | 
| 
jcallahan@118
 | 
  1127         "FEMALE",
 | 
| 
jcallahan@118
 | 
  1128     }
 | 
| 
jcallahan@118
 | 
  1129 
 | 
| 
jcallahan@118
 | 
  1130 
 | 
| 
jcallahan@118
 | 
  1131     local REACTION_NAMES = {
 | 
| 
jcallahan@118
 | 
  1132         "HATED",
 | 
| 
jcallahan@118
 | 
  1133         "HOSTILE",
 | 
| 
jcallahan@118
 | 
  1134         "UNFRIENDLY",
 | 
| 
jcallahan@118
 | 
  1135         "NEUTRAL",
 | 
| 
jcallahan@118
 | 
  1136         "FRIENDLY",
 | 
| 
jcallahan@118
 | 
  1137         "HONORED",
 | 
| 
jcallahan@118
 | 
  1138         "REVERED",
 | 
| 
jcallahan@118
 | 
  1139         "EXALTED",
 | 
| 
jcallahan@118
 | 
  1140     }
 | 
| 
jcallahan@118
 | 
  1141 
 | 
| 
jcallahan@118
 | 
  1142 
 | 
| 
jcallahan@118
 | 
  1143     local POWER_TYPE_NAMES = {
 | 
| 
jcallahan@118
 | 
  1144         ["0"] = "MANA",
 | 
| 
jcallahan@118
 | 
  1145         ["1"] = "RAGE",
 | 
| 
jcallahan@118
 | 
  1146         ["2"] = "FOCUS",
 | 
| 
jcallahan@118
 | 
  1147         ["3"] = "ENERGY",
 | 
| 
jcallahan@118
 | 
  1148         ["6"] = "RUNIC_POWER",
 | 
| 
jcallahan@118
 | 
  1149     }
 | 
| 
jcallahan@118
 | 
  1150 
 | 
| 
jcallahan@118
 | 
  1151 
 | 
| 
jcallahan@215
 | 
  1152     function TargetedNPC()
 | 
| 
jcallahan@118
 | 
  1153         if not _G.UnitExists("target") or _G.UnitPlayerControlled("target") or currently_drunk then
 | 
| 
jcallahan@118
 | 
  1154             current_target_id = nil
 | 
| 
jcallahan@118
 | 
  1155             return
 | 
| 
jcallahan@118
 | 
  1156         end
 | 
| 
jcallahan@118
 | 
  1157         local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("target"))
 | 
| 
jcallahan@118
 | 
  1158 
 | 
| 
jcallahan@171
 | 
  1159         if not unit_idnum or not UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@118
 | 
  1160             return
 | 
| 
jcallahan@118
 | 
  1161         end
 | 
| 
jcallahan@118
 | 
  1162         current_target_id = unit_idnum
 | 
| 
jcallahan@118
 | 
  1163 
 | 
| 
jcallahan@118
 | 
  1164         local npc = NPCEntry(unit_idnum)
 | 
| 
jcallahan@118
 | 
  1165         local _, class_token = _G.UnitClass("target")
 | 
| 
jcallahan@118
 | 
  1166         npc.class = class_token
 | 
| 
jcallahan@118
 | 
  1167         npc.faction = UnitFactionStanding("target")
 | 
| 
jcallahan@118
 | 
  1168         npc.genders = npc.genders or {}
 | 
| 
jcallahan@118
 | 
  1169         npc.genders[GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED"] = true
 | 
| 
jcallahan@118
 | 
  1170         npc.is_pvp = _G.UnitIsPVP("target") and true or nil
 | 
| 
jcallahan@118
 | 
  1171         npc.reaction = ("%s:%s:%s"):format(_G.UnitLevel("player"), _G.UnitFactionGroup("player"), REACTION_NAMES[_G.UnitReaction("player", "target")])
 | 
| 
jcallahan@118
 | 
  1172 
 | 
| 
jcallahan@248
 | 
  1173         local encounter_data = npc:EncounterData(InstanceDifficultyToken()).stats
 | 
| 
jcallahan@118
 | 
  1174         local npc_level = ("level_%d"):format(_G.UnitLevel("target"))
 | 
| 
jcallahan@250
 | 
  1175         local level_data = encounter_data[npc_level]
 | 
| 
jcallahan@250
 | 
  1176 
 | 
| 
jcallahan@250
 | 
  1177         if not level_data then
 | 
| 
jcallahan@250
 | 
  1178             level_data = {}
 | 
| 
jcallahan@250
 | 
  1179             encounter_data[npc_level] = level_data
 | 
| 
jcallahan@250
 | 
  1180         end
 | 
| 
jcallahan@257
 | 
  1181         level_data.max_health = level_data.max_health or _G.UnitHealthMax("target")
 | 
| 
jcallahan@257
 | 
  1182 
 | 
| 
jcallahan@257
 | 
  1183         if not level_data.power then
 | 
| 
MMOSimca@337
 | 
  1184             local max_power = _G.UnitPowerMax("target")
 | 
| 
jcallahan@257
 | 
  1185 
 | 
| 
jcallahan@257
 | 
  1186             if max_power > 0 then
 | 
| 
jcallahan@257
 | 
  1187                 local power_type = _G.UnitPowerType("target")
 | 
| 
jcallahan@312
 | 
  1188                 level_data.power = ("%s:%d"):format(POWER_TYPE_NAMES[tostring(power_type)] or power_type, max_power)
 | 
| 
jcallahan@257
 | 
  1189             end
 | 
| 
jcallahan@118
 | 
  1190         end
 | 
| 
jcallahan@118
 | 
  1191         name_to_id_map[_G.UnitName("target")] = unit_idnum
 | 
| 
jcallahan@118
 | 
  1192         return npc, unit_idnum
 | 
| 
jcallahan@118
 | 
  1193     end
 | 
| 
jcallahan@118
 | 
  1194 end -- do-block
 | 
| 
jcallahan@118
 | 
  1195 
 | 
| 
jcallahan@118
 | 
  1196 
 | 
| 
jcallahan@113
 | 
  1197 do
 | 
| 
jcallahan@113
 | 
  1198     local COORD_MAX = 5
 | 
| 
jcallahan@0
 | 
  1199 
 | 
| 
jcallahan@113
 | 
  1200     function WDP:UpdateTargetLocation()
 | 
| 
MMOSimca@462
 | 
  1201         -- LEGION supported here
 | 
| 
MMOSimca@462
 | 
  1202         if currently_drunk or not _G.UnitExists("target") or _G.UnitPlayerControlled("target") or not _G.UnitIsDead("target") then
 | 
| 
jcallahan@2
 | 
  1203             return
 | 
| 
jcallahan@2
 | 
  1204         end
 | 
| 
jcallahan@113
 | 
  1205 
 | 
| 
jcallahan@113
 | 
  1206         for index = 1, 4 do
 | 
| 
jcallahan@113
 | 
  1207             if not _G.CheckInteractDistance("target", index) then
 | 
| 
jcallahan@113
 | 
  1208                 return
 | 
| 
jcallahan@113
 | 
  1209             end
 | 
| 
jcallahan@113
 | 
  1210         end
 | 
| 
jcallahan@215
 | 
  1211         local npc = TargetedNPC()
 | 
| 
jcallahan@113
 | 
  1212 
 | 
| 
jcallahan@113
 | 
  1213         if not npc then
 | 
| 
jcallahan@113
 | 
  1214             return
 | 
| 
jcallahan@113
 | 
  1215         end
 | 
| 
jcallahan@113
 | 
  1216         local zone_name, area_id, x, y, map_level, difficulty_token = CurrentLocationData()
 | 
| 
MMOSimca@328
 | 
  1217         if not (zone_name and area_id and x and y and map_level) then
 | 
| 
MMOSimca@328
 | 
  1218             Debug("UpdateTargetLocation: Missing current location data - %s, %d, %d, %d, %d.", zone_name, area_id, x, y, map_level)
 | 
| 
MMOSimca@328
 | 
  1219             return
 | 
| 
MMOSimca@328
 | 
  1220         end
 | 
| 
jcallahan@248
 | 
  1221         local npc_data = npc:EncounterData(difficulty_token).stats[("level_%d"):format(_G.UnitLevel("target"))]
 | 
| 
jcallahan@113
 | 
  1222         local zone_token = ("%s:%d"):format(zone_name, area_id)
 | 
| 
jcallahan@118
 | 
  1223         npc_data.locations = npc_data.locations or {} -- TODO: Fix this. It is broken. Possibly something to do with the timed updates.
 | 
| 
jcallahan@113
 | 
  1224 
 | 
| 
jcallahan@113
 | 
  1225         local zone_data = npc_data.locations[zone_token]
 | 
| 
jcallahan@113
 | 
  1226 
 | 
| 
jcallahan@113
 | 
  1227         if not zone_data then
 | 
| 
jcallahan@113
 | 
  1228             zone_data = {}
 | 
| 
jcallahan@113
 | 
  1229             npc_data.locations[zone_token] = zone_data
 | 
| 
jcallahan@113
 | 
  1230         end
 | 
| 
jcallahan@113
 | 
  1231 
 | 
| 
jcallahan@113
 | 
  1232         for location_token in pairs(zone_data) do
 | 
| 
jcallahan@113
 | 
  1233             local loc_level, loc_x, loc_y = (":"):split(location_token)
 | 
| 
jcallahan@113
 | 
  1234             loc_level = tonumber(loc_level)
 | 
| 
jcallahan@113
 | 
  1235 
 | 
| 
jcallahan@113
 | 
  1236             if map_level == loc_level and math.abs(x - loc_x) <= COORD_MAX and math.abs(y - loc_y) <= COORD_MAX then
 | 
| 
jcallahan@113
 | 
  1237                 return
 | 
| 
jcallahan@113
 | 
  1238             end
 | 
| 
jcallahan@113
 | 
  1239         end
 | 
| 
jcallahan@141
 | 
  1240         zone_data[("%d:%d:%d"):format(map_level, x, y)] = true
 | 
| 
jcallahan@2
 | 
  1241     end
 | 
| 
jcallahan@113
 | 
  1242 end -- do-block
 | 
| 
jcallahan@2
 | 
  1243 
 | 
| 
jcallahan@118
 | 
  1244 
 | 
| 
MMOSimca@412
 | 
  1245 function WDP:HandleBadChatLootData(...)
 | 
| 
MMOSimca@398
 | 
  1246     ClearChatLootData()
 | 
| 
MMOSimca@398
 | 
  1247 end
 | 
| 
MMOSimca@398
 | 
  1248 
 | 
| 
MMOSimca@398
 | 
  1249 
 | 
| 
MMOSimca@420
 | 
  1250 -- EVENT HANDLERS -----------------------------------------------------
 | 
| 
MMOSimca@420
 | 
  1251 
 | 
| 
MMOSimca@436
 | 
  1252 -- This function (and the following function) are to stop 'HandleItemUse' from triggering when you put an item that would normally be opened into the bank, guild bank, etc.
 | 
| 
MMOSimca@436
 | 
  1253 function WDP:StopChatLootRecording(event_name)
 | 
| 
MMOSimca@436
 | 
  1254     if not block_chat_loot_data then
 | 
| 
MMOSimca@439
 | 
  1255         Debug("%s: Pausing chat-based loot recording.", event_name)
 | 
| 
MMOSimca@436
 | 
  1256         ClearChatLootData()
 | 
| 
MMOSimca@436
 | 
  1257         block_chat_loot_data = true
 | 
| 
MMOSimca@436
 | 
  1258     end
 | 
| 
MMOSimca@436
 | 
  1259 end
 | 
| 
MMOSimca@436
 | 
  1260 
 | 
| 
MMOSimca@436
 | 
  1261 
 | 
| 
MMOSimca@436
 | 
  1262 function WDP:ResumeChatLootRecording(event_name)
 | 
| 
MMOSimca@436
 | 
  1263     if block_chat_loot_data then
 | 
| 
MMOSimca@439
 | 
  1264         Debug("%s: Resuming chat-based loot recording.", event_name)
 | 
| 
MMOSimca@436
 | 
  1265         block_chat_loot_data = false
 | 
| 
MMOSimca@436
 | 
  1266     end
 | 
| 
MMOSimca@436
 | 
  1267 end
 | 
| 
MMOSimca@436
 | 
  1268 
 | 
| 
MMOSimca@436
 | 
  1269 
 | 
| 
MMOSimca@408
 | 
  1270 -- For now, bonus roll data only pollutes the true drop percentages. We still want to capture the data from SPELL_CONFIRMATION_PROMPT because of legendary quest items though.
 | 
| 
MMOSimca@408
 | 
  1271 function WDP:BONUS_ROLL_RESULT(event_name)
 | 
| 
MMOSimca@408
 | 
  1272     Debug("%s: Bonus roll detected; stopping loot recording for this boss to avoid recording bonus loot.", event_name)
 | 
| 
MMOSimca@408
 | 
  1273     ClearKilledBossID()
 | 
| 
MMOSimca@408
 | 
  1274     ClearLootToastContainerID()
 | 
| 
MMOSimca@408
 | 
  1275 end
 | 
| 
MMOSimca@408
 | 
  1276 
 | 
| 
MMOSimca@408
 | 
  1277 
 | 
| 
jcallahan@90
 | 
  1278 function WDP:BLACK_MARKET_ITEM_UPDATE(event_name)
 | 
| 
jcallahan@243
 | 
  1279     if not ALLOWED_LOCALES[CLIENT_LOCALE] then
 | 
| 
jcallahan@243
 | 
  1280         return
 | 
| 
jcallahan@243
 | 
  1281     end
 | 
| 
jcallahan@282
 | 
  1282     local num_items = _G.C_BlackMarket.GetNumItems() or 0
 | 
| 
jcallahan@56
 | 
  1283 
 | 
| 
jcallahan@56
 | 
  1284     for index = 1, num_items do
 | 
| 
jcallahan@56
 | 
  1285         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
 | 
  1286 
 | 
| 
jcallahan@56
 | 
  1287         if item_link then
 | 
| 
jcallahan@56
 | 
  1288             DBEntry("items", ItemLinkToID(item_link)).black_market = seller_name or "UNKNOWN"
 | 
| 
jcallahan@56
 | 
  1289         end
 | 
| 
jcallahan@56
 | 
  1290     end
 | 
| 
jcallahan@56
 | 
  1291 end
 | 
| 
jcallahan@56
 | 
  1292 
 | 
| 
jcallahan@56
 | 
  1293 
 | 
| 
jcallahan@298
 | 
  1294 local function UpdateUnitPet(unit_guid, unit_id)
 | 
| 
jcallahan@246
 | 
  1295     local current_pet_guid = group_owner_guids_to_pet_guids[unit_guid]
 | 
| 
jcallahan@246
 | 
  1296 
 | 
| 
jcallahan@246
 | 
  1297     if current_pet_guid then
 | 
| 
jcallahan@246
 | 
  1298         group_owner_guids_to_pet_guids[unit_guid] = nil
 | 
| 
jcallahan@246
 | 
  1299         group_pet_guids[current_pet_guid] = nil
 | 
| 
jcallahan@246
 | 
  1300     end
 | 
| 
jcallahan@246
 | 
  1301     local pet_guid = _G.UnitGUID(unit_id .. "pet")
 | 
| 
jcallahan@246
 | 
  1302 
 | 
| 
jcallahan@246
 | 
  1303     if pet_guid then
 | 
| 
jcallahan@296
 | 
  1304         group_owner_guids_to_pet_guids[unit_guid] = pet_guid
 | 
| 
jcallahan@246
 | 
  1305         group_pet_guids[pet_guid] = true
 | 
| 
jcallahan@246
 | 
  1306     end
 | 
| 
jcallahan@246
 | 
  1307 end
 | 
| 
jcallahan@246
 | 
  1308 
 | 
| 
jcallahan@246
 | 
  1309 
 | 
| 
jcallahan@298
 | 
  1310 function WDP:GROUP_ROSTER_UPDATE(event_name)
 | 
| 
jcallahan@298
 | 
  1311     local is_raid = _G.IsInRaid()
 | 
| 
jcallahan@298
 | 
  1312     local unit_type = is_raid and "raid" or "party"
 | 
| 
jcallahan@298
 | 
  1313     local group_size = is_raid and _G.GetNumGroupMembers() or _G.GetNumSubgroupMembers()
 | 
| 
jcallahan@298
 | 
  1314 
 | 
| 
jcallahan@299
 | 
  1315     table.wipe(group_member_guids)
 | 
| 
jcallahan@298
 | 
  1316 
 | 
| 
jcallahan@298
 | 
  1317     for index = 1, group_size do
 | 
| 
jcallahan@298
 | 
  1318         local unit_id = unit_type .. index
 | 
| 
jcallahan@298
 | 
  1319         local unit_guid = _G.UnitGUID(unit_id)
 | 
| 
jcallahan@298
 | 
  1320 
 | 
| 
jcallahan@299
 | 
  1321         group_member_guids[unit_guid] = true
 | 
| 
jcallahan@298
 | 
  1322         UpdateUnitPet(unit_guid, unit_id)
 | 
| 
jcallahan@298
 | 
  1323     end
 | 
| 
jcallahan@299
 | 
  1324     group_member_guids[PLAYER_GUID] = true
 | 
| 
jcallahan@298
 | 
  1325 end
 | 
| 
jcallahan@298
 | 
  1326 
 | 
| 
jcallahan@298
 | 
  1327 
 | 
| 
jcallahan@298
 | 
  1328 function WDP:UNIT_PET(event_name, unit_id)
 | 
| 
jcallahan@298
 | 
  1329     UpdateUnitPet(_G.UnitGUID(unit_id), unit_id)
 | 
| 
jcallahan@298
 | 
  1330 end
 | 
| 
jcallahan@298
 | 
  1331 
 | 
| 
jcallahan@298
 | 
  1332 
 | 
| 
MMOSimca@375
 | 
  1333 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity, spec_ID, sex_ID, is_personal, loot_source)
 | 
| 
jcallahan@312
 | 
  1334     if not loot_type or (loot_type ~= "item" and loot_type ~= "money" and loot_type ~= "currency") then
 | 
| 
jcallahan@306
 | 
  1335         Debug("%s: loot_type is %s. Item link is %s, and quantity is %d.", event_name, loot_type, item_link, quantity)
 | 
| 
jcallahan@306
 | 
  1336         return
 | 
| 
jcallahan@306
 | 
  1337     end
 | 
| 
MMOSimca@372
 | 
  1338 
 | 
| 
MMOSimca@372
 | 
  1339     -- Need information on the most recent args, so using this complete debug statement for now
 | 
| 
MMOSimca@375
 | 
  1340     Debug("%s: loot_type: %s, item_link: %s, quantity: %s, spec_ID: %s, sex_ID: %s, is_personal: %s, loot_source: %s", event_name, loot_type, item_link, quantity, spec_ID, sex_ID, is_personal, loot_source)
 | 
| 
MMOSimca@372
 | 
  1341 
 | 
| 
MMOSimca@355
 | 
  1342     -- Handle Garrison cache specially
 | 
| 
MMOSimca@422
 | 
  1343     if loot_source and (loot_source == LOOT_SOURCE_ID_GARRISON_CACHE) and last_garrison_cache_object_id then
 | 
| 
MMOSimca@355
 | 
  1344         -- Record location data for cache
 | 
| 
MMOSimca@355
 | 
  1345         UpdateDBEntryLocation("objects", ("OPENING:%d"):format(last_garrison_cache_object_id))
 | 
| 
MMOSimca@355
 | 
  1346 
 | 
| 
MMOSimca@355
 | 
  1347         -- Add drop data
 | 
| 
MMOSimca@355
 | 
  1348         local currency_texture = CurrencyLinkToTexture(item_link)
 | 
| 
MMOSimca@355
 | 
  1349         if currency_texture and currency_texture ~= "" then
 | 
| 
MMOSimca@355
 | 
  1350             -- Check for top level object data
 | 
| 
MMOSimca@355
 | 
  1351             local object_entry = DBEntry("objects", ("OPENING:%d"):format(last_garrison_cache_object_id))
 | 
| 
MMOSimca@355
 | 
  1352             local difficulty_token = InstanceDifficultyToken()
 | 
| 
MMOSimca@355
 | 
  1353             if object_entry[difficulty_token] then
 | 
| 
MMOSimca@355
 | 
  1354                 -- Increment loot count
 | 
| 
MMOSimca@355
 | 
  1355                 object_entry[difficulty_token]["opening_count"] = (object_entry[difficulty_token]["opening_count"] or 0) + 1
 | 
| 
MMOSimca@355
 | 
  1356 
 | 
| 
MMOSimca@355
 | 
  1357                 Debug("%s: %s X %d", event_name, currency_texture, quantity)
 | 
| 
MMOSimca@355
 | 
  1358                 object_entry[difficulty_token]["opening"] = object_entry[difficulty_token]["opening"] or {}
 | 
| 
MMOSimca@355
 | 
  1359                 table.insert(object_entry[difficulty_token]["opening"], ("currency:%d:%s"):format(quantity, currency_texture))
 | 
| 
MMOSimca@355
 | 
  1360             else
 | 
| 
MMOSimca@355
 | 
  1361                 Debug("%s: When handling the Garrison cache, the top level loot data was missing for objectID %d.", event_name, last_garrison_cache_object_id)
 | 
| 
MMOSimca@355
 | 
  1362             end
 | 
| 
MMOSimca@355
 | 
  1363         else
 | 
| 
MMOSimca@355
 | 
  1364             Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link)
 | 
| 
MMOSimca@355
 | 
  1365         end
 | 
| 
MMOSimca@431
 | 
  1366         
 | 
| 
MMOSimca@431
 | 
  1367         -- Wipe object ID until future mouseover
 | 
| 
MMOSimca@431
 | 
  1368         last_garrison_cache_object_id = nil
 | 
| 
MMOSimca@387
 | 
  1369     elseif raid_boss_id then
 | 
| 
MMOSimca@427
 | 
  1370         local npc = NPCEntry(raid_boss_id)
 | 
| 
MMOSimca@427
 | 
  1371         if npc then
 | 
| 
MMOSimca@427
 | 
  1372             local loot_label = "drops"
 | 
| 
MMOSimca@427
 | 
  1373             local encounter_data = npc:EncounterData(InstanceDifficultyToken())
 | 
| 
MMOSimca@427
 | 
  1374             encounter_data[loot_label] = encounter_data[loot_label] or {}
 | 
| 
MMOSimca@427
 | 
  1375             encounter_data.loot_counts = encounter_data.loot_counts or {}
 | 
| 
MMOSimca@427
 | 
  1376 
 | 
| 
MMOSimca@427
 | 
  1377             if loot_type == "item" then
 | 
| 
MMOSimca@427
 | 
  1378                 local item_id = ItemLinkToID(item_link)
 | 
| 
MMOSimca@427
 | 
  1379                 if item_id then
 | 
| 
MMOSimca@427
 | 
  1380                     Debug("%s: %s X %d (%d)", event_name, item_link, quantity, item_id)
 | 
| 
MMOSimca@427
 | 
  1381                     RecordItemData(item_id, item_link, true)
 | 
| 
MMOSimca@427
 | 
  1382                     table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity))
 | 
| 
MMOSimca@427
 | 
  1383                 else
 | 
| 
MMOSimca@427
 | 
  1384                     Debug("%s: ItemID is nil, from item link %s", event_name, item_link)
 | 
| 
MMOSimca@427
 | 
  1385                     return
 | 
| 
MMOSimca@427
 | 
  1386                 end
 | 
| 
MMOSimca@427
 | 
  1387             elseif loot_type == "money" then
 | 
| 
MMOSimca@427
 | 
  1388                 Debug("%s: money X %d", event_name, quantity)
 | 
| 
MMOSimca@427
 | 
  1389                 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity))
 | 
| 
MMOSimca@427
 | 
  1390             elseif loot_type == "currency" then
 | 
| 
MMOSimca@427
 | 
  1391                 local currency_texture = CurrencyLinkToTexture(item_link)
 | 
| 
MMOSimca@427
 | 
  1392                 if currency_texture and currency_texture ~= "" then
 | 
| 
MMOSimca@427
 | 
  1393                     Debug("%s: %s X %d", event_name, currency_texture, quantity)
 | 
| 
MMOSimca@427
 | 
  1394                     table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture))
 | 
| 
MMOSimca@427
 | 
  1395                 else
 | 
| 
MMOSimca@427
 | 
  1396                     Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link)
 | 
| 
MMOSimca@427
 | 
  1397                     return
 | 
| 
MMOSimca@427
 | 
  1398                 end
 | 
| 
jcallahan@312
 | 
  1399             end
 | 
| 
jcallahan@317
 | 
  1400 
 | 
| 
MMOSimca@427
 | 
  1401             if not boss_loot_toasting[raid_boss_id] then
 | 
| 
MMOSimca@427
 | 
  1402                 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1
 | 
| 
MMOSimca@427
 | 
  1403                 boss_loot_toasting[raid_boss_id] = true -- Do not count further loots until timer expires or another boss is killed
 | 
| 
jcallahan@312
 | 
  1404             end
 | 
| 
jcallahan@312
 | 
  1405         end
 | 
| 
MMOSimca@387
 | 
  1406     elseif loot_toast_container_id then
 | 
| 
jcallahan@305
 | 
  1407         InitializeCurrentLoot()
 | 
| 
jcallahan@305
 | 
  1408 
 | 
| 
jcallahan@306
 | 
  1409         -- Fake the loot characteristics to match that of an actual container item
 | 
| 
MMOSimca@387
 | 
  1410         current_loot.identifier = loot_toast_container_id
 | 
| 
jcallahan@306
 | 
  1411         current_loot.label = "contains"
 | 
| 
jcallahan@306
 | 
  1412         current_loot.target_type = AF.ITEM
 | 
| 
jcallahan@306
 | 
  1413 
 | 
| 
MMOSimca@387
 | 
  1414         current_loot.sources[loot_toast_container_id] = current_loot.sources[loot_toast_container_id] or {}
 | 
| 
jcallahan@312
 | 
  1415 
 | 
| 
jcallahan@301
 | 
  1416         if loot_type == "item" then
 | 
| 
jcallahan@312
 | 
  1417             local item_id = ItemLinkToID(item_link)
 | 
| 
jcallahan@312
 | 
  1418             if item_id then
 | 
| 
jcallahan@312
 | 
  1419                 Debug("%s: %s X %d (%d)", event_name, item_link, quantity, item_id)
 | 
| 
MMOSimca@340
 | 
  1420                 RecordItemData(item_id, item_link, true)
 | 
| 
MMOSimca@387
 | 
  1421                 current_loot.sources[loot_toast_container_id][item_id] = (current_loot.sources[loot_toast_container_id][item_id] or 0) + quantity
 | 
| 
jcallahan@312
 | 
  1422             else
 | 
| 
jcallahan@301
 | 
  1423                 Debug("%s: ItemID is nil, from item link %s", event_name, item_link)
 | 
| 
jcallahan@312
 | 
  1424                 current_loot = nil
 | 
| 
jcallahan@301
 | 
  1425                 return
 | 
| 
jcallahan@301
 | 
  1426             end
 | 
| 
jcallahan@301
 | 
  1427         elseif loot_type == "money" then
 | 
| 
jcallahan@312
 | 
  1428             Debug("%s: money X %d", event_name, quantity)
 | 
| 
MMOSimca@387
 | 
  1429             current_loot.sources[loot_toast_container_id]["money"] = (current_loot.sources[loot_toast_container_id]["money"] or 0) + quantity
 | 
| 
jcallahan@312
 | 
  1430         elseif loot_type == "currency" then
 | 
| 
jcallahan@312
 | 
  1431             local currency_texture = CurrencyLinkToTexture(item_link)
 | 
| 
jcallahan@312
 | 
  1432             if currency_texture and currency_texture ~= "" then
 | 
| 
jcallahan@312
 | 
  1433                 Debug("%s: %s X %d", event_name, currency_texture, quantity)
 | 
| 
jcallahan@312
 | 
  1434                 local currency_token = ("currency:%s"):format(currency_texture)
 | 
| 
MMOSimca@387
 | 
  1435                 current_loot.sources[loot_toast_container_id][currency_token] = (current_loot.sources[loot_toast_container_id][currency_token] or 0) + quantity
 | 
| 
jcallahan@312
 | 
  1436             else
 | 
| 
jcallahan@312
 | 
  1437                 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link)
 | 
| 
jcallahan@312
 | 
  1438                 current_loot = nil
 | 
| 
jcallahan@312
 | 
  1439                 return
 | 
| 
jcallahan@312
 | 
  1440             end
 | 
| 
jcallahan@301
 | 
  1441         end
 | 
| 
jcallahan@312
 | 
  1442 
 | 
| 
jcallahan@301
 | 
  1443         GenericLootUpdate("items")
 | 
| 
jcallahan@301
 | 
  1444         current_loot = nil
 | 
| 
MMOSimca@387
 | 
  1445         container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened
 | 
| 
MMOSimca@444
 | 
  1446     elseif loot_source and (loot_source == LOOT_SOURCE_ID_REDUNDANT) and chat_loot_timer_handle then
 | 
| 
MMOSimca@444
 | 
  1447         -- Handle currency loot toasts for chat-based loot (we do this instead of reading currency chat messages because the chat messages are very delayed)
 | 
| 
MMOSimca@444
 | 
  1448         if loot_type == "currency" then
 | 
| 
MMOSimca@444
 | 
  1449             local currency_texture = CurrencyLinkToTexture(item_link)
 | 
| 
MMOSimca@444
 | 
  1450             if currency_texture and currency_texture ~= "" then
 | 
| 
MMOSimca@444
 | 
  1451                 -- Verify that we're still assigning data to the right items
 | 
| 
MMOSimca@444
 | 
  1452                 if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then
 | 
| 
MMOSimca@444
 | 
  1453                     local currency_token = ("currency:%s"):format(currency_texture)
 | 
| 
MMOSimca@444
 | 
  1454                     Debug("%s: Captured currency for chat-based loot recording. %s X %d", event_name, currency_token, quantity)
 | 
| 
MMOSimca@444
 | 
  1455                     chat_loot_data.loot = chat_loot_data.loot or {}
 | 
| 
MMOSimca@444
 | 
  1456                     chat_loot_data.loot[currency_token] = (chat_loot_data.loot[currency_token] or 0) + quantity
 | 
| 
MMOSimca@444
 | 
  1457                 else -- If not, cancel the timer and wipe the loot table early
 | 
| 
MMOSimca@444
 | 
  1458                     Debug("%s: Canceled chat-based loot recording because we would have assigned the wrong loot!", event_name)
 | 
| 
MMOSimca@444
 | 
  1459                     ClearChatLootData()
 | 
| 
MMOSimca@444
 | 
  1460                 end
 | 
| 
MMOSimca@444
 | 
  1461             else
 | 
| 
MMOSimca@444
 | 
  1462                 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link)
 | 
| 
MMOSimca@444
 | 
  1463             end
 | 
| 
MMOSimca@444
 | 
  1464         -- Handle money loot toasts for chat-based loot (we do this instead of reading money chat messages because the chat messages are very delayed)
 | 
| 
MMOSimca@444
 | 
  1465         elseif loot_type == "money" then
 | 
| 
MMOSimca@424
 | 
  1466             -- Verify that we're still assigning data to the right items
 | 
| 
MMOSimca@435
 | 
  1467             if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then
 | 
| 
MMOSimca@444
 | 
  1468                 Debug("%s: Captured money for chat-based loot recording. money X %d", event_name, quantity)
 | 
| 
MMOSimca@435
 | 
  1469                 chat_loot_data.loot = chat_loot_data.loot or {}
 | 
| 
MMOSimca@444
 | 
  1470                 chat_loot_data.loot["money"] = (chat_loot_data.loot["money"] or 0) + quantity
 | 
| 
MMOSimca@424
 | 
  1471             else -- If not, cancel the timer and wipe the loot table early
 | 
| 
MMOSimca@424
 | 
  1472                 Debug("%s: Canceled chat-based loot recording because we would have assigned the wrong loot!", event_name)
 | 
| 
MMOSimca@424
 | 
  1473                 ClearChatLootData()
 | 
| 
MMOSimca@424
 | 
  1474             end
 | 
| 
MMOSimca@424
 | 
  1475         end
 | 
| 
jcallahan@301
 | 
  1476     else
 | 
| 
jcallahan@307
 | 
  1477         Debug("%s: NPC and Container are nil, storing loot toast data for 5 seconds.", event_name)
 | 
| 
jcallahan@307
 | 
  1478 
 | 
| 
jcallahan@307
 | 
  1479         loot_toast_data = loot_toast_data or {}
 | 
| 
jcallahan@312
 | 
  1480         loot_toast_data[#loot_toast_data + 1] = { loot_type, item_link, quantity }
 | 
| 
jcallahan@307
 | 
  1481 
 | 
| 
MMOSimca@340
 | 
  1482         local item_id = ItemLinkToID(item_link)
 | 
| 
MMOSimca@340
 | 
  1483         if item_id then
 | 
| 
MMOSimca@340
 | 
  1484             RecordItemData(item_id, item_link, true)
 | 
| 
MMOSimca@340
 | 
  1485         end
 | 
| 
MMOSimca@340
 | 
  1486 
 | 
| 
MMOSimca@383
 | 
  1487         loot_toast_data_timer_handle = C_Timer.NewTimer(5, ClearLootToastData)
 | 
| 
jcallahan@178
 | 
  1488     end
 | 
| 
jcallahan@178
 | 
  1489 end
 | 
| 
jcallahan@178
 | 
  1490 
 | 
| 
jcallahan@178
 | 
  1491 
 | 
| 
jcallahan@179
 | 
  1492 do
 | 
| 
MMOSimca@388
 | 
  1493     local CHAT_MSG_CURRENCY_UPDATE_FUNCS = {
 | 
| 
MMOSimca@388
 | 
  1494         [AF.NPC] = function(currency_texture, quantity)
 | 
| 
MMOSimca@388
 | 
  1495             Debug("CHAT_MSG_CURRENCY: AF.NPC currency:%s (%d)", currency_texture, quantity)
 | 
| 
MMOSimca@388
 | 
  1496         end,
 | 
| 
MMOSimca@388
 | 
  1497         [AF.ZONE] = function(currency_texture, quantity)
 | 
| 
MMOSimca@388
 | 
  1498             local currency_token = ("currency:%s"):format(currency_texture)
 | 
| 
MMOSimca@388
 | 
  1499             Debug("CHAT_MSG_CURRENCY: AF.ZONE %s (%d)", currency_token, quantity)
 | 
| 
MMOSimca@388
 | 
  1500             InitializeCurrentLoot()
 | 
| 
MMOSimca@388
 | 
  1501             current_loot.list[1] = ("%s:%d"):format(currency_token, quantity)
 | 
| 
MMOSimca@388
 | 
  1502             GenericLootUpdate("zones")
 | 
| 
MMOSimca@388
 | 
  1503             current_loot = nil
 | 
| 
MMOSimca@388
 | 
  1504         end,
 | 
| 
MMOSimca@388
 | 
  1505     }
 | 
| 
MMOSimca@388
 | 
  1506 
 | 
| 
MMOSimca@388
 | 
  1507 
 | 
| 
MMOSimca@388
 | 
  1508     function WDP:CHAT_MSG_CURRENCY(event_name, message)
 | 
| 
MMOSimca@388
 | 
  1509         local category
 | 
| 
MMOSimca@388
 | 
  1510 
 | 
| 
MMOSimca@388
 | 
  1511         local currency_link, quantity = deformat(message, _G.CURRENCY_GAINED_MULTIPLE)
 | 
| 
MMOSimca@388
 | 
  1512         if not currency_link then
 | 
| 
MMOSimca@388
 | 
  1513             quantity, currency_link = 1, deformat(message, _G.CURRENCY_GAINED)
 | 
| 
MMOSimca@388
 | 
  1514         end
 | 
| 
MMOSimca@388
 | 
  1515         local currency_texture = CurrencyLinkToTexture(currency_link)
 | 
| 
MMOSimca@388
 | 
  1516 
 | 
| 
MMOSimca@388
 | 
  1517         if not currency_texture or currency_texture == "" then
 | 
| 
MMOSimca@388
 | 
  1518             return
 | 
| 
MMOSimca@388
 | 
  1519         end
 | 
| 
MMOSimca@388
 | 
  1520 
 | 
| 
MMOSimca@388
 | 
  1521         -- Set update category
 | 
| 
MMOSimca@388
 | 
  1522         if current_action.spell_label == "FISHING" then
 | 
| 
MMOSimca@388
 | 
  1523             category = AF.ZONE
 | 
| 
MMOSimca@388
 | 
  1524         elseif raid_boss_id then
 | 
| 
MMOSimca@388
 | 
  1525             category = AF.NPC
 | 
| 
MMOSimca@388
 | 
  1526         end
 | 
| 
MMOSimca@388
 | 
  1527 
 | 
| 
MMOSimca@388
 | 
  1528         -- Take action based on update category
 | 
| 
MMOSimca@388
 | 
  1529         local update_func = CHAT_MSG_CURRENCY_UPDATE_FUNCS[category]
 | 
| 
MMOSimca@388
 | 
  1530         if not category or not update_func then
 | 
| 
MMOSimca@388
 | 
  1531             return
 | 
| 
MMOSimca@388
 | 
  1532         end
 | 
| 
MMOSimca@388
 | 
  1533         update_func(currency_texture, quantity)
 | 
| 
MMOSimca@388
 | 
  1534     end
 | 
| 
MMOSimca@388
 | 
  1535 
 | 
| 
MMOSimca@388
 | 
  1536 
 | 
| 
MMOSimca@412
 | 
  1537     local BLACKLISTED_ITEMS = {
 | 
| 
MMOSimca@412
 | 
  1538         [114116] = true,
 | 
| 
MMOSimca@412
 | 
  1539         [114119] = true,
 | 
| 
MMOSimca@412
 | 
  1540         [114120] = true,
 | 
| 
MMOSimca@412
 | 
  1541         [116980] = true,
 | 
| 
MMOSimca@412
 | 
  1542         [120319] = true,
 | 
| 
MMOSimca@412
 | 
  1543         [120320] = true,
 | 
| 
MMOSimca@412
 | 
  1544     }
 | 
| 
MMOSimca@412
 | 
  1545 
 | 
| 
MMOSimca@412
 | 
  1546 
 | 
| 
jcallahan@179
 | 
  1547     local CHAT_MSG_LOOT_UPDATE_FUNCS = {
 | 
| 
MMOSimca@347
 | 
  1548         [AF.ITEM] = function(item_id, quantity)
 | 
| 
MMOSimca@347
 | 
  1549             -- Verify that we're still assigning data to the right items
 | 
| 
MMOSimca@435
 | 
  1550             if chat_loot_data.identifier and (private.CONTAINER_ITEM_ID_LIST[chat_loot_data.identifier] ~= nil) then
 | 
| 
MMOSimca@347
 | 
  1551                 Debug("CHAT_MSG_LOOT: AF.ITEM %d (%d)", item_id, quantity)
 | 
| 
MMOSimca@435
 | 
  1552                 chat_loot_data.loot = chat_loot_data.loot or {}
 | 
| 
MMOSimca@435
 | 
  1553                 chat_loot_data.loot[item_id] = (chat_loot_data.loot[item_id] or 0) + quantity
 | 
| 
MMOSimca@347
 | 
  1554             else -- If not, cancel the timer and wipe the loot table early
 | 
| 
MMOSimca@387
 | 
  1555                 Debug("CHAT_MSG_LOOT: We would have assigned the wrong loot!")
 | 
| 
MMOSimca@387
 | 
  1556                 ClearChatLootData()
 | 
| 
MMOSimca@347
 | 
  1557             end
 | 
| 
MMOSimca@347
 | 
  1558         end,
 | 
| 
jcallahan@179
 | 
  1559         [AF.NPC] = function(item_id, quantity)
 | 
| 
MMOSimca@345
 | 
  1560             Debug("CHAT_MSG_LOOT: AF.NPC %d (%d)", item_id, quantity)
 | 
| 
MMOSimca@345
 | 
  1561         end,
 | 
| 
MMOSimca@345
 | 
  1562         [AF.OBJECT] = function(item_id, quantity)
 | 
| 
MMOSimca@345
 | 
  1563             Debug("CHAT_MSG_LOOT: AF.OBJECT %d (%d)", item_id, quantity)
 | 
| 
MMOSimca@381
 | 
  1564             -- Check for top level object data
 | 
| 
MMOSimca@381
 | 
  1565             local object_entry = DBEntry("objects", ("OPENING:%s"):format(private.LOGGING_SPELL_ID_TO_OBJECT_ID_MAP[last_timber_spell_id]))
 | 
| 
MMOSimca@381
 | 
  1566             local difficulty_token = InstanceDifficultyToken()
 | 
| 
MMOSimca@381
 | 
  1567             if object_entry[difficulty_token] then
 | 
| 
MMOSimca@381
 | 
  1568                 -- Increment loot count
 | 
| 
MMOSimca@381
 | 
  1569                 object_entry[difficulty_token]["opening_count"] = (object_entry[difficulty_token]["opening_count"] or 0) + 1
 | 
| 
MMOSimca@381
 | 
  1570 
 | 
| 
MMOSimca@381
 | 
  1571                 -- Add drop data
 | 
| 
MMOSimca@381
 | 
  1572                 object_entry[difficulty_token]["opening"] = object_entry[difficulty_token]["opening"] or {}
 | 
| 
MMOSimca@381
 | 
  1573                 table.insert(object_entry[difficulty_token]["opening"], ("%d:%d"):format(item_id, quantity))
 | 
| 
MMOSimca@381
 | 
  1574             else
 | 
| 
MMOSimca@381
 | 
  1575                 Debug("CHAT_MSG_LOOT: When handling timber, the top level data was missing for objectID %s.", private.LOGGING_SPELL_ID_TO_OBJECT_ID_MAP[last_timber_spell_id])
 | 
| 
MMOSimca@381
 | 
  1576             end
 | 
| 
jcallahan@179
 | 
  1577         end,
 | 
| 
jcallahan@179
 | 
  1578         [AF.ZONE] = function(item_id, quantity)
 | 
| 
MMOSimca@345
 | 
  1579             Debug("CHAT_MSG_LOOT: AF.ZONE %d (%d)", item_id, quantity)
 | 
| 
jcallahan@312
 | 
  1580             InitializeCurrentLoot()
 | 
| 
jcallahan@312
 | 
  1581             current_loot.list[1] = ("%d:%d"):format(item_id, quantity)
 | 
| 
jcallahan@179
 | 
  1582             GenericLootUpdate("zones")
 | 
| 
jcallahan@312
 | 
  1583             current_loot = nil
 | 
| 
jcallahan@179
 | 
  1584         end,
 | 
| 
jcallahan@179
 | 
  1585     }
 | 
| 
jcallahan@177
 | 
  1586 
 | 
| 
jcallahan@177
 | 
  1587 
 | 
| 
MMOSimca@388
 | 
  1588     function WDP:CHAT_MSG_LOOT(event_name, message)
 | 
| 
jcallahan@179
 | 
  1589         local category
 | 
| 
jcallahan@177
 | 
  1590 
 | 
| 
MMOSimca@345
 | 
  1591         local item_link, quantity = deformat(message, _G.LOOT_ITEM_PUSHED_SELF_MULTIPLE)
 | 
| 
MMOSimca@345
 | 
  1592         if not item_link then
 | 
| 
MMOSimca@345
 | 
  1593             quantity, item_link = 1, deformat(message, _G.LOOT_ITEM_PUSHED_SELF)
 | 
| 
MMOSimca@345
 | 
  1594         end
 | 
| 
MMOSimca@345
 | 
  1595         local item_id = ItemLinkToID(item_link)
 | 
| 
MMOSimca@345
 | 
  1596 
 | 
| 
MMOSimca@345
 | 
  1597         if not item_id then
 | 
| 
MMOSimca@345
 | 
  1598             return
 | 
| 
MMOSimca@345
 | 
  1599         end
 | 
| 
MMOSimca@345
 | 
  1600 
 | 
| 
MMOSimca@345
 | 
  1601         -- Set update category
 | 
| 
MMOSimca@405
 | 
  1602         if last_timber_spell_id and item_id == ITEM_ID_TIMBER then
 | 
| 
MMOSimca@345
 | 
  1603             category = AF.OBJECT
 | 
| 
MMOSimca@345
 | 
  1604         -- Recently changed from ~= "EXTRACT_GAS" because of some occassional bad data, and, as far as I know, no benefit.
 | 
| 
MMOSimca@345
 | 
  1605         elseif current_action.spell_label == "FISHING" then
 | 
| 
jcallahan@179
 | 
  1606             category = AF.ZONE
 | 
| 
MMOSimca@388
 | 
  1607         elseif raid_boss_id then
 | 
| 
jcallahan@179
 | 
  1608             category = AF.NPC
 | 
| 
MMOSimca@347
 | 
  1609         elseif chat_loot_timer_handle then
 | 
| 
MMOSimca@347
 | 
  1610             category = AF.ITEM
 | 
| 
jcallahan@179
 | 
  1611         end
 | 
| 
MMOSimca@345
 | 
  1612 
 | 
| 
MMOSimca@395
 | 
  1613         -- We still want to record the item's data, even if it doesn't need its drop location recorded
 | 
| 
MMOSimca@395
 | 
  1614         RecordItemData(item_id, item_link, true)
 | 
| 
MMOSimca@395
 | 
  1615 
 | 
| 
MMOSimca@345
 | 
  1616         -- Take action based on update category
 | 
| 
jcallahan@179
 | 
  1617         local update_func = CHAT_MSG_LOOT_UPDATE_FUNCS[category]
 | 
| 
MMOSimca@412
 | 
  1618         if not category or not update_func or BLACKLISTED_ITEMS[item_id] then
 | 
| 
MMOSimca@340
 | 
  1619             return
 | 
| 
MMOSimca@340
 | 
  1620         end
 | 
| 
jcallahan@179
 | 
  1621         update_func(item_id, quantity)
 | 
| 
jcallahan@177
 | 
  1622     end
 | 
| 
MMOSimca@388
 | 
  1623 end
 | 
| 
MMOSimca@388
 | 
  1624 
 | 
| 
MMOSimca@388
 | 
  1625 
 | 
| 
jcallahan@97
 | 
  1626 function WDP:RecordQuote(event_name, message, source_name, language_name)
 | 
| 
jcallahan@112
 | 
  1627     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
 | 
  1628         return
 | 
| 
jcallahan@95
 | 
  1629     end
 | 
| 
jcallahan@97
 | 
  1630     local npc = NPCEntry(name_to_id_map[source_name])
 | 
| 
jcallahan@97
 | 
  1631     npc.quotes = npc.quotes or {}
 | 
| 
jcallahan@97
 | 
  1632     npc.quotes[event_name] = npc.quotes[event_name] or {}
 | 
| 
jcallahan@97
 | 
  1633     npc.quotes[event_name][ReplaceKeywords(message)] = true
 | 
| 
jcallahan@97
 | 
  1634 end
 | 
| 
jcallahan@95
 | 
  1635 
 | 
| 
jcallahan@95
 | 
  1636 
 | 
| 
jcallahan@95
 | 
  1637 do
 | 
| 
jcallahan@40
 | 
  1638     local SOBER_MATCH = _G.DRUNK_MESSAGE_ITEM_SELF1:gsub("%%s", ".+")
 | 
| 
jcallahan@40
 | 
  1639 
 | 
| 
jcallahan@40
 | 
  1640     local DRUNK_COMPARES = {
 | 
| 
jcallahan@40
 | 
  1641         _G.DRUNK_MESSAGE_SELF2,
 | 
| 
jcallahan@40
 | 
  1642         _G.DRUNK_MESSAGE_SELF3,
 | 
| 
jcallahan@40
 | 
  1643         _G.DRUNK_MESSAGE_SELF4,
 | 
| 
jcallahan@40
 | 
  1644     }
 | 
| 
jcallahan@40
 | 
  1645 
 | 
| 
jcallahan@40
 | 
  1646     local DRUNK_MATCHES = {
 | 
| 
jcallahan@254
 | 
  1647         (_G.DRUNK_MESSAGE_SELF2:gsub("%%s", ".+")),
 | 
| 
jcallahan@254
 | 
  1648         (_G.DRUNK_MESSAGE_SELF3:gsub("%%s", ".+")),
 | 
| 
jcallahan@254
 | 
  1649         (_G.DRUNK_MESSAGE_SELF4:gsub("%%s", ".+")),
 | 
| 
jcallahan@40
 | 
  1650     }
 | 
| 
jcallahan@40
 | 
  1651 
 | 
| 
jcallahan@167
 | 
  1652     local RECIPE_MATCH = _G.ERR_LEARN_RECIPE_S:gsub("%%s", "(.*)")
 | 
| 
jcallahan@167
 | 
  1653 
 | 
| 
jcallahan@167
 | 
  1654 
 | 
| 
jcallahan@167
 | 
  1655     local function RecordDiscovery(tradeskill_name, tradeskill_index)
 | 
| 
jcallahan@167
 | 
  1656         if tradeskill_name == private.discovered_recipe_name then
 | 
| 
jcallahan@167
 | 
  1657             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
 | 
  1658 
 | 
| 
jcallahan@167
 | 
  1659             private.discovered_recipe_name = nil
 | 
| 
jcallahan@167
 | 
  1660             private.profession_level = nil
 | 
| 
jcallahan@167
 | 
  1661             private.previous_spell_id = nil
 | 
| 
jcallahan@169
 | 
  1662 
 | 
| 
jcallahan@169
 | 
  1663             return true
 | 
| 
jcallahan@167
 | 
  1664         end
 | 
| 
jcallahan@167
 | 
  1665     end
 | 
| 
jcallahan@167
 | 
  1666 
 | 
| 
jcallahan@167
 | 
  1667 
 | 
| 
jcallahan@167
 | 
  1668     local function IterativeRecordDiscovery()
 | 
| 
jcallahan@167
 | 
  1669         TradeSkillExecutePer(RecordDiscovery)
 | 
| 
jcallahan@167
 | 
  1670     end
 | 
| 
jcallahan@167
 | 
  1671 
 | 
| 
jcallahan@167
 | 
  1672 
 | 
| 
jcallahan@92
 | 
  1673     function WDP:CHAT_MSG_SYSTEM(event_name, message)
 | 
| 
MMOSimca@400
 | 
  1674         local item_link, quantity = deformat(message, _G.ERR_QUEST_REWARD_ITEM_MULT_IS)
 | 
| 
MMOSimca@400
 | 
  1675         if not item_link then
 | 
| 
MMOSimca@400
 | 
  1676             quantity, item_link = 1, deformat(message, _G.ERR_QUEST_REWARD_ITEM_S)
 | 
| 
MMOSimca@400
 | 
  1677         end
 | 
| 
MMOSimca@400
 | 
  1678         local item_id = ItemLinkToID(item_link)
 | 
| 
MMOSimca@400
 | 
  1679 
 | 
| 
MMOSimca@400
 | 
  1680         -- If it isn't a quest message, check the other uses of system messages
 | 
| 
MMOSimca@400
 | 
  1681         if not item_id then
 | 
| 
MMOSimca@400
 | 
  1682             if not private.trainer_shown then
 | 
| 
MMOSimca@400
 | 
  1683                 local recipe_name = message:match(RECIPE_MATCH)
 | 
| 
MMOSimca@400
 | 
  1684 
 | 
| 
MMOSimca@400
 | 
  1685                 if recipe_name and private.previous_spell_id then
 | 
| 
MMOSimca@400
 | 
  1686                     local profession_name, prof_level = _G.GetTradeSkillLine()
 | 
| 
MMOSimca@400
 | 
  1687 
 | 
| 
MMOSimca@400
 | 
  1688                     if profession_name == _G.UNKNOWN then
 | 
| 
MMOSimca@400
 | 
  1689                         return
 | 
| 
MMOSimca@400
 | 
  1690                     end
 | 
| 
MMOSimca@400
 | 
  1691                     private.discovered_recipe_name = recipe_name
 | 
| 
MMOSimca@400
 | 
  1692                     private.profession_level = prof_level
 | 
| 
MMOSimca@400
 | 
  1693 
 | 
| 
MMOSimca@400
 | 
  1694                     C_Timer.After(0.2, IterativeRecordDiscovery)
 | 
| 
jcallahan@167
 | 
  1695                 end
 | 
| 
jcallahan@167
 | 
  1696             end
 | 
| 
MMOSimca@400
 | 
  1697 
 | 
| 
MMOSimca@400
 | 
  1698             if currently_drunk then
 | 
| 
MMOSimca@400
 | 
  1699                 if message == _G.DRUNK_MESSAGE_SELF1 or message:match(SOBER_MATCH) then
 | 
| 
MMOSimca@400
 | 
  1700                     currently_drunk = nil
 | 
| 
MMOSimca@400
 | 
  1701                 end
 | 
| 
MMOSimca@400
 | 
  1702                 return
 | 
| 
MMOSimca@400
 | 
  1703             end
 | 
| 
MMOSimca@400
 | 
  1704 
 | 
| 
MMOSimca@400
 | 
  1705             for index = 1, #DRUNK_MATCHES do
 | 
| 
MMOSimca@400
 | 
  1706                 if message == DRUNK_COMPARES[index] or message:match(DRUNK_MATCHES[index]) then
 | 
| 
MMOSimca@400
 | 
  1707                     currently_drunk = true
 | 
| 
MMOSimca@400
 | 
  1708                     break
 | 
| 
MMOSimca@400
 | 
  1709                 end
 | 
| 
jcallahan@40
 | 
  1710             end
 | 
| 
jcallahan@40
 | 
  1711             return
 | 
| 
jcallahan@40
 | 
  1712         end
 | 
| 
jcallahan@40
 | 
  1713 
 | 
| 
MMOSimca@411
 | 
  1714         -- If it is an item, parse its link
 | 
| 
MMOSimca@400
 | 
  1715         RecordItemData(item_id, item_link, true)
 | 
| 
jcallahan@40
 | 
  1716     end
 | 
| 
jcallahan@40
 | 
  1717 end
 | 
| 
jcallahan@40
 | 
  1718 
 | 
| 
jcallahan@307
 | 
  1719 
 | 
| 
jcallahan@331
 | 
  1720 do
 | 
| 
jcallahan@23
 | 
  1721     local FLAGS_NPC = bit.bor(_G.COMBATLOG_OBJECT_TYPE_GUARDIAN, _G.COMBATLOG_OBJECT_CONTROL_NPC)
 | 
| 
jcallahan@23
 | 
  1722     local FLAGS_NPC_CONTROL = bit.bor(_G.COMBATLOG_OBJECT_AFFILIATION_OUTSIDER, _G.COMBATLOG_OBJECT_CONTROL_NPC)
 | 
| 
jcallahan@23
 | 
  1723 
 | 
| 
MMOSimca@458
 | 
  1724     -- Spells that are cast by players/NPCs that are mistakely assigned as being cast by the target; must be blacklisted
 | 
| 
MMOSimca@405
 | 
  1725     local BLACKLISTED_SPELLS = {
 | 
| 
MMOSimca@458
 | 
  1726         [117526] = true, -- Binding Shot (cast by Hunters)
 | 
| 
MMOSimca@458
 | 
  1727         [121308] = true, -- Disguise (cast by Rogues)
 | 
| 
MMOSimca@458
 | 
  1728         [132464] = true, -- Chi Wave (cast by Monks)
 | 
| 
MMOSimca@458
 | 
  1729         [132467] = true, -- Chi Wave (cast by Monks)
 | 
| 
MMOSimca@460
 | 
  1730         [167432] = true, -- Savagery (cast by Warsong Commander)
 | 
| 
MMOSimca@460
 | 
  1731         [175077] = true, -- Fearsome Battle Standard (cast by Fearsome Battle Standard item)
 | 
| 
MMOSimca@458
 | 
  1732         [176813] = true, -- Itchy Spores (cast by Marsh Creatures in Ashran)
 | 
| 
MMOSimca@458
 | 
  1733         [183901] = true, -- Stolen Strength (cast by Felblood NPCs in Tanaan Jungle)
 | 
| 
MMOSimca@458
 | 
  1734         [183904] = true, -- Stolen Speed (cast by Felblood NPCs in Tanaan Jungle)
 | 
| 
MMOSimca@458
 | 
  1735         [183907] = true, -- Stolen Fervor (cast by Felblood NPCs in Tanaan Jungle)
 | 
| 
MMOSimca@405
 | 
  1736     }
 | 
| 
MMOSimca@405
 | 
  1737 
 | 
| 
jcallahan@23
 | 
  1738     local function RecordNPCSpell(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name)
 | 
| 
MMOSimca@405
 | 
  1739         if not spell_id or BLACKLISTED_SPELLS[spell_id] then
 | 
| 
jcallahan@23
 | 
  1740             return
 | 
| 
jcallahan@23
 | 
  1741         end
 | 
| 
jcallahan@34
 | 
  1742         local source_type, source_id = ParseGUID(source_guid)
 | 
| 
jcallahan@23
 | 
  1743 
 | 
| 
jcallahan@171
 | 
  1744         if not source_id or not UnitTypeIsNPC(source_type) then
 | 
| 
jcallahan@23
 | 
  1745             return
 | 
| 
jcallahan@23
 | 
  1746         end
 | 
| 
jcallahan@23
 | 
  1747 
 | 
| 
jcallahan@23
 | 
  1748         if bit.band(FLAGS_NPC_CONTROL, source_flags) == FLAGS_NPC_CONTROL and bit.band(FLAGS_NPC, source_flags) ~= 0 then
 | 
| 
jcallahan@248
 | 
  1749             local encounter_data = NPCEntry(source_id):EncounterData(InstanceDifficultyToken())
 | 
| 
jcallahan@28
 | 
  1750             encounter_data.spells = encounter_data.spells or {}
 | 
| 
jcallahan@28
 | 
  1751             encounter_data.spells[spell_id] = (encounter_data.spells[spell_id] or 0) + 1
 | 
| 
jcallahan@23
 | 
  1752         end
 | 
| 
jcallahan@23
 | 
  1753     end
 | 
| 
jcallahan@23
 | 
  1754 
 | 
| 
jcallahan@115
 | 
  1755     local HEAL_BATTLE_PETS_SPELL_ID = 125801
 | 
| 
jcallahan@115
 | 
  1756 
 | 
| 
jcallahan@246
 | 
  1757     local previous_combat_event = {}
 | 
| 
jcallahan@246
 | 
  1758 
 | 
| 
jcallahan@23
 | 
  1759     local COMBAT_LOG_FUNCS = {
 | 
| 
jcallahan@23
 | 
  1760         SPELL_AURA_APPLIED = RecordNPCSpell,
 | 
| 
jcallahan@23
 | 
  1761         SPELL_CAST_START = RecordNPCSpell,
 | 
| 
jcallahan@115
 | 
  1762         SPELL_CAST_SUCCESS = function(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name)
 | 
| 
jcallahan@115
 | 
  1763             if spell_id == HEAL_BATTLE_PETS_SPELL_ID then
 | 
| 
jcallahan@115
 | 
  1764                 local unit_type, unit_idnum = ParseGUID(source_guid)
 | 
| 
jcallahan@115
 | 
  1765 
 | 
| 
jcallahan@171
 | 
  1766                 if unit_idnum and UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@115
 | 
  1767                     NPCEntry(unit_idnum).stable_master = true
 | 
| 
jcallahan@115
 | 
  1768                 end
 | 
| 
jcallahan@115
 | 
  1769             end
 | 
| 
jcallahan@115
 | 
  1770             RecordNPCSpell(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name)
 | 
| 
jcallahan@115
 | 
  1771         end,
 | 
| 
jcallahan@65
 | 
  1772         UNIT_DIED = function(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, spell_id, spell_name)
 | 
| 
jcallahan@65
 | 
  1773             local unit_type, unit_idnum = ParseGUID(dest_guid)
 | 
| 
jcallahan@65
 | 
  1774 
 | 
| 
jcallahan@171
 | 
  1775             if not unit_idnum or not UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@245
 | 
  1776                 Debug("%s: %s is not an NPC, or has no ID.", sub_event, dest_name or _G.UNKNOWN)
 | 
| 
jcallahan@177
 | 
  1777                 ClearKilledNPC()
 | 
| 
jcallahan@98
 | 
  1778                 private.harvesting = nil
 | 
| 
jcallahan@65
 | 
  1779                 return
 | 
| 
jcallahan@65
 | 
  1780             end
 | 
| 
jcallahan@177
 | 
  1781 
 | 
| 
jcallahan@246
 | 
  1782             if source_guid == "" then
 | 
| 
jcallahan@246
 | 
  1783                 source_guid = nil
 | 
| 
jcallahan@246
 | 
  1784             end
 | 
| 
jcallahan@246
 | 
  1785             local killer_guid = source_guid or previous_combat_event.source_guid
 | 
| 
jcallahan@246
 | 
  1786             local killer_name = source_name or previous_combat_event.source_name
 | 
| 
jcallahan@246
 | 
  1787 
 | 
| 
jcallahan@299
 | 
  1788             if not previous_combat_event.party_damage then
 | 
| 
jcallahan@312
 | 
  1789                 --Debug("%s: %s was killed by %s (not group member or pet).", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) -- broken in Patch 5.4
 | 
| 
jcallahan@299
 | 
  1790                 table.wipe(previous_combat_event)
 | 
| 
jcallahan@217
 | 
  1791                 ClearKilledNPC()
 | 
| 
jcallahan@306
 | 
  1792             else
 | 
| 
jcallahan@317
 | 
  1793                 --Debug("%s: %s was killed by %s.", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) -- broken in Patch 5.4
 | 
| 
jcallahan@177
 | 
  1794             end
 | 
| 
jcallahan@177
 | 
  1795             killed_npc_id = unit_idnum
 | 
| 
MMOSimca@383
 | 
  1796             C_Timer.After(0.1, ClearKilledNPC)
 | 
| 
jcallahan@65
 | 
  1797         end,
 | 
| 
jcallahan@23
 | 
  1798     }
 | 
| 
jcallahan@23
 | 
  1799 
 | 
| 
jcallahan@23
 | 
  1800 
 | 
| 
jcallahan@246
 | 
  1801     local NON_DAMAGE_EVENTS = {
 | 
| 
jcallahan@246
 | 
  1802         SPELL_AURA_APPLIED = true,
 | 
| 
jcallahan@246
 | 
  1803         SPELL_AURA_REMOVED = true,
 | 
| 
jcallahan@246
 | 
  1804         SPELL_AURA_REMOVED_DOSE = true,
 | 
| 
jcallahan@246
 | 
  1805         SPELL_CAST_FAILED = true,
 | 
| 
jcallahan@246
 | 
  1806         SWING_MISSED = true,
 | 
| 
jcallahan@246
 | 
  1807     }
 | 
| 
jcallahan@246
 | 
  1808 
 | 
| 
jcallahan@299
 | 
  1809     local DAMAGE_EVENTS = {
 | 
| 
jcallahan@299
 | 
  1810         RANGE_DAMAGE = true,
 | 
| 
jcallahan@299
 | 
  1811         SPELL_BUILDING_DAMAGE = true,
 | 
| 
jcallahan@299
 | 
  1812         SPELL_DAMAGE = true,
 | 
| 
jcallahan@299
 | 
  1813         SPELL_PERIODIC_DAMAGE = true,
 | 
| 
jcallahan@299
 | 
  1814         SWING_DAMAGE = true,
 | 
| 
jcallahan@299
 | 
  1815     }
 | 
| 
jcallahan@299
 | 
  1816 
 | 
| 
jcallahan@246
 | 
  1817 
 | 
| 
jcallahan@92
 | 
  1818     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
 | 
  1819         local combat_log_func = COMBAT_LOG_FUNCS[sub_event]
 | 
| 
jcallahan@23
 | 
  1820 
 | 
| 
jcallahan@23
 | 
  1821         if not combat_log_func then
 | 
| 
jcallahan@299
 | 
  1822             if DAMAGE_EVENTS[sub_event] then
 | 
| 
jcallahan@299
 | 
  1823                 table.wipe(previous_combat_event)
 | 
| 
jcallahan@246
 | 
  1824                 previous_combat_event.source_name = source_name
 | 
| 
jcallahan@299
 | 
  1825 
 | 
| 
jcallahan@299
 | 
  1826                 if source_guid ~= dest_guid and (in_instance or group_member_guids[source_guid] or group_pet_guids[source_guid]) then
 | 
| 
jcallahan@299
 | 
  1827                     previous_combat_event.party_damage = true
 | 
| 
jcallahan@299
 | 
  1828                 end
 | 
| 
jcallahan@246
 | 
  1829             end
 | 
| 
jcallahan@23
 | 
  1830             return
 | 
| 
jcallahan@23
 | 
  1831         end
 | 
| 
jcallahan@23
 | 
  1832         combat_log_func(sub_event, source_guid, source_name, source_flags, dest_guid, dest_name, dest_flags, ...)
 | 
| 
jcallahan@297
 | 
  1833 
 | 
| 
jcallahan@297
 | 
  1834         if NON_DAMAGE_EVENTS[sub_event] then
 | 
| 
jcallahan@297
 | 
  1835             table.wipe(previous_combat_event)
 | 
| 
jcallahan@297
 | 
  1836         end
 | 
| 
jcallahan@23
 | 
  1837     end
 | 
| 
jcallahan@23
 | 
  1838 
 | 
| 
MMOSimca@337
 | 
  1839     
 | 
| 
jcallahan@44
 | 
  1840     local DIPLOMACY_SPELL_ID = 20599
 | 
| 
jcallahan@44
 | 
  1841     local MR_POP_RANK1_SPELL_ID = 78634
 | 
| 
jcallahan@44
 | 
  1842     local MR_POP_RANK2_SPELL_ID = 78635
 | 
| 
MMOSimca@418
 | 
  1843     local TRADING_PACT_SPELL_ID = 170200
 | 
| 
jcallahan@44
 | 
  1844 
 | 
| 
jcallahan@44
 | 
  1845 
 | 
| 
jcallahan@92
 | 
  1846     function WDP:COMBAT_TEXT_UPDATE(event_name, message_type, faction_name, amount)
 | 
| 
jcallahan@177
 | 
  1847         if message_type ~= "FACTION" or not killed_npc_id then
 | 
| 
jcallahan@44
 | 
  1848             return
 | 
| 
jcallahan@44
 | 
  1849         end
 | 
| 
jcallahan@44
 | 
  1850         UpdateFactionData()
 | 
| 
jcallahan@44
 | 
  1851 
 | 
| 
jcallahan@46
 | 
  1852         if not faction_name or not faction_standings[faction_name] then
 | 
| 
jcallahan@46
 | 
  1853             return
 | 
| 
jcallahan@46
 | 
  1854         end
 | 
| 
jcallahan@177
 | 
  1855         local npc = NPCEntry(killed_npc_id)
 | 
| 
jcallahan@177
 | 
  1856         ClearKilledNPC()
 | 
| 
jcallahan@46
 | 
  1857 
 | 
| 
jcallahan@44
 | 
  1858         if not npc then
 | 
| 
jcallahan@98
 | 
  1859             private.harvesting = nil
 | 
| 
jcallahan@44
 | 
  1860             return
 | 
| 
jcallahan@44
 | 
  1861         end
 | 
| 
jcallahan@98
 | 
  1862         npc.harvested = private.harvesting
 | 
| 
jcallahan@98
 | 
  1863         private.harvesting = nil
 | 
| 
jcallahan@98
 | 
  1864 
 | 
| 
jcallahan@44
 | 
  1865         local modifier = 1
 | 
| 
jcallahan@44
 | 
  1866 
 | 
| 
MMOSimca@340
 | 
  1867         -- Check for modifiers from known spells
 | 
| 
jcallahan@44
 | 
  1868         if _G.IsSpellKnown(DIPLOMACY_SPELL_ID) then
 | 
| 
jcallahan@44
 | 
  1869             modifier = modifier + 0.1
 | 
| 
jcallahan@44
 | 
  1870         end
 | 
| 
jcallahan@44
 | 
  1871         if _G.IsSpellKnown(MR_POP_RANK2_SPELL_ID) then
 | 
| 
jcallahan@44
 | 
  1872             modifier = modifier + 0.1
 | 
| 
jcallahan@44
 | 
  1873         elseif _G.IsSpellKnown(MR_POP_RANK1_SPELL_ID) then
 | 
| 
jcallahan@44
 | 
  1874             modifier = modifier + 0.05
 | 
| 
jcallahan@44
 | 
  1875         end
 | 
| 
MMOSimca@418
 | 
  1876         if _G.IsSpellKnown(TRADING_PACT_SPELL_ID) then
 | 
| 
MMOSimca@418
 | 
  1877             modifier = modifier + 0.2
 | 
| 
MMOSimca@418
 | 
  1878         end
 | 
| 
jcallahan@44
 | 
  1879 
 | 
| 
MMOSimca@340
 | 
  1880         -- Determine faction ID
 | 
| 
MMOSimca@340
 | 
  1881         local faction_ID
 | 
| 
MMOSimca@418
 | 
  1882         for pseudo_faction_name, faction_data_table in pairs(private.FACTION_DATA) do
 | 
| 
MMOSimca@418
 | 
  1883             if faction_name == faction_data_table[3] then
 | 
| 
MMOSimca@418
 | 
  1884                 -- Check ignore flag
 | 
| 
MMOSimca@418
 | 
  1885                 if faction_data_table[2] then
 | 
| 
MMOSimca@418
 | 
  1886                     return
 | 
| 
MMOSimca@418
 | 
  1887                 end
 | 
| 
MMOSimca@340
 | 
  1888                 faction_ID = faction_data_table[1]
 | 
| 
MMOSimca@418
 | 
  1889                 break
 | 
| 
MMOSimca@340
 | 
  1890             end
 | 
| 
MMOSimca@340
 | 
  1891         end
 | 
| 
MMOSimca@340
 | 
  1892         if faction_ID and faction_ID > 0 then
 | 
| 
MMOSimca@340
 | 
  1893             -- Check for modifiers from Commendations (applied directly to the faction, account-wide)
 | 
| 
MMOSimca@340
 | 
  1894             local _, _, _, _, _, _, _, _, _, _, _, _, _, _, has_bonus_rep_gain = GetFactionInfoByID(faction_ID)
 | 
| 
MMOSimca@340
 | 
  1895             if has_bonus_rep_gain then
 | 
| 
MMOSimca@340
 | 
  1896                 modifier = modifier + 1
 | 
| 
MMOSimca@340
 | 
  1897             end
 | 
| 
MMOSimca@340
 | 
  1898         end
 | 
| 
MMOSimca@340
 | 
  1899 
 | 
| 
MMOSimca@340
 | 
  1900         -- Check for modifiers from buffs
 | 
| 
MMOSimca@418
 | 
  1901         for buff_name, buff_data_table in pairs(private.REP_BUFFS) do
 | 
| 
jcallahan@44
 | 
  1902             if _G.UnitBuff("player", buff_name) then
 | 
| 
MMOSimca@340
 | 
  1903                 local modded_faction = buff_data_table.faction
 | 
| 
jcallahan@44
 | 
  1904 
 | 
| 
jcallahan@44
 | 
  1905                 if not modded_faction or faction_name == modded_faction then
 | 
| 
MMOSimca@340
 | 
  1906                     if buff_data_table.ignore then
 | 
| 
MMOSimca@340
 | 
  1907                         -- Some buffs from tabards convert all rep of other factions into rep for a specific faction.
 | 
| 
MMOSimca@340
 | 
  1908                         -- We can't know what faction the rep was orginally from, so we must ignore the data entirely in these cases.
 | 
| 
MMOSimca@340
 | 
  1909                         return
 | 
| 
MMOSimca@340
 | 
  1910                     else
 | 
| 
MMOSimca@340
 | 
  1911                         modifier = modifier + buff_data_table.modifier
 | 
| 
MMOSimca@340
 | 
  1912                     end
 | 
| 
jcallahan@44
 | 
  1913                 end
 | 
| 
jcallahan@44
 | 
  1914             end
 | 
| 
jcallahan@44
 | 
  1915         end
 | 
| 
MMOSimca@340
 | 
  1916         
 | 
| 
jcallahan@65
 | 
  1917         npc.reputations = npc.reputations or {}
 | 
| 
jcallahan@65
 | 
  1918         npc.reputations[("%s:%s"):format(faction_name, faction_standings[faction_name])] = math.floor(amount / modifier)
 | 
| 
jcallahan@32
 | 
  1919     end
 | 
| 
jcallahan@44
 | 
  1920 end -- do-block
 | 
| 
jcallahan@18
 | 
  1921 
 | 
| 
jcallahan@18
 | 
  1922 
 | 
| 
jcallahan@140
 | 
  1923 function WDP:CURSOR_UPDATE(event_name)
 | 
| 
MMOSimca@355
 | 
  1924     if current_action.fishing_target or _G.Minimap:IsMouseOver() then
 | 
| 
jcallahan@140
 | 
  1925         return
 | 
| 
jcallahan@140
 | 
  1926     end
 | 
| 
jcallahan@140
 | 
  1927     local text = _G["GameTooltipTextLeft1"]:GetText()
 | 
| 
jcallahan@140
 | 
  1928 
 | 
| 
MMOSimca@355
 | 
  1929     -- Handle Fishing
 | 
| 
MMOSimca@355
 | 
  1930     if (current_action.spell_label == "FISHING") then
 | 
| 
MMOSimca@355
 | 
  1931         if not text or text == "Fishing Bobber" then
 | 
| 
MMOSimca@355
 | 
  1932             text = "NONE"
 | 
| 
MMOSimca@355
 | 
  1933         else
 | 
| 
MMOSimca@355
 | 
  1934             current_action.fishing_target = true
 | 
| 
MMOSimca@355
 | 
  1935         end
 | 
| 
MMOSimca@355
 | 
  1936         current_action.identifier = ("%s:%s"):format(current_action.spell_label, text)
 | 
| 
MMOSimca@355
 | 
  1937      -- Handle Garrison Cache
 | 
| 
MMOSimca@355
 | 
  1938     elseif private.GARRISON_CACHE_OBJECT_NAME_TO_OBJECT_ID_MAP[text] then
 | 
| 
MMOSimca@355
 | 
  1939         last_garrison_cache_object_id = private.GARRISON_CACHE_OBJECT_NAME_TO_OBJECT_ID_MAP[text]
 | 
| 
jcallahan@140
 | 
  1940     end
 | 
| 
jcallahan@140
 | 
  1941 end
 | 
| 
jcallahan@140
 | 
  1942 
 | 
| 
jcallahan@140
 | 
  1943 
 | 
| 
jcallahan@92
 | 
  1944 function WDP:ITEM_TEXT_BEGIN(event_name)
 | 
| 
jcallahan@42
 | 
  1945     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc"))
 | 
| 
jcallahan@42
 | 
  1946 
 | 
| 
jcallahan@42
 | 
  1947     if not unit_idnum or unit_type ~= private.UNIT_TYPES.OBJECT or _G.UnitName("npc") ~= _G.ItemTextGetItem() then
 | 
| 
jcallahan@42
 | 
  1948         return
 | 
| 
jcallahan@42
 | 
  1949     end
 | 
| 
jcallahan@42
 | 
  1950     UpdateDBEntryLocation("objects", unit_idnum)
 | 
| 
jcallahan@42
 | 
  1951 end
 | 
| 
jcallahan@42
 | 
  1952 
 | 
| 
jcallahan@42
 | 
  1953 
 | 
| 
jcallahan@13
 | 
  1954 do
 | 
| 
MMOSimca@343
 | 
  1955     local LOOT_OPENED_VERIFY_FUNCS = {
 | 
| 
jcallahan@324
 | 
  1956         -- Item containers can be AOE-looted in Patch 5.4.2 if the user clicks fast enough, but this verification still works as long as they both have loot.
 | 
| 
jcallahan@16
 | 
  1957         [AF.ITEM] = function()
 | 
| 
jcallahan@16
 | 
  1958             local locked_item_id
 | 
| 
jcallahan@16
 | 
  1959 
 | 
| 
jcallahan@16
 | 
  1960             for bag_index = 0, _G.NUM_BAG_FRAMES do
 | 
| 
jcallahan@16
 | 
  1961                 for slot_index = 1, _G.GetContainerNumSlots(bag_index) do
 | 
| 
jcallahan@324
 | 
  1962                     local _, _, is_locked, _, _, is_lootable = _G.GetContainerItemInfo(bag_index, slot_index)
 | 
| 
jcallahan@324
 | 
  1963 
 | 
| 
jcallahan@324
 | 
  1964                     if is_locked and is_lootable then
 | 
| 
jcallahan@16
 | 
  1965                         locked_item_id = ItemLinkToID(_G.GetContainerItemLink(bag_index, slot_index))
 | 
| 
jcallahan@165
 | 
  1966                         break
 | 
| 
jcallahan@16
 | 
  1967                     end
 | 
| 
jcallahan@16
 | 
  1968                 end
 | 
| 
jcallahan@165
 | 
  1969 
 | 
| 
jcallahan@165
 | 
  1970                 if locked_item_id then
 | 
| 
jcallahan@165
 | 
  1971                     break
 | 
| 
jcallahan@165
 | 
  1972                 end
 | 
| 
jcallahan@16
 | 
  1973             end
 | 
| 
jcallahan@16
 | 
  1974 
 | 
| 
MMOSimca@367
 | 
  1975             if (not current_action.spell_label == "DISENCHANT") and (not locked_item_id or (current_action.identifier and current_action.identifier ~= locked_item_id)) then
 | 
| 
jcallahan@16
 | 
  1976                 return false
 | 
| 
jcallahan@16
 | 
  1977             end
 | 
| 
jcallahan@122
 | 
  1978             current_action.identifier = locked_item_id
 | 
| 
jcallahan@16
 | 
  1979             return true
 | 
| 
jcallahan@16
 | 
  1980         end,
 | 
| 
MMOSimca@401
 | 
  1981         [AF.NPC] = function()
 | 
| 
MMOSimca@401
 | 
  1982             return not _G.IsFishingLoot()
 | 
| 
MMOSimca@401
 | 
  1983         end,
 | 
| 
MMOSimca@401
 | 
  1984         [AF.OBJECT] = function()
 | 
| 
MMOSimca@401
 | 
  1985             return not _G.IsFishingLoot()
 | 
| 
MMOSimca@401
 | 
  1986         end,
 | 
| 
jcallahan@17
 | 
  1987         [AF.ZONE] = function()
 | 
| 
jcallahan@140
 | 
  1988             current_action.zone_data = UpdateDBEntryLocation("zones", current_action.identifier)
 | 
| 
jcallahan@210
 | 
  1989             return _G.IsFishingLoot()
 | 
| 
jcallahan@17
 | 
  1990         end,
 | 
| 
jcallahan@13
 | 
  1991     }
 | 
| 
jcallahan@13
 | 
  1992 
 | 
| 
jcallahan@13
 | 
  1993 
 | 
| 
MMOSimca@343
 | 
  1994     local LOOT_OPENED_UPDATE_FUNCS = {
 | 
| 
jcallahan@16
 | 
  1995         [AF.ITEM] = function()
 | 
| 
jcallahan@28
 | 
  1996             GenericLootUpdate("items")
 | 
| 
jcallahan@28
 | 
  1997         end,
 | 
| 
jcallahan@28
 | 
  1998         [AF.NPC] = function()
 | 
| 
jcallahan@75
 | 
  1999             local difficulty_token = InstanceDifficultyToken()
 | 
| 
jcallahan@312
 | 
  2000             local loot_label = current_loot.label
 | 
| 
jcallahan@77
 | 
  2001             local source_list = {}
 | 
| 
jcallahan@75
 | 
  2002 
 | 
| 
jcallahan@131
 | 
  2003             for source_guid, loot_data in pairs(current_loot.sources) do
 | 
| 
jcallahan@331
 | 
  2004                 local _, source_id = ParseGUID(source_guid)
 | 
| 
jcallahan@75
 | 
  2005                 local npc = NPCEntry(source_id)
 | 
| 
jcallahan@75
 | 
  2006 
 | 
| 
jcallahan@75
 | 
  2007                 if npc then
 | 
| 
jcallahan@248
 | 
  2008                     local encounter_data = npc:EncounterData(difficulty_token)
 | 
| 
jcallahan@312
 | 
  2009                     encounter_data[loot_label] = encounter_data[loot_label] or {}
 | 
| 
jcallahan@75
 | 
  2010 
 | 
| 
jcallahan@78
 | 
  2011                     if not source_list[source_guid] then
 | 
| 
jcallahan@77
 | 
  2012                         encounter_data.loot_counts = encounter_data.loot_counts or {}
 | 
| 
MMOSimca@426
 | 
  2013                         encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1
 | 
| 
jcallahan@312
 | 
  2014                         source_list[source_guid] = true
 | 
| 
jcallahan@77
 | 
  2015                     end
 | 
| 
jcallahan@77
 | 
  2016 
 | 
| 
jcallahan@309
 | 
  2017                     for loot_token, quantity in pairs(loot_data) do
 | 
| 
jcallahan@312
 | 
  2018                         local loot_type, currency_texture = (":"):split(loot_token)
 | 
| 
jcallahan@312
 | 
  2019 
 | 
| 
jcallahan@312
 | 
  2020                         if loot_type == "currency" and currency_texture then
 | 
| 
jcallahan@312
 | 
  2021                             table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture))
 | 
| 
jcallahan@309
 | 
  2022                         elseif loot_token == "money" then
 | 
| 
jcallahan@312
 | 
  2023                             table.insert(encounter_data[loot_label], ("money:%d"):format(quantity))
 | 
| 
jcallahan@309
 | 
  2024                         else
 | 
| 
jcallahan@312
 | 
  2025                             table.insert(encounter_data[loot_label], ("%d:%d"):format(loot_token, quantity))
 | 
| 
jcallahan@309
 | 
  2026                         end
 | 
| 
jcallahan@75
 | 
  2027                     end
 | 
| 
jcallahan@75
 | 
  2028                 end
 | 
| 
jcallahan@75
 | 
  2029             end
 | 
| 
jcallahan@16
 | 
  2030         end,
 | 
| 
jcallahan@13
 | 
  2031         [AF.OBJECT] = function()
 | 
| 
jcallahan@28
 | 
  2032             GenericLootUpdate("objects", InstanceDifficultyToken())
 | 
| 
jcallahan@17
 | 
  2033         end,
 | 
| 
jcallahan@17
 | 
  2034         [AF.ZONE] = function()
 | 
| 
MMOSimca@328
 | 
  2035             if not (current_loot.map_level and current_loot.x and current_loot.y and current_loot.zone_data) then
 | 
| 
MMOSimca@328
 | 
  2036                 return
 | 
| 
MMOSimca@328
 | 
  2037             end
 | 
| 
jcallahan@141
 | 
  2038             local location_token = ("%d:%d:%d"):format(current_loot.map_level, current_loot.x, current_loot.y)
 | 
| 
jcallahan@41
 | 
  2039 
 | 
| 
jcallahan@41
 | 
  2040             -- This will start life as a boolean true.
 | 
| 
jcallahan@131
 | 
  2041             if _G.type(current_loot.zone_data[location_token]) ~= "table" then
 | 
| 
jcallahan@131
 | 
  2042                 current_loot.zone_data[location_token] = {
 | 
| 
jcallahan@41
 | 
  2043                     drops = {}
 | 
| 
jcallahan@41
 | 
  2044                 }
 | 
| 
jcallahan@41
 | 
  2045             end
 | 
| 
jcallahan@132
 | 
  2046             local loot_count = ("%s_count"):format(current_loot.label)
 | 
| 
jcallahan@131
 | 
  2047             current_loot.zone_data[location_token][loot_count] = (current_loot.zone_data[location_token][loot_count] or 0) + 1
 | 
| 
jcallahan@41
 | 
  2048 
 | 
| 
jcallahan@131
 | 
  2049             if current_loot.sources then
 | 
| 
jcallahan@131
 | 
  2050                 for source_guid, loot_data in pairs(current_loot.sources) do
 | 
| 
jcallahan@131
 | 
  2051                     for item_id, quantity in pairs(loot_data) do
 | 
| 
jcallahan@131
 | 
  2052                         table.insert(current_loot.zone_data[location_token].drops, ("%d:%d"):format(item_id, quantity))
 | 
| 
jcallahan@131
 | 
  2053                     end
 | 
| 
jcallahan@131
 | 
  2054                 end
 | 
| 
jcallahan@131
 | 
  2055             end
 | 
| 
jcallahan@131
 | 
  2056 
 | 
| 
jcallahan@131
 | 
  2057             if #current_loot.list <= 0 then
 | 
| 
jcallahan@131
 | 
  2058                 return
 | 
| 
jcallahan@131
 | 
  2059             end
 | 
| 
jcallahan@131
 | 
  2060 
 | 
| 
jcallahan@131
 | 
  2061             for index = 1, #current_loot.list do
 | 
| 
MMOSimca@443
 | 
  2062                 table.insert(current_loot.zone_data[location_token].drops, current_loot.list[index])
 | 
| 
jcallahan@41
 | 
  2063             end
 | 
| 
jcallahan@13
 | 
  2064         end,
 | 
| 
jcallahan@13
 | 
  2065     }
 | 
| 
jcallahan@13
 | 
  2066 
 | 
| 
jcallahan@79
 | 
  2067     -- Prevent opening the same loot window multiple times from recording data multiple times.
 | 
| 
jcallahan@79
 | 
  2068     local loot_guid_registry = {}
 | 
| 
jcallahan@124
 | 
  2069 
 | 
| 
jcallahan@124
 | 
  2070 
 | 
| 
jcallahan@124
 | 
  2071     function WDP:LOOT_CLOSED(event_name)
 | 
| 
MMOSimca@398
 | 
  2072         ClearChatLootData()
 | 
| 
jcallahan@131
 | 
  2073         current_loot = nil
 | 
| 
jcallahan@131
 | 
  2074         table.wipe(current_action)
 | 
| 
jcallahan@124
 | 
  2075     end
 | 
| 
jcallahan@124
 | 
  2076 
 | 
| 
jcallahan@13
 | 
  2077 
 | 
| 
jcallahan@322
 | 
  2078     local function ExtrapolatedCurrentActionFromLootData(event_name)
 | 
| 
MMOSimca@402
 | 
  2079         local log_source = event_name .. "- ExtrapolatedCurrentActionFromLootData"
 | 
| 
MMOSimca@402
 | 
  2080         local previous_spell_label = current_action.spell_label
 | 
| 
jcallahan@322
 | 
  2081         local extrapolated_guid_registry = {}
 | 
| 
jcallahan@322
 | 
  2082         local num_guids = 0
 | 
| 
MMOSimca@402
 | 
  2083         table.wipe(current_action)
 | 
| 
MMOSimca@402
 | 
  2084 
 | 
| 
MMOSimca@402
 | 
  2085         if _G.IsFishingLoot() then
 | 
| 
MMOSimca@402
 | 
  2086             -- Set up a proper 'fishing' current_action table
 | 
| 
MMOSimca@402
 | 
  2087             local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData()
 | 
| 
MMOSimca@402
 | 
  2088             if not (zone_name and area_id and x and y and map_level) then
 | 
| 
MMOSimca@402
 | 
  2089                 Debug("%s: Missing current location data - %s, %d, %d, %d, %d.", log_source, zone_name, area_id, x, y, map_level)
 | 
| 
MMOSimca@402
 | 
  2090                 return
 | 
| 
MMOSimca@402
 | 
  2091             end
 | 
| 
MMOSimca@402
 | 
  2092             current_action.instance_token = instance_token
 | 
| 
MMOSimca@402
 | 
  2093             current_action.map_level = map_level
 | 
| 
MMOSimca@402
 | 
  2094             current_action.x = x
 | 
| 
MMOSimca@402
 | 
  2095             current_action.y = y
 | 
| 
MMOSimca@402
 | 
  2096             current_action.zone_data = ("%s:%d"):format(zone_name, area_id)
 | 
| 
MMOSimca@402
 | 
  2097             current_action.spell_label = "FISHING"
 | 
| 
MMOSimca@402
 | 
  2098             current_action.loot_label = "fishing"
 | 
| 
MMOSimca@402
 | 
  2099             current_action.identifier = "FISHING:NONE"
 | 
| 
MMOSimca@402
 | 
  2100             current_action.target_type = AF.ZONE
 | 
| 
MMOSimca@402
 | 
  2101 
 | 
| 
MMOSimca@402
 | 
  2102             Debug("%s: Fishing loot detected.", log_source)
 | 
| 
MMOSimca@402
 | 
  2103             return true
 | 
| 
MMOSimca@402
 | 
  2104         end
 | 
| 
jcallahan@322
 | 
  2105 
 | 
| 
MMOSimca@344
 | 
  2106         -- Loot extrapolation cannot handle objects that need special spell labels (like HERBALISM or MINING) (MIND_CONTROL is okay)
 | 
| 
MMOSimca@402
 | 
  2107         if previous_spell_label and private.SPELL_FLAGS_BY_LABEL[previous_spell_label] and not private.NON_LOOT_SPELL_LABELS[previous_spell_label] then
 | 
| 
MMOSimca@344
 | 
  2108             Debug("%s: Problematic spell label %s found. Loot extrapolation for this set of loot would have run an increased risk of introducing bad data into the system.", log_source, private.previous_spell_id)
 | 
| 
MMOSimca@344
 | 
  2109             return false
 | 
| 
MMOSimca@344
 | 
  2110         end
 | 
| 
MMOSimca@344
 | 
  2111 
 | 
| 
jcallahan@322
 | 
  2112         for loot_slot = 1, _G.GetNumLootItems() do
 | 
| 
jcallahan@322
 | 
  2113             local loot_info = {
 | 
| 
jcallahan@322
 | 
  2114                 _G.GetLootSourceInfo(loot_slot)
 | 
| 
jcallahan@322
 | 
  2115             }
 | 
| 
jcallahan@322
 | 
  2116 
 | 
| 
jcallahan@322
 | 
  2117             for loot_index = 1, #loot_info, 2 do
 | 
| 
jcallahan@322
 | 
  2118                 local source_guid = loot_info[loot_index]
 | 
| 
jcallahan@322
 | 
  2119 
 | 
| 
jcallahan@322
 | 
  2120                 if not extrapolated_guid_registry[source_guid] then
 | 
| 
jcallahan@322
 | 
  2121                     local unit_type, unit_idnum = ParseGUID(source_guid)
 | 
| 
jcallahan@322
 | 
  2122 
 | 
| 
jcallahan@322
 | 
  2123                     if unit_type and unit_idnum then
 | 
| 
jcallahan@322
 | 
  2124                         extrapolated_guid_registry[source_guid] = {
 | 
| 
jcallahan@322
 | 
  2125                             unit_type,
 | 
| 
jcallahan@322
 | 
  2126                             unit_idnum
 | 
| 
jcallahan@322
 | 
  2127                         }
 | 
| 
jcallahan@322
 | 
  2128 
 | 
| 
jcallahan@322
 | 
  2129                         num_guids = num_guids + 1
 | 
| 
jcallahan@322
 | 
  2130                     end
 | 
| 
jcallahan@322
 | 
  2131                 end
 | 
| 
jcallahan@322
 | 
  2132             end
 | 
| 
jcallahan@322
 | 
  2133         end
 | 
| 
jcallahan@322
 | 
  2134 
 | 
| 
jcallahan@322
 | 
  2135         if num_guids == 0 then
 | 
| 
jcallahan@322
 | 
  2136             Debug("%s: No GUIDs found in loot. Blank loot window?", log_source)
 | 
| 
jcallahan@322
 | 
  2137             return false
 | 
| 
jcallahan@322
 | 
  2138         end
 | 
| 
jcallahan@326
 | 
  2139 
 | 
| 
jcallahan@322
 | 
  2140         local num_npcs = 0
 | 
| 
jcallahan@322
 | 
  2141         local num_objects = 0
 | 
| 
jcallahan@324
 | 
  2142         local num_itemcontainers = 0
 | 
| 
jcallahan@322
 | 
  2143 
 | 
| 
jcallahan@322
 | 
  2144         for source_guid, guid_data in pairs(extrapolated_guid_registry) do
 | 
| 
jcallahan@322
 | 
  2145             local unit_type = guid_data[1]
 | 
| 
jcallahan@324
 | 
  2146             local loot_label = (unit_type == private.UNIT_TYPES.OBJECT) and "opening" or (UnitTypeIsNPC(unit_type) and "drops") or ((unit_type == private.UNIT_TYPES.PLAYER) and "contains")
 | 
| 
jcallahan@322
 | 
  2147 
 | 
| 
jcallahan@322
 | 
  2148             if loot_label then
 | 
| 
jcallahan@322
 | 
  2149                 local unit_idnum = guid_data[2]
 | 
| 
jcallahan@322
 | 
  2150 
 | 
| 
jcallahan@322
 | 
  2151                 if loot_guid_registry[loot_label] and loot_guid_registry[loot_label][source_guid] then
 | 
| 
jcallahan@322
 | 
  2152                     Debug("%s: Previously scanned loot for unit with GUID %s and identifier %s.", log_source, source_guid, unit_idnum)
 | 
| 
jcallahan@322
 | 
  2153                 elseif unit_type == private.UNIT_TYPES.OBJECT and unit_idnum ~= OBJECT_ID_FISHING_BOBBER then
 | 
| 
jcallahan@322
 | 
  2154                     current_action.loot_label = loot_label
 | 
| 
jcallahan@322
 | 
  2155                     current_action.spell_label = "OPENING"
 | 
| 
jcallahan@322
 | 
  2156                     current_action.target_type = AF.OBJECT
 | 
| 
jcallahan@322
 | 
  2157                     current_action.identifier = unit_idnum
 | 
| 
jcallahan@322
 | 
  2158                     num_objects = num_objects + 1
 | 
| 
jcallahan@322
 | 
  2159                 elseif UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@322
 | 
  2160                     current_action.loot_label = loot_label
 | 
| 
jcallahan@322
 | 
  2161                     current_action.target_type = AF.NPC
 | 
| 
jcallahan@322
 | 
  2162                     current_action.identifier = unit_idnum
 | 
| 
jcallahan@322
 | 
  2163                     num_npcs = num_npcs + 1
 | 
| 
jcallahan@324
 | 
  2164                 elseif unit_type == private.UNIT_TYPES.PLAYER then
 | 
| 
jcallahan@331
 | 
  2165                     -- Item container GUIDs are currently of the 'PLAYER' type; this may be unintended and could change in the future.
 | 
| 
jcallahan@324
 | 
  2166                     current_action.loot_label = loot_label
 | 
| 
jcallahan@324
 | 
  2167                     current_action.target_type = AF.ITEM
 | 
| 
jcallahan@324
 | 
  2168                     -- current_action.identifier assigned during loot verification.
 | 
| 
jcallahan@324
 | 
  2169                     num_itemcontainers = num_itemcontainers + 1
 | 
| 
jcallahan@322
 | 
  2170                 end
 | 
| 
jcallahan@322
 | 
  2171             else
 | 
| 
jcallahan@322
 | 
  2172                 -- Bail here; not only do we not know what this unit is, but we don't want to attribute loot to something that doesn't actually drop it.
 | 
| 
jcallahan@322
 | 
  2173                 Debug("%s: Unit with GUID %s has unsupported type for looting.", log_source, source_guid)
 | 
| 
jcallahan@322
 | 
  2174                 return false
 | 
| 
jcallahan@322
 | 
  2175             end
 | 
| 
jcallahan@322
 | 
  2176         end
 | 
| 
jcallahan@322
 | 
  2177 
 | 
| 
jcallahan@322
 | 
  2178         if not current_action.target_type then
 | 
| 
jcallahan@322
 | 
  2179             Debug("%s: Failure to obtain target_type.", log_source)
 | 
| 
jcallahan@322
 | 
  2180             return false
 | 
| 
jcallahan@322
 | 
  2181         end
 | 
| 
jcallahan@322
 | 
  2182 
 | 
| 
jcallahan@322
 | 
  2183         -- We can't figure out what dropped the loot. This shouldn't ever happen, but hey - Blizzard does some awesome stuff on occasion.
 | 
| 
jcallahan@324
 | 
  2184         if (num_npcs > 0 and num_objects + num_itemcontainers > 0) or (num_objects > 0 and num_npcs + num_itemcontainers > 0) or (num_itemcontainers > 0 and num_npcs + num_objects > 0) then
 | 
| 
jcallahan@324
 | 
  2185             Debug("%s: Mixed target types are not supported. NPCs - %d, Objects - %d, Item Containers - %d.", log_source, num_npcs, num_objects, num_itemcontainers)
 | 
| 
jcallahan@322
 | 
  2186             return false
 | 
| 
jcallahan@322
 | 
  2187         end
 | 
| 
jcallahan@322
 | 
  2188 
 | 
| 
jcallahan@322
 | 
  2189         return true
 | 
| 
jcallahan@322
 | 
  2190     end
 | 
| 
jcallahan@322
 | 
  2191 
 | 
| 
jcallahan@322
 | 
  2192 
 | 
| 
MMOSimca@343
 | 
  2193     function WDP:LOOT_OPENED(event_name)
 | 
| 
MMOSimca@398
 | 
  2194         ClearChatLootData()
 | 
| 
MMOSimca@387
 | 
  2195 
 | 
| 
jcallahan@132
 | 
  2196         if current_loot then
 | 
| 
jcallahan@322
 | 
  2197             current_loot = nil
 | 
| 
jcallahan@322
 | 
  2198             Debug("%s: Previous loot did not process in time for this event. Attempting to extrapolate current_action from loot data.", event_name)
 | 
| 
jcallahan@322
 | 
  2199 
 | 
| 
jcallahan@322
 | 
  2200             if not ExtrapolatedCurrentActionFromLootData(event_name) then
 | 
| 
jcallahan@322
 | 
  2201                 Debug("%s: Unable to extrapolate current_action. Aborting attempts to handle loot for now.", event_name)
 | 
| 
jcallahan@322
 | 
  2202                 return
 | 
| 
jcallahan@322
 | 
  2203             end
 | 
| 
jcallahan@18
 | 
  2204         end
 | 
| 
jcallahan@151
 | 
  2205 
 | 
| 
jcallahan@151
 | 
  2206         if not current_action.target_type then
 | 
| 
jcallahan@322
 | 
  2207             if not ExtrapolatedCurrentActionFromLootData(event_name) then
 | 
| 
jcallahan@322
 | 
  2208                 Debug("%s: Unable to extrapolate current_action. Aborting attempts to handle loot for now.", event_name)
 | 
| 
jcallahan@322
 | 
  2209                 return
 | 
| 
jcallahan@322
 | 
  2210             end
 | 
| 
jcallahan@151
 | 
  2211         end
 | 
| 
MMOSimca@343
 | 
  2212         local verify_func = LOOT_OPENED_VERIFY_FUNCS[current_action.target_type]
 | 
| 
MMOSimca@343
 | 
  2213         local update_func = LOOT_OPENED_UPDATE_FUNCS[current_action.target_type]
 | 
| 
jcallahan@13
 | 
  2214 
 | 
| 
jcallahan@14
 | 
  2215         if not verify_func or not update_func then
 | 
| 
jcallahan@322
 | 
  2216             Debug("%s: The current action's target type is unsupported or nil.", event_name)
 | 
| 
jcallahan@13
 | 
  2217             return
 | 
| 
jcallahan@13
 | 
  2218         end
 | 
| 
jcallahan@13
 | 
  2219 
 | 
| 
jcallahan@14
 | 
  2220         if _G.type(verify_func) == "function" and not verify_func() then
 | 
| 
jcallahan@324
 | 
  2221             Debug("%s: The current action type, %s, is supported but has failed loot verification.", event_name, private.ACTION_TYPE_NAMES[current_action.target_type])
 | 
| 
jcallahan@14
 | 
  2222             return
 | 
| 
jcallahan@14
 | 
  2223         end
 | 
| 
jcallahan@80
 | 
  2224         local guids_used = {}
 | 
| 
jcallahan@132
 | 
  2225 
 | 
| 
jcallahan@301
 | 
  2226         InitializeCurrentLoot()
 | 
| 
jcallahan@217
 | 
  2227         loot_guid_registry[current_loot.label] = loot_guid_registry[current_loot.label] or {}
 | 
| 
jcallahan@217
 | 
  2228 
 | 
| 
jcallahan@55
 | 
  2229         for loot_slot = 1, _G.GetNumLootItems() do
 | 
| 
catherton@463
 | 
  2230             local texturefiledataID, item_text, slot_quantity, quality, locked = _G.GetLootSlotInfo(loot_slot)
 | 
| 
jcallahan@55
 | 
  2231             local slot_type = _G.GetLootSlotType(loot_slot)
 | 
| 
catherton@463
 | 
  2232             local loot_info = { _G.GetLootSourceInfo(loot_slot) }
 | 
| 
catherton@463
 | 
  2233 			local loot_link = _G.GetLootSlotLink(loot_slot)
 | 
| 
jcallahan@13
 | 
  2234 
 | 
| 
jcallahan@237
 | 
  2235             -- Odd index is GUID, even is count.
 | 
| 
jcallahan@237
 | 
  2236             for loot_index = 1, #loot_info, 2 do
 | 
| 
jcallahan@237
 | 
  2237                 local source_guid = loot_info[loot_index]
 | 
| 
jcallahan@75
 | 
  2238 
 | 
| 
jcallahan@237
 | 
  2239                 if not loot_guid_registry[current_loot.label][source_guid] then
 | 
| 
jcallahan@237
 | 
  2240                     local loot_quantity = loot_info[loot_index + 1]
 | 
| 
jcallahan@324
 | 
  2241                     -- There is a new bug in 5.4.0 that causes GetLootSlotInfo() to (rarely) return nil values for slot_quantity.
 | 
| 
jcallahan@324
 | 
  2242                     if slot_quantity then
 | 
| 
jcallahan@324
 | 
  2243                         -- We need slot_quantity to account for an old bug where loot_quantity is sometimes '1' for stacks of items, such as cloth.
 | 
| 
jcallahan@324
 | 
  2244                         if slot_quantity > loot_quantity then
 | 
| 
jcallahan@324
 | 
  2245                             loot_quantity = slot_quantity
 | 
| 
jcallahan@324
 | 
  2246                         end
 | 
| 
jcallahan@324
 | 
  2247                         local source_type, source_id = ParseGUID(source_guid)
 | 
| 
MMOSimca@329
 | 
  2248                         local source_key = ("%s:%d"):format(source_type, source_id)
 | 
| 
jcallahan@324
 | 
  2249 
 | 
| 
MMOSimca@366
 | 
  2250                         if slot_type == LOOT_SLOT_ITEM then
 | 
| 
catherton@463
 | 
  2251 							if loot_link then
 | 
| 
catherton@463
 | 
  2252 								local item_id = ItemLinkToID(loot_link)
 | 
| 
catherton@463
 | 
  2253 								Debug("GUID: %s - Type:ID: %s - ItemID: %d - Amount: %d (%d)", loot_info[loot_index], source_key, item_id, loot_info[loot_index + 1], slot_quantity)
 | 
| 
catherton@463
 | 
  2254 								current_loot.sources[source_guid] = current_loot.sources[source_guid] or {}
 | 
| 
catherton@463
 | 
  2255 								current_loot.sources[source_guid][item_id] = (current_loot.sources[source_guid][item_id] or 0) + loot_quantity
 | 
| 
catherton@463
 | 
  2256 								guids_used[source_guid] = true
 | 
| 
catherton@463
 | 
  2257                             else
 | 
| 
catherton@463
 | 
  2258                                 Debug("%s: Loot link is nil for loot slot %d of the entity with GUID %s and Type:ID: %s.", event_name, loot_slot, loot_info[loot_index], source_key)
 | 
| 
catherton@463
 | 
  2259                             end
 | 
| 
MMOSimca@366
 | 
  2260                         elseif slot_type == LOOT_SLOT_MONEY then
 | 
| 
jcallahan@324
 | 
  2261                             Debug("GUID: %s - Type:ID: %s - Money - Amount: %d (%d)", loot_info[loot_index], source_key, loot_info[loot_index + 1], slot_quantity)
 | 
| 
jcallahan@324
 | 
  2262                             if current_loot.target_type == AF.ZONE then
 | 
| 
jcallahan@324
 | 
  2263                                 table.insert(current_loot.list, ("money:%d"):format(loot_quantity))
 | 
| 
jcallahan@324
 | 
  2264                             else
 | 
| 
jcallahan@324
 | 
  2265                                 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {}
 | 
| 
MMOSimca@367
 | 
  2266                                 current_loot.sources[source_guid]["money"] = (current_loot.sources[source_guid]["money"] or 0) + loot_quantity
 | 
| 
jcallahan@324
 | 
  2267                                 guids_used[source_guid] = true
 | 
| 
jcallahan@324
 | 
  2268                             end
 | 
| 
MMOSimca@366
 | 
  2269                         elseif slot_type == LOOT_SLOT_CURRENCY then
 | 
| 
jcallahan@324
 | 
  2270                             -- Same bug with GetLootSlotInfo() will screw up currency when it happens, so we won't process this slot's loot.
 | 
| 
catherton@463
 | 
  2271                             if loot_link then
 | 
| 
catherton@463
 | 
  2272 								local icon_texture = CurrencyLinkToTexture(loot_link)
 | 
| 
jcallahan@324
 | 
  2273                                 Debug("GUID: %s - Type:ID: %s - Currency: %s - Amount: %d (%d)", loot_info[loot_index], source_key, icon_texture, loot_info[loot_index + 1], slot_quantity)
 | 
| 
jcallahan@324
 | 
  2274                                 if current_loot.target_type == AF.ZONE then
 | 
| 
catherton@463
 | 
  2275                                     table.insert(current_loot.list, ("currency:%d:%s"):format(loot_quantity, icon_texture))
 | 
| 
jcallahan@324
 | 
  2276                                 else
 | 
| 
catherton@463
 | 
  2277                                     local currency_token = ("currency:%s"):format(icon_texture)
 | 
| 
jcallahan@324
 | 
  2278 
 | 
| 
jcallahan@324
 | 
  2279                                     current_loot.sources[source_guid] = current_loot.sources[source_guid] or {}
 | 
| 
MMOSimca@367
 | 
  2280                                     current_loot.sources[source_guid][currency_token] = (current_loot.sources[source_guid][currency_token] or 0) + loot_quantity
 | 
| 
jcallahan@324
 | 
  2281                                     guids_used[source_guid] = true
 | 
| 
jcallahan@324
 | 
  2282                                 end
 | 
| 
jcallahan@324
 | 
  2283                             else
 | 
| 
catherton@463
 | 
  2284                                 Debug("%s: Loot link is nil for loot slot %d of the entity with GUID %s and Type:ID: %s.", event_name, loot_slot, loot_info[loot_index], source_key)
 | 
| 
jcallahan@324
 | 
  2285                             end
 | 
| 
jcallahan@308
 | 
  2286                         end
 | 
| 
jcallahan@324
 | 
  2287                     else
 | 
| 
jcallahan@324
 | 
  2288                         -- If this is nil, then the item's quantity could be wrong if loot_quantity is wrong, so we won't process this slot's loot.
 | 
| 
catherton@463
 | 
  2289                         Debug("%s: Slot quantity is nil for loot slot %d of the entity with GUID %s and Type:ID: %s.", event_name, loot_slot, loot_info[loot_index], source_key)
 | 
| 
jcallahan@79
 | 
  2290                     end
 | 
| 
jcallahan@75
 | 
  2291                 end
 | 
| 
jcallahan@13
 | 
  2292             end
 | 
| 
jcallahan@13
 | 
  2293         end
 | 
| 
jcallahan@80
 | 
  2294 
 | 
| 
jcallahan@81
 | 
  2295         for guid in pairs(guids_used) do
 | 
| 
jcallahan@217
 | 
  2296             loot_guid_registry[current_loot.label][guid] = true
 | 
| 
jcallahan@80
 | 
  2297         end
 | 
| 
jcallahan@13
 | 
  2298         update_func()
 | 
| 
jcallahan@1
 | 
  2299     end
 | 
| 
jcallahan@13
 | 
  2300 end -- do-block
 | 
| 
jcallahan@0
 | 
  2301 
 | 
| 
jcallahan@0
 | 
  2302 
 | 
| 
jcallahan@89
 | 
  2303 function WDP:MAIL_SHOW(event_name)
 | 
| 
MMOSimca@436
 | 
  2304     WDP:StopChatLootRecording(event_name)
 | 
| 
jcallahan@89
 | 
  2305     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc"))
 | 
| 
jcallahan@89
 | 
  2306 
 | 
| 
jcallahan@89
 | 
  2307     if not unit_idnum or unit_type ~= private.UNIT_TYPES.OBJECT then
 | 
| 
jcallahan@89
 | 
  2308         return
 | 
| 
jcallahan@89
 | 
  2309     end
 | 
| 
jcallahan@89
 | 
  2310     UpdateDBEntryLocation("objects", unit_idnum)
 | 
| 
jcallahan@89
 | 
  2311 end
 | 
| 
jcallahan@89
 | 
  2312 
 | 
| 
jcallahan@89
 | 
  2313 
 | 
| 
jcallahan@44
 | 
  2314 do
 | 
| 
jcallahan@44
 | 
  2315     local POINT_MATCH_PATTERNS = {
 | 
| 
jcallahan@44
 | 
  2316         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING:gsub("%%d", "(%%d+)")), -- May no longer be necessary
 | 
| 
jcallahan@44
 | 
  2317         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3:gsub("%%d", "(%%d+)")), -- May no longer be necessary
 | 
| 
jcallahan@44
 | 
  2318         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_5V5:gsub("%%d", "(%%d+)")), -- May no longer be necessary
 | 
| 
jcallahan@44
 | 
  2319         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_BG:gsub("%%d", "(%%d+)")),
 | 
| 
jcallahan@44
 | 
  2320         ("^%s$"):format(_G.ITEM_REQ_ARENA_RATING_3V3_BG:gsub("%%d", "(%%d+)")),
 | 
| 
jcallahan@44
 | 
  2321     }
 | 
| 
jcallahan@5
 | 
  2322 
 | 
| 
jcallahan@68
 | 
  2323     local ITEM_REQ_REPUTATION_MATCH = "Requires (.-) %- (.*)"
 | 
| 
jcallahan@87
 | 
  2324     local ITEM_REQ_QUEST_MATCH1 = "Requires: .*"
 | 
| 
jcallahan@87
 | 
  2325     local ITEM_REQ_QUEST_MATCH2 = "Must have completed: .*"
 | 
| 
jcallahan@68
 | 
  2326 
 | 
| 
jcallahan@133
 | 
  2327     local current_merchant
 | 
| 
jcallahan@133
 | 
  2328     local merchant_standing
 | 
| 
jcallahan@133
 | 
  2329 
 | 
| 
jcallahan@133
 | 
  2330     function WDP:MERCHANT_CLOSED(event_name)
 | 
| 
MMOSimca@436
 | 
  2331         WDP:ResumeChatLootRecording(event_name)
 | 
| 
jcallahan@133
 | 
  2332         current_merchant = nil
 | 
| 
jcallahan@133
 | 
  2333         merchant_standing = nil
 | 
| 
jcallahan@133
 | 
  2334     end
 | 
| 
jcallahan@133
 | 
  2335 
 | 
| 
jcallahan@133
 | 
  2336 
 | 
| 
jcallahan@89
 | 
  2337     function WDP:UpdateMerchantItems(event_name)
 | 
| 
jcallahan@144
 | 
  2338         if not current_merchant or event_name == "MERCHANT_SHOW" then
 | 
| 
MMOSimca@436
 | 
  2339             WDP:StopChatLootRecording(event_name)
 | 
| 
jcallahan@195
 | 
  2340             local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc"))
 | 
| 
jcallahan@4
 | 
  2341 
 | 
| 
jcallahan@171
 | 
  2342             if not unit_idnum or not UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@133
 | 
  2343                 return
 | 
| 
jcallahan@133
 | 
  2344             end
 | 
| 
jcallahan@331
 | 
  2345             local _, faction_standing = UnitFactionStanding("npc")
 | 
| 
jcallahan@331
 | 
  2346             merchant_standing = faction_standing
 | 
| 
jcallahan@133
 | 
  2347             current_merchant = NPCEntry(unit_idnum)
 | 
| 
jcallahan@133
 | 
  2348             current_merchant.sells = current_merchant.sells or {}
 | 
| 
jcallahan@44
 | 
  2349         end
 | 
| 
jcallahan@55
 | 
  2350         local current_filters = _G.GetMerchantFilter()
 | 
| 
jcallahan@57
 | 
  2351         _G.SetMerchantFilter(_G.LE_LOOT_FILTER_ALL)
 | 
| 
jcallahan@57
 | 
  2352         _G.MerchantFrame_Update()
 | 
| 
jcallahan@57
 | 
  2353 
 | 
| 
jcallahan@150
 | 
  2354         local num_items = _G.GetMerchantNumItems()
 | 
| 
jcallahan@150
 | 
  2355 
 | 
| 
jcallahan@44
 | 
  2356         for item_index = 1, num_items do
 | 
| 
jcallahan@44
 | 
  2357             local _, _, copper_price, stack_size, num_available, _, extended_cost = _G.GetMerchantItemInfo(item_index)
 | 
| 
jcallahan@44
 | 
  2358             local item_id = ItemLinkToID(_G.GetMerchantItemLink(item_index))
 | 
| 
jcallahan@5
 | 
  2359 
 | 
| 
jcallahan@324
 | 
  2360             DatamineTT:ClearLines()
 | 
| 
jcallahan@324
 | 
  2361             DatamineTT:SetMerchantItem(item_index)
 | 
| 
jcallahan@324
 | 
  2362 
 | 
| 
jcallahan@324
 | 
  2363             if not item_id then
 | 
| 
jcallahan@324
 | 
  2364                 local item_name, item_link = DatamineTT:GetItem()
 | 
| 
jcallahan@324
 | 
  2365                 item_id = ItemLinkToID(item_link)
 | 
| 
MMOSimca@354
 | 
  2366                 -- GetMerchantItemLink() still ocassionally fails as of Patch 6.0.2. It fails so badly that debug functions cause considerable slowdown.
 | 
| 
jcallahan@324
 | 
  2367             end
 | 
| 
jcallahan@324
 | 
  2368 
 | 
| 
jcallahan@44
 | 
  2369             if item_id and item_id > 0 then
 | 
| 
jcallahan@44
 | 
  2370                 local price_string = ActualCopperCost(copper_price, merchant_standing)
 | 
| 
jcallahan@5
 | 
  2371 
 | 
| 
jcallahan@68
 | 
  2372                 local num_lines = DatamineTT:NumLines()
 | 
| 
jcallahan@68
 | 
  2373 
 | 
| 
jcallahan@68
 | 
  2374                 for line_index = 1, num_lines do
 | 
| 
jcallahan@68
 | 
  2375                     local current_line = _G["WDPDatamineTTTextLeft" .. line_index]
 | 
| 
jcallahan@68
 | 
  2376 
 | 
| 
jcallahan@68
 | 
  2377                     if not current_line then
 | 
| 
jcallahan@68
 | 
  2378                         break
 | 
| 
jcallahan@68
 | 
  2379                     end
 | 
| 
jcallahan@68
 | 
  2380                     local faction, reputation = current_line:GetText():match(ITEM_REQ_REPUTATION_MATCH)
 | 
| 
jcallahan@68
 | 
  2381 
 | 
| 
jcallahan@68
 | 
  2382                     if faction or reputation then
 | 
| 
jcallahan@68
 | 
  2383                         DBEntry("items", item_id).req_reputation = ("%s:%s"):format(faction:gsub("-", ""), reputation:upper())
 | 
| 
jcallahan@68
 | 
  2384                         break
 | 
| 
jcallahan@68
 | 
  2385                     end
 | 
| 
jcallahan@68
 | 
  2386                 end
 | 
| 
jcallahan@68
 | 
  2387 
 | 
| 
jcallahan@87
 | 
  2388                 for line_index = 1, num_lines do
 | 
| 
jcallahan@87
 | 
  2389                     local current_line = _G["WDPDatamineTTTextLeft" .. line_index]
 | 
| 
jcallahan@87
 | 
  2390 
 | 
| 
jcallahan@87
 | 
  2391                     if not current_line then
 | 
| 
jcallahan@87
 | 
  2392                         break
 | 
| 
jcallahan@87
 | 
  2393                     end
 | 
| 
jcallahan@87
 | 
  2394                     local line_text = current_line:GetText()
 | 
| 
jcallahan@87
 | 
  2395                     local quest_name = line_text:match(ITEM_REQ_QUEST_MATCH1) or line_text:match(ITEM_REQ_QUEST_MATCH2)
 | 
| 
jcallahan@87
 | 
  2396 
 | 
| 
jcallahan@87
 | 
  2397                     if quest_name then
 | 
| 
jcallahan@87
 | 
  2398                         DBEntry("items", item_id).req_quest = ("%s"):format(quest_name:gsub("(.+): ", ""), quest_name)
 | 
| 
jcallahan@87
 | 
  2399                         break
 | 
| 
jcallahan@87
 | 
  2400                     end
 | 
| 
jcallahan@87
 | 
  2401                 end
 | 
| 
jcallahan@87
 | 
  2402 
 | 
| 
jcallahan@44
 | 
  2403                 if extended_cost then
 | 
| 
jcallahan@53
 | 
  2404                     local battleground_rating = 0
 | 
| 
jcallahan@53
 | 
  2405                     local personal_rating = 0
 | 
| 
jcallahan@53
 | 
  2406                     local required_season_amount
 | 
| 
jcallahan@5
 | 
  2407 
 | 
| 
jcallahan@68
 | 
  2408                     for line_index = 1, num_lines do
 | 
| 
jcallahan@44
 | 
  2409                         local current_line = _G["WDPDatamineTTTextLeft" .. line_index]
 | 
| 
jcallahan@5
 | 
  2410 
 | 
| 
jcallahan@44
 | 
  2411                         if not current_line then
 | 
| 
jcallahan@44
 | 
  2412                             break
 | 
| 
jcallahan@44
 | 
  2413                         end
 | 
| 
jcallahan@53
 | 
  2414                         required_season_amount = current_line:GetText():match("Requires earning a total of (%d+)\n(.-) for the season.")
 | 
| 
jcallahan@5
 | 
  2415 
 | 
| 
jcallahan@44
 | 
  2416                         for match_index = 1, #POINT_MATCH_PATTERNS do
 | 
| 
jcallahan@44
 | 
  2417                             local match1, match2 = current_line:GetText():match(POINT_MATCH_PATTERNS[match_index])
 | 
| 
jcallahan@53
 | 
  2418                             personal_rating = personal_rating + (match1 or 0)
 | 
| 
jcallahan@53
 | 
  2419                             battleground_rating = battleground_rating + (match2 or 0)
 | 
| 
jcallahan@5
 | 
  2420 
 | 
| 
jcallahan@44
 | 
  2421                             if match1 or match2 then
 | 
| 
jcallahan@44
 | 
  2422                                 break
 | 
| 
jcallahan@44
 | 
  2423                             end
 | 
| 
jcallahan@44
 | 
  2424                         end
 | 
| 
jcallahan@5
 | 
  2425                     end
 | 
| 
jcallahan@44
 | 
  2426                     local currency_list = {}
 | 
| 
jcallahan@44
 | 
  2427                     local item_count = _G.GetMerchantItemCostInfo(item_index)
 | 
| 
jcallahan@50
 | 
  2428 
 | 
| 
jcallahan@50
 | 
  2429                     -- Keeping this around in case Blizzard makes the two points diverge at some point.
 | 
| 
jcallahan@53
 | 
  2430                     --                    price_string = ("%s:%s:%s:%s"):format(price_string, battleground_rating, personal_rating, required_season_amount or 0)
 | 
| 
jcallahan@53
 | 
  2431                     price_string = ("%s:%s:%s"):format(price_string, personal_rating, required_season_amount or 0)
 | 
| 
jcallahan@5
 | 
  2432 
 | 
| 
jcallahan@44
 | 
  2433                     for cost_index = 1, item_count do
 | 
| 
jcallahan@324
 | 
  2434                         -- The third return (Blizz calls "currency_link") of GetMerchantItemCostItem only returns item links as of Patch 5.3.0.
 | 
| 
jcallahan@317
 | 
  2435                         local icon_texture, amount_required, item_link = _G.GetMerchantItemCostItem(item_index, cost_index)
 | 
| 
jcallahan@317
 | 
  2436                         local currency_identifier = item_link and ItemLinkToID(item_link) or nil
 | 
| 
jcallahan@317
 | 
  2437 
 | 
| 
jcallahan@317
 | 
  2438                         if (not currency_identifier or currency_identifier < 1) and icon_texture then
 | 
| 
jcallahan@317
 | 
  2439                             currency_identifier = icon_texture:match("[^\\]+$"):lower()
 | 
| 
jcallahan@317
 | 
  2440                         end
 | 
| 
jcallahan@317
 | 
  2441 
 | 
| 
jcallahan@317
 | 
  2442                         if currency_identifier then
 | 
| 
jcallahan@317
 | 
  2443                             currency_list[#currency_list + 1] = ("(%s:%s)"):format(amount_required, currency_identifier)
 | 
| 
jcallahan@44
 | 
  2444                         end
 | 
| 
jcallahan@44
 | 
  2445                     end
 | 
| 
jcallahan@44
 | 
  2446 
 | 
| 
jcallahan@44
 | 
  2447                     for currency_index = 1, #currency_list do
 | 
| 
jcallahan@44
 | 
  2448                         price_string = ("%s:%s"):format(price_string, currency_list[currency_index])
 | 
| 
jcallahan@5
 | 
  2449                     end
 | 
| 
jcallahan@5
 | 
  2450                 end
 | 
| 
jcallahan@133
 | 
  2451                 current_merchant.sells[item_id] = ("%s:%s:[%s]"):format(num_available, stack_size, price_string)
 | 
| 
jcallahan@44
 | 
  2452             end
 | 
| 
jcallahan@44
 | 
  2453         end
 | 
| 
jcallahan@5
 | 
  2454 
 | 
| 
jcallahan@44
 | 
  2455         if _G.CanMerchantRepair() then
 | 
| 
jcallahan@133
 | 
  2456             current_merchant.can_repair = true
 | 
| 
jcallahan@5
 | 
  2457         end
 | 
| 
jcallahan@57
 | 
  2458         _G.SetMerchantFilter(current_filters)
 | 
| 
jcallahan@57
 | 
  2459         _G.MerchantFrame_Update()
 | 
| 
jcallahan@4
 | 
  2460     end
 | 
| 
jcallahan@44
 | 
  2461 end -- do-block
 | 
| 
jcallahan@4
 | 
  2462 
 | 
| 
jcallahan@89
 | 
  2463 
 | 
| 
jcallahan@92
 | 
  2464 function WDP:PET_BAR_UPDATE(event_name)
 | 
| 
MMOSimca@336
 | 
  2465     if not private.NON_LOOT_SPELL_LABELS[current_action.spell_label] then
 | 
| 
jcallahan@25
 | 
  2466         return
 | 
| 
jcallahan@25
 | 
  2467     end
 | 
| 
jcallahan@34
 | 
  2468     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("pet"))
 | 
| 
jcallahan@25
 | 
  2469 
 | 
| 
jcallahan@171
 | 
  2470     if not unit_idnum or not UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@25
 | 
  2471         return
 | 
| 
jcallahan@25
 | 
  2472     end
 | 
| 
jcallahan@29
 | 
  2473     NPCEntry(unit_idnum).mind_control = true
 | 
| 
jcallahan@122
 | 
  2474     table.wipe(current_action)
 | 
| 
jcallahan@25
 | 
  2475 end
 | 
| 
jcallahan@25
 | 
  2476 
 | 
| 
jcallahan@25
 | 
  2477 
 | 
| 
MMOSimca@368
 | 
  2478 -- This function produces data currently unused by wowdb.com, and it causes unneeded bloat in the raw lua DB.
 | 
| 
MMOSimca@442
 | 
  2479 --[[local LPJ = LibStub("LibPetJournal-2.0")
 | 
| 
MMOSimca@442
 | 
  2480 function WDP:PET_JOURNAL_LIST_UPDATE(event_name)
 | 
| 
MMOSimca@346
 | 
  2481     if DEBUGGING then
 | 
| 
jcallahan@309
 | 
  2482         return
 | 
| 
jcallahan@309
 | 
  2483     end
 | 
| 
jcallahan@309
 | 
  2484 
 | 
| 
jcallahan@115
 | 
  2485     local num_pets = LPJ:NumPets()
 | 
| 
jcallahan@115
 | 
  2486 
 | 
| 
jcallahan@115
 | 
  2487     for index, pet_id in LPJ:IteratePetIDs() do
 | 
| 
jcallahan@115
 | 
  2488         local _, _, is_owned, _, level, _, _, name, icon, pet_type, npc_id, _, _, is_wild = _G.C_PetJournal.GetPetInfoByIndex(index)
 | 
| 
jcallahan@115
 | 
  2489 
 | 
| 
jcallahan@115
 | 
  2490         if is_owned then
 | 
| 
jcallahan@115
 | 
  2491             local health, max_health, attack, speed, rarity = _G.C_PetJournal.GetPetStats(pet_id)
 | 
| 
jcallahan@115
 | 
  2492 
 | 
| 
jcallahan@139
 | 
  2493             if rarity then
 | 
| 
jcallahan@139
 | 
  2494                 local rarity_name = _G["BATTLE_PET_BREED_QUALITY" .. rarity]
 | 
| 
jcallahan@139
 | 
  2495                 local npc = NPCEntry(npc_id)
 | 
| 
jcallahan@139
 | 
  2496                 npc.wild_pet = is_wild or nil
 | 
| 
jcallahan@139
 | 
  2497                 npc.battle_pet_data = npc.battle_pet_data or {}
 | 
| 
jcallahan@139
 | 
  2498                 npc.battle_pet_data[rarity_name] = npc.battle_pet_data[rarity_name] or {}
 | 
| 
jcallahan@139
 | 
  2499                 npc.battle_pet_data[rarity_name]["level_" .. level] = npc.battle_pet_data[rarity_name]["level_" .. level] or {}
 | 
| 
jcallahan@139
 | 
  2500 
 | 
| 
jcallahan@139
 | 
  2501                 local data = npc.battle_pet_data[rarity_name]["level_" .. level]
 | 
| 
jcallahan@139
 | 
  2502                 data.max_health = max_health
 | 
| 
jcallahan@139
 | 
  2503                 data.attack = attack
 | 
| 
jcallahan@139
 | 
  2504                 data.speed = speed
 | 
| 
jcallahan@139
 | 
  2505             end
 | 
| 
jcallahan@115
 | 
  2506         end
 | 
| 
jcallahan@115
 | 
  2507     end
 | 
| 
MMOSimca@368
 | 
  2508 end]]--
 | 
| 
jcallahan@115
 | 
  2509 
 | 
| 
jcallahan@115
 | 
  2510 
 | 
| 
jcallahan@156
 | 
  2511 function WDP:PLAYER_REGEN_DISABLED(event_name)
 | 
| 
jcallahan@156
 | 
  2512     private.in_combat = true
 | 
| 
jcallahan@156
 | 
  2513 end
 | 
| 
jcallahan@156
 | 
  2514 
 | 
| 
jcallahan@156
 | 
  2515 
 | 
| 
jcallahan@156
 | 
  2516 function WDP:PLAYER_REGEN_ENABLED(event_name)
 | 
| 
jcallahan@156
 | 
  2517     private.in_combat = nil
 | 
| 
jcallahan@156
 | 
  2518 
 | 
| 
jcallahan@156
 | 
  2519     if private.set_area_id then
 | 
| 
jcallahan@299
 | 
  2520         self:HandleZoneChange(event_name)
 | 
| 
jcallahan@156
 | 
  2521         private.set_area_id = nil
 | 
| 
jcallahan@156
 | 
  2522     end
 | 
| 
jcallahan@156
 | 
  2523 end
 | 
| 
jcallahan@156
 | 
  2524 
 | 
| 
jcallahan@156
 | 
  2525 
 | 
| 
jcallahan@118
 | 
  2526 function WDP:PLAYER_TARGET_CHANGED(event_name)
 | 
| 
jcallahan@215
 | 
  2527     if not TargetedNPC() then
 | 
| 
jcallahan@118
 | 
  2528         return
 | 
| 
jcallahan@2
 | 
  2529     end
 | 
| 
jcallahan@151
 | 
  2530     current_action.target_type = AF.NPC
 | 
| 
jcallahan@118
 | 
  2531     self:UpdateTargetLocation()
 | 
| 
jcallahan@118
 | 
  2532 end
 | 
| 
jcallahan@2
 | 
  2533 
 | 
| 
jcallahan@89
 | 
  2534 
 | 
| 
jcallahan@12
 | 
  2535 do
 | 
| 
jcallahan@12
 | 
  2536     local function UpdateQuestJuncture(point)
 | 
| 
jcallahan@12
 | 
  2537         local unit_name = _G.UnitName("questnpc")
 | 
| 
jcallahan@9
 | 
  2538 
 | 
| 
jcallahan@12
 | 
  2539         if not unit_name then
 | 
| 
jcallahan@12
 | 
  2540             return
 | 
| 
jcallahan@12
 | 
  2541         end
 | 
| 
jcallahan@34
 | 
  2542         local unit_type, unit_id = ParseGUID(_G.UnitGUID("questnpc"))
 | 
| 
MMOSimca@351
 | 
  2543         Debug("UpdateQuestJuncture: Updating quest juncture for %s.", ("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type], unit_id))
 | 
| 
jcallahan@12
 | 
  2544         if unit_type == private.UNIT_TYPES.OBJECT then
 | 
| 
jcallahan@38
 | 
  2545             UpdateDBEntryLocation("objects", unit_id)
 | 
| 
jcallahan@12
 | 
  2546         end
 | 
| 
jcallahan@19
 | 
  2547         local quest = DBEntry("quests", _G.GetQuestID())
 | 
| 
jcallahan@12
 | 
  2548         quest[point] = quest[point] or {}
 | 
| 
MMOSimca@329
 | 
  2549         quest[point][("%s:%d"):format(private.UNIT_TYPE_NAMES[unit_type], unit_id)] = true
 | 
| 
jcallahan@24
 | 
  2550 
 | 
| 
jcallahan@24
 | 
  2551         return quest
 | 
| 
jcallahan@12
 | 
  2552     end
 | 
| 
jcallahan@10
 | 
  2553 
 | 
| 
jcallahan@12
 | 
  2554 
 | 
| 
jcallahan@92
 | 
  2555     function WDP:QUEST_COMPLETE(event_name)
 | 
| 
jcallahan@97
 | 
  2556         local quest = UpdateQuestJuncture("end")
 | 
| 
MMOSimca@446
 | 
  2557         
 | 
| 
MMOSimca@446
 | 
  2558         if not quest then
 | 
| 
MMOSimca@446
 | 
  2559             return
 | 
| 
MMOSimca@446
 | 
  2560         end
 | 
| 
jcallahan@97
 | 
  2561 
 | 
| 
jcallahan@112
 | 
  2562         if ALLOWED_LOCALES[CLIENT_LOCALE] then
 | 
| 
jcallahan@112
 | 
  2563             quest.reward_text = ReplaceKeywords(_G.GetRewardText())
 | 
| 
jcallahan@112
 | 
  2564         end
 | 
| 
jcallahan@67
 | 
  2565         -- Make sure the quest NPC isn't erroneously recorded as giving reputation for quests which award it.
 | 
| 
jcallahan@177
 | 
  2566         ClearKilledNPC()
 | 
| 
jcallahan@10
 | 
  2567     end
 | 
| 
jcallahan@10
 | 
  2568 
 | 
| 
jcallahan@12
 | 
  2569 
 | 
| 
jcallahan@92
 | 
  2570     function WDP:QUEST_DETAIL(event_name)
 | 
| 
jcallahan@24
 | 
  2571         local quest = UpdateQuestJuncture("begin")
 | 
| 
jcallahan@24
 | 
  2572 
 | 
| 
jcallahan@46
 | 
  2573         if not quest then
 | 
| 
jcallahan@46
 | 
  2574             return
 | 
| 
jcallahan@46
 | 
  2575         end
 | 
| 
jcallahan@24
 | 
  2576         quest.classes = quest.classes or {}
 | 
| 
jcallahan@27
 | 
  2577         quest.classes[PLAYER_CLASS] = true
 | 
| 
jcallahan@24
 | 
  2578 
 | 
| 
jcallahan@24
 | 
  2579         quest.races = quest.races or {}
 | 
| 
jcallahan@100
 | 
  2580         quest.races[(PLAYER_RACE == "Pandaren") and ("%s_%s"):format(PLAYER_RACE, PLAYER_FACTION or "Neutral") or PLAYER_RACE] = true
 | 
| 
jcallahan@10
 | 
  2581     end
 | 
| 
jcallahan@12
 | 
  2582 end -- do-block
 | 
| 
jcallahan@9
 | 
  2583 
 | 
| 
jcallahan@9
 | 
  2584 
 | 
| 
jcallahan@92
 | 
  2585 function WDP:QUEST_LOG_UPDATE(event_name)
 | 
| 
jcallahan@38
 | 
  2586     local selected_quest = _G.GetQuestLogSelection() -- Save current selection to be restored when we're done.
 | 
| 
jcallahan@36
 | 
  2587     local entry_index, processed_quests = 1, 0
 | 
| 
jcallahan@36
 | 
  2588     local _, num_quests = _G.GetNumQuestLogEntries()
 | 
| 
jcallahan@36
 | 
  2589 
 | 
| 
jcallahan@36
 | 
  2590     while processed_quests <= num_quests do
 | 
| 
MMOSimca@329
 | 
  2591         local _, _, _, is_header, _, _, _, quest_id = _G.GetQuestLogTitle(entry_index)
 | 
| 
jcallahan@36
 | 
  2592 
 | 
| 
jcallahan@84
 | 
  2593         if quest_id == 0 then
 | 
| 
jcallahan@84
 | 
  2594             processed_quests = processed_quests + 1
 | 
| 
jcallahan@84
 | 
  2595         elseif not is_header then
 | 
| 
jcallahan@36
 | 
  2596             _G.SelectQuestLogEntry(entry_index);
 | 
| 
jcallahan@36
 | 
  2597 
 | 
| 
jcallahan@36
 | 
  2598             local quest = DBEntry("quests", quest_id)
 | 
| 
jcallahan@36
 | 
  2599             quest.timer = _G.GetQuestLogTimeLeft()
 | 
| 
jcallahan@37
 | 
  2600             quest.can_share = _G.GetQuestLogPushable() and true or nil
 | 
| 
jcallahan@36
 | 
  2601             processed_quests = processed_quests + 1
 | 
| 
jcallahan@36
 | 
  2602         end
 | 
| 
jcallahan@36
 | 
  2603         entry_index = entry_index + 1
 | 
| 
jcallahan@36
 | 
  2604     end
 | 
| 
jcallahan@36
 | 
  2605     _G.SelectQuestLogEntry(selected_quest)
 | 
| 
jcallahan@4
 | 
  2606     self:UnregisterEvent("QUEST_LOG_UPDATE")
 | 
| 
jcallahan@4
 | 
  2607 end
 | 
| 
jcallahan@4
 | 
  2608 
 | 
| 
jcallahan@4
 | 
  2609 
 | 
| 
jcallahan@97
 | 
  2610 function WDP:QUEST_PROGRESS(event_name)
 | 
| 
jcallahan@112
 | 
  2611     if not ALLOWED_LOCALES[CLIENT_LOCALE] then
 | 
| 
jcallahan@112
 | 
  2612         return
 | 
| 
jcallahan@112
 | 
  2613     end
 | 
| 
jcallahan@97
 | 
  2614     DBEntry("quests", _G.GetQuestID()).progress_text = ReplaceKeywords(_G.GetProgressText())
 | 
| 
jcallahan@97
 | 
  2615 end
 | 
| 
jcallahan@97
 | 
  2616 
 | 
| 
jcallahan@97
 | 
  2617 
 | 
| 
jcallahan@92
 | 
  2618 function WDP:UNIT_QUEST_LOG_CHANGED(event_name, unit_id)
 | 
| 
jcallahan@4
 | 
  2619     if unit_id ~= "player" then
 | 
| 
jcallahan@4
 | 
  2620         return
 | 
| 
jcallahan@4
 | 
  2621     end
 | 
| 
jcallahan@4
 | 
  2622     self:RegisterEvent("QUEST_LOG_UPDATE")
 | 
| 
jcallahan@4
 | 
  2623 end
 | 
| 
jcallahan@4
 | 
  2624 
 | 
| 
jcallahan@4
 | 
  2625 
 | 
| 
jcallahan@92
 | 
  2626 do
 | 
| 
jcallahan@92
 | 
  2627     local TRADESKILL_TOOLS = {
 | 
| 
jcallahan@92
 | 
  2628         Anvil = anvil_spell_ids,
 | 
| 
jcallahan@92
 | 
  2629         Forge = forge_spell_ids,
 | 
| 
jcallahan@92
 | 
  2630     }
 | 
| 
jcallahan@92
 | 
  2631 
 | 
| 
jcallahan@92
 | 
  2632 
 | 
| 
jcallahan@167
 | 
  2633     local function RegisterTools(tradeskill_name, tradeskill_index)
 | 
| 
MMOSimca@352
 | 
  2634         local link = _G.GetTradeSkillRecipeLink(tradeskill_index)
 | 
| 
MMOSimca@352
 | 
  2635         if link then
 | 
| 
MMOSimca@352
 | 
  2636             local spell_id = tonumber(link:match("^|c%x%x%x%x%x%x%x%x|H%w+:(%d+)"))
 | 
| 
MMOSimca@352
 | 
  2637             local required_tool = _G.GetTradeSkillTools(tradeskill_index)
 | 
| 
MMOSimca@352
 | 
  2638 
 | 
| 
MMOSimca@352
 | 
  2639             if required_tool then
 | 
| 
MMOSimca@352
 | 
  2640                 for tool_name, registry in pairs(TRADESKILL_TOOLS) do
 | 
| 
MMOSimca@352
 | 
  2641                     if required_tool:find(tool_name) then
 | 
| 
MMOSimca@352
 | 
  2642                         registry[spell_id] = true
 | 
| 
MMOSimca@352
 | 
  2643                     end
 | 
| 
jcallahan@167
 | 
  2644                 end
 | 
| 
jcallahan@167
 | 
  2645             end
 | 
| 
jcallahan@167
 | 
  2646         end
 | 
| 
jcallahan@167
 | 
  2647     end
 | 
| 
jcallahan@167
 | 
  2648 
 | 
| 
jcallahan@167
 | 
  2649 
 | 
| 
jcallahan@92
 | 
  2650     function WDP:TRADE_SKILL_SHOW(event_name)
 | 
| 
jcallahan@92
 | 
  2651         local profession_name, prof_level = _G.GetTradeSkillLine()
 | 
| 
jcallahan@92
 | 
  2652 
 | 
| 
jcallahan@92
 | 
  2653         if profession_name == _G.UNKNOWN then
 | 
| 
jcallahan@92
 | 
  2654             return
 | 
| 
jcallahan@92
 | 
  2655         end
 | 
| 
jcallahan@167
 | 
  2656         TradeSkillExecutePer(RegisterTools)
 | 
| 
jcallahan@92
 | 
  2657     end
 | 
| 
jcallahan@92
 | 
  2658 end -- do-block
 | 
| 
jcallahan@92
 | 
  2659 
 | 
| 
jcallahan@92
 | 
  2660 
 | 
| 
jcallahan@167
 | 
  2661 function WDP:TRAINER_CLOSED(event_name)
 | 
| 
jcallahan@167
 | 
  2662     private.trainer_shown = nil
 | 
| 
jcallahan@167
 | 
  2663 end
 | 
| 
jcallahan@167
 | 
  2664 
 | 
| 
jcallahan@167
 | 
  2665 
 | 
| 
jcallahan@92
 | 
  2666 function WDP:TRAINER_SHOW(event_name)
 | 
| 
jcallahan@232
 | 
  2667     local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc"))
 | 
| 
jcallahan@164
 | 
  2668     local trainer = NPCEntry(unit_idnum)
 | 
| 
jcallahan@58
 | 
  2669 
 | 
| 
jcallahan@164
 | 
  2670     if not trainer then
 | 
| 
jcallahan@58
 | 
  2671         return
 | 
| 
jcallahan@58
 | 
  2672     end
 | 
| 
jcallahan@331
 | 
  2673     local _, trainer_standing = UnitFactionStanding("npc")
 | 
| 
jcallahan@164
 | 
  2674     trainer.teaches = trainer.teaches or {}
 | 
| 
jcallahan@27
 | 
  2675 
 | 
| 
jcallahan@167
 | 
  2676     private.trainer_shown = true
 | 
| 
jcallahan@167
 | 
  2677 
 | 
| 
jcallahan@27
 | 
  2678     -- Get the initial trainer filters
 | 
| 
MMOSimca@344
 | 
  2679     local available = _G.GetTrainerServiceTypeFilter("available") and 1 or 0
 | 
| 
MMOSimca@344
 | 
  2680     local unavailable = _G.GetTrainerServiceTypeFilter("unavailable") and 1 or 0
 | 
| 
MMOSimca@344
 | 
  2681     local used = _G.GetTrainerServiceTypeFilter("used") and 1 or 0
 | 
| 
jcallahan@27
 | 
  2682 
 | 
| 
jcallahan@27
 | 
  2683     -- Clear the trainer filters
 | 
| 
MMOSimca@344
 | 
  2684     _G.SetTrainerServiceTypeFilter("available", 1)
 | 
| 
MMOSimca@344
 | 
  2685     _G.SetTrainerServiceTypeFilter("unavailable", 1)
 | 
| 
MMOSimca@344
 | 
  2686     _G.SetTrainerServiceTypeFilter("used", 1)
 | 
| 
jcallahan@27
 | 
  2687 
 | 
| 
jcallahan@27
 | 
  2688     for index = 1, _G.GetNumTrainerServices(), 1 do
 | 
| 
jcallahan@27
 | 
  2689         local spell_name, rank_name, _, _, required_level = _G.GetTrainerServiceInfo(index)
 | 
| 
jcallahan@27
 | 
  2690 
 | 
| 
jcallahan@27
 | 
  2691         if spell_name then
 | 
| 
jcallahan@27
 | 
  2692             DatamineTT:ClearLines()
 | 
| 
jcallahan@27
 | 
  2693             DatamineTT:SetTrainerService(index)
 | 
| 
jcallahan@27
 | 
  2694 
 | 
| 
jcallahan@27
 | 
  2695             local _, _, spell_id = DatamineTT:GetSpell()
 | 
| 
jcallahan@27
 | 
  2696 
 | 
| 
jcallahan@43
 | 
  2697             if spell_id then
 | 
| 
jcallahan@164
 | 
  2698                 local class_professions = trainer.teaches[PLAYER_CLASS]
 | 
| 
jcallahan@164
 | 
  2699 
 | 
| 
jcallahan@164
 | 
  2700                 if not class_professions then
 | 
| 
jcallahan@164
 | 
  2701                     trainer.teaches[PLAYER_CLASS] = {}
 | 
| 
jcallahan@164
 | 
  2702                     class_professions = trainer.teaches[PLAYER_CLASS]
 | 
| 
jcallahan@164
 | 
  2703                 end
 | 
| 
jcallahan@43
 | 
  2704                 local profession, min_skill = _G.GetTrainerServiceSkillReq(index)
 | 
| 
jcallahan@43
 | 
  2705                 profession = profession or "General"
 | 
| 
jcallahan@43
 | 
  2706 
 | 
| 
jcallahan@164
 | 
  2707                 local profession_skills = class_professions[profession]
 | 
| 
jcallahan@43
 | 
  2708 
 | 
| 
jcallahan@43
 | 
  2709                 if not profession_skills then
 | 
| 
jcallahan@43
 | 
  2710                     class_professions[profession] = {}
 | 
| 
jcallahan@43
 | 
  2711                     profession_skills = class_professions[profession]
 | 
| 
jcallahan@43
 | 
  2712                 end
 | 
| 
jcallahan@173
 | 
  2713                 profession_skills[spell_id] = ("%d:%d:%d"):format(required_level, min_skill, _G.GetTrainerServiceCost(index))
 | 
| 
jcallahan@27
 | 
  2714             end
 | 
| 
jcallahan@27
 | 
  2715         end
 | 
| 
jcallahan@27
 | 
  2716     end
 | 
| 
jcallahan@27
 | 
  2717     -- Reset the filters to what they were before
 | 
| 
MMOSimca@344
 | 
  2718     _G.SetTrainerServiceTypeFilter("available", available or 0)
 | 
| 
MMOSimca@344
 | 
  2719     _G.SetTrainerServiceTypeFilter("unavailable", unavailable or 0)
 | 
| 
MMOSimca@344
 | 
  2720     _G.SetTrainerServiceTypeFilter("used", used or 0)
 | 
| 
jcallahan@27
 | 
  2721 end
 | 
| 
jcallahan@27
 | 
  2722 
 | 
| 
jcallahan@27
 | 
  2723 
 | 
| 
jcallahan@1
 | 
  2724 function WDP:UNIT_SPELLCAST_SENT(event_name, unit_id, spell_name, spell_rank, target_name, spell_line)
 | 
| 
jcallahan@1
 | 
  2725     if private.tracked_line or unit_id ~= "player" then
 | 
| 
jcallahan@1
 | 
  2726         return
 | 
| 
jcallahan@1
 | 
  2727     end
 | 
| 
jcallahan@1
 | 
  2728     local spell_label = private.SPELL_LABELS_BY_NAME[spell_name]
 | 
| 
jcallahan@1
 | 
  2729 
 | 
| 
jcallahan@1
 | 
  2730     if not spell_label then
 | 
| 
jcallahan@1
 | 
  2731         return
 | 
| 
jcallahan@1
 | 
  2732     end
 | 
| 
jcallahan@306
 | 
  2733 
 | 
| 
MMOSimca@343
 | 
  2734     Debug("UNIT_SPELLCAST_SENT: %s was cast.", spell_name)
 | 
| 
jcallahan@150
 | 
  2735     local item_name, item_link = _G.GameTooltip:GetItem()
 | 
| 
jcallahan@150
 | 
  2736     local unit_name, unit_id = _G.GameTooltip:GetUnit()
 | 
| 
jcallahan@1
 | 
  2737 
 | 
| 
jcallahan@150
 | 
  2738     if not unit_name and _G.UnitName("target") == target_name then
 | 
| 
jcallahan@150
 | 
  2739         unit_name = target_name
 | 
| 
jcallahan@150
 | 
  2740         unit_id = "target"
 | 
| 
jcallahan@1
 | 
  2741     end
 | 
| 
jcallahan@1
 | 
  2742     local spell_flags = private.SPELL_FLAGS_BY_LABEL[spell_label]
 | 
| 
jcallahan@28
 | 
  2743     local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData()
 | 
| 
MMOSimca@328
 | 
  2744     if not (zone_name and area_id and x and y and map_level) then
 | 
| 
MMOSimca@328
 | 
  2745         Debug("%s: Missing current location data - %s, %d, %d, %d, %d.", event_name, zone_name, area_id, x, y, map_level)
 | 
| 
MMOSimca@328
 | 
  2746         return
 | 
| 
MMOSimca@328
 | 
  2747     end
 | 
| 
jcallahan@28
 | 
  2748 
 | 
| 
jcallahan@205
 | 
  2749     table.wipe(current_action)
 | 
| 
jcallahan@122
 | 
  2750     current_action.instance_token = instance_token
 | 
| 
jcallahan@122
 | 
  2751     current_action.map_level = map_level
 | 
| 
jcallahan@122
 | 
  2752     current_action.x = x
 | 
| 
jcallahan@122
 | 
  2753     current_action.y = y
 | 
| 
jcallahan@122
 | 
  2754     current_action.zone_data = ("%s:%d"):format(zone_name, area_id)
 | 
| 
jcallahan@122
 | 
  2755     current_action.spell_label = spell_label
 | 
| 
jcallahan@105
 | 
  2756 
 | 
| 
jcallahan@105
 | 
  2757     if not private.NON_LOOT_SPELL_LABELS[spell_label] then
 | 
| 
jcallahan@122
 | 
  2758         current_action.loot_label = spell_label:lower()
 | 
| 
jcallahan@105
 | 
  2759     end
 | 
| 
jcallahan@1
 | 
  2760 
 | 
| 
jcallahan@151
 | 
  2761     if unit_name and unit_name == target_name and not item_name then
 | 
| 
jcallahan@16
 | 
  2762         if bit.band(spell_flags, AF.NPC) == AF.NPC then
 | 
| 
jcallahan@150
 | 
  2763             if not unit_id or unit_name ~= target_name then
 | 
| 
jcallahan@16
 | 
  2764                 return
 | 
| 
jcallahan@16
 | 
  2765             end
 | 
| 
jcallahan@123
 | 
  2766             current_action.target_type = AF.NPC
 | 
| 
jcallahan@16
 | 
  2767         end
 | 
| 
jcallahan@16
 | 
  2768     elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then
 | 
| 
jcallahan@123
 | 
  2769         current_action.target_type = AF.ITEM
 | 
| 
jcallahan@16
 | 
  2770 
 | 
| 
jcallahan@150
 | 
  2771         if item_name and item_name == target_name then
 | 
| 
jcallahan@150
 | 
  2772             current_action.identifier = ItemLinkToID(item_link)
 | 
| 
jcallahan@16
 | 
  2773         elseif target_name and target_name ~= "" then
 | 
| 
jcallahan@331
 | 
  2774             local _, item_link = _G.GetItemInfo(target_name)
 | 
| 
jcallahan@331
 | 
  2775             current_action.identifier = ItemLinkToID(item_link)
 | 
| 
jcallahan@16
 | 
  2776         end
 | 
| 
jcallahan@150
 | 
  2777     elseif not item_name and not unit_name then
 | 
| 
jcallahan@1
 | 
  2778         if bit.band(spell_flags, AF.OBJECT) == AF.OBJECT then
 | 
| 
jcallahan@17
 | 
  2779             if target_name == "" then
 | 
| 
jcallahan@17
 | 
  2780                 return
 | 
| 
jcallahan@17
 | 
  2781             end
 | 
| 
jcallahan@122
 | 
  2782             current_action.object_name = target_name
 | 
| 
jcallahan@123
 | 
  2783             current_action.target_type = AF.OBJECT
 | 
| 
jcallahan@1
 | 
  2784         elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then
 | 
| 
jcallahan@123
 | 
  2785             current_action.target_type = AF.ZONE
 | 
| 
jcallahan@1
 | 
  2786         end
 | 
| 
jcallahan@1
 | 
  2787     end
 | 
| 
jcallahan@1
 | 
  2788     private.tracked_line = spell_line
 | 
| 
jcallahan@0
 | 
  2789 end
 | 
| 
jcallahan@0
 | 
  2790 
 | 
| 
jcallahan@94
 | 
  2791 
 | 
| 
MMOSimca@393
 | 
  2792 -- Triggered by bonus roll prompts, disenchant prompts, and in a few other rare circumstances
 | 
| 
jcallahan@312
 | 
  2793 function WDP:SPELL_CONFIRMATION_PROMPT(event_name, spell_id, confirm_type, text, duration, currency_id_cost)
 | 
| 
jcallahan@306
 | 
  2794     if private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then
 | 
| 
jcallahan@306
 | 
  2795         ClearKilledBossID()
 | 
| 
jcallahan@306
 | 
  2796         ClearLootToastContainerID()
 | 
| 
MMOSimca@387
 | 
  2797         raid_boss_id = private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id]
 | 
| 
jcallahan@306
 | 
  2798     else
 | 
| 
MMOSimca@336
 | 
  2799         Debug("%s: Spell ID %d is not a known raid boss 'Bonus' spell.", event_name, spell_id)
 | 
| 
jcallahan@306
 | 
  2800         return
 | 
| 
jcallahan@1
 | 
  2801     end
 | 
| 
jcallahan@306
 | 
  2802 
 | 
| 
jcallahan@324
 | 
  2803     -- Assign existing loot data to boss if it exists
 | 
| 
jcallahan@307
 | 
  2804     if loot_toast_data then
 | 
| 
MMOSimca@427
 | 
  2805         local npc = NPCEntry(raid_boss_id)
 | 
| 
MMOSimca@427
 | 
  2806         if npc then
 | 
| 
MMOSimca@427
 | 
  2807             -- Create needed npc fields if required
 | 
| 
MMOSimca@427
 | 
  2808             local loot_label = "drops"
 | 
| 
MMOSimca@427
 | 
  2809             local encounter_data = npc:EncounterData(InstanceDifficultyToken())
 | 
| 
MMOSimca@427
 | 
  2810             encounter_data[loot_label] = encounter_data[loot_label] or {}
 | 
| 
MMOSimca@427
 | 
  2811             encounter_data.loot_counts = encounter_data.loot_counts or {}
 | 
| 
MMOSimca@427
 | 
  2812 
 | 
| 
MMOSimca@427
 | 
  2813             for index = 1, #loot_toast_data do
 | 
| 
MMOSimca@427
 | 
  2814                 local data = loot_toast_data[index]
 | 
| 
MMOSimca@427
 | 
  2815                 local loot_type = data[1]
 | 
| 
MMOSimca@427
 | 
  2816                 local hyperlink = data[2]
 | 
| 
MMOSimca@427
 | 
  2817                 local quantity = data[3]
 | 
| 
MMOSimca@427
 | 
  2818 
 | 
| 
MMOSimca@427
 | 
  2819                 if loot_type == "item" then
 | 
| 
MMOSimca@427
 | 
  2820                     local item_id = ItemLinkToID(hyperlink)
 | 
| 
MMOSimca@427
 | 
  2821                     Debug("%s: Assigned stored item loot data - %s - %d:%d", event_name, hyperlink, item_id, quantity)
 | 
| 
MMOSimca@427
 | 
  2822                     table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity))
 | 
| 
MMOSimca@427
 | 
  2823                 elseif loot_type == "money" then
 | 
| 
MMOSimca@427
 | 
  2824                     Debug("%s: Assigned stored money loot data - money:%d", event_name, quantity)
 | 
| 
MMOSimca@427
 | 
  2825                     table.insert(encounter_data[loot_label], ("money:%d"):format(quantity))
 | 
| 
MMOSimca@427
 | 
  2826                 elseif loot_type == "currency" then
 | 
| 
MMOSimca@427
 | 
  2827                     local currency_texture = CurrencyLinkToTexture(hyperlink)
 | 
| 
MMOSimca@427
 | 
  2828                     Debug("%s: Assigned stored currency loot data - %s - currency:%d:%s", event_name, hyperlink, currency_texture, quantity)
 | 
| 
MMOSimca@427
 | 
  2829                     table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture))
 | 
| 
MMOSimca@427
 | 
  2830                 end
 | 
| 
jcallahan@317
 | 
  2831             end
 | 
| 
jcallahan@317
 | 
  2832 
 | 
| 
MMOSimca@427
 | 
  2833             if not boss_loot_toasting[raid_boss_id] then
 | 
| 
MMOSimca@427
 | 
  2834                 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1
 | 
| 
MMOSimca@427
 | 
  2835                 boss_loot_toasting[raid_boss_id] = true -- Do not count further loots until timer expires or another boss is killed
 | 
| 
jcallahan@307
 | 
  2836             end
 | 
| 
MMOSimca@427
 | 
  2837         else
 | 
| 
MMOSimca@427
 | 
  2838             Debug("%s: NPC is nil, but we have stored loot data...", event_name)
 | 
| 
jcallahan@307
 | 
  2839         end
 | 
| 
jcallahan@307
 | 
  2840     end
 | 
| 
jcallahan@307
 | 
  2841 
 | 
| 
jcallahan@307
 | 
  2842     ClearLootToastData()
 | 
| 
MMOSimca@427
 | 
  2843     killed_boss_id_timer_handle = C_Timer.NewTimer(5, ClearKilledBossID)
 | 
| 
jcallahan@306
 | 
  2844 end
 | 
| 
jcallahan@306
 | 
  2845 
 | 
| 
jcallahan@306
 | 
  2846 
 | 
| 
jcallahan@306
 | 
  2847 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)
 | 
| 
jcallahan@306
 | 
  2848     if unit_id ~= "player" then
 | 
| 
jcallahan@306
 | 
  2849         return
 | 
| 
jcallahan@306
 | 
  2850     end
 | 
| 
jcallahan@306
 | 
  2851     private.tracked_line = nil
 | 
| 
jcallahan@306
 | 
  2852     private.previous_spell_id = spell_id
 | 
| 
jcallahan@306
 | 
  2853 
 | 
| 
MMOSimca@393
 | 
  2854     -- For spells cast when Logging
 | 
| 
MMOSimca@345
 | 
  2855     if private.LOGGING_SPELL_ID_TO_OBJECT_ID_MAP[spell_id] then
 | 
| 
MMOSimca@345
 | 
  2856         last_timber_spell_id = spell_id
 | 
| 
MMOSimca@351
 | 
  2857         UpdateDBEntryLocation("objects", ("OPENING:%s"):format(private.LOGGING_SPELL_ID_TO_OBJECT_ID_MAP[spell_id]))
 | 
| 
MMOSimca@345
 | 
  2858         return
 | 
| 
MMOSimca@345
 | 
  2859     end
 | 
| 
MMOSimca@345
 | 
  2860 
 | 
| 
MMOSimca@393
 | 
  2861     -- For spells cast by items that always trigger loot toasts
 | 
| 
MMOSimca@381
 | 
  2862     if private.LOOT_TOAST_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then
 | 
| 
jcallahan@306
 | 
  2863         ClearKilledBossID()
 | 
| 
jcallahan@306
 | 
  2864         ClearLootToastContainerID()
 | 
| 
jcallahan@307
 | 
  2865         ClearLootToastData()
 | 
| 
jcallahan@306
 | 
  2866 
 | 
| 
MMOSimca@387
 | 
  2867         loot_toast_container_id = private.LOOT_TOAST_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id]
 | 
| 
MMOSimca@383
 | 
  2868         loot_toast_container_timer_handle = C_Timer.NewTimer(1, ClearLootToastContainerID) -- we need to assign a handle here to cancel it later
 | 
| 
MMOSimca@345
 | 
  2869         return
 | 
| 
jcallahan@306
 | 
  2870     end
 | 
| 
jcallahan@306
 | 
  2871 
 | 
| 
MMOSimca@393
 | 
  2872     -- For spells cast by items that don't usually trigger loot toasts
 | 
| 
MMOSimca@454
 | 
  2873     if not block_chat_loot_data and (private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id] or (private.CLASS_BASED_DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_BY_CLASS_ID_MAP[spell_id] and private.CLASS_BASED_DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_BY_CLASS_ID_MAP[spell_id][PLAYER_CLASS_ID])) then
 | 
| 
MMOSimca@347
 | 
  2874         -- Set up timer
 | 
| 
MMOSimca@393
 | 
  2875         ClearChatLootData()
 | 
| 
MMOSimca@393
 | 
  2876         Debug("%s: Beginning chat-based loot timer for spellID %d", event_name, spell_id)
 | 
| 
MMOSimca@411
 | 
  2877         chat_loot_timer_handle = C_Timer.NewTimer(1.5, ClearChatLootData)
 | 
| 
MMOSimca@454
 | 
  2878         if (private.CLASS_BASED_DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_BY_CLASS_ID_MAP[spell_id] and private.CLASS_BASED_DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_BY_CLASS_ID_MAP[spell_id][PLAYER_CLASS_ID]) then
 | 
| 
MMOSimca@454
 | 
  2879             chat_loot_data.identifier = private.CLASS_BASED_DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_BY_CLASS_ID_MAP[spell_id][PLAYER_CLASS_ID]
 | 
| 
MMOSimca@454
 | 
  2880         else
 | 
| 
MMOSimca@454
 | 
  2881             chat_loot_data.identifier = private.DELAYED_CONTAINER_SPELL_ID_TO_ITEM_ID_MAP[spell_id]
 | 
| 
MMOSimca@454
 | 
  2882         end
 | 
| 
MMOSimca@347
 | 
  2883         return
 | 
| 
MMOSimca@347
 | 
  2884     end
 | 
| 
MMOSimca@347
 | 
  2885 
 | 
| 
jcallahan@306
 | 
  2886     if anvil_spell_ids[spell_id] then
 | 
| 
jcallahan@306
 | 
  2887         UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL)
 | 
| 
jcallahan@306
 | 
  2888     elseif forge_spell_ids[spell_id] then
 | 
| 
jcallahan@306
 | 
  2889         UpdateDBEntryLocation("objects", OBJECT_ID_FORGE)
 | 
| 
jcallahan@306
 | 
  2890     elseif spell_name:match("^Harvest.+") then
 | 
| 
jcallahan@306
 | 
  2891         killed_npc_id = current_target_id
 | 
| 
MMOSimca@343
 | 
  2892         private.harvesting = true -- Used to track which NPCs can be harvested (can we get this from CreatureCache instead?)
 | 
| 
jcallahan@306
 | 
  2893     end
 | 
| 
jcallahan@306
 | 
  2894 end
 | 
| 
jcallahan@0
 | 
  2895 
 | 
| 
jcallahan@90
 | 
  2896 
 | 
| 
jcallahan@1
 | 
  2897 function WDP:HandleSpellFailure(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id)
 | 
| 
jcallahan@1
 | 
  2898     if unit_id ~= "player" then
 | 
| 
jcallahan@1
 | 
  2899         return
 | 
| 
jcallahan@1
 | 
  2900     end
 | 
| 
jcallahan@0
 | 
  2901 
 | 
| 
jcallahan@1
 | 
  2902     if private.tracked_line == spell_line then
 | 
| 
jcallahan@1
 | 
  2903         private.tracked_line = nil
 | 
| 
jcallahan@1
 | 
  2904     end
 | 
| 
jcallahan@147
 | 
  2905     table.wipe(current_action)
 | 
| 
jcallahan@0
 | 
  2906 end
 | 
| 
jcallahan@90
 | 
  2907 
 | 
| 
jcallahan@90
 | 
  2908 
 | 
| 
jcallahan@90
 | 
  2909 do
 | 
| 
jcallahan@90
 | 
  2910     local function SetUnitField(field, required_type)
 | 
| 
jcallahan@90
 | 
  2911         local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc"))
 | 
| 
jcallahan@90
 | 
  2912 
 | 
| 
jcallahan@90
 | 
  2913         if not unit_idnum or (required_type and unit_type ~= required_type) then
 | 
| 
jcallahan@90
 | 
  2914             return
 | 
| 
jcallahan@90
 | 
  2915         end
 | 
| 
jcallahan@90
 | 
  2916 
 | 
| 
jcallahan@171
 | 
  2917         if UnitTypeIsNPC(unit_type) then
 | 
| 
jcallahan@90
 | 
  2918             NPCEntry(unit_idnum)[field] = true
 | 
| 
jcallahan@90
 | 
  2919         elseif unit_type == private.UNIT_TYPES.OBJECT then
 | 
| 
jcallahan@90
 | 
  2920             DBEntry("objects", unit_idnum)[field] = true
 | 
| 
jcallahan@93
 | 
  2921             UpdateDBEntryLocation("objects", unit_idnum)
 | 
| 
jcallahan@90
 | 
  2922         end
 | 
| 
jcallahan@90
 | 
  2923     end
 | 
| 
jcallahan@90
 | 
  2924 
 | 
| 
jcallahan@90
 | 
  2925 
 | 
| 
jcallahan@90
 | 
  2926     function WDP:AUCTION_HOUSE_SHOW(event_name)
 | 
| 
MMOSimca@436
 | 
  2927         WDP:StopChatLootRecording(event_name)
 | 
| 
jcallahan@90
 | 
  2928         SetUnitField("auctioneer", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  2929     end
 | 
| 
jcallahan@90
 | 
  2930 
 | 
| 
jcallahan@90
 | 
  2931 
 | 
| 
jcallahan@90
 | 
  2932     function WDP:BANKFRAME_OPENED(event_name)
 | 
| 
MMOSimca@436
 | 
  2933         WDP:StopChatLootRecording(event_name)
 | 
| 
jcallahan@90
 | 
  2934         SetUnitField("banker", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  2935     end
 | 
| 
jcallahan@90
 | 
  2936 
 | 
| 
jcallahan@90
 | 
  2937 
 | 
| 
jcallahan@90
 | 
  2938     function WDP:BATTLEFIELDS_SHOW(event_name)
 | 
| 
jcallahan@90
 | 
  2939         SetUnitField("battlemaster", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  2940     end
 | 
| 
jcallahan@90
 | 
  2941 
 | 
| 
jcallahan@90
 | 
  2942 
 | 
| 
jcallahan@92
 | 
  2943     function WDP:FORGE_MASTER_OPENED(event_name)
 | 
| 
jcallahan@90
 | 
  2944         SetUnitField("arcane_reforger", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  2945     end
 | 
| 
jcallahan@90
 | 
  2946 
 | 
| 
jcallahan@90
 | 
  2947 
 | 
| 
jcallahan@323
 | 
  2948     local GOSSIP_SHOW_FUNCS = {
 | 
| 
jcallahan@323
 | 
  2949         [private.UNIT_TYPES.NPC] = function(unit_idnum)
 | 
| 
jcallahan@323
 | 
  2950             local gossip_options = { _G.GetGossipOptions() }
 | 
| 
jcallahan@323
 | 
  2951 
 | 
| 
jcallahan@323
 | 
  2952             for index = 2, #gossip_options, 2 do
 | 
| 
jcallahan@323
 | 
  2953                 if gossip_options[index] == "binder" then
 | 
| 
jcallahan@323
 | 
  2954                     SetUnitField("innkeeper", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@323
 | 
  2955                     return
 | 
| 
jcallahan@323
 | 
  2956                 end
 | 
| 
jcallahan@323
 | 
  2957             end
 | 
| 
jcallahan@323
 | 
  2958         end,
 | 
| 
jcallahan@323
 | 
  2959         [private.UNIT_TYPES.OBJECT] = function(unit_idnum)
 | 
| 
jcallahan@323
 | 
  2960             UpdateDBEntryLocation("objects", unit_idnum)
 | 
| 
jcallahan@323
 | 
  2961         end,
 | 
| 
jcallahan@323
 | 
  2962     }
 | 
| 
jcallahan@323
 | 
  2963 
 | 
| 
jcallahan@323
 | 
  2964 
 | 
| 
jcallahan@92
 | 
  2965     function WDP:GOSSIP_SHOW(event_name)
 | 
| 
MMOSimca@436
 | 
  2966         WDP:StopChatLootRecording(event_name)
 | 
| 
jcallahan@323
 | 
  2967         local unit_type, unit_idnum = ParseGUID(_G.UnitGUID("npc"))
 | 
| 
jcallahan@323
 | 
  2968         if not unit_idnum then
 | 
| 
jcallahan@323
 | 
  2969             return
 | 
| 
jcallahan@323
 | 
  2970         end
 | 
| 
jcallahan@323
 | 
  2971 
 | 
| 
jcallahan@323
 | 
  2972         if GOSSIP_SHOW_FUNCS[unit_type] then
 | 
| 
jcallahan@323
 | 
  2973             GOSSIP_SHOW_FUNCS[unit_type](unit_idnum)
 | 
| 
jcallahan@90
 | 
  2974         end
 | 
| 
jcallahan@90
 | 
  2975     end
 | 
| 
jcallahan@90
 | 
  2976 
 | 
| 
jcallahan@90
 | 
  2977 
 | 
| 
jcallahan@93
 | 
  2978     function WDP:GUILDBANKFRAME_OPENED(event_name)
 | 
| 
MMOSimca@436
 | 
  2979         WDP:StopChatLootRecording(event_name)
 | 
| 
jcallahan@93
 | 
  2980         SetUnitField("guild_bank", private.UNIT_TYPES.OBJECT)
 | 
| 
jcallahan@93
 | 
  2981     end
 | 
| 
jcallahan@93
 | 
  2982 
 | 
| 
jcallahan@93
 | 
  2983 
 | 
| 
jcallahan@189
 | 
  2984     function WDP:ITEM_UPGRADE_MASTER_OPENED(event_name)
 | 
| 
jcallahan@189
 | 
  2985         SetUnitField("item_upgrade_master", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@189
 | 
  2986     end
 | 
| 
jcallahan@189
 | 
  2987 
 | 
| 
jcallahan@189
 | 
  2988 
 | 
| 
jcallahan@90
 | 
  2989     function WDP:TAXIMAP_OPENED(event_name)
 | 
| 
jcallahan@90
 | 
  2990         SetUnitField("flight_master", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  2991     end
 | 
| 
jcallahan@90
 | 
  2992 
 | 
| 
jcallahan@90
 | 
  2993 
 | 
| 
jcallahan@90
 | 
  2994     function WDP:TRANSMOGRIFY_OPEN(event_name)
 | 
| 
jcallahan@90
 | 
  2995         SetUnitField("transmogrifier", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  2996     end
 | 
| 
jcallahan@90
 | 
  2997 
 | 
| 
jcallahan@90
 | 
  2998 
 | 
| 
jcallahan@90
 | 
  2999     function WDP:VOID_STORAGE_OPEN(event_name)
 | 
| 
jcallahan@90
 | 
  3000         SetUnitField("void_storage", private.UNIT_TYPES.NPC)
 | 
| 
jcallahan@90
 | 
  3001     end
 | 
| 
jcallahan@90
 | 
  3002 end -- do-block
 |