local debug = false if not WeakAurasSaved then WeakAurasSaved = {} end if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end if not WeakAurasSaved.Cyka.ItemCache then WeakAurasSaved.Cyka.ItemCache = {} end ---@param slot number ---@return string local function getItemLink(slot) if slot == nil then return "" end return GetLootSlotLink(slot) end ---@param slot number ---@return string local function getItemName(slot) if slot == nil then return "" end return select(2, GetLootSlotInfo(slot)) end ---@param slot number ---@return string local function getItemType(slot) if slot == nil then return "" end local itemLink = getItemLink(slot) return select(6, GetItemInfo(itemLink)) end ---@param slot number ---@return string local function getItemSubtype(slot) if slot == nil then return "" end local itemLink = getItemLink(slot) return select(7, GetItemInfo(itemLink)) end ---@param slot number ---@return number local function getItemLevel(slot) if slot == nil then return 0 end local itemLink = getItemLink(slot) return select(4, GetItemInfo(itemLink)) end ---The vendor price in copper, or 0 for items that cannot be sold ---@param slot number ---@return number local function getItemValue(slot) if slot == nil then return 0 end local itemLink = getItemLink(slot) return select(11, GetItemInfo(itemLink)) end ---@param slot number ---@return number local function getItemQuantity(slot) if slot == nil then return 0 end return select(3, GetLootSlotInfo(slot)) end ---@param slot number ---@return Enum.ItemQuality local function getItemQuality(slot) if slot == nil then return Enum.ItemQuality.Poor end local itemLink = getItemLink(slot) return select(3, GetItemInfo(itemLink)) end ---@param slot number ---@return string local function getItemEquipLocation(slot) if slot == nil then return "" end local itemLink = getItemLink(slot) return select(9, GetItemInfo(itemLink)) end ---@param slot number ---@return number local function getItemIcon(slot) if slot == nil then return 0 end local itemLink = getItemLink(slot) return select(10, GetItemInfo(itemLink)) end ---@param slot number ---@return number local function getBindType(slot) if slot == nil then return 0 end local itemLink = getItemLink(slot) return select(14, GetItemInfo(itemLink)) end ---@param slot number ---@return nil local doLoot = function(slot) LootSlot(slot) local itemIcon = getItemIcon(slot) or 134400 local itemName = getItemName(slot) or "Unknown" itemName = itemName:gsub("\n", ", ") local itemQuality = getItemQuality(slot) or 0 if not WeakAurasSaved.Cyka.ItemCache[itemName] then WeakAurasSaved.Cyka.ItemCache[itemName] = { icon = itemIcon, quality = itemQuality, } end end ---@class Filter ---@field enabled boolean ---@field requires table | nil ---@field filter fun(slot: number, provided: table): boolean Filter = { ---@param enabled boolean ---@param requires table | nil ---@param filter fun(slot: number, provided: table): boolean ---@return Filter new = function(enabled, requires, filter) local self = setmetatable({}, { __index = Filter }) self.enabled = enabled self.requires = requires self.filter = filter return self end, ---@param self Filter ---@param slot number ---@return boolean Run = function(self, slot) ---@type table local provided = {} if self.requires then for k, v in pairs(self.requires) do provided[k] = v(slot) end end return self.filter(slot, provided) end } local goldFilter = Filter.new(true, { ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Gold") or string.find(provided.name, "Silver") or string.find(provided.name, "Copper") then return true end return false end) local orderResourcesFilter = Filter.new(true, { ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Order Resources") then return true end return false end) local mountFilter = Filter.new(true, { ["type"] = getItemType }, function(slot, provided) ---@cast provided { type: string } if provided.type == "Mount" then return true end return false end) local ilvlFilter = Filter.new(true, { ["ilvl"] = getItemLevel }, function(slot, provided) ---@cast provided { ilvl: number } if provided.ilvl and provided.ilvl > 800 then return true end return false end) local professionFilter = Filter.new(true, { ["type"] = getItemType, ["subtype"] = getItemSubtype }, function(slot, provided) ---@cast provided { type: string, subtype: string } local enabled = { ["Herb"] = true, ["Leather"] = true, ["Cloth"] = true, ["Ore"] = false, ["Cooking"] = true, ["Inscription"] = true, ["Enchanting"] = true, } if provided.type == "Tradeskill" then if enabled[provided.subtype] then return true end end return false end) local valueFilter = Filter.new(true, { ["value"] = getItemValue, ["quantity"] = getItemQuality }, function(slot, provided) ---@cast provided { value: number, quantity: number } local valueThreshold = 35 * 100 * 100 local applyValueTostack = false local value = provided.value if applyValueTostack then value = value * provided.quantity end if value > valueThreshold then return true end return false end) local greyValueFilter = Filter.new(true, { ["quality"] = getItemQuality, ["value"] = getItemValue, ["quantity"] = getItemQuantity }, function(slot, provided) ---@cast provided { quality: number, value: number, quantity: number } local valueThreshold = 4 * 100 * 100 local applyValueTostack = false if provided.quality == 0 then local value = provided.value if applyValueTostack then value = value * provided.quantity end if value > valueThreshold then return true end end return false end) local questItemFilter = Filter.new(true, { ["type"] = getItemType, ["subtype"] = getItemSubtype }, function(slot, provided) ---@cast provided { type: string, subtype: string } if provided.type == "Quest" and provided.subtype == "Quest" then return true end return false end) local classGearFilter = Filter.new(true, { ["ilvl"] = getItemLevel, ["quality"] = getItemQuality, ["type"] = getItemType, ["subtype"] = getItemSubtype, ["equiploc"] = getItemEquipLocation }, function(slot, provided) ---@cast provided { ilvl: number, quality: number, type: string, subtype: string, equiploc: string } local ilvlThreshold = 800 local qualityThreshold = 2 local isEquippable = aura_env.skills[select(3, UnitClass("player"))][provided.subtype] == 1 if isEquippable and provided.ilvl > ilvlThreshold and provided.quality > qualityThreshold then return true end return false end) local arguniteFilter = Filter.new(true, { ["name"] = getItemName, ["quality"] = getItemQuality }, function(slot, provided) ---@cast provided { name: string, quality: number } if string.find(provided.name, "Argunite") and provided.quality > 1 then return true end return false end) local ancientManaFilter = Filter.new(true, { ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Ancient Mana") then return true end return false end) local reicpeFilter = Filter.new(false, { ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Recipe") or string.find(provided.name, "Technique") then return true end return false end) local bloodOfSargerasFilter = Filter.new(true, { ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if provided.name == "Blood of Sargeras" then return true end return false end) local bloodhunerQuarryFilter = Filter.new(true, { ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if provided.name == "Bloodhunter's Quarry" then return true end return false end) local boeFilter = Filter.new(true, { ["ilvl"] = getItemLevel, ["type"] = getItemType, ["quality"] = getItemQuality, ["equiploc"] = getItemEquipLocation, ["bindtype"] = getBindType }, function(slot, provided) ---@cast provided { ilvl: number, type: string, quality: number, equiploc: string, bindtype: number } local ilvlThreshold = 800 local qualityThreshold = 1 local itemType = provided.type local itemEquipLoc = provided.equiploc if (itemType == "Armor" or itemType == "Weapon" or itemEquipLoc == "INVTYPE_FINGER" or itemEquipLoc == "INVTYPE_TRINKET" or itemEquipLoc == "INVTYPE_CLOAK" or itemEquipLoc == "INVTYPE_NECK") then local itemLevel = provided.ilvl local itemQuality = provided.quality local bindType = provided.bindtype if itemLevel > ilvlThreshold and itemQuality > qualityThreshold and bindType == 1 then return true end end return false end) -- local azeriteFilter = { -- enabled = true, -- ilvlThreshold = 800, -- qualityThreshold = 2, -- filter = function(self, slot) -- if self.enabled the -- local itemType = getItemType(slot) -- local itemSubtype = getItemSubtype(slot) -- local itemQuality = getItemQuality(slot) -- if itemType and itemSubtype and itemQuality and itemType == "Consumable" and itemSubtype == "Other" and itemQuality > 1 the -- return true -- en -- tostring(itemType) .. " " .. tostring(itemSubtype) .. " " .. tostring(itemQuality)) -- end -- end -- } ---@type table local filters = { goldFilter, orderResourcesFilter, mountFilter, ilvlFilter, professionFilter, valueFilter, greyValueFilter, questItemFilter, classGearFilter, arguniteFilter, ancientManaFilter, reicpeFilter, bloodOfSargerasFilter, boeFilter, bloodhunerQuarryFilter, } ---@class FilterService aura_env.FilterService = { ---@param lootInfo table Run = function(lootInfo) ---@type table local slotsToLoot = {} for slot, item in pairs(lootInfo) do for _, filter in pairs(filters) do if filter:Run(slot) then slotsToLoot[#slotsToLoot + 1] = slot break end end end aura_env.FilterService.doLoot(slotsToLoot) end, doLoot = function(slots) for i = #slots, 1, -1 do doLoot(slots[i]) end end } aura_env.skills = { --Warrior [1] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 0, ["Mail"] = 0, ["Plate"] = 1, ["Shields"] = 1, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 1, ["Bows"] = 1, ["Guns"] = 1, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 1, ["Polearms"] = 1, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 1, ["Warglaives"] = 1, ["Staves"] = 1, ["Fist Weapons"] = 1, ["Daggers"] = 1, ["Crossbows"] = 1, ["Wands"] = 0, }, --Paladin [2] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 0, ["Mail"] = 0, ["Plate"] = 1, ["Shields"] = 1, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 1, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 1, ["Polearms"] = 1, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 1, ["Warglaives"] = 0, ["Staves"] = 0, ["Fist Weapons"] = 0, ["Daggers"] = 0, ["Crossbows"] = 0, ["Wands"] = 0, }, --Hunter [3] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 0, ["Mail"] = 1, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 1, ["Bows"] = 1, ["Guns"] = 1, ["One-Handed Maces"] = 0, ["Two-Handed Maces"] = 0, ["Polearms"] = 1, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 1, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 1, ["Daggers"] = 1, ["Crossbows"] = 1, ["Wands"] = 0, }, --Rogue [4] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 1, ["Mail"] = 0, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 0, ["Polearms"] = 0, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 0, ["Fist Weapons"] = 1, ["Daggers"] = 1, ["Crossbows"] = 0, ["Wands"] = 0, }, --Priest [5] = { --Armor Skills ["Cloth"] = 1, ["Leather"] = 0, ["Mail"] = 0, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 0, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 0, ["Polearms"] = 0, ["One-Handed Swords"] = 0, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 0, ["Daggers"] = 1, ["Crossbows"] = 0, ["Wands"] = 1, }, --Death Knight [6] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 0, ["Mail"] = 0, ["Plate"] = 1, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 1, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 1, ["Polearms"] = 1, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 1, ["Warglaives"] = 0, ["Staves"] = 0, ["Fist Weapons"] = 0, ["Daggers"] = 0, ["Crossbows"] = 0, ["Wands"] = 0, }, --Shaman [7] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 0, ["Mail"] = 1, ["Plate"] = 0, ["Shields"] = 1, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 0, ["Polearms"] = 0, ["One-Handed Swords"] = 0, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 1, ["Daggers"] = 1, ["Crossbows"] = 0, ["Wands"] = 0, }, --Mage [8] = { --Armor Skills ["Cloth"] = 1, ["Leather"] = 0, ["Mail"] = 0, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 0, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 0, ["Two-Handed Maces"] = 0, ["Polearms"] = 0, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 0, ["Daggers"] = 1, ["Crossbows"] = 0, ["Wands"] = 1, }, --Warlock [9] = { --Armor Skills ["Cloth"] = 1, ["Leather"] = 0, ["Mail"] = 0, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 0, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 0, ["Two-Handed Maces"] = 0, ["Polearms"] = 0, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 0, ["Daggers"] = 1, ["Crossbows"] = 0, ["Wands"] = 1, }, --Monk [10] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 1, ["Mail"] = 0, ["Plate"] = 1, ["Shields"] = 1, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 0, ["Polearms"] = 1, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 1, ["Daggers"] = 0, ["Crossbows"] = 0, ["Wands"] = 0, }, --Druid [11] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 1, ["Mail"] = 0, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 0, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 1, ["Two-Handed Maces"] = 0, ["Polearms"] = 1, ["One-Handed Swords"] = 0, ["Two-Handed Swords"] = 0, ["Warglaives"] = 0, ["Staves"] = 1, ["Fist Weapons"] = 1, ["Daggers"] = 1, ["Crossbows"] = 0, ["Wands"] = 0, }, --Demon Hunter [12] = { --Armor Skills ["Cloth"] = 0, ["Leather"] = 1, ["Mail"] = 0, ["Plate"] = 0, ["Shields"] = 0, --Weapon Skills ["One-Handed Axes"] = 1, ["Two-Handed Axes"] = 0, ["Bows"] = 0, ["Guns"] = 0, ["One-Handed Maces"] = 0, ["Two-Handed Maces"] = 0, ["Polearms"] = 0, ["One-Handed Swords"] = 1, ["Two-Handed Swords"] = 0, ["Warglaives"] = 1, ["Staves"] = 0, ["Fist Weapons"] = 1, ["Daggers"] = 0, ["Crossbows"] = 0, ["Wands"] = 0, }, } aura_env.qualityColors = { "\124cff9d9d9d", -- Poor "\124cffffffff", -- Common "\124cff1eff00", -- Uncommon "\124cff0070dd", -- Rare "\124cffa335ee", -- Epic "\124cffff8000", -- Legendary "\124cffe6cc80", -- Artifact "\124cff00ccff", -- Heirloom }