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.

170 lines
5.5 KiB

local addonName, addon = ...
addon = LibStub("AceAddon-3.0"):GetAddon(addonName)
local L = LibStub("AceLocale-3.0"):GetLocale(addonName)
local IgnoredSlots = {}
local AppearanceList
BW_RandomizeButtonMixin = {}
function BW_RandomizeButtonMixin:OnEnter()
GameTooltip:ClearAllPoints()
GameTooltip:SetPoint("BOTTOM", self, "TOP", 0, 0)
GameTooltip:SetOwner(self, "ANCHOR_PRESERVE")
GameTooltip:SetText(L["Click: Randomize Items"].."\n"..L["Shift Click: Randomize Outfit"])
end
function BW_RandomizeButtonMixin:OnMouseDown()
if IsModifierKeyDown() then
self:Randomize("outfit")
else
self:BuildAppearanceList()
self:Randomize()
end
end
local finalselection = {}
--Updates the model after all items has been selected so model and pending looks match
local function finalUpdate()
for slotID, mog in pairs(finalselection)do
local transmogLocation = TransmogUtil.GetTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, mog);
C_Transmog.SetPending(transmogLocation, pendingInfo);
finalselection[slotID] = nil
end
end
function BW_RandomizeButtonMixin:OnMouseUp()
self.Stop = true
C_Timer.After(1.8, function() finalUpdate() end)
end
local function AddSlotAppearances(slotID, categoryID, transmogLocation)
if not transmogLocation then return end
for _, appearance in ipairs(C_TransmogCollection.GetCategoryAppearances(categoryID, transmogLocation)) do
if appearance.isUsable and appearance.isCollected then
tinsert(AppearanceList[slotID], appearance.visualID)
end
end
end
local update = false
function BW_RandomizeButtonMixin:BuildAppearanceList()
if not update and AppearanceList then return end
AppearanceList = (AppearanceList and wipe(AppearanceList)) or {}
for i, slotInfo in pairs(TRANSMOG_SLOTS) do
local slot = slotInfo.slotID
local slotID = slotInfo.location:GetSlotID()
local transmogLocation = TransmogUtil.GetTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
AppearanceList[slotID] = AppearanceList[slotID] or {}
local _, _, _, canTransmogrify, cannotTransmogrifyReason, _ = C_Transmog.GetSlotInfo(transmogLocation)
if canTransmogrify or cannotTransmogrifyReason == 0 then
local sourceID = C_Transmog.GetSlotVisualInfo(transmogLocation)
local categoryID = slotInfo.armorCategoryID or C_TransmogCollection.GetAppearanceSourceInfo(sourceID)
AddSlotAppearances(slotID, categoryID, transmogLocation)
for weaponCategoryID = FIRST_TRANSMOG_COLLECTION_WEAPON_TYPE, LAST_TRANSMOG_COLLECTION_WEAPON_TYPE do
local name, isWeapon, _, canMainHand, canOffHand = C_TransmogCollection.GetCategoryInfo(weaponCategoryID)
if name and isWeapon and weaponCategoryID ~= categoryID then
if (slotInfo.location:IsMainHand() and canMainHand) or (slotInfo.location:IsOffHand() and canOffHand) then --todo either hand
local equippedItemID = GetInventoryItemID('player', GetInventorySlotInfo(slotInfo.location:GetSlotName()))
if C_TransmogCollection.IsCategoryValidForItem(weaponCategoryID, equippedItemID) then
AddSlotAppearances(slotID, weaponCategoryID)
end
end
end
end
end
end
end
local function RandomizeBySlot(slotID)
local slotVisualList = AppearanceList[slotID]
if not slotVisualList then return end
if #slotVisualList > 0 then
local appearanceID = slotVisualList[random(#slotVisualList)]
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(appearanceID)
local sourceList = appearanceID and itemLink and C_TransmogCollection.GetAppearanceSources(appearanceID, addon.GetItemCategory(appearanceID), addon.GetTransmogLocation(itemLink))
if sourceList then
for _, source in pairs(sourceList) do
if source.isCollected then
local transmogLocation = TransmogUtil.GetTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, source.sourceID);
C_Transmog.SetPending(transmogLocation, pendingInfo);
finalselection[slotID] = source.sourceID
break
end
end
end
end
end
local function RandomizeAllSlots()
for slotID, _ in pairs(AppearanceList) do
if not IgnoredSlots[slotID] then
RandomizeBySlot(slotID)
end
end
end
local function RandomizeOutfit()
local outfits = addon.GetOutfits()
local randomOutfitID = outfits[random(#outfits)].outfitID
BetterWardrobeOutfitDropDown:SelectOutfit(randomOutfitID, true)
end
local throttleValue = 0.1
local currentThrottle = throttleValue
local totalTime = 0
local function RandomizeOnUpdate(self, elapsed)
totalTime = totalTime + elapsed
if totalTime >= throttleValue then
self.RunRandom(self.Slot)
if self.Stop then
currentThrottle = currentThrottle * 1.5
if currentThrottle >= 0.5 then
self:SetScript('OnUpdate', nil)
end
end
totalTime = 0
end
end
function BW_RandomizeButtonMixin:Randomize(type)
totalTime = 0
currentThrottle = throttleValue
self.Stop = false
self:SetScript('OnUpdate', RandomizeOnUpdate)
if type == "item" then
self.Slot = slotID
RandomizeBySlot(slotID)
self.RunRandom = RandomizeBySlot(slotID)
elseif type == "outfit" then
RandomizeOutfit()
self.RunRandom = RandomizeOutfit
else
RandomizeAllSlots()
self.RunRandom = RandomizeAllSlots
end
end