if OCDCollector == nil then OCDCollector = {} end OCDCollector.name = "OCDCollector" function OCDCollectorScan() OCDCollector.SUM = {} local TotalmaxCollectibles = 0 local OwnedCollectibles = 0 local CollectibleiconPack = { {Icon1="esoui/art/treeicons/store_indexicon_dlc_up.dds", Icon2="esoui/art/treeicons/store_indexicon_dlc_over.dds", Icon3="esoui/art/treeicons/store_indexicon_dlc_down.dds"},-- 1 Stories {Icon1="esoui/art/treeicons/store_indexicon_dlc_up.dds", Icon2="esoui/art/treeicons/store_indexicon_dlc_over.dds", Icon3="esoui/art/treeicons/store_indexicon_dlc_down.dds"},-- 2 Upgrade {Icon1="esoui/art/tutorial/store_indexicon_costumes_up.dds", Icon2="", Icon3=""},-- 3 Appearance {Icon1="esoui/art/guild/tabicon_home_up.dds", Icon2="esoui/art/guild/tabicon_home_over.dds", Icon3="esoui/art/guild/tabicon_home_down.dds"},-- 4 Housing {Icon1="esoui/art/treeicons/collection_indexicon_furnishings_up.dds", Icon2="esoui/art/treeicons/collection_indexicon_furnishings_over.dds", Icon3="esoui/art/treeicons/collection_indexicon_furnishings_down.dds"},-- 5 Furnishings {Icon1="esoui/art/treeicons/collection_indexicon_assistants_up.dds", Icon2="esoui/art/treeicons/collection_indexicon_assistants_over.dds", Icon3="esoui/art/treeicons/collection_indexicon_assistants_down.dds"},-- 6 Assistants {Icon1="esoui/art/treeicons/store_indexicon_trophy_up.dds", Icon2="esoui/art/treeicons/store_indexicon_trophy_over.dds", Icon3="esoui/art/treeicons/store_indexicon_trophy_down.dds"},-- 7 Mementos {Icon1="esoui/art/treeicons/store_indexicon_mounts_up.dds", Icon2="esoui/art/treeicons/store_indexicon_mounts_over.dds", Icon3="esoui/art/treeicons/store_indexicon_mounts_down.dds"},-- 8 Mounts {Icon1="/esoui/art/treeicons/store_indexicon_vanitypets_up.dds", Icon2="/esoui/art/treeicons/store_indexicon_vanitypets_over.dds", Icon3="/esoui/art/treeicons/store_indexicon_vanitypets_down.dds"},-- 9 Non-Combat Pets {Icon1="esoui/art/tutorial/tutorial_idexicon_emotes_up.dds", Icon2="esoui/art/tutorial/tutorial_idexicon_emotes_over.dds", Icon3="esoui/art/tutorial/tutorial_idexicon_emotes_down.dds"},-- 10 Emotes {Icon1="esoui/art/treeicons/collection_indexicon_abilityskins_up.dds", Icon2="esoui/art/treeicons/collection_indexicon_abilityskins_over.dds", Icon3="esoui/art/treeicons/collection_indexicon_abilityskins_down.dds"},-- 11 Special {Icon1="esoui/art/tutorial/progression_indexicon_armor_up.dds", Icon2="esoui/art/tutorial/progression_indexicon_armor_over.dds", Icon3="esoui/art/tutorial/progression_indexicon_armor_down.dds"},-- 12 Armor Styles {Icon1="esoui/art/progression/progression_indexicon_weapons_up.dds", Icon2="esoui/art/progression/progression_indexicon_weapons_over.dds", Icon3="esoui/art/progression/progression_indexicon_weapons_down.dds"}-- 13 Weapon Styles } for categoryIndex = 1,GetNumCollectibleCategories(),1 do local name, numSubCatgories, numCollectibles, unlockedCollectibles, totalCollectibles = GetCollectibleCategoryInfo(categoryIndex) --Returns: string name, number numSubCatgories, number numCollectibles, number unlockedCollectibles, number totalCollectibles, boolean hidesLocked local mainCatN = 0 local mainCatMax = 0 --d("|cFF1010#"..categoryIndex.." ".. name.." - owned ".. numCollectibles.."/".. unlockedCollectibles.." / ".. totalCollectibles.."|r") --d(zo_strformat("<<Z:1>>", "i have 10, blue colored item")) --d("|cFF1010#"..categoryIndex.." ".. zo_strformat("<<Z:1>>", name).."|r") if numSubCatgories == 0 then for NoSubCatIndex=1, totalCollectibles,1 do Name, _, _, _, unlocked, _, _, categoryType = GetCollectibleInfo(GetCollectibleId(categoryIndex, nil, NoSubCatIndex)) if unlocked then mainCatN = mainCatN + 1 end --TotalmaxCollectibles = TotalmaxCollectibles + totalCollectibles -- if categoryIndex==6 then -- d("#".. NoSubCatIndex .." "..Name.." / "..tostring(unlocked)) -- end -- end else for subCategoryIndex=1, numSubCatgories do local subCategoryName, subCategoryNumCollectibles, subCategoryUnlockedCollectibles = GetCollectibleSubCategoryInfo(categoryIndex, subCategoryIndex) mainCatMax = mainCatMax + subCategoryNumCollectibles unlockedN = 0 -- unlocked N i subcategory unlockedMax = 0 -- Max N in subcategory for collectibleIndex=1, subCategoryNumCollectibles do local collectibleId = GetCollectibleId(categoryIndex, subCategoryIndex, collectibleIndex) local collectibleName, collectibleDesc, icon1, icon2, unlocked, _, _, categoryType = GetCollectibleInfo(collectibleId) if unlocked then unlockedN = unlockedN + 1 mainCatN = mainCatN + 1 --band name, should be removed end end --end for iteration of collectibles --d(" $".. subCategoryIndex..": "..subCategoryName.." "..unlockedN.."/".. subCategoryNumCollectibles) --d(unlockedN) end --end for iteration of subcategory end TotalmaxCollectibles = TotalmaxCollectibles + math.max(mainCatMax, totalCollectibles) OwnedCollectibles = OwnedCollectibles + mainCatN --table.insert(OCDCollector.SUM, {Name = "", Icon1 = "", Icon2 = "", Icon3 = "", Val = "", Max = "" }) --d(OCDCollector["SUM"]) table.insert(OCDCollector.SUM, {Name = name, Icon1 = CollectibleiconPack[categoryIndex]["Icon1"], Icon2 = CollectibleiconPack[categoryIndex]["Icon2"], Icon3 = CollectibleiconPack[categoryIndex]["Icon3"], Val = mainCatN, Max = math.max(mainCatMax, totalCollectibles) }) --d("|c10FF10#"..categoryIndex.." ".. name.." - All: "..mainCatN .. "/" .. math.max(mainCatMax, totalCollectibles).."|r") end --end for iteration of categories table.insert(OCDCollector.SUM, {Name = "Collectibles", Icon1 = "esoui/art/collections/collections_tabicon_collectibles_up.dds", Icon2 = "esoui/art/collections/collections_tabicon_collectibles_over.dds", Icon3 = "esoui/art/collections/collections_tabicon_collectibles_down.dds", Val = OwnedCollectibles, Max = TotalmaxCollectibles }) --d("Collectibles: ".. OwnedCollectibles.."/" ..TotalmaxCollectibles) --d("-- OFF Collections stuff:") -- Off Collection Stuff to get: --** Achievements table.insert(OCDCollector.SUM, {Name = "Achievements", Icon1 = "esoui/art/journal/journal_tabicon_achievements_up.dds", Icon2 = "esoui/art/journal/journal_tabicon_achievements_over.dds", Icon3 = "", Val = GetEarnedAchievementPoints(), Max = GetTotalAchievementPoints() }) --d("Achievements: "..GetEarnedAchievementPoints().." / "..GetTotalAchievementPoints()) --** Recipes -- /script local c = 0 for i=1,GetNumRecipeLists() ,1 do local a,b = GetRecipeListInfo(i) c=c+b d(a.."-"..b)end d(c) -- difference of 60 due to mrl -- GetRecipeListInfo(number recipeListIndex) -- Returns: string name, number numRecipes, textureName upIcon, textureName downIcon, textureName overIcon, textureName disabledIcon, string createSound -- GetRecipeInfo(number recipeListIndex, number recipeIndex) -- Returns: boolean known, string name, number numIngredients, number provisionerLevelReq, number qualityReq, number ProvisionerSpecialIngredientType specialIngredientType, number TradeskillType requiredCraftingStationType local MaxRecipes = 0 local KnownRecipes = 0 for i=1,GetNumRecipeLists() ,1 do local a,b = GetRecipeListInfo(i) MaxRecipes=MaxRecipes+b --d("#"..i.." "..a.."-"..b) for j=1,b do local x, y = GetRecipeInfo(i,j) --d("#"..y.." "..tostring(x)) if x then KnownRecipes = KnownRecipes + 1 end end end table.insert(OCDCollector.SUM, {Name = "Recipes", Icon1 = "esoui/art/journal/journal_tabicon_cadwell_up.dds", Icon2 = "esoui/art/journal/journal_tabicon_cadwell_over.dds", Icon3 = "esoui/art/journal/journal_tabicon_cadwell_down.dds", Val = KnownRecipes, Max = MaxRecipes }) --d("Recipes: "..KnownRecipes.." / "..MaxRecipes) --** CPs local _, _, lvl= GetCharacterInfo() table.insert(OCDCollector.SUM, {Name = "Level", Icon1 = "esoui/art/charactercreate/charactercreate_faceicon_up.dds", Icon2 = "", Icon3 = "", Val = lvl, Max = 50 }) table.insert(OCDCollector.SUM, {Name = "CP", Icon1 = "esoui/art/treeicons/achievements_indexicon_champion_up.dds", Icon2 = "esoui/art/treeicons/achievements_indexicon_champion_up.dds", Icon3 = "", Val = GetPlayerChampionPointsEarned(), Max = 3600 }) --** Lorebooks --1 - shalidor --2- crafting --3 - Eidetic local TotalKnownLore = 0 local TotalLore = 0 for i=1,3,1 do local name, CatNum, categoryId = GetLoreCategoryInfo(i) --d(name.." - "..CatNum.."/"..categoryId) for j=1,CatNum,1 do local LoreName,desc, LoreKnown, LoreTotal= GetLoreCollectionInfo(i,j) TotalKnownLore = TotalKnownLore + LoreKnown TotalLore = TotalLore + LoreTotal end end table.insert(OCDCollector.SUM, {Name = "Lorebooks", Icon1 = "esoui/art/journal/journal_tabicon_lorelibrary_up.dds", Icon2 = "esoui/art/journal/journal_tabicon_lorelibrary_down.dds", Icon3 = "", Val = TotalKnownLore, Max = TotalLore }) --d("Lorebooks: "..TotalKnownLore.." / "..TotalLore) -- GetLoreCategoryInfo(number categoryIndex) -- Returns: string name, number numCollections, number categoryId -- GetLoreCollectionInfo(number categoryIndex, number collectionIndex) -- Returns: string name, string description, number numKnownBooks, number totalBooks, boolean hidden, textureName gamepadIcon, number collectionId --** MountTraining --Returns: number inventoryBonus, number maxInventoryBonus, number staminaBonus, number maxStaminaBonus, number speedBonus, number maxSpeedBonus local a,b,c,dd,e,f = GetRidingStats() local MountStats = a + c + e local MountStatsMax = b + dd + f --d("MountTraining: ".. MountStats .. " / " .. MountStatsMax) table.insert(OCDCollector.SUM, {Name = "Mount Training", Icon1 = "esoui/art/treeicons/store_indexicon_mounts_up.dds", Icon2 = "", Icon3 = "", Val = MountStats, Max = MountStatsMax }) -- Skills to Max -- for i=1,GetNumSkillTypes(),1 do -- d("Skillline: "..i) -- for j=1,30,1 do --TODO: hwo to get skilllines -- local X = GetSkillLineName(i,j) -- if X then -- d(" "..GetSkillLineName(i,j)) -- end -- end -- end -- GetNumSkillAbilities(number SkillType skillType, number skillLineIndex) -- Returns: number numAbilities -- SKILL_TYPE_ARMOR 3 -- SKILL_TYPE_AVA 6 -- SKILL_TYPE_CHAMPION 9 -- SKILL_TYPE_CLASS 1 -- SKILL_TYPE_GUILD 5 -- SKILL_TYPE_NONE 0 -- SKILL_TYPE_RACIAL 7 -- SKILL_TYPE_TRADESKILL 8 -- SKILL_TYPE_WEAPON 2 -- SKILL_TYPE_WORLD 4 -- for a=0,30,1 do -- d(GetNumSkillAbilities(0,a)) -- end -- GetNumSkillAbilities(number SkillType skillType, number skillLineIndex) -- Returns: number numAbilities -- GetNumSkillLines(number SkillType skillType) -- Returns: number numSkillLines -- Search on ESOUI Source Code GetNumSkillTypes() -- Returns: number numSkillTypes -- Research --++--++--++--++--++--++-- -- Partial Helpers: -- Dungeons -- dungeons Skills -- original fishes / Fishing zones done -- Cyro Ranks -- skyshards GetNumSkyShards() OCDShortBG:SetEdgeColor(0.4,0.2,0.2, 0) OCDShortBG:SetCenterColor(0.1,0.1,0.1) OCDShortBG:SetAlpha(0.8) OCDShortBG:SetDrawLayer(0) OCDShortBG:SetResizeToFitDescendents(true) OCDShortBG:SetMovable(true) OCDShort:SetResizeToFitDescendents(true) OCDShort:SetMovable(true) local last = OCDShortBG local OCDShortWidth = 10 local i = 1 local ShortShowOrder = OCDShortPrepareArray() -- {Name = "", Icon1 = "", Icon2 = "", Icon3 = "", Val = "", Max = "" } for k,v in pairs(ShortShowOrder) do local line = WINDOW_MANAGER:CreateControlFromVirtual("ShortDIVNode", OCDShortBG, "ShortDIV", i) line.icon = line:GetNamedChild("Icon") line.texture = line.icon:GetNamedChild("Texture") --d(line.icon) line.text = line:GetNamedChild("TXT") line.tooltip = line:GetNamedChild("TOOLTIP") line.text:SetText(v.Val.."/"..v.Max.." ")--use margin instead line.icon:SetNormalTexture(v.Icon1) if v.Icon2 ~= nil then line.icon:SetMouseOverTexture(v.Icon2) end if v.Icon2 ~= nil then line.icon:SetPressedTexture(v.Icon3) end line.tooltip:SetText(v.Name) OCDShortWidth = OCDShortWidth + line.icon:GetWidth() OCDShortWidth = OCDShortWidth + line.text:GetWidth() if i==1 then line.icon:SetAnchor(TOPLEFT, OCDShortBG, TOPLEFT, 0,0) line.text:SetAnchor(LEFT, line.icon, RIGHT, 0,0) else line.icon:SetAnchor(LEFT, last, RIGHT, 0,0) line.text:SetAnchor(LEFT, line.icon, RIGHT, 0,0) end last = line.text i = i+1 end OCDShortBG:SetDimensionConstraints(OCDShortWidth, 40, 2000, 2000) OCDShort:SetDimensionConstraints(OCDShortWidth, 40, 2000, 2000) OCDShortSUMMARY:SetText(string.format("%.2f", OCDShortCalculatePercent()).."%") end function OCDShortPrepareArray() local tmp = {} local ShortOrder = OCDCollector.savedVariables.ShortShow for k,v in pairs(ShortOrder) do --d(tostring(v).." "..OCDCollector["SUM"][v]["Name"]) table.insert(tmp, OCDCollector["SUM"][v]) end return tmp end function OCDShortCalculatePercent() --mode standard local i = 0 local PartialPercent = 0 for k,v in pairs(OCDCollector["SUM"]) do PartialPercent = PartialPercent + v.Val / v.Max i = i + 1 end PartialPercent = PartialPercent / i*100 return PartialPercent end --TODO Weighted arithmetic mean based on Settings function OCDTooltipShow(id) id:GetParent():GetNamedChild("TOOLTIP"):SetHidden(false) end function OCDTooltipHide(id) id:GetParent():GetNamedChild("TOOLTIP"):SetHidden(true) end function OCDCollectorSpanCat() for i = 1, 3 do d(i) local last = last or OCDDashLeft local dynC = WINDOW_MANAGER:CreateControlFromVirtual("ABCDE", OCDDashLeft, "OCDMenu", i) d(dynC) dynC:SetAnchor(TOPLEFT, last, BOTTOMLEFT, 0, 0) local label = dynC:GetNamedChild("_Label") d(label) dynC:SetAnchor(TOPLEFT, label, TOPLEFT, 0, 0) local tmp = "ABCDE2Label" local tmp2 = "TEST string #"..tostring(i) label:SetText(tmp2) end end function OCDCollectorBuildAddonSettingsMenu() local LAM2 = LibStub("LibAddonMenu-2.0") function SetShortIcons(str) local tmp = {} for i in string.gmatch(str, "%S+") do if tonumber(i) ~= nil then table.insert(tmp, tonumber(i)) end end d("+++++++++++++++") d(tmp) d("----") d(OCDCollector.savedVariables.ShortShow) OCDCollector.savedVariables.ShortShow = tmp d("----") d(OCDCollector.savedVariables.ShortShow) return tmp end local panelData = { type = "panel", name = "OCD Collector", } local optionsData = { { type ="divider", width = "full" }, { type = "checkbox", name = "Merge Collectibles", tooltip = "If ON it will show only Sum of collected collectibles", getFunc = function() return true end, setFunc = function(value) d(value) end, }, { type ="divider", width = "full" }, { type = "header", name = "Show/Hide Progression Icon", }} for j,k in pairs(OCDCollector.SUM) do table.insert(optionsData, { type = "checkbox", name = "#"..j.." "..k.Name, tooltip = "If ON \""..k.Name.."\" category will be counted in calculating total progression", getFunc = function() return true end, setFunc = function(value) d(value) end, }) end optionsData2={ { type = "editbox", name = "Order", tooltip = "Set the order on on-screen summary", getFunc = function() return table.concat(OCDCollector.savedVariables.ShortShow, " ") end, setFunc = function(text) SetShortIcons(text) end, isMultiline = false, width = "full", requiresReload = true, }, { type = "button", name = "Reload UI", func = function() ReloadUI() end, tooltip = "Button's tooltip text.", -- string id or function returning a string (optional) }, { type ="divider", width = "full" }, { type = "dropdown", name = "My Dropdown", tooltip = "Dropdown's tooltip text.", choices = {"table", "of", "choices"}, getFunc = function() return "of" end, setFunc = function(var) print(var) end, }, { type = "slider", name = "My Slider", tooltip = "Slider's tooltip text.", min = 0, max = 20, getFunc = function() return 3 end, setFunc = function(value) d(value) end, }, { type ="divider", width = "full" }, { type = "description", text = "My description text to display.", title = "My Title", width = "full", } } --little hack for merginga tables for i in pairs(optionsData2) do table.insert(optionsData, optionsData2[i]) end LAM2:RegisterAddonPanel("OCDCollectorSettings", panelData) LAM2:RegisterOptionControls("OCDCollectorSettings", optionsData) end function OCDCollector.ShowCollectibles() d("--Show Collectibes--") OCDDash:SetHidden(false) end function OCDCollector.HideCollectibles() OCDDash:SetHidden(true) end function OCDCollector.SaveSettings() OCDCollector.savedVariables.Left = -1 * GuiRoot:GetRight() + OCDShort:GetRight() OCDCollector.savedVariables.Top = OCDShort:GetTop() d("**onExit") d(OCDCollector.savedVariables.ShortShow) end function OCDCollectorLoadSettings() OCDShort:ClearAnchors() OCDShort:SetAnchor(TOPRIGHT, GuiRoot, TOPRIGHT, OCDCollector.savedVariables.Left, OCDCollector.savedVariables.Top) end function OCDCollector.OnAddOnLoaded(event, addonName) if (addonName ~= "OCDCollector") then return end d("OCD Collector started") OCDCollector.savedVariables = ZO_SavedVars:NewAccountWide("OCDCollector", 1, nil, { Left = 0, Top = 0, --ShortShow = {3,4,5,6,7,8,9,10,12,13,14,15,16,18,19} --idk why it doesnt work }) if OCDCollector.savedVariables.ShortShow == nil then OCDCollector.savedVariables.ShortShow = {3,4,5,6,7,8,9,10,12,13,14,15,16,18,19} end OCDCollectorLoadSettings() OCDCollectorScan() OCDCollectorBuildAddonSettingsMenu() d("OCD Collector finished") end EVENT_MANAGER:RegisterForEvent(OCDCollector.name, EVENT_PLAYER_DEACTIVATED , OCDCollector.SaveSettings) EVENT_MANAGER:RegisterForEvent(OCDCollector.name, EVENT_ADD_ON_LOADED, OCDCollector.OnAddOnLoaded) SLASH_COMMANDS["/ocd"] = OCDCollector.ShowCollectibles SLASH_COMMANDS["/oscan"] = OCDCollectorScan