local DEBUG = function() end -- d local function _tr(str) return str end if not InventoryManager then InventoryManager = {} end local IM = InventoryManager local _waitforpanel = nil local at2tradeskill = { [ARMORTYPE_HEAVY] = CRAFTING_TYPE_BLACKSMITHING, [ARMORTYPE_MEDIUM] = CRAFTING_TYPE_CLOTHIER, [ARMORTYPE_LIGHT] = CRAFTING_TYPE_CLOTHIER, } local wt2tradeskill = { [WEAPONTYPE_AXE] = CRAFTING_TYPE_BLACKSMITHING, [WEAPONTYPE_BOW] = CRAFTING_TYPE_WOODWORKING, [WEAPONTYPE_DAGGER] = CRAFTING_TYPE_BLACKSMITHING, [WEAPONTYPE_FIRE_STAFF] = CRAFTING_TYPE_WOODWORKING, [WEAPONTYPE_FROST_STAFF] = CRAFTING_TYPE_WOODWORKING, [WEAPONTYPE_HAMMER] = CRAFTING_TYPE_BLACKSMITHING, [WEAPONTYPE_HEALING_STAFF] = CRAFTING_TYPE_WOODWORKING, [WEAPONTYPE_LIGHTNING_STAFF] = CRAFTING_TYPE_WOODWORKING, [WEAPONTYPE_SHIELD] = CRAFTING_TYPE_WOODWORKING, [WEAPONTYPE_SWORD] = CRAFTING_TYPE_BLACKSMITHING, [WEAPONTYPE_TWO_HANDED_AXE] = CRAFTING_TYPE_BLACKSMITHING, [WEAPONTYPE_TWO_HANDED_HAMMER] = CRAFTING_TYPE_BLACKSMITHING, [WEAPONTYPE_TWO_HANDED_SWORD] = CRAFTING_TYPE_BLACKSMITHING, } local jt2tradeskill = { [EQUIP_TYPE_RING] = CRAFTING_TYPE_JEWELRYCRAFTING, [EQUIP_TYPE_NECK] = CRAFTING_TYPE_JEWELRYCRAFTING, } local it2tradeskill = { [ITEMTYPE_GLYPH_ARMOR] = CRAFTING_TYPE_ENCHANTING, [ITEMTYPE_GLYPH_WEAPON] = CRAFTING_TYPE_ENCHANTING, [ITEMTYPE_GLYPH_JEWELRY] = CRAFTING_TYPE_ENCHANTING, [ITEMTYPE_ARMOR] = { ["equipType"] = jt2tradeskill, ["armorType"] = at2tradeskill }, [ITEMTYPE_WEAPON] = { ["weaponType"] = wt2tradeskill }, } local dt2tradeskill = { ["itemType"] = it2tradeskill } -- Recurse through the decision tree to get the correct tradeskill for the item local function GetItemTradeSkill(data, _used_table) if not _used_table then _used_table = dt2tradeskill end for _key, _tab in pairs(_used_table) do local entry = _tab[data[_key]] -- Recurse if we see a table with more decision criteria if entry and type(entry) == "table" then return GetItemTradeSkill(data, entry) end -- Return if we find a plain value at a leaf if entry then DEBUG("Found!", entry) return entry end end return nil end local function GetTradeskillUsed() if not ZO_EnchantingTopLevelExtractionSlotContainer:IsHidden() then return CRAFTING_TYPE_ENCHANTING elseif not ZO_SmithingTopLevelDeconstructionPanelSlotContainer:IsHidden() then return CRAFTING_TYPE_BLACKSMITHING -- Includes everything else that is not Enchanting end return nil end local function filter_for_deconstruction(tradeskill, data) local ts = GetItemTradeSkill(data) if ts ~= tradeskill then return false end if not CanItemBeDeconstructed(data.bagId, data.slotId, ts) then return false end if IM.FCOISL:IsProtectedAction(data.action, data.bagId, data.slotId, ts == CRAFTING_TYPE_ENCHANTING) then return false end return true end local used_tradeskill = nil IM.actionfunctions[IM.ACTION_DECONSTRUCT] = function(data) if used_tradeskill == CRAFTING_TYPE_ENCHANTING then ExtractEnchantingItem(data.bagId, data.slotId) else ExtractOrRefineSmithingItem(data.bagId, data.slotId) end end local function InitDeconstruction(tradeskill) used_tradeskill = tradeskill IM.currentRuleset:ResetCounters() local list = IM:CreateInventoryList(BAG_BACKPACK, IM.ACTION_DECONSTRUCT, function(data) return filter_for_deconstruction(tradeskill, data) end) list = IM:CreateInventoryList(BAG_BANK, IM.ACTION_DECONSTRUCT, function(data) return filter_for_deconstruction(tradeskill, data) end, list) list = IM:CreateInventoryList(BAG_SUBSCRIBER_BANK, IM.ACTION_DECONSTRUCT, function(data) return filter_for_deconstruction(tradeskill, data) end, list) IM:DoEventProcessing(list, function(data) IM:ProcessSingleItem(false, data) end, function() end, EVENT_CRAFT_COMPLETED, EVENT_END_CRAFTING_STATION_INTERACT, IM.settings.bankMoveDelay) end local function WaitPanel() if GetTradeskillUsed() then InitDeconstruction(_waitforpanel) _waitforpanel = nil end if not _waitforpanel then return end zo_callLater(WaitPanel, 500) end local function OnOpenCraftingStation(eventCode, craftSkill, sameStation) _waitforpanel = craftSkill zo_callLater(WaitPanel, 500) end local function OnCloseCraftingStation(eventCode, craftSkill) _waitforpanel = nil end EVENT_MANAGER:RegisterForEvent(IM.name, EVENT_CRAFTING_STATION_INTERACT, OnOpenCraftingStation) EVENT_MANAGER:RegisterForEvent(IM.name, EVENT_END_CRAFTING_STATION_INTERACT, OnCloseCraftingStation)