Initial publication
This commit is contained in:
35
AGENTS.md
Normal file
35
AGENTS.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Amibis — WoW TBC Classic Addon
|
||||
|
||||
## What it is
|
||||
World of Warcraft addon (TBC Classic, Interface 20505) that compares the player's equipped gear against Best-in-Slot lists sourced from wowtbc.gg.
|
||||
|
||||
## Project structure
|
||||
```
|
||||
Amibis/
|
||||
├── Amibis.toc # Addon manifest — defines load order
|
||||
├── Amibis.lua # Core: DB init, item scanning, stat aggregation, gear comparison, slash commands
|
||||
├── Data/
|
||||
│ └── BISLists.lua # BIS data store (class → spec → phase → slot)
|
||||
└── UI/
|
||||
└── ComparisonFrame.lua # Main UI frame, slot rows, stats panel
|
||||
```
|
||||
|
||||
## Key facts
|
||||
- **Load order** is defined in `Amibis.toc`: `Amibis.lua` → `Data/BISLists.lua` → `UI/ComparisonFrame.lua`
|
||||
- **Slash command**: `/amibis` toggles the UI; `/amibis spec <SpecName>` overrides auto-detected spec; `/amibis spec clear` resets override
|
||||
- **SavedVariables**: `AmibisDB` (account-wide, stores selected phase), `AmibisCharDB` (per-character, stores frame position + spec override)
|
||||
- **Namespace pattern**: `local addonName, ns = ...` — all modules attach to `ns`
|
||||
- **No build/test/lint tooling** — tested in-game via WoW client
|
||||
- **Currently**: Only Priest (Discipline/Holy) T5 data populated
|
||||
|
||||
## Adding new BIS data
|
||||
1. Add a `local CLASS_T5 = { ... }` table in `Data/BISLists.lua` following the existing `PRIEST_T5` structure
|
||||
2. Register it in `BIS_DATA` under the appropriate class/spec/phase key
|
||||
3. Each slot entry: `{ itemID, name, source, enchant? }`
|
||||
4. Ensure class name matches WoW's English class constant (e.g. `"WARRIOR"`, not `"Warrior"`)
|
||||
|
||||
## UI conventions
|
||||
- ElvUI-style dark backdrop (`{0.07, 0.07, 0.07}`, alpha 0.95)
|
||||
- Color coding: green = BIS, yellow = upgrade available, gray = empty slot
|
||||
- Max 17 visible rows; rows are clickable (Shift+click = chat link, Ctrl+click = dress-up)
|
||||
- Stats panel shows: Healing, Spell Power, Intellect, Spirit, MP5, Haste, Crit
|
||||
389
Amibis/Amibis.lua
Normal file
389
Amibis/Amibis.lua
Normal file
@@ -0,0 +1,389 @@
|
||||
local addonName, ns = ...
|
||||
|
||||
local Amibis = {}
|
||||
ns.Amibis = Amibis
|
||||
Amibis.version = "1.0.0"
|
||||
|
||||
local DEFAULT_AMIBIS_DB = {
|
||||
selectedPhase = "T5",
|
||||
}
|
||||
|
||||
local DEFAULT_AMIBIS_CHAR_DB = {
|
||||
frameX = nil,
|
||||
frameY = nil,
|
||||
framePoint = nil,
|
||||
frameRelPoint = nil,
|
||||
overrideSpec = nil,
|
||||
}
|
||||
|
||||
local function InitializeDB()
|
||||
if not AmibisDB then
|
||||
AmibisDB = CopyTable(DEFAULT_AMIBIS_DB)
|
||||
else
|
||||
for k, v in pairs(DEFAULT_AMIBIS_DB) do
|
||||
if AmibisDB[k] == nil then
|
||||
AmibisDB[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not AmibisCharDB then
|
||||
AmibisCharDB = CopyTable(DEFAULT_AMIBIS_CHAR_DB)
|
||||
else
|
||||
for k, v in pairs(DEFAULT_AMIBIS_CHAR_DB) do
|
||||
if AmibisCharDB[k] == nil then
|
||||
AmibisCharDB[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Amibis:GetPlayerClass()
|
||||
return select(2, UnitClass("player"))
|
||||
end
|
||||
|
||||
function Amibis:GetPlayerSpec()
|
||||
local class = self:GetPlayerClass()
|
||||
local specNames = {
|
||||
["PRIEST"] = { "Discipline", "Holy", "Shadow" },
|
||||
["MAGE"] = { "Arcane", "Fire", "Frost" },
|
||||
["WARLOCK"] = { "Affliction", "Demonology", "Destruction" },
|
||||
["DRUID"] = { "Balance", "Feral Combat", "Restoration" },
|
||||
["PALADIN"] = { "Holy", "Protection", "Retribution" },
|
||||
["SHAMAN"] = { "Elemental", "Enhancement", "Restoration" },
|
||||
["WARRIOR"] = { "Arms", "Fury", "Protection" },
|
||||
["ROGUE"] = { "Assassination", "Combat", "Subtlety" },
|
||||
["HUNTER"] = { "Beast Mastery", "Marksmanship", "Survival" },
|
||||
}
|
||||
|
||||
if not specNames[class] then
|
||||
return nil
|
||||
end
|
||||
|
||||
local maxPoints = 0
|
||||
local specIndex = 1
|
||||
|
||||
for i = 1, 3 do
|
||||
local r1, r2, r3, r4 = GetTalentTabInfo(i)
|
||||
local points = tonumber(r1) or tonumber(r2) or tonumber(r3) or tonumber(r4) or 0
|
||||
if points > maxPoints then
|
||||
maxPoints = points
|
||||
specIndex = i
|
||||
end
|
||||
end
|
||||
|
||||
return specNames[class][specIndex]
|
||||
end
|
||||
|
||||
function Amibis:GetEquippedItems()
|
||||
local items = {}
|
||||
local slotMap = {
|
||||
["Head"] = 1,
|
||||
["Neck"] = 2,
|
||||
["Shoulder"] = 3,
|
||||
["Back"] = 15,
|
||||
["Chest"] = 5,
|
||||
["Wrist"] = 9,
|
||||
["Hands"] = 10,
|
||||
["Waist"] = 6,
|
||||
["Legs"] = 7,
|
||||
["Feet"] = 8,
|
||||
["Finger0"] = 11,
|
||||
["Finger1"] = 12,
|
||||
["Trinket0"] = 13,
|
||||
["Trinket1"] = 14,
|
||||
["MainHand"] = 16,
|
||||
["SecondaryHand"] = 17,
|
||||
["Ranged"] = 18,
|
||||
}
|
||||
|
||||
for slotName, slotID in pairs(slotMap) do
|
||||
local link = GetInventoryItemLink("player", slotID)
|
||||
if link then
|
||||
local itemID = tonumber(link:match("item:(%d+)"))
|
||||
local name = GetItemInfo(itemID) or "Unknown"
|
||||
items[slotName] = {
|
||||
itemID = itemID,
|
||||
name = name,
|
||||
link = link,
|
||||
slotID = slotID,
|
||||
}
|
||||
else
|
||||
items[slotName] = nil
|
||||
end
|
||||
end
|
||||
|
||||
return items
|
||||
end
|
||||
|
||||
local STAT_MAP = {
|
||||
["ITEM_MOD_HEALING_DONE_SHORT"] = "healing",
|
||||
["ITEM_MOD_SPELL_HEALING_DONE_SHORT"] = "healing",
|
||||
["ITEM_MOD_HEALING_DONE"] = "healing",
|
||||
["ITEM_MOD_SPELL_HEALING_DONE"] = "healing",
|
||||
["ITEM_MOD_DAMAGE_DONE_SHORT"] = "spellDamage",
|
||||
["ITEM_MOD_SPELL_DAMAGE_DONE_SHORT"] = "spellDamage",
|
||||
["ITEM_MOD_DAMAGE_DONE"] = "spellDamage",
|
||||
["ITEM_MOD_SPELL_DAMAGE_DONE"] = "spellDamage",
|
||||
["ITEM_MOD_INTELLECT_SHORT"] = "intellect",
|
||||
["ITEM_MOD_SPIRIT_SHORT"] = "spirit",
|
||||
["ITEM_MOD_STAMINA_SHORT"] = "stamina",
|
||||
["ITEM_MOD_MANA_REGENERATION_SHORT"] = "mp5",
|
||||
["ITEM_MOD_POWER_REGEN0_SHORT"] = "mp5",
|
||||
["ITEM_MOD_HASTE_RATING_SHORT"] = "haste",
|
||||
["ITEM_MOD_SPELL_HASTE_RATING_SHORT"] = "haste",
|
||||
["ITEM_MOD_SPELL_CRIT_RATING_SHORT"] = "crit",
|
||||
["ITEM_MOD_CRIT_RATING_SHORT"] = "crit",
|
||||
["ITEM_MOD_SPELL_POWER_SHORT"] = "spellPower",
|
||||
["ITEM_MOD_SPELL_DMG_SHORT"] = "spellDamage",
|
||||
["ITEM_MOD_HEALING_SHORT"] = "healing",
|
||||
}
|
||||
|
||||
function Amibis:ScanItemStats(itemID)
|
||||
if not itemID then return nil end
|
||||
|
||||
local _, link = GetItemInfo(itemID)
|
||||
if not link then
|
||||
link = "item:" .. itemID .. ":0:0:0:0:0:0:0:0"
|
||||
end
|
||||
|
||||
local stats = GetItemStats(link)
|
||||
if not stats then return nil end
|
||||
|
||||
local result = {}
|
||||
for wowKey, ourKey in pairs(STAT_MAP) do
|
||||
if stats[wowKey] then
|
||||
result[ourKey] = (result[ourKey] or 0) + stats[wowKey]
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
function Amibis:AggregateStats(items)
|
||||
local totals = {
|
||||
healing = 0,
|
||||
spellDamage = 0,
|
||||
intellect = 0,
|
||||
spirit = 0,
|
||||
stamina = 0,
|
||||
mp5 = 0,
|
||||
haste = 0,
|
||||
crit = 0,
|
||||
spellPower = 0,
|
||||
}
|
||||
|
||||
for slotName, item in pairs(items) do
|
||||
if item and item.itemID then
|
||||
local stats = self:ScanItemStats(item.itemID)
|
||||
if stats then
|
||||
for k, v in pairs(stats) do
|
||||
totals[k] = (totals[k] or 0) + v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return totals
|
||||
end
|
||||
|
||||
function Amibis:CompareGear()
|
||||
local class = self:GetPlayerClass()
|
||||
local spec = AmibisCharDB.overrideSpec or self:GetPlayerSpec()
|
||||
local phase = AmibisDB.selectedPhase or "T5"
|
||||
|
||||
local bisList = ns.Data.BISLists:GetBISList(class, spec, phase)
|
||||
if not bisList then
|
||||
return {
|
||||
class = class,
|
||||
spec = spec,
|
||||
phase = phase,
|
||||
hasBISList = false,
|
||||
slots = {},
|
||||
bisCount = 0,
|
||||
totalSlots = 0,
|
||||
biggestUpgrade = nil,
|
||||
}
|
||||
end
|
||||
|
||||
local equipped = self:GetEquippedItems()
|
||||
local slots = {}
|
||||
local bisCount = 0
|
||||
local totalSlots = 0
|
||||
local biggestUpgrade = nil
|
||||
|
||||
for slotName, bisItem in pairs(bisList) do
|
||||
totalSlots = totalSlots + 1
|
||||
local equippedItem = equipped[slotName]
|
||||
local isBIS = false
|
||||
|
||||
if equippedItem and equippedItem.itemID == bisItem.itemID then
|
||||
isBIS = true
|
||||
bisCount = bisCount + 1
|
||||
end
|
||||
|
||||
local itemLevelDiff = nil
|
||||
if equippedItem and not isBIS then
|
||||
local equippedILvl = GetItemInfo(equippedItem.itemID) and select(4, GetItemInfo(equippedItem.itemID))
|
||||
local bisILvl = GetItemInfo(bisItem.itemID) and select(4, GetItemInfo(bisItem.itemID))
|
||||
if equippedILvl and bisILvl then
|
||||
itemLevelDiff = bisILvl - equippedILvl
|
||||
end
|
||||
end
|
||||
|
||||
if not isBIS and equippedItem then
|
||||
if not biggestUpgrade or (itemLevelDiff and biggestUpgrade.itemLevelDiff and itemLevelDiff > biggestUpgrade.itemLevelDiff) then
|
||||
biggestUpgrade = {
|
||||
slot = slotName,
|
||||
equipped = equippedItem,
|
||||
bis = bisItem,
|
||||
itemLevelDiff = itemLevelDiff,
|
||||
}
|
||||
elseif not biggestUpgrade then
|
||||
biggestUpgrade = {
|
||||
slot = slotName,
|
||||
equipped = equippedItem,
|
||||
bis = bisItem,
|
||||
itemLevelDiff = itemLevelDiff,
|
||||
}
|
||||
end
|
||||
elseif not isBIS and not biggestUpgrade then
|
||||
biggestUpgrade = {
|
||||
slot = slotName,
|
||||
equipped = nil,
|
||||
bis = bisItem,
|
||||
itemLevelDiff = nil,
|
||||
}
|
||||
end
|
||||
|
||||
table.insert(slots, {
|
||||
slotName = slotName,
|
||||
equipped = equippedItem,
|
||||
bis = bisItem,
|
||||
isBIS = isBIS,
|
||||
itemLevelDiff = itemLevelDiff,
|
||||
})
|
||||
end
|
||||
|
||||
table.sort(slots, function(a, b)
|
||||
if a.isBIS ~= b.isBIS then
|
||||
return b.isBIS
|
||||
end
|
||||
return a.slotName < b.slotName
|
||||
end)
|
||||
|
||||
local equippedStats = self:AggregateStats(equipped)
|
||||
|
||||
for slotName, bisItem in pairs(bisList) do
|
||||
GetItemInfo(bisItem.itemID)
|
||||
end
|
||||
|
||||
local bisItems = {}
|
||||
for slotName, bisItem in pairs(bisList) do
|
||||
bisItems[slotName] = { itemID = bisItem.itemID }
|
||||
end
|
||||
local bisStats = self:AggregateStats(bisItems)
|
||||
|
||||
local statsComplete = true
|
||||
for slotName, bisItem in pairs(bisList) do
|
||||
local _, link = GetItemInfo(bisItem.itemID)
|
||||
if link then
|
||||
local s = GetItemStats(link)
|
||||
if not s or not next(s) then
|
||||
statsComplete = false
|
||||
break
|
||||
end
|
||||
else
|
||||
statsComplete = false
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return {
|
||||
class = class,
|
||||
spec = spec,
|
||||
phase = phase,
|
||||
hasBISList = true,
|
||||
slots = slots,
|
||||
bisCount = bisCount,
|
||||
totalSlots = totalSlots,
|
||||
biggestUpgrade = biggestUpgrade,
|
||||
equippedStats = equippedStats,
|
||||
bisStats = bisStats,
|
||||
statsComplete = statsComplete,
|
||||
}
|
||||
end
|
||||
|
||||
function Amibis:SaveFramePosition(frame)
|
||||
local point, _, relPoint, x, y = frame:GetPoint()
|
||||
AmibisCharDB.framePoint = point
|
||||
AmibisCharDB.frameRelPoint = relPoint
|
||||
AmibisCharDB.frameX = x
|
||||
AmibisCharDB.frameY = y
|
||||
end
|
||||
|
||||
function Amibis:LoadFramePosition(frame)
|
||||
local point = AmibisCharDB.framePoint
|
||||
local relPoint = AmibisCharDB.frameRelPoint
|
||||
local x = AmibisCharDB.frameX
|
||||
local y = AmibisCharDB.frameY
|
||||
|
||||
if point and x and y then
|
||||
frame:ClearAllPoints()
|
||||
frame:SetPoint(point, UIParent, relPoint or point, x, y)
|
||||
else
|
||||
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||
end
|
||||
end
|
||||
|
||||
function Amibis:InitializeUI()
|
||||
if ns.UI and ns.UI.Initialize then
|
||||
ns.UI.Initialize()
|
||||
end
|
||||
end
|
||||
|
||||
function Amibis:ToggleFrame()
|
||||
if ns.UI and ns.UI.ToggleFrame then
|
||||
ns.UI.ToggleFrame()
|
||||
end
|
||||
end
|
||||
|
||||
local eventFrame = CreateFrame("Frame")
|
||||
eventFrame:RegisterEvent("ADDON_LOADED")
|
||||
eventFrame:RegisterEvent("PLAYER_LOGIN")
|
||||
eventFrame:RegisterEvent("PLAYER_TALENT_UPDATE")
|
||||
|
||||
eventFrame:SetScript("OnEvent", function(self, event, ...)
|
||||
if event == "ADDON_LOADED" then
|
||||
local addon = ...
|
||||
if addon == addonName then
|
||||
InitializeDB()
|
||||
end
|
||||
elseif event == "PLAYER_LOGIN" then
|
||||
Amibis:InitializeUI()
|
||||
elseif event == "PLAYER_TALENT_UPDATE" then
|
||||
if ns.UI and ns.UI.RefreshUI then
|
||||
ns.UI.RefreshUI()
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
SLASH_AMIBIS1 = "/amibis"
|
||||
SlashCmdList["AMIBIS"] = function(msg)
|
||||
local cmd = msg:trim():lower()
|
||||
if cmd == "" then
|
||||
Amibis:ToggleFrame()
|
||||
elseif cmd:find("^spec%s+") then
|
||||
local spec = cmd:match("^spec%s+(.+)")
|
||||
if spec and spec ~= "" then
|
||||
spec = spec:gsub("^%l", string.upper)
|
||||
AmibisCharDB.overrideSpec = spec
|
||||
print("Amibis: Spec override set to " .. spec .. ". Type /amibis spec clear to reset.")
|
||||
end
|
||||
elseif cmd == "spec clear" then
|
||||
AmibisCharDB.overrideSpec = nil
|
||||
print("Amibis: Spec override cleared.")
|
||||
else
|
||||
Amibis:ToggleFrame()
|
||||
end
|
||||
end
|
||||
11
Amibis/Amibis.toc
Normal file
11
Amibis/Amibis.toc
Normal file
@@ -0,0 +1,11 @@
|
||||
## Interface: 20505
|
||||
## Title: Amibis
|
||||
## Notes: Compares your gear against BIS lists from wowtbc.gg
|
||||
## Version: 1.0.0
|
||||
## Author: Amibis
|
||||
## SavedVariables: AmibisDB
|
||||
## SavedVariablesPerCharacter: AmibisCharDB
|
||||
|
||||
Amibis.lua
|
||||
Data/BISLists.lua
|
||||
UI/ComparisonFrame.lua
|
||||
503
Amibis/Data/BISLists.lua
Normal file
503
Amibis/Data/BISLists.lua
Normal file
@@ -0,0 +1,503 @@
|
||||
local _, ns = ...
|
||||
ns.Data = ns.Data or {}
|
||||
ns.Data.BISLists = {}
|
||||
|
||||
-- =============================================================================
|
||||
-- BIS DATA STRUCTURE
|
||||
-- Keys: CLASS -> SPEC -> PHASE -> SLOT -> { itemID, name, source }
|
||||
-- Slots: Head, Neck, Shoulder, Back, Chest, Wrist, Hands, Waist, Legs, Feet,
|
||||
-- Finger0, Finger1, Trinket0, Trinket1, MainHand, SecondaryHand, Ranged
|
||||
-- =============================================================================
|
||||
|
||||
-- =============================================================================
|
||||
-- PRIEST T5
|
||||
-- =============================================================================
|
||||
local PRIEST_T5 = {
|
||||
["Head"] = { itemID = 30152, name = "Cowl of the Avatar", source = "SSC - Lady Vashj", enchant = { id = 35445, name = "Glyph of Renewal" } },
|
||||
["Neck"] = { itemID = 30018, name = "Lord Sanguinar's Claim", source = "TK - Kael'thas Sunstrider" },
|
||||
["Shoulder"] = { itemID = 30154, name = "Mantle of the Avatar", source = "TK - Void Reaver", enchant = { id = 2717, name = "Greater Inscription of Faith" } },
|
||||
["Back"] = { itemID = 29989, name = "Sunshower Light Cloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30150, name = "Vestments of the Avatar", source = "TK - Kael'thas Sunstrider", enchant = { id = 2629, name = "Major Spirit" } },
|
||||
["Wrist"] = { itemID = 32516, name = "Wraps of Purification", source = "SSC - Hydross the Unstable", enchant = { id = 1953, name = "Superior Healing" } },
|
||||
["Hands"] = { itemID = 30151, name = "Gloves of the Avatar", source = "SSC - Leotheras the Blind", enchant = { id = 2617, name = "Major Healing" } },
|
||||
["Waist"] = { itemID = 30036, name = "Belt of the Long Road", source = "Tailoring BoE (375)" },
|
||||
["Legs"] = { itemID = 30153, name = "Breeches of the Avatar", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2505, name = "Golden Spellthread" } },
|
||||
["Feet"] = { itemID = 30100, name = "Soul-Strider Boots", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30110, name = "Coral Band of the Revived", source = "SSC - Lady Vashj", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Finger1"] = { itemID = 29290, name = "Violet Signet of the Grand Restorer", source = "The Violet Eye - Exalted", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Trinket0"] = { itemID = 29376, name = "Essence of the Martyr", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 30665, name = "Earring of Soulful Meditation", source = "SSC - The Lurker Below" },
|
||||
["MainHand"] = { itemID = 30108, name = "Lightfathom Scepter", source = "SSC - Lady Vashj", enchant = { id = 2673, name = "Major Healing" } },
|
||||
["SecondaryHand"] = { itemID = 29170, name = "Windcaller's Orb", source = "Cenarion Expedition - Exalted" },
|
||||
["Ranged"] = { itemID = 30080, name = "Luminescent Rod of the Naaru", source = "SSC - Morogrim Tidewalker", enchant = { id = 2673, name = "Major Healing" } },
|
||||
}
|
||||
|
||||
local PRIEST_SHADOW_T5 = {
|
||||
["Head"] = { itemID = 29986, name = "Cowl of the Grand Engineer", source = "TK - Void Reaver", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30666, name = "Ritssyn's Lost Pendant", source = "Karazhan - Trash" },
|
||||
["Shoulder"] = { itemID = 21869, name = "Frozen Shadoweave Shoulders", source = "Tailoring (375)", enchant = { id = 2716, name = "Greater Inscription of Discipline" } },
|
||||
["Back"] = { itemID = 29992, name = "Royal Cloak of the Sunstriders", source = "TK - Kael'thas Sunstrider", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30107, name = "Vestments of the Sea-Witch", source = "SSC - Lady Vashj", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 28780, name = "Soul-Eater's Handwraps", source = "Magtheridon's Lair - Magtheridon", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 29972, name = "Trousers of the Astromancer", source = "TK - High Astromancer Solarian", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 21870, name = "Frozen Shadoweave Boots", source = "Tailoring (375)", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30109, name = "Ring of Endless Coils", source = "SSC - Lady Vashj", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 29922, name = "Band of Al'ar", source = "TK - Al'ar", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 28789, name = "Eye of Magtheridon", source = "Magtheridon's Lair - Magtheridon" },
|
||||
["MainHand"] = { itemID = 28770, name = "Nathrezim Mindblade", source = "Karazhan - Prince Malchezaar", enchant = { id = 2674, name = "Soulfrost" } },
|
||||
["SecondaryHand"] = { itemID = 29272, name = "Orb of the Soul-Eater", source = "Badge of Justice - G'eras" },
|
||||
["Ranged"] = { itemID = 29982, name = "Wand of the Forgotten Star", source = "TK - High Astromancer Solarian" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- DRUID T5
|
||||
-- =============================================================================
|
||||
local DRUID_BALANCE_T5 = {
|
||||
["Head"] = { itemID = 30233, name = "Nordrassil Headpiece", source = "SSC - Lady Vashj", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30015, name = "The Sun King's Talisman", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30235, name = "Nordrassil Wrath-Mantle", source = "TK - Void Reaver", enchant = { id = 2716, name = "Greater Inscription of Discipline" } },
|
||||
["Back"] = { itemID = 28797, name = "Brute Cloak of the Ogre-Magi", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30231, name = "Nordrassil Chestpiece", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 30232, name = "Nordrassil Gauntlets", source = "SSC - Leotheras the Blind", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 24262, name = "Spellstrike Pants", source = "Tailoring BoP (375)", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 30037, name = "Boots of Blasting", source = "Tailoring BoE (375)", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 28753, name = "Ring of Recurrence", source = "Karazhan - Chess Event", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 29302, name = "Band of Eternity", source = "Quest Reward - The Vials of Eternity", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 27683, name = "Quagmirran's Eye", source = "Slave Pens (H) - Quagmirran" },
|
||||
["MainHand"] = { itemID = 29988, name = "The Nexus Key", source = "TK - Kael'thas Sunstrider", enchant = { id = 2677, name = "Sunfire" } },
|
||||
["SecondaryHand"] = { itemID = 30015, name = "The Sun King's Talisman", source = "TK - Kael'thas Sunstrider" },
|
||||
["Ranged"] = { itemID = 27886, name = "Idol of the Raven Goddess", source = "Quest Reward - Vanquish the Raven God" },
|
||||
}
|
||||
|
||||
local DRUID_RESTO_T5 = {
|
||||
["Head"] = { itemID = 30219, name = "Nordrassil Headguard", source = "SSC - Lady Vashj", enchant = { id = 35445, name = "Glyph of Renewal" } },
|
||||
["Neck"] = { itemID = 30018, name = "Lord Sanguinar's Claim", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30221, name = "Nordrassil Life-Mantle", source = "TK - Void Reaver", enchant = { id = 2717, name = "Greater Inscription of Faith" } },
|
||||
["Back"] = { itemID = 29989, name = "Sunshower Light Cloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30216, name = "Nordrassil Chestguard", source = "TK - Kael'thas Sunstrider", enchant = { id = 2629, name = "Major Spirit" } },
|
||||
["Wrist"] = { itemID = 30062, name = "Grove-Bands of Remulos", source = "SSC - The Lurker Below", enchant = { id = 1953, name = "Superior Healing" } },
|
||||
["Hands"] = { itemID = 28521, name = "Mitts of the Treemender", source = "Karazhan - Maiden of Virtue", enchant = { id = 2617, name = "Major Healing" } },
|
||||
["Waist"] = { itemID = 30036, name = "Belt of the Long Road", source = "Tailoring BoE (375)" },
|
||||
["Legs"] = { itemID = 28591, name = "Earthsoul Leggings", source = "Karazhan - Opera Event", enchant = { id = 2505, name = "Golden Spellthread" } },
|
||||
["Feet"] = { itemID = 30092, name = "Orca-Hide Boots", source = "SSC - Leotheras the Blind", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30110, name = "Coral Band of the Revived", source = "SSC - Lady Vashj", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Finger1"] = { itemID = 28763, name = "Jade Ring of the Everliving", source = "Karazhan - Prince Malchezaar", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Trinket0"] = { itemID = 29376, name = "Essence of the Martyr", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 30841, name = "Lower City Prayerbook", source = "Lower City - Revered" },
|
||||
["MainHand"] = { itemID = 30108, name = "Lightfathom Scepter", source = "SSC - Lady Vashj", enchant = { id = 2673, name = "Major Healing" } },
|
||||
["SecondaryHand"] = { itemID = 29274, name = "Tears of Heaven", source = "Badge of Justice - G'eras" },
|
||||
["Ranged"] = { itemID = 27886, name = "Idol of the Emerald Queen", source = "Shadow Labyrinth - Ambassador Hellmaw" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- PALADIN T5
|
||||
-- =============================================================================
|
||||
local PALADIN_HOLY_T5 = {
|
||||
["Head"] = { itemID = 30136, name = "Crystalforge Greathelm", source = "SSC - Lady Vashj", enchant = { id = 35445, name = "Glyph of Renewal" } },
|
||||
["Neck"] = { itemID = 30018, name = "Lord Sanguinar's Claim", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30138, name = "Crystalforge Pauldrons", source = "TK - Void Reaver", enchant = { id = 2717, name = "Greater Inscription of Faith" } },
|
||||
["Back"] = { itemID = 29989, name = "Sunshower Light Cloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30134, name = "Crystalforge Chestpiece", source = "TK - Kael'thas Sunstrider", enchant = { id = 2602, name = "Restore Mana Prime" } },
|
||||
["Wrist"] = { itemID = 30047, name = "Blackfathom Warbands", source = "SSC - Hydross the Unstable", enchant = { id = 1953, name = "Superior Healing" } },
|
||||
["Hands"] = { itemID = 30112, name = "Glorious Gauntlets of Crestfall", source = "SSC - Lady Vashj", enchant = { id = 2617, name = "Major Healing" } },
|
||||
["Waist"] = { itemID = 30030, name = "Girdle of Fallen Stars", source = "TK - Trash Mobs" },
|
||||
["Legs"] = { itemID = 29991, name = "Sunhawk Leggings", source = "TK - Kael'thas Sunstrider", enchant = { id = 2505, name = "Golden Spellthread" } },
|
||||
["Feet"] = { itemID = 30027, name = "Boots of Courage Unending", source = "SSC - Trash Mobs", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30110, name = "Coral Band of the Revived", source = "SSC - Lady Vashj", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Finger1"] = { itemID = 29920, name = "Phoenix-Ring of Rebirth", source = "TK - Al'ar", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Trinket0"] = { itemID = 29376, name = "Essence of the Martyr", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 28590, name = "Ribbon of Sacrifice", source = "Karazhan - Opera Event" },
|
||||
["MainHand"] = { itemID = 30108, name = "Lightfathom Scepter", source = "SSC - Lady Vashj", enchant = { id = 2673, name = "Major Healing" } },
|
||||
["SecondaryHand"] = { itemID = 29458, name = "Aegis of the Vindicator", source = "Magtheridon's Lair - Magtheridon", enchant = { id = 2655, name = "Intellect" } },
|
||||
["Ranged"] = { itemID = 25644, name = "Blessed Book of Nagrand", source = "Quest Reward - The Ultimate Bloodsport" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- SHAMAN T5
|
||||
-- =============================================================================
|
||||
local SHAMAN_ELEMENTAL_T5 = {
|
||||
["Head"] = { itemID = 29035, name = "Cyclone Faceguard", source = "Karazhan - Prince Malchezaar", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30015, name = "The Sun King's Talisman", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 29037, name = "Cyclone Shoulderguards", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2716, name = "Greater Inscription of Discipline" } },
|
||||
["Back"] = { itemID = 28797, name = "Brute Cloak of the Ogre-Magi", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30169, name = "Cataclysm Chestpiece", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 28780, name = "Soul-Eater's Handwraps", source = "Magtheridon's Lair - Magtheridon", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 30172, name = "Cataclysm Leggings", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 30067, name = "Velvet Boots of the Guardian", source = "SSC - The Lurker Below", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30667, name = "Ring of Unrelenting Storms", source = "Karazhan - Trash Drop", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 30109, name = "Ring of Endless Coils", source = "SSC - Lady Vashj", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 28785, name = "The Lightning Capacitor", source = "Karazhan - Terestian Illhoof" },
|
||||
["Trinket1"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 29988, name = "The Nexus Key", source = "TK - Kael'thas Sunstrider", enchant = { id = 2679, name = "Major Spellpower" } },
|
||||
["SecondaryHand"] = { itemID = 29988, name = "The Nexus Key", source = "TK - Kael'thas Sunstrider" },
|
||||
["Ranged"] = { itemID = 28248, name = "Totem of the Void", source = "Mechanar - Cache of the Legion" },
|
||||
}
|
||||
|
||||
local SHAMAN_ENHANCEMENT_T5 = {
|
||||
["Head"] = { itemID = 30190, name = "Cataclysm Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 30017, name = "Telonicus's Pendant of Mayhem", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30055, name = "Shoulderpads of the Stranger", source = "SSC - Hydross the Unstable", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 29994, name = "Thalassian Wildercloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30185, name = "Cataclysm Chestplate", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 30091, name = "True-Aim Stalker Bands", source = "SSC - Leotheras the Blind", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Hands"] = { itemID = 30189, name = "Cataclysm Gauntlets", source = "SSC - Leotheras the Blind", enchant = { id = 2657, name = "Major Strength" } },
|
||||
["Waist"] = { itemID = 30106, name = "Belt of One-Hundred Deaths", source = "SSC - Lady Vashj" },
|
||||
["Legs"] = { itemID = 30192, name = "Cataclysm Legplates", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 30104, name = "Cobra-Lash Boots", source = "SSC - Lady Vashj", enchant = { id = 2658, name = "Cat's Swiftness" } },
|
||||
["Finger0"] = { itemID = 29997, name = "Band of the Ranger-General", source = "TK - Kael'thas Sunstrider", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 30052, name = "Ring of Lethality", source = "SSC - Hydross the Unstable", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 29383, name = "Bloodlust Brooch", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 32944, name = "Talon of the Phoenix", source = "TK - Al'ar", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["SecondaryHand"] = { itemID = 29996, name = "Rod of the Sun King", source = "TK - Kael'thas Sunstrider", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["Ranged"] = { itemID = 27815, name = "Totem of the Astral Winds", source = "Mana Tombs (H) - Pandemonius" },
|
||||
}
|
||||
|
||||
local SHAMAN_RESTO_T5 = {
|
||||
["Head"] = { itemID = 30166, name = "Cataclysm Headguard", source = "SSC - Lady Vashj", enchant = { id = 35445, name = "Glyph of Renewal" } },
|
||||
["Neck"] = { itemID = 30018, name = "Lord Sanguinar's Claim", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30168, name = "Cataclysm Shoulderguards", source = "TK - Void Reaver", enchant = { id = 2717, name = "Greater Inscription of Faith" } },
|
||||
["Back"] = { itemID = 29989, name = "Sunshower Light Cloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30164, name = "Cataclysm Chestguard", source = "TK - Kael'thas Sunstrider", enchant = { id = 2602, name = "Restore Mana Prime" } },
|
||||
["Wrist"] = { itemID = 30047, name = "Blackfathom Warbands", source = "SSC - Hydross the Unstable", enchant = { id = 1953, name = "Superior Healing" } },
|
||||
["Hands"] = { itemID = 29976, name = "Worldstorm Gauntlets", source = "TK - High Astromancer Solarian", enchant = { id = 2617, name = "Major Healing" } },
|
||||
["Waist"] = { itemID = 21873, name = "Primal Mooncloth Belt", source = "Tailoring Trainer (375)" },
|
||||
["Legs"] = { itemID = 29991, name = "Sunhawk Leggings", source = "TK - Kael'thas Sunstrider", enchant = { id = 2505, name = "Golden Spellthread" } },
|
||||
["Feet"] = { itemID = 30092, name = "Orca-Hide Boots", source = "SSC - Leotheras the Blind", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 28763, name = "Jade Ring of the Everliving", source = "Karazhan - Prince Malchezaar", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Finger1"] = { itemID = 29920, name = "Phoenix-Ring of Rebirth", source = "TK - Al'ar", enchant = { id = 2675, name = "Healing Power" } },
|
||||
["Trinket0"] = { itemID = 29376, name = "Essence of the Martyr", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 28190, name = "Scarab of the Infinite Cycle", source = "Black Morass - Aeonus" },
|
||||
["MainHand"] = { itemID = 30108, name = "Lightfathom Scepter", source = "SSC - Lady Vashj", enchant = { id = 2673, name = "Major Healing" } },
|
||||
["SecondaryHand"] = { itemID = 29458, name = "Aegis of the Vindicator", source = "Magtheridon's Lair - Magtheridon", enchant = { id = 2655, name = "Intellect" } },
|
||||
["Ranged"] = { itemID = 28523, name = "Totem of Healing Rains", source = "Karazhan - Maiden of Virtue" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- MAGE T5
|
||||
-- =============================================================================
|
||||
local MAGE_ARCANE_T5 = {
|
||||
["Head"] = { itemID = 30206, name = "Cowl of Tirisfal", source = "SSC - Lady Vashj", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30015, name = "The Sun King's Talisman", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30210, name = "Mantle of Tirisfal", source = "TK - Void Reaver", enchant = { id = 2715, name = "Greater Inscription of the Orb" } },
|
||||
["Back"] = { itemID = 29992, name = "Royal Cloak of the Sunstriders", source = "TK - Kael'thas Sunstrider", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30196, name = "Robes of Tirisfal", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 29987, name = "Gauntlets of the Sun King", source = "TK - Kael'thas Sunstrider", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 30207, name = "Leggings of Tirisfal", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 30067, name = "Velvet Boots of the Guardian", source = "SSC - The Lurker Below", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 29287, name = "Violet Signet of the Archmage", source = "The Violet Eye - Exalted", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 29302, name = "Band of Eternity", source = "Quest Reward - The Vials of Eternity", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 30720, name = "Serpent-Coil Braid", source = "SSC - Morogrim Tidewalker" },
|
||||
["MainHand"] = { itemID = 29988, name = "The Nexus Key", source = "TK - Kael'thas Sunstrider", enchant = { id = 2677, name = "Sunfire" } },
|
||||
["SecondaryHand"] = { itemID = 29988, name = "The Nexus Key", source = "TK - Kael'thas Sunstrider" },
|
||||
["Ranged"] = { itemID = 28783, name = "Eredar Wand of Obliteration", source = "Magtheridon's Lair - Magtheridon" },
|
||||
}
|
||||
|
||||
local MAGE_FIRE_T5 = {
|
||||
["Head"] = { itemID = 30206, name = "Cowl of Tirisfal", source = "SSC - Lady Vashj", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30015, name = "The Sun King's Talisman", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30210, name = "Mantle of Tirisfal", source = "TK - Void Reaver", enchant = { id = 2716, name = "Greater Inscription of Discipline" } },
|
||||
["Back"] = { itemID = 28797, name = "Brute Cloak of the Ogre-Magi", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30107, name = "Vestments of the Sea-Witch", source = "SSC - Lady Vashj", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 21847, name = "Spellfire Gloves", source = "Tailoring Trainer (375)", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 24262, name = "Spellstrike Pants", source = "Tailoring BoP (375)", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 30037, name = "Boots of Blasting", source = "Tailoring BoE (375)", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 29302, name = "Band of Eternity", source = "Quest Reward - The Vials of Eternity", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 28753, name = "Ring of Recurrence", source = "Karazhan - Chess Event", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 30626, name = "Sextant of Unstable Currents", source = "SSC - Fathom-Lord Karathress" },
|
||||
["MainHand"] = { itemID = 30095, name = "Fang of the Leviathan", source = "SSC - Leotheras the Blind", enchant = { id = 2677, name = "Sunfire" } },
|
||||
["SecondaryHand"] = { itemID = 29270, name = "Flametongue Seal", source = "Badge of Justice - G'eras" },
|
||||
["Ranged"] = { itemID = 29982, name = "Wand of the Forgotten Star", source = "TK - High Astromancer Solarian" },
|
||||
}
|
||||
|
||||
local MAGE_FROST_T5 = {
|
||||
["Head"] = { itemID = 30206, name = "Cowl of Tirisfal", source = "SSC - Lady Vashj", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30015, name = "The Sun King's Talisman", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30210, name = "Mantle of Tirisfal", source = "TK - Void Reaver", enchant = { id = 2716, name = "Greater Inscription of Discipline" } },
|
||||
["Back"] = { itemID = 28797, name = "Brute Cloak of the Ogre-Magi", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30107, name = "Vestments of the Sea-Witch", source = "SSC - Lady Vashj", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 28780, name = "Soul-Eater's Handwraps", source = "Magtheridon's Lair - Magtheridon", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 24262, name = "Spellstrike Pants", source = "Tailoring BoP (375)", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 21870, name = "Frozen Shadoweave Boots", source = "Tailoring Trainer (375)", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 29302, name = "Band of Eternity", source = "Quest Reward - The Vials of Eternity", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 28753, name = "Ring of Recurrence", source = "Karazhan - Chess Event", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["Trinket1"] = { itemID = 27683, name = "Quagmirran's Eye", source = "Slave Pens (H) - Quagmirran" },
|
||||
["MainHand"] = { itemID = 30095, name = "Fang of the Leviathan", source = "SSC - Leotheras the Blind", enchant = { id = 2677, name = "Sunfire" } },
|
||||
["SecondaryHand"] = { itemID = 29269, name = "Sapphiron's Wing Bone", source = "Badge of Justice - G'eras" },
|
||||
["Ranged"] = { itemID = 29982, name = "Wand of the Forgotten Star", source = "TK - High Astromancer Solarian" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- WARRIOR T5
|
||||
-- =============================================================================
|
||||
local WARRIOR_ARMS_T5 = {
|
||||
["Head"] = { itemID = 30120, name = "Destroyer Battle-Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 30022, name = "Pendant of the Perilous", source = "SSC - Trash Mobs" },
|
||||
["Shoulder"] = { itemID = 30055, name = "Shoulderpads of the Stranger", source = "SSC - Hydross the Unstable", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 24259, name = "Vengeance Wrap", source = "Tailoring BoE (365)", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30118, name = "Destroyer Breastplate", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 28795, name = "Bladespire Warbands", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Hands"] = { itemID = 30119, name = "Destroyer Gauntlets", source = "SSC - Leotheras the Blind", enchant = { id = 2657, name = "Major Strength" } },
|
||||
["Waist"] = { itemID = 30106, name = "Belt of One-Hundred Deaths", source = "SSC - Lady Vashj" },
|
||||
["Legs"] = { itemID = 30121, name = "Destroyer Greaves", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 30081, name = "Warboots of Obliteration", source = "SSC - Morogrim Tidewalker", enchant = { id = 2658, name = "Cat's Swiftness" } },
|
||||
["Finger0"] = { itemID = 29997, name = "Band of the Ranger-General", source = "TK - Kael'thas Sunstrider", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Finger1"] = { itemID = 30061, name = "Ancestral Ring of Conquest", source = "SSC - The Lurker Below", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 29383, name = "Bloodlust Brooch", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 29993, name = "Twinblade of the Phoenix", source = "TK - Kael'thas Sunstrider", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["Ranged"] = { itemID = 30105, name = "Serpent Spine Longbow", source = "SSC - Lady Vashj" },
|
||||
}
|
||||
|
||||
local WARRIOR_FURY_T5 = {
|
||||
["Head"] = { itemID = 30120, name = "Destroyer Battle-Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 30022, name = "Pendant of the Perilous", source = "SSC - Trash Mobs" },
|
||||
["Shoulder"] = { itemID = 30122, name = "Destroyer Shoulderblades", source = "TK - Void Reaver", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 24259, name = "Vengeance Wrap", source = "Tailoring BoE (365)", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30118, name = "Destroyer Breastplate", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 30057, name = "Bracers of Eradication", source = "SSC - The Lurker Below", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Hands"] = { itemID = 30119, name = "Destroyer Gauntlets", source = "SSC - Leotheras the Blind", enchant = { id = 2657, name = "Major Strength" } },
|
||||
["Waist"] = { itemID = 30106, name = "Belt of One-Hundred Deaths", source = "SSC - Lady Vashj" },
|
||||
["Legs"] = { itemID = 29995, name = "Leggings of Murderous Intent", source = "TK - Kael'thas Sunstrider", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 30081, name = "Warboots of Obliteration", source = "SSC - Morogrim Tidewalker", enchant = { id = 2658, name = "Cat's Swiftness" } },
|
||||
["Finger0"] = { itemID = 29997, name = "Band of the Ranger-General", source = "TK - Kael'thas Sunstrider", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Finger1"] = { itemID = 28757, name = "Ring of a Thousand Marks", source = "Karazhan - Prince Malchezaar", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 30627, name = "Tsunami Talisman", source = "SSC - Leotheras the Blind" },
|
||||
["MainHand"] = { itemID = 28439, name = "Dragonstrike", source = "Blacksmithing Trainer (375)", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["SecondaryHand"] = { itemID = 30082, name = "Talon of Azshara", source = "SSC - Morogrim Tidewalker", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["Ranged"] = { itemID = 30105, name = "Serpent Spine Longbow", source = "SSC - Lady Vashj" },
|
||||
}
|
||||
|
||||
local WARRIOR_PROT_T5 = {
|
||||
["Head"] = { itemID = 30115, name = "Destroyer Greathelm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 33066, name = "Veteran's Pendant of Triumph", source = "PvP - Honor Points & EotS Marks" },
|
||||
["Shoulder"] = { itemID = 30117, name = "Destroyer Shoulderguards", source = "TK - Void Reaver", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 29925, name = "Phoenix-Wing Cloak", source = "TK - Al'ar", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30113, name = "Destroyer Chestguard", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 32818, name = "Veteran's Plate Bracers", source = "PvP - Honor & WSG Marks", enchant = { id = 2653, name = "Fortitude" } },
|
||||
["Hands"] = { itemID = 29947, name = "Gloves of the Searing Grip", source = "TK - Al'ar", enchant = { id = 2659, name = "Threat" } },
|
||||
["Waist"] = { itemID = 30106, name = "Belt of One-Hundred Deaths", source = "SSC - Lady Vashj" },
|
||||
["Legs"] = { itemID = 30116, name = "Destroyer Legguards", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2504, name = "Nethercleft Leg Armor" } },
|
||||
["Feet"] = { itemID = 32793, name = "Veteran's Plate Greaves", source = "PvP - Honor & EotS Marks", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30834, name = "Shapeshifter's Signet", source = "Lower City - Exalted", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Finger1"] = { itemID = 30083, name = "Ring of Sundered Souls", source = "SSC - Morogrim Tidewalker", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Trinket0"] = { itemID = 28121, name = "Icon of Unyielding Courage", source = "Blood Furnace (H) - Keli'dan the Breaker" },
|
||||
["Trinket1"] = { itemID = 29383, name = "Bloodlust Brooch", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 30058, name = "Mallet of the Tides", source = "SSC - The Lurker Below", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["SecondaryHand"] = { itemID = 28825, name = "Aldori Legacy Defender", source = "Gruul's Lair - Gruul the Dragonkiller", enchant = { id = 2652, name = "Major Stamina" } },
|
||||
["Ranged"] = { itemID = 32756, name = "Gyro-Balanced Khorium Destroyer", source = "Engineering Trainer (375)" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- ROGUE T5
|
||||
-- =============================================================================
|
||||
local ROGUE_ASSASSINATION_T5 = {
|
||||
["Head"] = { itemID = 30146, name = "Deathmantle Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 29381, name = "Choker of Vile Intent", source = "Badge of Justice - G'eras" },
|
||||
["Shoulder"] = { itemID = 30149, name = "Deathmantle Shoulderpads", source = "TK - Void Reaver", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 28672, name = "Drape of the Dark Reavers", source = "Karazhan - Shade of Aran", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30101, name = "Bloodsea Brigand's Vest", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29966, name = "Vambraces of Ending", source = "TK - High Astromancer Solarian", enchant = { id = 2671, name = "Assault" } },
|
||||
["Hands"] = { itemID = 30145, name = "Deathmantle Handguards", source = "SSC - Leotheras the Blind", enchant = { id = 2656, name = "Superior Agility" } },
|
||||
["Waist"] = { itemID = 30106, name = "Belt of One-Hundred Deaths", source = "SSC - Lady Vashj" },
|
||||
["Legs"] = { itemID = 30148, name = "Deathmantle Legguards", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 28545, name = "Edgewalker Longboots", source = "Karazhan - Moroes", enchant = { id = 2658, name = "Cat's Swiftness" } },
|
||||
["Finger0"] = { itemID = 29997, name = "Band of the Ranger-General", source = "TK - Kael'thas Sunstrider", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Finger1"] = { itemID = 30052, name = "Ring of Lethality", source = "SSC - Hydross the Unstable", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 30450, name = "Warp-Spring Coil", source = "TK - Void Reaver" },
|
||||
["MainHand"] = { itemID = 30103, name = "Fang of Vashj", source = "SSC - Lady Vashj", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["SecondaryHand"] = { itemID = 29962, name = "Heartrazor", source = "TK - High Astromancer Solarian", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["Ranged"] = { itemID = 29949, name = "Arcanite Steam-Pistol", source = "TK - Al'ar" },
|
||||
}
|
||||
|
||||
local ROGUE_COMBAT_T5 = {
|
||||
["Head"] = { itemID = 30146, name = "Deathmantle Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 29381, name = "Choker of Vile Intent", source = "Badge of Justice - G'eras" },
|
||||
["Shoulder"] = { itemID = 30149, name = "Deathmantle Shoulderpads", source = "TK - Void Reaver", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 28672, name = "Drape of the Dark Reavers", source = "Karazhan - Shade of Aran", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30101, name = "Bloodsea Brigand's Vest", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29966, name = "Vambraces of Ending", source = "TK - High Astromancer Solarian", enchant = { id = 2671, name = "Assault" } },
|
||||
["Hands"] = { itemID = 30145, name = "Deathmantle Handguards", source = "SSC - Leotheras the Blind", enchant = { id = 2656, name = "Superior Agility" } },
|
||||
["Waist"] = { itemID = 30106, name = "Belt of One-Hundred Deaths", source = "SSC - Lady Vashj" },
|
||||
["Legs"] = { itemID = 30148, name = "Deathmantle Legguards", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 28545, name = "Edgewalker Longboots", source = "Karazhan - Moroes", enchant = { id = 2658, name = "Cat's Swiftness" } },
|
||||
["Finger0"] = { itemID = 29997, name = "Band of the Ranger-General", source = "TK - Kael'thas Sunstrider", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Finger1"] = { itemID = 30052, name = "Ring of Lethality", source = "SSC - Hydross the Unstable", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 30450, name = "Warp-Spring Coil", source = "TK - Void Reaver" },
|
||||
["MainHand"] = { itemID = 30082, name = "Talon of Azshara", source = "SSC - Morogrim Tidewalker", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["SecondaryHand"] = { itemID = 28189, name = "Latro's Shifting Sword", source = "Black Morass - Aeonus", enchant = { id = 2670, name = "Mongoose" } },
|
||||
["Ranged"] = { itemID = 29949, name = "Arcanite Steam-Pistol", source = "TK - Al'ar" },
|
||||
}
|
||||
|
||||
local ROGUE_SUBTLETY_T5 = ROGUE_COMBAT_T5
|
||||
|
||||
-- =============================================================================
|
||||
-- HUNTER T5
|
||||
-- =============================================================================
|
||||
local HUNTER_BM_T5 = {
|
||||
["Head"] = { itemID = 30141, name = "Rift Stalker Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 30017, name = "Telonicus's Pendant of Mayhem", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30143, name = "Rift Stalker Mantle", source = "TK - Void Reaver", enchant = { id = 2718, name = "Greater Inscription of Vengeance" } },
|
||||
["Back"] = { itemID = 29994, name = "Thalassian Wildercloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30139, name = "Rift Stalker Hauberk", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29966, name = "Vambraces of Ending", source = "TK - High Astromancer Solarian", enchant = { id = 2671, name = "Assault" } },
|
||||
["Hands"] = { itemID = 30140, name = "Rift Stalker Gauntlets", source = "SSC - Leotheras the Blind", enchant = { id = 2656, name = "Superior Agility" } },
|
||||
["Waist"] = { itemID = 30040, name = "Belt of Deep Shadow", source = "Leatherworking BoP (375)" },
|
||||
["Legs"] = { itemID = 29995, name = "Leggings of Murderous Intent", source = "TK - Kael'thas Sunstrider", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 30104, name = "Cobra-Lash Boots", source = "SSC - Lady Vashj", enchant = { id = 2658, name = "Cat's Swiftness" } },
|
||||
["Finger0"] = { itemID = 29997, name = "Band of the Ranger-General", source = "TK - Kael'thas Sunstrider", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Finger1"] = { itemID = 28791, name = "Ring of the Recalcitrant", source = "Quest Reward - The Fall of Magtheridon", enchant = { id = 2671, name = "Brawn" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 29383, name = "Bloodlust Brooch", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 29993, name = "Twinblade of the Phoenix", source = "TK - Kael'thas Sunstrider", enchant = { id = 2669, name = "Major Agility" } },
|
||||
["Ranged"] = { itemID = 30105, name = "Serpent Spine Longbow", source = "SSC - Lady Vashj", enchant = { id = 23766, name = "Stabilized Eternium Scope" } },
|
||||
}
|
||||
|
||||
local HUNTER_MM_T5 = HUNTER_BM_T5
|
||||
|
||||
local HUNTER_SURVIVAL_T5 = {
|
||||
["Head"] = { itemID = 30141, name = "Rift Stalker Helm", source = "SSC - Lady Vashj", enchant = { id = 35446, name = "Glyph of Ferocity" } },
|
||||
["Neck"] = { itemID = 30017, name = "Telonicus's Pendant of Mayhem", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 30143, name = "Rift Stalker Mantle", source = "TK - Void Reaver", enchant = { id = 2715, name = "Greater Inscription of the Blade" } },
|
||||
["Back"] = { itemID = 29994, name = "Thalassian Wildercloak", source = "TK - Kael'thas Sunstrider", enchant = { id = 2621, name = "Greater Agility" } },
|
||||
["Chest"] = { itemID = 30139, name = "Rift Stalker Hauberk", source = "TK - Kael'thas Sunstrider", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29966, name = "Vambraces of Ending", source = "TK - High Astromancer Solarian", enchant = { id = 2663, name = "Stats" } },
|
||||
["Hands"] = { itemID = 28506, name = "Gloves of Dexterous Manipulation", source = "Karazhan - Attumen the Huntsman", enchant = { id = 2656, name = "Superior Agility" } },
|
||||
["Waist"] = { itemID = 30040, name = "Belt of Deep Shadow", source = "Leatherworking BoP (375)" },
|
||||
["Legs"] = { itemID = 30142, name = "Rift Stalker Leggings", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2506, name = "Nethercobra Leg Armor" } },
|
||||
["Feet"] = { itemID = 30104, name = "Cobra-Lash Boots", source = "SSC - Lady Vashj", enchant = { id = 2654, name = "Dexterity" } },
|
||||
["Finger0"] = { itemID = 29302, name = "Band of Eternity", source = "Quest Reward - The Vials of Eternity", enchant = { id = 2663, name = "Stats" } },
|
||||
["Finger1"] = { itemID = 28791, name = "Ring of the Recalcitrant", source = "Quest Reward - The Fall of Magtheridon", enchant = { id = 2663, name = "Stats" } },
|
||||
["Trinket0"] = { itemID = 28830, name = "Dragonspine Trophy", source = "Gruul's Lair - Gruul the Dragonkiller" },
|
||||
["Trinket1"] = { itemID = 29383, name = "Bloodlust Brooch", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 29993, name = "Twinblade of the Phoenix", source = "TK - Kael'thas Sunstrider", enchant = { id = 2669, name = "Major Agility" } },
|
||||
["Ranged"] = { itemID = 30105, name = "Serpent Spine Longbow", source = "SSC - Lady Vashj", enchant = { id = 23766, name = "Stabilized Eternium Scope" } },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- WARLOCK T5 (all specs share same gear)
|
||||
-- =============================================================================
|
||||
local WARLOCK_T5 = {
|
||||
["Head"] = { itemID = 30212, name = "Hood of the Corruptor", source = "SSC - Lady Vashj", enchant = { id = 35444, name = "Glyph of Power" } },
|
||||
["Neck"] = { itemID = 30015, name = "The Sun King's Talisman", source = "Quest Reward - Kael'thas and the Verdant Sphere" },
|
||||
["Shoulder"] = { itemID = 28967, name = "Voidheart Mantle", source = "Gruul's Lair - High King Maulgar", enchant = { id = 2716, name = "Greater Inscription of Discipline" } },
|
||||
["Back"] = { itemID = 28766, name = "Ruby Drape of the Mysticant", source = "Karazhan - Prince Malchezaar", enchant = { id = 2623, name = "Subtlety" } },
|
||||
["Chest"] = { itemID = 30107, name = "Vestments of the Sea-Witch", source = "SSC - Lady Vashj", enchant = { id = 2587, name = "Exceptional Stats" } },
|
||||
["Wrist"] = { itemID = 29918, name = "Mindstorm Wristbands", source = "TK - Al'ar", enchant = { id = 2678, name = "Spellpower" } },
|
||||
["Hands"] = { itemID = 28968, name = "Voidheart Gloves", source = "Karazhan - The Curator", enchant = { id = 2676, name = "Major Spellpower" } },
|
||||
["Waist"] = { itemID = 30038, name = "Belt of Blasting", source = "Tailoring BoP (375)" },
|
||||
["Legs"] = { itemID = 30213, name = "Leggings of the Corruptor", source = "SSC - Fathom-Lord Karathress", enchant = { id = 2507, name = "Runic Spellthread" } },
|
||||
["Feet"] = { itemID = 30037, name = "Boots of Blasting", source = "Tailoring BoE (375)", enchant = { id = 2660, name = "Boar's Speed" } },
|
||||
["Finger0"] = { itemID = 30109, name = "Ring of Endless Coils", source = "SSC - Lady Vashj", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Finger1"] = { itemID = 29302, name = "Band of Eternity", source = "Quest Reward - The Vials of Eternity", enchant = { id = 2676, name = "Spellpower" } },
|
||||
["Trinket0"] = { itemID = 27683, name = "Quagmirran's Eye", source = "Slave Pens (H) - Quagmirran" },
|
||||
["Trinket1"] = { itemID = 29370, name = "Icon of the Silver Crescent", source = "Badge of Justice - G'eras" },
|
||||
["MainHand"] = { itemID = 30095, name = "Fang of the Leviathan", source = "SSC - Leotheras the Blind", enchant = { id = 2674, name = "Soulfrost" } },
|
||||
["SecondaryHand"] = { itemID = 30049, name = "Fathomstone", source = "SSC - Hydross the Unstable" },
|
||||
["Ranged"] = { itemID = 29982, name = "Wand of the Forgotten Star", source = "TK - High Astromancer Solarian" },
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- BIS DATA REGISTRY
|
||||
-- =============================================================================
|
||||
|
||||
local BIS_DATA = {
|
||||
["PRIEST"] = {
|
||||
["Discipline"] = { ["T5"] = PRIEST_T5 },
|
||||
["Holy"] = { ["T5"] = PRIEST_T5 },
|
||||
["Shadow"] = { ["T5"] = PRIEST_SHADOW_T5 },
|
||||
},
|
||||
["DRUID"] = {
|
||||
["Balance"] = { ["T5"] = DRUID_BALANCE_T5 },
|
||||
["Restoration"] = { ["T5"] = DRUID_RESTO_T5 },
|
||||
},
|
||||
["PALADIN"] = {
|
||||
["Holy"] = { ["T5"] = PALADIN_HOLY_T5 },
|
||||
},
|
||||
["SHAMAN"] = {
|
||||
["Elemental"] = { ["T5"] = SHAMAN_ELEMENTAL_T5 },
|
||||
["Enhancement"] = { ["T5"] = SHAMAN_ENHANCEMENT_T5 },
|
||||
["Restoration"] = { ["T5"] = SHAMAN_RESTO_T5 },
|
||||
},
|
||||
["MAGE"] = {
|
||||
["Arcane"] = { ["T5"] = MAGE_ARCANE_T5 },
|
||||
["Fire"] = { ["T5"] = MAGE_FIRE_T5 },
|
||||
["Frost"] = { ["T5"] = MAGE_FROST_T5 },
|
||||
},
|
||||
["WARRIOR"] = {
|
||||
["Arms"] = { ["T5"] = WARRIOR_ARMS_T5 },
|
||||
["Fury"] = { ["T5"] = WARRIOR_FURY_T5 },
|
||||
["Protection"] = { ["T5"] = WARRIOR_PROT_T5 },
|
||||
},
|
||||
["ROGUE"] = {
|
||||
["Assassination"] = { ["T5"] = ROGUE_ASSASSINATION_T5 },
|
||||
["Combat"] = { ["T5"] = ROGUE_COMBAT_T5 },
|
||||
["Subtlety"] = { ["T5"] = ROGUE_SUBTLETY_T5 },
|
||||
},
|
||||
["HUNTER"] = {
|
||||
["Beast Mastery"] = { ["T5"] = HUNTER_BM_T5 },
|
||||
["Marksmanship"] = { ["T5"] = HUNTER_MM_T5 },
|
||||
["Survival"] = { ["T5"] = HUNTER_SURVIVAL_T5 },
|
||||
},
|
||||
["WARLOCK"] = {
|
||||
["Affliction"] = { ["T5"] = WARLOCK_T5 },
|
||||
["Demonology"] = { ["T5"] = WARLOCK_T5 },
|
||||
["Destruction"] = { ["T5"] = WARLOCK_T5 },
|
||||
},
|
||||
}
|
||||
|
||||
-- =============================================================================
|
||||
-- PUBLIC API
|
||||
-- =============================================================================
|
||||
|
||||
function ns.Data.BISLists:GetBISList(class, spec, phase)
|
||||
if not BIS_DATA[class] then return nil end
|
||||
if not BIS_DATA[class][spec] then return nil end
|
||||
return BIS_DATA[class][spec][phase]
|
||||
end
|
||||
|
||||
function ns.Data.BISLists:GetAvailableClasses()
|
||||
local classes = {}
|
||||
for class, _ in pairs(BIS_DATA) do
|
||||
table.insert(classes, class)
|
||||
end
|
||||
return classes
|
||||
end
|
||||
|
||||
function ns.Data.BISLists:GetAvailableSpecs(class)
|
||||
if not BIS_DATA[class] then return {} end
|
||||
local specs = {}
|
||||
for spec, _ in pairs(BIS_DATA[class]) do
|
||||
table.insert(specs, spec)
|
||||
end
|
||||
return specs
|
||||
end
|
||||
|
||||
function ns.Data.BISLists:GetAvailablePhases(class, spec)
|
||||
if not BIS_DATA[class] or not BIS_DATA[class][spec] then return {} end
|
||||
local phases = {}
|
||||
for phase, _ in pairs(BIS_DATA[class][spec]) do
|
||||
table.insert(phases, phase)
|
||||
end
|
||||
return phases
|
||||
end
|
||||
561
Amibis/UI/ComparisonFrame.lua
Normal file
561
Amibis/UI/ComparisonFrame.lua
Normal file
@@ -0,0 +1,561 @@
|
||||
local _, ns = ...
|
||||
ns.UI = ns.UI or {}
|
||||
local Amibis = ns.Amibis
|
||||
|
||||
ns.UI.Frame = {}
|
||||
|
||||
local ELVUI_BACKDROP_COLOR = { 0.07, 0.07, 0.07 }
|
||||
local ELVUI_BACKDROP_ALPHA = 0.95
|
||||
local ELVUI_BORDER_COLOR = { 0.23, 0.23, 0.23 }
|
||||
local ELVUI_BORDER_ALPHA = 1.0
|
||||
local ELVUI_TITLE_BG = { 0.15, 0.15, 0.15 }
|
||||
|
||||
local COLOR_BIS = { 0.0, 1.0, 0.0 }
|
||||
local COLOR_UPGRADE = { 1.0, 0.82, 0.0 }
|
||||
local COLOR_EMPTY = { 0.6, 0.6, 0.6 }
|
||||
|
||||
local MainFrame = nil
|
||||
local TitleText = nil
|
||||
local SummaryText = nil
|
||||
local UpgradeText = nil
|
||||
local ScrollFrame = nil
|
||||
local SlotRows = {}
|
||||
local MAX_VISIBLE_ROWS = 17
|
||||
local ROW_HEIGHT = 22
|
||||
local ROW_SPACING = 24
|
||||
|
||||
local function CreateMainFrame()
|
||||
local frame = CreateFrame("Frame", "AmibisMainFrame", UIParent, "BackdropTemplate")
|
||||
frame:SetSize(480, 680)
|
||||
frame:SetFrameStrata("MEDIUM")
|
||||
frame:SetFrameLevel(10)
|
||||
|
||||
frame:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8x8",
|
||||
edgeFile = "Interface\\Buttons\\WHITE8x8",
|
||||
tile = false,
|
||||
tileSize = 0,
|
||||
edgeSize = 1,
|
||||
insets = { left = 0, right = 0, top = 0, bottom = 0 }
|
||||
})
|
||||
frame:SetBackdropColor(ELVUI_BACKDROP_COLOR[1], ELVUI_BACKDROP_COLOR[2], ELVUI_BACKDROP_COLOR[3], ELVUI_BACKDROP_ALPHA)
|
||||
frame:SetBackdropBorderColor(ELVUI_BORDER_COLOR[1], ELVUI_BORDER_COLOR[2], ELVUI_BORDER_COLOR[3], ELVUI_BORDER_ALPHA)
|
||||
|
||||
frame:SetMovable(true)
|
||||
frame:EnableMouse(true)
|
||||
frame:RegisterForDrag("LeftButton")
|
||||
frame:SetClampedToScreen(true)
|
||||
|
||||
frame:SetScript("OnDragStart", function(self)
|
||||
self:StartMoving()
|
||||
end)
|
||||
frame:SetScript("OnDragStop", function(self)
|
||||
self:StopMovingOrSizing()
|
||||
Amibis:SaveFramePosition(self)
|
||||
end)
|
||||
|
||||
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||
return frame
|
||||
end
|
||||
|
||||
local function CreateTitleBar(parent)
|
||||
local titleBar = CreateFrame("Frame", nil, parent, "BackdropTemplate")
|
||||
titleBar:SetPoint("TOPLEFT", parent, "TOPLEFT", 0, 0)
|
||||
titleBar:SetPoint("TOPRIGHT", parent, "TOPRIGHT", 0, 0)
|
||||
titleBar:SetHeight(28)
|
||||
|
||||
titleBar:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8x8",
|
||||
edgeFile = "Interface\\Buttons\\WHITE8x8",
|
||||
tile = false,
|
||||
edgeSize = 1,
|
||||
insets = { left = 0, right = 0, top = 0, bottom = 0 }
|
||||
})
|
||||
titleBar:SetBackdropColor(ELVUI_TITLE_BG[1], ELVUI_TITLE_BG[2], ELVUI_TITLE_BG[3], 1.0)
|
||||
titleBar:SetBackdropBorderColor(ELVUI_BORDER_COLOR[1], ELVUI_BORDER_COLOR[2], ELVUI_BORDER_COLOR[3], 1.0)
|
||||
|
||||
local titleText = titleBar:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
titleText:SetPoint("LEFT", titleBar, "LEFT", 8, 0)
|
||||
titleText:SetText("Amibis - Gear Comparison")
|
||||
titleText:SetTextColor(1, 1, 1, 1)
|
||||
|
||||
local closeBtn = CreateFrame("Button", nil, titleBar)
|
||||
closeBtn:SetSize(20, 20)
|
||||
closeBtn:SetPoint("RIGHT", titleBar, "RIGHT", -4, 0)
|
||||
closeBtn:SetText("X")
|
||||
closeBtn:SetNormalFontObject("GameFontNormal")
|
||||
closeBtn:SetScript("OnClick", function()
|
||||
if MainFrame and MainFrame:IsShown() then
|
||||
MainFrame:Hide()
|
||||
end
|
||||
end)
|
||||
|
||||
titleBar:EnableMouse(true)
|
||||
titleBar:RegisterForDrag("LeftButton")
|
||||
titleBar:SetScript("OnDragStart", function()
|
||||
parent:StartMoving()
|
||||
end)
|
||||
titleBar:SetScript("OnDragStop", function()
|
||||
parent:StopMovingOrSizing()
|
||||
Amibis:SaveFramePosition(parent)
|
||||
end)
|
||||
|
||||
return titleBar, titleText
|
||||
end
|
||||
|
||||
local function CreateSummaryBar(parent, anchor)
|
||||
local bar = CreateFrame("Frame", nil, parent)
|
||||
bar:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, -4)
|
||||
bar:SetPoint("TOPRIGHT", anchor, "BOTTOMRIGHT", 0, -4)
|
||||
bar:SetHeight(20)
|
||||
|
||||
local summaryText = bar:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
summaryText:SetPoint("LEFT", bar, "LEFT", 8, 0)
|
||||
summaryText:SetTextColor(0.8, 0.8, 0.8, 1)
|
||||
|
||||
local upgradeText = bar:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
upgradeText:SetPoint("BOTTOMLEFT", bar, "TOPLEFT", 8, 2)
|
||||
upgradeText:SetPoint("BOTTOMRIGHT", bar, "TOPRIGHT", -8, 2)
|
||||
upgradeText:SetJustifyH("LEFT")
|
||||
upgradeText:SetTextColor(COLOR_UPGRADE[1], COLOR_UPGRADE[2], COLOR_UPGRADE[3], 1)
|
||||
|
||||
return bar, summaryText, upgradeText
|
||||
end
|
||||
|
||||
local function CreateColumnHeaders(parent, anchor)
|
||||
local header = CreateFrame("Frame", nil, parent, "BackdropTemplate")
|
||||
header:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, -4)
|
||||
header:SetPoint("TOPRIGHT", anchor, "BOTTOMRIGHT", 0, -4)
|
||||
header:SetHeight(18)
|
||||
|
||||
header:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8x8",
|
||||
edgeFile = "Interface\\Buttons\\WHITE8x8",
|
||||
edgeSize = 1,
|
||||
insets = { left = 0, right = 0, top = 0, bottom = 0 }
|
||||
})
|
||||
header:SetBackdropColor(0.12, 0.12, 0.12, 0.5)
|
||||
|
||||
local slotHeader = header:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
slotHeader:SetPoint("LEFT", header, "LEFT", 8, 0)
|
||||
slotHeader:SetWidth(55)
|
||||
slotHeader:SetJustifyH("LEFT")
|
||||
slotHeader:SetText("Slot")
|
||||
slotHeader:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
local equippedHeader = header:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
equippedHeader:SetPoint("LEFT", slotHeader, "RIGHT", 5, 0)
|
||||
equippedHeader:SetWidth(115)
|
||||
equippedHeader:SetJustifyH("LEFT")
|
||||
equippedHeader:SetText("Equipped")
|
||||
equippedHeader:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
local bisHeader = header:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
bisHeader:SetPoint("LEFT", equippedHeader, "RIGHT", 5, 0)
|
||||
bisHeader:SetWidth(115)
|
||||
bisHeader:SetJustifyH("LEFT")
|
||||
bisHeader:SetText("BIS Item")
|
||||
bisHeader:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
local enchantHeader = header:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
enchantHeader:SetPoint("LEFT", bisHeader, "RIGHT", 5, 0)
|
||||
enchantHeader:SetWidth(60)
|
||||
enchantHeader:SetJustifyH("LEFT")
|
||||
enchantHeader:SetText("Enchant")
|
||||
enchantHeader:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
local sourceHeader = header:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
sourceHeader:SetPoint("RIGHT", header, "RIGHT", -8, 0)
|
||||
sourceHeader:SetWidth(70)
|
||||
sourceHeader:SetJustifyH("RIGHT")
|
||||
sourceHeader:SetText("Source")
|
||||
sourceHeader:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
return header
|
||||
end
|
||||
|
||||
local function CreateSlotRows(parent, anchor)
|
||||
local container = CreateFrame("Frame", nil, parent)
|
||||
container:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, -4)
|
||||
container:SetPoint("TOPRIGHT", anchor, "BOTTOMRIGHT", 0, -4)
|
||||
container:SetHeight(MAX_VISIBLE_ROWS * ROW_SPACING)
|
||||
|
||||
for i = 1, MAX_VISIBLE_ROWS do
|
||||
local row = CreateFrame("Button", nil, container)
|
||||
row:SetPoint("TOPLEFT", container, "TOPLEFT", 0, -(i - 1) * ROW_SPACING)
|
||||
row:SetPoint("TOPRIGHT", container, "TOPRIGHT", 0, -(i - 1) * ROW_SPACING)
|
||||
row:SetHeight(ROW_HEIGHT)
|
||||
|
||||
row.slotText = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.slotText:SetPoint("LEFT", row, "LEFT", 8, 0)
|
||||
row.slotText:SetWidth(55)
|
||||
row.slotText:SetJustifyH("LEFT")
|
||||
|
||||
row.equippedText = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.equippedText:SetPoint("LEFT", row.slotText, "RIGHT", 5, 0)
|
||||
row.equippedText:SetWidth(115)
|
||||
row.equippedText:SetJustifyH("LEFT")
|
||||
row.equippedText:SetWordWrap(true)
|
||||
|
||||
row.bisText = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.bisText:SetPoint("LEFT", row.equippedText, "RIGHT", 5, 0)
|
||||
row.bisText:SetWidth(115)
|
||||
row.bisText:SetJustifyH("LEFT")
|
||||
row.bisText:SetWordWrap(true)
|
||||
|
||||
row.enchantText = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.enchantText:SetPoint("LEFT", row.bisText, "RIGHT", 5, 0)
|
||||
row.enchantText:SetWidth(60)
|
||||
row.enchantText:SetJustifyH("LEFT")
|
||||
|
||||
row.sourceText = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.sourceText:SetPoint("RIGHT", row, "RIGHT", -8, 0)
|
||||
row.sourceText:SetWidth(70)
|
||||
row.sourceText:SetJustifyH("RIGHT")
|
||||
row.sourceText:SetWordWrap(true)
|
||||
|
||||
row:SetScript("OnEnter", function(self)
|
||||
if self.bisLink then
|
||||
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
|
||||
GameTooltip:SetHyperlink(self.bisLink)
|
||||
GameTooltip:Show()
|
||||
end
|
||||
end)
|
||||
row:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
end)
|
||||
row:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
||||
row:SetScript("OnClick", function(self, button)
|
||||
if self.bisLink and button == "LeftButton" then
|
||||
if IsShiftKeyDown() then
|
||||
ChatEdit_InsertLink(self.bisLink)
|
||||
elseif IsControlKeyDown() then
|
||||
DressUpItemLink(self.bisLink)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
SlotRows[i] = row
|
||||
end
|
||||
|
||||
return container
|
||||
end
|
||||
|
||||
local StatsPanel = nil
|
||||
local StatsPanelTitle = nil
|
||||
local StatLabels = {}
|
||||
local StatValues = {}
|
||||
|
||||
local STAT_DISPLAY = {
|
||||
{ key = "healing", label = "+Healing" },
|
||||
{ key = "spellPower", label = "+Spell Power" },
|
||||
{ key = "intellect", label = "Intellect" },
|
||||
{ key = "spirit", label = "Spirit" },
|
||||
{ key = "mp5", label = "MP5" },
|
||||
{ key = "haste", label = "Haste" },
|
||||
{ key = "crit", label = "Crit" },
|
||||
}
|
||||
|
||||
local function CreateStatsPanel(parent, anchor)
|
||||
local panel = CreateFrame("Frame", nil, parent, "BackdropTemplate")
|
||||
panel:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, -8)
|
||||
panel:SetPoint("TOPRIGHT", anchor, "BOTTOMRIGHT", 0, -8)
|
||||
panel:SetHeight(#STAT_DISPLAY * 16 + 24)
|
||||
|
||||
panel:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8x8",
|
||||
edgeFile = "Interface\\Buttons\\WHITE8x8",
|
||||
edgeSize = 1,
|
||||
insets = { left = 0, right = 0, top = 0, bottom = 0 }
|
||||
})
|
||||
panel:SetBackdropColor(0.1, 0.1, 0.1, 0.6)
|
||||
panel:SetBackdropBorderColor(0.2, 0.2, 0.2, 1)
|
||||
|
||||
local title = panel:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
title:SetPoint("TOPLEFT", panel, "TOPLEFT", 8, -4)
|
||||
title:SetText("Stats Comparison")
|
||||
title:SetTextColor(1, 0.82, 0, 1)
|
||||
StatsPanelTitle = title
|
||||
|
||||
local colW = 60
|
||||
local labelW = 80
|
||||
local currentX = labelW + 16
|
||||
local bisX = currentX + colW
|
||||
local diffX = bisX + colW
|
||||
|
||||
local currentLabel = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
currentLabel:SetPoint("TOPLEFT", panel, "TOPLEFT", currentX, -4)
|
||||
currentLabel:SetWidth(colW)
|
||||
currentLabel:SetJustifyH("CENTER")
|
||||
currentLabel:SetText("Current")
|
||||
currentLabel:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
local bisLabel = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
bisLabel:SetPoint("TOPLEFT", panel, "TOPLEFT", bisX, -4)
|
||||
bisLabel:SetWidth(colW)
|
||||
bisLabel:SetJustifyH("CENTER")
|
||||
bisLabel:SetText("BIS")
|
||||
bisLabel:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
local diffLabel = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
diffLabel:SetPoint("TOPLEFT", panel, "TOPLEFT", diffX, -4)
|
||||
diffLabel:SetWidth(colW)
|
||||
diffLabel:SetJustifyH("CENTER")
|
||||
diffLabel:SetText("Diff")
|
||||
diffLabel:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
for i, stat in ipairs(STAT_DISPLAY) do
|
||||
local y = -(i - 1) * 16 - 22
|
||||
|
||||
local label = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
label:SetPoint("TOPLEFT", panel, "TOPLEFT", 8, y)
|
||||
label:SetWidth(labelW)
|
||||
label:SetJustifyH("RIGHT")
|
||||
label:SetText(stat.label)
|
||||
label:SetTextColor(0.6, 0.6, 0.6, 1)
|
||||
|
||||
local current = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
current:SetPoint("TOPLEFT", panel, "TOPLEFT", currentX, y)
|
||||
current:SetWidth(colW)
|
||||
current:SetJustifyH("CENTER")
|
||||
current:SetText("0")
|
||||
current:SetTextColor(1, 0.5, 0.5, 1)
|
||||
|
||||
local bis = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
bis:SetPoint("TOPLEFT", panel, "TOPLEFT", bisX, y)
|
||||
bis:SetWidth(colW)
|
||||
bis:SetJustifyH("CENTER")
|
||||
bis:SetText("0")
|
||||
bis:SetTextColor(0, 1, 0, 1)
|
||||
|
||||
local diff = panel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
diff:SetPoint("TOPLEFT", panel, "TOPLEFT", diffX, y)
|
||||
diff:SetWidth(colW)
|
||||
diff:SetJustifyH("CENTER")
|
||||
diff:SetText("0")
|
||||
diff:SetTextColor(1, 1, 1, 1)
|
||||
|
||||
StatLabels[stat.key] = label
|
||||
StatValues[stat.key] = { current = current, bis = bis, diff = diff }
|
||||
end
|
||||
|
||||
StatsPanel = panel
|
||||
return panel
|
||||
end
|
||||
|
||||
local function InitializeUI()
|
||||
if MainFrame then return end
|
||||
|
||||
MainFrame = CreateMainFrame()
|
||||
local titleBar, title = CreateTitleBar(MainFrame)
|
||||
TitleText = title
|
||||
|
||||
local summaryBar, summary, upgrade = CreateSummaryBar(MainFrame, titleBar)
|
||||
SummaryText = summary
|
||||
UpgradeText = upgrade
|
||||
|
||||
local header = CreateColumnHeaders(MainFrame, summaryBar)
|
||||
local slotContainer = CreateSlotRows(MainFrame, header)
|
||||
CreateStatsPanel(MainFrame, slotContainer)
|
||||
|
||||
if AmibisCharDB and AmibisCharDB.frameX then
|
||||
MainFrame:ClearAllPoints()
|
||||
Amibis:LoadFramePosition(MainFrame)
|
||||
end
|
||||
|
||||
MainFrame:Hide()
|
||||
end
|
||||
|
||||
function ns.UI.Initialize()
|
||||
InitializeUI()
|
||||
end
|
||||
|
||||
function ns.UI.ToggleFrame()
|
||||
if not MainFrame then
|
||||
InitializeUI()
|
||||
end
|
||||
|
||||
if MainFrame:IsShown() then
|
||||
MainFrame:Hide()
|
||||
if Amibis._statsRetryTimer then
|
||||
Amibis._statsRetryTimer:Hide()
|
||||
Amibis._statsRetryTimer = nil
|
||||
end
|
||||
else
|
||||
MainFrame:Show()
|
||||
ns.UI.RefreshUI()
|
||||
end
|
||||
end
|
||||
|
||||
function ns.UI.RefreshUI()
|
||||
if not MainFrame or not MainFrame:IsShown() then
|
||||
return
|
||||
end
|
||||
|
||||
local data = Amibis:CompareGear()
|
||||
|
||||
TitleText:SetText(string.format("Amibis - %s %s (%s)", data.class, data.spec or "Unknown", data.phase))
|
||||
|
||||
if not data.hasBISList then
|
||||
SummaryText:SetText(string.format("|cffff6666No BIS list available for %s %s in %s|r", data.class, data.spec or "Unknown", data.phase))
|
||||
UpgradeText:SetText("")
|
||||
for i = 1, MAX_VISIBLE_ROWS do
|
||||
SlotRows[i].slotText:SetText("")
|
||||
SlotRows[i].equippedText:SetText("")
|
||||
SlotRows[i].bisText:SetText("")
|
||||
SlotRows[i].enchantText:SetText("")
|
||||
SlotRows[i].sourceText:SetText("")
|
||||
SlotRows[i].bisLink = nil
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
SummaryText:SetText(string.format("BIS: %d/%d slots", data.bisCount, data.totalSlots))
|
||||
|
||||
if data.biggestUpgrade then
|
||||
local bu = data.biggestUpgrade
|
||||
if bu.equipped then
|
||||
UpgradeText:SetText(string.format("Biggest upgrade: %s -> %s (%s)", bu.equipped.name, bu.bis.name, bu.bis.source))
|
||||
else
|
||||
UpgradeText:SetText(string.format("Empty slot: %s -> %s (%s)", bu.slot, bu.bis.name, bu.bis.source))
|
||||
end
|
||||
else
|
||||
UpgradeText:SetText("|cff00ff00All slots are BIS!|r")
|
||||
end
|
||||
|
||||
for i = 1, MAX_VISIBLE_ROWS do
|
||||
local row = SlotRows[i]
|
||||
local slotData = data.slots[i]
|
||||
if slotData then
|
||||
row.slotText:SetText(slotData.slotName)
|
||||
row.slotText:SetTextColor(0.7, 0.7, 0.7, 1)
|
||||
|
||||
if slotData.isBIS then
|
||||
row.equippedText:SetText(slotData.equipped.link or slotData.equipped.name)
|
||||
row.equippedText:SetTextColor(COLOR_BIS[1], COLOR_BIS[2], COLOR_BIS[3], 1)
|
||||
row.bisText:SetText("|cff00ff00BIS|r")
|
||||
row.bisText:SetTextColor(COLOR_BIS[1], COLOR_BIS[2], COLOR_BIS[3], 1)
|
||||
row.sourceText:SetText(slotData.bis.source)
|
||||
row.sourceText:SetTextColor(0.5, 0.5, 0.5, 1)
|
||||
row.bisLink = slotData.equipped and slotData.equipped.link
|
||||
if slotData.bis.enchant and slotData.equipped then
|
||||
local hasEnchant = false
|
||||
local link = slotData.equipped.link
|
||||
if link then
|
||||
local parts = {}
|
||||
for part in link:gmatch("([^:]+)") do
|
||||
table.insert(parts, part)
|
||||
end
|
||||
local enchantID = tonumber(parts[3])
|
||||
if enchantID and enchantID > 0 then
|
||||
hasEnchant = true
|
||||
end
|
||||
end
|
||||
if hasEnchant then
|
||||
row.enchantText:SetText("|cff00ff00" .. slotData.bis.enchant.name .. "|r")
|
||||
else
|
||||
row.enchantText:SetText("|cffff6666" .. slotData.bis.enchant.name .. "|r")
|
||||
end
|
||||
elseif slotData.bis.enchant then
|
||||
row.enchantText:SetText("|cffffcc00" .. slotData.bis.enchant.name .. "|r")
|
||||
else
|
||||
row.enchantText:SetText("")
|
||||
end
|
||||
else
|
||||
if slotData.equipped then
|
||||
row.equippedText:SetText(slotData.equipped.link or slotData.equipped.name)
|
||||
row.equippedText:SetTextColor(1, 0.5, 0.5, 1)
|
||||
else
|
||||
row.equippedText:SetText("|cff666666Empty|r")
|
||||
row.equippedText:SetTextColor(COLOR_EMPTY[1], COLOR_EMPTY[2], COLOR_EMPTY[3], 1)
|
||||
end
|
||||
row.bisText:SetText(slotData.bis.name)
|
||||
row.bisText:SetTextColor(COLOR_UPGRADE[1], COLOR_UPGRADE[2], COLOR_UPGRADE[3], 1)
|
||||
row.sourceText:SetText(slotData.bis.source)
|
||||
row.sourceText:SetTextColor(0.5, 0.5, 0.5, 1)
|
||||
if slotData.bis.enchant then
|
||||
row.enchantText:SetText("|cffffcc00" .. slotData.bis.enchant.name .. "|r")
|
||||
else
|
||||
row.enchantText:SetText("")
|
||||
end
|
||||
local _, bisLink = GetItemInfo(slotData.bis.itemID)
|
||||
row.bisLink = bisLink or ("|Hitem:" .. slotData.bis.itemID .. ":0:0:0:0:0:0:0:0|h[" .. slotData.bis.name .. "]|h")
|
||||
end
|
||||
else
|
||||
row.slotText:SetText("")
|
||||
row.equippedText:SetText("")
|
||||
row.bisText:SetText("")
|
||||
row.enchantText:SetText("")
|
||||
row.sourceText:SetText("")
|
||||
row.bisLink = nil
|
||||
end
|
||||
end
|
||||
|
||||
if data.equippedStats and data.bisStats then
|
||||
if not data.statsComplete then
|
||||
if StatsPanelTitle then
|
||||
StatsPanelTitle:SetText("Stats Comparison |cff888888(loading...)|r")
|
||||
end
|
||||
for _, stat in ipairs(STAT_DISPLAY) do
|
||||
local vals = StatValues[stat.key]
|
||||
if vals then
|
||||
local current = data.equippedStats[stat.key] or 0
|
||||
vals.current:SetText(current)
|
||||
vals.bis:SetText("|cff888888...|r")
|
||||
vals.diff:SetText("")
|
||||
end
|
||||
end
|
||||
|
||||
if not Amibis._statsRetryTimer then
|
||||
Amibis._statsRetryTimer = CreateFrame("Frame")
|
||||
Amibis._statsRetryTimer.elapsed = 0
|
||||
Amibis._statsRetryTimer:SetScript("OnUpdate", function(self, elapsed)
|
||||
self.elapsed = self.elapsed + elapsed
|
||||
if self.elapsed >= 1.5 then
|
||||
self:Hide()
|
||||
Amibis._statsRetryTimer = nil
|
||||
if MainFrame and MainFrame:IsShown() then
|
||||
ns.UI.RefreshUI()
|
||||
end
|
||||
end
|
||||
end)
|
||||
Amibis._statsRetryTimer:Show()
|
||||
end
|
||||
else
|
||||
if StatsPanelTitle then
|
||||
StatsPanelTitle:SetText("Stats Comparison")
|
||||
end
|
||||
for _, stat in ipairs(STAT_DISPLAY) do
|
||||
local vals = StatValues[stat.key]
|
||||
if vals then
|
||||
local current = data.equippedStats[stat.key] or 0
|
||||
local bis = data.bisStats[stat.key] or 0
|
||||
local diff = bis - current
|
||||
|
||||
vals.current:SetText(current)
|
||||
vals.bis:SetText(bis)
|
||||
|
||||
if diff > 0 then
|
||||
vals.diff:SetText("+" .. diff)
|
||||
vals.diff:SetTextColor(1, 0.5, 0.5, 1)
|
||||
elseif diff < 0 then
|
||||
vals.diff:SetText(tostring(diff))
|
||||
vals.diff:SetTextColor(0, 1, 0, 1)
|
||||
else
|
||||
vals.diff:SetText("-")
|
||||
vals.diff:SetTextColor(0.5, 0.5, 0.5, 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local initFrame = CreateFrame("Frame")
|
||||
initFrame:RegisterEvent("PLAYER_LOGIN")
|
||||
initFrame:SetScript("OnEvent", function(self, event)
|
||||
if event == "PLAYER_LOGIN" then
|
||||
InitializeUI()
|
||||
self:UnregisterEvent("PLAYER_LOGIN")
|
||||
end
|
||||
end)
|
||||
98
README.md
Normal file
98
README.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# Amibis
|
||||
|
||||
*Beware this is AI slop. I don't usually work with LUA and haven't really done any verification beyond making sure there aren't rogue loops running calculations constantly*
|
||||
|
||||
A World of Warcraft: The Burning Crusade Classic addon that compares your equipped gear against Best-in-Slot lists sourced from [wowtbc.gg](https://wowtbc.gg).
|
||||
|
||||
## Features
|
||||
|
||||
- **Gear Comparison** — See at a glance which slots are BIS and which can be upgraded
|
||||
- **Auto-Detection** — Automatically detects your class and active talent spec
|
||||
- **Stats Comparison** — Side-by-side stat breakdown (Healing, Spell Power, Intellect, Spirit, MP5, Haste, Crit)
|
||||
- **Upgrade Highlight** — Identifies your biggest available upgrade
|
||||
- **Persistent Settings** — Window position and spec overrides saved per character
|
||||
|
||||
## Usage
|
||||
|
||||
| Command | Description |
|
||||
|---|---|
|
||||
| `/amibis` | Toggle the comparison window |
|
||||
| `/amibis spec <SpecName>` | Override auto-detected spec (e.g. `/amibis spec Holy`) |
|
||||
| `/amibis spec clear` | Reset spec override to auto-detection |
|
||||
|
||||
### Interacting with the window
|
||||
|
||||
- **Drag** the title bar to reposition (position is saved)
|
||||
- **Shift+Click** a row to link the BIS item in chat
|
||||
- **Ctrl+Click** a row to open the dress-up preview
|
||||
- **Hover** a row to see the item tooltip
|
||||
|
||||
## Adding BIS Lists
|
||||
|
||||
BIS data lives in `Amibis/Data/BISLists.lua`. Each list follows this structure:
|
||||
|
||||
### 1. Define a class table
|
||||
|
||||
```lua
|
||||
local WARRIOR_T5 = {
|
||||
["Head"] = {
|
||||
itemID = 12345,
|
||||
name = "Helm of the Fallen Defender",
|
||||
source = "SSC - Lady Vashj",
|
||||
enchant = { id = 35445, name = "Glyph of Renewal" }, -- optional
|
||||
},
|
||||
-- ... repeat for each slot
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Supported slots
|
||||
|
||||
`Head`, `Neck`, `Shoulder`, `Back`, `Chest`, `Wrist`, `Hands`, `Waist`, `Legs`, `Feet`, `Finger0`, `Finger1`, `Trinket0`, `Trinket1`, `MainHand`, `SecondaryHand`, `Ranged`
|
||||
|
||||
### 3. Register in BIS_DATA
|
||||
|
||||
```lua
|
||||
local BIS_DATA = {
|
||||
["PRIEST"] = {
|
||||
["Discipline"] = { ["T5"] = PRIEST_T5 },
|
||||
["Holy"] = { ["T5"] = PRIEST_T5 },
|
||||
},
|
||||
["WARRIOR"] = {
|
||||
["Protection"] = { ["T5"] = WARRIOR_T5 },
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Field reference
|
||||
|
||||
| Field | Required | Description |
|
||||
|---|---|---|
|
||||
| `itemID` | Yes | WoW item ID (number) |
|
||||
| `name` | Yes | Display name |
|
||||
| `source` | Yes | Where it drops (e.g. `"TK - Kael'thas Sunstrider"`) |
|
||||
| `enchant` | No | `{ id = <spellID>, name = "<Enchant Name>" }` |
|
||||
|
||||
### Important
|
||||
|
||||
- Class keys must match WoW's English class constants: `"WARRIOR"`, `"PRIEST"`, `"MAGE"`, etc. (all caps)
|
||||
- Spec names must match the values in `Amibis:GetPlayerSpec()` (e.g. `"Discipline"`, `"Holy"`, `"Arms"`)
|
||||
- Phase keys are strings like `"T5"`, `"T6"` — the default phase is set in `Amibis.lua` under `DEFAULT_AMIBIS_DB.selectedPhase`
|
||||
|
||||
## Installation
|
||||
|
||||
Copy the `Amibis` folder into your WoW addon directory:
|
||||
|
||||
```
|
||||
World of Warcraft/Interface/AddOns/Amibis/
|
||||
```
|
||||
|
||||
Required files:
|
||||
```
|
||||
Amibis/
|
||||
├── Amibis.toc
|
||||
├── Amibis.lua
|
||||
├── Data/
|
||||
│ └── BISLists.lua
|
||||
└── UI/
|
||||
└── ComparisonFrame.lua
|
||||
```
|
||||
Reference in New Issue
Block a user