--default options db Mendeleev local MENDELEEV_DEFAULT_OPTIONS = { ["Cats"] = { ["Zul'Gurub Enchants"] = 1, ["stacksize"] = 1, ["Zul'Gurub Classes"] = 1, ["itemid"] = 1, ["Ahn'Qiraj Classes CC"] = 1, ["Ahn'Qiraj Classes BON"] = 1, }, } --Regester new addon object Mendeleev = AceAddonClass:new({ name = MendeleevLocals.Title, version = MendeleevLocals.Version, author = MendeleevLocals.Author, authorEmail = MendeleevLocals.Email , aceCompatible = "100", category = ACE_CATEGORY_INTERFACE, defaults = MENDELEEV_DEFAULT_OPTIONS, db = AceDbClass:new("MendeleevDB"), cmd = AceChatCmdClass:new(MendeleevLocals.cmd,MendeleevLocals.cmdOptions), }) ------------ -- HOOKS --- ------------ local linkFuncs = { SetAuctionItem = GetAuctionItemLink, SetBagItem = GetContainerItemLink, SetCraftItem = function(skill, id) return (id) and GetCraftReagentItemLink(skill, id) or GetCraftItemLink(skill) end, SetHyperlink = function(link) return link end, SetInventoryItem = function(type, slot) return (type) and GetInventoryItemLink(type, slot) or GetContainerItemLink(BANK_CONTAINER,this:GetID()) end, SetLootItem = GetLootSlotLink, SetMerchantItem = GetMerchantItemLink, SetQuestItem = GetQuestItemLink, SetQuestLogItem = GetQuestLogItemLink, SetTradePlayerItem = GetTradePlayerItemLink, SetTradeSkillItem = function(skill, id) return (id) and GetTradeSkillReagentItemLink(skill, id) or GetTradeSkillItemLink(skill) end, SetTradeTargetItem = GetTradeTargetItemLink, SetInboxItem = function(index) return Mendeleev:FindItemID(GetInboxItem(index)) end, SetLootRollItem = function(index) return GetLootRollItemLink(index) end, } function Mendeleev:SetItemRef(link, text, button) self:CallHook("SetItemRef", link, text, button) if (not strfind(link, "item") or IsControlKeyDown() or IsShiftKeyDown()) then return; end self:ParseTooltip(ItemRefTooltip, link) end function Mendeleev:FindItemID(name) if not name then return end if self.linkcache[name] then return self.linkcache[name] end local i, max = 1, 50000 repeat if GetItemInfo(i) == name then local _, link = GetItemInfo(i) self.linkcache[name] = link return link end i = i+1 until i > max end function Mendeleev:HookTooltips() for key, value in linkFuncs do local orig, linkFunc = key,value -- I cant leave this out, dont ask me why. local func = function(tooltip,a,b,c) local r1,r2,r3 = self.Hooks[tooltip][orig].orig(tooltip,a,b,c) self:ParseTooltip(tooltip,linkFunc(a,b,c)) return r1,r2,r3 end self:Hook(GameTooltip,orig,func) end self:Hook("SetItemRef") end --Ace methods function Mendeleev:Enable() function Mendeleev:Get(var) if type(self) == "string" then ace:print("! ERROR: "..self) end return self.db:get({self.profilePath,"Cats"}, var) end function Mendeleev:Set(var,val) self.db:set({self.profilePath,"Cats"}, var,val) end function Mendeleev:OGet(var) if type(self) == "string" then ace:print("! ERROR: "..self) end return self.db:get({self.profilePath,"Options"}, var) end function Mendeleev:OSet(var,val) self.db:set({self.profilePath,"Options"}, var,val) end if (KC_Items and KC_Items.tooltip and self:OGet("KCI"))then KC_Items.tooltip:RegisterFunc(self, "DisplayTooltip") else self:HookTooltips() end self.link = "" self.TT = {} self.linkcache = {} setmetatable(self.linkcache, {__mode = "k"}) self.compost = CompostLib:GetInstance("compost-1") self.PT = PeriodicTableEmbed:GetInstance("1") self.PTTrade = PTTradeskillsEmbed:GetInstance("1") end function Mendeleev:Disable() if (KC_Items and KC_Items.tooltip and not self:OGet("KCI"))then KC_Items.tooltip:UnregisterFunc(self, "DisplayTooltip") else self:UnhookAll() end end --Mendeleev methods function Mendeleev:DrawTooltip(frame) for _,z in ipairs(self.TT) do if (KC_Items and KC_Items.tooltip) then KC_Tooltip:AddTextLine(frame, z.Stringa, z.Stringb, " ", "|cffffffff") else frame:AddDoubleLine(z.Stringa,z.Stringb,1,1,1,1,1,1) end end frame:Show() end function Mendeleev:DisplayTooltip(tooltip, code, lcode, qty, hooker) self:ParseTooltip(tooltip,"item:"..lcode) end function Mendeleev:AddLine(Stringa,Stringb) local i = table.getn(self.TT) + 1 local t = self.compost:Acquire() t.Stringa = Stringa t.Stringb = Stringb table.insert(self.TT, t) end function Mendeleev:ParseTooltip(frame,link,id) if(link == nil) then return end local _, _, tid = string.find(link, "item:(%d+):%d+:%d+:%d+") local id = tonumber(tid) if(link == self.link) then self:DrawTooltip(frame) return elseif(tid == nil) then self:debug("malformed link") return else self.link = link self.compost:Reclaim(self.TT, 1) self.TT = self.compost:Acquire() end Mendeleev:DoTooltip(frame,link,id) self:DrawTooltip(frame) end function Mendeleev:DoTooltip(frame,link,id) --Add the fixed Category information, Can be found in MendeleevGlobals.ua for _,v in ipairs(MendeleevLocals.infosets) do if(not self:Get(v.name)) then local z = self.PT:ItemInSets(link, v.setindex) local filter = v.filter and not self.PT:ItemInSet(link, v.filter) if z and not filter then local tline, header local colour = v.colour or "|cffffffff" for t,tt in pairs(z) do if v.sets[tt] then local val = self.PT:ItemInSet(link, tt) local valstr = val and v.useval and v.useval(val, link) or "" tline = (not tline and "") or tline..", " tline = tline.. v.sets[tt].. valstr else self:debug(MendeleevLocals.Misc.NoClue..tt) end if( t <= 2) then header = v.header else header = " " end header = colour..header.."|r" if(math.mod(t,2) == 0 and tline ~= nil) then self:AddLine(header,colour..tline.."|r") tline = nil end end if(tline and string.len(tline) > 0) then self:AddLine(header,colour..tline.."|r") end header = nil end self.compost:Reclaim(z) end end if(not self:Get("crafting")) then self.rid2data = self.compost:Acquire() self.inTree = self.compost:Acquire() local t = self:GetUsedInTree(id) local l = self:GetUsedInList(t[2], 1) local header = MendeleevLocals.Category.TradeRep local ln = table.getn(l) if ln > 15 then ln = 14 end for i = 1, ln do if header then self:AddLine(header) header = nil end self:AddLine(l[i]) end if table.getn(l) > 15 then self:AddLine(" ...") end self.compost:Reclaim(t) self.compost:Reclaim(l) self.compost:Reclaim(self.rid2data) self.rid2data = nil self.compost:Reclaim(self.inTree) self.inTree = nil end if(not self:Get("stacksize")) then local _,_,_,_,_,_,stack = GetItemInfo(id) if(stack and stack > 1)then self:AddLine(MendeleevLocals.Misc.Stack,stack) end end if(not self:Get("itemid")) then self:AddLine(MendeleevLocals.Misc.ItemId,id) end end local function SortUsedInTree(a,b) if (not a or not b) then return true end if (a[3] > b[3]) then return true end if (a[3] < b[3]) then return false end if (a[1] < b[1]) then return true else return false end end function Mendeleev:GetUsedInTree(id, selfskill) local rt = self.compost:Acquire() local z = self.PTTrade:GetRecepieUse(id) local skill = selfskill or 0 if z then for x,y in z do if not self.rid2data[x] then self.rid2data[x] = y end if y[2] > skill then skill = y[2] end if not self.inTree[x] then self.inTree[x] = true local data = self:GetUsedInTree(x, y[2]) table.insert(rt, data) self.inTree[x] = nil if data[3] > skill then skill = data[3] end else table.insert(rt, self.compost:Acquire(x, "...", y[2])) end end end table.sort(rt, SortUsedInTree) return self.compost:Acquire(id, rt, skill) end function Mendeleev:GetUsedInList(tree, level) local colour = {[0] = "|cffbbbbbb", [1] = "|cff00cc00", [2] = "|cffffff00", [3] = "|cffFF6600", [4] = "|cffff0000",} local list = self.compost:Acquire() for _, v in tree do if level < 2 or v[3] > 0 then table.insert(list, string.rep(" ", level).."- "..colour[self.rid2data[v[1]][2]]..self.rid2data[v[1]][1].."|r") if type(v[2]) == "table" then local slist = self:GetUsedInList(v[2], level+1) if table.getn(slist) > 0 then if v[3] > 0 then for _, line in slist do table.insert(list, line) end else table.insert(list, string.rep(" ", level+1).."- "..colour[0].."...|r") end end elseif v[2] == "..." then table.insert(list, string.rep(" ", level+1).." ...") end end end return list end --chat commands function Mendeleev:CMDtoggle(name) for _,v in ipairs(MendeleevLocals.infosets) do if(v.name == name)then if(self:Get(name))then self:Set(name,nil) self.cmd:status(name, TRUE, ACEG_MAP_ONOFF) return else self:Set(name,TRUE) self.cmd:status(name, FALSE, ACEG_MAP_ONOFF) return end end end for _,v in MendeleevLocals.custominfosets do if(v == name)then if(self:Get(name))then self:Set(name,nil) self.cmd:status(name, TRUE, ACEG_MAP_ONOFF) return else self:Set(name,TRUE) self.cmd:status(name, FALSE, ACEG_MAP_ONOFF) return end end end self.cmd:msg(MendeleevLocals.Cmdstrings.NotThere) end function Mendeleev:KCItoggle(argument) if(argument == "toggle" or argument == "Toggle") then if (KC_Items and KC_Items.tooltip) then if(self:OGet("KCI")) then self:OSet("KCI",nil) self.cmd:status(MendeleevLocals.Cmdstrings.IntStat, FALSE, ACEG_MAP_ONOFF) else self:OSet("KCI",TRUE) self.cmd:status(MendeleevLocals.Cmdstrings.IntStat, TRUE, ACEG_MAP_ONOFF) end self:Disable() self:Enable() else self.cmd:msg(MendeleevLocals.Cmdstrings.KCINotThere) end elseif(argument == "report" or argument == "Report") then self.cmd:status(MendeleevLocals.Cmdstrings.IntStat, self:OGet("KCI"), ACEG_MAP_ONOFF) end end function Mendeleev:Report() for _,v in ipairs(MendeleevLocals.infosets) do local status, sindex sindex = v.name if(self:Get(sindex)) then status = FALSE else status = TRUE end self.cmd:status(sindex, status, ACEG_MAP_ONOFF) end for _,v in MendeleevLocals.custominfosets do local status if(self:Get(v)) then status = FALSE else status = TRUE end self.cmd:status(v, status, ACEG_MAP_ONOFF) end end --Register in ace Mendeleev:RegisterForLoad()