Skip to content

Instantly share code, notes, and snippets.

@Farami
Last active August 3, 2016 19:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Farami/cefbf360a734c7071dfe0ce49977ac32 to your computer and use it in GitHub Desktop.
Save Farami/cefbf360a734c7071dfe0ce49977ac32 to your computer and use it in GitHub Desktop.
--[[
Until Blizzard adds an easier solution, this function can be used to get the true upgraded itemLevel.
The Lua file is easily portable between addons. The function is placed in the global namespace.
Syntax:
GetUpgradedItemLevelFromItemLink(itemLink)
= (number) return value is the modified itemLevel based on the item's upgrade
= (nil) invalid input
Changelog:
* REV-08 (15.09.08) Patch 6.2.3: Added patterns, tables, etc for Timewarped and Timewarped Warforged items to work. (Cidrei)
* REV-07 (15.07.02) Patch 6.2: A new field in the item string was added "specializationID", pushing the "upgradeId" field to the 11th place.
* REV-06 (14.10.15) Patch 6.0.2: Updated the pattern match for "upgradeId" to work for WoD.
* REV-05 (14.05.24) Patch 5.4.8: Added IDs 504 to 507.
* REV-04 (13.09.21) Patch 5.4: Added IDs 491 to 498 to the table.
* REV-03 (13.05.22) Patch 5.3: Added the 465/466/467 IDs (0/4/8 lvls) to the table.
* REV-02 (13.xx.xx) Patch 5.2: Added the 470 ID (8 lvls) to the table.
--]]
-- Make sure we do not override a newer revision. NOTE: Make sure to ALWAYS increase the REVISION number when changing code
local REVISION = 8;
if (type(GET_UPGRADED_ITEM_LEVEL_REV) == "number") and (GET_UPGRADED_ITEM_LEVEL_REV >= REVISION) then
return;
end
GET_UPGRADED_ITEM_LEVEL_REV = REVISION;
--[[
[Item links data change in 6.0, WoD]
itemID:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:level:reforgeId:upgradeId
itemID:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:level:upgradeId:instanceDifficultyID:numBonusIDs:bonusID1:bonusID2
[ItemLinks in 6.2 -- Added: 10th param, specializationID]
itemID:enchant:gem1:gem2:gem3:gem4:suffixID:uniqueID:level:specializationID:upgradeId:instanceDifficultyID:numBonusIDs:bonusID1:bonusID2
[ItemLinks in 6.2.x -- Added: numBonusIDs? -- The number of bonus IDs are now dynamic, the 13th parameter tells how many there are -- Total Count (???): 14 + numBonusIDs (???)]
itemID:enchant:gemID1:gemID2:gemID3:gemID4:suffixID:uniqueID:linkLevel:specializationID:upgradeTypeID:instanceDifficultyID:numBonusIDs:bonusID1:bonusID2:...:upgradeID
--]]
-- Extraction pattern for the complete itemLink, including all its properties
local ITEMLINK_PATTERN = "(item:[^|]+)";
-- Matches the 11th property, upgradeId, of an itemLink. This pattern now scans from the start of the itemLink to make it future-proof with further property additions to itemLinks.
local ITEMLINK_PATTERN_UPGRADE = "item:"..("[^:]*:"):rep(10).."(%d+)";
-- Matches the 14th property, which is used for Timewarped items.
local ITEMLINK_PATTERN_TIMEWARP = "item:"..("[^:]*:"):rep(13).."(%d+)";
-- Matches the 15th property, which is used for Timewarped Warforged items.
local ITEMLINK_PATTERN_TWWF = "item:"..("[^:]*:"):rep(14).."(%d+)";
-- Last property of an itemString
local ITEMLINK_PATTERN_UPGRADEID = "%d+$"
-- Table for adjustment of levels due to upgrade -- Source: http://www.wowinterface.com/forums/showthread.php?t=45388
local UPGRADED_LEVEL_ADJUST = {
[001] = 8, -- 1/1
-- Patch 5.1 --
[373] = 4, -- 1/2
[374] = 8, -- 2/2
[375] = 4, -- 1/3
[376] = 4, -- 2/3
[377] = 4, -- 3/3
[379] = 4, -- 1/2
[380] = 4, -- 2/2
-- [445] = 0, -- 0/2
[446] = 4, -- 1/2
[447] = 8, -- 2/2
-- [451] = 0, -- 0/1
[452] = 8, -- 1/1
-- [453] = 0, -- 0/2
[454] = 4, -- 1/2
[455] = 8, -- 2/2
-- [456] = 0, -- 0/1
[457] = 8, -- 1/1
-- [458] = 0, -- 0/4
[459] = 4, -- 1/4
[460] = 8, -- 2/4
[461] = 12, -- 3/4
[462] = 16, -- 4/4
-- Patch 5.3 --
-- [465] = 0,
[466] = 4,
[467] = 8,
-- Patch ?? --
-- [468] = 0,
[469] = 4,
[470] = 8,
[471] = 12,
[472] = 16,
-- Patch 5.4 --
-- [491] = 0,
[492] = 4,
[493] = 8,
-- [494] = 0,
[495] = 4,
[496] = 8,
[497] = 12,
[498] = 16,
-- Patch 5.4.8 --
[504] = 12, -- US/EU upgrade 3/4
[505] = 16, -- US/EU upgrade 4/4
[506] = 20, -- Asia upgrade 5/6
[507] = 24, -- Asis upgrade 6/6
-- Patch 6.2.3 --
[530] = 5, -- WoD upgrade 1/2
[531] = 10, -- WoD upgrade 2/2
};
-- Table for adjustment of levels due to Timewarped. These are fixed itemLevels, not upgrade amounts.
local TIMEWARPED_LEVEL_ADJUST = {
-- Patch 6.2 --
[615] = 660, -- Dungeon drops.
[692] = 675, -- Timewarped badge vendors.
};
-- Table for adjustment of levels due to Timewarped Warforged. These are fixed itemLevels, not upgrade amounts.
local TIMEWARPED_WARFORGED_LEVEL_ADJUST = {
-- Patch 6.2 --
[656] = 675, -- Dungeon drops.
};
-- Analyses the itemLink and checks for upgrades that affects itemLevel -- Only itemLevel 450 and above will have this
function GetUpgradedItemLevelFromItemLink(itemLink)
-- Ensure we only have the raw itemLink, and not the full itemString
itemLink = itemLink:match(ITEMLINK_PATTERN);
local name, _, _, itemLevel = GetItemInfo(itemLink);
--local upgradeId = tonumber(itemLink:match(ITEMLINK_PATTERN_UPGRADE));
local upgradeId = tonumber(itemLink:match(ITEMLINK_PATTERN_UPGRADEID));
local tw = tonumber(itemLink:match(ITEMLINK_PATTERN_TIMEWARP));
local twwf = tonumber(itemLink:match(ITEMLINK_PATTERN_TWWF));
-- Return the actual itemLevel based on the itemLink properties
if not (itemLevel) then
return nil;
elseif (itemLevel >= 450) and (upgradeId) and (UPGRADED_LEVEL_ADJUST[upgradeId]) then
return itemLevel + UPGRADED_LEVEL_ADJUST[upgradeId];
elseif (TIMEWARPED_WARFORGED_LEVEL_ADJUST[twwf]) then
return TIMEWARPED_WARFORGED_LEVEL_ADJUST[twwf];
elseif (TIMEWARPED_LEVEL_ADJUST[tw]) then
return TIMEWARPED_LEVEL_ADJUST[tw];
else
return itemLevel;
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment