# HG changeset patch # User yellowfive # Date 1602611347 25200 # Node ID a7f2ba17c39ae29de005911ed7ca8ef443c99c32 # Parent f374d84470db1ec5de9c59ac553c12b1bf740752 Shadowlands pre-patch update. diff -r f374d84470db -r a7f2ba17c39a AskMrRobot-Serializer/AskMrRobot-Serializer.lua --- a/AskMrRobot-Serializer/AskMrRobot-Serializer.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/AskMrRobot-Serializer/AskMrRobot-Serializer.lua Tue Oct 13 10:49:07 2020 -0700 @@ -1,6 +1,6 @@ -- AskMrRobot-Serializer will serialize and communicate character data between users. -local MAJOR, MINOR = "AskMrRobot-Serializer", 86 +local MAJOR, MINOR = "AskMrRobot-Serializer", 90 local Amr, oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not Amr then return end -- already loaded by something else @@ -156,20 +156,12 @@ } Amr.InstanceIds = { - Uldir = 1861, - Dazar = 2070, - Storms = 2096, - Palace = 2164, - Nyalotha = 2217 + Nathria = 2296 } -- instances that AskMrRobot currently supports logging for Amr.SupportedInstanceIds = { - [1861] = true, - [2070] = true, - [2096] = true, - [2164] = true, - [2217] = true + [2296] = true } @@ -208,9 +200,10 @@ -- part 8 is some unique ID... we never really used it -- part 9 is current player level -- part 10 is player spec - local upgradeIdType = tonumber(parts[11]) or 0 -- part 11 indicates what kind of upgrade ID is just after the bonus IDs + -- unsure what 11 is now --local upgradeIdType = tonumber(parts[11]) or 0 -- part 11 indicates what kind of upgrade ID is just after the bonus IDs -- part 12 is instance difficulty id - + + -- 13 is num bonus IDs, followed by bonus IDs local numBonuses = tonumber(parts[13]) or 0 local offset = numBonuses if numBonuses > 0 then @@ -219,13 +212,24 @@ item.upgradeId = 0 item.level = 0 - - -- the next part after bonus IDs depends on the upgrade id type - if upgradeIdType == 4 then - item.upgradeId = tonumber(parts[14 + offset]) or 0 - elseif upgradeIdType == 512 then - item.level = tonumber(parts[14 + offset]) or 0 - elseif #parts > 16 + offset then + + -- part 14 + numBonuses, unsure what this is... sometimes it is "2" + -- part 15 + numBonuses, unsure what this is... may indicate what part 16 will mean? + -- part 16 + numBonuses, is player level at drop when applicable + -- part 17 + numBonuses, unsure what this is... + -- part 18 + numBonuses, unsure what this is... + -- part 19 + numBonuses, relic info would be here for legion artifacts + + local someNumber = tonumber(parts[15 + offset]) or 0 + if someNumber ~= 0 then + local lvl = tonumber(parts[16 + offset]) or 0 + if lvl <= 60 then + item.level = lvl + end + end + + -- we don't need relic information anymore + --[[elseif #parts > 19 + offset then -- check for relic info item.relicBonusIds = { nil, nil, nil } numBonuses = tonumber(parts[16 + offset]) @@ -254,7 +258,7 @@ end end end - end + end]] return item end @@ -387,6 +391,7 @@ end end +--[[ -- read azerite powers on the item in loc and put it on itemData function Amr.ReadAzeritePowers(loc) local ret = {} @@ -409,6 +414,7 @@ return nil end end +]] -- get currently equipped items, store with currently active spec local function readEquippedItems(ret) @@ -420,6 +426,7 @@ if itemLink then local itemData = Amr.ParseItemLink(itemLink) if itemData then + --[[ -- see if this is an azerite item and read azerite power ids loc:SetEquipmentSlot(slotId) if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then @@ -428,6 +435,7 @@ itemData.azerite = powers end end + ]] equippedItems[slotId] = itemData end @@ -438,6 +446,7 @@ ret.Equipped[GetSpecialization()] = equippedItems end +--[[ local function readHeartOfAzerothLevel(ret) local azeriteItemLocation = C_AzeriteItem.FindActiveAzeriteItem(); if azeriteItemLocation then @@ -447,6 +456,7 @@ ret.HeartOfAzerothLevel = 0 end end +]] -- Get just the player's currently equipped gear function Amr:GetEquipped() @@ -477,7 +487,7 @@ ret.Guild = GetGuildInfo("player") ret.ActiveSpec = GetSpecialization() ret.Level = UnitLevel("player"); - readHeartOfAzerothLevel(ret) + --readHeartOfAzerothLevel(ret) local _, clsEn = UnitClass("player") ret.Class = clsEn; @@ -500,8 +510,8 @@ readSpecs(ret) -- these get updated later, since need to cache info for inactive specs - ret.UnlockedEssences = {} - ret.Essences = {} + --ret.UnlockedEssences = {} + --ret.Essences = {} ret.Equipped = {} readEquippedItems(ret) @@ -551,7 +561,7 @@ local prevUpgradeId = 0 local prevBonusId = 0 local prevLevel = 0 - local prevAzeriteId = 0 + --local prevAzeriteId = 0 local prevRelicBonusId = 0 for i, itemData in ipairs(itemObjects) do local itemParts = {} @@ -576,13 +586,15 @@ end end + --[[ if itemData.azerite then for aIndex, aValue in ipairs(itemData.azerite) do table.insert(itemParts, "a" .. (aValue - prevAzeriteId)) prevAzeriteId = aValue end end - + ]] + if itemData.gemIds[1] ~= 0 then table.insert(itemParts, "x" .. (itemData.gemIds[1] - prevGemId)) prevGemId = itemData.gemIds[1] @@ -671,8 +683,7 @@ table.insert(fields, raceval) table.insert(fields, data.Level) - table.insert(fields, data.HeartOfAzerothLevel) - + local profs = {} local noprofs = true if data.Professions then @@ -698,7 +709,9 @@ table.insert(fields, ".s" .. spec) -- indicates the start of a spec block table.insert(fields, data.Specs[spec]) table.insert(fields, data.Talents[spec] or "") - + table.insert(fields, data.ActiveSoulbinds and data.ActiveSoulbinds[spec] or "0") + + --[[ local essences = {} if data.Essences and data.Essences[spec] then for i, ess in ipairs(data.Essences[spec]) do @@ -706,6 +719,7 @@ end end table.insert(fields, table.concat(essences, "_")) + ]] end end @@ -726,6 +740,26 @@ end end + -- export soulbind tree info + if data.Soulbinds then + table.insert(fields, ".sol") + for soulbindId, soulbindData in pairs(data.Soulbinds) do + table.insert(fields, string.format("u.%s.%s", soulbindId, soulbindData.UnlockedTier)) + for tier, node in pairs(soulbindData.Nodes) do + table.insert(fields, table.concat(node, ".")) + end + end + end + + -- export unlocked conduits + if data.UnlockedConduits then + table.insert(fields, ".con") + for i, conduit in ipairs(data.UnlockedConduits) do + table.insert(fields, table.concat(conduit, ".")) + end + end + + --[[ -- export unlocked essences if data.UnlockedEssences then table.insert(fields, ".ess") @@ -733,7 +767,8 @@ table.insert(fields, table.concat(ess, "_")) end end - + ]] + -- if doing a complete export, include bank/bag items too if complete then diff -r f374d84470db -r a7f2ba17c39a AskMrRobot.toc --- a/AskMrRobot.toc Sat Feb 15 11:17:00 2020 -0800 +++ b/AskMrRobot.toc Tue Oct 13 10:49:07 2020 -0700 @@ -1,7 +1,7 @@ -## Interface: 80300 +## Interface: 90002 ## Title: Ask Mr. Robot ## Author: Team Robot, Inc. -## Version: 86 +## Version: 90 ## Notes: Gear import/export, combat logging, and more. ## URL: www.askmrrobot.com ## SavedVariables: AskMrRobotDb4 diff -r f374d84470db -r a7f2ba17c39a Constants.lua --- a/Constants.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/Constants.lua Tue Oct 13 10:49:07 2020 -0700 @@ -24,7 +24,7 @@ --Amr.GetItemTooltip = Amr.Serializer.GetItemTooltip --Amr.GetItemLevel = Amr.Serializer.GetItemLevel Amr.GetItemUniqueId = Amr.Serializer.GetItemUniqueId -Amr.ReadAzeritePowers = Amr.Serializer.ReadAzeritePowers +--Amr.ReadAzeritePowers = Amr.Serializer.ReadAzeritePowers Amr.ProfessionSkillLineToName = Amr.Serializer.ProfessionSkillLineToName @@ -107,7 +107,7 @@ } -- instance IDs ordered in preferred display order -Amr.InstanceIdsOrdered = { 1861, 2070, 2096, 2164, 2217 } +Amr.InstanceIdsOrdered = { 2296 } Amr.Difficulties = { Lfr = 17, @@ -158,14 +158,7 @@ local specId = GetSpecializationInfo(GetSpecialization()) table.insert(parts, specId) - -- this indicates what kind of modifier appears after the bonus IDs - if itemObj.upgradeId and itemObj.upgradeId ~= 0 then - table.insert(parts, 4) - elseif itemObj.level and itemObj.level ~= 0 then - table.insert(parts, 512) - else - table.insert(parts, 0) - end + table.insert(parts, 0) -- not sure what this is anymore table.insert(parts, 0) -- difficulty id, doesn't matter @@ -177,20 +170,20 @@ else table.insert(parts, 0) -- no bonus ids end - - -- upgrade id or level comes after bonuses - if itemObj.upgradeId and itemObj.upgradeId ~= 0 then - table.insert(parts, itemObj.upgradeId) - elseif itemObj.level and itemObj.level ~= 0 then - table.insert(parts, itemObj.level) - else - table.insert(parts, 0) - end + + if itemObj.level and itemObj.level ~= 0 then + table.insert(parts, 2) -- not sure if this is always 2 or not... + table.insert(parts, 9) -- not sure if this is always 9 or not... + table.insert(parts, itemObj.level) + elseif itemObj.upgradeId and itemObj.upgradeId ~= 0 then + -- figure this out (if we still care) + end -- we don't bother with relic bonus ids anymore when generating links table.insert(parts, 0) table.insert(parts, 0) table.insert(parts, 0) + table.insert(parts, 0) return table.concat(parts, ":") end diff -r f374d84470db -r a7f2ba17c39a Core.lua --- a/Core.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/Core.lua Tue Oct 13 10:49:07 2020 -0700 @@ -46,8 +46,9 @@ LastVersion = 0, -- used to clean out old stuff FirstUse = true, -- true if this is first time use, gets cleared after seeing the export help splash window Talents = {}, -- for each spec, selected talents - Essences = {}, -- for each spec, selected essences - UnlockedEssences = {}, -- unlocked essences for this character + Soulbinds = {}, -- selected nodes in each soulbind tree for this character + ActiveSoulbinds = {}, -- for each spec, active soulbind + UnlockedConduits = {}, -- unlocked conduits for this character Equipped = {}, -- for each spec, slot id to item info BagItems = {}, -- list of item info for bags BankItems = {}, -- list of item info for bank @@ -708,4 +709,10 @@ function Amr:Test() + --local item = Item:CreateFromItemID(171416) + --local blah = C_LegendaryCrafting.GetRuneforgePowers(item:GetItemLocation()) + + --local info = C_LegendaryCrafting.GetRuneforgePowerInfo(30) + + --print(Amr:dump(info)) end diff -r f374d84470db -r a7f2ba17c39a Export.lua --- a/Export.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/Export.lua Tue Oct 13 10:49:07 2020 -0700 @@ -123,13 +123,13 @@ if itemData ~= nil then -- see if this is an azerite item and read azerite power ids - loc:SetBagAndSlot(bagId, slotId) + --[[loc:SetBagAndSlot(bagId, slotId) if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then local powers = Amr.ReadAzeritePowers(loc) if powers then itemData.azerite = powers end - end + end]] if isBank then _lastBankBagId = bagId @@ -259,6 +259,62 @@ end ]] +local function scanSoulbinds() + if not C_Soulbinds then return end + + -- read which conduits this player has unlocked + Amr.db.char.UnlockedConduits = {} + + for t = 0,2 do + local conduits = C_Soulbinds.GetConduitCollection(t) + for i, conduit in ipairs(conduits) do + table.insert(Amr.db.char.UnlockedConduits, { conduit.conduitID, conduit.conduitRank }) + end + end + + if not Amr.db.char.ActiveSoulbinds then + Amr.db.char.ActiveSoulbinds = {} + end + + -- read the currently active soulbind for this spec + local specPos = GetSpecialization() + if specPos and specPos >= 1 and specPos <= 4 then + Amr.db.char.ActiveSoulbinds[specPos] = C_Soulbinds.GetActiveSoulbindID() or 0 + end + + -- update soulbind tree info for all soulbinds + Amr.db.char.Soulbinds = {} + + local covenantData = C_Covenants.GetCovenantData(C_Covenants.GetActiveCovenantID()) + + if covenantData and covenantData.soulbindIDs then + for i, soulbindId in ipairs(covenantData.soulbindIDs) do + local soulbindData = soulbindId and C_Soulbinds.GetSoulbindData(soulbindId) + local nodes = {} + local unlockedTier = 0 + + if soulbindData and soulbindData.tree and soulbindData.tree.nodes then + for i, node in ipairs(soulbindData.tree.nodes) do + if node.state == 3 then + nodes[node.row] = { soulbindId, node.row, node.column, node.conduitID, node.conduitRank } + end + if node.state > 0 then + unlockedTier = math.max(node.row, unlockedTier) + end + end + end + + Amr.db.char.Soulbinds[soulbindId] = { + UnlockedTier = unlockedTier, + Nodes = nodes + } + + end + end + +end + +--[[ local function scanEssences() if not C_AzeriteEssence then return end @@ -300,6 +356,7 @@ end end end +]] local function scanTalents() local specPos = GetSpecialization() @@ -345,12 +402,18 @@ -- scan current spec's talents just before exporting scanTalents() + -- scan all soulbinds just before exporting + scanSoulbinds() + -- scan current spec's essences just before exporting - scanEssences() + --scanEssences() data.Talents = Amr.db.char.Talents - data.UnlockedEssences = Amr.db.char.UnlockedEssences - data.Essences = Amr.db.char.Essences + data.UnlockedConduits = Amr.db.char.UnlockedConduits + data.ActiveSoulbinds = Amr.db.char.ActiveSoulbinds + data.Soulbinds = Amr.db.char.Soulbinds + --data.UnlockedEssences = Amr.db.char.UnlockedEssences + --data.Essences = Amr.db.char.Essences data.Equipped = Amr.db.char.Equipped data.BagItems = Amr.db.char.BagItems @@ -385,6 +448,10 @@ Amr:AddEventHandler("PLAYER_TALENT_UPDATE", scanTalents) -if C_AzeriteEssence then - Amr:AddEventHandler("AZERITE_ESSENCE_UPDATE", scanEssences) +--if C_AzeriteEssence then +-- Amr:AddEventHandler("AZERITE_ESSENCE_UPDATE", scanEssences) +--end + +if C_Soulbinds then + Amr:AddEventHandler("SOULBIND_ACTIVATED", scanSoulbinds) end \ No newline at end of file diff -r f374d84470db -r a7f2ba17c39a Gear.lua --- a/Gear.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/Gear.lua Tue Oct 13 10:49:07 2020 -0700 @@ -235,7 +235,7 @@ end local equipped = player.Equipped[player.ActiveSpec] - local equippedEssences = player.Essences[player.ActiveSpec] + --local equippedEssences = player.Essences[player.ActiveSpec] if not gear then -- no gear has been imported for this spec so show a message @@ -313,8 +313,10 @@ end end - local isAzerite = optimalItem and C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItemByID(optimalItem.id) - local isEssence = essences and optimalItem and optimalItem.id == 158075 + --local isAzerite = optimalItem and C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItemByID(optimalItem.id) + --local isEssence = essences and optimalItem and optimalItem.id == 158075 + local isAzerite = false + local isEssence = false -- find the item in the player's inventory that best matches what the optimization wants to use local matchItem = Amr:FindMatchingItem(optimalItem, player, usedItems) @@ -684,13 +686,13 @@ local bagItem = Amr.ParseItemLink(itemLink) if bagItem ~= nil then -- see if this is an azerite item and read azerite power ids - loc:SetBagAndSlot(bagId, slotId) + --[[loc:SetBagAndSlot(bagId, slotId) if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then local powers = Amr.ReadAzeritePowers(loc) if powers then bagItem.azerite = powers end - end + end]] local diff = countItemDifferences(item, bagItem) if diff < bestDiff then diff -r f374d84470db -r a7f2ba17c39a Import.lua --- a/Import.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/Import.lua Tue Oct 13 10:49:07 2020 -0700 @@ -134,7 +134,7 @@ local prevUpgradeId = 0 local prevBonusId = 0 local prevLevel = 0 - local prevAzeriteId = 0 + --local prevAzeriteId = 0 local digits = { ["-"] = true, ["0"] = true, @@ -155,9 +155,9 @@ elseif itemString ~= "" and itemString ~= "_" then local tokens = {} local bonusIds = {} - local azerite = {} + --local azerite = {} local hasBonuses = false - local hasAzerites = false + --local hasAzerites = false local token = "" local prop = "i" local tokenComplete = false @@ -189,17 +189,17 @@ elseif prop == "e" then val = val + prevEnchantId prevEnchantId = val - elseif prop == "a" then - val = val + prevAzeriteId - prevAzeriteId = val + --elseif prop == "a" then + -- val = val + prevAzeriteId + -- prevAzeriteId = val end if prop == "b" then table.insert(bonusIds, val) hasBonuses = true - elseif prop == "a" then - table.insert(azerite, val) - hasAzerites = true + --elseif prop == "a" then + -- table.insert(azerite, val) + -- hasAzerites = true else tokens[prop] = val end @@ -237,15 +237,16 @@ obj.bonusIds = bonusIds end - if hasAzerites then - obj.azerite = azerite - end + --if hasAzerites then + -- obj.azerite = azerite + --end end end return importData end +--[[ local function parseEssenceList(essenceString) local ret = {} @@ -257,6 +258,19 @@ return ret end +]] + +local function parseSoulbinds(soulbindString) + local ret = {} + + local parts = { strsplit(",", soulbindString) } + for i = 1, #parts do + local node = { strsplit(".", parts[i]) } + table.insert(ret, { tonumber(node[1]), tonumber(node[2]), tonumber(node[3]) }) + end + + return ret +end -- -- Import a character, returning nil on success, otherwise an error message, import result stored in the db. @@ -353,9 +367,11 @@ end -- if we make it this far, the data is valid, so read item information - local specSlot = tonumber(parts[11]) + local specSlot = tonumber(parts[10]) - local essences = parseEssenceList(parts[15]) + local soulbindId = tonumber(parts[14]) + local soulbindNodes = parseSoulbinds(parts[15]) + --local essences = parseEssenceList(parts[15]) local importData = parseItemList(parts, 17, "n/a", true) @@ -412,7 +428,9 @@ Id = setupId, Label = setupName, Gear = importData, - Essences = essences + SoulbindId = soulbindId, + SoulbindNodes = soulbindNodes + --Essences = essences } if not result.IsBib then diff -r f374d84470db -r a7f2ba17c39a Junk.lua --- a/Junk.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/Junk.lua Tue Oct 13 10:49:07 2020 -0700 @@ -36,13 +36,13 @@ local itemData = Amr.Serializer.ParseItemLink(itemLink) if itemData ~= nil then -- see if this is an azerite item and read azerite power ids - loc:SetBagAndSlot(bagId, slotId) + --[[loc:SetBagAndSlot(bagId, slotId) if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then local powers = Amr.ReadAzeritePowers(loc) if powers then itemData.azerite = powers end - end + end]] -- see if it matches local diffs = Amr.CountItemDifferences(matchItem, itemData) diff -r f374d84470db -r a7f2ba17c39a localization/enUS.lua --- a/localization/enUS.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/localization/enUS.lua Tue Oct 13 10:49:07 2020 -0700 @@ -85,11 +85,7 @@ } L.InstanceNames = { - [1861] = "Uldir", - [2070] = "Dazar'alor", - [2096] = "Crucible of Storms", - [2164] = "The Eternal Palace", - [2217] = "Ny'alotha" + [2296] = "Castle Nathria" } L.DifficultyNames = { diff -r f374d84470db -r a7f2ba17c39a localization/frFR.lua --- a/localization/frFR.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/localization/frFR.lua Tue Oct 13 10:49:07 2020 -0700 @@ -71,11 +71,7 @@ } L.InstanceNames = { - [1861] = "Uldir", - [2070] = "Dazar'alor", - [2096] = "Crucible of Storms", - [2164] = "The Eternal Palace", - [2217] = "Ny'alotha" + [2296] = "Castle Nathria" } L.DifficultyNames = { diff -r f374d84470db -r a7f2ba17c39a localization/itIT.lua --- a/localization/itIT.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/localization/itIT.lua Tue Oct 13 10:49:07 2020 -0700 @@ -71,11 +71,7 @@ } L.InstanceNames = { - [1861] = "Uldir", - [2070] = "Dazar'alor", - [2096] = "Crucible of Storms", - [2164] = "The Eternal Palace", - [2217] = "Ny'alotha" + [2296] = "Castle Nathria" } L.DifficultyNames = { diff -r f374d84470db -r a7f2ba17c39a localization/ptBR.lua --- a/localization/ptBR.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/localization/ptBR.lua Tue Oct 13 10:49:07 2020 -0700 @@ -71,11 +71,7 @@ } L.InstanceNames = { - [1861] = "Uldir", - [2070] = "Dazar'alor", - [2096] = "Crucible of Storms", - [2164] = "The Eternal Palace", - [2217] = "Ny'alotha" + [2296] = "Castle Nathria" } L.DifficultyNames = { diff -r f374d84470db -r a7f2ba17c39a localization/ruRU.lua --- a/localization/ruRU.lua Sat Feb 15 11:17:00 2020 -0800 +++ b/localization/ruRU.lua Tue Oct 13 10:49:07 2020 -0700 @@ -71,11 +71,7 @@ } L.InstanceNames = { - [1861] = "Uldir", - [2070] = "Dazar'alor", - [2096] = "Crucible of Storms", - [2164] = "The Eternal Palace", - [2217] = "Ny'alotha" + [2296] = "Castle Nathria" } L.DifficultyNames = {