-- /////////////////////////////////////////////////////////////////////////////////////////// -- -- Better Wardrobe and Collection -- Author: SLOKnightfall -- Wardrobe and Collection: Adds additional functionality and sets to the transmog and collection areas -- -- -- /////////////////////////////////////////////////////////////////////////////////////////// local CONFIG = ... local ADDON, Addon = CONFIG:match('[^_]+'), _G[CONFIG:match('[^_]+')] local addonName, addon = ... ---addon = LibStub("AceAddon-3.0"):NewAddon(addon, addonName, "AceEvent-3.0", "AceConsole-3.0", "AceHook-3.0") addon = LibStub("AceAddon-3.0"):GetAddon(addonName) --_G[addonName] = {} addon.Frame = LibStub("AceGUI-3.0") addon.itemSourceID = {} addon.QueueList = {} addon.validSetCache = {} addon.usableSourceCache = {} addon.UI = {} addon.Init = {} addon.Plugins = {} local newTransmogInfo = {["latestSource"] = NO_TRANSMOG_SOURCE_ID} --{[99999999] = {[58138] = 10}, } addon.TRANSMOG_SET_FILTER = {} _G[addonName] = {} local playerInv_DB local Profile local playerNme local realmName local playerClass, classID,_ local L = LibStub("AceLocale-3.0"):GetLocale(addonName) local GetItemInfoInstant = C_Item and C_Item.GetItemInfoInstant --ACE3 Option Handlers local optionHandler = {} function optionHandler:Setter(info, value) Profile[info[#info]] = value if info.arg == "tooltipRotate" then --addon.preview.rotate:SetShown(value) elseif info.arg == "tooltipWidth" then addon.preview:SetWidth(value) elseif info.arg == "tooltipHeight" then addon.preview:SetHeight(value) elseif info.arg == "DR_Width" then DressUpFrame:SetWidth(value) DressUpFrame.BW_ResizeFrame = true elseif info.arg == "DR_Height" then DressUpFrame:SetHeight(value) DressUpFrame.BW_ResizeFrame = true elseif info.arg == "DR_OptionsEnable" then if not Profile.DR_OptionsEnable then addon:DressingRoom_Disable() else addon:DressingRoom_Enable() end elseif info.arg == IgnoreClassRestrictions or info.arg == IgnoreClassLookalikeRestrictions then addon.Init:InitDB() elseif info.arg == "ShowAdditionalSourceTooltips" then ---C_TransmogCollection.SetShowMissingSourceInItemTooltips(value) SetCVar("missingTransmogSourceInItemTooltips",value) elseif info.arg == "ExtraLargeTransmogArea" or info.arg == "LargeTransmogArea" then addon.TransmogVendorSizeUpdated = false addon.ExtendTransmogView() elseif info.arg == "ExtraLargeTransmogAreaMax" then addon.ExtendTransmogView(true) end end function optionHandler:Getter(info) return Profile[info[#info]] end function optionHandler:TSMDisable(info) return not C_AddOns.IsAddOnLoaded("TradeSkillMaster") end function optionHandler:TSMSources(info) local sources = {} local table = {} if (C_AddOns.IsAddOnLoaded("TradeSkillMaster")) then TSM_API.GetPriceSourceKeys(sources) end return sources end function optionHandler:TSM_MarketGetter(info) if Profile[info[#info]] == "DBMarket" then local table = optionHandler:TSMSources(info) for i, name in ipairs(table) do if name == "DBMarket" then Profile[info[#info]] = i break end end end return optionHandler:Getter(info) end --local PATRONS = {{},{title = 'Patrons', people = addon.Patrons},} local Patrons = { name = "Patrons |TInterface/Addons/BetterWardrobe/Images/Patreon:12:12|t", handler = optionHandler, get = "Getter", set = "Setter", type = 'group', childGroups = "tab", inline = false, args = { Patronss_Label = { order = 1, name = function() return addonName .. ' is distributed for free and supported trough donations. A massive thank you to all the supporters on Patreon and Paypal who keep development alive. You can become a patron too at |cFFF96854patreon.com/SLOKnightfall|r.\n\n\n', 'https://www.patreon.com/SLOKnightfall' end, type = "description", width = "full", }, Patronss_Header = { order = 2, name = "Patrons", type = "header", width = "full", }, }, } local function addPatrons() for i, namex in ipairs(addon.Patrons) do Patrons.args["name"..i] = { order = i + 2, name = namex, type = "description", width = ".3", } end end local screenWidth = math.floor(UIParent:GetWidth()) --ACE3 Options Constuctor local options = { name = "BetterWardrobe", handler = optionHandler, get = "Getter", set = "Setter", type = 'group', childGroups = "tab", inline = true, args = { settings={ name = L["Options"], type = "group", childGroups = "tab", inline = false, order = 0, args={ general_settings={ name = L["Settings"], type = "group", childGroups = "tree", inline = false, order = 1, args={ general_settings={ name = " ", type = "group", inline = true, order = 1, args={ Options_Header = { order = 1, name = L["General Options"], type = "header", width = "full", }, IgnoreClassRestrictions = { order = 1.2, name = L["Ignore Class Restriction Filter"], type = "toggle", width = "full",--1.3, arg = "IgnoreClassRestrictions", }, IgnoreClassLookalikeRestrictions = { order = 1.3, name = L["Only for Raid Lookalike/Recolor Sets"], type = "toggle", width = 1.4, arg = "IgnoreClassLookalikeRestrictions", disabled = function() return not addon.Profile.IgnoreClassRestrictions end, hidden = true, }, ShowCollectionUpdates = { order = 2, name = L["Print Set Collection alerts to chat:"], type = "toggle", width = 1.3, }, ShowSetCollectionUpdates = { order = 3, name = L["Sets"], type = "toggle", width = .5, disabled = function() return not addon.Profile.ShowCollectionUpdates end, }, ShowExtraSetsCollectionUpdates = { order = 4, name = L["Extra Sets"], type = "toggle", width = .6, disabled = function() return not addon.Profile.ShowCollectionUpdates end, }, ShowCollectionListCollectionUpdates = { order = 5, name = L["Collection List"], type = "toggle", width = .7, disabled = function() return not addon.Profile.ShowCollectionUpdates end, }, TSM_Market = { order = 6, name = L["TSM Source to Use"], --desc = "TSM Source to get price data.", type = "select", get = "TSM_MarketGetter", set = "Setter", width = "double", values = "TSMSources", disabled = "TSMDisable", }, }, }, transmog_settings={ name = " ", type = "group", inline = true, order = 2, args={ Options_Header_3 = { order = 1, name = L["Transmog Vendor Window"], type = "header", width = "full", }, LargeTransmogArea = { order = 1.1, name = L["Larger Transmog Area"], type = "toggle", width = 1.8, arg = "LargeTransmogArea", desc = L["LargeTransmogArea_Tooltip"], }, ExtraLargeTransmogArea = { order = 1.2, name = L["Extra Large Transmog Area"], type = "toggle", width = 1.4, arg = "ExtraLargeTransmogArea", desc = L["ExtraLargeTransmogArea_Tooltip"], }, ExtraLargeTransmogAreaMax = { order = 1.3, name = L["Max Width"], type = "range", width = "full", min = 1200, max = screenWidth, step = 1, bigStep = 100, width = 1.6, arg = "ExtraLargeTransmogAreaMax", desc = L["ExtraLargeTransmogAreaMax_Tooltip"], }, ShowIncomplete = { order = 2, name = L["Show Incomplete Sets"], type = "toggle", }, ShowHidden = { order = 3, name = L["Show Items set to Hidden"], type = "toggle", width = 1.6, }, HideMissing = { order = 4, name = L["Hide Missing Set Pieces at Transmog Vendor"], type = "toggle", width = "full", }, HiddenMog = { order = 5, name = L["Use Hidden Transmog for Missing Set Pieces"], type = "toggle", width = "full", }, PartialLimit = { order = 6, name = L["Required pieces"], type = "range", width = "full", min = 1, max = 8, step = 1, }, ShowNames = { order = 7, name = L["Show Set Names"], type = "toggle", }, ShowSetCount = { order = 8, name = L["Show Collected Count"], type = "toggle", }, }, }, tooltip_settings={ name = " ", type = "group", inline = true, order = 3, args={ Tooltip_Header = { order = 1, name = L["Tooltip Options"], type = "header", width = "full", }, ShowTooltips = { order = 2, name = L["Show Set Info in Tooltips"], type = "toggle", width = 1.2, }, ShowSetTooltips = { order = 3, name = L["Sets"], type = "toggle", width = .5, disabled = function() return not addon.Profile.ShowTooltips end, }, ShowExtraSetsTooltips = { order = 4, name = L["Extra Sets"], type = "toggle", width = .6, disabled = function() return not addon.Profile.ShowTooltips end, }, ShowCollectionListTooltips = { order = 5, name = L["Collection List"], type = "toggle", width = .7, disabled = function() return not addon.Profile.ShowTooltips end, }, ShowDetailedListTooltips = { order = 6, name = L["Show Set Collection Details"], type = "toggle", width = "full", disabled = function() return not addon.Profile.ShowTooltips end, }, ShowMissingDetailedListTooltips = { order = 6.1, name = L["Only List Missing Pieces"], type = "toggle", width = 1.6, disabled = function() return not addon.Profile.ShowTooltips or not addon.Profile.ShowDetailedListTooltips end, }, ShowItemIDTooltips = { order = 7, name = L["Show Item ID"], type = "toggle", width = "full", }, ShowVisualIDTooltips = { order = 7.1, name = L["Show Item Visual ID"], type = "toggle", width = "full", }, ShowILevelTooltips = { order = 7.1, name = L["Show ILevel"], type = "toggle", width = "full", }, ShowOwnedItemTooltips = { order = 8, name = L["Show if appearance is known"], type = "toggle", width = 1.2, }, ShowAdditionalSourceTooltips = { order = 9, name = L["Show if additional sources are available"], type = "toggle", width = 1.6, arg = "ShowAdditionalSourceTooltips" }, ShowTokenTooltips = { order = 10, name = L["Show Token Information"], type = "toggle", width = 1.6, disabled = function() return not addon.Profile.ShowTooltips end, }, ShowWarningTooltips = { order = 10, name = L["Show unable to uses as transmog warning"], type = "toggle", width = 1.6, disabled = function() return not addon.Profile.ShowTooltips end, }, }, }, preview_settings={ name = " ", type = "group", inline = true, order = 4, disabled = function() return not addon.Profile.TooltipPreview_Show end, args={ Options_Header_2 = { order = 0, name = L["Item Preview Options"], type = "header", width = "full", }, TooltipPreview_Show = { order = 1, name = L["Appearance Preview"], type = "toggle", width = "full", disabled = false, width = 1.2, }, TooltipPreview_Modifier = { type = "select", order = 2, name = L["Only show if modifier is pressed"], values = function() local tbl = { None = L["None"], } for k,v in pairs(addon.Globals.mods) do tbl[k] = k end return tbl end, width = 1.2, }, TooltipPreview_MogOnly = { type = "toggle", order = 2, name = L["Only transmogrification items"], width = 1.2, }, TooltipPreview_Tokens = { type = "toggle", order = 2, name = L["Try to preview armor tokens"], width = 1.875, }, TooltipPreview_Overlap = { order = 4, name = L["Prevent Comparison Overlap"], type = "toggle", width = "full", desc = L["TooltipPreview_Overlap_Tooltip"], hidden = true, }, TooltipPreview_Zoom = { order = 5, name = L["Zoom:"], type = "description", width = .4, fontSize = "medium", }, TooltipPreview_ZoomWeapon = { order = 6, name = L["On Weapons"], type = "toggle", width = .8, }, TooltipPreview_ZoomItem = { order = 7, name = L["On Clothes"], type = "toggle", width = .675, }, TooltipPreview_ZoomModifier = { type = "select", order = 8, name = L["Only show if modifier is pressed"], values = function() local tbl = { None = "None", } for k,v in pairs(addon.Globals.mods) do tbl[k] = k end return tbl end, width = 1.2, hidden = true, }, TooltipPreview_Spacer1 = { order = 8.1, name = " ", type = "description", width = 1, }, TooltipPreview_Dress = { order = 9, name = L["Dress Preview Model"], type = "toggle", width = 1.2, desc = L["TooltipPreview_Dress_Tooltip"], }, TooltipPreview_DressingDummy = { order = 10, name = L["Use Dressing Dummy Model"], type = "toggle", width = 1.6, desc = L["TooltipPreview_DressingDummy"], }, TooltipPreview_SwapDefault = { order = 9, name = L["Default to Human Form"], type = "toggle", width = 1.2, desc = L["TooltipPreview_Dress_Tooltip"], }, TooltipPreview_SwapModifier = { type = "select", order = 10.1, name = L["Only swap if modifier is pressed"], values = function() local tbl = { None = "None", } for k,v in pairs(addon.Globals.mods) do tbl[k] = k end return tbl end, width = 1.2, hidden = false, }, TooltipPreviewRotate = { order = 11, name = L["Auto Rotate"], type = "toggle", width = 1.2, arg = "tooltipRotate", desc = L["TooltipPreviewRotate_Tooltip"], }, TooltipPreview_MouseRotate = { type = "toggle", order = 12, name = L["Rotate with mouse wheel"], width = 1.6, desc = L["TooltipPreview_MouseRotate_Tooltip"], }, TooltipPreview_Anchor = { width = 1.2, type = "select", order = 13, name = L["Anchor point"], values = { vertical = L["Top/bottom"], horizontal = L["Left/right"], }, width = 1.2, desc = L["TooltipPreview_Anchor_Tooltip"], }, TooltipPreview_Spacer2 = { order = 13.1, name = " ", type = "description", width = .4, fontSize = "medium", width = 1.6 }, TooltipPreview_Width = { type = "range", order = 14, name = L["Width"], step = 1, min = 100, max = 500, arg = "tooltipWidth", width = 1, }, TooltipPreview_Height = { type = "range", order = 15, name = L["Height"], step = 1, min = 100, max = 500, arg = "tooltipHeight", width = 1, }, TooltipPreview_Reset = { type = "execute", order = 15.1, name = L["Reset"], func = function() addon.preview:SetWidth(280) addon.preview:SetHeight(380) addon.Profile.TooltipPreview_Width = 280 addon.Profile.TooltipPreview_Height = 380 end, }, TooltipPreview_CustomModel = { type = "toggle", order = 16, name = L["Use custom model"], width = 1, hidden = true, }, TooltipPreview_CustomWarning = { order = 16.1, name = L["CUSTOM_MODEL_WARNING"], type = "description", width = 2, fontSize = "small", hidden = true, }, TooltipPreview_CustomRace = { type = "select", order = 17, name = L["Model race"], values = { [1] = C_CreatureInfo.GetRaceInfo(1).raceName, --LBR["Human"], [3] = C_CreatureInfo.GetRaceInfo(3).raceName,--["Dwarf"], [4] = C_CreatureInfo.GetRaceInfo(4).raceName,--["Night Elf"], [7] = C_CreatureInfo.GetRaceInfo(7).raceName,--["Gnome"], [11] = C_CreatureInfo.GetRaceInfo(11).raceName,--["Draenei"], [22] = C_CreatureInfo.GetRaceInfo(22).raceName, --["Worgen"], [2] = C_CreatureInfo.GetRaceInfo(2).raceName, --["Orc"], [5] = C_CreatureInfo.GetRaceInfo(5).raceName,--["Undead"], [6] = C_CreatureInfo.GetRaceInfo(6).raceName, --["Tauren"], [8] = C_CreatureInfo.GetRaceInfo(8).raceName, --["Troll"], [10] = C_CreatureInfo.GetRaceInfo(10).raceName, --["Blood Elf"], [9] = C_CreatureInfo.GetRaceInfo(9).raceName, --["Goblin"], [24] = C_CreatureInfo.GetRaceInfo(24).raceName, --["Pandaren"], }, disabled = function() return not addon.Profile.TooltipPreview_CustomModel or not addon.Profile.ShowTooltipPreview end, width = 1.2, hidden = true, }, TooltipPreview_CustomGender = { type = "select", order = 18, name = L["Model gender"], values = { [0] = MALE, [1] = FEMALE, }, disabled = function() return not addon.Profile.TooltipPreview_CustomModel or not addon.Profile.ShowTooltipPreview end, width = 1.2, hidden = true, }, }, }, dressingroom_settings={ name = " ", type = "group", inline = true, order = 5, disabled = function() return not addon.Profile.DR_OptionsEnable end, args={ Options_Header_2 = { order = 1, name = L["Dressing Room Options"], type = "header", width = "full", }, DR_OptionsEnable = { order = 1.2, name = L["Enable"], type = "toggle", disabled = false, width = "full", arg = "DR_OptionsEnable" }, DR_ShowItemButtons = { order = 2, name = L["Show Item Buttons"], type = "toggle", }, DR_ShowControls = { order = 3, name = L["Show DressingRoom Controls"], type = "toggle", width = "full", }, DR_DimBackground = { order = 4, name = L["Dim Backround Image"], type = "toggle", }, DR_HideBackground = { order = 5, name = L["Hide Backround Image"], type = "toggle", width = 1.5, }, DR_StartUndressed = { order = 6, name = L["Start Undressed"], type = "toggle", width = "full", }, DR_HideWeapons = { order = 7, name = L["Hide Weapons"], type = "toggle", }, DR_HideShirt = { order = 8, name = L["Hide Shirt"], type = "toggle", }, DR_HideTabard = { order = 9, name = L["Hide Tabard"], type = "toggle", }, DR_ResizeWindow = { order = 9, name = L["Resize Window"], type = "toggle", width = "full", }, DR_Width = { type = "range", order = 10, name = L["Width"], step = 1, min = 300, max = 1000, arg = "DR_Width", disabled = function() return not addon.Profile.DR_ResizeWindow end, }, DR_Height = { type = "range", order = 11, name = L["Height"], step = 1, min = 300, max = 1000, arg = "DR_Height", disabled = function() return not addon.Profile.DR_ResizeWindow end, }, DR_ScaleReset = { type = "execute", order = 12, name = L["Reset"], func = function() local defaultWidth, defaultHeight = 450, 545 DressUpFrame:SetWidth(defaultWidth) DressUpFrame:SetHeight(defaultHeight) addon.Profile.DR_Width = defaultWidth addon.Profile.DR_Height = defaultHeight DressUpFrame.BW_ResizeFrame = false end, disabled = function() return not addon.Profile.DR_ResizeWindow end, }, }, }, }, }, }, }, list_profiles ={ name = L["List Profiles"], type = "group", childGroups = "tab", inline = false, order = 6, args={ description = { order = 1, name = L["Profiles for sharing the various lists across characters"], type = "description", }, }, }, }, } local subTextFields={} local itemSub_options = { name = "BetterWardrobe", type = 'group', childGroups = "tab", inline = false, args = { settings={ name = L["Items"], type = "group", --inline = true, order = 0, inline = false, childGroups = "tab", args={ BaseItem = { order = 1, name = L["Base Item ID"], type = "input", width = 1, set = function(info, value) subTextFields[1] = value end, get = function(info) return subTextFields[1] end, validate = function(info, value) local id = tonumber(value) if not id then return L["Not a valid itemID"] end local itemEquipLoc1 = GetItemInfoInstant(tonumber(value)) if itemEquipLoc1 == nil then --message(itemID.." not a valid itemID") return L["Not a valid itemID"] else return true end end, }, ReplacementItem = { order = 2, name = L["Replacement Item ID"], type = "input", width = 1, set = function(info, value) subTextFields[2] = value end, get = function(info) return subTextFields[2] end, validate = function(info, value) local id = tonumber(value) if not id then return L["Not a valid itemID"] end local itemEquipLoc1 = GetItemInfoInstant(tonumber(value)) if itemEquipLoc1 == nil then --message(itemID.." not a valid itemID") return L["Not a valid itemID"] else return true end end, }, AddButton = { order = 3, name = L["Add"], type = "execute", width = 1, func = function(info) addon.SetItemSubstitute(subTextFields[1], subTextFields[2]) end, validate = function(info, value) local _, _, _, itemEquipLoc1 = GetItemInfoInstant(tonumber(subTextFields[1]) ) local _, _, _, itemEquipLoc2 = GetItemInfoInstant(tonumber(subTextFields[2]) ) if itemEquipLoc1 ~= itemEquipLoc2 then return L["Item Locations Don't Match"] else return true end end, }, settings={ name = L["Saved Item Substitutes"], type = "group", order = 5, inline = true, args = {}, plugins= {}, }, }, }, }, } function addon.RefreshSubItemData() local function RemoveItemSubstitute(itemID) addon:RemoveItemSubstitute(itemID) end local args = {} for i, data in pairs(addon.itemsubdb.profile.items) do args["BaseItem"..i] = { order = i, name = function(info) local text = (L["item: %d - %s \n==>\nitem: %d - %s"]):format(data.subID, data.subLink or "", i, data.itemLink or "") return text end, type = "description", width = 2.5, disabled = false, } args["AddButton"..i] = { order = i+2, name = L["Remove"], type = "execute", width = .5, func = function() return RemoveItemSubstitute(i) end, } end itemSub_options.args.settings.args.settings.plugins["items"] = args end function addon.RefreshCollectionListData() --BW_UIDropDownMenu_SetSelectedID(BW_CollectionList_Dropdown, addon.CollectionList:SelectedCollectionList()) end local savedOutfits_options = { name = "BetterWardrobe", type = 'group', childGroups = "tab", inline = false, args = { }, } function addon.RefreshOutfitData() local function RemoveCharacterData(name) addon.setdb.global.sets[name] = nil addon.RefreshOutfitData() --addon.RefreshSaveOutfitDropdown() end --[[ local function CopyCharacterData(name) --need to copy over default blizzard saved sets --print(name) --local profile = addon.setdb:GetCurrentProfile() --addon.setdb.global.sets[profile] = CopyTable(addon.setdb.global.sets[name]) --zx=addon.setdb.global.sets[name] --addon.setdb:CopyProfile(addon.setdb.global.sets[name], silent) --addon.RefreshOutfitData() --addon.RefreshSaveOutfitDropdown() --addon:RefreshConfig() end ]]-- local args = {} local i = 1 for name, data in pairs(addon.setdb.global.sets) do args["BaseItem"..i] = { order = i, name = function(info) return name end, type = "description", width = 2.5, disabled = false, } --args["CopyButton"..i] = { --order = i + .2, --name = L["Copy"], --type = "execute", --width = .5, --func = function() -- return CopyCharacterData(name) end, -- } args["AddButton"..i] = { order = i + .2, name = L["Remove"], type = "execute", width = .5, func = function() return RemoveCharacterData(name) end, } i = i + 1 end savedOutfits_options.args = args end --ACE Profile Saved Variables Defaults local defaults = { profile = { ['*'] = true, PartialLimit = 4, ShowHidden = false, TSM_Market = "DBMarket", DR_HideBackground = false, DR_HideWeapons = false, DR_StartUndressed = false, DR_HideShirt = false, DR_HideTabard = false, TooltipPreview_Width = 300, TooltipPreview_Height = 300, DR_Width = 450, DR_Height = 545, ShowItemIDTooltips = false, TooltipPreview_Show = false, TooltipPreview_Anchor = "horizontal", TooltipPreviewRotate = false, TooltipPreview_Modifier = L["None"], TooltipPreview_ZoomItemModifier = L["None"], TooltipPreview_SwapModifier = L["None"], TooltipPreview_CustomRace = 1, TooltipPreview_CustomGender = 0, TooltipPreview_DressingDummy = false, IgnoreClassRestrictions = false, CurrentFactionSets = true, ExtraLargeTransmogArea = false, ExtraLargeTransmogAreaMax = screenWidth, AutoApply = false, } } local DB_Defaults = { char_defaults = { profile = { item = {}, set = {}, extraset = {}, outfits = {}, lastTransmogOutfitIDSpec = {}, listUpdate = false, } }, savedsets_defaults = { profile = {autoHideSlot = {}, sorting = 1,}, global = {sets={}, itemsubstitute = {}, outfits = {}, updates = {},}, }, collectionList_defaults = { profile = { collectionList = {item = {}, set = {}, extraset = {}, name = "CollectionList"}, selectedCollectionList = 1, lists = {{item = {}, set = {}, extraset = {}, name = "CollectionList"},}, }, }, list_defaults = { profile = {item = {}, set = {}, extraset = {}, }, }, itemsub_defaults = { profile = {items = {}} }, charSavedOutfits_defaults = { char = { item = {}, set = {}, extraset = {}, outfits = {}, lastTransmogOutfitIDSpec = {}, listUpdate = false, } }, collection_cache_defaults = { global = {sets={}, }, }, } local firstRun = false local function UpdateDB() local characterDB = BetterWardrobe_CharacterData local listDB = BetterWardrobe_ListData local favoriteDB = listDB.favoritesDB or {} local collectionDB = listDB.collectionListDB or {} local hiddenDB = listDB.HiddenAppearanceDB or {} local outfitDB = listDB.OutfitDB or {} --local favoriteDB = self.favoriteListDB --local collectionDB = self.collectionListDB --Check to see if it is a new install if not characterDB or (characterDB and not characterDB.profiles) then firstRun = true; return end --Update 1. splt favorites and collection tables from characterDB. Update collections to allow multiple lists 10/27/20 if listDB.lastUpdte ~= 1 then --Populate profile keys favoriteDB.profileKeys = CopyTable(characterDB.profileKeys) collectionDB.profileKeys = CopyTable(characterDB.profileKeys) hiddenDB.profileKeys = CopyTable(characterDB.profileKeys) --Create profile table favoriteDB.profiles = {} collectionDB.profiles = {} hiddenDB.profiles = {} --local profiles = self.chardb:GetProfiles() --do the first db update to allow multiple lists for profile, data in pairs(characterDB.profiles) do data.lists = data.lists or {} if #data.lists == 0 and data.collectionList then local listcopy = CopyTable(data.collectionList) listcopy.name = L["Collection List"] tinsert(data.lists, listcopy) end data.collectionList = nil end -- do the second update to split into seperate profiles for profile, data in pairs(characterDB.profiles) do favoriteDB.profiles[profile] = {} if data.favorite_items then favoriteDB.profiles[profile].item = CopyTable(data.favorite_items) data.favorite_items = nil end if data.favorite then favoriteDB.profiles[profile].extraset = CopyTable(data.favorite) data.favorite = nil end collectionDB.profiles[profile] = {} if data.selectedCollectionList then collectionDB.profiles[profile].selectedCollectionList = data.selectedCollectionList data.selectedCollectionList = nil end if data.lists then collectionDB.profiles[profile].lists = CopyTable(data.lists) data.lists = nil end hiddenDB.profiles[profile] = {} if data.item then hiddenDB.profiles[profile].item = CopyTable(data.item) data.item = nil end if data.set then hiddenDB.profiles[profile].set = CopyTable(data.set) data.set = nil end if data.extraset then hiddenDB.profiles[profile].extraset = CopyTable(data.extraset) data.extraset = nil end --collectionDB.profiles[profile].collectionList = nil end outfitDB.profileKeys = {} outfitDB.char = {} for profile, data in pairs(characterDB.profileKeys) do outfitDB.profileKeys[profile] = profile if characterDB.profiles[data] then outfitDB.char[profile] = {} if characterDB.profiles[data].outfits then outfitDB.char[profile].outfits = CopyTable(characterDB.profiles[data].outfits) end if characterDB.profiles[data].lastTransmogOutfitIDSpec then outfitDB.char[profile].lastTransmogOutfitIDSpec = CopyTable(characterDB.profiles[data].lastTransmogOutfitIDSpec) end end end listDB.lastUpdte = 1 end end --Updates the db to reflect new set indexes local function UpdateDB_8_4() BetterWardrobe_Updates = BetterWardrobe_Updates or {} if not BetterWardrobe_Updates["8_4"] then local characterDB = BetterWardrobe_CharacterData local listDB = BetterWardrobe_ListData local favoriteDB = listDB.favoritesDB or {} local hiddenDB = listDB.HiddenAppearanceDB or {} if not favoriteDB.profiles then BetterWardrobe_Updates["8_4"] = true; return end for profile, data in pairs(favoriteDB.profiles) do local extraSets = {} if data.extraset then for setid, value in pairs(data.extraset) do if setid > 100000 then extraSets[setid / 100000] = value else extraSets[setid + 10000] = value end end data.extraset = extraSets end end for profile, data in pairs(hiddenDB.profiles) do local extraSets = {} if data.extraset then for setid, value in pairs(data.extraset) do if setid > 100000 then extraSets[setid / 100000] = value else extraSets[setid + 10000] = value end end data.extraset = extraSets end end BetterWardrobe_Updates["8_4"] = true end end ---Updates Profile after changes function addon:RefreshConfig() addon.Profile = self.db.profile Profile = addon.Profile end ---Updates Profile after changes function addon:RefreshCharConfig() --addon.Profile = self.db.profile --Profile = addon.Profile end local f = CreateFrame("Frame", nil, UIParent) f:SetHeight(1) f:SetWidth(1) f:SetPoint("TOPLEFT", UIParent, "TOPRIGHT") f.model = CreateFrame("DressUpModel", nil, UIParent) --f.model:SetPoint("CENTER", UIParent, "CENTER") f.model:SetPoint("TOPLEFT", UIParent, "TOPRIGHT") f.model:SetHeight(1) f.model:SetWidth(1) f.model:SetModelScale(1) f.model:Hide() f.model:SetAutoDress(false) f.model:SetUnit("PLAYER") addon.frame = f ---Ace based addon initilization function addon:OnInitialize() local DB_Defaults = DB_Defaults BetterWardrobe_ListData = BetterWardrobe_ListData or {} local listDB = BetterWardrobe_ListData listDB.favoritesDB = listDB.favoritesDB or {} listDB.collectionListDB = listDB.collectionListDB or {} listDB.HiddenAppearanceDB = listDB.HiddenAppearanceDB or {} listDB.OutfitDB = listDB.OutfitDB or {} UpdateDB() UpdateDB_8_4() --Create all the profiled DB self.db = LibStub("AceDB-3.0"):New("BetterWardrobe_Options", defaults, true) options.args.settings.args.options = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) options.args.settings.args.options.name = L["Options Profiles"] options.args.settings.args.options.order = 2 self.chardb = LibStub("AceDB-3.0"):New("BetterWardrobe_CharacterData", DB_Defaults.char_defaults) --options.args.list_profiles.args.charprofiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.chardb) --options.args.list_profiles.args.charprofiles.name = L["Profiles - Collection Settings"] self.setdb = LibStub("AceDB-3.0"):New("BetterWardrobe_SavedSetData", DB_Defaults.savedsets_defaults) self.itemsubdb = LibStub("AceDB-3.0"):New("BetterWardrobe_SubstituteItemData", DB_Defaults.itemsub_defaults, true) self.OutfitDB = LibStub("AceDB-3.0"):New(listDB.OutfitDB, DB_Defaults.charSavedOutfits_defaults) self.favoritesDB = LibStub("AceDB-3.0"):New(listDB.favoritesDB, DB_Defaults.list_defaults) self.collectionListDB = LibStub("AceDB-3.0"):New(listDB.collectionListDB, DB_Defaults.collectionList_defaults) self.HiddenAppearanceDB = LibStub("AceDB-3.0"):New(listDB.HiddenAppearanceDB, DB_Defaults.list_defaults) self.char_savedOutfits = LibStub("AceDB-3.0"):New("BetterWardrobe_SavedOutfitData", charSavedOutfits_defaults, true) self.collectionCache = LibStub("AceDB-3.0"):New("BetterWardrobe_CollectionCache", collection_cache_defaults, true) local profile = self.setdb:GetCurrentProfile() --self.setdb.global[profile] = self.setdb.char addon.SelecteSavedList = false options.args.subitems = itemSub_options options.args.subitems.name = L["Item Substitution"] options.args.char_savedOutfits = savedOutfits_options options.args.char_savedOutfits.name = L["Saved Outfits"] options.args.subitems.args.options = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.itemsubdb) --options.args.char_savedOutfits.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.char_savedOutfits) options.args.list_profiles.args.favoriteLists = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.favoritesDB) options.args.list_profiles.args.favoriteLists.name = L["Favorite Items & Sets"] options.args.list_profiles.args.favoriteLists.order = 2 options.args.list_profiles.args.collectionLists = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.collectionListDB) options.args.list_profiles.args.collectionLists.name = L["Collection List"] options.args.list_profiles.args.collectionLists.order = 3 options.args.list_profiles.args.HiddenAppearanceDB = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.HiddenAppearanceDB) options.args.list_profiles.args.HiddenAppearanceDB.name = L["Hidden Items & Sets"] options.args.list_profiles.args.HiddenAppearanceDB.order = 4 LibStub("AceConfigRegistry-3.0"):ValidateOptionsTable(options, addonName) LibStub("AceConfig-3.0"):RegisterOptionsTable(addonName, options) LibStub("AceConfig-3.0"):RegisterOptionsTable("Patrons", Patrons) self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("BetterWardrobe", "BetterWardrobe") self.patrons = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("Patrons", "Patrons |TInterface/Addons/BetterWardrobe/Images/Patreon:12:12|t","BetterWardrobe") self.db.RegisterCallback(addon, "OnProfileChanged", "RefreshConfig") self.db.RegisterCallback(addon, "OnProfileCopied", "RefreshConfig") self.collectionListDB.RegisterCallback(addon, "OnProfileChanged", "RefreshCollectionListData") self.itemsubdb.RegisterCallback(addon, "OnProfileReset", "RefreshSubItemData") --local PATRONS = {{},{title = 'Patrons', people = addon.Patrons},} --local Credits = LibStub('Sushi-3.1').CreditsGroup(self.optionsFrame, PATRONS, 'Patrons |TInterface/Addons/BetterWardrobe/Images/Patreon:12:12|t') --Credits:SetSubtitle(addonName .. ' is distributed for free and supported trough donations. A massive thank you to all the supporters on Patreon and Paypal who keep development alive. You can become a patron too at |cFFF96854patreon.com/SLOKnightfall|r.', 'https://www.patreon.com/SLOKnightfall') if firstRun then listDB.lastUpdte = 1 end end local initialize function addon:OnEnable() _,playerClass, classID = UnitClass("player") addon.Profile = self.db.profile Profile = addon.Profile addon.Init:InitDB() --addon.Init:BuildTooltips() addon.Init:DressingRoom() --addon.Init.LoadCollectionListModule() --BW_ColectionListFrameTemplate --addon.Init:BuildTooltips() addon:InitTooltips() C_Timer.After(0.5, function() addon.RefreshSubItemData() addon.RefreshOutfitData() end) addPatrons() addon:RegisterEvent("TRANSMOG_COLLECTION_SOURCE_REMOVED", "EventHandler") addon:RegisterEvent("TRANSMOG_COLLECTION_SOURCE_ADDED", "EventHandler") addon:RegisterEvent("PLAYER_ENTERING_WORLD", "EventHandler") --Cache any default Blizz Saved Sets addon.StoreBlizzardSets() initialize = true if not C_AddOns.IsAddOnLoaded("Blizzard_Collections") then C_AddOns.LoadAddOn("Blizzard_Collections") end C_Timer.After(1, function() addon.Init:LoadModules() end) end --Hides default collection window when at transmog vendor local function UpdateTransmogVendor() WardrobeCollectionFrame:Hide() BetterWardrobeCollectionFrame:Show() BetterWardrobeCollectionFrame:SetContainer(WardrobeFrame) end --Loads various modules and builds frames once the Blizzard_Collection addon is loaded function addon.Init:LoadModules() --Check to make sure that the addon has completed loading if not initialize then C_Timer.After(0.5, function() addon.Init:LoadModules() end) return false end --Check to make sure that the Blizzard Frames have completed loading if not WardrobeTransmogFrame then C_Timer.After(0.5, function() addon.Init:LoadModules() end) return false end C_Timer.After(0, function() addon.Init:UpdateWardrobeEnhanced() end) local f = CreateFrame("Frame", "BetterWardrobeCollectionFrame", UIParent, "BetterWardrobeCollectionFrameTemplate" ) --Hooks into the colection tabs and sets Better Wardobe when viewing the wardrobe collection addon:SecureHook(nil, "CollectionsJournal_UpdateSelectedTab", function(self) local selected = CollectionsJournal_GetTab(self) -- don't touch the wardrobe frame if it's used by the transmogrifier if (WardrobeCollectionFrame:GetParent() == self or not WardrobeCollectionFrame:GetParent():IsShown()) then if selected == 5 then --HideUIPanel(WardrobeFrame) WardrobeCollectionFrame:Hide() --BetterWardrobeCollectionFrame:Show() BetterWardrobeCollectionFrame:SetContainer(self) if addon.ExtendedTransmogSwap then addon.ExtendedTransmogSwap:Show() end else --WardrobeCollectionFrame:Hide() BetterWardrobeCollectionFrame:Hide() if addon.ExtendedTransmogSwap then addon.ExtendedTransmogSwap:Hide() end end end end) --addon.Init:LoadWardrobeModule() WardrobeFrame:HookScript("OnShow", function() UpdateTransmogVendor() end) addon:SecureHook(WardrobeTransmogFrame, "GetRandomAppearanceID", function(self) BW_TransmogFrameMixin.GetRandomAppearanceID(self) end) addon:SecureHook(WardrobeTransmogFrame, "SelectSlotButton", function(self, slotButton, fromOnClick) BW_TransmogFrameMixin.SelectSlotButton(self, slotButton, fromOnClick) end) addon:SecureHook(WardrobeTransmogFrame, "EvaluateSecondaryAppearanceCheckbox", function(self) BW_TransmogFrameMixin.EvaluateSecondaryAppearanceCheckbox(self) end) addon:SecureHook(WardrobeTransmogFrame, "GetSelectedTransmogLocation", function(self) BW_TransmogFrameMixin.GetSelectedTransmogLocation(self) end) ----addon:SecureHook(WardrobeTransmogFrame, "Update", function(self) BW_TransmogFrameMixin.Update(self) end) addon:SecureHook(WardrobeTransmogFrame, "SetPendingTransmog", function(self,...) BW_TransmogFrameMixin.Update(self,...) end) addon:SecureHook(WardrobeTransmogFrame, "GetSlotButton", function(self,...) BW_TransmogFrameMixin.GetSlotButton(self,...) end) --addon:SecureHook(WardrobeTransmogFrame, "OnTransmogApplied", function(self,...) BW_TransmogFrameMixin.OnTransmogApplied(self,...) end) addon:SecureHook(DressUpFrame, "OnDressModel", function() BW_DressingRoomFrameOutfitDropdown:UpdateSaveButton(); end) C_Timer.After(0, function() addon:UpdatePetTracker() addon.Init:initCollectionList() addon.Init:BuildCollectionList() addon.Init:BuildTransmogVendorUI() addon:UpdateCanIMogIt() addon:InitExtendedSetsSwap() local selected = CollectionsJournal_GetTab(CollectionsJournal) BetterWardrobeCollectionFrame:SetShown(selected == 5) if C_AddOns.IsAddOnLoaded("ElvUI") then addon.ApplyElvUISkin() end end) end function addon:EventHandler(event, ...) if event == "ADDON_LOADED" and ... == "Blizzard_Collections" then addon:SendMessage("BW_ADDON_LOADED") addon:UnregisterEvent("ADDON_LOADED") elseif event == "PLAYER_LOGIN" then elseif event == "PLAYER_ENTERING_WORLD" then addon:SendMessage("BW_OnPlayerEnterWorld") C_Timer.After(1, function() addon:ResetSetsCollectionFrame() end) --C_Timer.After(15, function() addon.Init:UpdateCollectedAppearances() end) elseif (event == "TRANSMOG_COLLECTION_SOURCE_ADDED") then local x = ... BetterWardrobeCollectionFrameMixin:OnEvent(event, x) elseif (event == "TRANSMOG_COLLECTION_SOURCE_REMOVED") then local x = ... BetterWardrobeCollectionFrameMixin:OnEvent(event, x) end end local f = CreateFrame("Frame", nil, UIParent) f:ClearAllPoints() f:SetPoint("TOPRIGHT", 100, 100) f:SetSize(1, 1) f:Hide() addon.prisonFrame = f function BetterWardrobe_OnAddonCompartmentClick(addonName, buttonName, menuButtonFrame) ToggleCollectionsJournal(5) end