comparison AskMrRobot-Serializer/AskMrRobot-Serializer.lua @ 185:a7f2ba17c39a v90

Shadowlands pre-patch update.
author yellowfive
date Tue, 13 Oct 2020 10:49:07 -0700
parents c6369f8f277c
children 180cb1458674
comparison
equal deleted inserted replaced
184:f374d84470db 185:a7f2ba17c39a
1 -- AskMrRobot-Serializer will serialize and communicate character data between users. 1 -- AskMrRobot-Serializer will serialize and communicate character data between users.
2 2
3 local MAJOR, MINOR = "AskMrRobot-Serializer", 86 3 local MAJOR, MINOR = "AskMrRobot-Serializer", 90
4 local Amr, oldminor = LibStub:NewLibrary(MAJOR, MINOR) 4 local Amr, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
5 5
6 if not Amr then return end -- already loaded by something else 6 if not Amr then return end -- already loaded by something else
7 7
8 -- event and comm used for player snapshotting on entering combat 8 -- event and comm used for player snapshotting on entering combat
154 ["Alliance"] = 1, 154 ["Alliance"] = 1,
155 ["Horde"] = 2 155 ["Horde"] = 2
156 } 156 }
157 157
158 Amr.InstanceIds = { 158 Amr.InstanceIds = {
159 Uldir = 1861, 159 Nathria = 2296
160 Dazar = 2070,
161 Storms = 2096,
162 Palace = 2164,
163 Nyalotha = 2217
164 } 160 }
165 161
166 -- instances that AskMrRobot currently supports logging for 162 -- instances that AskMrRobot currently supports logging for
167 Amr.SupportedInstanceIds = { 163 Amr.SupportedInstanceIds = {
168 [1861] = true, 164 [2296] = true
169 [2070] = true,
170 [2096] = true,
171 [2164] = true,
172 [2217] = true
173 } 165 }
174 166
175 167
176 ---------------------------------------------------------------------------------------- 168 ----------------------------------------------------------------------------------------
177 -- Public Utility Methods 169 -- Public Utility Methods
206 item.gemIds = { tonumber(parts[3]) or 0, tonumber(parts[4]) or 0, tonumber(parts[5]) or 0, tonumber(parts[6]) or 0 } 198 item.gemIds = { tonumber(parts[3]) or 0, tonumber(parts[4]) or 0, tonumber(parts[5]) or 0, tonumber(parts[6]) or 0 }
207 item.suffixId = math.abs(tonumber(parts[7]) or 0) -- convert suffix to positive number, that's what we use in our code 199 item.suffixId = math.abs(tonumber(parts[7]) or 0) -- convert suffix to positive number, that's what we use in our code
208 -- part 8 is some unique ID... we never really used it 200 -- part 8 is some unique ID... we never really used it
209 -- part 9 is current player level 201 -- part 9 is current player level
210 -- part 10 is player spec 202 -- part 10 is player spec
211 local upgradeIdType = tonumber(parts[11]) or 0 -- part 11 indicates what kind of upgrade ID is just after the bonus IDs 203 -- 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
212 -- part 12 is instance difficulty id 204 -- part 12 is instance difficulty id
213 205
206 -- 13 is num bonus IDs, followed by bonus IDs
214 local numBonuses = tonumber(parts[13]) or 0 207 local numBonuses = tonumber(parts[13]) or 0
215 local offset = numBonuses 208 local offset = numBonuses
216 if numBonuses > 0 then 209 if numBonuses > 0 then
217 item.bonusIds = readBonusIdList(parts, 14, 13 + numBonuses) 210 item.bonusIds = readBonusIdList(parts, 14, 13 + numBonuses)
218 end 211 end
219 212
220 item.upgradeId = 0 213 item.upgradeId = 0
221 item.level = 0 214 item.level = 0
222 215
223 -- the next part after bonus IDs depends on the upgrade id type 216 -- part 14 + numBonuses, unsure what this is... sometimes it is "2"
224 if upgradeIdType == 4 then 217 -- part 15 + numBonuses, unsure what this is... may indicate what part 16 will mean?
225 item.upgradeId = tonumber(parts[14 + offset]) or 0 218 -- part 16 + numBonuses, is player level at drop when applicable
226 elseif upgradeIdType == 512 then 219 -- part 17 + numBonuses, unsure what this is...
227 item.level = tonumber(parts[14 + offset]) or 0 220 -- part 18 + numBonuses, unsure what this is...
228 elseif #parts > 16 + offset then 221 -- part 19 + numBonuses, relic info would be here for legion artifacts
222
223 local someNumber = tonumber(parts[15 + offset]) or 0
224 if someNumber ~= 0 then
225 local lvl = tonumber(parts[16 + offset]) or 0
226 if lvl <= 60 then
227 item.level = lvl
228 end
229 end
230
231 -- we don't need relic information anymore
232 --[[elseif #parts > 19 + offset then
229 -- check for relic info 233 -- check for relic info
230 item.relicBonusIds = { nil, nil, nil } 234 item.relicBonusIds = { nil, nil, nil }
231 numBonuses = tonumber(parts[16 + offset]) 235 numBonuses = tonumber(parts[16 + offset])
232 if numBonuses then 236 if numBonuses then
233 if numBonuses > 0 then 237 if numBonuses > 0 then
252 end 256 end
253 end 257 end
254 end 258 end
255 end 259 end
256 end 260 end
257 end 261 end]]
258 262
259 return item 263 return item
260 end 264 end
261 265
262 local AZERITE_EMPOWERED_BONUS_ID = 4775 266 local AZERITE_EMPOWERED_BONUS_ID = 4775
385 else 389 else
386 return tostring(o) 390 return tostring(o)
387 end 391 end
388 end 392 end
389 393
394 --[[
390 -- read azerite powers on the item in loc and put it on itemData 395 -- read azerite powers on the item in loc and put it on itemData
391 function Amr.ReadAzeritePowers(loc) 396 function Amr.ReadAzeritePowers(loc)
392 local ret = {} 397 local ret = {}
393 local hasSome = false 398 local hasSome = false
394 399
407 return ret 412 return ret
408 else 413 else
409 return nil 414 return nil
410 end 415 end
411 end 416 end
417 ]]
412 418
413 -- get currently equipped items, store with currently active spec 419 -- get currently equipped items, store with currently active spec
414 local function readEquippedItems(ret) 420 local function readEquippedItems(ret)
415 local equippedItems = {}; 421 local equippedItems = {};
416 local loc = ItemLocation.CreateEmpty() 422 local loc = ItemLocation.CreateEmpty()
418 local slotId = Amr.SlotIds[slotNum] 424 local slotId = Amr.SlotIds[slotNum]
419 local itemLink = GetInventoryItemLink("player", slotId) 425 local itemLink = GetInventoryItemLink("player", slotId)
420 if itemLink then 426 if itemLink then
421 local itemData = Amr.ParseItemLink(itemLink) 427 local itemData = Amr.ParseItemLink(itemLink)
422 if itemData then 428 if itemData then
429 --[[
423 -- see if this is an azerite item and read azerite power ids 430 -- see if this is an azerite item and read azerite power ids
424 loc:SetEquipmentSlot(slotId) 431 loc:SetEquipmentSlot(slotId)
425 if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then 432 if C_AzeriteEmpoweredItem.IsAzeriteEmpoweredItem(loc) then
426 local powers = Amr.ReadAzeritePowers(loc) 433 local powers = Amr.ReadAzeritePowers(loc)
427 if powers then 434 if powers then
428 itemData.azerite = powers 435 itemData.azerite = powers
429 end 436 end
430 end 437 end
438 ]]
431 439
432 equippedItems[slotId] = itemData 440 equippedItems[slotId] = itemData
433 end 441 end
434 end 442 end
435 end 443 end
436 444
437 -- store last-seen equipped gear for each spec 445 -- store last-seen equipped gear for each spec
438 ret.Equipped[GetSpecialization()] = equippedItems 446 ret.Equipped[GetSpecialization()] = equippedItems
439 end 447 end
440 448
449 --[[
441 local function readHeartOfAzerothLevel(ret) 450 local function readHeartOfAzerothLevel(ret)
442 local azeriteItemLocation = C_AzeriteItem.FindActiveAzeriteItem(); 451 local azeriteItemLocation = C_AzeriteItem.FindActiveAzeriteItem();
443 if azeriteItemLocation then 452 if azeriteItemLocation then
444 local azeriteItem = Item:CreateFromItemLocation(azeriteItemLocation); 453 local azeriteItem = Item:CreateFromItemLocation(azeriteItemLocation);
445 ret.HeartOfAzerothLevel = C_AzeriteItem.GetPowerLevel(azeriteItemLocation) 454 ret.HeartOfAzerothLevel = C_AzeriteItem.GetPowerLevel(azeriteItemLocation)
446 else 455 else
447 ret.HeartOfAzerothLevel = 0 456 ret.HeartOfAzerothLevel = 0
448 end 457 end
449 end 458 end
459 ]]
450 460
451 -- Get just the player's currently equipped gear 461 -- Get just the player's currently equipped gear
452 function Amr:GetEquipped() 462 function Amr:GetEquipped()
453 local ret= {} 463 local ret= {}
454 ret.Equipped = {} 464 ret.Equipped = {}
475 ret.Realm = GetRealmName() 485 ret.Realm = GetRealmName()
476 ret.Name = UnitName("player") 486 ret.Name = UnitName("player")
477 ret.Guild = GetGuildInfo("player") 487 ret.Guild = GetGuildInfo("player")
478 ret.ActiveSpec = GetSpecialization() 488 ret.ActiveSpec = GetSpecialization()
479 ret.Level = UnitLevel("player"); 489 ret.Level = UnitLevel("player");
480 readHeartOfAzerothLevel(ret) 490 --readHeartOfAzerothLevel(ret)
481 491
482 local _, clsEn = UnitClass("player") 492 local _, clsEn = UnitClass("player")
483 ret.Class = clsEn; 493 ret.Class = clsEn;
484 494
485 local _, raceEn = UnitRace("player") 495 local _, raceEn = UnitRace("player")
498 ret.Specs = {} 508 ret.Specs = {}
499 ret.Talents = {} 509 ret.Talents = {}
500 readSpecs(ret) 510 readSpecs(ret)
501 511
502 -- these get updated later, since need to cache info for inactive specs 512 -- these get updated later, since need to cache info for inactive specs
503 ret.UnlockedEssences = {} 513 --ret.UnlockedEssences = {}
504 ret.Essences = {} 514 --ret.Essences = {}
505 515
506 ret.Equipped = {} 516 ret.Equipped = {}
507 readEquippedItems(ret) 517 readEquippedItems(ret)
508 518
509 return ret 519 return ret
549 local prevGemId = 0 559 local prevGemId = 0
550 local prevEnchantId = 0 560 local prevEnchantId = 0
551 local prevUpgradeId = 0 561 local prevUpgradeId = 0
552 local prevBonusId = 0 562 local prevBonusId = 0
553 local prevLevel = 0 563 local prevLevel = 0
554 local prevAzeriteId = 0 564 --local prevAzeriteId = 0
555 local prevRelicBonusId = 0 565 local prevRelicBonusId = 0
556 for i, itemData in ipairs(itemObjects) do 566 for i, itemData in ipairs(itemObjects) do
557 local itemParts = {} 567 local itemParts = {}
558 568
559 table.insert(itemParts, itemData.id - prevItemId) 569 table.insert(itemParts, itemData.id - prevItemId)
574 table.insert(itemParts, "b" .. (bValue - prevBonusId)) 584 table.insert(itemParts, "b" .. (bValue - prevBonusId))
575 prevBonusId = bValue 585 prevBonusId = bValue
576 end 586 end
577 end 587 end
578 588
589 --[[
579 if itemData.azerite then 590 if itemData.azerite then
580 for aIndex, aValue in ipairs(itemData.azerite) do 591 for aIndex, aValue in ipairs(itemData.azerite) do
581 table.insert(itemParts, "a" .. (aValue - prevAzeriteId)) 592 table.insert(itemParts, "a" .. (aValue - prevAzeriteId))
582 prevAzeriteId = aValue 593 prevAzeriteId = aValue
583 end 594 end
584 end 595 end
585 596 ]]
597
586 if itemData.gemIds[1] ~= 0 then 598 if itemData.gemIds[1] ~= 0 then
587 table.insert(itemParts, "x" .. (itemData.gemIds[1] - prevGemId)) 599 table.insert(itemParts, "x" .. (itemData.gemIds[1] - prevGemId))
588 prevGemId = itemData.gemIds[1] 600 prevGemId = itemData.gemIds[1]
589 end 601 end
590 if itemData.gemIds[2] ~= 0 then 602 if itemData.gemIds[2] ~= 0 then
669 raceval = Amr.FactionIds[data.Faction] 681 raceval = Amr.FactionIds[data.Faction]
670 if raceval == nil then raceval = 1 end 682 if raceval == nil then raceval = 1 end
671 table.insert(fields, raceval) 683 table.insert(fields, raceval)
672 684
673 table.insert(fields, data.Level) 685 table.insert(fields, data.Level)
674 table.insert(fields, data.HeartOfAzerothLevel) 686
675
676 local profs = {} 687 local profs = {}
677 local noprofs = true 688 local noprofs = true
678 if data.Professions then 689 if data.Professions then
679 for k, v in pairs(data.Professions) do 690 for k, v in pairs(data.Professions) do
680 local profval = Amr.ProfessionIds[k] 691 local profval = Amr.ProfessionIds[k]
696 for spec = 1, 4 do 707 for spec = 1, 4 do
697 if data.Specs[spec] and (complete or spec == data.ActiveSpec) then 708 if data.Specs[spec] and (complete or spec == data.ActiveSpec) then
698 table.insert(fields, ".s" .. spec) -- indicates the start of a spec block 709 table.insert(fields, ".s" .. spec) -- indicates the start of a spec block
699 table.insert(fields, data.Specs[spec]) 710 table.insert(fields, data.Specs[spec])
700 table.insert(fields, data.Talents[spec] or "") 711 table.insert(fields, data.Talents[spec] or "")
701 712 table.insert(fields, data.ActiveSoulbinds and data.ActiveSoulbinds[spec] or "0")
713
714 --[[
702 local essences = {} 715 local essences = {}
703 if data.Essences and data.Essences[spec] then 716 if data.Essences and data.Essences[spec] then
704 for i, ess in ipairs(data.Essences[spec]) do 717 for i, ess in ipairs(data.Essences[spec]) do
705 table.insert(essences, table.concat(ess, ".")) 718 table.insert(essences, table.concat(ess, "."))
706 end 719 end
707 end 720 end
708 table.insert(fields, table.concat(essences, "_")) 721 table.insert(fields, table.concat(essences, "_"))
722 ]]
709 end 723 end
710 end 724 end
711 725
712 -- export equipped gear 726 -- export equipped gear
713 if data.Equipped then 727 if data.Equipped then
724 appendItemsToExport(fields, itemObjects) 738 appendItemsToExport(fields, itemObjects)
725 end 739 end
726 end 740 end
727 end 741 end
728 742
743 -- export soulbind tree info
744 if data.Soulbinds then
745 table.insert(fields, ".sol")
746 for soulbindId, soulbindData in pairs(data.Soulbinds) do
747 table.insert(fields, string.format("u.%s.%s", soulbindId, soulbindData.UnlockedTier))
748 for tier, node in pairs(soulbindData.Nodes) do
749 table.insert(fields, table.concat(node, "."))
750 end
751 end
752 end
753
754 -- export unlocked conduits
755 if data.UnlockedConduits then
756 table.insert(fields, ".con")
757 for i, conduit in ipairs(data.UnlockedConduits) do
758 table.insert(fields, table.concat(conduit, "."))
759 end
760 end
761
762 --[[
729 -- export unlocked essences 763 -- export unlocked essences
730 if data.UnlockedEssences then 764 if data.UnlockedEssences then
731 table.insert(fields, ".ess") 765 table.insert(fields, ".ess")
732 for i, ess in ipairs(data.UnlockedEssences) do 766 for i, ess in ipairs(data.UnlockedEssences) do
733 table.insert(fields, table.concat(ess, "_")) 767 table.insert(fields, table.concat(ess, "_"))
734 end 768 end
735 end 769 end
736 770 ]]
771
737 -- if doing a complete export, include bank/bag items too 772 -- if doing a complete export, include bank/bag items too
738 if complete then 773 if complete then
739 774
740 local itemObjects = {} 775 local itemObjects = {}
741 if data.BagItems then 776 if data.BagItems then