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.
155 lines
5.0 KiB
155 lines
5.0 KiB
|
2 years ago
|
local Addon = LibStub('AceAddon-3.0'):GetAddon('WoWthing_Collector')
|
||
|
|
local Module = Addon:NewModule('Transmog')
|
||
|
|
|
||
|
|
|
||
|
|
Module.db = {}
|
||
|
|
|
||
|
|
local C_TransmogCollection_GetAppearanceSources = C_TransmogCollection.GetAppearanceSources
|
||
|
|
local C_TransmogCollection_GetCategoryAppearances = C_TransmogCollection.GetCategoryAppearances
|
||
|
|
|
||
|
|
function Module:OnEnable()
|
||
|
|
self.isOpen = false
|
||
|
|
self.isScanning = false
|
||
|
|
|
||
|
|
self.transmogLocation = TransmogUtil.GetTransmogLocation('HEADSLOT', Enum.TransmogType.Appearance, Enum.TransmogModification.Main)
|
||
|
|
|
||
|
|
self.allAppearances = {}
|
||
|
|
self.transmogSlots = {}
|
||
|
|
for categoryID = 1, 29 do
|
||
|
|
local slot = CollectionWardrobeUtil.GetSlotFromCategoryID(categoryID)
|
||
|
|
if slot ~= nil then
|
||
|
|
self.transmogSlots[categoryID] = slot
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
self:RegisterEvent('TRANSMOGRIFY_OPEN')
|
||
|
|
self:RegisterEvent('TRANSMOGRIFY_CLOSE')
|
||
|
|
|
||
|
|
self:RegisterBucketEvent(
|
||
|
|
{
|
||
|
|
'TRANSMOG_COLLECTION_SOURCE_ADDED',
|
||
|
|
'TRANSMOG_COLLECTION_SOURCE_REMOVED',
|
||
|
|
'TRANSMOG_COLLECTION_UPDATED',
|
||
|
|
},
|
||
|
|
2,
|
||
|
|
'UpdateTransmog'
|
||
|
|
)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:OnEnteringWorld()
|
||
|
|
self:UpdateTransmog()
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:TRANSMOGRIFY_OPEN()
|
||
|
|
self.isOpen = true
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:TRANSMOGRIFY_CLOSE()
|
||
|
|
self.isOpen = false
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:UpdateTransmog()
|
||
|
|
if self.isScanning then return end
|
||
|
|
|
||
|
|
Addon.charData.scanTimes["transmog"] = time()
|
||
|
|
self.isScanning = true
|
||
|
|
|
||
|
|
self.transmog = {}
|
||
|
|
|
||
|
|
-- Save current settings to reset later
|
||
|
|
self.oldSettings = {}
|
||
|
|
self.oldSettings.showCollected = C_TransmogCollection.GetCollectedShown()
|
||
|
|
self.oldSettings.showUncollected = C_TransmogCollection.GetUncollectedShown()
|
||
|
|
|
||
|
|
self.oldSettings.sourceTypes = {}
|
||
|
|
for index = 1, 6 do
|
||
|
|
self.oldSettings.sourceTypes[index] = C_TransmogCollection.IsSourceTypeFilterChecked(index)
|
||
|
|
end
|
||
|
|
|
||
|
|
if self.isOpen == false then
|
||
|
|
C_TransmogCollection.SetAllCollectionTypeFilters(true)
|
||
|
|
C_TransmogCollection.SetAllSourceTypeFilters(true)
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Run this in a timer so that the filter changes take effect
|
||
|
|
C_Timer.After(0, function() self:ScanInitialize() end)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:ScanInitialize()
|
||
|
|
-- Manual checks for buggy appearances
|
||
|
|
for _, manualTransmog in ipairs(self.db.manual) do
|
||
|
|
local have = C_TransmogCollection.PlayerHasTransmog(manualTransmog.itemId, manualTransmog.modifierId)
|
||
|
|
if have then
|
||
|
|
self.transmog[manualTransmog.appearanceId] = true
|
||
|
|
|
||
|
|
local sourceKey = string.format("%d_%d", manualTransmog.itemId, manualTransmog.modifierId)
|
||
|
|
WWTCSaved.transmogSourcesV2[sourceKey] = true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Load all appearance categories into chunks of 100 appearances
|
||
|
|
self.allAppearances = { {} }
|
||
|
|
|
||
|
|
local workload = { }
|
||
|
|
for categoryID, _ in pairs(self.transmogSlots) do
|
||
|
|
table.insert(workload, function()
|
||
|
|
local appearances = C_TransmogCollection_GetCategoryAppearances(categoryID, self.transmogLocation)
|
||
|
|
local currentTable = self.allAppearances[#self.allAppearances]
|
||
|
|
for _, appearance in ipairs(appearances) do
|
||
|
|
table.insert(currentTable, appearance)
|
||
|
|
if #currentTable == 100 then
|
||
|
|
currentTable = {}
|
||
|
|
table.insert(self.allAppearances, currentTable)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
Addon:BatchWork(workload, function() Module:ScanBegin() end)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:ScanBegin()
|
||
|
|
local workload = {}
|
||
|
|
|
||
|
|
-- Scan all appearances
|
||
|
|
for _, chunk in ipairs(self.allAppearances) do
|
||
|
|
table.insert(workload, function()
|
||
|
|
-- local startTime = debugprofilestop()
|
||
|
|
for _, appearance in ipairs(chunk) do
|
||
|
|
if appearance.isCollected then
|
||
|
|
local visualId = appearance.visualID
|
||
|
|
self.transmog[visualId] = true
|
||
|
|
|
||
|
|
local sources = C_TransmogCollection_GetAppearanceSources(visualId) --, categoryID, self.transmogLocation)
|
||
|
|
for _, source in ipairs(sources or {}) do
|
||
|
|
if source.isCollected then
|
||
|
|
local sourceKey = string.format("%d_%d", source.itemID, source.itemModID)
|
||
|
|
WWTCSaved.transmogSourcesV2[sourceKey] = true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-- print('chunk '..(debugprofilestop() - startTime))
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
Addon:BatchWork(workload, function() Module:ScanEnd() end)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Module:ScanEnd()
|
||
|
|
local keys = Addon:TableKeys(self.transmog)
|
||
|
|
Addon.charData.transmog = table.concat(keys, ':')
|
||
|
|
|
||
|
|
self.isScanning = false
|
||
|
|
self.transmog = {}
|
||
|
|
|
||
|
|
-- Reset settings
|
||
|
|
if self.isOpen == false then
|
||
|
|
C_TransmogCollection.SetCollectedShown(self.oldSettings.showCollected)
|
||
|
|
C_TransmogCollection.SetUncollectedShown(self.oldSettings.showUncollected)
|
||
|
|
for index = 1, 6 do
|
||
|
|
C_TransmogCollection.SetSourceTypeFilter(index, self.oldSettings.sourceTypes[index])
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|