local events = CreateFrame("Frame")
events:RegisterEvent("UNIT_INVENTORY_CHANGED")
-- Event Handler
events:SetScript("OnEvent", function(self, event, ...)
return self[event] and self[event](self, event, ...)
end)
-- Main frame to display information.
local infoFrame = CreateFrame("Frame", nil, CharacterModelFrame)
infoFrame:SetPoint("TOPLEFT", CharacterModelFrame, "TOPLEFT", 0, 0)
infoFrame:SetPoint("BOTTOMRIGHT", CharacterModelFrame, "BOTTOMRIGHT", 0, 0)
infoFrame:SetFrameStrata("MEDIUM")
infoFrame:Hide()
local infoFrameBG = infoFrame:CreateTexture(nil, "BACKGROUND")
infoFrameBG:SetAllPoints(infoFrame)
infoFrameBG:SetTexture(0, 0, 0, 0.4)
-- Warning button.
local warningBTN = CreateFrame("Button", nil, CharacterModelFrame)
warningBTN:SetWidth(16)
warningBTN:SetHeight(16)
warningBTN:SetPoint("TOPRIGHT", -10, -10)
warningBTN:SetFrameStrata("HIGH")
warningBTN:Hide()
local warningICO = warningBTN:CreateTexture(nil, "BACKGROUND")
warningICO:SetTexture("Interface\\Addons\\Unprepared\\Resources\\warningBTN.tga")
warningICO:SetAllPoints(warningBTN)
-- Optimized Button
local optimizedBTN = CreateFrame("Button", nil, CharacterModelFrame)
optimizedBTN:SetWidth(16)
optimizedBTN:SetHeight(16)
optimizedBTN:SetPoint("TOPRIGHT", -10, -10)
optimizedBTN:SetFrameStrata("HIGH")
optimizedBTN:Hide()
local optimizedICO = optimizedBTN:CreateTexture(nil, "BACKGROUND")
optimizedICO:SetTexture("Interface\\Addons\\Unprepared\\Resources\\optimizedBTN.tga")
optimizedICO:SetAllPoints(optimizedBTN)
-- FontString Variables
local strvars = {}
-- Enchant counter and name table.
local eCounter = 0
local eList = {}
-- Gem counter and name table.
local gCounter = 0
local gList = {}
-- Gear to check.
local slots = {1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17}
local slotnames = {[1] = "Head", [2] = "Neck", [3] = "Shoulder", [5] = "Chest", [6] = "Waist", [7] = "Legs", [8] = "Feet", [9] ="Wrist", [10] = "Hands", [11] = "Finger0", [12] = "Finger1", [15] = "Back", [16] = "MainHand", [17] = "SecondaryHand"}
local gemsonly = {[1] = true, [2] = true, [6] = true} -- Exclude checking for enchants.
local prof1 = select(1, GetProfessions()) and select(7, GetProfessionInfo(select(1, GetProfessions())))
local prof1 = select(2, GetProfessions()) and select(7, GetProfessionInfo(select(2, GetProfessions())))
local professions = {
164, -- blacksmith
333, --enchanting
202, --engineer
773, --inscription
755, --jewelcrafting
165, --leatherworking
197 --tailoring
}
-- Check slots for missing enchants, gems, etc.
local function CheckSlots()
-- Hide old font strings.
for k, v in pairs(strvars) do
v:Hide()
end
-- Empty strvars.
strvars = {}
-- Enchant counter and name table.
eCounter = 0
eList = {}
-- Gem counter and name table.
gCounter = 0
gList = {}
for k, v in pairs(slots) do
local item = GetInventoryItemLink("player", v)
if item then
local itemID, enchantID, gem1, gem2, gem3, gem4 = item:match("item:(%d+):(%d+):(%d+):(%d+):(%d+):(%d+)")
local iteminfo = {itemID, enchantID, gem1, gem2, gem3, gem4}
-- Get number of sockets in item.
local itemstats = GetItemStats(item)
local sockets = 0
if itemstats then
for t, s in pairs(itemstats) do
local search = t:find("EMPTY_SOCKET")
if search then
sockets = sockets + s
end
end
-- Check for missing gems.
for i = 3, 2 + sockets do
if iteminfo[i] == "0" then
gCounter = gCounter + 1
table.insert(gList, {item, v})
end
end
end
-- Check for missing enchants.
if not gemsonly[v] and enchantID == "0" then
if (v == 11 or v == 12) and prof1 ~= 333 and prof2 ~= 333 then
else
eCounter = eCounter + 1
table.insert(eList, {item, v})
end
end
end
end
-- Display appropriate button.
if eCounter > 0 or gCounter > 0 then
warningBTN:Show()
optimizedBTN:Hide()
else
optimizedBTN:Show()
warningBTN:Hide()
infoFrame:Hide()
end
-- Create font strings for Unprepared info frame.
strvars["title"] = infoFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
strvars["title"]:SetPoint("TOPLEFT", 10, -10)
strvars["title"]:SetText("Unprepared")
-- Enchants
if eCounter > 0 then
strvars["enchant_title"] = infoFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
strvars["enchant_title"]:SetPoint("TOPLEFT", strvars["title"], "BOTTOMLEFT", 0, -20)
strvars["enchant_title"]:SetText("Missing Enchants (" .. eCounter .. "):")
strvars["enchant_title"]:SetJustifyH("LEFT")
strvars["enchant_title"]:CanWordWrap(true)
strvars["enchant_title"]:SetWidth(CharacterModelFrame:GetWidth() - 20)
for key, value in pairs(eList) do
local name = GetItemInfo(value[1])
local texture = select(10, GetItemInfo(value[1]))
-- Item icon.
strvars["eBTN" .. key] = CreateFrame("Button", nil, infoFrame)
strvars["eBTN" .. key]:SetWidth(16)
strvars["eBTN" .. key]:SetHeight(16)
if key == 1 then
strvars["eBTN" .. key]:SetPoint("TOPLEFT", strvars["enchant_title"], "BOTTOMLEFT", 0, -5)
else
strvars["eBTN" .. key]:SetPoint("TOPLEFT", strvars["eBTN" .. (key - 1)], "BOTTOMLEFT", 0, -10)
end
strvars["eICO" .. key] = strvars["eBTN" .. key]:CreateTexture(nil, "BACKGROUND")
strvars["eICO" .. key]:SetTexture(texture)
strvars["eICO" .. key]:SetAllPoints(strvars["eBTN" .. key])
-- Item name.
strvars["eStr" .. key] = infoFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
strvars["eStr" .. key]:SetPoint("TOPLEFT", strvars["eBTN" .. key], "TOPRIGHT", 5, 0)
strvars["eStr" .. key]:SetText(name)
strvars["eStr" .. key]:SetJustifyH("LEFT")
strvars["eStr" .. key]:CanWordWrap(true)
strvars["eStr" .. key]:SetWidth(CharacterModelFrame:GetWidth() - 41)
end
end
-- Gems
if gCounter > 0 then
strvars["gem_title"] = infoFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
if eCounter > 0 then
strvars["gem_title"]:SetPoint("TOPLEFT", strvars["eICO" .. table.getn(eList)], "BOTTOMLEFT", 0, -20)
else
strvars["gem_title"]:SetPoint("TOPLEFT", strvars["title"], "BOTTOMLEFT", 0, -20)
end
strvars["gem_title"]:SetText("Missing Gems (" .. gCounter .. "):")
strvars["gem_title"]:SetJustifyH("LEFT")
strvars["gem_title"]:CanWordWrap(true)
strvars["gem_title"]:SetWidth(CharacterModelFrame:GetWidth() - 20)
for key, value in pairs(gList) do
local name = GetItemInfo(value[1])
local texture = select(10, GetItemInfo(value[1]))
-- Item icon.
strvars["gBTN" .. key] = CreateFrame("Button", nil, infoFrame)
strvars["gBTN" .. key]:SetWidth(16)
strvars["gBTN" .. key]:SetHeight(16)
if key == 1 then
strvars["gBTN" .. key]:SetPoint("TOPLEFT", strvars["gem_title"], "BOTTOMLEFT", 0, -5)
else
strvars["gBTN" .. key]:SetPoint("TOPLEFT", strvars["gBTN" .. (key - 1)], "BOTTOMLEFT", 0, -10)
end
strvars["gICO" .. key] = strvars["gBTN" .. key]:CreateTexture(nil, "BACKGROUND")
strvars["gICO" .. key]:SetTexture(texture)
strvars["gICO" .. key]:SetAllPoints(strvars["gBTN" .. key])
-- Item name.
strvars["gStr" .. key] = infoFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
strvars["gStr" .. key]:SetPoint("TOPLEFT", strvars["gBTN" .. key], "TOPRIGHT", 5, 0)
strvars["gStr" .. key]:SetText(name)
strvars["gStr" .. key]:SetJustifyH("LEFT")
strvars["gStr" .. key]:CanWordWrap(true)
strvars["gStr" .. key]:SetWidth(CharacterModelFrame:GetWidth() - 41)
end
end
end
local function HideHighlights()
if strvars then
for k, v in pairs(strvars) do
if k:find("Hlght") or k:find("TXT") then
strvars[k]:Hide()
end
end
end
end
local function HighlightGear()
if strvars then
HideHighlights()
-- Highlight missing enchants.
for key, value in pairs(eList) do
-- Highlight item.
local name = GetItemInfo(value[1])
local slot = _G["Character" .. slotnames[value[2]] .. "Slot"]
strvars[name .. "Hlght"] = slot:CreateTexture(nil, "OVERLAY")
strvars[name .. "Hlght"]:SetTexture("Interface\\Buttons\\UI-ActionButton-Border")
strvars[name .. "Hlght"]:SetBlendMode("ADD")
strvars[name .. "Hlght"]:SetHeight(68)
strvars[name .. "Hlght"]:SetWidth(68)
strvars[name .. "Hlght"]:SetVertexColor(1, 0, 0, 0.75)
strvars[name .. "Hlght"]:SetPoint("CENTER", slot, "CENTER", 0, 1)
-- Create text overlay.
strvars[name .. "TXT"] = slot:CreateFontString("OVERLAY", nil, "ErrorFont")
strvars[name .. "TXT"]:SetPoint("CENTER", 0, 0)
strvars[name .. "TXT"]:SetSize(50, 50)
strvars[name .. "TXT"]:SetText("E")
end
-- Highlight missing gems.
for key, value in pairs(gList) do
-- Highlight item.
local name = GetItemInfo(value[1])
local slot = _G["Character" .. slotnames[value[2]] .. "Slot"]
if not strvars[name .. "Hlght"] then
strvars[name .. "Hlght"] = slot:CreateTexture(nil, "OVERLAY")
strvars[name .. "Hlght"]:SetTexture("Interface\\Buttons\\UI-ActionButton-Border")
strvars[name .. "Hlght"]:SetBlendMode("ADD")
strvars[name .. "Hlght"]:SetHeight(68)
strvars[name .. "Hlght"]:SetWidth(68)
strvars[name .. "Hlght"]:SetVertexColor(1, 0, 0, 0.75)
strvars[name .. "Hlght"]:SetPoint("CENTER", slot, "CENTER", 0, 1)
-- Create text overlay.
strvars[name .. "TXT"] = slot:CreateFontString("OVERLAY", nil, "ErrorFont")
strvars[name .. "TXT"]:SetPoint("CENTER", 0, 0)
strvars[name .. "TXT"]:SetSize(50, 50)
strvars[name .. "TXT"]:SetText("G")
else
strvars[name .. "TXT"]:SetText("E/G")
end
end
end
end
CharacterModelFrame:SetScript("OnShow", function(self, ...)
CheckSlots()
if infoFrame:IsVisible() then
HighlightGear()
end
end)
-- UNIT_INVENTORY_CHANGED
function events:UNIT_INVENTORY_CHANGED(event, addon)
CheckSlots()
if infoFrame:IsVisible() then
HighlightGear()
end
end
infoFrame:SetScript("OnShow", function(self)
CharacterModelFrame:EnableMouse(false)
if infoFrame:IsVisible() then
HighlightGear()
end
end)
infoFrame:SetScript("OnHide", function(self)
CharacterModelFrame:EnableMouse(true)
HideHighlights()
end)
warningBTN:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
GameTooltip:SetText("Unprepared")
GameTooltip:SetPoint("TOPRIGHT", 1, 0)
GameTooltip:Show()
end)
warningBTN:SetScript("OnLeave", function(self)
GameTooltip:Hide()
end)
warningBTN:SetScript("OnClick", function(self)
if infoFrame:IsVisible() then
infoFrame:Hide()
HideHighlights()
else
infoFrame:Show()
HighlightGear()
end
end)