Mercurial > wow > askmrrobot
comparison Core.lua @ 124:e31b02b24488
Updated for 8.0 pre-patch and BfA.
author | yellowfive |
---|---|
date | Tue, 17 Jul 2018 09:57:39 -0700 |
parents | f1da233629be |
children | 65c285394049 |
comparison
equal
deleted
inserted
replaced
123:7a6364917f86 | 124:e31b02b24488 |
---|---|
1 -- AskMrRobot | |
2 -- Does cool stuff associated with askmrrobot.com: | |
3 -- Import/Export gear and optimization solutions from/to the website | |
4 -- Improve the combat logging experience and augment it with extra data not available directly in the log file | |
5 -- Team Optimizer convenience functionality | |
6 | |
7 AskMrRobot = LibStub("AceAddon-3.0"):NewAddon("AskMrRobot", "AceEvent-3.0", "AceComm-3.0", "AceConsole-3.0", "AceSerializer-3.0") | 1 AskMrRobot = LibStub("AceAddon-3.0"):NewAddon("AskMrRobot", "AceEvent-3.0", "AceComm-3.0", "AceConsole-3.0", "AceSerializer-3.0") |
8 local Amr = AskMrRobot | 2 local Amr = AskMrRobot |
9 Amr.Serializer = LibStub("AskMrRobot-Serializer") | 3 Amr.Serializer = LibStub("AskMrRobot-Serializer") |
10 | 4 |
11 Amr.ADDON_NAME = "AskMrRobot" | 5 Amr.ADDON_NAME = "AskMrRobot" |
12 | 6 |
13 -- types of inter-addon messages that we receive, used to parcel them out to the proper handlers | 7 -- types of inter-addon messages that we receive, used to parcel them out to the proper handlers |
14 Amr.MessageTypes = { | 8 Amr.MessageTypes = { |
15 Version = "_V", | 9 Version = "_V", |
16 VersionRequest = "_VR", | 10 VersionRequest = "_VR" |
17 Team = "_T" | |
18 } | 11 } |
19 | 12 |
20 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true) | 13 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true) |
21 local AceGUI = LibStub("AceGUI-3.0") | 14 local AceGUI = LibStub("AceGUI-3.0") |
22 | 15 |
25 type = "launcher", | 18 type = "launcher", |
26 text = "Ask Mr. Robot", | 19 text = "Ask Mr. Robot", |
27 icon = "Interface\\AddOns\\" .. Amr.ADDON_NAME .. "\\Media\\icon", | 20 icon = "Interface\\AddOns\\" .. Amr.ADDON_NAME .. "\\Media\\icon", |
28 OnClick = function(self, button, down) | 21 OnClick = function(self, button, down) |
29 if button == "LeftButton" then | 22 if button == "LeftButton" then |
30 if IsControlKeyDown() then | 23 --if IsControlKeyDown() then |
31 Amr:Wipe() | 24 -- Amr:Wipe() |
32 else | 25 --else |
33 Amr:Toggle() | 26 Amr:Toggle() |
34 end | 27 --end |
35 elseif button == "RightButton" then | 28 elseif button == "RightButton" then |
36 Amr:EquipGearSet() | 29 Amr:EquipGearSet() |
37 end | 30 end |
38 end, | 31 end, |
39 OnTooltipShow = function(tt) | 32 OnTooltipShow = function(tt) |
50 | 43 |
51 local defaults = { | 44 local defaults = { |
52 char = { | 45 char = { |
53 FirstUse = true, -- true if this is first time use, gets cleared after seeing the export help splash window | 46 FirstUse = true, -- true if this is first time use, gets cleared after seeing the export help splash window |
54 Talents = {}, -- for each spec, selected talents | 47 Talents = {}, -- for each spec, selected talents |
55 Artifacts = {}, -- for each spec, artifact info | 48 Equipped = {}, -- for each spec, slot id to item info |
56 Equipped = {}, -- for each spec, slot id to item link | 49 BagItems = {}, -- list of item info for bags |
57 BagItems = {}, -- list of item links for bag | 50 BankItems = {}, -- list of item info for bank |
58 BankItems = {}, -- list of item links for bank | |
59 VoidItems = {}, -- list of item links for void storage | |
60 BagItemsAndCounts = {}, -- used mainly for the shopping list | 51 BagItemsAndCounts = {}, -- used mainly for the shopping list |
61 BankItemsAndCounts = {}, -- used mainly for the shopping list | 52 BankItemsAndCounts = {}, -- used mainly for the shopping list |
62 GearSets = {}, -- imported gear sets, key by spec group (1 or 2), slot id to item object | 53 GearSets = {}, -- imported gear sets |
63 ExtraItemData = {}, -- for each spec group (1 or 2): mainly for legacy support, item id to object with socketColor and duplicateId information | 54 ExtraEnchantData = {}, -- enchant id to enchant display information and material information |
64 ExtraGemData = {}, -- for each spec group (1 or 2): gem enchant id to gem display information, and data used to detect identical gems (mainly for legacy support) | |
65 ExtraEnchantData = {}, -- for each spec group (1 or 2): enchant id to enchant display information and material information | |
66 Logging = { -- character logging settings | 55 Logging = { -- character logging settings |
67 Enabled = false, -- whether logging is currently on or not | 56 Enabled = false, -- whether logging is currently on or not |
68 LastZone = nil, -- last zone the player was in | 57 LastZone = nil, -- last zone the player was in |
69 LastDiff = nil, -- last difficulty for the last zone the player was in | 58 LastDiff = nil, -- last difficulty for the last zone the player was in |
70 LastWipe = nil -- last time a wipe was called by this player | 59 LastWipe = nil -- last time a wipe was called by this player |
71 }, | |
72 TeamOpt = { | |
73 AllItems = {}, -- all equippable items no matter where it is, list of item unique ids, used to determine when a player gains a new equippable item | |
74 History = {}, -- history of drops since joining the current group | |
75 Rolls = {}, -- current loot choices for a loot distribution in progress | |
76 Role = nil, -- Leader or Member, changes UI to the mode most appropriate for this user | |
77 Loot = {}, -- the last loot seen by the master looter | |
78 LootGuid = nil, -- guid of the last unit looted by the master looter, will be "container" if there is no target | |
79 LootInProgress = false -- true if looting is currently in progress | |
80 } | 60 } |
81 }, | 61 }, |
82 profile = { | 62 profile = { |
83 minimap = { -- minimap hide/show and position settings | 63 minimap = { -- minimap hide/show and position settings |
84 hide = false | 64 hide = false |
85 }, | 65 }, |
86 window = {}, -- main window position settings | 66 window = {}, -- main window position settings |
87 lootWindow = {}, -- loot window position settings | |
88 shopWindow = {}, -- shopping list window position settings | 67 shopWindow = {}, -- shopping list window position settings |
89 options = { | 68 options = { |
90 autoGear = false, -- auto-equip saved gear sets when changing specs | 69 autoGear = false, -- auto-equip saved gear sets when changing specs |
91 shopAh = false, -- auto-show shopping list at AH | 70 shopAh = false, -- auto-show shopping list at AH |
92 disableEm = false, -- disable auto-creation of equipment manager sets | 71 disableEm = false, -- disable auto-creation of equipment manager sets |
101 Shopping = {}, -- shopping list data stored globally for access on any character | 80 Shopping = {}, -- shopping list data stored globally for access on any character |
102 Logging = { -- a lot of log data is stored globally for simplicity, can only be raiding with one character at a time | 81 Logging = { -- a lot of log data is stored globally for simplicity, can only be raiding with one character at a time |
103 Wipes = {}, -- times that a wipe was called | 82 Wipes = {}, -- times that a wipe was called |
104 PlayerData = {}, -- player data gathered at fight start | 83 PlayerData = {}, -- player data gathered at fight start |
105 PlayerExtras = {} -- player extra data like auras, gathered at fight start | 84 PlayerExtras = {} -- player extra data like auras, gathered at fight start |
106 }, | |
107 TeamOpt = { -- this stuff is stored globally in case a player e.g. switches to an alt in a raid group | |
108 LootGear = {}, -- gear info that needs to be transmitted with the next loot | |
109 Rankings = {}, -- last rankings imported by the loot ranker | |
110 RankingString = nil -- last ranking string imported, kept around for efficient serialization | |
111 } | 85 } |
112 } | 86 } |
113 } | 87 } |
114 | 88 |
115 Amr.db = LibStub("AceDB-3.0"):New("AskMrRobotDb3", defaults) | 89 Amr.db = LibStub("AceDB-3.0"):New("AskMrRobotDb4", defaults) |
116 | 90 |
117 -- set defaults for auto logging; if a new zone is added and some other stuff was turned on, turn on the new zone too | 91 -- set defaults for auto logging; if a new zone is added and some other stuff was turned on, turn on the new zone too |
118 local hasSomeLogging = false | 92 local hasSomeLogging = false |
119 local addedLogging = {} | 93 local addedLogging = {} |
120 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do | 94 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do |
173 Amr.Wait(5, function() | 147 Amr.Wait(5, function() |
174 Amr:InitializeVersions() | 148 Amr:InitializeVersions() |
175 Amr:InitializeGear() | 149 Amr:InitializeGear() |
176 Amr:InitializeExport() | 150 Amr:InitializeExport() |
177 Amr:InitializeCombatLog() | 151 Amr:InitializeCombatLog() |
178 Amr:InitializeTeamOpt() | |
179 end) | 152 end) |
180 end | 153 end |
181 | 154 |
182 function onPlayerEnteringWorld() | 155 function onPlayerEnteringWorld() |
183 | 156 |
224 ---------------------------------------------------------------------------------------- | 197 ---------------------------------------------------------------------------------------- |
225 local _slashMethods = { | 198 local _slashMethods = { |
226 hide = "Hide", | 199 hide = "Hide", |
227 show = "Show", | 200 show = "Show", |
228 toggle = "Toggle", | 201 toggle = "Toggle", |
229 equip = "EquipGearSet", -- parameter is "primary" or "secondary", or no parameter to toggle | 202 equip = "EquipGearSet", |
230 version = "PrintVersions", | 203 version = "PrintVersions", |
231 wipe = "Wipe", | 204 --wipe = "Wipe", |
232 undowipe = "UndoWipe", | 205 --undowipe = "UndoWipe", |
233 reset = "Reset", | 206 reset = "Reset", |
234 test = "Test" | 207 test = "Test" |
235 } | 208 } |
236 | 209 |
237 function Amr:SlashCommand(input) | 210 function Amr:SlashCommand(input) |
447 function Amr.StartsWith(str, prefix) | 420 function Amr.StartsWith(str, prefix) |
448 if string.len(str) < string.len(prefix) then return false end | 421 if string.len(str) < string.len(prefix) then return false end |
449 return string.sub(str, 1, string.len(prefix)) == prefix | 422 return string.sub(str, 1, string.len(prefix)) == prefix |
450 end | 423 end |
451 | 424 |
425 function Amr.IsEmpty(table) | |
426 return next(table) == nil | |
427 end | |
428 | |
429 function Amr.Contains(table, value) | |
430 if not table then return false end | |
431 for k,v in pairs(table) do | |
432 if v == value then | |
433 return true | |
434 end | |
435 end | |
436 return false | |
437 end | |
438 | |
452 -- helper to get the unit identifiers (e.g. to pass to GetUnitName) for all members of the player's current group/raid | 439 -- helper to get the unit identifiers (e.g. to pass to GetUnitName) for all members of the player's current group/raid |
453 function Amr:GetGroupUnitIdentifiers() | 440 function Amr:GetGroupUnitIdentifiers() |
454 | 441 |
455 local units = {} | 442 local units = {} |
456 if IsInRaid() then | 443 if IsInRaid() then |
525 end | 512 end |
526 end | 513 end |
527 return false | 514 return false |
528 end | 515 end |
529 | 516 |
530 -- helper to determine if we can equip an item (it is already soulbound or account bound) | 517 -- helper to determine if we can equip an item (it is soulbound) |
531 function Amr:CanEquip(bagId, slotId) | 518 function Amr:CanEquip(bagId, slotId) |
532 local tt = Amr.GetItemTooltip(bagId, slotId) | 519 local item = Item:CreateFromBagAndSlot(bagId, slotId) |
533 if self:IsTextInTooltip(tt, ITEM_SOULBOUND) then return true end | 520 if item then |
534 if self:IsTextInTooltip(tt, ITEM_BNETACCOUNTBOUND) then return true end | 521 local loc = item:GetItemLocation() |
535 if self:IsTextInTooltip(tt, ITEM_ACCOUNTBOUND) then return true end | 522 return C_Item.IsBound(loc) |
523 else | |
524 -- for now just return true if we can't find the item... will get an error trying to equip if it isn't bound | |
525 return true | |
526 end | |
527 | |
528 --local tt = Amr.GetItemTooltip(bagId, slotId) | |
529 --if self:IsTextInTooltip(tt, ITEM_SOULBOUND) then return true end | |
530 --if self:IsTextInTooltip(tt, ITEM_BNETACCOUNTBOUND) then return true end | |
531 --if self:IsTextInTooltip(tt, ITEM_ACCOUNTBOUND) then return true end | |
536 end | 532 end |
537 | 533 |
538 -- helper to determine if an item has a unique constraint | 534 -- helper to determine if an item has a unique constraint |
539 function Amr:IsUnique(bagId, slotId) | 535 function Amr:IsUnique(bagId, slotId) |
540 local tt = Amr.GetItemTooltip(bagId, slotId) | 536 local tt = Amr.GetItemTooltip(bagId, slotId) |
582 end | 578 end |
583 | 579 |
584 -- any other kind of message is ignored if the version is too old | 580 -- any other kind of message is ignored if the version is too old |
585 if not ver or ver < Amr.MIN_ADDON_VERSION then return end | 581 if not ver or ver < Amr.MIN_ADDON_VERSION then return end |
586 | 582 |
583 --[[ | |
587 if Amr.StartsWith(message, Amr.MessageTypes.Team) then | 584 if Amr.StartsWith(message, Amr.MessageTypes.Team) then |
588 -- if fully initialized, process team optimizer messages | 585 -- if fully initialized, process team optimizer messages |
589 if Amr["ProcessTeamMessage"] then | 586 if Amr["ProcessTeamMessage"] then |
590 Amr:ProcessTeamMessage(message) | 587 Amr:ProcessTeamMessage(message) |
591 end | 588 end |
593 -- if we are fully loaded, process a player snapshot when it is received (combat logging) | 590 -- if we are fully loaded, process a player snapshot when it is received (combat logging) |
594 if Amr["ProcessPlayerSnapshot"] then | 591 if Amr["ProcessPlayerSnapshot"] then |
595 self:ProcessPlayerSnapshot(message) | 592 self:ProcessPlayerSnapshot(message) |
596 end | 593 end |
597 end | 594 end |
595 ]] | |
598 end | 596 end |
599 | 597 |
600 | 598 |
601 ---------------------------------------------------------------------------------------- | 599 ---------------------------------------------------------------------------------------- |
602 -- Events | 600 -- Events |
633 | 631 |
634 | 632 |
635 ---------------------------------------------------------------------------------------- | 633 ---------------------------------------------------------------------------------------- |
636 -- Debugging | 634 -- Debugging |
637 ---------------------------------------------------------------------------------------- | 635 ---------------------------------------------------------------------------------------- |
636 function Amr:dump(o) | |
637 if type(o) == 'table' then | |
638 local s = '{ ' | |
639 for k,v in pairs(o) do | |
640 if type(k) ~= 'number' then k = '"'..k..'"' end | |
641 s = s .. '['..k..'] = ' .. Amr:dump(v) .. ',' | |
642 end | |
643 return s .. '} ' | |
644 else | |
645 return tostring(o) | |
646 end | |
647 end | |
648 | |
638 function Amr:Test() | 649 function Amr:Test() |
639 | 650 |
651 --local itemLink = GetInventoryItemLink("player", 17) | |
652 | |
653 --print(itemLink) | |
654 | |
655 --local blah = Amr.ParseItemLink(itemLink) | |
656 | |
657 --print(dump(blah.relicBonusIds)) | |
658 | |
659 --[[ | |
660 --print(NUM_BANKBAGSLOTS) | |
661 | |
662 local bagId = NUM_BAG_SLOTS + 1 | |
663 | |
664 local item = Item:CreateFromBagAndSlot(bagId, 2) | |
665 if item then | |
666 print(item:GetItemName()) | |
667 else | |
668 print("no item") | |
669 end | |
670 | |
671 local numSlots = GetContainerNumSlots(bagId) | |
672 print(numSlots .. " bag slots") | |
673 ]] | |
674 | |
675 -- EquipItemByName | |
676 | |
677 --[[ | |
678 for slotId = 1, numSlots do | |
679 local _, itemCount, _, _, _, _, itemLink = GetContainerItemInfo(bagId, slotId) | |
680 if itemLink ~= nil then | |
681 print(slotId .. " " .. itemLink) | |
682 end | |
683 end | |
684 ]] | |
685 | |
686 --[[ | |
640 local s = "|cff0070dd|Hitem:127224:5337:0:0:0:0:0:0:100:105:512:22:2:615:656:100|h[Staff of Polarities]|h|r" | 687 local s = "|cff0070dd|Hitem:127224:5337:0:0:0:0:0:0:100:105:512:22:2:615:656:100|h[Staff of Polarities]|h|r" |
641 Amr.GetItemInfo(s, function(obj, name, link, quality, iLevel) | 688 Amr.GetItemInfo(s, function(obj, name, link, quality, iLevel) |
642 print(iLevel) | 689 print(iLevel) |
643 end) | 690 end) |
644 end | 691 ]] |
645 | 692 end |
646 --[[ | |
647 function Amr:Test(val1, val2, val3) | |
648 | |
649 local link = GetLootSlotLink(tonumber(val1)) | |
650 local index = Amr:TestLootIndex(link) | |
651 print("loot index: " .. index) | |
652 | |
653 if val2 then | |
654 local candidate = Amr:TestLootCandidate(link, val2, val3) | |
655 print("loot candidate: " .. candidate) | |
656 | |
657 GiveMasterLoot(index, candidate) | |
658 end | |
659 end | |
660 ]] |