changeset 133:86621c60512b v7.3.2-20171222

- Fixed AP calc tooltip appearing while hidden - Fixed PaperDoll relic tooltips missing nether crucible info
author Nenue
date Fri, 22 Dec 2017 20:36:40 -0500
parents 4cb1d2a0c110
children 24dc16a49b15
files Modules/ArtifactPower.lua Modules/Currency.lua Modules/GuildInfo.lua Modules/GuildInfo.xml Modules/PaperDoll.lua Modules/PaperDoll.xml
diffstat 6 files changed, 480 insertions(+), 108 deletions(-) [+]
line wrap: on
line diff
--- a/Modules/ArtifactPower.lua	Mon Nov 20 12:02:18 2017 -0500
+++ b/Modules/ArtifactPower.lua	Fri Dec 22 20:36:40 2017 -0500
@@ -402,6 +402,7 @@
   end
 end
 
+local hasShownHeaderTip
 function Module:OnUpdate()
   if #self.scanQueue >= 1 then
     local scanInfo = tremove(self.scanQueue, 1)
@@ -412,6 +413,42 @@
     self.Refresh:Hide()
   end
 
+  if self.SummaryHeader:IsMouseOver() and self:IsShown() then
+    if not hasShownHeaderTip then
+      hasShownHeaderTip = true
+      GameTooltip:SetOwner(self, 'ANCHOR_BOTTOM')
+      GameTooltip:AddLine("World Quests")
+
+      for zone, data in pairs(self.apQuests) do
+
+        if #data >= 1 then
+        GameTooltip:AddLine(zone)
+        for i, quest in ipairs(data) do
+
+          if IsQuestComplete(quest[1]) then
+            GameTooltip:AddDoubleLine(quest[2], ShortNumberString(quest[3]), 0.5,0.5,0.5, 0.5,0.5,0.5)
+          else
+            GameTooltip:AddDoubleLine(quest[2], ShortNumberString(quest[3]), 1,1,1, 0,1,0)
+
+          end
+
+        end
+        end
+
+
+      end
+
+      GameTooltip:Show()
+    end
+  else
+    if GameTooltip:IsOwned(self) then
+      hasShownHeaderTip = nil
+      GameTooltip:Hide()
+    end
+
+  end
+
+
 end
 
 function Module:OnMouseDown(button)
@@ -492,6 +529,7 @@
   self:Reanchor()
 end
 
+Module.apQuests = {}
 function Module:GetContinentAP(mapAreaID)
 
   for zoneIndex = 1, C_MapCanvas.GetNumZones(mapAreaID) do
@@ -500,28 +538,39 @@
     if zoneDepth <= 1 then -- Exclude subzones
       local taskInfo = C_TaskQuest.GetQuestsForPlayerByMapID(zoneMapID, mapAreaID, (mapAreaID == 1184) and 1 or nil);
 
+      self.apQuests[zoneName] = self.apQuests[zoneName] or {}
+      wipe(self.apQuests[zoneName])
+
       if taskInfo then
         for i, info in ipairs(taskInfo) do
           local questID = info.questId
 
           local questTitle, factionID, capped = C_TaskQuest.GetQuestInfoByQuestID(questID)
-          --print(questTitle, HaveQuestRewardData(questID))
-          if HaveQuestRewardData(questID) and not IsQuestComplete(questID) then
+          if HaveQuestRewardData(questID) then
 
 
               for i = 1, GetNumQuestLogRewards(questID) or 0 do
                 local name, texture, numItems, quality, isUsable, itemID = GetQuestLogRewardInfo(i, questID)
                 if IsArtifactPowerItem(itemID) then
+
+                  print(questTitle, HaveQuestRewardData(questID))
                   local _, link = GetItemInfo(itemID)
                   if link then
                     local ap = self:GetItemAP(itemID, link)
                     --print('ap =', ap)
                     if ap then
