local container = CreateFrame("Frame"); local MD = CreateFrame("DressUpModel", "NarciSourceModel", container); MD:SetSize(512, 512); MD:SetPoint("CENTER", UIParent, "CENTER", 100, 0); function MD:Init() self:SetUnit("player"); self:SetFacing(-PI/6) self:SetSheathed(false); self:SetLight(true, false, cos(PI/4)*sin(-PI/4) , cos(PI/4)*cos(-PI/4) , -cos(PI/4), 1, 204/255, 204/255, 204/255, 1, 0.8, 0.8, 0.8); end local visualIDToBestItem = {}; local IS_VALID_INV = { [13] = true, [14] = true, [15] = true, [17] = true, [21] = true, [22] = true, [23] = true, [25] = true, [26] = true, [27] = true, [28] = true, } function MD:TestAllSource() local a = 1; local range = 10000; local e = 180000; local result; local format = string.format; local GetSourceInfo = C_TransmogCollection.GetSourceInfo; local sourceInfo; local invType, categoryID, itemID; local name; local DB = NarciItemDatabaseOutput; print("------------------------------------") local numValid = 0 for sourceID = a, e do --result = self:TryOn(format("item:%d", itemID)); if not DB[sourceID] then result = self:TryOn(sourceID); if result and (result == 0 or result == 1) then DB[sourceID] = true; numValid = numValid + 1 --[[ sourceInfo = GetSourceInfo(sourceID); if sourceInfo then invType = sourceInfo.invType; categoryID = sourceInfo.categoryID; itemID = sourceInfo.itemID if itemID and categoryID and categoryID == 18 then --IS_VALID_INV[invType] categoryID >= 12 name = sourceInfo.name or ""; numValid = numValid + 1 --print(format("sourceID:%d result:%s name:%s", sourceID, result, name)); DB[sourceID] = {itemID, name}; end end --]] end end end print(numValid.." Saved!"); end function MD:FindAllWeapons(index) local DB = NarciItemDatabaseOutput; local format = string.format; local completeSourceIDs = NarciItemDatabase.GetExistSourceID(); local numSources = #completeSourceIDs; local sourceID; local foundID; local result; local numValid = 0; local slice = 400; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; for i = a1, a2 do sourceID = completeSourceIDs[i]; if not sourceID then isComplete = true; break end if not DB[sourceID] then self:Undress(16); self:Undress(17); result = self:TryOn(sourceID); if result then foundID = self:GetSlotTransmogSources(16); if not foundID or foundID == 0 then foundID = self:GetSlotTransmogSources(17); end if foundID == sourceID and foundID ~= 0 then DB[sourceID] = true; numValid = numValid + 1; end end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end local AllWeaponsInCategory; --[[ function MD:FindValidForDressUpModel(index) if not AllWeaponsInCategory then AllWeaponsInCategory = NarciItemDatabase.GetFlatList(); end local DB = NarciItemDatabaseOutput; local numSources = #AllWeaponsInCategory; local itemID, weaponID, itemString; local result1, result2; local numValid = 0; local slice = 400; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; for i = a1, a2 do if not AllWeaponsInCategory[i] then isComplete = true; break end if type(AllWeaponsInCategory[i]) == "table" then itemID = AllWeaponsInCategory[i][1]; weaponID = AllWeaponsInCategory[i][3]; --sourceID else itemID = AllWeaponsInCategory[i]; end if not DB[itemID] then self:Undress(16); self:Undress(17); itemString = "item:" .. itemID; result1 = self:TryOn(itemString); if result1 and (result1 == 0 or result1 == 1) then --success or wrong race numValid = numValid + 1; DB[itemID] = true; end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end --]] function MD:FindValidForDressUpModel(index) if not AllWeaponsInCategory then AllWeaponsInCategory = NarciItemDatabase.HoldableItems; end local DB = NarciItemDatabaseOutput; local numSources = #AllWeaponsInCategory; local itemID, weaponID, itemString; local result1, result2; local numValid = 0; local slice = 400; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; for i = a1, a2 do if not AllWeaponsInCategory[i] then isComplete = true; break end itemID = AllWeaponsInCategory[i][3]; if not DB[itemID] then self:Undress(16); self:Undress(17); itemString = "item:" .. itemID; result1 = self:TryOn(itemString); if result1 and (result1 == 0 or result1 == 1) then --success or wrong race numValid = numValid + 1; DB[itemID] = true; end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end local autoRun = CreateFrame("Frame"); autoRun:Hide(); autoRun:SetScript("OnUpdate", function(self, elapsed) self.t = self.t + elapsed; if self.t > 0.1 then self.t = 0; local isComplete = MD:FindValidForDressUpModel(self.index); --FindItemInfo, FindAllWeapons, FindItemSourceInfo, FindItemVisualInfo, FindBestItemForEachVisual, FindValidForDressUpModel if isComplete then self:Reset(); return end self.loopTime = self.loopTime + 1; if self.loopTime >= 3 then self.loopTime = 0; self.index = self.index + 1; end end end); function autoRun:Reset() self:Hide(); self.t = 2; self.index = 0; self.loopTime = 0; end function ProcessWeaponSourceID() MD:Init(); C_Timer.After(0.5, function() autoRun:Reset(); autoRun:Show(); end) end local IsWeaponProcessed = {}; function MD:FindItemInfo(index) local DB = NarciItemDatabaseOutput; local GetSourceInfo = C_TransmogCollection.GetSourceInfo; local completeSourceIDs = NarciItemDatabase.GetValidSourceID(); local numSources = #completeSourceIDs; local sourceID; local sourceInfo; local numValid = 0; local name, itemID, itemModID; local slice = 200; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; for i = a1, a2 do sourceID = completeSourceIDs[i]; if not sourceID then isComplete = true; break; end if not DB[sourceID] then sourceInfo = GetSourceInfo(sourceID); if sourceInfo and sourceInfo.name then name = sourceInfo.name; itemID = sourceInfo.itemID; itemModID = sourceInfo.itemModID; DB[sourceID] = {name, itemID, itemModID}; numValid = numValid + 1; end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end function MD:FindItemSourceInfo(index) local DB = NarciItemDatabaseOutput; local GetSourceID = NarciItemDatabase.GetSourceID; local GetSourceInfo = C_TransmogCollection.GetSourceInfo; if not self.completeItems then self.completeItems = NarciItemDatabase.GetFlatList(); end local completeItems = self.completeItems; local numSources = #completeItems; local sourceID; local sourceInfo; local numValid = 0; local name, itemID, itemModID, categoryID, visualID; local slice = 200; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; for i = a1, a2 do itemID = completeItems[i]; sourceID = GetSourceID(itemID); if i > numSources then isComplete = true; break; end if not DB[itemID] then sourceInfo = GetSourceInfo(sourceID); if sourceInfo and sourceInfo.categoryID then categoryID = sourceInfo.categoryID; itemModID = sourceInfo.itemModID; DB[itemID] = categoryID; numValid = numValid + 1; end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end function MD:FindItemVisualInfo(index) local DB = NarciItemDatabaseOutput; local GetSourceID = NarciItemDatabase.GetSourceID; local GetSourceInfo = C_TransmogCollection.GetSourceInfo; if not self.completeItems then self.completeItems = NarciItemDatabase.GetFlatList(); end local completeItems = self.completeItems; local numSources = #completeItems; local sourceID; local sourceInfo; local numValid = 0; local name, itemID, itemModID, categoryID, visualID; local slice = 200; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; local visualItem = {}; for i = a1, a2 do itemID = completeItems[i]; sourceID = GetSourceID(itemID); if i > numSources then isComplete = true; break; end if sourceID ~= 0 and not DB[itemID] then sourceInfo = GetSourceInfo(sourceID); if sourceInfo and sourceInfo.visualID then visualID = sourceInfo.visualID; DB[itemID] = visualID; numValid = numValid + 1; end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end function MD:FindBestItemForEachVisual(index) local GetItemInfo = GetItemInfo; local GetTransmogItemInfo = C_TransmogCollection.GetItemInfo; local holdables = NarciItemDatabase.HoldableItems; local numSources = #holdables; local numValid = 0; local name, itemID, itemModID, categoryID, visualID, sourceID; local slice = 100; local numSlices = math.ceil(numSources/slice); local a1, a2 = index*slice + 1, (index + 1)*slice; local isComplete = false; local DB = NarciItemDatabaseOutput; for i = a1, a2 do if i > numSources then isComplete = true; break; end sourceID = holdables[i][1] visualID = holdables[i][2]; itemID = holdables[i][3]; itemModID = holdables[i][4]; if visualID > 0 then if DB[visualID] then if GetTransmogItemInfo(itemID, itemModID) then if itemModID == 0 or itemModID == 153 then DB[visualID] = itemID; else DB[visualID] = {itemID, itemModID, sourceID}; end numValid = numValid + 1; end else --self.visualItem[visualID] = itemID; if itemModID == 0 or itemModID == 153 then DB[visualID] = itemID; else DB[visualID] = {itemID, itemModID, sourceID}; end numValid = numValid + 1; end end end print(a1.."-"..a2.." of "..numSources.." Slice: "..index.."/"..numSlices.." "..numValid.." Saved!"); return isComplete end function IsItemLogged(itemID) local list = NarciItemDatabase.GetFlatList(); for i = 1, #list do if list[i] == itemID then print("Found: "..itemID) return end end print("Failed: "..itemID) end function FindConflict() local GetItemInfo = C_TransmogCollection.GetItemInfo; local DB = NarciItemDatabase.weaponSources; local appearanceID, itemID, modID; local output = {}; local temp = {}; local total = 0; for sourceID, info in pairs(DB) do itemID = info[2]; modID = info[3] or 0; appearanceID = GetItemInfo(itemID, modID); if not appearanceID then --print(info[1]) total = total + 1; temp[total] = sourceID; end --[[ total = total + 1; temp[total] = sourceID; --]] end table.sort(temp, function(a, b) return a > b end) local sourceID; for i = 1, total do sourceID = temp[i]; output[i] = {sourceID, unpack(DB[sourceID])}; end NarciItemDatabaseOutput = output; print("numConflict: "..total) end function SortDB() local output = {}; local numItem = 0; for itemID, _ in pairs(NarciItemDatabaseOutput) do numItem = numItem + 1; output[numItem] = itemID; end table.sort(output, function(a, b) return a < b end) NarciItemDatabaseOutput = output; end function GetOneItemIDForEachAppearanceID() local visualItem = NarciItemDatabase.appearanceItems local numItems = 0; local list = {}; for visualID, itemID in pairs(visualItem) do numItems = numItems + 1; list[numItems] = itemID; end NarciItemDatabaseOutput = list; print("Complete! NumItems: "..numItems); end function GetItemsWithModID() local loggedItems = NarciItemDatabase.appearanceItems local allVisuals = NarciItemDatabase.appearanceIDxItemMod local IS_VISUAL_LOGGED = {}; local list = {}; for visualID, itemID in pairs(loggedItems) do IS_VISUAL_LOGGED[visualID] = true; end local numUnlogged = 0; for visualID, data in pairs(allVisuals) do if not IS_VISUAL_LOGGED[visualID] then IS_VISUAL_LOGGED[visualID] = true; numUnlogged = numUnlogged + 1; list[numUnlogged] = data; end end print("Complete! NumUnloggedItems: "..numUnlogged); NarciItemDatabaseOutput = list; end function InsertModifiedItemIntoCategory() local orignalList = NarciItemDatabase.subclassItems; local extraList = NarciItemDatabase.itemVariations; local itemID, modID, sourceID; local itemMods = {}; local data; for i = 1, #extraList do data = extraList[i]; itemID = data[1]; modID = data[2]; sourceID = data[3]; if not itemMods[itemID] then itemMods[itemID] = {}; end tinsert(itemMods[itemID], {modID, sourceID}); end local mods = {}; local dataSize = 0; for subclassID, data in pairs(orignalList) do dataSize = #data; for i = 1, dataSize do itemID = data[i]; mods = itemMods[itemID]; if mods then table.sort(mods, function(a, b) return a[1] > b[1] end) local spot = i + 1; for j = 1, #mods do table.insert(orignalList[subclassID], spot, {itemID, unpack(mods[j]) } ); i = i + 1; dataSize = dataSize + 1; end end end end NarciItemDatabaseOutput = orignalList; end function BuildItemIDToVariation() local list = NarciItemDatabase.itemVariations; local newList = {}; local itemID; for i = 1, #list do itemID = list[i][1]; if not newList[itemID] then newList[itemID] = {}; end tinsert(newList[itemID], {list[i][2], list[i][3]}); end for itemID, data in pairs(newList) do table.sort(data, function(a, b) return a[1] < b[1]; end); end NarciItemDatabaseOutput = newList; end --[[ /run NarciSourceModel:Init(); /run NarciSourceModel:TestSource(); /run NarciSourceModel:FindAllWeapons() /dump NarciSourceModel:GetSlotTransmogSources(17) ItemTryOnReason = { Success = 0, WrongRace = 1, NotEquippable = 2, DataPending = 3, }, --]]