Mercurial > wow > wowdb-profiler
comparison Main.lua @ 28:11afd2cc0b83
Huge revamp to data layout format - many things now reside under the Instance difficulty.
author | James D. Callahan III <jcallahan@curse.com> |
---|---|
date | Mon, 21 May 2012 16:36:35 -0500 |
parents | 120740b8a54f |
children | 5802628b2bf0 |
comparison
equal
deleted
inserted
replaced
27:120740b8a54f | 28:11afd2cc0b83 |
---|---|
121 end | 121 end |
122 | 122 |
123 if _G.DungeonUsesTerrainMap() then | 123 if _G.DungeonUsesTerrainMap() then |
124 map_level = map_level - 1 | 124 map_level = map_level - 1 |
125 end | 125 end |
126 local x_floor = floor(x * 1000) | |
127 local y_floor = floor(y * 1000) | |
128 | |
129 if x_floor % 2 ~= 0 then | |
130 x_floor = x_floor + 1 | |
131 end | |
132 | |
133 if y_floor % 2 ~= 0 then | |
134 y_floor = y_floor + 1 | |
135 end | |
136 -- print(("x: %d - y: %d"):format(x_floor, y_floor)) | |
137 | |
126 return _G.GetRealZoneText(), _G.GetCurrentMapAreaID(), ("%.2f"):format(x * 100), ("%.2f"):format(y * 100), map_level, InstanceDifficultyToken() | 138 return _G.GetRealZoneText(), _G.GetCurrentMapAreaID(), ("%.2f"):format(x * 100), ("%.2f"):format(y * 100), map_level, InstanceDifficultyToken() |
127 end | 139 end |
128 | 140 |
129 | 141 |
130 local function ItemLinkToID(item_link) | 142 local function ItemLinkToID(item_link) |
158 if not identifier then | 170 if not identifier then |
159 return | 171 return |
160 end | 172 end |
161 local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() | 173 local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() |
162 local object = DBEntry("objects", identifier) | 174 local object = DBEntry("objects", identifier) |
163 object.locations = object.locations or {} | 175 object[instance_token] = object[instance_token] or {} |
176 object[instance_token].locations = object[instance_token].locations or {} | |
164 | 177 |
165 local location_token = ("%s:%d"):format(zone_name, area_id) | 178 local location_token = ("%s:%d"):format(zone_name, area_id) |
166 | 179 |
167 if not object.locations[location_token] then | 180 if not object[instance_token].locations[location_token] then |
168 object.locations[location_token] = {} | 181 object[instance_token].locations[location_token] = {} |
169 end | 182 end |
170 object.locations[location_token][("%s:%s:%s:%s"):format(instance_token, map_level, x, y)] = true | 183 object[instance_token].locations[location_token][("%s:%s:%s"):format(map_level, x, y)] = true |
171 end | 184 end |
172 | 185 |
173 | 186 |
174 local function HandleItemUse(item_link, bag_index, slot_index) | 187 local function HandleItemUse(item_link, bag_index, slot_index) |
175 if not item_link then | 188 if not item_link then |
208 end | 221 end |
209 | 222 |
210 if current_line:GetText() == _G.ITEM_OPENABLE then | 223 if current_line:GetText() == _G.ITEM_OPENABLE then |
211 table.wipe(action_data) | 224 table.wipe(action_data) |
212 action_data.type = AF.ITEM | 225 action_data.type = AF.ITEM |
213 action_data.item_id = item_id | 226 action_data.identifier = item_id |
214 action_data.label = "contains" | 227 action_data.label = "contains" |
215 break | 228 break |
216 end | 229 end |
217 end | 230 end |
218 end | 231 end |
328 | 341 |
329 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 342 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then |
330 return | 343 return |
331 end | 344 end |
332 local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() | 345 local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() |
333 local npc_data = DBEntry("npcs", unit_idnum).encounter_data[("level_%d"):format(_G.UnitLevel("target"))] | 346 local npc_data = DBEntry("npcs", unit_idnum).encounter_data[instance_token][("level_%d"):format(_G.UnitLevel("target"))] |
334 npc_data.locations = npc_data.locations or {} | 347 npc_data.locations = npc_data.locations or {} |
335 | 348 |
336 local location_token = ("%s:%d"):format(zone_name, area_id) | 349 local location_token = ("%s:%d"):format(zone_name, area_id) |
337 | 350 |
338 if not npc_data.locations[location_token] then | 351 if not npc_data.locations[location_token] then |
341 | 354 |
342 -- Only record corpse location if there is no entry for this GUID. | 355 -- Only record corpse location if there is no entry for this GUID. |
343 if is_dead and npc_data.locations[location_token][target_guid] then | 356 if is_dead and npc_data.locations[location_token][target_guid] then |
344 return | 357 return |
345 end | 358 end |
346 npc_data.locations[location_token][target_guid] = ("%s:%s:%s:%s"):format(instance_token, map_level, x, y) | 359 npc_data.locations[location_token][target_guid] = ("%s:%s:%s"):format(map_level, x, y) |
347 end | 360 end |
348 | 361 |
349 | 362 |
350 ----------------------------------------------------------------------- | 363 ----------------------------------------------------------------------- |
351 -- Event handlers. | 364 -- Event handlers. |
367 end | 380 end |
368 | 381 |
369 if bit.band(FLAGS_NPC_CONTROL, source_flags) == FLAGS_NPC_CONTROL and bit.band(FLAGS_NPC, source_flags) ~= 0 then | 382 if bit.band(FLAGS_NPC_CONTROL, source_flags) == FLAGS_NPC_CONTROL and bit.band(FLAGS_NPC, source_flags) ~= 0 then |
370 local npc = DBEntry("npcs", source_id) | 383 local npc = DBEntry("npcs", source_id) |
371 local instance_token = InstanceDifficultyToken() | 384 local instance_token = InstanceDifficultyToken() |
372 npc.spells = npc.spells or {} | 385 npc.encounter_data = npc.encounter_data or {} |
373 npc.spells[instance_token] = npc.spells[instance_token] or {} | 386 |
374 npc.spells[instance_token][spell_id] = true | 387 if not npc.encounter_data[instance_token] then |
388 npc.encounter_data[instance_token] = {} | |
389 end | |
390 local encounter_data = npc.encounter_data[instance_token] | |
391 | |
392 encounter_data.spells = encounter_data.spells or {} | |
393 encounter_data.spells[spell_id] = (encounter_data.spells[spell_id] or 0) + 1 | |
375 end | 394 end |
376 end | 395 end |
377 | 396 |
378 | 397 |
379 local COMBAT_LOG_FUNCS = { | 398 local COMBAT_LOG_FUNCS = { |
401 local npc = DBEntry("npcs", action_data.identifier) | 420 local npc = DBEntry("npcs", action_data.identifier) |
402 | 421 |
403 if not npc then | 422 if not npc then |
404 return | 423 return |
405 end | 424 end |
406 npc.encounter_data[action_data.npc_level].reputations = npc.encounter_data[action_data.npc_level].reputations or {} | 425 local instance_token = InstanceDifficultyToken() |
407 npc.encounter_data[action_data.npc_level].reputations[faction_name] = amount | 426 |
427 if not npc.encounter_data[instance_token][action_data.npc_level].reputations then | |
428 npc.encounter_data[instance_token][action_data.npc_level].reputations = {} | |
429 end | |
430 npc.encounter_data[instance_token][action_data.npc_level].reputations[faction_name] = amount | |
408 end | 431 end |
409 | 432 |
410 | 433 |
411 do | 434 do |
412 local re_gold = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)") | 435 local re_gold = _G.GOLD_AMOUNT:gsub("%%d", "(%%d+)") |
440 locked_item_id = ItemLinkToID(_G.GetContainerItemLink(bag_index, slot_index)) | 463 locked_item_id = ItemLinkToID(_G.GetContainerItemLink(bag_index, slot_index)) |
441 end | 464 end |
442 end | 465 end |
443 end | 466 end |
444 | 467 |
445 if not locked_item_id or (action_data.item_id and action_data.item_id ~= locked_item_id) then | 468 if not locked_item_id or (action_data.identifier and action_data.identifier ~= locked_item_id) then |
446 return false | 469 return false |
447 end | 470 end |
448 action_data.item_id = locked_item_id | 471 action_data.identifier = locked_item_id |
449 return true | 472 return true |
450 end, | 473 end, |
451 [AF.NPC] = function() | 474 [AF.NPC] = function() |
452 if not _G.UnitExists("target") or _G.UnitIsFriend("player", "target") or _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then | 475 if not _G.UnitExists("target") or _G.UnitIsFriend("player", "target") or _G.UnitIsPlayer("target") or _G.UnitPlayerControlled("target") then |
453 return false | 476 return false |
461 return action_data.label and _G.IsFishingLoot() | 484 return action_data.label and _G.IsFishingLoot() |
462 end, | 485 end, |
463 } | 486 } |
464 | 487 |
465 | 488 |
466 local function GenericLootUpdate(data_type) | 489 local function GenericLootUpdate(data_type, top_field) |
467 local entry = DBEntry(data_type, action_data.identifier) | 490 local entry = DBEntry(data_type, action_data.identifier) |
468 | 491 |
469 print("GenericLootUpdate") | |
470 if not entry then | 492 if not entry then |
471 print(("Missing DB entry for %s (%s)"):format(data_type, tostring(action_data.identifier))) | |
472 return | 493 return |
473 end | 494 end |
474 local loot_type = action_data.label or "drops" | 495 local loot_type = action_data.label or "drops" |
475 entry[loot_type] = entry[loot_type] or {} | 496 local loot_data |
497 | |
498 if top_field then | |
499 entry[top_field] = entry[top_field] or {} | |
500 entry[top_field][loot_type] = entry[top_field][loot_type] or {} | |
501 | |
502 loot_data = entry[top_field][loot_type] | |
503 else | |
504 entry[loot_type] = entry[loot_type] or {} | |
505 | |
506 loot_data = entry[loot_type] | |
507 end | |
476 | 508 |
477 for index = 1, #action_data.loot_list do | 509 for index = 1, #action_data.loot_list do |
478 table.insert(entry[loot_type], action_data.loot_list[index]) | 510 table.insert(loot_data, action_data.loot_list[index]) |
479 end | 511 end |
480 end | 512 end |
481 | 513 |
482 | 514 |
483 local LOOT_UPDATE_FUNCS = { | 515 local LOOT_UPDATE_FUNCS = { |
484 [AF.ITEM] = function() | 516 [AF.ITEM] = function() |
485 local item = DBEntry("items", action_data.item_id) | 517 GenericLootUpdate("items") |
486 local loot_type = action_data.label or "drops" | |
487 item[loot_type] = item[loot_type] or {} | |
488 | |
489 for index = 1, #action_data.loot_list do | |
490 table.insert(item[loot_type], action_data.loot_list[index]) | |
491 end | |
492 end, | 518 end, |
493 [AF.NPC] = function() | 519 [AF.NPC] = function() |
494 GenericLootUpdate("npcs") | 520 local npc = DBEntry("npcs", action_data.identifier) |
521 | |
522 if not npc then | |
523 return | |
524 end | |
525 local instance_token = InstanceDifficultyToken() | |
526 | |
527 if not npc.encounter_data[instance_token] then | |
528 npc.encounter_data[instance_token] = {} | |
529 end | |
530 local loot_type = action_data.label or "drops" | |
531 npc.encounter_data[instance_token][loot_type] = npc.encounter_data[instance_token][loot_type] or {} | |
532 | |
533 local loot_data = npc.encounter_data[instance_token][loot_type] | |
534 | |
535 for index = 1, #action_data.loot_list do | |
536 table.insert(loot_data, action_data.loot_list[index]) | |
537 end | |
495 end, | 538 end, |
496 [AF.OBJECT] = function() | 539 [AF.OBJECT] = function() |
497 GenericLootUpdate("objects") | 540 GenericLootUpdate("objects", InstanceDifficultyToken()) |
498 end, | 541 end, |
499 [AF.ZONE] = function() | 542 [AF.ZONE] = function() |
500 local loot_type = action_data.label or "drops" | 543 local loot_type = action_data.label or "drops" |
501 local zone = DBEntry("zones", action_data.zone) | 544 local zone = DBEntry("zones", action_data.zone) |
502 zone[loot_type] = zone[loot_type] or {} | 545 zone[action_data.instance_token] = zone[action_data.instance_token] or {} |
503 | 546 zone[action_data.instance_token][loot_type] = zone[loot_type][action_data.instance_token] or {} |
504 local location_data = ("%s:%s:%s:%s"):format(action_data.instance_token, action_data.map_level, action_data.x, action_data.y) | 547 |
505 local loot_data = zone[loot_type][location_data] | 548 local location_data = ("%s:%s:%s"):format(action_data.map_level, action_data.x, action_data.y) |
549 local loot_data = zone[action_data.instance_token][loot_type][location_data] | |
506 | 550 |
507 if not loot_data then | 551 if not loot_data then |
508 zone[loot_type][location_data] = {} | 552 zone[action_data.instance_token][loot_type][location_data] = {} |
509 loot_data = zone[loot_type][location_data] | 553 loot_data = zone[action_data.instance_token][loot_type][location_data] |
510 end | 554 end |
511 | 555 |
512 for index = 1, #action_data.loot_list do | 556 for index = 1, #action_data.loot_list do |
513 table.insert(loot_data, action_data.loot_list[index]) | 557 table.insert(loot_data, action_data.loot_list[index]) |
514 end | 558 end |
671 | 715 |
672 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then | 716 if unit_type ~= private.UNIT_TYPES.NPC or not unit_idnum then |
673 return | 717 return |
674 end | 718 end |
675 DBEntry("npcs", unit_idnum).mind_control = true | 719 DBEntry("npcs", unit_idnum).mind_control = true |
676 print("Wiping action_data") | |
677 table.wipe(action_data) | 720 table.wipe(action_data) |
678 end | 721 end |
679 | 722 |
680 | 723 |
681 do | 724 do |
741 npc.genders[GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED"] = true | 784 npc.genders[GENDER_NAMES[_G.UnitSex("target")] or "UNDEFINED"] = true |
742 npc.is_pvp = _G.UnitIsPVP("target") and true or nil | 785 npc.is_pvp = _G.UnitIsPVP("target") and true or nil |
743 npc.reaction = ("%s:%s:%s"):format(_G.UnitLevel("player"), _G.UnitFactionGroup("player"), REACTION_NAMES[_G.UnitReaction("player", "target")]) | 786 npc.reaction = ("%s:%s:%s"):format(_G.UnitLevel("player"), _G.UnitFactionGroup("player"), REACTION_NAMES[_G.UnitReaction("player", "target")]) |
744 npc.encounter_data = npc.encounter_data or {} | 787 npc.encounter_data = npc.encounter_data or {} |
745 | 788 |
789 local instance_token = InstanceDifficultyToken() | |
790 | |
791 if not npc.encounter_data[instance_token] then | |
792 npc.encounter_data[instance_token] = {} | |
793 end | |
794 local encounter_data = npc.encounter_data[instance_token] | |
746 local npc_level = ("level_%d"):format(_G.UnitLevel("target")) | 795 local npc_level = ("level_%d"):format(_G.UnitLevel("target")) |
747 | 796 |
748 if not npc.encounter_data[npc_level] then | 797 if not encounter_data[npc_level] then |
749 npc.encounter_data[npc_level] = { | 798 encounter_data[npc_level] = { |
750 max_health = _G.UnitHealthMax("target"), | 799 max_health = _G.UnitHealthMax("target"), |
751 } | 800 } |
752 | 801 |
753 local max_power = _G.UnitManaMax("target") | 802 local max_power = _G.UnitManaMax("target") |
754 | 803 |
755 if max_power > 0 then | 804 if max_power > 0 then |
756 local power_type = _G.UnitPowerType("target") | 805 local power_type = _G.UnitPowerType("target") |
757 npc.encounter_data[npc_level].power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power) | 806 encounter_data[npc_level].power = ("%s:%d"):format(POWER_TYPE_NAMES[_G.tostring(power_type)] or power_type, max_power) |
758 end | 807 end |
759 end | 808 end |
760 table.wipe(action_data) | 809 table.wipe(action_data) |
761 action_data.type = AF.NPC | 810 action_data.type = AF.NPC |
762 action_data.identifier = unit_idnum | 811 action_data.identifier = unit_idnum |
883 if not tt_unit_name and _G.UnitName("target") == target_name then | 932 if not tt_unit_name and _G.UnitName("target") == target_name then |
884 tt_unit_name = target_name | 933 tt_unit_name = target_name |
885 tt_unit_id = "target" | 934 tt_unit_id = "target" |
886 end | 935 end |
887 local spell_flags = private.SPELL_FLAGS_BY_LABEL[spell_label] | 936 local spell_flags = private.SPELL_FLAGS_BY_LABEL[spell_label] |
937 local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() | |
938 | |
939 action_data.instance_token = instance_token | |
940 action_data.map_level = map_level | |
941 action_data.x = x | |
942 action_data.y = y | |
943 action_data.zone = ("%s:%d"):format(zone_name, area_id) | |
888 | 944 |
889 if tt_unit_name and not tt_item_name then | 945 if tt_unit_name and not tt_item_name then |
890 if bit.band(spell_flags, AF.NPC) == AF.NPC then | 946 if bit.band(spell_flags, AF.NPC) == AF.NPC then |
891 if not tt_unit_id or tt_unit_name ~= target_name then | 947 if not tt_unit_id or tt_unit_name ~= target_name then |
892 return | 948 return |
898 elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then | 954 elseif bit.band(spell_flags, AF.ITEM) == AF.ITEM then |
899 action_data.type = AF.ITEM | 955 action_data.type = AF.ITEM |
900 action_data.label = spell_label:lower() | 956 action_data.label = spell_label:lower() |
901 | 957 |
902 if tt_item_name and tt_item_name == target_name then | 958 if tt_item_name and tt_item_name == target_name then |
903 action_data.item_id = ItemLinkToID(tt_item_link) | 959 action_data.identifier = ItemLinkToID(tt_item_link) |
904 elseif target_name and target_name ~= "" then | 960 elseif target_name and target_name ~= "" then |
905 local _, target_item_link = _G.GetItemInfo(target_name) | 961 local _, target_item_link = _G.GetItemInfo(target_name) |
906 action_data.item_id = ItemLinkToID(target_item_link) | 962 action_data.identifier = ItemLinkToID(target_item_link) |
907 end | 963 end |
908 elseif not tt_item_name and not tt_unit_name then | 964 elseif not tt_item_name and not tt_unit_name then |
909 local zone_name, area_id, x, y, map_level, instance_token = CurrentLocationData() | |
910 | |
911 action_data.instance_token = instance_token | |
912 action_data.map_level = map_level | |
913 action_data.name = target_name | 965 action_data.name = target_name |
914 action_data.x = x | |
915 action_data.y = y | |
916 action_data.zone = ("%s:%d"):format(zone_name, area_id) | |
917 | 966 |
918 if bit.band(spell_flags, AF.OBJECT) == AF.OBJECT then | 967 if bit.band(spell_flags, AF.OBJECT) == AF.OBJECT then |
919 if target_name == "" then | 968 if target_name == "" then |
920 return | 969 return |
921 end | 970 end |
927 elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then | 976 elseif bit.band(spell_flags, AF.ZONE) == AF.ZONE then |
928 action_data.type = AF.ZONE | 977 action_data.type = AF.ZONE |
929 action_data.label = spell_label:lower() | 978 action_data.label = spell_label:lower() |
930 end | 979 end |
931 end | 980 end |
932 | |
933 -- print(("%s: '%s', '%s', '%s', '%s', '%s'"):format(event_name, unit_id, spell_name, spell_rank, target_name, spell_line)) | |
934 private.tracked_line = spell_line | 981 private.tracked_line = spell_line |
935 end | 982 end |
936 | 983 |
937 | 984 |
938 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) | 985 function WDP:UNIT_SPELLCAST_SUCCEEDED(event_name, unit_id, spell_name, spell_rank, spell_line, spell_id) |