You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1508 lines
44 KiB

-- ///////////////////////////////////////////////////////////////////////////////////////////
--
-- 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