Quantcast

Fix for #26 item level display issues

Joe Vaughan [10-30-16 - 13:10]
Fix for #26 item level display issues

Fix for #26
Fixed some loading errors relating to skins (need long-term solution but
fixing nuisance errors now)
Filename
SVUI_!Core/libs/LibItemUpgradeInfo-1.0/Core.lua
SVUI_!Core/libs/_load.xml
SVUI_!Core/system/gear.lua
SVUI_Skins/components/blizzard/guild.lua
diff --git a/SVUI_!Core/libs/LibItemUpgradeInfo-1.0/Core.lua b/SVUI_!Core/libs/LibItemUpgradeInfo-1.0/Core.lua
deleted file mode 100644
index cba9b22..0000000
--- a/SVUI_!Core/libs/LibItemUpgradeInfo-1.0/Core.lua
+++ /dev/null
@@ -1,602 +0,0 @@
-local MAJOR, MINOR = "LibItemUpgradeInfo-1.0", 26
-local type,tonumber,select,strsplit,GetItemInfoFromHyperlink=type,tonumber,select,strsplit,GetItemInfoFromHyperlink
-local library,previous = _G.LibStub:NewLibrary(MAJOR, MINOR)
-local lib=library --#lib Needed to keep Eclipse LDT happy
-if not lib then return end
-local pp=print
---[===[@debug@
-LoadAddOn("Blizzard_DebugTools")
-LoadAddOn("LibDebug")
-if LibDebug then LibDebug() end
---@end-debug@]===]
---@non-debug@
-local print=function() end
---@end-non-debug@
---[[
-Caching system
-1	itemName	String	The name of the item.
-2	itemLink	String	The item link of the item.
-3	itemRarity	Number	The quality of the item. The value is 0 to 7, which represents Poor to Heirloom. This appears to include gains from upgrades/bonuses.
-4	itemLevel	Number	The item level of this item, not including item levels gained from upgrades. There is currently no API to get the item level including upgrades/bonuses.
-5	itemMinLevel	Number	The minimum level required to use the item, 0 meaning no level requirement.
-6	itemType	String	The type of the item: Armor, Weapon, Quest, Key, etc. (localized)
-7	itemSubType	String	The sub-type of the item: Enchanting, Cloth, Sword, etc. See itemType. (localized)
-8	itemStackCount	Number	How many of the item per stack: 20 for Runecloth, 1 for weapon, 100 for Alterac Ram Hide, etc.
-9	itemEquipLoc	String	The type of inventory equipment location in which the item may be equipped, or "" if it can't be equippable. The string returned is also the name of a global string variable e.g. if "INVTYPE_WEAPONMAINHAND" is returned, _G["INVTYPE_WEAPONMAINHAND"] will be the localized, displayable name of the location.
-10	iconFileDataID	Number	The FileDataID for the icon texture for the item.
-11	itemSellPrice	Number	The price, in copper, a vendor is willing to pay for this item, 0 for items that cannot be sold.
-12	itemClassID	Number	This is the numerical value that determines the string to display for 'itemType'.
-13	itemSubClassID	Number	This is the numerical value that determines the string to display for 'itemSubType'
-14 ? number
-15 ? number
-16 ? ?
-17 ? boolean
---]]
--- ItemLink Constants
-local i_Name=1
-local i_Link=2
-local i_Rarity=3
-local i_Quality=3
-local i_Level=4
-local i_MinLevel =5
-local i_ClassName=6
-local i_SubClassName=7
-local i_StackCount=8
-local i_EquipLoc=9
-local i_TextureId=10
-local i_SellPrice=11
-local i_ClassID=12
-local i_SubCkass_ID=13
-local i_unk1=14
-local i_unk2=15
-local i_unk3=16
-local i_unk4=17
-
-
-do
-local oGetItemInfo=GetItemInfo
-lib.itemcache=lib.itemcache or
-	setmetatable({miss=0,tot=0},{
-		__index=function(table,key)
-			if (not key) then return "" end
-			if (key=="miss") then return 0 end
-			if (key=="tot") then return 0 end
-			local cached={oGetItemInfo(key)}
-			if #cached==0 then return nil end
-			local itemLink=cached[2]
-			if not itemLink then return nil end
-			local itemID=lib:GetItemID(itemLink)
-			local name=cached[1]
-			cached.englishClass=GetItemClassInfo(cached[12])
-			cached.englishSubClass=GetItemSubClassInfo(cached[12],cached[13])
-			rawset(table,itemLink,cached)
-			rawset(table,itemID,cached)
-			rawset(table,name,cached)
-			table.miss=table.miss+1
-			return cached
-		end
-
-	})
-end
-local cache,select,unpack=lib.itemcache,select,unpack
-local	function CachedGetItemInfo(key,index)
-	if not key then return nil end
-	index=index or 1
-	cache.tot=cache.tot+1
-	local cached=cache[key]
-	if cached and type(cached)=='table' then
-		return select(index,unpack(cached))
-	else
-		rawset(cache,key,nil) -- voiding broken cache entry
-	end
-end
-
-local upgradeTable = {
-	[  1] = { upgrade = 1, max = 1, ilevel = 8 },
-	[373] = { upgrade = 1, max = 3, ilevel = 4 },
-	[374] = { upgrade = 2, max = 3, ilevel = 8 },
-	[375] = { upgrade = 1, max = 3, ilevel = 4 },
-	[376] = { upgrade = 2, max = 3, ilevel = 4 },
-	[377] = { upgrade = 3, max = 3, ilevel = 4 },
-	[378] = {                       ilevel = 7 },
-	[379] = { upgrade = 1, max = 2, ilevel = 4 },
-	[380] = { upgrade = 2, max = 2, ilevel = 4 },
-	[445] = { upgrade = 0, max = 2, ilevel = 0 },
-	[446] = { upgrade = 1, max = 2, ilevel = 4 },
-	[447] = { upgrade = 2, max = 2, ilevel = 8 },
-	[451] = { upgrade = 0, max = 1, ilevel = 0 },
-	[452] = { upgrade = 1, max = 1, ilevel = 8 },
-	[453] = { upgrade = 0, max = 2, ilevel = 0 },
-	[454] = { upgrade = 1, max = 2, ilevel = 4 },
-	[455] = { upgrade = 2, max = 2, ilevel = 8 },
-	[456] = { upgrade = 0, max = 1, ilevel = 0 },
-	[457] = { upgrade = 1, max = 1, ilevel = 8 },
-	[458] = { upgrade = 0, max = 4, ilevel = 0 },
-	[459] = { upgrade = 1, max = 4, ilevel = 4 },
-	[460] = { upgrade = 2, max = 4, ilevel = 8 },
-	[461] = { upgrade = 3, max = 4, ilevel = 12 },
-	[462] = { upgrade = 4, max = 4, ilevel = 16 },
-	[465] = { upgrade = 0, max = 2, ilevel = 0 },
-	[466] = { upgrade = 1, max = 2, ilevel = 4 },
-	[467] = { upgrade = 2, max = 2, ilevel = 8 },
-	[468] = { upgrade = 0, max = 4, ilevel = 0 },
-	[469] = { upgrade = 1, max = 4, ilevel = 4 },
-	[470] = { upgrade = 2, max = 4, ilevel = 8 },
-	[471] = { upgrade = 3, max = 4, ilevel = 12 },
-	[472] = { upgrade = 4, max = 4, ilevel = 16 },
-	[491] = { upgrade = 0, max = 4, ilevel = 0 },
-	[492] = { upgrade = 1, max = 4, ilevel = 4 },
-	[493] = { upgrade = 2, max = 4, ilevel = 8 },
-	[494] = { upgrade = 0, max = 6, ilevel = 0 },
-	[495] = { upgrade = 1, max = 6, ilevel = 4 },
-	[496] = { upgrade = 2, max = 6, ilevel = 8 },
-	[497] = { upgrade = 3, max = 6, ilevel = 12 },
-	[498] = { upgrade = 4, max = 6, ilevel = 16 },
-	[503] = { upgrade = 3, max = 3, ilevel = 1 },
-	[504] = { upgrade = 3, max = 4, ilevel = 12 },
-	[505] = { upgrade = 4, max = 4, ilevel = 16 },
-	[506] = { upgrade = 5, max = 6, ilevel = 20 },
-	[507] = { upgrade = 6, max = 6, ilevel = 24 },
-	[529] = { upgrade = 0, max = 2, ilevel = 0 },
-	[530] = { upgrade = 1, max = 2, ilevel = 5 },
-	[531] = { upgrade = 2, max = 2, ilevel = 10 },
-	[535] = { upgrade = 1, max = 3, ilevel = 15 },
-	[536] = { upgrade = 2, max = 3, ilevel = 30 },
-	[537] = { upgrade = 3, max = 3, ilevel = 45 },
-	[538] = { upgrade = 0, max = 3, ilevel = 0 },
-
-}
-do
-	local stub = { ilevel = 0 }
-	setmetatable(upgradeTable, { __index = function(t, key)
-		return stub
-	end})
-end
--- Tooltip Scanning stuff
-local itemLevelPattern = _G.ITEM_LEVEL:gsub("%%d", "(%%d+)")
-local soulboundPattern = _G.ITEM_SOULBOUND
-local boePattern=_G.ITEM_BIND_ON_EQUIP
-local bopPattern=_G.ITEM_BIND_ON_PICKUP
-local boaPattern1=_G.ITEM_BIND_TO_BNETACCOUNT
-local boaPattern2=_G.ITEM_BNETACCOUNTBOUND
-
-local scanningTooltip
-local tipCache = lib.tipCache or setmetatable({},{__index=function(table,key) return {} end})
-local emptytable={}
-local function ScanTip(itemLink,itemLevel,show)
-	if type(itemLink)=="number" then
-		itemLink=CachedGetItemInfo(itemLink,2)
-		if not itemLink then return emptytable end
-	end
-	if type(tipCache[itemLink].ilevel)=="nil" then
-		if not scanningTooltip then
-			scanningTooltip = _G.CreateFrame("GameTooltip", "LibItemUpgradeInfoTooltip", nil, "GameTooltipTemplate")
-		end
-		scanningTooltip:ClearLines()
-		local rc,message=pcall(scanningTooltip.SetHyperlink,scanningTooltip,itemLink)
-		if (not rc) then
-			return emptytable
-		end
-		local quality,_,_,class,subclass,_,_,_,_,classIndex,subclassIndex=CachedGetItemInfo(itemLink,3)
-		-- line 1 is the item name
-		-- line 2 may be the item level, or it may be a modifier like "Heroic"
-		-- check up to line 6 just in case
-		local ilevel,soulbound,bop,boe,boa,heirloom
-		for i = 2, 6 do
-			local label, text = _G["LibItemUpgradeInfoTooltipTextLeft"..i], nil
-			if label then text=label:GetText() end
-			if text then
-				if ilevel==nil then ilevel = tonumber(text:match(itemLevelPattern)) end
-				if soulbound==nil then soulbound = text:find(soulboundPattern) end
-				if bop==nil then bop = text:find(bopPattern) end
-				if boe==nil then boe = text:find(boePattern) end
-				if boa==nil then boa = text:find(boaPattern1) end
-				if boa==nil then boa = text:find(boaPattern2) end
-			end
-		end
-		tipCache[itemLink]={
-			ilevel=ilevel or itemLevel,
-			soulbound=soulbound,
-			bop=bop,
-			boe=boe
-		}
-	end
-	return tipCache[itemLink]
-end
-
-
--- GetUpgradeID(itemString)
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Number - The upgrade ID (possibly 0), or nil if the input is invalid or
---            does not contain upgrade info
-function lib:GetUpgradeID(itemString)
-	if type(itemString)~="string" then return end
-	local itemString = itemString:match("item[%-?%d:]+") or ""-- Standardize itemlink to itemstring
-	local instaid, _, numBonuses, affixes = select(12, strsplit(":", itemString, 15))
-	instaid=tonumber(instaid) or 7
-	numBonuses=tonumber(numBonuses) or 0
-	if instaid >0 and (instaid-4)%8==0 then
-		return tonumber((select(numBonuses + 1, strsplit(":", affixes))))
-	end
-end
-
--- GetCurrentUpgrade(id)
---
--- Returns the current upgrade level of the item, e.g. 1 for a 1/2 item.
---
--- Arguments:
---   id - Number - The upgrade ID of the item (obtained via GetUpgradeID())
---
--- Returns:
---   Number - The current upgrade level of the item. Returns nil if the item
---            cannot be upgraded
-function lib:GetCurrentUpgrade(id)
-	return upgradeTable[id].upgrade
-end
-
--- GetMaximumUpgrade(id)
---
--- Returns the maximum upgrade level of the item, e.g. 2 for a 1/2 item.
---
--- Arguments:
---   id - Number - The upgrade ID of the item (obtained via GetUpgradeID())
---
--- Returns:
---   Number - The maximum upgrade level of the item. Returns nil if the item
---            cannot be upgraded
-function lib:GetMaximumUpgrade(id)
-	return upgradeTable[id].max
-end
-
--- GetItemLevelUpgrade(id)
---
--- Returns the item level increase that this upgrade is worth, e.g. 4 for a
--- 1/2 item or 8 for a 2/2 item.
---
--- Arguments:
---   id - Number - The upgrade ID of the item (obtained via GetUpgradeID())
---
--- Returns:
---   Number - The item level increase of the item. Returns 0 if the item
---            cannot be or has not been upgraded
-function lib:GetItemLevelUpgrade(id)
-	return upgradeTable[id].ilevel
-end
-
--- GetItemUpgradeInfo(itemString)
---
--- Returns the current upgrade level, maximum upgrade level, and item level
--- increase for an item.
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns if the item can be upgraded:
---   Number - The current upgrade level of the item
---   Number - The maximum upgrade level of the item
---   Number - The item level increase of the item
--- or if the item cannot be upgraded:
---   nil
---   nil
---   0
--- or if the item is invalid or does not contain upgrade info:
---   nil
-function lib:GetItemUpgradeInfo(itemString)
-	local id = self:GetUpgradeID(itemString)
-	if id then
-		local cur = self:GetCurrentUpgrade(id)
-		local max = self:GetMaximumUpgrade(id)
-		local delta = self:GetItemLevelUpgrade(id)
-		return cur, max, delta
-	end
-	return nil
-end
-
--- GetHeirloomTrueLevel(itemString)
---
--- Returns the true item level for an heirloom (actually, returns the true level for any adapting item)
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Number, Boolean - The true item level of the item. If the item is not
---                     an heirloom, or an error occurs when trying to scan the
---                     item tooltip, the second return value is false. Otherwise
---                     the second return value is true. If the input is invalid,
---                     (nil, false) is returned.
--- Convert the ITEM_LEVEL constant into a pattern for our use
-function lib:GetHeirloomTrueLevel(itemString)
-	if type(itemString) ~= "string" then return nil,false end
-	local _, itemLink, rarity, itemLevel = CachedGetItemInfo(itemString)
-	if (not itemLink) then
-		return nil,false
-	end
-	local rc=ScanTip(itemLink,itemLevel)
-	if rc.ilevel then
-		return rc.ilevel,true
-	end
-	return itemLevel, false
-end
-
--- GetUpgradedItemLevel(itemString)
---
--- Returns the true item level of the item, including upgrades and heirlooms.
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Number - The true item level of the item, or nil if the input is invalid
-function lib:GetUpgradedItemLevel(itemString)
-	-- check for heirlooms first
-	local ilvl, isTrue = self:GetHeirloomTrueLevel(itemString)
-	if isTrue then
-		return ilvl
-	end
-	-- not an heirloom? fall back to the regular item logic
-	local id = self:GetUpgradeID(itemString)
-	if ilvl and id then
-		ilvl = ilvl + self:GetItemLevelUpgrade(id)
-	end
-	return ilvl
-end
-
--- IsBop(itemString)
---
--- Check an item for  Bind On Pickup.
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Boolean - True if Bind On Pickup
-
-function lib:IsBop(itemString)
-	local rc=ScanTip(itemString)
-	return rc.bop
-end
--- IsBoe(itemString)
---
--- Check an item for  Bind On Equip.
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Boolean - True if Bind On Equip
-
-function lib:IsBoe(itemString)
-	local rc=ScanTip(itemString)
-	return rc.boe
-end
--- IsBoa(itemString)
---
--- Check an item for  Bind On Aaccount
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Boolean - True if Bind On Equip
-
-function lib:IsBoa(itemString)
-	local rc=ScanTip(itemString)
-	return rc.boa
-end
-
--- IsArtifact(itemString)
---
--- Check an item for  Heirloom
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Boolean - True if Artifact
-
-function lib:IsArtifact(itemString)
-	return CachedGetItemInfo(itemString,i_Quality)==LE_ITEM_QUALITY_ARTIFACT
-end
-
--- GetClassInfoIsHeirloom(itemString)
---
--- Retrieve class and subclass
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   class,subclass
-
-
-function lib:GetClassInfo(itemString)
-	local rc=ScantTip(itemString)
-	return rc.class,rc.subclass
-end
-
-
--- IsHeirloom(itemString)
---
--- Check an item for  Heirloom
---
--- Arguments:
---   itemString - String - An itemLink or itemString denoting the item
---
--- Returns:
---   Boolean - True if Heirloom
-
-function lib:IsHeirloom(itemString)
-	return CachedGetItemInfo(itemString,i_Quality) ==LE_ITEM_QUALITY_HEIRLOOM
-end
----
--- Parses an itemlink and returns itemId without calling API again
--- @param #lib self
--- @param #string itemlink
--- @return #number itemId or 0
-function lib:GetItemID(itemlink)
-	if (type(itemlink)=="string") then
-			local itemid,context=GetItemInfoFromHyperlink(itemlink)
-			return tonumber(itemid) or 0
-			--return tonumber(itemlink:match("Hitem:(%d+):")) or 0
-	else
-			return 0
-	end
-end
-
----
---
--- Returns a caching version of GetItemInfo. Can be used to override the original one.
--- Adds a second parameter to directly retrieving a specific value
--- (Note: internally uses select so it's actually like calling select(n,GetItemInfo(itemID))
---
--- Arguments:
---   self #lib self
---
--- Returns:
---   #function The new function
-function lib:GetCachingGetItemInfo()
-	return CachedGetItemInfo
-end
-function lib:GetCacheStats()
-	local c=lib.itemcache
-	local h=c.tot-c.miss
-	local perc=( h>0) and h/c.tot*100 or 0
-	return c.miss,h,perc
-end
-
---[===========[ ]===========]
---[===[ Debug utilities ]===]
---[===========[ ]===========]
-
-local function compareTables(t1, t2)
-	local seen = {}
-	for k, v1 in pairs(t1) do
-		seen[k] = true
-		local v2 = rawget(t2, k)
-		if not v2 then return false end
-		if type(v1) ~= type(v2) then return false end
-		if type(v1) == "table" then
-			if not compareTables(v1, v2) then return false end
-		elseif v1 ~= v2 then return false end
-	end
-	for k in pairs(t2) do
-		if not seen[k] then return false end
-	end
-	return true
-end
-
--- prints the table rows in red and green
--- omits the lead { and the trailing }
-local function printDiffTable(t1, t2)
-	local keys, seen = {}, {}
-	for k in pairs(t1) do
-		keys[#keys+1] = k
-		seen[k] = true
-	end
-	for k in pairs(t2) do
-		if not seen[k] then
-			keys[#keys+1] = k
-		end
-	end
-	table.sort(keys)
-	local function formatTable(t)
-		local comps = {}
-		for k, v in pairs(t) do
-			comps[#comps+1] = ("%s = %d"):format(k, v)
-		end
-		return "{ " .. table.concat(comps, ", ") .. " }"
-	end
-	for _, k in ipairs(keys) do
-		local v1, v2 = rawget(t1, k), rawget(t2, k)
-		local equal
-		if type(v1) == "table" and type(v2) == "table" then equal = compareTables(v1, v2)
-		else equal = v1 == v2 end
-		if not equal then
-			if v1 then
-				pp(("|cffff0000    [%d] = %s,|r"):format(k, formatTable(v1)))
-			end
-			if v2 then
-				pp(("|cff00ff00    [%d] = %s,|r"):format(k, formatTable(v2)))
-			end
-		end
-	end
-end
-
--- Scans the first 10000 upgrade IDs
--- Run this with /run LibStub:GetLibrary("LibItemUpgradeInfo-1.0"):_CheckUpgradeTable()
--- If you don't have Aspirant's Staff of Harmony cached it may error out, just try again.
-do
-	local debugFrame
-	local worker
-	local newTable
-	local debugTooltip
-	function lib:_CheckUpgradeTable(itemLink)
-		if worker then
-			pp("|cffff0000LibItemUpgradeInfo-1.0: upgrade check already in progress")
-			return
-		end
-		if not debugFrame then
-			debugFrame = _G.CreateFrame("frame")
-			debugFrame:Hide()
-			debugFrame:SetScript("OnUpdate", function()
-				local ok, result, count, max = pcall(worker)
-				if not ok or result then
-					debugFrame:Hide()
-					worker = nil
-				end
-				if not ok then
-					pp("|cffff0000LibItemUpgradeInfo-1.0 error: " .. result .. "|r")
-				elseif result then
-					pp("LibItemUpgradeInfo-1.0: scan complete")
-					if compareTables(upgradeTable, newTable) then
-						pp("LibItemUpgradeInfo-1.0: |cff00ff00No changes|r")
-					else
-						pp("LibItemUpgradeInfo-1.0: |cffff0000New table:|r {")
-						printDiffTable(upgradeTable, newTable)
-						pp("}")
-					end
-				else
-					pp("LibItemUpgradeInfo-1.0: scanning " .. count .. "/" .. max)
-				end
-			end)
-		end
-		if not debugTooltip then
-			debugTooltip = _G.CreateFrame("GameTooltip", "LibItemUpgradeInfoDebugTooltip", nil, "GameTooltipTemplate")
-			debugTooltip:SetOwner(_G.WorldFrame, "ANCHOR_NONE")
-		end
-		newTable = {}
-		--local itemLink = "|cff0070dd|Hitem:89551:0:0:0:0:0:0:0:90:253:0:0:1:0|h[Aspirant's Staff of Harmony]|h|r"
-		local itemLink = itemLink or "|cff0070dd|Hitem:89551:0:0:0:0:0:0:0:100:253:4:0:0:0|h[Aspirant's Staff of Harmony]|h|r"
--- Livello è il 9,upgradeid il 14. Al decimo posto, un valore che deve essere 4 o 4+n *8) per far scattare l'uso dell'upgradeid
-		local itemLevel = select(4, _G.GetItemInfo(itemLink))
-		assert(itemLevel, "Can't find item level for itemLink")
-		local count, max, batchsize = 0, 10000, 200
-		worker = function()
-			for i = count, math.min(max, count+batchsize) do
-				local link = itemLink:gsub("%d+|h", i.."|h")
-				debugTooltip:ClearLines()
-				debugTooltip:SetHyperlink(link)
-				local upgrade, max
-				local curLevel, maxLevel = _G.LibItemUpgradeInfoDebugTooltipTextLeft3:GetText():match("^Upgrade Level: (%d+)/(%d+)")
-				local ilvl = tonumber(_G.LibItemUpgradeInfoDebugTooltipTextLeft2:GetText():match("Item Level (%d+)"))
-				if not ilvl then
-					ilvl = tonumber(_G.LibItemUpgradeInfoDebugTooltipTextLeft3:GetText():match("Item Level (%d+)"))
-				end
-				assert(ilvl ~= nil, "Can't find ItemLevel in tooltip: " .. _G.LibItemUpgradeInfoDebugTooltipTextLeft2:GetText())
-				if curLevel or maxLevel or ilvl ~= itemLevel then
-					newTable[i] = { upgrade = tonumber(curLevel), max = tonumber(maxLevel), ilevel = ilvl - itemLevel }
-				end
-			end
-			count = count + batchsize
-			return (count > max), count, max
-		end
-		debugFrame:Show()
-	end
-end
-
--- vim: set noet sw=4 ts=4:
diff --git a/SVUI_!Core/libs/_load.xml b/SVUI_!Core/libs/_load.xml
index a8d5492..5690543 100644
--- a/SVUI_!Core/libs/_load.xml
+++ b/SVUI_!Core/libs/_load.xml
@@ -7,6 +7,5 @@
 	<Include file="AceConfig-3.0\AceConfig-3.0.xml"/>
 	<Include file="AceVillain-1.0\AceVillain-1.0.xml"/>
 	<Script file="LibArtifactData-1.0\LibArtifactData-1.0.lua"/>
-	<Script file="LibReputationData-1.0\LibReputationData-1.0.lua"/>
-	<Script file="LibItemUpgradeInfo-1.0\Core.lua"/>
+	<Script file="LibReputationData-1.0\LibReputationData-1.0.lua"/>
 </Ui>
diff --git a/SVUI_!Core/system/gear.lua b/SVUI_!Core/system/gear.lua
index 5825a70..63c7a76 100644
--- a/SVUI_!Core/system/gear.lua
+++ b/SVUI_!Core/system/gear.lua
@@ -26,15 +26,14 @@ GET ADDON DATA
 ]]--
 local SV = select(2, ...)
 local L = SV.L
-
-local LIUI = LibStub("LibItemUpgradeInfo-1.0");
+local GetDetailedItemLevelInfo = _G.GetDetailedItemLevelInfo
 --[[
 ##########################################################
 LOCAL VARS
 ##########################################################
 ]]--
 local NewHook = hooksecurefunc;
-local ParseItemLevel, ParseGearSlots;
+local ParseGearSlots;
 local GEAR_CACHE, GEARSET_LISTING = {}, {};
 local EquipmentSlots = {
     ["HeadSlot"] = {true,true},
@@ -118,99 +117,6 @@ do
         ["Trinket0Slot"] = {true, false, true}, ["Trinket1Slot"] = {true, false, true}
     }

-    local function _justthetip()
-        for i=1, #GameTooltip.shoppingTooltips do
-            if(not GameTooltip.shoppingTooltips[i]:IsShown()) then
-                return GameTooltip.shoppingTooltips[i]
-            end
-        end
-    end
-
-    local function _getHeirloomLevel(unit, itemId)
-        if(not itemId) then return; end
-
-        local baseLevel = UnitLevel(unit)
-        if baseLevel > 85 then
-            for i=1, #_heirlooms90h do
-              if(_heirlooms90h[i] == itemId) then
-                baseLevel = 582
-                break
-              end
-            end
-
-            for i=1, #_heirlooms90n do
-              if(_heirlooms90n[i] == itemId) then
-                baseLevel = 569
-                break
-              end
-            end
-
-            for i=1, #_heirlooms90f do
-              if(_heirlooms90f[i] == itemId) then
-                baseLevel = 548
-                break
-              end
-            end
-
-            return baseLevel
-        elseif baseLevel > 80 then
-            for i=1, #_heirlooms80 do
-                if(_heirlooms80[i] == itemId) then
-                    baseLevel = 80;
-                    break
-                end
-            end
-        end
-
-        if(baseLevel > 80) then
-            return (((baseLevel - 81) * 12.2) + 272)
-        elseif(baseLevel > 67) then
-            return (((baseLevel - 68) * 6) + 130)
-        elseif(baseLevel > 59) then
-            return (((baseLevel - 60) * 3) + 85)
-        end
-        return baseLevel
-    end
-
-    function ParseItemLevel(unit, itemLink)
-        -- local name, link, quality;
-        -- local iLevel = 0;
-        -- if(itemLink and type(itemLink) == "string") then
-        --   name, link, quality, iLevel = GetItemInfo(itemLink)
-        --   local itemId = tonumber(itemLink:match("item:%d+:%d+:%d+:%d+:%d+:%d+:%-?%d+:%-?%d+:%d+:%d+:(%d+)"))
-        --   if iLevel and itemId then
-        --       if(quality == 7) then
-        --           iLevel = _getHeirloomLevel(unit, itemId)
-        --       end
-        --   end
-        -- end
-        -- return iLevel or 0
-        return LIUI:GetUpgradedItemLevel(itemLink) or 0
-    end
-
-    local function _getEquippedItemLevel(unit, itemLink)
-        -- local tooltip = _justthetip();
-        -- if(not tooltip) then return ParseItemLevel(unit, itemLink) end
-        -- tooltip:SetOwner(UIParent, "ANCHOR_NONE");
-        -- tooltip:SetHyperlink(itemLink);
-        -- tooltip:Show();
-
-        -- local iLevel = 0;
-        -- local tname = tooltip:GetName().."TextLeft%s";
-        -- for i = 2, tooltip:NumLines() do
-        --     local text = _G[tname:format(i)]:GetText();
-        --     if(text and text ~= "") then
-        --         local value = tonumber(text:match(iLevelFilter));
-        --         if(value) then
-        --             iLevel = value;
-        --         end
-        --     end
-        -- end
-
-        -- tooltip:Hide();
-        -- return iLevel
-        return LIUI:GetUpgradedItemLevel(itemLink) or 0
-    end

     local function _setLevelDisplay(frame, iLevel)
       if(not frame or (not frame.ItemLevel)) then return; end
@@ -261,8 +167,17 @@ do
             local iLink = GetInventoryItemLink(unit, slotId)
             local iLevel;
             if(iLink and type(iLink) == "string") then
-                iLevel = _getEquippedItemLevel(unit, iLink)
+                iLevel = SV:GetItemLevel(iLink)
                 if(iLevel and iLevel > 0) then
+                    -- handle dual weilded weapons properly
+                    if (slotName == "SecondaryHandSlot") then
+                      local mainslotId = GetInventorySlotInfo("MainHandSlot");
+                      local mainiLink = GetInventoryItemLink(unit, mainslotId)
+                      local mainiLevel = SV:GetItemLevel(mainiLink)
+                      if (iLink and mainiLink) then -- linkid the same - dual wielded
+                        if mainiLevel > iLevel then iLevel = mainiLevel end
+                      end
+                    end
                     totalSlots = totalSlots + 1;
                     averageLevel = averageLevel + iLevel
                 end
@@ -279,6 +194,14 @@ do
     end
 end

+function SV:GetItemLevel(itemLink)
+  if (itemLink) then
+    return GetDetailedItemLevelInfo(itemLink) or 0
+  else
+    return 0
+  end
+end
+
 function SV:ParseGearSlots(unit, inspecting, setLevel, setDurability)
     local category = (inspecting) and "Inspect" or "Character";
     local averageLevel,totalSlots = ParseGearSlots(unit, category, setLevel, setDurability);
@@ -309,7 +232,7 @@ function SV:SetGearLabels(frame, bagID, slotID, itemLink, quality, equipSlot)
   end

   if(frame.ItemLevel) then
-    local iLevel = ParseItemLevel('player', itemLink)
+    local iLevel = SV:GetItemLevel(itemLink)
   	if((not SHOW_BAG_LEVEL) or (iLevel <= 1) or (quality == 7) or (not equipSlot:find('INVTYPE'))) then
       frame.ItemLevel:SetText('')
   	else
@@ -319,6 +242,7 @@ function SV:SetGearLabels(frame, bagID, slotID, itemLink, quality, equipSlot)
   end
 end

+
 local function GetActiveGear()
 	local count = GetNumEquipmentSets()
 	local resultSpec = GetSpecialization()
diff --git a/SVUI_Skins/components/blizzard/guild.lua b/SVUI_Skins/components/blizzard/guild.lua
index 5a9e2c9..3825c11 100644
--- a/SVUI_Skins/components/blizzard/guild.lua
+++ b/SVUI_Skins/components/blizzard/guild.lua
@@ -521,7 +521,7 @@ local function GuildFrameStyle()
 	GuildFactionBar.Panel:SetPoint("TOPLEFT", GuildFactionBar.progress, "TOPLEFT", -1, 1)
 	GuildFactionBar.Panel:SetPoint("BOTTOMRIGHT", GuildFactionBar, "BOTTOMRIGHT", 1, 1)

-	GuildRosterContainer:SetStyle("Frame", "Inset")
+	-- FIXME GuildRosterContainer:SetStyle("Frame", "Inset")
 	SV.API:Set("ScrollBar", GuildRosterContainerScrollBar, 4, -4)
 	GuildRosterShowOfflineButton:SetStyle("CheckButton")

@@ -547,7 +547,7 @@ local function GuildFrameStyle()
 	GuildMemberRankDropdown:HookScript("OnShow", function() GuildMemberDetailRankText:Hide() end)
 	GuildMemberRankDropdown:HookScript("OnHide", function() GuildMemberDetailRankText:Show() end)
 	GuildNewsFrame:RemoveTextures()
-	GuildNewsContainer:SetStyle("Frame", "Inset")
+	-- FIXME GuildNewsContainer:SetStyle("Frame", "Inset")

 	for i = 1, 17 do
 		local button = _G["GuildNewsContainerButton"..i]