Files
wow-weakauras/LegionWA/AutoLoot/Init.lua
2022-08-19 10:20:18 +02:00

630 lines
18 KiB
Lua

local debug = false
local iconDisplayDuration = 3
-- itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType,itemStackCount, itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType,expacID, setID, isCraftingReagent = GetItemInfo(slot)
-- lootIcon, lootName, lootQuantity, currencyID, lootQuality, locked, isQuestItem, questID, isActive = GetLootSlotInfo(slot)
-- Link sometimes does not work
local function getItemLink(slot)
return GetLootSlotLink(slot)
end
local function getItemName(slot)
return select(2, GetLootSlotInfo(slot))
end
local function getItemType(slot)
return select(6, GetItemInfo(getItemLink(slot)))
end
local function getItemSubtype(slot)
return select(7, GetItemInfo(getItemLink(slot)))
end
local function getItemLevel(slot)
return select(4, GetItemInfo(getItemLink(slot)))
end
local function getItemValue(slot)
return select(11, GetItemInfo(getItemLink(slot)))
end
local function getItemQuantity(slot)
return select(3, GetLootSlotInfo(slot))
end
local function getItemQuality(slot)
return select(3, GetItemInfo(getItemLink(slot)))
end
local function getItemEquipLocation(slot)
return select(9, GetItemInfo(getItemLink(slot)))
end
local function getItemIcon(slot)
return select(10, GetItemInfo(getItemLink(slot)))
end
local doLoot = function(slot)
aura_env.debugLog("Looting slot: " .. slot)
LootSlot(slot)
local itemIcon = getItemIcon(slot)
local itemName = getItemName(slot)
local itemQuantity = getItemQuantity(slot)
local itemQuality = getItemQuality(slot)
aura_env.debugLog("Drawing icon for " .. itemName .. " with quality " .. itemQuality)
local nameWithColor = aura_env.qualityColors[itemQuality + 1] .. "[" .. itemName .. "]\124r"
local nameWithQuantity = nameWithColor .. " x" .. itemQuantity
aura_env.debugLog("Assigning name" .. nameWithQuantity)
aura_env.allstates[#aura_env.allstates + 1] = {
show = true,
changed = true,
index = GetTime(),
resort = true,
icon = itemIcon,
name = nameWithQuantity,
amount = itemQuantity,
progressType = "timed",
expirationTime = GetTime() + iconDisplayDuration,
duration = iconDisplayDuration,
autoHide = true,
}
end
local goldFilter = {
enabled = true,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Gold filter; slot: " .. slot)
local itemName = getItemName(slot)
if (itemname and itemName:match("%d+ (Gold|Silver|Copper)")) then
aura_env.debugLog("Gold filter pass")
return true
end
end
end
}
local orderResourcesFilter = {
enabled = true,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Resource filter; slot: " .. slot)
local itemName = getItemName(slot)
if (itemName and itemName:match("Order Resources")) then
aura_env.debugLog("Order resource filter pass")
return true
end
end
end
}
local mountFilter = {
enabled = true,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Mount filter; slot: " .. slot)
local itemType = getItemType(slot)
if (itemType and itemType == "Mount") then
aura_env.debugLog("Mount filter pass")
return true
end
end
end
}
local ilvlFilter = {
enabled = true,
ilvlThreshold = 880,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("ILvl filter; slot: " .. slot)
local itemLevel = getItemLevel(slot)
if (itemLevel and itemLevel > self.ilvlThreshold) then
aura_env.debugLog("Item level filter pass")
return true
end
end
end
}
local professionFilter = {
enabled = true,
herbs = true,
cloth = false,
ore = false,
leather = false,
cooking = false,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Profession filter; slot: " .. slot)
local itemType = getItemType(slot)
if (itemType and itemType == "Tradeskill") then
local itemSubtype = getItemSubtype(slot)
if (itemSubtype and (itemSubtype == "Herb" and self.herbs)
or (itemSubtype == "Leather" and self.leather)
or (itemSubtype == "Cloth" and self.cloth)
or (itemSubtype == "Ore" and self.ore)
or (itemSubtype == "Cooking" and self.cooking)) then
aura_env.debugLog("Profession filter pass")
return true
end
end
end
end
}
local valueFilter = {
enabled = true,
valueThreshold = 35 * 100 * 100,
applyThresholdToItemStack = false,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Value filter; slot: " .. slot)
local itemValue = getItemValue(slot)
if (self.applyThresholdToItemStack) then
local itemQuantity = getItemQuantity(slot)
aura_env.debugLog("There exist " .. itemQuantity .. " items in slot " .. slot)
itemValue = itemValue * itemQuantity
end
if (itemValue and itemValue > self.valueThreshold) then
aura_env.debugLog("Value filter pass")
return true
end
end
end
}
local greyValueFilter = {
enabled = true,
-- Set threshold to 0 to loot all greys
valueThreshold = 5 * 100 * 100,
applyThresholdToItemStack = false,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Grey value filter; slot: " .. slot)
local itemQuality = getItemQuality(slot)
if (itemQuality > 0) then
local itemValue = getItemValue(slot)
if (self.applyThresholdToItemStack) then
local itemQuantity = getItemQuantity(slot)
aura_env.debugLog("There exist " .. itemQuantity .. " items in slot " .. slot)
itemValue = itemValue * itemQuantity
end
if (itemValue and itemValue > self.valueThreshold) then
aura_env.debugLog("Grey value filter pass")
return true
end
end
end
end
}
local questItemFilter = {
enabled = true,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Quest item filter; slot: " .. slot)
local itemType = getItemType(slot)
local itemSubtype = getItemSubtype(slot)
if (itemType and itemSubtype and itemType == itemSubtype == "Quest") then
aura_env.debugLog("Quest item filter pass")
return true
end
end
end
}
local classGearFilter = {
enabled = true,
ilvlThreshold = 800,
qualityThreshold = 2,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Class gear filter; slot: " .. slot)
local itemType = getItemType(slot)
local itemEquipLoc = getItemEquipLocation(slot)
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 = getItemLevel(slot)
local itemQuality = getItemQuality(slot)
local isEquippable = aura_env.skills[select(3, UnitClass("player"))][subtype] == 1
if (isEquippable and itemLevel > self.ilvlThreshold and itemQuality > self.qualityThreshold) then
aura_env.debugLog("Class gear filter pass")
return true
end
end
end
end
}
local azeriteFilter = {
enabled = true,
ilvlThreshold = 800,
qualityThreshold = 2,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Azerite filter; slot: " .. slot)
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) then
aura_env.debugLog("Azerite filter pass")
return true
end
end
end
}
local arguniteFilter = {
enabled = true,
qualityThreshold = 1,
filter = function(self, slot)
if (self.enabled) then
aura_env.debugLog("Argunite filter; slot: " .. slot)
local itemName = getItemName(slot)
local itemQuality = getItemQuality(slot)
if (itemName and itemQuality and itemName:match("Argunite") and itemQuality > self.qualityThreshold) then
aura_env.debugLog("Argunite filter pass")
return true
end
end
end
}
aura_env.filterService = {
filters = {
goldFilter,
orderResourcesFilter,
mountFilter,
ilvlFilter,
professionFilter,
valueFilter,
greyValueFilter,
questItemFilter,
classGearFilter,
azeriteFilter
},
slotsToLoot = {},
run = function(self, lootInfo)
self.slotsToLoot = {}
for slot, item in pairs(lootInfo) do
aura_env.debugLog("Loot slot: " .. slot .. " " .. item.item)
aura_env.debugLog(getItemSubtype(slot))
self:runFilters(slot)
end
aura_env.debugLog("Slots to loot: " .. #self.slotsToLoot)
aura_env.debugLog(self.slotsToLoot)
for i = #self.slotsToLoot, 1, -1 do
local slot = self.slotsToLoot[i]
aura_env.debugLog("Looting slot (iterator): " .. slot)
doLoot(slot)
end
end,
runFilters = function(self, slot)
for k, filter in pairs(self.filters) do
if (filter:filter(slot)) then
self.slotsToLoot[#self.slotsToLoot + 1] = slot
return
end
end
end
}
aura_env.debugLog = function(obj)
if (debug) then
print(GetTime())
DevTools_Dump(obj)
print()
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
}