Not signed in (Sign In)
    • CommentAuthorAndyB216
    • CommentTimeJan 12th 2007 edited
     
    Any chance some of you who actually understand the details of this AddOn would be kind enough to share your basrules with the rest of us?

    I'm at a loss with regards to tweaking this...

    [moved to Btm forum --norgs]
    •  
      CommentAuthorNorganna
    • CommentTimeJan 12th 2007
     
    •  
      CommentAuthorDeckard
    • CommentTimeMar 1st 2007 edited
     
    I'm trying to write a watchlist baserule for BTM, but how can I find the itemID for items easily? I've done it by searching my Auctioneer.lua file (I think), but that's a bit time consuming. Thanks. :bigsmile:
    •  
      CommentAuthordinesh
    • CommentTimeMar 1st 2007
     
    turn on informant's link option, and then mouse over the item. the itemID is the first number in the link.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 1st 2007
     
    Ah, thank you. Was the "show-link" command moved from Auctioneer to Informant? I was trying to do it in Auctioneer but it wasn't recognizing the command, though it's still listed as a valid slash command for Auc in the wiki. I'll be happy to remove it if tha's a permanent change.
    •  
      CommentAuthordinesh
    • CommentTimeMar 1st 2007
     
    dunno, it must have been. if it's not there now, feel free to axe it from auc.
    • CommentAuthorChardonnay
    • CommentTimeMar 2nd 2007 edited
     
    Here's my disenchant baserule, not my latest version but you may find some useful stuff in here.

    Edit: added data from Onyx and Bishop for ilevel 100+ items. Thanks folks!
    Edit 2007-04-26: pasted in my current version. Includes some extra stuff for picking up twink items with prices from WoWHead (1500g so far :). Few extra comments, take it or leave it. :P

    -- Enchanting reagents
    local VOID = 22450
    local NEXUS = 20725
    local LPRISMATIC = 22449
    local LBRILLIANT = 14344
    local LRADIANT = 11178
    local LGLOWING = 11139
    local LGLIMMERING = 11084
    local SPRISMATIC = 22448
    local SBRILLIANT = 14343
    local SRADIANT = 11177
    local SGLOWING = 11138
    local SGLIMMERING = 10978
    local GPLANAR = 22446
    local GETERNAL = 16203
    local GNETHER = 11175
    local GMYSTIC = 11135
    local GASTRAL = 11082
    local GMAGIC = 10939
    local LPLANAR = 22447
    local LETERNAL = 16202
    local LNETHER = 11174
    local LMYSTIC = 11134
    local LASTRAL = 10998
    local LMAGIC = 10938
    local ARCANE = 22445
    local ILLUSION = 16204
    local DREAM = 11176
    local VISION = 11137
    local SOUL = 11083
    local STRANGE = 10940

    local priceUpperLimit = {
    [22450] = 750000, -- Void Crystal
    [20725] = 75000, -- Nexus Crystal

    [22449] = 180000, -- Large Prismatic Shard
    [14344] = 85000, -- Large Brilliant Shard
    [11178] = 75000, -- Large Radiant Shard
    [11139] = 15000, -- Large Glowing Shard
    [11084] = 5000, -- Large Glimmering Shard

    [22448] = 50000, -- Small Prismatic Shard
    [14343] = 10000, -- Small Brilliant Shard
    [11177] = 50000, -- Small Radiant Shard
    [11138] = 3500, -- Small Glowing Shard
    [10978] = 2500, -- Small Glimmering Shard

    [22446] = 52500, -- Greater Planar Essence
    [16203] = 82500, -- Greater Eternal Essence
    [11175] = 45000, -- Greater Nether Essence
    [11135] = 6000, -- Greater Mystic Essence
    [11082] = 4500, -- Greater Astral Essence
    [10939] = 4500, -- Greater Magic Essence

    [22447] = 17500, -- Lesser Planar Essence
    [16202] = 27500, -- Lesser Eternal Essence
    [11174] = 15000, -- Lesser Nether Essence
    [11134] = 2000, -- Lesser Mystic Essence
    [10998] = 1500, -- Lesser Astral Essence
    [10938] = 1500, -- Lesser Magic Essence

    [22445] = 18500, -- Arcane Dust
    [16204] = 17500, -- Illusion Dust
    [11176] = 5000, -- Dream Dust
    [11137] = 1500, -- Vision Dust
    [11083] = 1500, -- Soul Dust
    [10940] = 750, -- Strange Dust
    }

    -- A price adjustment to favour/disfavour particular reagents
    -- depending on the market and how much of the reagent I have
    -- already. Set manually, but I am working on automating this
    local priceAdjustment = {
    [VOID] = 0.5,
    [NEXUS] = 0.5,

    [LPRISMATIC] = 1,
    [LBRILLIANT] = 1,
    [LRADIANT] = 1,
    [LGLOWING] = 1,
    [LGLIMMERING] = 1,

    [SPRISMATIC] = 1,
    [SBRILLIANT] = 1,
    [SRADIANT] = 1,
    [SGLOWING] = 1,
    [SGLIMMERING] = 1,

    [GPLANAR] = 1,
    [GETERNAL] = 1,
    [GNETHER] = 1,
    [GMYSTIC] = 1,
    [GASTRAL] = 1,
    [GMAGIC] = 1,

    [LPLANAR] = 1,
    [LETERNAL] = 1,
    [LNETHER] = 1,
    [LMYSTIC] = 1,
    [LASTRAL] = 1,
    [LMAGIC] = 1,

    [ARCANE] = 1,
    [ILLUSION] = 1,
    [DREAM] = 1,
    [VISION] = 1,
    [SOUL] = 1,
    [STRANGE] = 1,
    }

    -- item types
    local WEAPON = 0
    local ARMOR = 1

    -- item qualities
    local UNCOMMON = 2
    local RARE = 3
    local EPIC = 4

    -- convert an item type string to an integer type
    local typeStringToType = {
    ["Weapon"] = WEAPON,
    ["Armor"] = ARMOR,
    }

    -- disenchanting level bracket upper bounds, e.g. an ilevel 52 item
    -- goes into bracket 55
    local levelUpperBounds = { 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 85, 99, 120 }

    -- bad items that look like they should be disenchantable but aren't
    local badItem = {
    [11287] = {}, -- Lesser Magic Wand
    [11288] = {}, -- Greater Magic Wand
    [11289] = {}, -- Lesser Mystic Wand
    [11290] = {}, -- Greater Mystic Wand
    [20406] = {}, -- Twilight Cultist Mantle
    [20407] = {}, -- Twilight Cultist Robe
    [20408] = {}, -- Twilight Cultist Cowl
    }

    -- the big disenchant table, indexed by [quality][type][level bracket]
    -- and yielding { { reagent type, drop probability, average drop quantity }, ... }
    -- I would use Enchantrix, but it lacks data for new items
    local disenchantTable = {
    [UNCOMMON] = {
    [WEAPON] = {
    [15] = { { STRANGE , 0.20, 1.5 }, { LMAGIC , 0.80, 1.5 }, },
    [20] = { { STRANGE , 0.20, 2.5 }, { GMAGIC , 0.75, 1.5 }, { SGLIMMERING, 0.05, 1.0 }, },
    [25] = { { STRANGE , 0.15, 5.0 }, { GMAGIC , 0.75, 1.5 }, { SGLIMMERING, 0.10, 1.0 }, },
    [30] = { { SOUL , 0.20, 1.5 }, { GMAGIC , 0.75, 1.5 }, { LGLIMMERING, 0.05, 1.0 }, },
    [35] = { { SOUL , 0.20, 3.5 }, { LMYSTIC , 0.75, 1.5 }, { SGLOWING , 0.05, 1.0 }, },
    [40] = { { VISION , 0.20, 1.5 }, { GMYSTIC , 0.75, 1.5 }, { LGLOWING , 0.05, 1.0 }, },
    [45] = { { VISION , 0.15, 3.5 }, { LNETHER , 0.80, 1.5 }, { SRADIANT , 0.05, 1.0 }, },
    [50] = { { DREAM , 0.20, 1.5 }, { GNETHER , 0.75, 1.5 }, { LRADIANT , 0.05, 1.0 }, },
    [55] = { { DREAM , 0.20, 3.5 }, { LETERNAL, 0.75, 1.5 }, { SBRILLIANT , 0.05, 1.0 }, },
    [60] = { { ILLUSION, 0.20, 1.5 }, { GETERNAL, 0.75, 1.5 }, { LBRILLIANT , 0.05, 1.0 }, },
    [65] = { { ILLUSION, 0.20, 3.5 }, { GETERNAL, 0.75, 2.5 }, { LBRILLIANT , 0.05, 1.0 }, },
    [85] = { { ARCANE , 0.20, 2.5 }, { LPLANAR , 0.75, 2.5 }, { SPRISMATIC , 0.05, 1.0 }, },
    [99] = { { ARCANE , 0.20, 2.5 }, { LPLANAR , 0.75, 2.5 }, { SPRISMATIC , 0.05, 1.0 }, },
    [120] = { { ARCANE , 0.20, 3.5 }, { GPLANAR , 0.75, 1.5 }, { LPRISMATIC , 0.05, 1.0 }, },
    },
    [ARMOR] = {
    [15] = { { STRANGE , 0.80, 1.5 }, { LMAGIC , 0.20, 1.5 }, },
    [20] = { { STRANGE , 0.75, 2.5 }, { GMAGIC , 0.20, 1.5 }, { SGLIMMERING, 0.05, 1.0 }, },
    [25] = { { STRANGE , 0.75, 5.0 }, { LASTRAL , 0.15, 1.5 }, { SGLIMMERING, 0.10, 1.0 }, },
    [30] = { { SOUL , 0.75, 1.5 }, { GASTRAL , 0.20, 1.5 }, { LGLIMMERING, 0.05, 1.0 }, },
    [35] = { { SOUL , 0.75, 3.5 }, { LMYSTIC , 0.20, 1.5 }, { SGLOWING , 0.05, 1.0 }, },
    [40] = { { VISION , 0.75, 1.5 }, { GMYSTIC , 0.20, 1.5 }, { LGLOWING , 0.05, 1.0 }, },
    [45] = { { VISION , 0.80, 3.5 }, { LNETHER , 0.15, 1.5 }, { SRADIANT , 0.05, 1.0 }, },
    [50] = { { DREAM , 0.75, 1.5 }, { GNETHER , 0.20, 1.5 }, { LRADIANT , 0.05, 1.0 }, },
    [55] = { { DREAM , 0.75, 3.5 }, { LETERNAL, 0.20, 1.5 }, { SBRILLIANT , 0.05, 1.0 }, },
    [60] = { { ILLUSION, 0.75, 1.5 }, { GETERNAL, 0.20, 1.5 }, { LBRILLIANT , 0.05, 1.0 }, },
    [65] = { { ILLUSION, 0.75, 3.5 }, { GETERNAL, 0.20, 2.5 }, { LBRILLIANT , 0.05, 1.0 }, },
    [85] = { { ARCANE , 0.75, 2.5 }, { LPLANAR , 0.20, 2.5 }, { SPRISMATIC , 0.05, 1.0 }, },
    [99] = { { ARCANE , 0.75, 2.5 }, { LPLANAR , 0.20, 2.5 }, { SPRISMATIC , 0.05, 1.0 }, },
    [120] = { { ARCANE , 0.75, 3.5 }, { GPLANAR , 0.20, 1.5 }, { LPRISMATIC , 0.05, 1.0 }, },
    },
    },
    [RARE] = {
    [WEAPON] = {
    [20] = { { SGLIMMERING, 1.00, 1.0 }, }, [25] = { { SGLIMMERING, 1.00, 1.0 }, },
    [30] = { { LGLIMMERING, 1.00, 1.0 }, }, [35] = { { SGLOWING , 1.00, 1.0 }, },
    [40] = { { LGLOWING , 1.00, 1.0 }, }, [45] = { { SRADIANT , 1.00, 1.0 }, },
    [50] = { { LRADIANT , 1.00, 1.0 }, }, [55] = { { SBRILLIANT , 1.00, 1.0 }, },
    [60] = { { LBRILLIANT , 0.99, 1.0 }, { NEXUS, 0.01, 1.0 }, },
    [65] = { { LBRILLIANT , 0.99, 1.0 }, { NEXUS, 0.01, 1.0 }, },
    [85] = { { SPRISMATIC , 0.99, 1.0 }, { NEXUS, 0.01, 1.0 }, },
    [99] = { { SPRISMATIC , 0.99, 1.0 }, { VOID , 0.01, 1.0 }, },
    [120] = { { LPRISMATIC , 0.99, 1.0 }, { VOID , 0.01, 1.0 }, },
    },
    [ARMOR] = {
    [20] = { { SGLIMMERING, 1.00, 1.0 }, }, [25] = { { SGLIMMERING, 1.00, 1.0 }, },
    [30] = { { LGLIMMERING, 1.00, 1.0 }, }, [35] = { { SGLOWING , 1.00, 1.0 }, },
    [40] = { { LGLOWING , 1.00, 1.0 }, }, [45] = { { SRADIANT , 1.00, 1.0 }, },
    [50] = { { LRADIANT , 1.00, 1.0 }, }, [55] = { { SBRILLIANT , 1.00, 1.0 }, },
    [60] = { { LBRILLIANT , 0.99, 1.0 }, { NEXUS, 0.01, 1.0 }, },
    [65] = { { LBRILLIANT , 0.99, 1.0 }, { NEXUS, 0.01, 1.0 }, },
    [85] = { { SPRISMATIC , 0.99, 1.0 }, { NEXUS, 0.01, 1.0 }, },
    [99] = { { SPRISMATIC , 0.99, 1.0 }, { VOID , 0.01, 1.0 }, },
    [120] = { { LPRISMATIC , 0.99, 1.0 }, { VOID , 0.01, 1.0 }, },
    },
    },
    [EPIC] = {
    [WEAPON] = {
    [45] = { { SRADIANT , 1.00, 3.5 }, }, [50] = { { LRADIANT , 1.00, 3.5 }, },
    [55] = { { SBRILLIANT, 1.00, 3.5 }, }, [60] = { { NEXUS , 1.00, 1.0 }, },
    [65] = { { NEXUS , 1.00, 1.0 }, }, [85] = { { NEXUS , 1.00, 1.0 }, },
    [99] = { { VOID , 1.00, 1.0 }, }, [120] = { { VOID , 1.00, 1.5 }, },
    },
    [ARMOR] = {
    [45] = { { SRADIANT , 1.00, 3.5 }, }, [50] = { { LRADIANT , 1.00, 3.5 }, },
    [55] = { { SBRILLIANT, 1.00, 3.5 }, }, [60] = { { NEXUS , 1.00, 1.0 }, },
    [65] = { { NEXUS , 1.00, 1.0 }, }, [85] = { { NEXUS , 1.00, 1.0 }, },
    [99] = { { VOID , 1.00, 1.0 }, }, [120] = { { VOID , 1.00, 1.5 }, },
    },
    },
    }

    ----------------------------------------

    local watchList = {
    -- 10-19 weapons
    [1935] = 1500000, -- Assassin's Blade
    [1482] = 1300000, -- Shadowfang
    [890] = 360000, -- Twisted Chanter's Staff
    [2567] = 350000, -- Evocator's Blade
    [1318] = 340000, -- Night Reaver
    [1484] = 300000, -- Witching Stave

    -- 10-19 armor
    [2059] = 510000, -- Sentry Cloak
    [8350] = 490000, -- The 1 Ring
    [1486] = 490000, -- Tree Bark Jacket
    [1121] = 400000, -- Feet of the Lynx
    [12977] = 300000, -- Magefist Gloves

    -- 20-29 weapons
    [776] = 920000, -- Vendetta
    [4454] = 490000, -- Talon of Vultros
    [8226] = 450000, -- The Butcher
    [4446] = 410000, -- Blackvenom Blade
    [13033] = 400000, -- Zealot Blade
    [3413] = 390000, -- Doomspike
    [7730] = 300000, -- Cobalt Crusher

    -- 20-29 armor
    [9491] = 630000, -- Hotshot Pilot's Gloves
    [2264] = 780000, -- Mantle of Thieves
    [1978] = 530000, -- Wolfclaw Gloves
    [2039] = 500000, -- Plains Ring
    [9510] = 410000, -- Caverndeep Trudgers
    [13108] = 400000, -- Tigerstrike Mantle
    [2278] = 390000, -- Forest Tracker Epaulets
    [2292] = 390000, -- Necrology Robes
    [9509] = 370000, -- Petrolspill Leggings
    [1491] = 360000, -- Ring of Precision
    [7728] = 320000, -- Beguiler Robes
    [12998] = 300000, -- Magician's Mantle

    -- 30-39 weapons
    [873] = 2300000, -- Staff of Jordan
    [2825] = 1200000, -- Bow of Searing Arrows
    [870] = 1200000, -- Fiery War Axe
    [9425] = 1100000, -- Pendulum of Doom
    [869] = 1000000, -- Dazzling Longsword
    [1982] = 1000000, -- Nightblade
    [9424] = 580000, -- Ginn-su Sword
    [868] = 550000, -- Ardent Custodian
    [9426] = 430000, -- Monolithic Bow
    [9718] = 410000, -- Reforged Blade of Heroes
    [8223] = 390000, -- Blade of the Basilisk
    [13034] = 380000, -- Speedsteel Rapier
    [9384] = 380000, -- Stonevault Shiv
    [9392] = 330000, -- Annealed Blade
    [10570] = 320000, -- Manslayer
    [6327] = 320000, -- The Pacifier
    [13064] = 300000, -- Jaina's Firestarter
    [5756] = 300000, -- Sliverblade

    -- 30-39 armor
    [10583] = 1500000, -- Quillward Harness
    [2955] = 1400000, -- First Mate Hat
    [867] = 1100000, -- Gloves of Holy Might
    [9429] = 1100000, -- Miner's Hat of the Deep
    [1981] = 930000, -- Icemail Jerkin
    [7755] = 740000, -- Flintrock Shoulders
    [10574] = 660000, -- Corpseshroud
    [5257] = 540000, -- Dark Hooded Cape
    [9420] = 510000, -- Adventurer's Pith Helmet
    [10328] = 500000, -- Scarlet Chestpiece
    [1204] = 490000, -- The Green Tower
    [9431] = 410000, -- Papal Fez
    [1980] = 400000, -- Underworld Band
    [9396] = 370000, -- Legguards of the Vault
    [10332] = 370000, -- Scarlet Boots
    [13110] = 360000, -- Wolffear Harness
    [1718] = 350000, -- Basilisk Hide Pants
    [2277] = 350000, -- Necromancer Leggings
    [2951] = 350000, -- Ring of the Underwood
    [9375] = 320000, -- Expert Goldminer's Helmet
    [10581] = 310000, -- Death's Head Vestment
    [13117] = 300000, -- Ogron's Sash
    [13084] = 300000, -- Kaleidoscope Chain
    }

    ----------------------------------------

    -- calculate value of a stack of reagents based on
    -- auctioneer data and price tables above
    local getReagentValue = function(itemID, itemCount)
    local upperLimit = priceUpperLimit[itemID]
    local adjust = priceAdjustment[itemID] or 1

    if not upperLimit then return nil end

    local median, snapshot, snapshotCount = nil, nil, nil
    local _, link = GetItemInfo(itemID)
    if link then
    local key = Auctioneer.ItemDB.CreateItemKeyFromLink(link)
    if key then
    median = Auctioneer.Statistic.GetItemHistoricalMedianBuyout(key)
    snapshot, snapshotCount = Auctioneer.Statistic.GetItemSnapshotMedianBuyout(key)
    end
    end

    median = median or upperLimit
    snapshot = snapshot or upperLimit
    snapshotCount = snapshotCount or 1

    median = math.min(median, upperLimit)
    snapshot = math.min(snapshot, upperLimit)

    local snapshotWeight = 0
    if snapshotCount >= 5 and snapshot < median then
    snapshotWeight = math.log10(snapshotCount) / math.log10(20)
    end
    snapshotWeight = math.min(math.max(snapshotWeight, 0), 1)
    local medianWeight = 1 - snapshotWeight

    local combined = median * medianWeight + snapshot * snapshotWeight
    return combined * adjust * itemCount
    end

    -- take an ilevel and round it up to the corresponding bracket
    local roundupLevel = function(level)
    for _, bracket in pairs(levelUpperBounds) do
    if bracket >= level then
    return bracket
    end
    end
    return nil
    end

    -- get entry from disenchant table (or nil if nothing found)
    local getDisenchants = function(quality, type, level)
    if disenchantTable[quality] and disenchantTable[quality][type] and disenchantTable[quality][type][level] then
    return disenchantTable[quality][type][level]
    end
    return nil
    end

    -- calculate disenchant value of item based on disenchant table and
    -- calculated reagent values
    local getDisenchantValue = function(itemID)
    local result = nil
    local _, _, quality, level, _, typeString, _, _, _, _ = GetItemInfo(itemID)
    if quality >= UNCOMMON and quality <= EPIC and not badItem[itemID] then
    local type = typeStringToType[typeString]
    if type then
    level = roundupLevel(level)
    if level then
    local disenchants = getDisenchants(quality, type, level)
    if disenchants then
    result = 0
    for _, stats in pairs(disenchants) do
    local reagent, chance, count = stats[1], stats[2], stats[3]
    result = result + getReagentValue(reagent, chance * count)
    end
    end
    end
    end
    end
    return result
    end

    --------------------------------------------------------------------------------
    -- now decide what to do with the auction

    -- min profit for bid
    local bidMinProfitRel = 0.25
    local bidMinProfitAbs = 5000

    -- min profit for buy
    local buyMinProfitRel = 0.25
    local buyMinProfitAbs = 5000

    -- if buyout is close enough to low enough bid, just buy it anyway
    local buyMaxBidNear = 0.01

    -- adjust low bids upwards, but no closer to maximum bid than this
    local bidLess = 0.20

    -- assume item is worthless until proven otherwise
    basePrice = 0

    -- calculate disenchant value or reagent value depending on the type of item
    local disenchantValue = getDisenchantValue(itemID)
    if disenchantValue then
    basePrice = disenchantValue
    reason = "Disenchant"
    depositCost = 0
    depositRate = 0
    else
    local reagentValue = getReagentValue(itemID, itemCount)
    if reagentValue then
    basePrice = reagentValue
    reason = "Reagent"
    depositCost = 0
    depositRate = 0
    end
    end

    -- account for AH cut
    local resaleValue = basePrice * 0.95

    -- decide whether or not to buy

    local buyMaxRel = resaleValue * (1 - buyMinProfitRel)
    local buyMaxAbs = resaleValue - buyMinProfitAbs
    local bidMaxRel = resaleValue * (1 - bidMinProfitRel)
    local bidMaxAbs = resaleValue - bidMinProfitAbs

    if watchList[itemID] then
    basePrice = watchList[itemID]
    local bidMax = basePrice * 0.85
    if buyPrice ~= 0 and buyPrice <= bidMax then
    action = "buy"
    reason = "Watch List"
    elseif bidPrice ~= 0 and bidPrice <= bidMax then
    action = "bid"
    reason = "Watch List"
    end
    else
    if buyPrice ~= 0 and buyPrice <= buyMaxRel and buyPrice <= buyMaxAbs then
    action = "buy"
    reason = reason .. " (buy)"
    elseif bidPrice ~= 0 and bidPrice <= bidMaxRel and bidPrice <= bidMaxAbs then
    if buyPrice ~= 0 and bidPrice >= buyPrice * (1 - buyMaxBidNear) then
    action = "buy"
    reason = reason .. " (buy near bid)"
    else
    action = "bid"
    reason = reason .. " (bid, orig = " .. bidPrice .. ")"
    local bidRelUp = (resaleValue * (1 - bidMinProfitRel)) * (1 - bidLess)
    local bidAbsUp = (resaleValue - bidMinProfitAbs) * (1 - bidLess)
    bidPrice = math.max(bidPrice, math.min(bidRelUp, bidAbsUp))
    end
    end
    end
  1.  
    Posted By: DeckardI'm trying to write a watchlist baserule for BTM, but how can I find the itemID for items easily?


    If you're sure of the precise name, you could check that directly in your baserule.

    local watchList = {
    ["Enormous Glowing Blade of Sexual Insecurity"] = 10000000,
    ["Irritable Scarlet Attack Ferret"] = 500000,
    -- ...
    }

    local name = GetItemInfo(itemID)

    if watchList[name] and buyPrice ~= 0 and buyPrice <= watchList[name] then
    action = "buy"
    reason = "gief"
    end
    •  
      CommentAuthorDeckard
    • CommentTimeMar 4th 2007
     
    Posted By: Chardonnay
    Posted By: DeckardI'm trying to write a watchlist baserule for BTM, but how can I find the itemID for items easily?


    If you're sure of the precise name, you could check that directly in your baserule.

    local watchList = {
    ["Enormous Glowing Blade of Sexual Insecurity"] = 10000000,
    ["Irritable Scarlet Attack Ferret"] = 500000,
    -- ...
    }

    local name = GetItemInfo(itemID)

    if watchList[name] and buyPrice ~= 0 and buyPrice <= watchList[name] then
    action = "buy"
    reason = "gief"
    end


    :shocked:

    Thank you! I think...
    • CommentAuthorBishop
    • CommentTimeMar 5th 2007
     
    Thank you for this informative example, Chardonnay. Am I reading correctly that it does not appear to handle iLevels above 99 very well (or at all, really)?
  2.  
    Posted By: BishopAm I reading correctly that it does not appear to handle iLevels above 99 very well (or at all, really)?


    You're correct, it ignores ilevel 100+ items. My disenchanter is level 31 and so can't exceed skill 225 yet. :)
    • CommentAuthorBishop
    • CommentTimeMar 5th 2007
     
    Alright, thank you. Do you know of some place where one might glean the remaining information on DE-results that would be needed to complete your table? :)
  3.  
    Disenchant a few dozen ilevel 100+ items and see what happens. :P

    I would guess that the probabilities are the same, but you get greater planar essence instead of lesser, large prismatic shard instead of small, and arcane dust in larger quantities.
    • CommentAuthorBishop
    • CommentTimeMar 5th 2007
     
    I do actually have a modest amount of iLevel 100+ DE's under my belt, but I did not keep track of them per se. The question is: did Enchantrix? And if so, can I dig out that information?

    The only two I know for sure, because I wrote them down, are the Clefthoof Boots and the Clefthoof Leggings, both of which DE'ed into 1 Large Prismatic Shard.
  4.  
    Enchantrix should track them yes. Mine has decent numbers for many TBC items now - mainly crafted items like Netherweave Gloves. By looking at a few you should be able to come up with values that are close enough to reality to give useful results.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 6th 2007
     
    Chardonnay, that is an excellent example of a BTM Baserule. I'm not a coder, but you've commented it well so I can somewhat figure out what is going on in it.

    One question I have, for the price adjustment given to favorites/disfavorites, does the lower number indicate an item is less favored? Is 0.7 less favored than an item with a 1? Also, is 1 the highest anything should be set?

    Thanks, I'm sure I'll have more questions as I put it into action.
  5.  
    Yeah, the adjustment is a simple multiplier applied to the calculated value. 1.0 is nominal, <1.0 decreases the value, and >1.0 increases it. I guess you might go >1.0 if you really need a reagent to train up your enchanting and are prepared to pay over the odds for it.

    I use it mainly to stop my bags being overloaded with particular reagents. That's the part I need to get around to automating: tracking my stock and calculating an adjustment based on that. For the moment I just look at my bags, adjust the table manually and then run a scan.
    • CommentAuthorOnyx
    • CommentTimeMar 13th 2007 edited
     
    Posted By: BishopI do actually have a modest amount of iLevel 100+ DE's under my belt, but I did not keep track of them per se. The question is: did Enchantrix? And if so, can I dig out that information?

    The only two I know for sure, because I wrote them down, are the Clefthoof Boots and the Clefthoof Leggings, both of which DE'ed into 1 Large Prismatic Shard.

    I found these results for UNCOMMON items up to level 105 at least. It may even go up to 110, but I can't confirm that yet (what's the highest UNCOMMON itemlevel anyway?):

    [105] = { { ARCANE , 0.20, 3.5 }, { GPLANAR , 0.75, 1.5 }, { LPRISMATIC , 0.05, 1.0 }, },
    For RARE items I'm pretty sure it's:

    [105] = { { LPRISMATIC , 0.99, 1.0 }, { VOID , 0.01, 1.0 }, },

    If anyone else has more info, make it known so we can all benefit from it!

    Onyx.
    • CommentAuthorChardonnay
    • CommentTimeMar 13th 2007
     
    what's the highest UNCOMMON itemlevel anyway?

    120 for now

    http://www.wowhead.com/?items=4&filter=qu=2;minle=120 (Armor)
    http://www.wowhead.com/?items=2&filter=qu=2;minle=120 (Weapon)
    • CommentAuthorBishop
    • CommentTimeMar 13th 2007
     
    Hmm, that wowhead-site also has disenchant information for everything I could find. That should be usable to fill out the table completely.
    • CommentAuthorOnyx
    • CommentTimeMar 14th 2007 edited
     
    Posted By: BishopHmm, that wowhead-site also has disenchant information for everything I could find. That should be usable to fill out the table completely.

    Nice. Looking at the numbers there for iLevel 120 Armor I see them gravitating towards:

    Arcane Dust: 2-5 (avg 3.5, 75%)
    Greater Planar Essence: 1-2 (avg. 1.5, 20%)
    Large Prismatic Shard: 1 (5%)

    For iLevel 120 Weapons it seems to move towards:

    Greater Planar Essence: 1-2 (avg. 1.5, 75%)
    Arcane Dust: 2-5 (avg 3.5, 20%)
    Large Prismatic Shard: 1 (5%)

    I also checked for Armor and Weapons around iLevel 111 and the values appear to be the same and identical to what I already saw in Enchantrix for iLevel 105. There doesn't seem to be anything new happening after iLevel 105. If I'm correct completing the table for UNCOMMON items would then mean adding the following changes:

    Upper bounds:
    -- disenchanting level bracket upper bounds, e.g. an ilevel 52 item
    -- goes into bracket 55
    local levelUpperBounds = { 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 85, 99, 120}

    Weapons:
    [120] = { { ARCANE , 0.20, 3.5 }, { GPLANAR , 0.75, 1.5 }, { LPRISMATIC , 0.05, 1.0 }, },
    Armor:
    [120] = { { ARCANE , 0.75, 3.5 }, { GPLANAR , 0.20, 1.5 }, { LPRISMATIC , 0.05, 1.0 }, },

    For the sake of internal consistency the other tables will need to be extended for iLevel 120 too, or you will eventually run in to some type of array-index-out-of-bounds error. So, if anyone has details on the disenchants for RARE and EPIC items... do tell :bigsmile:

    I'll be trying out this rule over then next couple of days.

    Greetz,

    Onyx.
    • CommentAuthorBishop
    • CommentTimeMar 14th 2007
     
    Searching for rare quest rewards above ilvl 100 reveals that each and every one of those appear to only ever disenchant into 1 large prismatic shard, even those DE'ed in excess of 100 times. It seems plausible, however, that the progression would be similar to lower rares, ie LPRISMATIC 0.99, 1.0 VOID 0.01, 1.0 (recall that there is no difference between weapons and armor above rarity lvl 2).

    For epixx, the few I could find with DE information show that they DE into 1-2 Void crystals, which seems plausible as well, ie VOID 1.00, 1.5

    If you feel like an active fella, Onyx, you could write up the completed list and, say, put it on the wiki. Or just in this thread for starters. I'm sure that'd be appreciated. At least by me. ;)
    • CommentAuthorChardonnay
    • CommentTimeMar 14th 2007
     
    Thanks for the research guys, updated the tables in my original post with your values.

    BTW, the chance of a blue yielding a crystal is probably less than 1% - I think I've seen it happen perhaps two or three times - but 1% is low enough to have a near-negligable effect on the overall item value. They're only in the table for completeness really, I could just remove them.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 14th 2007
     
    Chardonnay, I have another question about configuring the baserule for optimal results and being more selective about what it finds.

    Let's say I like to buy level 36-40 green armor (equip level, not item level). It DEs into Vision Dust, Lesser Nether Essence or a Small Radiant Shard. Now, I don't want to pay more than 1 gold for one of those armor items, that leaves me with a comfortable profit on my server. How can I modify your baserule example above not to trigger if the buyout price for one of these items is above 1g?

    If you can give me some help about what section(s) to modify for this purpose it would be greatly appreciated. I want BTM to get a lot pickier about what it's finding for me, and I think if you can show me where to start, I can modify the baserule for all DE candidates. Thanks!
    • CommentAuthorBishop
    • CommentTimeMar 14th 2007
     
    Chardonnay,

    Originally when you posted this version, I believe you had it use the manually entered baseline values (almost?) exclusively. But if I am reading the current version correctly, it only ever uses the baseline prices if there is no historical and/or snapshot data?
    • CommentAuthorBishop
    • CommentTimeMar 14th 2007
     
    Deckard,

    Have you considered simply setting your required profit margin on DE higher than your current setting? That is probably the best way to get the results you want.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 14th 2007
     
    Bishop, sound dandy to me. How would I do that? As I explained in my first post above, I'm not a Lua coder, nor do I know what all the variables and constants are. I assume the section you're referring to is this:

    -- min profit for bid
    local bidMinProfitRel = 0.25
    local bidMinProfitAbs = 5000

    -- min profit for buy
    local buyMinProfitRel = 0.30
    local buyMinProfitAbs = 10000


    So what does the 0.25 for bidMinProfitRel represent, 25 silver? What is bidMinProfitAbs set to 5000? Does the 5000 represent 5000 copper (50 silver)?

    When I stated I'm a noob at coding and trying to understand it, I wasn't joking. :cry:
    • CommentAuthorChardonnay
    • CommentTimeMar 14th 2007
     
    So what does the 0.25 for bidMinProfitRel represent, 25 silver? What is bidMinProfitAbs set to 5000? Does the 5000 represent 5000 copper (50 silver)?


    bidMinProfitRel is minimum profit RELative to resale value: 0.25 means we won't bid more than 75% of resale value
    bidMinProfitAbs is minimum ABSolute profit in copper: 5000 means we won't bid more than 50 silver below resale value

    Originally when you posted this version, I believe you had it use the manually entered baseline values (almost?) exclusively. But if I am reading the current version correctly, it only ever uses the baseline prices if there is no historical and/or snapshot data?


    Yeh, in the version I'm currently running I only use the baseline prices as a fallback. Prices are still moving around quite a lot and it was easier to just let Auctioneer figure it out. Unfortunately Auctioneer can be fooled by price-jackers and scammers, so that's not ideal either.
    • CommentAuthorOnyx
    • CommentTimeMar 15th 2007
     
    Posted By: Bishop
    If you feel like an active fella, Onyx, you could write up the completed list and, say, put it on the wiki. Or just in this thread for starters. I'm sure that'd be appreciated. At least by me. ;)

    Think Chardonnay beat me to it, he's already updated the baserule posted in this thread. Or were you looking for something else?

    Posted By: Deckard
    So what does the 0.25 for bidMinProfitRel represent, 25 silver? What is bidMinProfitAbs set to 5000? Does the 5000 represent 5000 copper (50 silver)?

    0.25 means 25% minProfit, all prices are in coppers. So indeed 5000 = 50s.

    Onyx.
    • CommentAuthorBishop
    • CommentTimeMar 15th 2007
     
    Posted By: OnyxThink Chardonnay beat me to it, he's already updated the baserule posted in this thread. Or were you looking for something else?
    No, you're right, he did. And it was exactly what I was talking about. :)

    Posted By: ChardonnayYeh, in the version I'm currently running I only use the baseline prices as a fallback. Prices are still moving around quite a lot and it was easier to just let Auctioneer figure it out. Unfortunately Auctioneer can be fooled by price-jackers and scammers, so that's not ideal either.
    Thanks, that confirms that I'm getting better at reading lua. :)

    Oh, and thanks also for updating the rule, I think it is time for me to swtich from my very simple baserule+defaults to using yours more actively.

    However, I have a question/suggestion. Currently, your baserule will effectively prevent buying/bidding on items for resale, because it sets basePrice = 0 for all items we do not specifically want to buy. But if I am figuring correctly, it really does not have to be that way. We could simply return nil for items that we do not care about, rather than setting basePrice, thus allowing the main BTM function to bid or buy for resale. And on top of that, I would personally like to use my don't-resell-greens rule.

    Accordingly, I am considering using the baserule above with the following modifications:
    - basePrice = 0
    + local myBasePrice = 0

    - basePrice = disenchantValue
    + myBasePrice = disenchantValue

    - basePrice = reagentValue
    + myBasePrice = reagentValue

    - local resaleValue = basePrice * 0.95
    + local resaleValue = myBasePrice * 0.95

    + local _,_, quality, _, _, class, _,_,_ = GetItemInfo(itemID)
    + if (quality==2 and (class =="Weapon" or class == "Armor"))
    + then
    + basePrice = 0
    + end

    Comments, suggestions or pointing out mistakes in my reasoning and/or lua would be most welcome. :)
    • CommentAuthorBishop
    • CommentTimeMar 15th 2007 edited
     
    Posted By: DeckardBishop, sound dandy to me. How would I do that? As I explained in my first post above, I'm not a Lua coder, nor do I know what all the variables and constants are. I assume the section you're referring to is this:
    -- min profit for bid
    local bidMinProfitRel = 0.25
    local bidMinProfitAbs = 5000

    -- min profit for buy
    local buyMinProfitRel = 0.30
    local buyMinProfitAbs = 10000
    So what does the 0.25 for bidMinProfitRel represent, 25 silver? What is bidMinProfitAbs set to 5000? Does the 5000 represent 5000 copper (50 silver)?

    When I stated I'm a noob at coding and trying to understand it, I wasn't joking.

    As the others have stated, you've found the right place. Specifically, let's say you'd like to make sure the relative profit on all the DE suggestions BTM makes is at least 50%, rather than the currently configured 25%, you would change the relative profit margins to:local bidMinProfitRel = 0.50
    local buyMinProfitRel = 0.50
    ... which is likely what I would do. Chardonnay likes to make sure he makes a bigger profit on buys than on bids, I personally don't care. I believe I have it set even higher in my basic btm config at the moment.
    • CommentAuthorOnyx
    • CommentTimeMar 15th 2007
     
    Here's an update with today's median prices on Allakhazam, once again up to the last copper:

    -- These are market norm prices.
    -- Median prices from Allakhazam.com, Mar 15, 2007
    const.StaticPrices = {
    [20725] = 75000, -- Nexus Crystal
    [14344] = 110000, -- Large Brilliant Shard
    [11178] = 87710, -- Large Radiant Shard
    [11139] = 26125, -- Large Glowing Shard
    [11084] = 10000, -- Large Glimmering Shard
    [14343] = 22500, -- Small Brilliant Shard
    [11177] = 70000, -- Small Radiant Shard
    [11138] = 5349, -- Small Glowing Shard
    [10978] = 3500, -- Small Glimmering Shard
    [16203] = 115000, -- Greater Eternal Essence
    [11175] = 60000, -- Greater Nether Essence
    [11135] = 10000, -- Greater Mystic Essence
    [11082] = 9285, -- Greater Astral Essence
    [10939] = 5998, -- Greater Magic Essence
    [16202] = 43500, -- Lesser Eternal Essence
    [11174] = 23333, -- Lesser Nether Essence
    [11134] = 5000, -- Lesser Mystic Essence
    [10998] = 4066, -- Lesser Astral Essence
    [10938] = 3000, -- Lesser Magic Essence
    [16204] = 21000, -- Illusion Dust
    [11176] = 8750, -- Dream Dust
    [11137] = 5500, -- Vision Dust
    [11083] = 3453, -- Soul Dust
    [10940] = 1275, -- Strange Dust
    [22445] = 20000, -- Arcane Dust
    [22447] = 22325, -- Lesser Planar Essence
    [22446] = 68000, -- Greater Planar Essence
    [22448] = 64600, -- Small Prismatic Shard
    [22449] = 190000, -- Large Prismatic Shard
    [22450] = 997500, -- Void Crystal
    }


    Enjoy,

    Onyx.
    • CommentAuthorChardonnay
    • CommentTimeMar 15th 2007 edited
     
    Posted By: BishopHowever, I have a question/suggestion. Currently, your baserule will effectively prevent buying/bidding on items for resale, because it sets basePrice = 0 for all items we do not specifically want to buy.


    I did that because when I run my rule on a "clean" AH (not bidding on anything already) I typically have 200+ btm dialogs popping up. When clicking through that many it's a lot easier if I have only one buy-reason to worry about.

    But if I am figuring correctly, it really does not have to be that way. We could simply return nil for items that we do not care about, rather than setting basePrice, thus allowing the main BTM function to bid or buy for resale. And on top of that, I would personally like to use my don't-resell-greens rule.


    Your changes look like they should work fine.

    BTW you should never return from a baserule unless you're really familiar with Btm's internals. The baserule isn't itself a function but a code snippet that's "pasted" into a larger function, and returning early from that could cause Bad Things(tm) to happen. Instead just leave the basePrice untouched and the built-in rules can do their stuff.

    Chardonnay likes to make sure he makes a bigger profit on buys than on bids, I personally don't care.


    That's me gambling - save a little cash and take the chance I'll be outbid. If only I had some way of estimating that chance. :)
    • CommentAuthorBishop
    • CommentTimeMar 16th 2007
     
    Okay, so I implemented the changes we've discussed, made very minor tweaks, updated the baseprices and committed it all as my baserule.

    And it does work. Just... not as well as expected. As I was purchasing items for DE, I noticed a trend that certain items would be considered for bid/buy'ing, even though I knew from experience and from built-in Auctioneer/Enchantrix function that there was little or no profit to be made from the item.

    So, to troubleshoot a little, I added a few lines to the buying function to set the basePrice, thus allowing me to see the figure that "our" baserule had come up with. See http://pastebin.ca/397681 for full baserule code that I was working with.

    And sure enough, that basic test confirmed what I was suspecting: something is wonky. Or at least not evaluating as I would have expected. Below, I have included a couple of screenshots that showcase some of the worst-case items, where it is obvious that the valuation made by the baserule is completely off (compare the "Valued at"-tag in the bid window to the HSP in the tooltip).





    What this means, is that currently the basic Auctioneer/Enchantrix DE-evaluation is still much more accurate for me, even though it has trouble with items above a certain iLevel.

    My question is, does anyone have a suggestion as to what is going wrong and possibly how to fix this behavior?
    • CommentAuthorChardonnay
    • CommentTimeMar 16th 2007 edited
     
    Looks like your snapshot median for Greater Nether Essence is jacked up. Try the updated getReagentValue I pasted a while ago in another thread; I just updated the copy in the original baserule above too. It ignores the snapshot median if there are fewer than 5 items in the snapshot and/or the median is greater than the historical price.
    • CommentAuthorBishop
    • CommentTimeMar 16th 2007
     
    I think you are right, there may just have been a single Lesser Nether on the AH for 99g at the time. I'll try the improved getReagentValue and report back how it goes. Thanks. :)
    • CommentAuthorBishop
    • CommentTimeMar 16th 2007
     
    Hmm, I think you accidentally destroyed some code in the example above when updating the getReagentValue. At least I am no longer seeing the roundupLevel or getDisenchant functions or equivalent?
    • CommentAuthorChardonnay
    • CommentTimeMar 16th 2007
     
    You're quite right. They're back now. Not the only code I've broken today either... :(
    • CommentAuthorBishop
    • CommentTimeMar 16th 2007
     
    It happens. And this thread does not have versioning. ;)

    On a side note, the improved getReagentValue function seems to have solved my issue in a prelim run. I'll do some real trading with it tomorrow.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 17th 2007
     
    Posted By: Bishop
    Accordingly, I am considering using the baserule above with the following modifications:
    - basePrice = 0
    + local myBasePrice = 0

    - basePrice = disenchantValue
    + myBasePrice = disenchantValue

    - basePrice = reagentValue
    + myBasePrice = reagentValue

    - local resaleValue = basePrice * 0.95
    + local resaleValue = myBasePrice * 0.95

    + local _,_, quality, _, _, class, _,_,_ = GetItemInfo(itemID)
    + if (quality==2 and (class =="Weapon" or class == "Armor"))
    + then
    + basePrice = 0
    + end

    Comments, suggestions or pointing out mistakes in my reasoning and/or lua would be most welcome. :)


    Hi Onyx, thanks for posting that section. I would also like to add items back into the mix for resell and would love to use your code to do so. I just need to understand the syntax of your post. By the leading dash/minus symbol, does that mean to remove that line from the code and replace it with the one below it with the plus symbol (leaving those symbols out of the code, of course)? Conversely, could you post your code segment in its entirety as you have it in your baserule, so I can copy/paste it into mine? That would be very helpful for noobs like me.

    :bigsmile:
    • CommentAuthorBishop
    • CommentTimeMar 17th 2007
     
    Hi, I'm Bishop and I'm the one who wrote the code snippet you're quoting. Better leave Onyx out of my newbie lua skills. ;)

    As far as the changes, you understood the diff-syntax correctly. Not being 100% sure which bits you'd like, I figure I'll just give you the most recent version of my current baserule (which is just a modified version of Chardonnays above) and you can take whatever bits you like or paste it verbatim if you can't figure out what to take.

    Baserule
    •  
      CommentAuthorDeckard
    • CommentTimeMar 17th 2007 edited
     
    Ah, thanks Bishop, my bad for quoting Onyx for that.

    I'll give yours a whirl then and let you know how it goes. I have basically done the same, only changing the bidMinProfitRel and buyMinProfitRel options to suit my needs, and adding a watchlist for stuff I want to go after. I'm basically trying to cut down on the number of hits that it brings up while doing an AH scan with BottomScanner running at the same time.

    I've found using BottomScanner to be very profitable, and best I can tell, I'm one of the very few people on my server actually using it. Only once or twice have I been unable to buy something because someone else already had. Auctioneer was already a wonderful tool, with BottomScanner added, it's a real killer!
    •  
      CommentAuthorDeckard
    • CommentTimeMar 19th 2007 edited
     
    I just noticed this statement in the wiki for BottomScanner about Baserules, and I don't believe it's accurate given the Baserules posted here in this thread:

    "When BottomScanner suggests purchasing items for "disenchant" and for "vendor", it is not using the BaseRule at all. There is nothing you can do in a BaseRule which will make the disenchant or vendor purchase suggestion any more or less likely. These things are only controllable using the BottomScanner commands mindeprofit, pctdeprofit, and vendprofit."

    Hasn't DE purchase recommendation been one of the things we're modifying with Chardonnay's baserule and tweaks to it? Lemme know and I'll correct it in the wiki, since I don't believe that's true. Anyone else is welcome to as well.
    •  
      CommentAuthordinesh
    • CommentTimeMar 20th 2007 edited
     
    Chardonnay's changes are actually making changes to some quasi-global variables we have defined. These changes are made earlier, when the resale check is done. They are also made pretty inefficiently (getting repeatedly called for every item), but that is because that's the only way we let you do it at the moment.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 20th 2007
     
    OK, that makes sense to me. I don't need to change it myself then, just wanted to be sure it was accurate given what is actually possible.
    •  
      CommentAuthordinesh
    • CommentTimeMar 20th 2007
     
    also, i had confused the contents of Chard's post with what Onyx posted. Chard's rule actually defines bunches of local functions and variables, and actually only sets the "buy" action for items in the baserule. it does this to mimic (and shortcut) the disenchant calc which we would otherwise do afterwards. in fact, if his baserule does not lead to a bid/BO decision, i believe we would continue on and do our own d/e calculation thereafter (proving that the baserule won't affect the d/e calc or vendor calc at all).
    • CommentAuthorBishop
    • CommentTimeMar 20th 2007
     
    Having used a derivative for some time now, I can say with certainty that you are correct, dinesh. The "standard" btm DE rules will apply after the baserule finishes running. Which, of course, is easily skipped simply by setting mindeprofit to 100g or similar.

    Note also, as mentioned above, that Chardonnay's version intentionally short-circuits the standard resale and vendor bid/buy equations.
    • CommentAuthorChardonnay
    • CommentTimeMar 20th 2007
     
    Yeah, actually I thought of using action = "ignore" for items the baserule didn't like, but some of the built-in rules ignore it. Hiking up min*profit is the only way to suppress the built-in rules at the moment. IMO the baserule's decision should take precedence over everything else.
    •  
      CommentAuthordinesh
    • CommentTimeMar 21st 2007
     
    perhaps. the original BTM had no "action" at all, so clearly we weren't thinking about it in the process flow. for that matter, the original didn't have a baserule either. i'm not positive that I agree it should take precedence, anyway... i guess i need to think about it.
    • CommentAuthorMynthea
    • CommentTimeMar 21st 2007
     
    Considering that the baserule is really the only flexible way for users to influence the decision making of btm, I would vote for baserule taking precedence.

    I think of it like this: btm offers filtering functionality for picking up deals from the AH. It does so by giving you a set of variables that affect the basic filtering going on. It also allows you to extend or fully customize the filtering through the baserule if you are so inclined.

    You are not taking anything away by giving baserule precedence, just giving more options for the advanced users. But that's just my 2 cents, as always.

    m.
    •  
      CommentAuthordinesh
    • CommentTimeMar 21st 2007 edited
     
    Hmm, I see it like this. There are three things BTM does right now: looks for resales, looks for disenchants, and looks for vendors. there are three sets of parameters that control this behavior. [remember, there was originally no baserule, this was all there was. Though possibly the vendoring got added after the first BaseRule implementation did, I don't recall for sure.]

    Then we added the baserule. it was intended only to help advanced users better calculate the "valuation" price, using sophisticated (and highly personal) user-defined rules. this valuation price was only used by the resale calculation. nothing with disenchanting or vendoring was changed. other than this more advanced valuation, nothing else changed.

    Then we added the "action" flag. This was a natural extension of functionality. It is analogous to the snatch functionality we had also previously added - basically saying: "Forget the valuation and profit calculations...there are some items I just want". Only now we gave you the tools to be MUCH more flexible in determining which items you would want to "snatch", it was no longer just based on a single price for a single item.

    Now, here's the heart of the matter. I don't think we ever made any conscious decision to do this, but when we added the action tag, we added it so that it continued the trend of only affecting the resale calculation.

    We could, easily, say that if you add a custom baserule, then it will void out all three default BTM functions: resale, de, and vendor. But this would mean that the minimal baserule less-advanced users would have to play with in order to not lose any functionality just got three times more complicated. The simplest baserule would now have to handle all three cases.

    Don't forget that lots of baserule users still just use it to just set a more appropriate valuation for the item, they don't even use the action tag!

    Bottom line: I can appreciate that advanced users might WANT to turn off the default processing, but I don't want to have to force every baserule user to HAVE TO turn it off. Perhaps the best way to accomplish this would be to have two ignore switches - one which turns it off just for resale, and one which turns it off for all three. But this solution seems somewhat inelegant to me - I'm sure we can come up with something better.
    • CommentAuthorMynthea
    • CommentTimeMar 21st 2007
     
    How about setting a separate base price for each basic routine?

    Say, resalePrice for resale, disenchantPrice for DE and vendorPrice for vendoring. Setting one price to zero would cause that basic routine to ignore the item as worthless.

    This would allow more flexibility for baserule while retaining the idea of letting basic routines do their job based on custom evaluation.

    m.
    • CommentAuthorChardonnay
    • CommentTimeMar 21st 2007 edited
     
    Posted By: dineshI can appreciate that advanced users might WANT to turn off the default processing, but I don't want to have to force every baserule user to HAVE TO turn it off. Perhaps the best way to accomplish this would be to have two ignore switches - one which turns it off just for resale, and one which turns it off for all three. But this solution seems somewhat inelegant to me - I'm sure we can come up with something better.


    I don't think we'd need any new flags, just a slight change to the behaviour of the existing ones.

    1) If the baseRule sets basePrice, it affects the built-in resale rule (no change there)
    2) If the baseRule sets an action, it affects all of the built-in rules
    a) action = "bid" : bid at least, but the built-in rules could still elevate that to a buy (currently, the built-ins may cause the item to be ignored)
    b) action = "buy" : buy no matter what
    c) action = "ignore" : ignore no matter what (currently, the built-ins may still decide to bid or buy)

    That way, simple valuation baserules see no change in behaviour, but more sophisticated rules can easily override the built-ins if desired.

    when we added the action tag, we added it so that it continued the trend of only affecting the resale calculation.


    But is that the way it should be? It was already possible to completely control the resale rule by adjusting basePrice.
    •  
      CommentAuthordinesh
    • CommentTimeMar 21st 2007
     
    Hmm, i suppose we could just make ignore force an ignore for all rules. if you just want to ignore for resale, you can just set the baseprice to 0 i suppose.

    are you sure about 2a? I am not looking at the code, but i could swear that once you set action to bid, then it will minimally be bid upon. it may get bought out instead (if there is more profit by doing so for de or vendor). but it shouldn't ever get ignored.
    • CommentAuthorChardonnay
    • CommentTimeMar 21st 2007
     
    2(a) yeah, in the vendor rule for instance there's:

    if (iBuy > vendorValue * 100) then ignoreIt = true end

    So you can miss good bids on items because of a crazy buyout.
    • CommentAuthorMynthea
    • CommentTimeMar 21st 2007
     
    I personally like the vendor rule and would hate to see it go if I choose to "ignore" because the de rule is giving me nonsense evaluations. Of course I can still set the mindeprofit to sky high or handle the vendor logic in baserule, but that's either putting me where we started off or wasting time on baserule logic that could be done more efficiently elsewhere.

    I realize that I'm sort of contradicting my earlier vote for baserule precedence, but I was really hoping for more options. I do agree that setting "ignore" should force basic rules to do just that, but only having "Ignore all" would be too limiting in my opinion. Even though it's better than the current way.

    Ultimately I'd like to have the option of disabling each individual basic rule in the baserule if I so choose. Of course it's pretty easy to state preference when you guys/gals are doing the hard work.

    m.
    •  
      CommentAuthorNorganna
    • CommentTimeMar 21st 2007
     
    I think that what you guys are talking about should include:

    Bringing the vendorPrice and disenchantPrice values into the baserule, if modified, bottomscanner will use them instead.

    Perhaps adding a force = true to the baserule should cause the action to be carried out to the exclusion of all other rules.
    Ie: if you set both an action and force = true, then upon the exit of the baserule it immediatly executes the action and exits the loop, thereby skipping all the other checks and balances.

    This would allow the maximum flexibility, you could specify action=buy, force=true in one part of the rule, and action=ignore in another (without forcing). This would allow you to differentiate between orders that must be carried out, regardless of any other conditions, and orders where you want the normal "other" rules to take place.
    • CommentAuthorOnyx
    • CommentTimeMar 22nd 2007
     
    Posted By: NorgannaI think that what you guys are talking about should include:

    Bringing the vendorPrice and disenchantPrice values into the baserule, if modified, bottomscanner will use them instead.

    Guess so, Chardonnay's rule was made mostly to work around a valid and dynamic disenchantPrice being unavailable. Getting this price as a variable would simplify matters greatly.


    Perhaps adding a force = true to the baserule should cause the action to be carried out to the exclusion of all other rules.
    Ie: if you set both an action and force = true, then upon the exit of the baserule it immediatly executes the action and exits the loop, thereby skipping all the other checks and balances.

    Sounds like a nice trigger to circumvent the other rules. This would give advanced users almost full control over the decision process with their baserules.

    Onyx.
    • CommentAuthorMynthea
    • CommentTimeMar 22nd 2007
     
    Posted By: NorgannaI think that what you guys are talking about should include:

    Bringing the vendorPrice and disenchantPrice values into the baserule, if modified, bottomscanner will use them instead.


    Hmm, I really like that idea... :tongue:

    But seriously, all Norganna's suggestions sound good. They would solve a lot of issues, at least for me.

    m.
    • CommentAuthorChardonnay
    • CommentTimeMar 22nd 2007 edited
     
    Two tickets now open on this:

    http://www.auctioneeraddon.com/scm/ticket/1508
    http://www.auctioneeraddon.com/scm/ticket/1509

    Norgs, I'm not sure the a "force" option would be necessary if we can override all of the built-in prices. The only one I would leave open is "snatch" because I believe that's intended to override everything.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 22nd 2007 edited
     
    I'm using Chardonnay's baserule with some minor modifications, with a watchlist in it too. Is there a way to have my watchlist pricing take precedence over the rest of the baserule, so that if anything found at a higher price than that on my watchlist, it will simply be ignored? I still find that BTM is popping up with things to DE at prices higher than I wish to pay, and having my watchlist be the ultimate arbiter would solve that issue for me.

    Thanks in advance!
    • CommentAuthorMynthea
    • CommentTimeMar 23rd 2007
     
    Deckard, that's pretty much what we've been discussing here. Way's to allow your baserule to override the basic routines.

    Currently you can only disable the DE routine by setting the mindeprofit variable to sky high so that no items will evaluate as profitable deals. The DE routine doesn't use the basePrice variable so you can't bypass the it by setting the variable to zero. Vendor routine follows the same lines.

    But hopefully we'll get a way to disable them sometime in the future. =)

    m.
    • CommentAuthorhandnavi
    • CommentTimeMar 23rd 2007
     
    Hello, can one of you please share his baserule? :-)
    I followed this thread for a long time and now i want to try it by myself, but the link ( http://pastebin.ca/397681 ) is down :X

    Thanks in advance :grouphug:
    •  
      CommentAuthordinesh
    • CommentTimeMar 23rd 2007
     
    have you read the wiki? there are many baserules listed there.
    •  
      CommentAuthorDeckard
    • CommentTimeMar 23rd 2007 edited
     
    I want my watchlist, which is included in my baserule (Chardonnay's from this thread), to OVERRIDE the recommendations the rest of the baserule is making for me, the DE suggestions. That is, if something is priced more than my watchlist has it set to, it will be ignored and skipped, never popping up a BTM dialog at all. I don't what the DE portion of the baserule to be ignored completely, just for those items in my watchlist. Get it?


    Run your watchlist code after the disenchant valuation, and adjust the output vars (action="...", basePrice=...) if the item matches your conditions?
    •  
      CommentAuthordinesh
    • CommentTimeMar 23rd 2007
     
    err, that is precisely the kind of thing that has been proposed. You would have access to some variable like disenchantPrice (which is similar to basePrice). You could use whatever complicated logic you wanted to determine whether or not you wanted to accept the default disenchantPrice, or replace it with some other price, or set it to 0 if you want to ignore the item for disenchanting.
    • CommentAuthorBishop
    • CommentTimeMar 23rd 2007 edited
     
    Posted By: handnaviHello, can one of you please share his baserule? :-)
    I followed this thread for a long time and now i want to try it by myself, but the link ( http://pastebin.ca/397681 ) is down :X

    Thanks in advance

    Seems like pastebin.ca broke. I guess you get what you pay for. Try this link for my current baserule: http://www.copypot.com/2519
  6.  
    You do know we have our own pasting service right? Although I would prefer that any good-ish baserules be in the Wiki for posterity.
    • CommentAuthorehmgee
    • CommentTimeApr 4th 2007
     
    After yesterday's patch when I use the rule at the top I get this:

    Date: 2007-04-04 10:11:43
    ID: 4
    Error occured in: Hooked Function
    Count: 1
    Message: Error while calling hook:
    Hook name:
    EnhTooltip.AddTooltip
    [string "local consKey = BtmScan.prices.consKey..."] line 299:
    attempt to compare number with nil
    Instantiated from:
    ..\AddOns\BtmScan\btmMain.lua line 86:
    in function `OnLoad'
    Debug:
    [string "local consKey = BtmScan.prices.consKey..."]:299: getDisenchantValue()
    [string "local consKey = BtmScan.prices.consKey..."]:336: BaseRule()
    BtmScan\btmMain.lua:1647:
    BtmScan\btmMain.lua:1574
    (tail call): ?
    [C]: xpcall()
    Stubby\Stubby.lua:327:
    Stubby\Stubby.lua:292
    (tail call): ?
    EnhTooltip\Tooltip.lua:1139: TooltipCall()
    BtmScan\btmMain.lua:1766:
    BtmScan\btmMain.lua:1752

    Anyone else see it?
    • CommentAuthorBishop
    • CommentTimeApr 4th 2007
     
    Posted By: MentalPowerYou do know we have our own pasting service right? Although I would prefer that any good-ish baserules be in the Wiki for posterity.

    No, I didn't know that. Nifty though. :)
    • CommentAuthorjeff2007
    • CommentTimeApr 20th 2007
     
    Hello all. Thanks for making this great tool. I just found this the other day and started to use it. It has helped out a lot. Bishop, I copied your baserule and was wondering how to make updates to it. I noticed that Onyx showed an update of the median prices from Allakhazam. So how do you upated that info? just fine where the info is in the baserule and copy over it with the new info? Thanks
    • CommentAuthorBishop
    • CommentTimeApr 20th 2007
     
    Yes, that's how. But you don't really need to keep the base-line prices very up to date if you have a decent number of AH scans under your belt as the baseline prices are only used when there is no data available from Auctioneer.
    • CommentAuthorOnyx
    • CommentTimeApr 23rd 2007
     
    Posted By: jeff2007Hello all. Thanks for making this great tool. I just found this the other day and started to use it. It has helped out a lot. Bishop, I copied your baserule and was wondering how to make updates to it. I noticed that Onyx showed an update of the median prices from Allakhazam. So how do you upated that info? just fine where the info is in the baserule and copy over it with the new info? Thanks

    Yup, that's the way to update. I'll try and get a new update posted this week btw, since the old one's about a month old now. Prices seem to have stabilized pretty much though.

    Onyx.
    • CommentAuthorgnarl
    • CommentTimeApr 23rd 2007
     
    I actually just updated this yesterday. Here's what I came up with...the prices moved a little (Void Crystal) dropped a bunch...

    -- These are market norm prices.
    -- Median prices from Allakhazam.com, Apr 22, 2007
    const.StaticPrices = {
    [20725] = 75000, -- Nexus Crystal
    [14344] = 110000, -- Large Brilliant Shard
    [11178] = 85000, -- Large Radiant Shard
    [11139] = 27000, -- Large Glowing Shard
    [11084] = 10000, -- Large Glimmering Shard
    [14343] = 26000, -- Small Brilliant Shard
    [11177] = 70000, -- Small Radiant Shard
    [11138] = 5000, -- Small Glowing Shard
    [10978] = 4000, -- Small Glimmering Shard
    [16203] = 109999, -- Greater Eternal Essence
    [11175] = 60000, -- Greater Nether Essence
    [11135] = 10000, -- Greater Mystic Essence
    [11082] = 8333, -- Greater Astral Essence
    [10939] = 6175, -- Greater Magic Essence
    [16202] = 44400, -- Lesser Eternal Essence
    [11174] = 23700, -- Lesser Nether Essence
    [11134] = 5000, -- Lesser Mystic Essence
    [10998] = 3800, -- Lesser Astral Essence
    [10938] = 3300, -- Lesser Magic Essence
    [16204] = 23920, -- Illusion Dust
    [11176] = 8000, -- Dream Dust
    [11137] = 5000, -- Vision Dust
    [11083] = 3000, -- Soul Dust
    [10940] = 1275, -- Strange Dust
    [22445] = 22000, -- Arcane Dust
    [22447] = 20000, -- Lesser Planar Essence
    [22446] = 60000, -- Greater Planar Essence
    [22448] = 60000, -- Small Prismatic Shard
    [22449] = 190000, -- Large Prismatic Shard
    [22450] = 750000, -- Void Crystal
    }
    • CommentAuthorOnyx
    • CommentTimeApr 26th 2007
     
    Bishop is right about the baselines not really being necesarry if your scans are up to date. Still, thanks for updating the list :bigsmile:

    Onyx.
    • CommentAuthorChardonnay
    • CommentTimeApr 26th 2007 edited
     
    Posted By: OnyxBishop is right about the baselines not really being necesarry if your scans are up to date.


    I use that table now to set an upper limit on the value of each reagent: catches cases where Auctioneer gets confused by an increase in price that is not sustainable. For instance, lower level reagents are mostly used by people levelling up their own enchanting; if you have several players doing that at once, the reagents can double or triple in price for a short time, but they drop sharply again when they've moved on. I don't want to be bidding on things at the high price only to be unable to get rid of them at a profit (at least until the next rush).
    • CommentAuthorxhepera
    • CommentTimeApr 26th 2007
     
    Okay. Silly question of the day: Is the so-called DE baserule only used to identify buys for disenchanting? Or will it serve as a general baserule as well? Can it be appended to an existing baserule? Or should it replace an existing baserule? Sorry for all the questions. I'm not real bright when it comes to this stuff.
    • CommentAuthorChardonnay
    • CommentTimeApr 26th 2007
     
    It looks for items to disenchant and enchanting reagents. That's it. You could merge it with other baserules, but simply appending it might not work - you would have to understand the code a little to be sure they wouldn't interfere with one another.
    • CommentAuthorChardonnay
    • CommentTimeApr 27th 2007
     
    Pasted in my current version, including my twink watchlist. :)
    • CommentAuthorxhepera
    • CommentTimeApr 27th 2007
     
    Thanks very much. I don't understand the coding ins-and-outs enough to merge the two. Since it seems I get most of my Bottomscanner deals from disenchants, I'll try replacing my existing baserule with yours and see what happens. :) The resale stuff I do mainly comes from doing the percentless 50 on the search tab, so I doubt I'll miss much.
    • CommentAuthorBishop
    • CommentTimeApr 27th 2007
     
    Very nifty watchlist, Chardonnay. Isn't it about time this thread died and a new one took its place, though? This forum doesn't seem to lend itself too well to super-long threads. :)
    • CommentAuthorxhepera
    • CommentTimeApr 27th 2007
     
    I'm using (or attempting to use) Chardonnay's baserule and I'm getting the following error when I click on the BtmScan tab. Bottom Scanner appears to be going through the motions, but my Auctioneer scan key never lights up so that its available for use. Any ideas what might be causing this?

    Date: 2007-04-27 19:24:36
    ID: 51
    Error occured in: Hooked Function
    Count: 1
    Message: Error while calling hook:
    Hook name:
    EnhTooltip.AddTooltip
    [string "local consKey = BtmScan.prices.consKey..."] line 93:
    attempt to index global 'const' (a nil value)
    Instantiated from:
    ..\AddOns\BtmScan\btmMain.lua line 86:
    in function `OnLoad'
    Debug:
    [string "local consKey = BtmScan.prices.consKey..."]:93: BaseRule()
    BtmScan\btmMain.lua:1647:
    BtmScan\btmMain.lua:1574
    (tail call): ?
    [C]: xpcall()
    Stubby\Stubby.lua:327:
    Stubby\Stubby.lua:292
    (tail call): ?
    EnhTooltip\Tooltip.lua:1139: TooltipCall()
    BtmScan\btmMain.lua:1766:
    BtmScan\btmMain.lua:1752



    AddOns:
    AdvancedTradeSkillWindow
    AnsweringMachinePlus, v2.3
    Auctioneer, v4.0.0
    AutoProfit, vv4.1 January 18th, 2007
    BagStatusMeters, v1.5.19
    BeanCounter, v4.0.0
    BMRecLevel, v3.0.3
    BonusScanner, vv2.1
    BtmScan, v4.0.0
    CTBarMod, v2.0 (CTMod 2.0)
    CTBuffMod, v2.0 (CTMod 2.0)
    CTCore, v2.0 (CTMod 2.0)
    CTExpenseHistory, v1.5 (CTMod 2.0)
    CTMailMod, v1.5 (CTMod 2.0)
    CTMapMod, v1.5 (CTMod 2.0)
    CTTimer, v1.5 (CTMod 2.0)
    CTUnitFrames, v1.5 (CTMod 2.0)
    CTViewport, v1.5 (CTMod 2.0)
    DamageWatchW, v2.41d
    EnchantingSell, v20003.3.1
    EnchantList, v0.3
    Enchantrix, v3.9.0.1510
    EnhTooltip, v4.0.0
    EquipCompare, v2.9.8b
    EQL3, v3.6.7.20003
    FishingBuddy, v0.9f
    GFWAdSpace, v2.0.5
    GFWDisenchantPredictor, v2.0.4
    GFWFactionFriend, v2.0.5
    GFWGemologist, v2.0.5
    GFWReagentCost, v2.0.1
    ImprovedIgnore
    Informant, v4.0.0
    MetaMap, v20003-17
    MetaMapBWP
    MetaMapFWM
    MetaMapNBK
    MetaMapQST
    MetaMapTRK
    MetaMapWKB
    Moleskine, v2.0.1
    OmniCC, v7.1.11
    OutfitDisplayFrame, v0.5.9
    Outfitter
    QuestLevels, v0.5
    QuickRepair, v1.1
    RangeCheck
    RecipeRadar, v1.19
    SellValue
    ShieldLeft, v3.1.0
    Stubby, v1508
    Swatter, v4.0.0
    TitanCritLine
    Titan, v3.0.5.20003
    AnsweringMachinePlusTitan, v2.3
    TitanBag, v3.0.5.20003
    TitanClock, v3.0.5.20003
    TitanCoords, v3.0.5.20003
    TitanItemBonuses, v3.0.5.20003
    TitanMoney, v3.0.5.20003
    TitanOutfitter
    TitanPerformance, v3.0.5.20003
    TitanRepair, v3.0.5.20003
    TitanXP, v3.0.5.20003
    WeaponQuickSwap
    WE, v1.4
    WowheadLooter, v2.0.12
    XPGainNotify, v1.01
    • CommentAuthorChardonnay
    • CommentTimeApr 27th 2007
     
    The baserule as posted doesn't reference an object called "const" anywhere. Did you modify it locally?
    • CommentAuthorBishop
    • CommentTimeApr 27th 2007
     
    It's from gnarls post of the basline prices. For some reason, he's not using the same syntax. I had the same problem for a second.
    • CommentAuthorxhepera
    • CommentTimeApr 27th 2007
     
    Posted By: ChardonnayThe baserule as posted doesn't reference an object called "const" anywhere. Did you modify it locally?


    Thank you, Chardonnay. I had indeed. What I had done was to add the info on pricing that Bishop uses, and I had applied the recent price update provided by a poster a few days back. The offending syntax was located there. I changed it to local baselinePrices and I'm getting no error and the scan seems to be working. Thanks again!
    • CommentAuthorgnarl
    • CommentTimeApr 28th 2007 edited
     
    Sorry about that...I had copied and pasted the price list from my EnxConstants.lua file, not a baserule!

    I'm testing out Chardonay's baserule now...the only thing is that I want to change is that I just want to use the baseline prices from allakhazam all the time (not my auctioneer scan). Reason is that there are a lot a few people (probably using BTM on my server and they always post many stacks of 1 reagent wayyyy over an "allakhazam" median). Am I correct in thinking this is all I would need to modify in order to always use the allakhazam prices?

    This:
    median = median or upperLimit
    snapshot = snapshot or upperLimit

    Into:
    median = upperLimit
    snapshot = upperLimit

    Thanks for the help!
    •  
      CommentAuthorDeckard
    • CommentTimeApr 28th 2007
     
    Posted By: BishopVery nifty watchlist, Chardonnay. Isn't it about time this thread died and a new one took its place, though? This forum doesn't seem to lend itself too well to super-long threads. :)


    I agree, I've started a new thread for it. It links back to this one if anyone needs it for reference, and I've pasted Chardonnay's excellent baserule in it.

    Chardonnay, you should be able to modify my post since you're a dev. Let me know if you can't and we'll figure something out. You can treat that post as your own and do as you like with it.

    Thanks! :bigsmile:
World of Warcraft™ and Blizzard Entertainment™ are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries.