From 19e3061a6eb9fa49ccbb3cf40b4732b859d6905a Mon Sep 17 00:00:00 2001 From: Mikeprod Date: Thu, 17 Nov 2016 20:40:39 +0100 Subject: [PATCH] Updated LibArtifactData-1.0 --- Libs/LibArtifactData-1.0/LibArtifactData-1.0.lua | 129 ++++++++++++---------- Libs/LibArtifactData-1.0/LibArtifactData-1.0.toc | 2 +- 2 files changed, 74 insertions(+), 57 deletions(-) diff --git a/Libs/LibArtifactData-1.0/LibArtifactData-1.0.lua b/Libs/LibArtifactData-1.0/LibArtifactData-1.0.lua index 3767d5f..eae1ba2 100644 --- a/Libs/LibArtifactData-1.0/LibArtifactData-1.0.lua +++ b/Libs/LibArtifactData-1.0/LibArtifactData-1.0.lua @@ -1,4 +1,4 @@ -local MAJOR, MINOR = "LibArtifactData-1.0", 7 +local MAJOR, MINOR = "LibArtifactData-1.0", 11 assert(_G.LibStub, MAJOR .. " requires LibStub") local lib = _G.LibStub:NewLibrary(MAJOR, MINOR) @@ -22,6 +22,7 @@ local _G = _G local BACKPACK_CONTAINER = _G.BACKPACK_CONTAINER local BANK_CONTAINER = _G.BANK_CONTAINER local INVSLOT_MAINHAND = _G.INVSLOT_MAINHAND +local LE_ITEM_CLASS_ARMOR = _G.LE_ITEM_CLASS_ARMOR local LE_ITEM_CLASS_WEAPON = _G.LE_ITEM_CLASS_WEAPON local LE_ITEM_QUALITY_ARTIFACT = _G.LE_ITEM_QUALITY_ARTIFACT local NUM_BAG_SLOTS = _G.NUM_BAG_SLOTS @@ -66,9 +67,6 @@ local frame = lib.frame frame:UnregisterAllEvents() -- deactivate old versions frame:SetScript("OnEvent", function(_, event, ...) private[event](event, ...) end) frame:RegisterEvent("PLAYER_ENTERING_WORLD") -frame:RegisterEvent("ARTIFACT_CLOSE") -frame:RegisterEvent("ARTIFACT_XP_UPDATE") -frame:RegisterUnitEvent("PLAYER_SPECIALIZATION_CHANGED", "player") local function CopyTable(tbl) if not tbl then return {} end @@ -242,79 +240,86 @@ local function GetViewedArtifactData() end end +local function ScanEquipped() + if HasArtifactEquipped() then + PrepareForScan() + SocketInventoryItem(INVSLOT_MAINHAND) + GetViewedArtifactData() + Clear() + RestoreStateAfterScan() + frame:UnregisterEvent("UNIT_INVENTORY_CHANGED") + end +end + local function ScanContainer(container, numObtained) for slot = 1, GetContainerNumSlots(container) do local _, _, _, quality, _, _, _, _, _, itemID = GetContainerItemInfo(container, slot) if quality == LE_ITEM_QUALITY_ARTIFACT then local classID = select(12, GetItemInfo(itemID)) - if classID == LE_ITEM_CLASS_WEAPON then + if classID == LE_ITEM_CLASS_WEAPON or classID == LE_ITEM_CLASS_ARMOR then Debug("ARTIFACT_FOUND", "in", container, slot) SocketContainerItem(container, slot) GetViewedArtifactData() Clear() - numObtained = numObtained - 1 - if numObtained <= 0 then break end + if numObtained <= lib:GetNumObtainedArtifacts() then break end end end end - - return numObtained end local function IterateContainers(from, to, numObtained) + PrepareForScan() for container = from, to do - numObtained = ScanContainer(container, numObtained) - if numObtained <= 0 then break end + ScanContainer(container, numObtained) + if numObtained <= lib:GetNumObtainedArtifacts() then break end end - - return numObtained + RestoreStateAfterScan() end local function ScanBank(numObtained) - PrepareForScan() - numObtained = ScanContainer(BANK_CONTAINER, numObtained) - if numObtained > 0 then + if numObtained > lib:GetNumObtainedArtifacts() then + PrepareForScan() + ScanContainer(BANK_CONTAINER, numObtained) + RestoreStateAfterScan() + end + if numObtained > lib:GetNumObtainedArtifacts() then IterateContainers(NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS, numObtained) end - RestoreStateAfterScan() end -local function InitializeScan(event) - if _G.ArtifactFrame and _G.ArtifactFrame:IsShown() then - Debug("InitializeScan", "aborted because ArtifactFrame is open.") - return - end +function private.PLAYER_ENTERING_WORLD(event) + frame:UnregisterEvent(event) + frame:RegisterUnitEvent("UNIT_INVENTORY_CHANGED", "player") + frame:RegisterEvent("BAG_UPDATE_DELAYED") + frame:RegisterEvent("BANKFRAME_OPENED") + frame:RegisterEvent("PLAYER_EQUIPMENT_CHANGED") + frame:RegisterEvent("CURRENCY_DISPLAY_UPDATE") + frame:RegisterEvent("ARTIFACT_CLOSE") + frame:RegisterEvent("ARTIFACT_XP_UPDATE") + frame:RegisterUnitEvent("PLAYER_SPECIALIZATION_CHANGED", "player") +end - local numObtained = GetNumObtainedArtifacts() -- not available at cold login - Debug("InitializeScan", event, "numObtained", numObtained) +-- bagged artifact data becomes obtainable +function private.BAG_UPDATE_DELAYED(event) + local numObtained = GetNumObtainedArtifacts() + if numObtained <= 0 then return end - if numObtained > 0 then - PrepareForScan() - if HasArtifactEquipped() then -- scan equipped - SocketInventoryItem(INVSLOT_MAINHAND) - GetViewedArtifactData() - Clear() - numObtained = numObtained - 1 - end - if numObtained > 0 then -- scan bags - numObtained = IterateContainers(BACKPACK_CONTAINER, NUM_BAG_SLOTS, numObtained) - end - if numObtained > 0 then -- scan bank - frame:RegisterEvent("BANKFRAME_OPENED") - Debug("ARTIFACT_DATA_MISSING", "artifact", numObtained) - lib.callbacks:Fire("ARTIFACT_DATA_MISSING", numObtained) - end - RestoreStateAfterScan() + -- prevent double-scanning if UNIT_INVENTORY_CHANGED fired first + -- UNIT_INVENTORY_CHANGED does not fire after /reload + if not equippedID and HasArtifactEquipped() then + ScanEquipped() + end + + if numObtained > lib:GetNumObtainedArtifacts() then + IterateContainers(BACKPACK_CONTAINER, NUM_BAG_SLOTS, numObtained) end -end -function private.PLAYER_ENTERING_WORLD(event) frame:UnregisterEvent(event) - _G.C_Timer.After(5, function() - InitializeScan(event) - frame:RegisterEvent("PLAYER_EQUIPMENT_CHANGED") - frame:RegisterEvent("CURRENCY_DISPLAY_UPDATE") - end) +end + +-- equipped artifact data becomes obtainable +function private.UNIT_INVENTORY_CHANGED(event) + ScanEquipped(event) end function private.ARTIFACT_CLOSE() @@ -326,6 +331,10 @@ function private.ARTIFACT_UPDATE(event, newItem) if newItem then GetViewedArtifactData() else + if not GetNumRelicSlots() then + Debug("|cffff0000ERROR:|r", "artifact data unobtainable.") + return + end local newRelics = ScanRelics() local oldRelics = artifacts[viewedID].relics @@ -353,9 +362,9 @@ function private.ARTIFACT_XP_UPDATE(event) local artifact = artifacts[itemID] if not artifact then - Debug("|cffff0000ERROR:|r", "artifact", itemID, "not found.") - return + return lib.ForceUpdate() end + local diff = unspentPower - artifact.unspentPower if numRanksPurchased ~= artifact.numRanksPurchased then @@ -378,8 +387,8 @@ function private.ARTIFACT_XP_UPDATE(event) end function private.BANKFRAME_OPENED() - local numObtained = lib:GetNumObtainedArtifacts() - if numObtained ~= GetNumObtainedArtifacts() then + local numObtained = GetNumObtainedArtifacts() + if numObtained > lib:GetNumObtainedArtifacts() then ScanBank(numObtained) end end @@ -398,7 +407,7 @@ function private.PLAYER_EQUIPMENT_CHANGED(event, slot) local itemID = GetEquippedArtifactInfo() if itemID and not artifacts[itemID] then - InitializeScan(event) + ScanEquipped(event) end InformEquippedArtifactChanged(itemID) @@ -475,7 +484,7 @@ function lib.GetAcquiredArtifactPower(_, artifactID) local data = artifacts[artifactID] total = total + data.unspentPower local rank = 1 - while rank <= data.numRanksPurchased do + while rank < data.numRanksPurchased do total = total + GetCostForPointAtRank(rank) rank = rank + 1 end @@ -487,7 +496,7 @@ function lib.GetAcquiredArtifactPower(_, artifactID) if tonumber(itemID) then total = total + data.unspentPower local rank = 1 - while rank <= data.numRanksPurchased do + while rank < data.numRanksPurchased do total = total + GetCostForPointAtRank(rank) rank = rank + 1 end @@ -498,5 +507,13 @@ function lib.GetAcquiredArtifactPower(_, artifactID) end function lib.ForceUpdate() - InitializeScan("FORCE_UPDATE") + if _G.ArtifactFrame and _G.ArtifactFrame:IsShown() then + Debug("ForceUpdate", "aborted because ArtifactFrame is open.") + return + end + local numObtained = GetNumObtainedArtifacts() + if numObtained > 0 then + ScanEquipped("FORCE_UPDATE") + IterateContainers(BACKPACK_CONTAINER, NUM_BAG_SLOTS, numObtained) + end end diff --git a/Libs/LibArtifactData-1.0/LibArtifactData-1.0.toc b/Libs/LibArtifactData-1.0/LibArtifactData-1.0.toc index 57abd20..38b1b08 100644 --- a/Libs/LibArtifactData-1.0/LibArtifactData-1.0.toc +++ b/Libs/LibArtifactData-1.0/LibArtifactData-1.0.toc @@ -1,4 +1,4 @@ -## Interface: 70000 +## Interface: 70100 ## Title: Lib: ArtifactData-1.0 ## Notes: Provides data about all artifacts in the player's possession. ## Author: Rainrider -- 1.7.9.5