local ex = Examiner;
-- Module
local mod = ex:CreateModule("Gear","Gear List (beta)");
mod.help = "Lists gear with enchants or the lack thereof";
mod:CreatePage(true,"");
mod:HasButton(true);
-- Variables
local NUM_BUTTONS = 9;
local BUTTON_HEIGHT = (283 / NUM_BUTTONS);
local NO_ENCHANT = NO.." "..ENSCRIBE;
local UpdateShownItems;
local buttons = {};
local shownSlots = {};
local gemTable = {};
-- Slots we dont want to show up
local IGNORED_SLOTS = {
TabardSlot = true,
ShirtSlot = true,
-- Trinket0Slot = true,
-- Trinket1Slot = true,
};
-- List of item slots that can be enchanted. The value is at what itemLevel we find the first valid enchant.
local ENCHANT_SLOT_LEVEL = {
INVTYPE_HEAD = 55; -- Librams @ lvl60
INVTYPE_NECK = nil;
INVTYPE_SHOULDER = 55; -- Argent Dawn & ZG enchants
INVTYPE_CLOAK = 1;
INVTYPE_CHEST = 1;
INVTYPE_ROBE = 1;
INVTYPE_WRIST = 1;
INVTYPE_HAND = 1;
INVTYPE_WAIST = nil; -- Ignore this, only Engineers can enchant belts
INVTYPE_LEGS = 55; -- Librams @ lvl60
INVTYPE_FEET = 1;
INVTYPE_FINGER = nil; -- Enchanters can do rings, but we cannot check what profession someone is
INVTYPE_TRINKET = nil;
INVTYPE_BODY = nil;
INVTYPE_TABARD = nil;
INVTYPE_WEAPON = 1;
INVTYPE_WEAPONMAINHAND = 1;
INVTYPE_WEAPONOFFHAND = 1;
INVTYPE_2HWEAPON = 1;
INVTYPE_SHIELD = 1;
INVTYPE_HOLDABLE = 300;
INVTYPE_RANGED = 1;
INVTYPE_RANGEDRIGHT = 1, -- Not sure what is different with the "right" version
INVTYPE_THROWN = nil;
INVTYPE_RELIC = nil;
};
--------------------------------------------------------------------------------------------------------
-- Module Scripts --
--------------------------------------------------------------------------------------------------------
-- OnInspectReady
function mod:OnInspectReady(unit)
self:HasData(ex.itemsLoaded);
if (ex.itemsLoaded) then
self:BuildItemList();
end
end
mod.OnInspect = mod.OnInspectReady;
-- OnCacheLoaded
function mod:OnCacheLoaded(entry,unit)
self:HasData(true);
self:BuildItemList();
end
-- OnClearInspect
function mod:OnClearInspect()
self:HasData(nil);
wipe(shownSlots);
end
--------------------------------------------------------------------------------------------------------
-- Widget Scripts --
--------------------------------------------------------------------------------------------------------
-- Object OnEnter
local function ObjectItem_OnEnter(self,button)
GameTooltip:SetOwner(self,"ANCHOR_BOTTOMRIGHT");
if (self.link) then
GameTooltip:SetHyperlink(self.link);
elseif (self.missing) then
GameTooltip:AddLine(EMPTY.." "..self.missing,1,0,0);
GameTooltip:Show();
end
end
--------------------------------------------------------------------------------------------------------
-- Code --
--------------------------------------------------------------------------------------------------------
-- BuildItemList
function mod:BuildItemList()
wipe(shownSlots);
local items = ex.info.Items;
local slots = LibGearExam.Slots;
for index, slotName in ipairs(slots) do
if (not IGNORED_SLOTS[slotName]) and (items[slotName]) then
shownSlots[#shownSlots + 1] = slotName;
end
end
self.page.header:SetText("Gear List ("..#shownSlots..")");
UpdateShownItems(self.scroll);
end
-- Update
function UpdateShownItems(self)
local items = ex.info.Items;
FauxScrollFrame_Update(self,#shownSlots,#buttons,BUTTON_HEIGHT);
local index = self.offset;
-- Loop
for i = 1, NUM_BUTTONS do
index = (index + 1);
local btn = buttons[i];
local slotName = shownSlots[index];
local link = items[slotName];
if (link) then
local itemName, _, itemRarity, itemLevel, _, _, _, _, itemEquipLoc, itemTexture = GetItemInfo(link);
itemLevel = GetDetailedItemLevelInfo(link);
btn.link = link;
-- btn.name:SetText(itemName);
-- btn.name:SetTextColor(GetItemQualityColor(itemRarity or 0));
btn.level:SetText(itemLevel);
btn.icon:SetTexture(itemTexture or "Interface\\Icons\\INV_Misc_QuestionMark");
btn:Show();
btn.iconFrame.link = link;
btn.iconFrame.slotName = shownSlots[index];
btn.iconFrame.id = LibGearExam.SlotIDs[shownSlots[index]];
-- Gem Scan -- Directly from unit or just from link
-- if (ex:ValidateUnit() and CheckInteractDistance(ex.unit,1)) then
-- LibGearExam:GetGemInfo(nil,gemTable,ex.unit,slotName);
-- else
-- LibGearExam:GetGemInfo(link,gemTable);
-- end
-- for i = 1, MAX_NUM_SOCKETS do
-- local obj = btn["Gem"..i];
-- if (gemTable[i]) then
-- local itemName, _, _, _, _, _, _, _, _, itemTexture = GetItemInfo(gemTable[i]);
-- if (itemName) then
-- obj.link = gemTable[i];
-- obj.missing = nil;
-- obj.icon:SetTexture(itemTexture);
-- else
-- obj.link = nil;
-- obj.missing = gemTable[i];
-- obj.icon:SetTexture("Interface\\ItemSocketingFrame\\UI-EmptySocket-"..gemTable[i]:match("([^%s]+)"));
-- end
-- obj:Show();
-- else
-- obj:Hide();
-- end
-- end
-- Enchant
local enchantID, enchantName = LibGearExam:GetEnchantInfo(link);
if (enchantID) then
btn.enchant:SetText(enchantName:gsub("and ","and\n"));
btn.enchant:SetTextColor(0.5,1,0.5);
else
local slotEnchantLevel = ENCHANT_SLOT_LEVEL[itemEquipLoc];
if (slotEnchantLevel) and (not itemLevel or itemLevel >= slotEnchantLevel) then
btn.enchant:SetText(NO_ENCHANT);
btn.enchant:SetTextColor(1,0.5,0.5);
else
btn.enchant:SetText("");
end
end
else
btn:Hide();
end
end
-- Update Tooltip After Scroll
local gttOwner = GameTooltip:GetOwner();
local onEnterFunc = gttOwner and gttOwner:GetScript("OnEnter");
if (onEnterFunc) then
onEnterFunc(gttOwner);
end
-- cleanup
wipe(gemTable);
end
--------------------------------------------------------------------------------------------------------
-- Widget Creation --
--------------------------------------------------------------------------------------------------------
-- Create Buttons
for i = 1, NUM_BUTTONS do
local btn = CreateFrame("Button",nil,mod.page);
buttons[i] = btn;
btn:SetHeight(BUTTON_HEIGHT);
btn:RegisterForClicks("LeftButtonDown","RightButtonDown");
btn:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight");
btn:Hide();
if (i == 1) then
btn:SetPoint("TOPLEFT",8,-36.5);
btn:SetPoint("TOPRIGHT",-28,-36.5);
else
btn:SetPoint("TOPLEFT",buttons[i - 1],"BOTTOMLEFT");
btn:SetPoint("TOPRIGHT",buttons[i - 1],"BOTTOMRIGHT");
end
-- Gems
for x = 1, MAX_NUM_SOCKETS do
local obj = CreateFrame("Button",nil,btn);
obj:SetSize(BUTTON_HEIGHT * 0.6,BUTTON_HEIGHT * 0.6);
obj:EnableMouse(1);
obj:SetScript("OnClick",ex.ItemButton_OnClick);
obj:SetScript("OnEnter",ObjectItem_OnEnter);
obj:SetScript("OnLeave",ex.HideGTT);
obj.index = x;
obj.icon = obj:CreateTexture(nil,"ARTWORK");
obj.icon:SetAllPoints();
--obj.icon:SetTexture("Interface\\Icons\\INV_Scroll_03");
obj.icon:SetTexCoord(0.07,0.93,0.07,0.93);
if (x == 1) then
obj:SetPoint("RIGHT",-4,0);
else
obj:SetPoint("RIGHT",btn["Gem"..(x - 1)],"LEFT",0,0);
end
btn["Gem"..x] = obj;
end
btn.iconFrame = CreateFrame("Button",nil,btn);
btn.iconFrame:SetPoint("LEFT",3,0);
btn.iconFrame:SetSize(BUTTON_HEIGHT - 2,BUTTON_HEIGHT - 2);
btn.iconFrame:SetScript("OnClick",ex.ItemButton_OnClick);
btn.iconFrame:SetScript("OnEnter",ex.ItemButton_OnEnter);
btn.iconFrame:SetScript("OnLeave",ex.ItemButton_OnLeave);
btn.iconFrame:RegisterForClicks("LeftButtonUp","RightButtonUp");
btn.iconFrame.hasItem = true;
btn.level = btn.iconFrame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall");
btn.level:SetPoint("BOTTOM",0,1);
btn.level:SetTextColor(1,1,1);
btn.level:SetFont(GameFontNormal:GetFont(),10,"OUTLINE");
btn.icon = btn.iconFrame:CreateTexture(nil,"ARTWORK");
btn.icon:SetAllPoints();
btn.icon:SetTexCoord(0.07,0.93,0.07,0.93);
-- btn.val = btn:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall");
-- btn.val:SetPoint("RIGHT",-4,0);
-- btn.val:SetTextColor(1,1,0);
btn.name = btn:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall");
btn.name:SetPoint("LEFT",btn.icon,"RIGHT",3,6);
btn.name:SetPoint("RIGHT",btn.Gem3,"LEFT",-8,6);
btn.name:SetJustifyH("LEFT");
btn.name:Hide();
btn.enchant = btn:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall");
-- btn.enchant:SetPoint("TOPLEFT",btn.name,"BOTTOMLEFT",0,-2);
-- btn.enchant:SetPoint("TOPRIGHT",btn.name,"BOTTOMRIGHT",0,-2);
btn.enchant:SetPoint("TOPLEFT",btn.iconFrame,"TOPRIGHT",2,-2);
btn.enchant:SetPoint("BOTTOMLEFT",btn.iconFrame,"BOTTOMRIGHT",2,2);
btn.enchant:SetWidth(150);
btn.enchant:SetJustifyH("LEFT");
btn.enchant:SetTextColor(0.6,0.6,0.6);
btn.enchant:SetWordWrap(true);
end
-- Scroll
mod.scroll = CreateFrame("ScrollFrame","Examiner"..mod.token.."Scroll",mod.page,"FauxScrollFrameTemplate");
mod.scroll:SetPoint("TOPLEFT",buttons[1]);
mod.scroll:SetPoint("BOTTOMRIGHT",buttons[NUM_BUTTONS],-6,-1);
mod.scroll:SetScript("OnVerticalScroll",function(self,offset) FauxScrollFrame_OnVerticalScroll(self,offset,BUTTON_HEIGHT,UpdateShownItems) end);