Mercurial > wow > wowdb-profiler
comparison Main.lua @ 306:7feb687b1b22
Fixes
| author | James D. Callahan III <jcallahan@curse.com> |
|---|---|
| date | Tue, 23 Jul 2013 18:07:07 -0500 |
| parents | 4986ef8a338a |
| children | c33ab3413737 |
comparison
equal
deleted
inserted
replaced
| 305:4986ef8a338a | 306:7feb687b1b22 |
|---|---|
| 8 local bit = _G.bit | 8 local bit = _G.bit |
| 9 local math = _G.math | 9 local math = _G.math |
| 10 local table = _G.table | 10 local table = _G.table |
| 11 | 11 |
| 12 local select = _G.select | 12 local select = _G.select |
| 13 local unpack = _G.unpack | |
| 13 | 14 |
| 14 | 15 |
| 15 -- ADDON NAMESPACE ---------------------------------------------------- | 16 -- ADDON NAMESPACE ---------------------------------------------------- |
| 16 | 17 |
| 17 local ADDON_NAME, private = ... | 18 local ADDON_NAME, private = ... |
| 97 QUEST_COMPLETE = true, | 98 QUEST_COMPLETE = true, |
| 98 QUEST_DETAIL = true, | 99 QUEST_DETAIL = true, |
| 99 QUEST_LOG_UPDATE = true, | 100 QUEST_LOG_UPDATE = true, |
| 100 QUEST_PROGRESS = true, | 101 QUEST_PROGRESS = true, |
| 101 SHOW_LOOT_TOAST = true, | 102 SHOW_LOOT_TOAST = true, |
| 103 SPELL_CONFIRMATION_PROMPT = true, | |
| 102 TAXIMAP_OPENED = true, | 104 TAXIMAP_OPENED = true, |
| 103 TRADE_SKILL_SHOW = true, | 105 TRADE_SKILL_SHOW = true, |
| 104 TRAINER_CLOSED = true, | 106 TRAINER_CLOSED = true, |
| 105 TRAINER_SHOW = true, | 107 TRAINER_SHOW = true, |
| 106 TRANSMOGRIFY_OPEN = true, | 108 TRANSMOGRIFY_OPEN = true, |
| 130 local in_instance | 132 local in_instance |
| 131 local item_process_timer_handle | 133 local item_process_timer_handle |
| 132 local faction_standings = {} | 134 local faction_standings = {} |
| 133 local forge_spell_ids = {} | 135 local forge_spell_ids = {} |
| 134 local languages_known = {} | 136 local languages_known = {} |
| 137 local loot_toast_container_timer_handle | |
| 135 local name_to_id_map = {} | 138 local name_to_id_map = {} |
| 139 local killed_boss_id_timer_handle | |
| 136 local killed_npc_id | 140 local killed_npc_id |
| 137 local target_location_timer_handle | 141 local target_location_timer_handle |
| 138 local current_target_id | 142 local current_target_id |
| 139 local current_area_id | 143 local current_area_id |
| 140 local current_loot | 144 local current_loot |
| 155 | 159 |
| 156 | 160 |
| 157 -- HELPERS ------------------------------------------------------------ | 161 -- HELPERS ------------------------------------------------------------ |
| 158 | 162 |
| 159 local function Debug(message, ...) | 163 local function Debug(message, ...) |
| 160 if not DEBUGGING then | 164 if not DEBUGGING or not message or not ... then |
| 161 return | 165 return |
| 162 end | 166 end |
| 163 _G.print(message:format(...)) | 167 local args = { ... } |
| 168 | |
| 169 for index = 1, #args do | |
| 170 if args[index] == nil then | |
| 171 args[index] = "nil" | |
| 172 end | |
| 173 end | |
| 174 _G.print(message:format(unpack(args))) | |
| 164 end | 175 end |
| 165 | 176 |
| 166 | 177 |
| 167 local TradeSkillExecutePer | 178 local TradeSkillExecutePer |
| 168 do | 179 do |
| 169 local header_list = {} | 180 local header_list = {} |
| 170 | 181 |
| 171 -- iter_func returns true to indicate that the loop should be broken | |
| 172 function TradeSkillExecutePer(iter_func) | 182 function TradeSkillExecutePer(iter_func) |
| 173 if not _G.TradeSkillFrame or not _G.TradeSkillFrame:IsVisible() then | 183 if not _G.TradeSkillFrame or not _G.TradeSkillFrame:IsVisible() then |
| 174 return | 184 return |
| 175 end | 185 end |
| 176 -- Clear the search box focus so the scan will have correct results. | 186 -- Clear the search box focus so the scan will have correct results. |
| 276 killed_npc_id = nil | 286 killed_npc_id = nil |
| 277 end | 287 end |
| 278 | 288 |
| 279 | 289 |
| 280 local function ClearKilledBossID() | 290 local function ClearKilledBossID() |
| 291 if killed_boss_id_timer_handle then | |
| 292 WDP:CancelTimer(killed_boss_id_timer_handle) | |
| 293 end | |
| 294 private.boss_loot_toasting = false | |
| 281 private.raid_finder_boss_id = nil | 295 private.raid_finder_boss_id = nil |
| 282 private.world_boss_id = nil | 296 private.world_boss_id = nil |
| 297 killed_boss_id_timer_handle = nil | |
| 298 end | |
| 299 | |
| 300 | |
| 301 local function ClearLootToastContainerID() | |
| 302 if loot_toast_container_timer_handle then | |
| 303 WDP:CancelTimer(loot_toast_container_timer_handle) | |
| 304 end | |
| 305 private.container_loot_toasting = false | |
| 306 private.loot_toast_container_id = nil | |
| 307 loot_toast_container_timer_handle = nil | |
| 283 end | 308 end |
| 284 | 309 |
| 285 | 310 |
| 286 local function InstanceDifficultyToken() | 311 local function InstanceDifficultyToken() |
| 287 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() | 312 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() |
| 513 local current_line = _G["WDPDatamineTTTextLeft" .. line_index] | 538 local current_line = _G["WDPDatamineTTTextLeft" .. line_index] |
| 514 | 539 |
| 515 if not current_line then | 540 if not current_line then |
| 516 break | 541 break |
| 517 end | 542 end |
| 518 local is_ptr = select(4, _G.GetBuildInfo()) ~= 50100 | 543 |
| 519 | 544 if current_line:GetText() == _G.ITEM_OPENABLE then |
| 520 if is_ptr or current_line:GetText() == _G.ITEM_OPENABLE then | |
| 521 table.wipe(current_action) | 545 table.wipe(current_action) |
| 522 current_action.target_type = AF.ITEM | 546 current_action.target_type = AF.ITEM |
| 523 current_action.identifier = item_id | 547 current_action.identifier = item_id |
| 524 current_action.loot_label = "contains" | 548 current_action.loot_label = "contains" |
| 525 break | 549 break |
| 610 local loot_table = LootTable(entry, loot_type, top_field) | 634 local loot_table = LootTable(entry, loot_type, top_field) |
| 611 | 635 |
| 612 if not source_list[source_id] then | 636 if not source_list[source_id] then |
| 613 if top_field then | 637 if top_field then |
| 614 entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1 | 638 entry[top_field][loot_count] = (entry[top_field][loot_count] or 0) + 1 |
| 615 else | 639 elseif not private.container_loot_toasting then |
| 616 entry[loot_count] = (entry[loot_count] or 0) + 1 | 640 entry[loot_count] = (entry[loot_count] or 0) + 1 |
| 617 end | 641 end |
| 618 source_list[source_id] = true | 642 source_list[source_id] = true |
| 619 end | 643 end |
| 620 UpdateDBEntryLocation(data_type, source_id) | 644 UpdateDBEntryLocation(data_type, source_id) |
| 1111 UpdateUnitPet(_G.UnitGUID(unit_id), unit_id) | 1135 UpdateUnitPet(_G.UnitGUID(unit_id), unit_id) |
| 1112 end | 1136 end |
| 1113 | 1137 |
| 1114 | 1138 |
| 1115 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity) | 1139 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity) |
| 1140 if not loot_type or (loot_type ~= "item" and loot_type ~= "money") then | |
| 1141 Debug("%s: loot_type is %s. Item link is %s, and quantity is %d.", event_name, loot_type, item_link, quantity) | |
| 1142 return | |
| 1143 end | |
| 1116 local container_id = private.loot_toast_container_id | 1144 local container_id = private.loot_toast_container_id |
| 1117 local item_id = ItemLinkToID(item_link) | 1145 local item_id = ItemLinkToID(item_link) |
| 1118 local npc = NPCEntry(private.raid_finder_boss_id or private.world_boss_id) | 1146 local npc = NPCEntry(private.raid_finder_boss_id or private.world_boss_id) |
| 1119 ClearKilledBossID() | |
| 1120 | 1147 |
| 1121 if npc then | 1148 if npc then |
| 1122 if not item_id then | 1149 if not item_id then |
| 1123 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) | 1150 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) |
| 1124 return | 1151 return |
| 1125 end | 1152 end |
| 1126 local loot_type = "drops" | 1153 local loot_label = "drops" |
| 1127 local encounter_data = npc:EncounterData(InstanceDifficultyToken()) | 1154 local encounter_data = npc:EncounterData(InstanceDifficultyToken()) |
| 1128 encounter_data[loot_type] = encounter_data[loot_type] or {} | 1155 encounter_data[loot_label] = encounter_data[loot_label] or {} |
| 1129 encounter_data.loot_counts = encounter_data.loot_counts or {} | 1156 encounter_data.loot_counts = encounter_data.loot_counts or {} |
| 1130 encounter_data.loot_counts[loot_type] = (encounter_data.loot_counts[loot_type] or 0) + 1 | 1157 |
| 1131 | 1158 if not private.boss_loot_toasting then |
| 1132 table.insert(encounter_data[loot_type], ("%d:%d"):format(item_id, quantity)) | 1159 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 |
| 1133 Debug("%s: %sX%d (%d)", event_name, item_link, quantity, item_id) | 1160 end |
| 1161 | |
| 1162 if loot_type == "item" then | |
| 1163 Debug("%s: %sX%d (%d)", event_name, item_link, quantity, item_id) | |
| 1164 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) | |
| 1165 elseif loot_type == "money" then | |
| 1166 Debug("%s: money - %d", event_name, quantity) | |
| 1167 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | |
| 1168 end | |
| 1169 private.boss_loot_toasting = true -- Do not count further loots until timer expires or another boss is killed | |
| 1134 elseif container_id then | 1170 elseif container_id then |
| 1135 private.loot_toast_container_id = nil | |
| 1136 | |
| 1137 InitializeCurrentLoot() | 1171 InitializeCurrentLoot() |
| 1172 | |
| 1173 -- Fake the loot characteristics to match that of an actual container item | |
| 1174 current_loot.identifier = container_id | |
| 1175 current_loot.label = "contains" | |
| 1176 current_loot.target_type = AF.ITEM | |
| 1138 | 1177 |
| 1139 if loot_type == "item" then | 1178 if loot_type == "item" then |
| 1140 if not item_id then | 1179 if not item_id then |
| 1141 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) | 1180 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) |
| 1142 return | 1181 return |
| 1147 elseif loot_type == "money" then | 1186 elseif loot_type == "money" then |
| 1148 table.insert(current_loot.list, ("money:%d"):format(quantity)) | 1187 table.insert(current_loot.list, ("money:%d"):format(quantity)) |
| 1149 end | 1188 end |
| 1150 GenericLootUpdate("items") | 1189 GenericLootUpdate("items") |
| 1151 current_loot = nil | 1190 current_loot = nil |
| 1191 private.container_loot_toasting = true -- do not count further loots until timer expires or another container is opened | |
| 1152 else | 1192 else |
| 1153 Debug("%s: NPC and Container are nil.", event_name) | 1193 Debug("%s: NPC and Container are nil.", event_name) |
| 1154 end | 1194 end |
| 1155 end | 1195 end |
| 1156 | 1196 |
| 1347 | 1387 |
| 1348 if not previous_combat_event.party_damage then | 1388 if not previous_combat_event.party_damage then |
| 1349 Debug("%s: %s was killed by %s (not group member or pet).", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) | 1389 Debug("%s: %s was killed by %s (not group member or pet).", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) |
| 1350 table.wipe(previous_combat_event) | 1390 table.wipe(previous_combat_event) |
| 1351 ClearKilledNPC() | 1391 ClearKilledNPC() |
| 1352 ClearKilledBossID() | 1392 else |
| 1353 return | 1393 Debug("%s: %s was killed by %s.", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) |
| 1354 end | |
| 1355 Debug("%s: %s was killed by %s.", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) | |
| 1356 | |
| 1357 if private.RAID_FINDER_BOSS_IDS[unit_idnum] then | |
| 1358 Debug("%s: Matching boss %s.", sub_event, dest_name) | |
| 1359 ClearKilledBossID() | |
| 1360 private.raid_finder_boss_id = unit_idnum | |
| 1361 elseif private.WORLD_BOSS_IDS[unit_idnum] then | |
| 1362 Debug("%s: Matching world boss %s.", sub_event, dest_name) | |
| 1363 ClearKilledBossID() | |
| 1364 private.world_boss_id = unit_idnum | |
| 1365 end | 1394 end |
| 1366 killed_npc_id = unit_idnum | 1395 killed_npc_id = unit_idnum |
| 1367 WDP:ScheduleTimer(ClearKilledNPC, 0.1) | 1396 WDP:ScheduleTimer(ClearKilledNPC, 0.1) |
| 1368 WDP:ScheduleTimer(ClearKilledBossID, 1) | |
| 1369 end, | 1397 end, |
| 1370 } | 1398 } |
| 1371 | 1399 |
| 1372 | 1400 |
| 1373 local NON_DAMAGE_EVENTS = { | 1401 local NON_DAMAGE_EVENTS = { |
| 2169 local spell_label = private.SPELL_LABELS_BY_NAME[spell_name] | 2197 local spell_label = private.SPELL_LABELS_BY_NAME[spell_name] |
| 2170 | 2198 |
| 2171 if not spell_label then | 2199 if not spell_label then |
| 2172 return | 2200 return |
| 2173 end | 2201 end |
| 2202 | |
| 2174 local item_name, item_link = _G.GameTooltip:GetItem() | 2203 local item_name, item_link = _G.GameTooltip:GetItem() |
| 2175 local unit_name, unit_id = _G.GameTooltip:GetUnit() | 2204 local unit_name, unit_id = _G.GameTooltip:GetUnit() |
| 2176 | 2205 |
| 2177 if not unit_name and _G.UnitName("target") == target_name then | 2206 if not unit_name and _G.UnitName("target") == target_name then |
| 2178 unit_name = target_name | 2207 unit_name = target_name |
| 2221 end | 2250 end |
| 2222 private.tracked_line = spell_line | 2251 private.tracked_line = spell_line |
| 2223 end | 2252 end |
| 2224 | 2253 |
| 2225 | 2254 |
| 2226 do | 2255 function WDP:SPELL_CONFIRMATION_PROMPT(event_name, spell_id, confirm_type, text, duration, currency_id) |
| 2227 local LOOT_SPELL_ID_TO_ITEM_ID_MAP = { | 2256 if private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then |
| 2228 [142397] = 98134, -- Heroic Cache of Treasures | 2257 ClearKilledBossID() |
| 2229 [143506] = 98095, -- Brawler's Pet Supplies | 2258 ClearLootToastContainerID() |
| 2230 [143507] = 94207, -- Fabled Pandaren Pet Supplies | 2259 private.raid_finder_boss_id = private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] |
| 2231 [143512] = 93148, -- Pandaren Spirit Pet Supplies | 2260 elseif private.WORLD_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then |
| 2232 [143511] = 93149, -- Pandaren Spirit Pet Supplies | 2261 ClearKilledBossID() |
| 2233 [143510] = 93147, -- Pandaren Spirit Pet Supplies | 2262 ClearLootToastContainerID() |
| 2234 [143509] = 93146, -- Pandaren Spirit Pet Supplies | 2263 private.world_boss_id = private.WORLD_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] |
| 2235 [143508] = 89125, -- Sack of Pet Supplies | 2264 else |
| 2236 } | 2265 Debug("%s: Spell ID %d is not a known raid or world boss 'Bonus' spell.", event_name, spell_id) |
| 2237 | 2266 return |
| 2238 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) | 2267 end |
| 2239 if unit_id ~= "player" then | 2268 |
| 2240 return | 2269 killed_boss_id_timer_handle = WDP:ScheduleTimer(ClearKilledBossID, 1) -- we need to assign a handle here to cancel it later |
| 2241 end | 2270 end |
| 2242 private.tracked_line = nil | 2271 |
| 2243 private.previous_spell_id = spell_id | 2272 |
| 2244 private.loot_toast_container_id = LOOT_SPELL_ID_TO_ITEM_ID_MAP[spell_id] | 2273 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) |
| 2245 | 2274 if unit_id ~= "player" then |
| 2246 if anvil_spell_ids[spell_id] then | 2275 return |
| 2247 UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL) | 2276 end |
| 2248 elseif forge_spell_ids[spell_id] then | 2277 private.tracked_line = nil |
| 2249 UpdateDBEntryLocation("objects", OBJECT_ID_FORGE) | 2278 private.previous_spell_id = spell_id |
| 2250 elseif spell_name:match("^Harvest.+") then | 2279 |
| 2251 killed_npc_id = current_target_id | 2280 if private.LOOT_SPELL_ID_TO_ITEM_ID_MAP[spell_id] then |
| 2252 private.harvesting = true | 2281 ClearKilledBossID() |
| 2253 end | 2282 ClearLootToastContainerID() |
| 2254 end | 2283 |
| 2255 end -- do-block | 2284 private.loot_toast_container_id = private.LOOT_SPELL_ID_TO_ITEM_ID_MAP[spell_id] |
| 2285 loot_toast_container_timer_handle = WDP:ScheduleTimer(ClearLootToastContainerID, 1) -- we need to assign a handle here to cancel it later | |
| 2286 end | |
| 2287 | |
| 2288 if anvil_spell_ids[spell_id] then | |
| 2289 UpdateDBEntryLocation("objects", OBJECT_ID_ANVIL) | |
| 2290 elseif forge_spell_ids[spell_id] then | |
| 2291 UpdateDBEntryLocation("objects", OBJECT_ID_FORGE) | |
| 2292 elseif spell_name:match("^Harvest.+") then | |
| 2293 killed_npc_id = current_target_id | |
| 2294 private.harvesting = true | |
| 2295 end | |
| 2296 end | |
| 2256 | 2297 |
| 2257 | 2298 |
| 2258 function WDP:HandleSpellFailure(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) | 2299 function WDP:HandleSpellFailure(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) |
| 2259 if unit_id ~= "player" then | 2300 if unit_id ~= "player" then |
| 2260 return | 2301 return |
