From 28a3b9b0b0fd4fa51054fc9db00891ad18ef7ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Majdand=C5=BEi=C4=87?= Date: Mon, 4 Mar 2024 09:39:57 +0100 Subject: [PATCH] More fixes and small reworks --- LegionWA/AutoLoot/Init.lua | 151 ++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 88 deletions(-) diff --git a/LegionWA/AutoLoot/Init.lua b/LegionWA/AutoLoot/Init.lua index 7f193be..4d95c51 100644 --- a/LegionWA/AutoLoot/Init.lua +++ b/LegionWA/AutoLoot/Init.lua @@ -15,7 +15,9 @@ end ---@return string, string|nil local function getItemName(slot) if slot == nil then return "", string.format("Slot can not be null") end - return select(2, GetLootSlotInfo(slot)), nil + local name = select(2, GetLootSlotInfo(slot)) + if name == nil then return "", string.format("GetLootSlotInfo returned nil for slot %d", slot) end + return name, nil end ---@param slot number ---@return string, string|nil @@ -23,7 +25,9 @@ local function getItemType(slot) if slot == nil then return "", string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return "", err end - return select(6, GetItemInfo(itemLink)), nil + local itemType = select(6, GetItemInfo(itemLink)) + if itemType == nil then return "", string.format("GetItemInfo returned nil for slot %d", slot) end + return itemType, nil end ---@param slot number ---@return string, string|nil @@ -31,7 +35,9 @@ local function getItemSubtype(slot) if slot == nil then return "", string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return "", err end - return select(7, GetItemInfo(itemLink)), nil + local itemSubtype = select(7, GetItemInfo(itemLink)) + if itemSubtype == nil then return "", string.format("GetItemInfo returned nil for slot %d", slot) end + return itemSubtype, nil end ---@param slot number ---@return number, string|nil @@ -39,7 +45,9 @@ local function getItemLevel(slot) if slot == nil then return 0, string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return 0, err end - return select(4, GetItemInfo(itemLink)), nil + local itemLevel = select(4, GetItemInfo(itemLink)) + if itemLevel == nil then return 0, string.format("GetItemInfo returned nil for slot %d", slot) end + return itemLevel, nil end ---The vendor price in copper, or 0 for items that cannot be sold @@ -49,7 +57,9 @@ local function getItemValue(slot) if slot == nil then return 0, string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return 0, err end - return select(11, GetItemInfo(itemLink)), nil + local value = select(11, GetItemInfo(itemLink)) + if value == nil then return 0, string.format("GetItemInfo returned nil for slot %d", slot) end + return value, nil end ---@param slot number ---@return number, string|nil @@ -57,13 +67,17 @@ local function getItemSubclassId(slot) if slot == nil then return 0, string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return 0, err end - return select(13, GetItemInfo(itemLink)), nil + local subclassId = select(12, GetItemInfo(itemLink)) + if subclassId == nil then return 0, string.format("GetItemInfo returned nil for slot %d", slot) end + return subclassId, nil end ---@param slot number ---@return number, string|nil local function getItemQuantity(slot) if slot == nil then return 0, string.format("Slot can not be nil") end - return select(3, GetLootSlotInfo(slot)), nil + local quantity = select(3, GetLootSlotInfo(slot)) + if quantity == nil then return 0, string.format("GetLootSlotInfo returned nil for slot %d", slot) end + return quantity, nil end ---@param slot number ---@return Enum.ItemQuality, string|nil @@ -71,7 +85,9 @@ local function getItemQuality(slot) if slot == nil then return 0, string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return 0, err end - return select(3, GetItemInfo(itemLink)), nil + local quality = select(3, GetItemInfo(itemLink)) + if quality == nil then return 0, string.format("GetItemInfo returned nil for slot %d", slot) end + return quality, nil end ---@param slot number ---@return string, string|nil @@ -79,7 +95,9 @@ local function getItemEquipLocation(slot) if slot == nil then return "", string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return "", err end - return select(9, GetItemInfo(itemLink)), nil + local equipLoc = select(9, GetItemInfo(itemLink)) + if equipLoc == nil then return "", string.format("GetItemInfo returned nil for slot %d", slot) end + return equipLoc, nil end ---@param slot number ---@return number, string|nil @@ -87,7 +105,9 @@ local function getItemIcon(slot) if slot == nil then return 134400, string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return 134400, err end - return select(10, GetItemInfo(itemLink)), nil + local icon = select(10, GetItemInfo(itemLink)) + if icon == nil then return 134400, string.format("GetItemInfo returned nil for slot %d", slot) end + return icon, nil end ---@param slot number ---@return number, string|nil @@ -95,23 +115,22 @@ local function getBindType(slot) if slot == nil then return 0, string.format("Slot can not be nil") end local itemLink, err = getItemLink(slot) if err then return 0, err end - return select(14, GetItemInfo(itemLink)), nil + local bindType = select(14, GetItemInfo(itemLink)) + if bindType == nil then return 0, string.format("GetItemInfo returned nil for slot %d", slot) end + return bindType, nil 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) + new = function(requires, filter) local self = setmetatable({}, { __index = Filter }) - self.enabled = enabled self.requires = requires self.filter = filter return self @@ -128,9 +147,9 @@ Filter = { local res, err = v(slot) if err ~= nil then if debug then print(err) end - else - provided[k] = res + return false, err end + provided[k] = res end end local res, err = self.filter(slot, provided) @@ -141,8 +160,7 @@ Filter = { end } -local goldFilter = Filter.new(true, - { ["name"] = getItemName }, +local goldFilter = Filter.new({ ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Gold") or @@ -154,8 +172,7 @@ local goldFilter = Filter.new(true, if debug then print(string.format("Gold filter fail for %s", provided.name)) end return false end) -local orderResourcesFilter = Filter.new(true, - { ["name"] = getItemName }, +local orderResourcesFilter = Filter.new({ ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Order Resources") then @@ -165,8 +182,7 @@ local orderResourcesFilter = Filter.new(true, if debug then print(string.format("Order resource filter fail for %s", provided.name)) end return false end) -local mountFilter = Filter.new(true, - { ["type"] = getItemType }, +local mountFilter = Filter.new({ ["type"] = getItemType }, function(slot, provided) ---@cast provided { type: string } if provided.type == "Mount" then @@ -176,8 +192,7 @@ local mountFilter = Filter.new(true, if debug then print(string.format("Mount filter fail for type %s", provided.type)) end return false end) -local ilvlFilter = Filter.new(true, - { ["ilvl"] = getItemLevel }, +local ilvlFilter = Filter.new({ ["ilvl"] = getItemLevel }, function(slot, provided) ---@cast provided { ilvl: number } if provided.ilvl and provided.ilvl > 800 then @@ -187,8 +202,7 @@ local ilvlFilter = Filter.new(true, if debug then print(string.format("ilvl filter fail for ilvl %d", provided.ilvl)) end return false end) -local professionFilter = Filter.new(true, - { +local professionFilter = Filter.new({ ["type"] = getItemType, ["subtype"] = getItemSubtype }, @@ -214,8 +228,7 @@ local professionFilter = Filter.new(true, if debug then print(string.format("Profession filter fail for type %s", provided.type)) end return false end) -local valueFilter = Filter.new(true, - { +local valueFilter = Filter.new({ ["value"] = getItemValue, ["quantity"] = getItemQuality }, @@ -235,8 +248,7 @@ local valueFilter = Filter.new(true, if debug then print(string.format("Value filter fail for value %d", value)) end return false end) -local greyValueFilter = Filter.new(true, - { +local greyValueFilter = Filter.new({ ["quality"] = getItemQuality, ["value"] = getItemValue, ["quantity"] = getItemQuantity @@ -265,8 +277,7 @@ local greyValueFilter = Filter.new(true, end return false end) -local questItemFilter = Filter.new(true, - { +local questItemFilter = Filter.new({ ["type"] = getItemType, ["subtype"] = getItemSubtype }, @@ -285,8 +296,7 @@ local questItemFilter = Filter.new(true, end return false end) -local classGearFilter = Filter.new(true, - { +local classGearFilter = Filter.new({ ["ilvl"] = getItemLevel, ["quality"] = getItemQuality, ["type"] = getItemType, @@ -314,8 +324,7 @@ local classGearFilter = Filter.new(true, end return false end) -local arguniteFilter = Filter.new(true, - { +local arguniteFilter = Filter.new({ ["name"] = getItemName, ["quality"] = getItemQuality }, @@ -331,8 +340,7 @@ local arguniteFilter = Filter.new(true, if debug then print(string.format("Argunite filter fail for %s and quality %d", provided.name, provided.quality)) end return false end) -local ancientManaFilter = Filter.new(true, - { ["name"] = getItemName }, +local ancientManaFilter = Filter.new({ ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Ancient Mana") then @@ -342,8 +350,7 @@ local ancientManaFilter = Filter.new(true, if debug then print(string.format("Ancient Mana filter fail for %s", provided.name)) end return false end) -local reicpeFilter = Filter.new(false, - { ["name"] = getItemName }, +local reicpeFilter = Filter.new({ ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if string.find(provided.name, "Recipe") or string.find(provided.name, "Technique") then @@ -353,8 +360,7 @@ local reicpeFilter = Filter.new(false, if debug then print(string.format("Recipe filter fail for %s", provided.name)) end return false end) -local bloodOfSargerasFilter = Filter.new(true, - { ["name"] = getItemName }, +local bloodOfSargerasFilter = Filter.new({ ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if provided.name == "Blood of Sargeras" then @@ -364,8 +370,7 @@ local bloodOfSargerasFilter = Filter.new(true, if debug then print(string.format("Blood of Sargeras filter fail for %s", provided.name)) end return false end) -local bloodhunerQuarryFilter = Filter.new(true, - { ["name"] = getItemName }, +local bloodhunerQuarryFilter = Filter.new({ ["name"] = getItemName }, function(slot, provided) ---@cast provided { name: string } if provided.name == "Bloodhunter's Quarry" then @@ -375,8 +380,7 @@ local bloodhunerQuarryFilter = Filter.new(true, if debug then print(string.format("Bloodhunter's Quarry filter fail for %s", provided.name)) end return false end) -local boeFilter = Filter.new(true, - { +local boeFilter = Filter.new({ ["ilvl"] = getItemLevel, ["type"] = getItemType, ["quality"] = getItemQuality, @@ -409,7 +413,7 @@ local boeFilter = Filter.new(true, if debug then print(string.format("BoE filter fail for ilvl %d and quality %d", provided.ilvl, provided.quality)) end return false end) -local artifactPowerFilter = Filter.new(true, { +local artifactPowerFilter = Filter.new({ ["type"] = getItemType, ["subtype"] = getItemSubtype, ["subclassid"] = getItemSubclassId, @@ -424,50 +428,13 @@ local artifactPowerFilter = Filter.new(true, { return true end if debug then + DevTools_Dump(provided) print(string.format("Artifact power filter fail for type %s and subtype %s and subclassid %d with value %d", provided.type, provided.subtype, provided.subclassid, provided.value)) end return false end) --- [09:19 AM] Dump: value=GetItemInfo("Elemental Pebbles") --- [09:19 AM] [1]="Elemental Pebbles", --- [09:19 AM] [2]="|cff9d9d9d|Hitem:132217::::::::110:72::::::|h[Elemental Pebbles]|h|r", --- [09:19 AM] [3]=0, --- [09:19 AM] [4]=100, --- [09:19 AM] [5]=1, --- [09:19 AM] [6]="Consumable", --- [09:19 AM] [7]="Other", --- [09:19 AM] [8]=20, --- [09:19 AM] [9]="", --- [09:19 AM] [10]=135234, --- [09:19 AM] [11]=27075, --- [09:19 AM] [12]=0, --- [09:19 AM] [13]=8, --- [09:19 AM] [14]=0, --- [09:19 AM] [15]=0, --- [09:19 AM] [17]=false - -GetItemInfo("Brief History of the Ages") - --- [09:19 AM] Dump: value=GetItemInfo("Brief History of the Ages") --- [09:19 AM] [1]="Brief History of the Ages", --- [09:19 AM] [2]="|cffa335ee|Hitem:138782::::::::110:72::::::|h[Brief History of the Ages]|h|r", --- [09:19 AM] [3]=4, --- [09:19 AM] [4]=110, --- [09:19 AM] [5]=0, --- [09:19 AM] [6]="Consumable", --- [09:19 AM] [7]="Other", --- [09:19 AM] [8]=200, --- [09:19 AM] [9]="", --- [09:19 AM] [10]=134946, --- [09:19 AM] [11]=0, --- [09:19 AM] [12]=0, --- [09:19 AM] [13]=8, --- [09:19 AM] [14]=1, --- [09:19 AM] [15]=6, --- [09:19 AM] [17]=false - -- local azeriteFilter = { -- enabled = true, -- ilvlThreshold = 800, @@ -502,7 +469,7 @@ local filters = { orderResourcesFilter, professionFilter, questItemFilter, - reicpeFilter, + -- reicpeFilter, valueFilter, } @@ -513,8 +480,16 @@ aura_env.FilterService = { ---@type table local slotsToLoot = {} for slot, item in pairs(lootInfo) do + if debug then + local itemname = getItemName(slot) + print(string.format("Checking slot %d for %s", slot, itemname)) + end for _, filter in pairs(filters) do - if filter:Run(slot) then + local res, err = filter:Run(slot) + if err then + if debug then print(err) end + end + if res then slotsToLoot[#slotsToLoot + 1] = slot break end