-                      self.worldQuestAP = self.worldQuestAP + ap
-                      if mapAreaID == ZONE_ID_ARGUS then
-                        self.argusAP = self.argusAP + ap
+
+                      if not IsQuestComplete(questID) then
+                        self.worldQuestAP = self.worldQuestAP + ap
+                        if mapAreaID == ZONE_ID_ARGUS then
+                          self.argusAP = self.argusAP + ap
+                        end
                       end
 
+
+                      tinsert(self.apQuests[zoneName], {questID, questTitle, ap})
+
+
                     end
 
                     self.worldQuestItems[itemID] = (self.worldQuestItems[itemID] or 0) + 1
@@ -549,7 +598,7 @@
   self.worldQuestAP = 0
   self.argusAP = 0
   wipe(self.worldQuestItems)
-
+  wipe(self.apQuests)
   self:GetContinentAP(ZONE_ID_BROKEN_ISLE)
   self:GetContinentAP(ZONE_ID_ARGUS)
 
--- a/Modules/Currency.lua	Mon Nov 20 12:02:18 2017 -0500
+++ b/Modules/Currency.lua	Fri Dec 22 20:36:40 2017 -0500
@@ -14,14 +14,10 @@
 local currencyBlock = {}
 
 
-local zoneEvents = {
-  "ZONE_CHANGED_NEW_AREA", "ZONE_CHANGED_INDOORS", "ZONE_CHANGED"
-}
-local currencyEvents = {
-  'CURRENCY_DISPLAY_UPDATE', 'CHAT_MSG_CURRENCY'
-}
-local itemEvents = {
-  'CHAT_MSG_LOOT', 'BAG_UPDATE'
+local events = {
+  'CHAT_MSG_LOOT',
+  "ZONE_CHANGED_NEW_AREA", "ZONE_CHANGED_INDOORS", "ZONE_CHANGED",
+  'BAG_UPDATE', 'CURRENCY_DISPLAY_UPDATE', 'CHAT_MSG_CURRENCY',
 }
 
 local blocks = {
@@ -87,6 +83,11 @@
 function module:OnLoad ()
   Veneer:AddHandler(self)
 
+  for _, event in ipairs(events) do
+    self:RegisterEvent(event)
+  end
+
+
   for name, info in pairs(blocks) do
     local block = CreateFrame('Frame', nil, self, 'VeneerCurrencyTemplate')
     block.name = name
@@ -100,6 +101,8 @@
     end
     block.id = info.itemID or info.currencyID
 
+    block:SetScript('OnEnter', itemBlock.OnEnter or block.OnEnter)
+    block:SetScript('OnLeave', itemBlock.OnLeave or block.OnLeave)
 
     if info.itemID then
       local itemID = info.itemID
@@ -108,17 +111,14 @@
         frame = block
       }
       block.Update = itemBlock.Update
-      RegisterEvents(block, itemEvents)
     elseif info.currencyID then
       local currencyID = info.currencyID
       block.Update = currencyBlock.Update
-      RegisterEvents(self, currencyEvents)
     end
 
 
 
     if info.zones then
-      RegisterEvents(self, zoneEvents)
       local zones = info.zones
       local of = block.Update
       function block:Update()
@@ -157,7 +157,6 @@
   end
 
   local canShow = false
-
   if BagBrother then
     for i, bag in pairs(BagBrother.Player) do
       if type(bag) == 'table' then
@@ -193,6 +192,7 @@
         local itemID = GetContainerItemID(i, j)
         local texture, count = GetContainerItemInfo(i,j)
         if items[itemID] then
+
           items[itemID].count = items[itemID].count + (count or 1)
           if not items[itemID].texture then
             items[itemID].texture = texture
@@ -278,13 +278,6 @@
   end
 end
 
-function block:OnEvent(event, ...)
-  self.debug('OnEvent', event, ...)
-  self:Update()
-end
-
-function block:Setup()
-end
 
 function itemBlock:Update()
   if items[self.itemID].count >= 1 then
--- a/Modules/GuildInfo.lua	Mon Nov 20 12:02:18 2017 -0500
+++ b/Modules/GuildInfo.lua	Fri Dec 22 20:36:40 2017 -0500
@@ -18,7 +18,7 @@
   --self:RegisterEvent('GUILD_ROSTER_UPDATE')
   --self:RegisterEvent('GUILD_TRADESKILL_UPDATE')
 
-  self:RegisterEvent('LFG_LIST_SEARCH_RESULT_UPDATED')
+  --self:RegisterEvent('LFG_LIST_SEARCH_RESULT_UPDATED')
   --self:RegisterEvent('LFG_LIST_SEARCH_RESULTS_RECEIVED')
   --self:RegisterEvent('LFG_LIST_AVAILABILITY_UPDATE')
   --self:RegisterEvent('LFG_LIST_LOCK_INFO_RECEIVED')
@@ -74,12 +74,25 @@
 -- cheevos to link
 local overlaps = {
   [11781] = 11875,
-
-
+  [12002] = 12111,
 }
 local cheevos = {
-  -- Mythic Prog: Tomb
+  -- Mythic Prog
   {
+    -- Antorus
+    12002, -- argus
+    12001, -- aggramar
+    12000, -- coven
+    11999, -- barry
+    11998, -- kin'garoth
+    11997, -- imonar
+    11996, -- eonar
+    11995, -- portal keeper
+    11994, -- high command
+    11993, -- doggos
+    11992, -- worldbreaker
+
+    -- Tomb of Sargeras
     11781, -- kj
     11780, -- avatar
     11779, -- maiden
@@ -90,8 +103,10 @@
     11774, -- di,
     11773, -- goroth
   },
-  -- Completion: Tomb
+  -- Completion
   {
+    12111, -- CE Argus,
+    12110, -- AotC Argus,
     11875, -- CE KJ
     11874, -- AotC KJ
     11790 -- Deceiver's Fall,
@@ -105,6 +120,7 @@
   }
 }
 
+local invasion = {}
 local cheev = {}
 
 function cheev:OnClick()
@@ -119,6 +135,15 @@
   end
 end
 
+function invasion:OnClick()
+
+end
+
+function module:UpdateInvasionButtons()
+
+end
+
+local listed = {}
 
 function module:UpdateAchievementLinks()
   print('UpdateAchievementLinks()')
@@ -134,6 +159,13 @@
     for _, id in ipairs(group) do
     local _, name, points, completed, month, day, year, description, flags, icon = GetAchievementInfo(id)
       if completed then
+
+        -- if the highest mythic kill
+         if listed[overlaps[id]] then
+           break
+         end
+
+
         index = index + 1
         --print(index)
         local block =self.blocks[index]
@@ -160,11 +192,36 @@
 
         --print(index, name, icon)
         lastBlock = block
+        listed[id] = true
         break;
       end
     end
   end
 
+--[[
+  local areaPOIs = C_WorldMap.GetAreaPOIForMap(GetCurrentMapAreaID(), 1);
+  if areaPOIs then
+
+
+    for i, areaPoiID in ipairs(areaPOIs) do
+      local poiInfo = C_WorldMap.GetAreaPOIInfo(GetCurrentMapAreaID(), areaPoiID, 1);
+
+      index = index + 1
+      --print(index)
+      local block =self.blocks[index]
+      if not block then
+        block = CreateFrame('Button', 'VeneerRosterKunBlock'..index, self, 'VeneerRosterKunBlock')
+        block:SetScript('OnClick', invasion.OnClick)
+        block:SetID(index)
+        self.blocks[index] = block
+      end
+
+
+
+    end
+  end
+ --]]
+
   --print(index,  #self.blocks)
   if index < #self.blocks then
     for i = index+1, #self.blocks do
@@ -188,6 +245,7 @@
     self:UpdateAchievementLinks()
   end
 
+
 end
 function module:SetupGuildUI()
   self:UnregisterEvent('ADDON_LOADED')
@@ -203,3 +261,143 @@
   elseif event == 'LFG_LIST_SEARCH_RESULT_UPDATED' then
   end
 end
+
+
+VeneerPetBattleActionMixin = {}
+VeneerPetBattleInfoMixin = {}
+local pb = VeneerPetBattleInfoMixin
+local action = VeneerPetBattleActionMixin
+
+
+function pb:OnShow()
+  self:ClearAllPoints()
+  self:SetPoint('TOPLEFT', PetBattleFrame.EnemyBuffFrame, 'BOTTOMLEFT', 0, -12)
+  self:RegisterEvent('PET_BATTLE_PET_ROUND_PLAYBACK_COMPLETE')
+  self:RegisterEvent('PET_BATTLE_ACTION_SELECTED')
+  self:RegisterEvent('PET_BATTLE_TURN_STARTED')
+  print('pet on show')
+  self:Refresh()
+end
+
+function pb:OnHide()
+  print('pet on hide')
+  self:UnregisterAllEvents()
+end
+
+function pb:OnEvent(event)
+  print('pb event|cFFFF8800', event)
+  self:Refresh()
+end
+
+function pb:Refresh()
+  local myPetSlot = C_PetBattles.GetActivePet(1)
+  local myPetType = C_PetBattles.GetPetType(1, myPetSlot)
+
+  local index = 0
+  local nonActiveIndex = 0
+  local lastFrame, lastNonActive
+  for petSlot = 1, C_PetBattles.GetNumPets(2) do
+
+    for abilitySlot = 1,3 do
+      local _, name, texture, cooldown, tooltip,_, abilityType, noStrongWeakHints = C_PetBattles.GetAbilityInfo(2, petSlot, abilitySlot)
+      local petHealth = C_PetBattles.GetHealth(2, petSlot)
+
+      if petHealth >= 1 then
+        local isUsable, currentCooldown, currentLockdown = C_PetBattles.GetAbilityState(2, petSlot, abilitySlot);
+        --print(index, petSlot, abilitySlot, name, currentCooldown, currentLockdown, cooldown, petHealth)
+
+        index = index + 1
+        local frame = self.Abilities[index]
+
+        frame.ownerID = 2
+        frame.petIndex = petSlot
+        frame.abIndex = abilitySlot
+        frame.tooltip = tooltip
+        frame.Name:SetText(name)
+        frame.Icon:SetTexture(texture)
+        frame.TypeIcon:SetTexture("Interface\\PetBattles\\PetIcon-"..PET_TYPE_SUFFIX[abilityType])
+
+
+        for i = 1,C_PetBattles.GetNumPets(1) do
+          local myPetType = C_PetBattles.GetPetType(1, i)
+          if not (myPetType or abilityType) then
+            frame.BetterIcon[i]:Hide();
+          else
+            local modifier = C_PetBattles.GetAttackModifier(abilityType, myPetType)
+            if ( noStrongWeakHints or modifier == 1 ) then
+              frame.BetterIcon[i]:Hide();
+            elseif (modifier > 1) then
+              frame.BetterIcon[i]:SetTexture("Interface\\PetBattles\\BattleBar-AbilityBadge-Strong");
+              frame.BetterIcon[i]:Show();
+            elseif (modifier < 1) then
+              frame.BetterIcon[i]:SetTexture("Interface\\PetBattles\\BattleBar-AbilityBadge-Weak");
+              frame.BetterIcon[i]:Show();
+            end
+
+          end
+        end
+
+
+        if cooldown >= 1 then
+          frame.Border2:Show()
+        else
+
+          frame.Border2:Hide()
+        end
+
+
+        currentCooldown = (currentCooldown >= 1) and currentCooldown or 0
+        if petHealth == 0 then
+          frame.Cooldown:SetText(nil)
+          frame.Cooldown:SetTextColor(1,0,0)
+        else
+          if currentLockdown >= 1 and currentLockdown > currentCooldown then
+            frame.Cooldown:SetTextColor(1,0,0)
+          else
+            frame.Cooldown:SetTextColor(1,1,1)
+          end
+          frame.Cooldown:SetText((currentCooldown >= 1) and currentCooldown or nil)
+        end
+
+        frame:ClearAllPoints()
+        if petSlot ==  C_PetBattles.GetActivePet(2) then
+          frame:SetSize(48,48)
+          frame.Border2:SetSize(72,72)
+          frame.Icon:SetDesaturated(false)
+          frame.Name:SetTextColor(1,1,0)
+          if lastFrame then
+            frame:SetPoint('TOPLEFT', lastFrame, 'BOTTOMLEFT', 0, -4)
+          else
+            frame:SetPoint('TOPLEFT', self, 'TOPLEFT')
+          end
+          lastFrame = frame
+        else
+          frame:SetSize(24,24)
+          frame.Border2:SetSize(36,36)
+          frame.Name:SetTextColor(0.5,0.5,0.5)
+          frame.Icon:SetDesaturated(true)
+          if lastNonActive then
+            frame:SetPoint('TOPLEFT', lastNonActive, 'BOTTOMLEFT', 0, -2)
+          else
+            frame:SetPoint('TOPLEFT', self, 'TOPLEFT', 128, 0)
+          end
+          lastNonActive = frame
+        end
+        frame:Show()
+      end
+    end
+  end
+
+  for i = index + 1, #self.Abilities do
+    self.Abilities[i]:Hide()
+  end
+end
+
+function action:OnEnter()
+  PetBattleAbilityTooltip_SetAbility(self.ownerID, self.petIndex, self.abIndex);
+  PetBattleAbilityTooltip_Show("TOPRIGHT", self:GetParent(), "TOPLEFT", -5, 0, self.additionalText);
+end
+
+function action:OnLeave()
+  PetBattlePrimaryAbilityTooltip:Hide();
+end
\ No newline at end of file
--- a/Modules/GuildInfo.xml	Mon Nov 20 12:02:18 2017 -0500
+++ b/Modules/GuildInfo.xml	Fri Dec 22 20:36:40 2017 -0500
@@ -41,4 +41,91 @@
     </HighlightTexture>
   </Button>
 
-  </Ui>
\ No newline at end of file
+
+  <Frame name="VeneerPetBattleAbilityTemplate" parent="VeneerPetBattleInfo" parentArray="Abilities" virtual="true" mixin="VeneerPetBattleActionMixin">
+    <Size x="48" y="48" />
+    <Scripts>
+      <OnEnter method="OnEnter" />
+      <OnLeave method="OnLeave" />
+    </Scripts>
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture parentKey="Icon" setAllPoints="true" />
+
+      </Layer>
+      <Layer level="OVERLAY">
+        <Texture parentArray="BetterIcon">
+          <Size x="24" y="24" />
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT" />
+          </Anchors>
+        </Texture>
+        <Texture parentArray="BetterIcon">
+          <Size x="24" y="24" />
+          <Anchors>
+            <Anchor  point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT" x="26" y="0" />
+          </Anchors>
+        </Texture>
+        <Texture parentArray="BetterIcon">
+          <Size x="24" y="24" />
+          <Anchors>
+            <Anchor  point="BOTTOMLEFT" relativePoint="BOTTOMRIGHT" x="54" y="0" />
+          </Anchors>
+        </Texture>
+        <FontString parentKey="Name" inherits="GameFontNormal">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativePoint="TOPRIGHT" x="4" y="-4" />
+          </Anchors>
+        </FontString>
+        <FontString parentKey="Cooldown" inherits="GameFont_Gigantic">
+          <Anchors>
+            <Anchor point="CENTER" />
+          </Anchors>
+        </FontString>
+
+        <Texture parentKey="TypeIcon">
+          <Size x="16" y="16" />
+          <TexCoords left="0.79687500" right="0.49218750" top="0.50390625" bottom="0.65625000"/>
+          <Anchors>
+            <Anchor point="TOPRIGHT" />
+
+          </Anchors>
+        </Texture>
+
+        <Texture setAllPoints="true" hidden="true" file="">
+
+        </Texture>
+        <Texture parentKey="Border2" file="Interface\PetBattles\PetBattle-GoldSpeedFrame" hidden="true">
+          <Size x="48" y="48"/>
+          <Anchors>
+            <Anchor point="CENTER" relativeKey="$parent.Icon"/>
+          </Anchors>
+          <TexCoords left="0.0" right="0.84375" top="0.0" bottom="0.8515625"/>
+        </Texture>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Frame name="VeneerPetBattleInfo" parent="PetBattleFrame" hidden="false" mixin="VeneerPetBattleInfoMixin">
+    <Size x="128" y="64" />
+    <Scripts>
+      <OnLoad method="OnLoad" />
+      <OnEvent method="OnEvent" />
+      <OnShow method="OnShow" />
+      <OnHide method="OnHide" />
+    </Scripts>
+    <Frames>
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+      <Frame inherits="VeneerPetBattleAbilityTemplate" />
+    </Frames>
+  </Frame>
+
+
+</Ui>
\ No newline at end of file
--- a/Modules/PaperDoll.lua	Mon Nov 20 12:02:18 2017 -0500
+++ b/Modules/PaperDoll.lua	Fri Dec 22 20:36:40 2017 -0500
@@ -87,6 +87,8 @@
   self:RegisterEvent('ARTIFACT_UPDATE')
 
   self:MarkForUpdate()
+
+
 end
 
 function VeneerPaperDollMixin:MarkForUpdate()
@@ -158,8 +160,6 @@
   end
 end
 
-
-
 function VeneerPaperDollMixin:OnEvent(event, arg)
   print(event, arg)
   if event == 'ADDON_LOADED' then
@@ -171,12 +171,13 @@
       self:MarkForUpdate()
     end
   elseif event == 'ARTIFACT_UPDATE' then
+    self:ScoopRelics()
     if artifactSlot then
-      artifactSlot:Update(true)
+      artifactSlot.isDirty = true
     end
   elseif event == 'ARTIFACT_RELIC_INFO_RECEIVED' then
     if artifactSlot then
-      artifactSlot:Update(true)
+      artifactSlot.isDirty = true
     end
   else
     if (event == 'PLAYER_SPECIALIZATION_CHANGED' or event == 'UNIT_INVENTORY_CHANGED') then
@@ -195,12 +196,20 @@
   self.SocketText = {}
   self.SocketType = {}
   self.SocketLink = {}
+  self.SocketForge = {}
 end
 function VeneerPaperDollSlotMixin:OnShow()
   if self.isDirty then
     self:Update()
   end
 end
+
+function VeneerPaperDollSlotMixin:OnHide()
+  if GameTooltip:IsOwned(self) then
+    GameTooltip:Hide()
+  end
+end
+
 function VeneerPaperDollSlotMixin:OnUpdate()
   if self.isDirty then
     --print('|cFF00FF00pushing update for', self:GetID())
@@ -208,28 +217,29 @@
   end
 
   if self.checkRelic then
-    self.tooltipLink = nil
+    local setTip
     for i = 1, 3 do
-      if self.SocketLink[i] and self.Sockets.SocketIcon[i]:IsMouseOver() then
-        self.tooltipLink = self.SocketLink[i]
+      if self.SocketType[i] and self.Sockets.SocketIcon[i]:IsMouseOver() then
+        setTip = self.SocketForge[i]
       end
     end
-
-    if self.tooltipLink then
-      if not GameTooltip:IsOwned(self) then
-        GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
-        GameTooltip:SetHyperlink(self.tooltipLink)
-
-        GameTooltip:Show()
+    if setTip then
+      GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
+      for _, info in ipairs(setTip) do
+        if type(info) == 'table' then
+          GameTooltip:AddLine(unpack(info))
+        elseif type(info) == 'string' then
+          GameTooltip:AddLine(info)
+        end
       end
-    else
-      if GameTooltip:IsOwned(self) then
-        GameTooltip:Hide()
-      end
+      GameTooltip:Show()
+    elseif GameTooltip:IsOwned(self) then
+      GameTooltip:Hide()
     end
   end
 end
 
+local tooltipName= 'VeneerPaperDollTooltip'
 function VeneerPaperDollSlotMixin:UpdateRelicInfo()
 
 
@@ -237,9 +247,46 @@
   if not itemID then
     return
   end
-  print('|cFF00FFFFRelic Sweep:', itemID)
 
+  print('|cFF00FFFFRelic Info:', itemID)
+  local guid = UnitGUID(self.unit or 'player')
+  local relicCache = VeneerPaperDoll.KnownRelics[guid] and VeneerPaperDoll.KnownRelics[guid][itemID]
 
+  if not relicCache then
+    relicCache = {}
+    VeneerPaperDoll.KnownRelics[guid] = VeneerPaperDoll.KnownRelics[guid] or {}
+    VeneerPaperDoll.KnownRelics[guid][itemID] = relicCache
+  end
+
+  for i = 1, 3 do
+    if relicCache[i] then
+      local relicIcon, relicLevel, relicType, relicLink, relicForge = unpack(relicCache[i])
+
+      print('reading', i, unpack(relicCache[i]))
+      self.SocketInfo[i] = relicIcon
+      self.SocketText[i] = relicLevel
+      self.SocketType[i] = relicType
+      self.SocketLink[i] = relicLink
+      self.SocketForge[i] = self.SocketForge[i] or {}
+      if relicForge then
+        for l, info in ipairs(relicForge) do
+          self.SocketForge[i][l] = info
+        end
+      end
+
+    end
+  end
+end
+
+function VeneerPaperDollMixin:ScoopRelics()
+
+  -- not a viewed artifact
+  local itemID = C_ArtifactUI.GetArtifactInfo()
+  if not itemID then
+    return
+  end
+
+  print('|cFFFF00FFScoopRelics:|r', itemID)
   local guid = UnitGUID(self.unit or 'player')
   local relicCache = VeneerPaperDoll.KnownRelics[guid] and VeneerPaperDoll.KnownRelics[guid][itemID]
   if VeneerPaperDoll.KnownRelics[guid] then
@@ -260,56 +307,52 @@
   local numRelics = C_ArtifactUI.GetNumRelicSlots()
   local isEquipped = C_ArtifactUI.IsViewedArtifactEquipped()
   local tooltip = VeneerPaperDollTooltip
-  tooltip:SetOwner(self, 'ANCHOR_NONE')
-  self.hasRelicSlots = true
-  if numRelics and isEquipped then
-    print('Relic Query:', itemID, numRelics)
-    for i = 1, numRelics do
-      local relicName, relicIcon, relicType, relicLink = C_ArtifactUI.GetRelicInfo(i);
-      local relicType = C_ArtifactUI.GetRelicSlotType(i);
-      print(relicType)
-      if relicType then
-        if relicLink then
-        tooltip:SetHyperlink(relicLink)
-          print(tooltip:NumLines())
 
-          local line1 = _G['VeneerPaperDollTooltipTextLeft2']
-          local line2 = _G['VeneerPaperDollTooltipTextLeft3']
-          local text1 = line1 and line1:GetText()
-          local text2 = line2 and line2:GetText()
-          if text1 or text2 then
-            self.SocketText[i] = text1:match('Item Level (%d+)') or text2:match('Item Level (%d+)')
+  for i = 1, numRelics do
+    local relicName, relicIcon, relicType, relicLink = C_ArtifactUI.GetRelicInfo(i);
+    local relicLevel = relicCache[i][2] or ""
+    local relicForge = relicCache[i][5] or {}
+    local relicType = C_ArtifactUI.GetRelicSlotType(i);
+
+    if relicType then
+      if relicLink then
+        tooltip:SetSocketedRelic(i)
+        print(tooltip:NumLines())
+
+        local numLines = tooltip:NumLines()
+        if numLines >= 1 then
+          wipe(relicForge)
+          local foundRank = 0
+          for line = 1, numLines do
+            --print( _G[tooltipName .. 'TextLeft' .. line]:GetText(), _G[tooltipName .. 'TextLeft' .. line]:GetTextColor())
+            local lineText = _G[tooltipName .. 'TextLeft' .. line]:GetText()
+
+            if lineText then
+              local iLevel = lineText:match('Item Level (%d+)')
+              local rank = lineText:match('+1 Rank: (.+)')
+
+              if iLevel then
+                relicLevel = iLevel
+                print('iLevel = ',iLevel)
+              end
+
+              tinsert(relicForge, {lineText, _G[tooltipName .. 'TextLeft' .. line]:GetTextColor()})
+            end
           end
         end
-
-        self.SocketInfo[i] = relicIcon or 0
-        self.SocketType[i] = relicType
-        self.SocketLink[i] = relicLink
-        print('storing', i, self.SocketInfo[i], self.SocketText[i], self.SocketType[i], self.SocketLink[i])
-      else
-
-
-        self.SocketInfo[i] = "Interface\\CharacterFrame\\TempPortraitAlphaMask"
-        self.SocketType[i] = nil
-        self.SocketLink[i] = nil
       end
 
-      relicCache[i] = {self.SocketInfo[i], self.SocketText[i], self.SocketType[i], self.SocketLink[i]}
-    end
-  else
+      print('storing', i, relicIcon, relicLevel, relicType, relicLink, relicForge)
 
-    for i = 1, 3 do
-      if relicCache[i] then
-        local relicIcon, relicText, relicType, relicLink = unpack(relicCache[i])
-
-        print('loading', i, relicIcon, relicText, relicType, relicLink)
-        self.SocketInfo[i] = relicIcon
-        self.SocketText[i] = relicText
-        self.SocketType[i] = relicType
-        self.SocketLink[i] = relicLink
-      end
+      relicCache[i] = {relicIcon, relicLevel, relicType, relicLink, relicForge}
     end
   end
+
+
+end
+
+function VeneerPaperDollSlotMixin:OnLeave()
+
 end
 
 function VeneerPaperDollSlotMixin:Update(forced)
@@ -334,24 +377,25 @@
   local ignoreIL = IsAddOnLoaded("DejaCharacterStats")
   local itemLevelLine
     --print('|cFFFFFF00Sockets scan:', numLines)
-    for i = 1, numLines do
-      local line = _G['VeneerPaperDollTooltipTextLeft'..i]
-      local text = line and line:GetText()
-      if text and not ignoreIL then
-        itemLevel = text:match('Item Level (%d+)')
-        if itemLevel then
-          self.ItemLevel:SetText(itemLevel)
-          break
-        end
-      end
-
-      local texture = _G['VeneerPaperDollTooltipTexture'..i]
-      if texture and texture:IsShown() then
-        numTextures = numTextures + 1
-        --print('picked up socket', numTextures, texture:GetTexture())
-        self.SocketInfo[numTextures] = texture:GetTexture()
+  for i = 1, numLines do
+    local line = _G['VeneerPaperDollTooltipTextLeft'..i]
+    local text = line and line:GetText()
+    if text and not ignoreIL then
+      itemLevel = text:match('Item Level (%d+)')
+      if itemLevel then
+        self.ItemLevel:SetText(itemLevel)
+        break
       end
     end
+
+    local texture = _G['VeneerPaperDollTooltipTexture'..i]
+    if texture and texture:IsShown() then
+      numTextures = numTextures + 1
+      --print('picked up socket', numTextures, texture:GetTexture())
+      self.SocketInfo[numTextures] = texture:GetTexture()
+    end
+  end
+
   if self.checkRelic then
     self:UpdateRelicInfo()
   end
--- a/Modules/PaperDoll.xml	Mon Nov 20 12:02:18 2017 -0500
+++ b/Modules/PaperDoll.xml	Fri Dec 22 20:36:40 2017 -0500
@@ -48,6 +48,7 @@
       <OnLoad method="OnLoad" />
       <OnShow method="OnShow" />
       <OnUpdate method="OnUpdate" />
+      <OnHide method="OnHide" />
     </Scripts>
   </Frame>