ESOUI

ESOUI (https://www.esoui.com/forums/index.php)
-   AddOn Help/Support (https://www.esoui.com/forums/forumdisplay.php?f=164)
-   -   Have Problems with Setting an Itemfilter (https://www.esoui.com/forums/showthread.php?t=8663)

cOOLsp0T 07/24/19 04:17 AM

Have Problems with Setting an Itemfilter
 
Hey Folks,

Im very new with the lua language and especially with the ESO API, but Im experienced in C languages.

At the moment I write a small Loot Manager which have a few kind of options for itemfiltering purpose.

My problem is this small function which filters out the unwished items. I wrote for debugging purposes a small ItemIdentifier which have similiar functions.

This
Code:

function LootManager.ItemFilter(itemnumber,bagID,slotID)

...
        if Config.MaterialFilterSettings.LootAlchemy == true then
                if itemtype == ITEMTYPE_POISON_BASE then return true end
                if itemtype == ITEMTYPE_POTION_BASE then return true end
                if itemtype == ITEMTYPE_REAGENT then return true end
        end
        if Config.MaterialFilterSettings.LootCooking == true then
                if itemtype == ITEMTYPE_FLAVORING then return true end
                if itemtype == ITEMTYPE_INGREDIENT then return true end
                if itemtype == ITEMTYPE_FISH then return true end
                if itemtype == ITEMTYPE_LURE then return true end
                if itemtype == ITEMTYPE_SPICE then return true end
        end
        return false
end

My other filteroptions like LootAlchemy seems to work. I also checked the LootCooking var and it works perfectly. Is there a special hint in lua which I missed?

Here is a part of my ItemIdentifier which works perfectly
Code:

function LootManager.LootItemIdentifier(itemnumber)

......
                if itemtype == ITEMTYPE_FLAVORING then itemtype = "Flavoring" end
                if itemtype == ITEMTYPE_INGREDIENT then itemtype = "Ingredient" end
                if itemtype == ITEMTYPE_FISH then itemtype = "Fish" end
                if itemtype == ITEMTYPE_LURE then itemtype = "Lure" end
                if itemtype == ITEMTYPE_SPICE then itemtype = "Spice" end
        return itemtype
end

Thx for your patience :)

Scootworks 07/24/19 06:06 AM

try to add a debug message to figure out first, if your config is defined or not:

Lua Code:
  1. d(Config.MaterialFilterSettings.LootAlchemy)
  2. d(Config.MaterialFilterSettings.LootCooking)


second thing is, you check for
Code:

itemType ==
, but you maybe forgot to define the itemType? maybe it's better if you post the whole code of the ItemFilter function.

cOOLsp0T 07/24/19 06:51 AM

Code:

function LootManager.ItemFilter(itemnumber,bagID,slotID)
        if bagID == nil or slotID == nil then
                local itemID,name,icon,amount,quality,value,isQuest,stolen = GetLootItemInfo(itemnumber)
                local itemlink = GetLootItemLink(itemID)
                local itemtype = GetItemLinkItemType(itemlink)
                local itemtrait = GetItemLinkTraitType(itemlink)
        end
        if itemnumber == nil then
                local itemlink = GetItemLink(bagID,slotID)
                local itemtype = GetItemType(bagID,slotID)
                local itemtrait = GetItemTrait(bagID,slotID)
                local value = GetItemLinkValue(itemlink)
                local itemfiltertype = GetItemLinkFilterTypeInfo(itemLink)
        end
       
        local notdestroyable = IsItemLinkForcedNotDeconstructable(itemlink)
       
        if itemtype == ITEMTYPE_WEAPON then
                if bagID == nil or slotID == nil then local itemtype2 = GetItemLinkWeaponType(itemlink) end
                if itemnumber == nil then local itemtype2 = GetItemWeaponType(bagID,slotID) end
                                                --- User Weapon Filter ---
                if itemtype2 == WEAPONTYPE_DAGGER and Config.WeaponFilterSettings.Dagger >= 1 then return true end
                if itemtype2 == WEAPONTYPE_SWORD and Config.WeaponFilterSettings.OHSword >= 1 then return true end
                if itemtype2 == WEAPONTYPE_HAMMER and Config.WeaponFilterSettings.OHHammer >= 1 then return true end
                if itemtype2 == WEAPONTYPE_AXE and Config.WeaponFilterSettings.OHAxe >= 1 then return true end
                if itemtype2 == WEAPONTYPE_SHIELD and Config.WeaponFilterSettings.Shield >= 1 then return true end
                if itemtype2 == WEAPONTYPE_TWO_HANDED_SWORD and Config.WeaponFilterSettings.THSword >= 1 then return true end
                if itemtype2 == WEAPONTYPE_TWO_HANDED_HAMMER and Config.WeaponFilterSettings.THHammer >= 1 then return true end
                if itemtype2 == WEAPONTYPE_TWO_HANDED_AXE and Config.WeaponFilterSettings.THAxe >= 1 then return true end
                if itemtype2 == WEAPONTYPE_BOW and Config.WeaponFilterSettings.Bow >= 1 then return true end
                if itemtype2 == WEAPONTYPE_FIRE_STAFF and Config.WeaponFilterSettings.FireStaff >= 1 then return true end
                if itemtype2 == WEAPONTYPE_FROST_STAFF and Config.WeaponFilterSettings.FrostStaff >= 1 then return true end
                if itemtype2 == WEAPONTYPE_LIGHTNING_STAFF and Config.WeaponFilterSettings.LightningStaff >= 1 then return true end
                if itemtype2 == WEAPONTYPE_HEALING_STAFF and Config.WeaponFilterSettings.HealingStaff >= 1 then return true end
                                                --- User Loot Ornate & Intricate Weapons ---
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_ORNATE and Config.GeneralFilterSettings.LootOrnate == true then return true end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_INTRICATE then
                        if Config.WeaponFilterSettings.MetalWeaponIntricate == true then
                                if itemtype2 == WEAPONTYPE_DAGGER then return true end
                                if itemtype2 == WEAPONTYPE_SWORD then return true end
                                if itemtype2 == WEAPONTYPE_HAMMER then return true end
                                if itemtype2 == WEAPONTYPE_AXE then return true end
                                if itemtype2 == WEAPONTYPE_TWO_HANDED_SWORD then return true end
                                if itemtype2 == WEAPONTYPE_TWO_HANDED_AXE then return true end
                                if itemtype2 == WEAPONTYPE_TWO_HANDED_HAMMER then return true end
                        end
                        if Config.WeaponFilterSettings.WoodenWeaponIntricate == true then
                                if itemtype2 == WEAPONTYPE_SHIELD then return true end
                                if itemtype2 == WEAPONTYPE_BOW then return true end
                                if itemtype2 == WEAPONTYPE_FIRE_STAFF then return true end
                                if itemtype2 == WEAPONTYPE_FROST_STAFF then return true end
                                if itemtype2 == WEAPONTYPE_LIGHTNING_STAFF then return true end
                                if itemtype2 == WEAPONTYPE_HEALING_STAFF then return true end
                        end
                end
        end
                                                --- User Armor Filter ---
        if itemtype == ITEMTYPE_ARMOR then
                if bagID == nil or slotID == nil then local itemtype2 = GetItemLinkArmorType(itemlink) end
                if itemnumber == nil then local itemtype2 = GetItemArmorType(bagID,slotID) end
                if itemtype2 == ARMORTYPE_LIGHT and Config.ArmorFilterSettings.LightArmor >= 1 then return true end
                if itemtype2 == ARMORTYPE_MEDIUM and Config.ArmorFilterSettings.MediumArmor >= 1 then return true end
                if itemtype2 == ARMORTYPE_HEAVY and Config.ArmorFilterSettings.HeavyArmor >= 1 then return true end
               
                                                --- User Loot Ornate & Intricate Weapons ---
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_ORNATE and Config.GeneralFilterSettings.LootOrnate == true then return true end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_INTRICATE then
                        if Config.ArmorFilterSettings.SmithArmorIntricate == true then
                                if itemtype2 == ARMORTYPE_HEAVY then return true end
                        end
                        if Config.ArmorFilterSettings.ClothArmorIntricate == true then
                                if itemtype2 == ARMORTYPE_LIGHT then return true end
                                if itemtype2 == ARMORTYPE_MEDIUM then return true end
                        end
                end       
        end
       
        if Config.MaterialFilterSettings.LootCooking == true then
                if itemtype == ITEMTYPE_FLAVORING then return true end
                if itemtype == ITEMTYPE_INGREDIENT then return true end
                if itemtype == ITEMTYPE_FISH then return true end
                if itemtype == ITEMTYPE_LURE then return true end
                if itemtype == ITEMTYPE_SPICE then return true end
        end
        if Config.MaterialFilterSettings.LootAlchemy == true then
                if itemtype == ITEMTYPE_POISON_BASE then return true end
                if itemtype == ITEMTYPE_POTION_BASE then return true end
                if itemtype == ITEMTYPE_REAGENT then return true end
        end
        if Config.MaterialFilterSettings.LootClothing == true then
                if itemtype == ITEMTYPE_CLOTHIER_RAW_MATERIAL then return true end
                if itemtype == ITEMTYPE_CLOTHIER_MATERIAL then return true end
                if itemtype == ITEMTYPE_CLOTHIER_BOOSTER then return true end
                if itemtype == ITEMTYPE_ARMOR_TRAIT then return true end
                if itemtype == ITEMTYPE_WEAPON_TRAIT then return true end
        end
        if Config.MaterialFilterSettings.LootSmithing == true then
                if itemtype == ITEMTYPE_BLACKSMITHING_RAW_MATERIAL then return true end
                if itemtype == ITEMTYPE_BLACKSMITHING_MATERIAL then return true end
                if itemtype == ITEMTYPE_BLACKSMITHING_BOOSTER then return true end
                if itemtype == ITEMTYPE_ARMOR_TRAIT then return true end
                if itemtype == ITEMTYPE_WEAPON_TRAIT then return true end
        end
        if Config.MaterialFilterSettings.LootWood == true then
                if itemtype == ITEMTYPE_WOODWORKING_RAW_MATERIAL then return true end
                if itemtype == ITEMTYPE_WOODWORKING_MATERIAL then return true end
                if itemtype == ITEMTYPE_WOODWORKING_BOOSTER then return true end
        end

       
        if Config.MaterialFilterSettings.LootRunes == true then
                if itemtype == ITEMTYPE_ENCHANTING_RUNE_ASPECT then return true end
                if itemtype == ITEMTYPE_ENCHANTING_RUNE_ESSENCE then return true end
                if itemtype == ITEMTYPE_ENCHANTING_RUNE_POTENCY then return true end
                if itemtype == ITEMTYPE_ENCHANTING_BOOSTER then return true end
        end
        if Config.MaterialFilterSettings.LootFurnish == true then
                if itemtype == ITEMTYPE_FURNISHING_MATERIAL then return true end
        end
       
        if Config.GeneralFilterSettings.LootSoulGems == true then return true end
--        CanBeResearched = CanItemLinkBeTraitResearched(itemlink)
--        if CanBeResearched == true then
--                d(LootManager.ManagerDebugMark.."Item can be researched!")
--                return true
--        end

        if value >= Config.GeneralFilterSettings.LootValue then
                if itemtype == ITEMTYPE_TRASH then return true end
                if itemtype == ITEMTYPE_TREASURE then return true end
                if itemtype == ITEMTYPE_TROPHY then return true end
                if itemtype == ITEMTYPE_FOOD then return true end
                if itemtype == ITEMTYPE_DRINK then return true end
                if itemtype == ITEMTYPE_TOOL then return true end
                if itemtype == ITEMTYPE_DYE_STAMP then return true end
                if itemtype == ITEMTYPE_DISGUISE then return true end
                if itemtype == ITEMTYPE_COSTUME then return true end
                if itemtype == ITEMTYPE_DEPRECATED then return true end
                if itemtype == ITEMTYPE_NONE then return true end
                if itemtype == ITEMTYPE_PLUG then return true end
                if itemtype == ITEMTYPE_SIEGE then return true end
                if itemtype == ITEMTYPE_SPELLCRAFTING_TABLET then return true end
                if itemtype == ITEMTYPE_MOUNT then return true end
                if itemtype == ITEMTYPE_CONTAINER then return true end
                if itemtype == ITEMTYPE_CONTAINER_CURRENCY then return true end
                if itemtype == ITEMTYPE_AVA_REPAIR then return true end
        end
        return false
end

Code:

function LootManager.LootItemIdentifier(itemnumber)
        local itemID,name,icon,amount,quality,value,isQuest,stolen = GetLootItemInfo(itemnumber)
        local itemlink = GetLootItemLink(itemID)
        local itemtype = GetItemLinkItemType(itemlink)
        local itemtrait = GetItemLinkTraitType(itemlink)
        if itemtype == ITEMTYPE_WEAPON then
                local itemtype = "Weapon"
                local itemtype2 = GetItemLinkWeaponType(itemlink)
                if itemtype2 == WEAPONTYPE_DAGGER then local itemtype2 ="Dagger" end
                if itemtype2 == WEAPONTYPE_SWORD then local itemtype2 ="One-Hand Sword" end
                if itemtype2 == WEAPONTYPE_HAMMER then local itemtype2 ="One-Hand Hammer" end
                if itemtype2 == WEAPONTYPE_AXE then local itemtype2 ="One-Hand Axe" end
                if itemtype2 == WEAPONTYPE_SHIELD then local itemtype2 ="Shield" end
                if itemtype2 == WEAPONTYPE_TWO_HANDED_SWORD then local itemtype2 ="Two-Hand Sword" end
                if itemtype2 == WEAPONTYPE_TWO_HANDED_HAMMER then local itemtype2 ="Two-Hand Hammer" end
                if itemtype2 == WEAPONTYPE_TWO_HANDED_AXE then local itemtype2 ="Two-Hand Axe" end
                if itemtype2 == WEAPONTYPE_BOW then local itemtype2 ="Bow" end
                if itemtype2 == WEAPONTYPE_FIRE_STAFF then local itemtype2 ="Firestaff" end
                if itemtype2 == WEAPONTYPE_FROST_STAFF then local itemtype2 ="Froststaff" end
                if itemtype2 == WEAPONTYPE_LIGHTNING_STAFF then local itemtype2 ="Lightningstaff" end
                if itemtype2 == WEAPONTYPE_HEALING_STAFF then local itemtype2 ="Healingstaff" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_CHARGED then local itemtrait = "Charged" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_DECISIVE then local itemtrait = "Decisive" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_DEFENDING then local itemtrait = "Defending" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_INFUSED then local itemtrait = "Infused" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_NIRNHORNED then local itemtrait = "Nirnhorned" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_POWERED then local itemtrait = "Powered" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_PRECISE then local itemtrait = "Precise" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_SHARPENED then local itemtrait = "Sharpened" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_INTRICATE then local itemtrait = "Intricate" end
                if itemtrait == ITEM_TRAIT_TYPE_WEAPON_ORNATE then local itemtrait = "Ornate" end
        end
        if itemtype == ITEMTYPE_ARMOR then
                local itemtype = "Armor"
                local itemtype2 = GetItemLinkArmorType(itemlink)
                if itemtype2 == ARMORTYPE_LIGHT then local itemtype2 ="Light" end
                if itemtype2 == ARMORTYPE_MEDIUM then local itemtype2 ="Medium" end
                if itemtype2 == ARMORTYPE_HEAVY then local itemtype2 ="Heavy" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_DIVINES then local itemtrait = "Divine" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_REINFORCED then local itemtrait = "Reinforced" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_IMPENETRABLE then local itemtrait = "Impenetrable" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_INFUSED then local itemtrait = "Infused" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_NIRNHONED then local itemtrait = "Nirnhorned" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_PROSPEROUS then local itemtrait = "Prosperous" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_TRAINING then local itemtrait = "Training" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_STURDY then local itemtrait = "Sturdy" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_WELL_FITTED then local itemtrait = "Well Fitted" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_INTRICATE then local itemtrait = "Cloth Intricate" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_INTRICATE then local itemtrait = "Smith Intricate" end
                if itemtrait == ITEM_TRAIT_TYPE_ARMOR_ORNATE then local itemtrait = "Ornate" end
        end
                if itemtype == ITEMTYPE_FLAVORING then local itemtype = "Flavoring" end
                if itemtype == ITEMTYPE_INGREDIENT then local itemtype = "Ingredient" end
                if itemtype == ITEMTYPE_FISH then local itemtype = "Fish" end
                if itemtype == ITEMTYPE_LURE then local itemtype = "Lure" end
                if itemtype == ITEMTYPE_SPICE then local itemtype = "Spice" end
                if itemtype == ITEMTYPE_TRASH then local itemtype = "Trash" end
                if itemtype == ITEMTYPE_TREASURE then local itemtype = "Treasure" end
                if itemtype == ITEMTYPE_TROPHY then local itemtype = "Trophy" end
                if itemtype == ITEMTYPE_FOOD then local itemtype = "Food" end
                if itemtype == ITEMTYPE_DRINK then local itemtype = "Drink" end
                if itemtype == ITEMTYPE_TOOL then local itemtype = "Tool"end
                if itemtype == ITEMTYPE_DYE_STAMP then local itemtype = "Dye Stamp" end
                if itemtype == ITEMTYPE_DISGUISE then local itemtype = "Disguise" end
                if itemtype == ITEMTYPE_COSTUME then local itemtype = "Costume" end
                if itemtype == ITEMTYPE_DEPRECATED then local itemtype = "Deprecated" end
                if itemtype == ITEMTYPE_NONE then local itemtype = "None" end
                if itemtype == ITEMTYPE_PLUG then local itemtype = "Plug" end
                if itemtype == ITEMTYPE_SIEGE then local itemtype = "Siege"end
                if itemtype == ITEMTYPE_SPELLCRAFTING_TABLET then local itemtype = "Spellcrafting Table" end
                if itemtype == ITEMTYPE_MOUNT then local itemtype = "Mount" end
                if itemtype == ITEMTYPE_CONTAINER then local itemtype = "Container" end
                if itemtype == ITEMTYPE_CONTAINER_CURRENCY then local itemtype = "Container Currency" end
                if itemtype == ITEMTYPE_AVA_REPAIR then local itemtype = "Ava Repair"end
                if itemtype == ITEMTYPE_BLACKSMITHING_RAW_MATERIAL then local itemtype = "Blacksmith Raw Material" end
                if itemtype == ITEMTYPE_BLACKSMITHING_MATERIAL then local itemtype = "Blacksmith Material" end
                if itemtype == ITEMTYPE_BLACKSMITHING_BOOSTER then local itemtype = "Blacksmith Booster" end
                if itemtype == ITEMTYPE_ARMOR_TRAIT then local itemtype = "Armor Trait" end
                if itemtype == ITEMTYPE_WEAPON_TRAIT then local itemtype = "Weapon Trait" end
                if itemtype == ITEMTYPE_ENCHANTING_RUNE_ASPECT then local itemtype = "Aspect Rune" end
                if itemtype == ITEMTYPE_ENCHANTING_RUNE_ESSENCE then local itemtype = "Essence Rune" end
                if itemtype == ITEMTYPE_ENCHANTING_RUNE_POTENCY then local itemtype = "Potency Rune" end
                if itemtype == ITEMTYPE_ENCHANTING_BOOSTER then local itemtype = "Enchanting Booster" end
                if itemtype == ITEMTYPE_CLOTHIER_RAW_MATERIAL then local itemtype = "Clothier Raw Material" end
                if itemtype == ITEMTYPE_CLOTHIER_MATERIAL then local itemtype = "Clothier Material" end
                if itemtype == ITEMTYPE_CLOTHIER_BOOSTER then local itemtype = "Clothier Booster" end
                if itemtype == ITEMTYPE_FURNISHING_MATERIAL then local itemtype = "Furnishing Material" end
        return itemID,name,icon,amount,quality,value,isQuest,stolen,itemtype,itemtype2,itemtrait
end

I had a function for debug purpose.

Code:

function LootManager.Debugger(funcID,num,itemnumber,lootitem)
        itemID,name,icon,amount,quality,value,isQuest,stolen,itemtype,itemtype2,itemtrait = LootManager.LootItemIdentifier(itemnumber)
       
        if funcID == 1 and Config.GeneralSettings.Debug == "Virtual" then
                d(LootManager.ManagerDebugMark.."Items Found "..num.." —")
                d("——————————————————————————")
        end
        if funcID == 2 and Config.GeneralSettings.Debug == "Virtual" then
                d(LootManager.ManagerDebugMark.."ID: "..itemID)
                d(LootManager.ManagerDebugMark.."Name: "..name)
                d(LootManager.ManagerDebugMark.."Amount: "..amount)
                d(LootManager.ManagerDebugMark.."Quality: "..quality)
                d(LootManager.ManagerDebugMark.."Gold: "..value)
                d(LootManager.ManagerDebugMark.."Quest: "..tostring(isQuest))
                d(LootManager.ManagerDebugMark.."Stolen: "..tostring(stolen))
                d(LootManager.ManagerDebugMark.."ItemType: "..itemtype)
                if itemtype == "Armor" then d(LootManager.ManagerDebugMark.."ArmorType: "..itemtype2) end
                if itemtype == "Weapon" then d(LootManager.ManagerDebugMark.."WeaponType: "..itemtype2) end
                d(LootManager.ManagerDebugMark.."Trait: "..itemtrait)
                if lootitem == true then d(LootManager.ManagerDebugMark.."Loot this: |c33ff00"..tostring(lootitem)) else d(LootManager.ManagerDebugMark.."Loot this: |cdc1f1f"..tostring(lootitem)) end
                d("——————————————————————————")
        end
        if funcID == 3 and Config.GeneralSettings.Debug ~= "Virtual" then d("GarbageHandler registered") end
        if funcID == 4 and Config.GeneralSettings.Debug ~= "Virtual" then d("GarbageHandler unregistered") end
end

Please tell my if you can see improvements in the code. Sometimes I had the feeling the code can look better. :D

cOOLsp0T 07/24/19 07:52 AM

I solved it by myself. Its a damn scoping, problem. thx anyway. :)

Baertram 07/24/19 08:08 AM

If you define a local inside an if end it's ONLY known inside this block.
So if you check the itemtype outside the if end it will be alwas NIL.

About improvements:
Instead of reusing the same if end code several times you can use a table like this:

Lua Code:
  1. local alchemyAllowedItemtypes = {
  2.    [ITEMTYPE_POISON] = true,
  3.   ...
  4. }
  5. local itemtypeIsAllowedForAlchemy = alchemyAllowedItemtypes[itemtype] or false

This will give you a boolean answer true/fals if the itemtype is allowed for your alchemy filter.
Apply the same for others and you can even use your own table with String values as key for your itemInformation function / debug output.

P.S.
If the itemtype2 is the weapontype you should really name your variables like weapontype then instead or you'll confuse yoursef after a few weeks if you read your own code :-p

cOOLsp0T 07/24/19 09:29 AM

thx Baertram for your quick answer. :)

The itemtype2 var is, because I wouldnt make 2 seperate vars for armors and weapons, so I tried to merge.


All times are GMT -6. The time now is 11:03 AM.

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2014 - 2022 MMOUI