Mercurial > wow > wowdb-profiler
comparison Main.lua @ 312:de9d571df07f
More loot fixes.
author | James D. Callahan III <jcallahan@curse.com> |
---|---|
date | Mon, 09 Sep 2013 16:05:55 -0500 |
parents | 3b9c6d588e62 |
children | 564deda095ec |
comparison
equal
deleted
inserted
replaced
311:183b6b967cc2 | 312:de9d571df07f |
---|---|
1 -- LUA API ------------------------------------------------------------ | 1 -- LUA API ------------------------------------------------------------ |
2 | 2 |
3 local _G = getfenv(0) | 3 local _G = getfenv(0) |
4 | 4 |
5 local pairs = _G.pairs | 5 local pairs = _G.pairs |
6 local tostring = _G.tostring | |
6 local tonumber = _G.tonumber | 7 local tonumber = _G.tonumber |
7 | 8 |
8 local bit = _G.bit | 9 local bit = _G.bit |
9 local math = _G.math | 10 local math = _G.math |
10 local table = _G.table | 11 local table = _G.table |
143 local target_location_timer_handle | 144 local target_location_timer_handle |
144 local current_target_id | 145 local current_target_id |
145 local current_area_id | 146 local current_area_id |
146 local current_loot | 147 local current_loot |
147 | 148 |
149 | |
148 -- Data for our current action. Including possible values as a reference. | 150 -- Data for our current action. Including possible values as a reference. |
149 local current_action = { | 151 local current_action = { |
150 identifier = nil, | 152 identifier = nil, |
151 loot_label = nil, | 153 loot_label = nil, |
152 loot_list = nil, | 154 loot_list = nil, |
325 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() | 327 local _, instance_type, instance_difficulty, _, _, _, is_dynamic = _G.GetInstanceInfo() |
326 | 328 |
327 if not instance_type or instance_type == "" then | 329 if not instance_type or instance_type == "" then |
328 instance_type = "NONE" | 330 instance_type = "NONE" |
329 end | 331 end |
330 return ("%s:%d:%s"):format(instance_type:upper(), instance_difficulty, _G.tostring(is_dynamic)) | 332 return ("%s:%d:%s"):format(instance_type:upper(), instance_difficulty, tostring(is_dynamic)) |
331 end | 333 end |
332 | 334 |
333 | 335 |
334 local function DBEntry(data_type, unit_id) | 336 local function DBEntry(data_type, unit_id) |
335 if not data_type or not unit_id then | 337 if not data_type or not unit_id then |
413 | 415 |
414 if y % 2 ~= 0 then | 416 if y % 2 ~= 0 then |
415 y = y + 1 | 417 y = y + 1 |
416 end | 418 end |
417 return _G.GetRealZoneText(), current_area_id, x, y, map_level, InstanceDifficultyToken() | 419 return _G.GetRealZoneText(), current_area_id, x, y, map_level, InstanceDifficultyToken() |
420 end | |
421 | |
422 | |
423 local function CurrencyLinkToTexture(currency_link) | |
424 if not currency_link then | |
425 return | |
426 end | |
427 local _, _, texture_path = _G.GetCurrencyInfo(tonumber(currency_link:match("currency:(%d+)"))) | |
428 return texture_path:match("[^\\]+$"):lower() | |
418 end | 429 end |
419 | 430 |
420 | 431 |
421 local function ItemLinkToID(item_link) | 432 local function ItemLinkToID(item_link) |
422 if not item_link then | 433 if not item_link then |
554 break | 565 break |
555 end | 566 end |
556 | 567 |
557 if current_line:GetText() == _G.ITEM_OPENABLE then | 568 if current_line:GetText() == _G.ITEM_OPENABLE then |
558 table.wipe(current_action) | 569 table.wipe(current_action) |
570 current_loot = nil | |
571 | |
559 current_action.target_type = AF.ITEM | 572 current_action.target_type = AF.ITEM |
560 current_action.identifier = item_id | 573 current_action.identifier = item_id |
561 current_action.loot_label = "contains" | 574 current_action.loot_label = "contains" |
562 break | 575 break |
563 end | 576 end |
755 if map_area_id == current_area_id then | 768 if map_area_id == current_area_id then |
756 return | 769 return |
757 end | 770 end |
758 local world_map = _G.WorldMapFrame | 771 local world_map = _G.WorldMapFrame |
759 local map_visible = world_map:IsVisible() | 772 local map_visible = world_map:IsVisible() |
760 local sfx_value = _G.tonumber(_G.GetCVar("Sound_EnableSFX")) | 773 local sfx_value = tonumber(_G.GetCVar("Sound_EnableSFX")) |
761 | 774 |
762 if not map_visible then | 775 if not map_visible then |
763 _G.SetCVar("Sound_EnableSFX", 0) | 776 _G.SetCVar("Sound_EnableSFX", 0) |
764 world_map:Show() | 777 world_map:Show() |
765 end | 778 end |
822 end | 835 end |
823 end | 836 end |
824 raw_db.build_num = build_num | 837 raw_db.build_num = build_num |
825 raw_db.version = DB_VERSION | 838 raw_db.version = DB_VERSION |
826 | 839 |
827 if DEBUGGING then -- TODO: Remove this when comment subsystem is finished. | 840 private.InitializeCommentSystem() |
828 private.InitializeCommentSystem() | 841 self:RegisterChatCommand("comment", private.ProcessCommentCommand) |
829 self:RegisterChatCommand("comment", private.ProcessCommentCommand) | |
830 end | |
831 end | 842 end |
832 | 843 |
833 | 844 |
834 function WDP:EventDispatcher(...) | 845 function WDP:EventDispatcher(...) |
835 local event_name = ... | 846 local event_name = ... |
1054 if not level_data.power then | 1065 if not level_data.power then |
1055 local max_power = _G.UnitManaMax("target") | 1066 local max_power = _G.UnitManaMax("target") |
1056 | 1067 |
1057 if max_power > 0 then | 1068 if max_power > 0 then |
1058 local power_type = _G.UnitPowerType("target") | 1069 local power_type = _G.UnitPowerType("target") |
1059 level_data.power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power) | 1070 level_data.power = ("%s:%d"):format(POWER_TYPE_NAMES[tostring(power_type)] or power_type, max_power) |
1060 end | 1071 end |
1061 end | 1072 end |
1062 name_to_id_map[_G.UnitName("target")] = unit_idnum | 1073 name_to_id_map[_G.UnitName("target")] = unit_idnum |
1063 return npc, unit_idnum | 1074 return npc, unit_idnum |
1064 end | 1075 end |
1164 UpdateUnitPet(_G.UnitGUID(unit_id), unit_id) | 1175 UpdateUnitPet(_G.UnitGUID(unit_id), unit_id) |
1165 end | 1176 end |
1166 | 1177 |
1167 | 1178 |
1168 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity) | 1179 function WDP:SHOW_LOOT_TOAST(event_name, loot_type, item_link, quantity) |
1169 if not loot_type or (loot_type ~= "item" and loot_type ~= "money") then | 1180 if not loot_type or (loot_type ~= "item" and loot_type ~= "money" and loot_type ~= "currency") then |
1170 Debug("%s: loot_type is %s. Item link is %s, and quantity is %d.", event_name, loot_type, item_link, quantity) | 1181 Debug("%s: loot_type is %s. Item link is %s, and quantity is %d.", event_name, loot_type, item_link, quantity) |
1171 return | 1182 return |
1172 end | 1183 end |
1173 local container_id = private.loot_toast_container_id | 1184 local container_id = private.loot_toast_container_id |
1174 local item_id = ItemLinkToID(item_link) | |
1175 local npc = NPCEntry(private.raid_finder_boss_id or private.world_boss_id) | 1185 local npc = NPCEntry(private.raid_finder_boss_id or private.world_boss_id) |
1176 | 1186 |
1177 if npc then | 1187 if npc then |
1178 if loot_type == "item" and not item_id then | |
1179 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) | |
1180 return | |
1181 end | |
1182 local loot_label = "drops" | 1188 local loot_label = "drops" |
1183 local encounter_data = npc:EncounterData(InstanceDifficultyToken()) | 1189 local encounter_data = npc:EncounterData(InstanceDifficultyToken()) |
1184 encounter_data[loot_label] = encounter_data[loot_label] or {} | 1190 encounter_data[loot_label] = encounter_data[loot_label] or {} |
1185 encounter_data.loot_counts = encounter_data.loot_counts or {} | 1191 encounter_data.loot_counts = encounter_data.loot_counts or {} |
1186 | 1192 |
1193 if loot_type == "item" then | |
1194 local item_id = ItemLinkToID(item_link) | |
1195 if item_id then | |
1196 Debug("%s: %s X %d (%d)", event_name, item_link, quantity, item_id) | |
1197 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) | |
1198 else | |
1199 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) | |
1200 return | |
1201 end | |
1202 elseif loot_type == "money" then | |
1203 Debug("%s: money X %d", event_name, quantity) | |
1204 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | |
1205 elseif loot_type == "currency" then | |
1206 local currency_texture = CurrencyLinkToTexture(item_link) | |
1207 if currency_texture and currency_texture ~= "" then | |
1208 Debug("%s: %s X %d", event_name, currency_texture, quantity) | |
1209 table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture)) | |
1210 else | |
1211 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) | |
1212 return | |
1213 end | |
1214 end | |
1215 | |
1187 if not private.boss_loot_toasting then | 1216 if not private.boss_loot_toasting then |
1188 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 | 1217 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 |
1189 end | 1218 end |
1190 | 1219 |
1191 if loot_type == "item" then | |
1192 Debug("%s: %sX%d (%d)", event_name, item_link, quantity, item_id) | |
1193 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) | |
1194 elseif loot_type == "money" then | |
1195 Debug("%s: money - %d", event_name, quantity) | |
1196 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | |
1197 end | |
1198 private.boss_loot_toasting = true -- Do not count further loots until timer expires or another boss is killed | 1220 private.boss_loot_toasting = true -- Do not count further loots until timer expires or another boss is killed |
1199 elseif container_id then | 1221 elseif container_id then |
1200 InitializeCurrentLoot() | 1222 InitializeCurrentLoot() |
1201 | 1223 |
1202 -- Fake the loot characteristics to match that of an actual container item | 1224 -- Fake the loot characteristics to match that of an actual container item |
1203 current_loot.identifier = container_id | 1225 current_loot.identifier = container_id |
1204 current_loot.label = "contains" | 1226 current_loot.label = "contains" |
1205 current_loot.target_type = AF.ITEM | 1227 current_loot.target_type = AF.ITEM |
1206 | 1228 |
1229 current_loot.sources[container_id] = current_loot.sources[container_id] or {} | |
1230 | |
1207 if loot_type == "item" then | 1231 if loot_type == "item" then |
1208 if not item_id then | 1232 local item_id = ItemLinkToID(item_link) |
1233 if item_id then | |
1234 Debug("%s: %s X %d (%d)", event_name, item_link, quantity, item_id) | |
1235 current_loot.sources[container_id][item_id] = current_loot.sources[container_id][item_id] or 0 + quantity | |
1236 else | |
1209 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) | 1237 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) |
1238 current_loot = nil | |
1210 return | 1239 return |
1211 end | 1240 end |
1212 current_loot.sources[container_id] = { | |
1213 [item_id] = quantity, | |
1214 } | |
1215 elseif loot_type == "money" then | 1241 elseif loot_type == "money" then |
1216 table.insert(current_loot.list, ("money:%d"):format(quantity)) | 1242 Debug("%s: money X %d", event_name, quantity) |
1217 end | 1243 current_loot.sources[container_id]["money"] = current_loot.sources[container_id]["money"] or 0 + quantity |
1244 elseif loot_type == "currency" then | |
1245 local currency_texture = CurrencyLinkToTexture(item_link) | |
1246 if currency_texture and currency_texture ~= "" then | |
1247 Debug("%s: %s X %d", event_name, currency_texture, quantity) | |
1248 local currency_token = ("currency:%s"):format(currency_texture) | |
1249 current_loot.sources[container_id][currency_token] = current_loot.sources[container_id][currency_token] or 0 + quantity | |
1250 else | |
1251 Debug("%s: Currency texture is nil, from currency link %s", event_name, item_link) | |
1252 current_loot = nil | |
1253 return | |
1254 end | |
1255 end | |
1256 | |
1218 GenericLootUpdate("items") | 1257 GenericLootUpdate("items") |
1219 current_loot = nil | 1258 current_loot = nil |
1220 private.container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened | 1259 private.container_loot_toasting = true -- Do not count further loots until timer expires or another container is opened |
1221 else | 1260 else |
1222 if loot_type == "item" and not item_id then | |
1223 Debug("%s: ItemID is nil, from item link %s", event_name, item_link) | |
1224 return | |
1225 end | |
1226 Debug("%s: NPC and Container are nil, storing loot toast data for 5 seconds.", event_name) | 1261 Debug("%s: NPC and Container are nil, storing loot toast data for 5 seconds.", event_name) |
1227 | 1262 |
1228 loot_toast_data = loot_toast_data or {} | 1263 loot_toast_data = loot_toast_data or {} |
1229 loot_toast_data[#loot_toast_data + 1] = { loot_type, item_link, quantity, item_id } | 1264 loot_toast_data[#loot_toast_data + 1] = { loot_type, item_link, quantity } |
1230 | 1265 |
1231 loot_toast_data_timer_handle = WDP:ScheduleTimer(ClearLootToastData, 5) | 1266 loot_toast_data_timer_handle = WDP:ScheduleTimer(ClearLootToastData, 5) |
1232 end | 1267 end |
1233 end | 1268 end |
1234 | 1269 |
1237 local CHAT_MSG_LOOT_UPDATE_FUNCS = { | 1272 local CHAT_MSG_LOOT_UPDATE_FUNCS = { |
1238 [AF.NPC] = function(item_id, quantity) | 1273 [AF.NPC] = function(item_id, quantity) |
1239 Debug("CHAT_MSG_LOOT: %d (%d)", item_id, quantity) | 1274 Debug("CHAT_MSG_LOOT: %d (%d)", item_id, quantity) |
1240 end, | 1275 end, |
1241 [AF.ZONE] = function(item_id, quantity) | 1276 [AF.ZONE] = function(item_id, quantity) |
1242 current_loot = { | 1277 InitializeCurrentLoot() |
1243 list = { | 1278 current_loot.list[1] = ("%d:%d"):format(item_id, quantity) |
1244 ("%d:%d"):format(item_id, quantity) | |
1245 }, | |
1246 identifier = current_action.identifier, | |
1247 label = current_action.loot_label or "drops", | |
1248 map_level = current_action.map_level, | |
1249 object_name = current_action.object_name, | |
1250 spell_label = current_action.spell_label, | |
1251 target_type = current_action.target_type, | |
1252 x = current_action.x, | |
1253 y = current_action.y, | |
1254 zone_data = current_action.zone_data, | |
1255 } | |
1256 table.wipe(current_action) | |
1257 GenericLootUpdate("zones") | 1279 GenericLootUpdate("zones") |
1280 current_loot = nil | |
1258 end, | 1281 end, |
1259 } | 1282 } |
1260 | 1283 |
1261 | 1284 |
1262 function WDP:CHAT_MSG_LOOT(event_name, message) | 1285 function WDP:CHAT_MSG_LOOT(event_name, message) |
1283 return | 1306 return |
1284 end | 1307 end |
1285 update_func(item_id, quantity) | 1308 update_func(item_id, quantity) |
1286 end | 1309 end |
1287 end | 1310 end |
1311 | |
1288 | 1312 |
1289 function WDP:RecordQuote(event_name, message, source_name, language_name) | 1313 function WDP:RecordQuote(event_name, message, source_name, language_name) |
1290 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 | 1314 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 |
1291 return | 1315 return |
1292 end | 1316 end |
1409 local unit_type, unit_idnum = ParseGUID(dest_guid) | 1433 local unit_type, unit_idnum = ParseGUID(dest_guid) |
1410 | 1434 |
1411 if not unit_idnum or not UnitTypeIsNPC(unit_type) then | 1435 if not unit_idnum or not UnitTypeIsNPC(unit_type) then |
1412 Debug("%s: %s is not an NPC, or has no ID.", sub_event, dest_name or _G.UNKNOWN) | 1436 Debug("%s: %s is not an NPC, or has no ID.", sub_event, dest_name or _G.UNKNOWN) |
1413 ClearKilledNPC() | 1437 ClearKilledNPC() |
1414 ClearKilledBossID() | |
1415 private.harvesting = nil | 1438 private.harvesting = nil |
1416 return | 1439 return |
1417 end | 1440 end |
1418 | 1441 |
1419 if source_guid == "" then | 1442 if source_guid == "" then |
1421 end | 1444 end |
1422 local killer_guid = source_guid or previous_combat_event.source_guid | 1445 local killer_guid = source_guid or previous_combat_event.source_guid |
1423 local killer_name = source_name or previous_combat_event.source_name | 1446 local killer_name = source_name or previous_combat_event.source_name |
1424 | 1447 |
1425 if not previous_combat_event.party_damage then | 1448 if not previous_combat_event.party_damage then |
1426 Debug("%s: %s was killed by %s (not group member or pet).", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) | 1449 --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 |
1427 table.wipe(previous_combat_event) | 1450 table.wipe(previous_combat_event) |
1428 ClearKilledNPC() | 1451 ClearKilledNPC() |
1429 else | 1452 else |
1430 Debug("%s: %s was killed by %s.", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) | 1453 --Debug("%s: %s was killed by %s.", sub_event, dest_name or _G.UNKNOWN, killer_name or _G.UNKNOWN) -- broken in Patch 5.4 |
1431 end | 1454 end |
1432 killed_npc_id = unit_idnum | 1455 killed_npc_id = unit_idnum |
1433 WDP:ScheduleTimer(ClearKilledNPC, 0.1) | 1456 WDP:ScheduleTimer(ClearKilledNPC, 0.1) |
1434 end, | 1457 end, |
1435 } | 1458 } |
1609 UpdateDBEntryLocation("objects", unit_idnum) | 1632 UpdateDBEntryLocation("objects", unit_idnum) |
1610 end | 1633 end |
1611 | 1634 |
1612 | 1635 |
1613 do | 1636 do |
1614 local RE_GOLD = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)") | |
1615 local RE_SILVER = _G.SILVER_AMOUNT:gsub("%%d", "(%%d+)") | |
1616 local RE_COPPER = _G.COPPER_AMOUNT:gsub("%%d", "(%%d+)") | |
1617 | |
1618 | |
1619 local function _moneyMatch(money, re) | |
1620 return money:match(re) or 0 | |
1621 end | |
1622 | |
1623 | |
1624 local function _toCopper(money) | |
1625 if not money then | |
1626 return 0 | |
1627 end | |
1628 return _moneyMatch(money, RE_GOLD) * 10000 + _moneyMatch(money, RE_SILVER) * 100 + _moneyMatch(money, RE_COPPER) | |
1629 end | |
1630 | |
1631 | |
1632 local LOOT_OPENED_VERIFY_FUNCS = { | 1637 local LOOT_OPENED_VERIFY_FUNCS = { |
1633 [AF.ITEM] = function() | 1638 [AF.ITEM] = function() |
1634 local locked_item_id | 1639 local locked_item_id |
1635 | 1640 |
1636 for bag_index = 0, _G.NUM_BAG_FRAMES do | 1641 for bag_index = 0, _G.NUM_BAG_FRAMES do |
1677 [AF.ITEM] = function() | 1682 [AF.ITEM] = function() |
1678 GenericLootUpdate("items") | 1683 GenericLootUpdate("items") |
1679 end, | 1684 end, |
1680 [AF.NPC] = function() | 1685 [AF.NPC] = function() |
1681 local difficulty_token = InstanceDifficultyToken() | 1686 local difficulty_token = InstanceDifficultyToken() |
1682 local loot_type = current_loot.label | 1687 local loot_label = current_loot.label |
1683 local source_list = {} | 1688 local source_list = {} |
1684 | 1689 |
1685 for source_guid, loot_data in pairs(current_loot.sources) do | 1690 for source_guid, loot_data in pairs(current_loot.sources) do |
1686 local source_id = select(2, ParseGUID(source_guid)) | 1691 local source_id = select(2, ParseGUID(source_guid)) |
1687 local npc = NPCEntry(source_id) | 1692 local npc = NPCEntry(source_id) |
1688 | 1693 |
1689 if npc then | 1694 if npc then |
1690 local encounter_data = npc:EncounterData(difficulty_token) | 1695 local encounter_data = npc:EncounterData(difficulty_token) |
1691 encounter_data[loot_type] = encounter_data[loot_type] or {} | 1696 encounter_data[loot_label] = encounter_data[loot_label] or {} |
1692 | 1697 |
1693 if not source_list[source_guid] then | 1698 if not source_list[source_guid] then |
1694 encounter_data.loot_counts = encounter_data.loot_counts or {} | 1699 encounter_data.loot_counts = encounter_data.loot_counts or {} |
1695 encounter_data.loot_counts[loot_type] = (encounter_data.loot_counts[loot_type] or 0) + 1 | 1700 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 |
1696 source_list[source_id] = true | 1701 source_list[source_guid] = true |
1697 end | 1702 end |
1698 | 1703 |
1699 for loot_token, quantity in pairs(loot_data) do | 1704 for loot_token, quantity in pairs(loot_data) do |
1700 local label, currency_texture = (":"):split(loot_token) | 1705 local loot_type, currency_texture = (":"):split(loot_token) |
1701 | 1706 |
1702 if label == "currency" and currency_texture then | 1707 if loot_type == "currency" and currency_texture then |
1703 table.insert(encounter_data[loot_type], ("currency:%d:%s"):format(quantity, currency_texture)) | 1708 table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture)) |
1704 elseif loot_token == "money" then | 1709 elseif loot_token == "money" then |
1705 table.insert(encounter_data[loot_type], ("money:%d"):format(quantity)) | 1710 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) |
1706 else | 1711 else |
1707 table.insert(encounter_data[loot_type], ("%d:%d"):format(loot_token, quantity)) | 1712 table.insert(encounter_data[loot_label], ("%d:%d"):format(loot_token, quantity)) |
1708 end | 1713 end |
1709 end | 1714 end |
1710 end | 1715 end |
1711 end | 1716 end |
1712 end, | 1717 end, |
1753 end | 1758 end |
1754 | 1759 |
1755 | 1760 |
1756 function WDP:LOOT_OPENED(event_name) | 1761 function WDP:LOOT_OPENED(event_name) |
1757 if current_loot then | 1762 if current_loot then |
1763 Debug("%s: Previous loot did not process.", event_name) | |
1758 return | 1764 return |
1759 end | 1765 end |
1760 | 1766 |
1761 if not current_action.target_type then | 1767 if not current_action.target_type then |
1768 Debug("%s: No target type found.", event_name) | |
1762 return | 1769 return |
1763 end | 1770 end |
1764 local verify_func = LOOT_OPENED_VERIFY_FUNCS[current_action.target_type] | 1771 local verify_func = LOOT_OPENED_VERIFY_FUNCS[current_action.target_type] |
1765 local update_func = LOOT_OPENED_UPDATE_FUNCS[current_action.target_type] | 1772 local update_func = LOOT_OPENED_UPDATE_FUNCS[current_action.target_type] |
1766 | 1773 |
1792 if #loot_info == 2 and slot_quantity > loot_quantity then | 1799 if #loot_info == 2 and slot_quantity > loot_quantity then |
1793 loot_quantity = slot_quantity | 1800 loot_quantity = slot_quantity |
1794 end | 1801 end |
1795 local source_type, source_id = ParseGUID(source_guid) | 1802 local source_type, source_id = ParseGUID(source_guid) |
1796 local source_key = ("%s:%d"):format(private.UNIT_TYPE_NAMES[source_type + 1], source_id) | 1803 local source_key = ("%s:%d"):format(private.UNIT_TYPE_NAMES[source_type + 1], source_id) |
1797 Debug("GUID: %s - Type:ID: %s - Amount: %d (%d)", loot_info[loot_index], source_key, loot_info[loot_index + 1], slot_quantity) | |
1798 | 1804 |
1799 if slot_type == _G.LOOT_SLOT_ITEM then | 1805 if slot_type == _G.LOOT_SLOT_ITEM then |
1800 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) | 1806 local item_id = ItemLinkToID(_G.GetLootSlotLink(loot_slot)) |
1807 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) | |
1801 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} | 1808 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} |
1802 current_loot.sources[source_guid][item_id] = current_loot.sources[source_guid][item_id] or 0 + loot_quantity | 1809 current_loot.sources[source_guid][item_id] = current_loot.sources[source_guid][item_id] or 0 + loot_quantity |
1803 guids_used[source_guid] = true | 1810 guids_used[source_guid] = true |
1804 elseif slot_type == _G.LOOT_SLOT_MONEY then | 1811 elseif slot_type == _G.LOOT_SLOT_MONEY then |
1805 Debug("money:%d", loot_quantity) | 1812 Debug("GUID: %s - Type:ID: %s - Money - Amount: %d (%d)", loot_info[loot_index], source_key, loot_info[loot_index + 1], slot_quantity) |
1806 if current_loot.target_type == AF.ZONE then | 1813 if current_loot.target_type == AF.ZONE then |
1807 table.insert(current_loot.list, ("money:%d"):format(_toCopper(item_text))) | 1814 table.insert(current_loot.list, ("money:%d"):format(loot_quantity)) |
1808 else | 1815 else |
1809 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} | 1816 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} |
1810 current_loot.sources[source_guid]["money"] = current_loot.sources[source_guid]["money"] or 0 + loot_quantity | 1817 current_loot.sources[source_guid]["money"] = current_loot.sources[source_guid]["money"] or 0 + loot_quantity |
1811 guids_used[source_guid] = true | 1818 guids_used[source_guid] = true |
1812 end | 1819 end |
1813 elseif slot_type == _G.LOOT_SLOT_CURRENCY then | 1820 elseif slot_type == _G.LOOT_SLOT_CURRENCY then |
1814 Debug("Found currency - %s:%d", icon_texture, loot_quantity) | 1821 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) |
1815 if current_loot.target_type == AF.ZONE then | 1822 if current_loot.target_type == AF.ZONE then |
1816 table.insert(current_loot.list, ("currency:%d:%s"):format(slot_quantity, icon_texture:match("[^\\]+$"):lower())) | 1823 table.insert(current_loot.list, ("currency:%d:%s"):format(loot_quantity, icon_texture:match("[^\\]+$"):lower())) |
1817 else | 1824 else |
1818 local currency_token = ("currency:%s"):format(icon_texture:match("[^\\]+$"):lower()) | 1825 local currency_token = ("currency:%s"):format(icon_texture:match("[^\\]+$"):lower()) |
1819 | 1826 |
1820 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} | 1827 current_loot.sources[source_guid] = current_loot.sources[source_guid] or {} |
1821 current_loot.sources[source_guid][currency_token] = current_loot.sources[source_guid][currency_token] or 0 + loot_quantity | 1828 current_loot.sources[source_guid][currency_token] = current_loot.sources[source_guid][currency_token] or 0 + loot_quantity |
1953 -- Keeping this around in case Blizzard makes the two points diverge at some point. | 1960 -- Keeping this around in case Blizzard makes the two points diverge at some point. |
1954 -- price_string = ("%s:%s:%s:%s"):format(price_string, battleground_rating, personal_rating, required_season_amount or 0) | 1961 -- price_string = ("%s:%s:%s:%s"):format(price_string, battleground_rating, personal_rating, required_season_amount or 0) |
1955 price_string = ("%s:%s:%s"):format(price_string, personal_rating, required_season_amount or 0) | 1962 price_string = ("%s:%s:%s"):format(price_string, personal_rating, required_season_amount or 0) |
1956 | 1963 |
1957 for cost_index = 1, item_count do | 1964 for cost_index = 1, item_count do |
1958 local icon_texture, amount_required, currency_link = _G.GetMerchantItemCostItem(item_index, cost_index) | 1965 -- (after some testing, the DB/Parser doesn't even support currency_ids -at all-, so vendor data submitted with the correct format will ironically be destroyed. that's why I removed the code here for currency_ids) |
1959 local currency_id = currency_link and ItemLinkToID(currency_link) or nil | 1966 -- the third return ("currency_link") of GetMerchantItemCostItem is broken as of Patch 5.4.0 |
1960 | 1967 local currency_texture, amount_required = _G.GetMerchantItemCostItem(item_index, cost_index) |
1961 if (not currency_id or currency_id < 1) and icon_texture then | 1968 |
1962 currency_id = icon_texture:match("[^\\]+$"):lower() | 1969 if currency_texture then |
1963 end | 1970 currency_list[#currency_list + 1] = ("(%s:%s)"):format(amount_required, currency_texture:match("[^\\]+$"):lower()) |
1964 | |
1965 if currency_id then | |
1966 currency_list[#currency_list + 1] = ("(%s:%s)"):format(amount_required, currency_id) | |
1967 end | 1971 end |
1968 end | 1972 end |
1969 | 1973 |
1970 for currency_index = 1, #currency_list do | 1974 for currency_index = 1, #currency_list do |
1971 price_string = ("%s:%s"):format(price_string, currency_list[currency_index]) | 1975 price_string = ("%s:%s"):format(price_string, currency_list[currency_index]) |
2296 end | 2300 end |
2297 private.tracked_line = spell_line | 2301 private.tracked_line = spell_line |
2298 end | 2302 end |
2299 | 2303 |
2300 | 2304 |
2301 function WDP:SPELL_CONFIRMATION_PROMPT(event_name, spell_id, confirm_type, text, duration, currency_id) | 2305 function WDP:SPELL_CONFIRMATION_PROMPT(event_name, spell_id, confirm_type, text, duration, currency_id_cost) |
2302 if private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then | 2306 if private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then |
2303 ClearKilledBossID() | 2307 ClearKilledBossID() |
2304 ClearLootToastContainerID() | 2308 ClearLootToastContainerID() |
2305 private.raid_finder_boss_id = private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] | 2309 private.raid_finder_boss_id = private.RAID_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] |
2306 elseif private.WORLD_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then | 2310 elseif private.WORLD_BOSS_BONUS_SPELL_ID_TO_NPC_ID_MAP[spell_id] then |
2325 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 | 2329 encounter_data.loot_counts[loot_label] = (encounter_data.loot_counts[loot_label] or 0) + 1 |
2326 | 2330 |
2327 for index = 1, #loot_toast_data do | 2331 for index = 1, #loot_toast_data do |
2328 local data = loot_toast_data[index] | 2332 local data = loot_toast_data[index] |
2329 local loot_type = data[1] | 2333 local loot_type = data[1] |
2334 local hyperlink = data[2] | |
2330 local quantity = data[3] | 2335 local quantity = data[3] |
2331 | 2336 |
2332 if loot_type == "item" then | 2337 if loot_type == "item" then |
2333 local item_id = data[4] | 2338 local item_id = ItemLinkToID(hyperlink) |
2334 | 2339 Debug("%s: Assigned stored item loot data - %s - %d:%d", event_name, hyperlink, item_id, quantity) |
2335 Debug("%s: Stored loot data - %sX%d (%d)", event_name, data[2], quantity, item_id) | |
2336 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) | 2340 table.insert(encounter_data[loot_label], ("%d:%d"):format(item_id, quantity)) |
2337 elseif loot_type == "money" then | 2341 elseif loot_type == "money" then |
2338 Debug("%s: Stored loot data - money - %d", event_name, quantity) | 2342 Debug("%s: Assigned stored money loot data - money:%d", event_name, quantity) |
2339 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) | 2343 table.insert(encounter_data[loot_label], ("money:%d"):format(quantity)) |
2344 elseif loot_type == "currency" then | |
2345 local currency_texture = CurrencyLinkToTexture(hyperlink) | |
2346 Debug("%s: Assigned stored currency loot data - %s - currency:%d:%s", event_name, hyperlink, currency_texture, quantity) | |
2347 table.insert(encounter_data[loot_label], ("currency:%d:%s"):format(quantity, currency_texture)) | |
2340 end | 2348 end |
2341 end | 2349 end |
2342 private.boss_loot_toasting = true | 2350 private.boss_loot_toasting = true |
2343 else | 2351 else |
2344 Debug("%s: NPC is nil, but we have stored loot data...", event_name) | 2352 Debug("%s: NPC is nil, but we have stored loot data...", event_name) |