annotate Core.lua @ 74:71de6e86a1a4 release 2010-07-29

Fixed a bug where tradeskill that don't produce items, like Inscription Research, cause IA to crash. Added some API enhancements. Added ArkInventory as an optional dependency so it will be loaded before IA.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 29 Jul 2010 22:33:50 -0700
parents 8e9beb8a0330
children 19609b3af2d7
rev   line source
Asa@63 1 local ItemAuditor = select(2, ...)
Asa@63 2 ItemAuditor = LibStub("AceAddon-3.0"):NewAddon(ItemAuditor, "ItemAuditor", "AceEvent-3.0", "AceBucket-3.0")
Asa@65 3 --@debug@
Asa@65 4 _G['ItemAuditor'] = ItemAuditor
Asa@65 5 --@end-debug@
Asa@0 6
Asa@0 7 local WHITE = "|cFFFFFFFF"
Asa@0 8 local RED = "|cFFFF0000"
Asa@0 9 local GREEN = "|cFF00FF00"
Asa@0 10 local YELLOW = "|cFFFFFF00"
Asa@0 11 local ORANGE = "|cFFFF7F00"
Asa@0 12 local TEAL = "|cFF00FF9A"
Asa@0 13 local GOLD = "|cFFFFD700"
Asa@0 14
Asa@67 15
Asa@67 16 ItemAuditor.Options = {
Asa@67 17 handler = ItemAuditor,
Asa@67 18 name = "ItemAuditor @project-version@",
Asa@67 19 type = 'group',
Asa@67 20 args = {
Asa@67 21 options = {
Asa@67 22 type = "execute",
Asa@67 23 name = "options",
Asa@67 24 desc = "Show Blizzard's options GUI",
Asa@67 25 func = "ShowOptionsGUI",
Asa@67 26 guiHidden = true,
Asa@67 27 },
Asa@67 28 debug = {
Asa@67 29 type = "execute",
Asa@67 30 name = "debug",
Asa@67 31 desc = "Shows the debug frame",
Asa@67 32 func = function() ItemAuditor_DebugFrame:Show() end,
Asa@67 33 guiHidden = true,
Asa@67 34 },
Asa@67 35 suspend = {
Asa@67 36 type = "toggle",
Asa@67 37 name = "suspend",
Asa@67 38 desc = "Suspends ItemAuditor",
Asa@67 39 get = "IsEnabled",
Asa@67 40 set = "SetEnabled",
Asa@67 41 guiHidden = true,
Asa@67 42 },
Asa@67 43 },
Asa@67 44 }
Asa@67 45
Asa@63 46 function ItemAuditor:OnInitialize()
Asa@0 47 local DB_defaults = {
Asa@0 48 char = {
Asa@13 49 ah = 1,
Asa@13 50 use_quick_auctions = false,
Asa@20 51 crafting_threshold = 1,
Asa@20 52 auction_threshold = 0.15,
Asa@71 53 qa_extra = 0,
Asa@55 54 output_chat_frame = nil,
Asa@0 55 },
Asa@16 56 profile = {
Asa@16 57 messages = {
Asa@16 58 cost_updates = true,
Asa@20 59 queue_skip = false,
Asa@23 60 },
Asa@63 61 ItemAuditor_enabled = true,
Asa@70 62 queue_destination = nil,
Asa@72 63 disabled_deciders = {},
Asa@16 64 },
Asa@0 65 factionrealm = {
Asa@8 66 item_account = {},
Asa@8 67 items = {},
Asa@39 68 outbound_cod = {},
Asa@0 69 },
Asa@0 70 }
Asa@0 71 self.db = LibStub("AceDB-3.0"):New("ItemAuditorDB", DB_defaults, true)
Asa@0 72
Asa@67 73 self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("ItemAuditor", "ItemAuditor")
Asa@67 74
Asa@67 75 LibStub("AceConfig-3.0"):RegisterOptionsTable("ItemAuditor", ItemAuditor.Options, {"ia"})
Asa@38 76 ItemAuditor:RegisterFrame(ItemAuditor_DebugFrame)
Asa@23 77
Asa@65 78 --@debug@
Asa@59 79 -- ItemAuditor_DebugFrame:Show()
Asa@59 80 -- self:CreateFrame('tab_crafting')
Asa@74 81 self:RegisterEvent("TRADE_SKILL_SHOW", function()
Asa@74 82 ItemAuditor:CreateFrame('tab_crafting')
Asa@74 83 end)
Asa@65 84 --@end-debug@
Asa@0 85 end
Asa@0 86
Asa@67 87
Asa@67 88
Asa@38 89 local registeredEvents = {}
Asa@63 90 local originalRegisterEvent = ItemAuditor.RegisterEvent
Asa@63 91 function ItemAuditor:RegisterEvent(event, callback, arg)
Asa@38 92 registeredEvents[event] = true
Asa@38 93 if arg ~= nil then
Asa@38 94 return originalRegisterEvent(self, event, callback, arg)
Asa@38 95 elseif callback ~= nil then
Asa@38 96 return originalRegisterEvent(self, event, callback)
Asa@38 97 else
Asa@38 98 return originalRegisterEvent(self, event)
Asa@38 99 end
Asa@38 100 end
Asa@38 101
Asa@63 102 local originalUnregisterEvent = ItemAuditor.UnregisterEvent
Asa@63 103 function ItemAuditor:UnregisterEvent(event)
Asa@38 104 registeredEvents[event] = nil
Asa@38 105 return originalUnregisterEvent(self, event)
Asa@38 106 end
Asa@38 107
Asa@63 108 function ItemAuditor:UnregisterAllEvents()
Asa@38 109 for event in pairs(registeredEvents) do
Asa@38 110 self:UnregisterEvent(event)
Asa@38 111 end
Asa@38 112 end
Asa@38 113
Asa@38 114 local registeredFrames = {}
Asa@63 115 function ItemAuditor:RegisterFrame(frame)
Asa@38 116 tinsert(registeredFrames, frame)
Asa@38 117 end
Asa@38 118
Asa@63 119 function ItemAuditor:HideAllFrames()
Asa@38 120 for key, frame in pairs(registeredFrames) do
Asa@38 121 if frame then
Asa@38 122 frame:Hide()
Asa@38 123 end
Asa@38 124 end
Asa@38 125 end
Asa@38 126
Asa@63 127 function ItemAuditor:ConvertItems()
Asa@8 128 for itemName, value in pairs(self.db.factionrealm.item_account) do
Asa@15 129 local itemID = self:GetItemID(itemName)
Asa@8 130 if itemID ~= nil then
Asa@8 131 self:GetItem('item:' .. itemID)
Asa@8 132 end
Asa@8 133 if value == 0 then
Asa@8 134 self.db.factionrealm.item_account[itemName] = nil
Asa@8 135 end
Asa@8 136 end
Asa@8 137
Asa@8 138 for link, data in pairs(self.db.factionrealm.items) do
Asa@8 139 if self:GetItem(link).count == 0 or self:GetItem(link).invested == 0 then
Asa@8 140 self:RemoveItem(link)
Asa@8 141 end
Asa@10 142 end
Asa@10 143
Asa@12 144 self:RefreshQAGroups()
Asa@12 145 end
Asa@12 146
Asa@65 147 -- Options doesn't exist when this file is created the first time, so getOptions will
Asa@65 148 -- make one call to :GetModule and return the result and replace itself with a
Asa@65 149 -- function that simply returns the same object. The permanent solution will probably be
Asa@65 150 -- to move :Print to a different module.
Asa@65 151 local function getOptions()
Asa@65 152 local Options = ItemAuditor:GetModule("Options")
Asa@65 153 getOptions = function() return Options end
Asa@65 154 return Options
Asa@65 155 end
Asa@65 156
Asa@24 157 local printPrefix = "|cFFA3CEFFItemAuditor|r: "
Asa@63 158 function ItemAuditor:Print(message, ...)
Asa@24 159 message = format(message, ...)
Asa@65 160 getOptions().GetSelectedChatWindow():AddMessage( printPrefix .. tostring(message))
Asa@16 161 end
Asa@16 162
Asa@63 163 function ItemAuditor:GetCurrentInventory()
Asa@8 164 local i = {}
Asa@8 165 local bagID
Asa@8 166 local slotID
Asa@8 167
Asa@8 168 for bagID = 0, NUM_BAG_SLOTS do
Asa@8 169 bagSize=GetContainerNumSlots(bagID)
Asa@8 170 for slotID = 0, bagSize do
Asa@8 171 local link= GetContainerItemLink(bagID, slotID);
Asa@10 172 link = link and self:GetSafeLink(link)
Asa@8 173
Asa@8 174 if link ~= nil and i[link] == nil then
Asa@8 175 i[link] = GetItemCount(link);
Asa@8 176 end
Asa@8 177 end
Asa@8 178
Asa@8 179 end
Asa@8 180 return {items = i, money = GetMoney()}
Asa@0 181 end
Asa@0 182
Asa@63 183 function ItemAuditor:GetInventoryDiff(pastInventory, current)
Asa@8 184 if current == nil then
Asa@8 185 current = self:GetCurrentInventory()
Asa@8 186 end
Asa@8 187 local diff = {}
Asa@8 188
Asa@8 189 for link, count in pairs(current.items) do
Asa@8 190 if pastInventory.items[link] == nil then
Asa@8 191 diff[link] = count
Asa@23 192 self:Debug("1 diff[" .. link .. "]=" .. diff[link])
Asa@8 193 elseif count - pastInventory.items[link] ~= 0 then
Asa@8 194 diff[link] = count - pastInventory.items[link]
Asa@23 195 self:Debug("2 diff[" .. link .. "]=" .. diff[link])
Asa@8 196 end
Asa@8 197 end
Asa@8 198
Asa@8 199 for link, count in pairs(pastInventory.items) do
Asa@8 200 if current.items[link] == nil then
Asa@8 201 diff[link] = -count
Asa@23 202 self:Debug("3 diff[" .. link .. "]=" .. diff[link])
Asa@8 203 elseif current.items[link] - count ~= 0 then
Asa@8 204 diff[link] = current.items[link] - pastInventory.items[link]
Asa@23 205 self:Debug("4 diff[" .. link .. "]=" .. diff[link])
Asa@8 206 end
Asa@8 207 end
Asa@8 208
Asa@8 209 local moneyDiff = current.money - pastInventory.money
Asa@23 210 if abs(moneyDiff) > 0 then
Asa@23 211 self:Debug("moneyDiff: " .. moneyDiff)
Asa@23 212 end
Asa@8 213
Asa@8 214 return {items = diff, money = moneyDiff}
Asa@0 215 end
Asa@0 216
Asa@39 217 local inboundCOD = {}
Asa@39 218 local skipMail = {}
Asa@63 219 function ItemAuditor:ScanMail()
Asa@0 220 local results = {}
Asa@39 221 local CODPaymentRegex = gsub(COD_PAYMENT, "%%s", "(.*)")
Asa@39 222
Asa@0 223 for mailIndex = 1, GetInboxNumItems() or 0 do
Asa@39 224 local sender, msgSubject, msgMoney, msgCOD, daysLeft, msgItem, _, _, msgText, _, isGM = select(3, GetInboxHeaderInfo(mailIndex))
Asa@15 225 local mailType = self:GetMailType(msgSubject)
Asa@6 226
Asa@39 227 local mailSignature = msgSubject .. '-' .. msgMoney .. '-' .. msgCOD .. '-' .. daysLeft
Asa@39 228
Asa@6 229 results[mailType] = (results[mailType] or {})
Asa@6 230
Asa@39 231 if skipMail[mailSignature] ~= nil then
Asa@39 232 -- do nothing
Asa@39 233 elseif mailType == "NonAHMail" and msgCOD > 0 then
Asa@6 234 mailType = 'COD'
Asa@6 235 results[mailType] = (results[mailType] or {})
Asa@5 236
Asa@5 237 local itemTypes = {}
Asa@5 238 for itemIndex = 1, ATTACHMENTS_MAX_RECEIVE do
Asa@5 239 local itemName, _, count, _, _= GetInboxItem(mailIndex, itemIndex)
Asa@5 240 if itemName ~= nil then
Asa@39 241 itemTypes[itemName] = (itemTypes[itemName] or 0) + count
Asa@5 242 end
Asa@5 243 end
Asa@5 244
Asa@15 245 if self:tcount(itemTypes) == 1 then
Asa@5 246 for itemName, count in pairs(itemTypes) do
Asa@39 247 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@39 248 results[mailType][itemName].total = results[mailType][itemName].total + msgCOD
Asa@39 249
Asa@39 250 if inboundCOD[mailSignature] == nil then
Asa@39 251 results[mailType][itemName].count = results[mailType][itemName].count + count
Asa@39 252 inboundCOD[mailSignature] = (inboundCOD[mailSignature] or 0) + count
Asa@39 253 else
Asa@39 254 results[mailType][itemName].count = inboundCOD[mailSignature]
Asa@39 255 end
Asa@39 256
Asa@39 257
Asa@5 258 end
Asa@5 259 else
Asa@5 260 self:Debug("Don't know what to do with more than one item type on COD mail.")
Asa@5 261 end
Asa@6 262 elseif mailType == "CODPayment" then
Asa@39 263 -- /dump ItemAuditor.db.factionrealm.outbound_cod
Asa@39 264 self:Debug(msgSubject)
Asa@39 265 self:Debug(CODPaymentRegex)
Asa@39 266 local outboundSubject = select(3, msgSubject:find(CODPaymentRegex))
Asa@39 267 local trackID
Asa@39 268 if outboundSubject ~= nil then
Asa@39 269 self:Debug(outboundSubject)
Asa@45 270 trackID = select(3, outboundSubject:find('[[]IA: (%d*)[]]'))
Asa@39 271
Asa@39 272 if trackID ~= nil then
Asa@45 273 trackID = tonumber(trackID)
Asa@45 274 self:Debug('COD ID: %s', trackID)
Asa@39 275 local cod = self.db.factionrealm.outbound_cod[trackID]
Asa@39 276 if cod == nil then
Asa@39 277 skipMail[mailSignature] = true
Asa@39 278 self:Print("WARNING: {%s} has an invalid ItemAuditor tracking number.", msgSubject)
Asa@39 279 else
Asa@39 280 itemName = trackID .. "|" .. cod['link']
Asa@39 281
Asa@39 282
Asa@39 283 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@39 284 results[mailType][itemName].total = results[mailType][itemName].total - msgMoney
Asa@39 285 results[mailType][itemName].count = results[mailType][itemName].count - cod.count
Asa@39 286 end
Asa@39 287 end
Asa@39 288 end
Asa@5 289
Asa@39 290 if trackID == nil then
Asa@39 291 skipMail[mailSignature] = true
Asa@39 292 self:Print("WARNING: {%s} is a COD payment but doesn't have an ItemAuditor tracking number.", msgSubject)
Asa@39 293 end
Asa@5 294
Asa@0 295 elseif mailType == "AHSuccess" then
Asa@0 296 local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
Asa@26 297 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@26 298 results[mailType][itemName].total = results[mailType][itemName].total - deposit - buyout + consignment
Asa@26 299
Asa@0 300
Asa@0 301 elseif mailType == "AHWon" then
Asa@0 302 local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
Asa@26 303 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@26 304 results[mailType][itemName].total = results[mailType][itemName].total + bid
Asa@26 305
Asa@26 306 local count = select(3, GetInboxItem(1,1))
Asa@26 307 results[mailType][itemName].count = results[mailType][itemName].count + count
Asa@5 308 elseif mailType == "AHExpired" or mailType == "AHCancelled" or mailType == "AHOutbid" then
Asa@0 309 -- These should be handled when you pay the deposit at the AH
Asa@0 310 else
Asa@24 311 -- self:Debug("Unhandled mail type: " .. mailType)
Asa@24 312 -- self:Debug(msgSubject)
Asa@0 313 end
Asa@0 314
Asa@0 315 end
Asa@23 316
Asa@23 317 for mailType, collection in pairs(results) do
Asa@26 318 for item, data in pairs(collection) do
Asa@26 319 self:Debug(format("|cFF00FF00MailScan|r: %s - %s - %s x %s", mailType, item, data.total, data.count))
Asa@23 320 end
Asa@23 321 end
Asa@23 322
Asa@0 323 return results
Asa@0 324 end
Asa@0 325
Asa@63 326 function ItemAuditor:GetItem(link, viewOnly)
Asa@9 327 if viewOnly == nil then
Asa@9 328 viewOnly = false
Asa@9 329 end
Asa@8 330
Asa@9 331 local itemName = nil
Asa@9 332 if self:GetSafeLink(link) == nil then
Asa@9 333 itemName = link
Asa@9 334 else
Asa@9 335 link = self:GetSafeLink(link)
Asa@9 336 itemName = GetItemInfo(link)
Asa@9 337 end
Asa@9 338
Asa@12 339
Asa@9 340 if self.db.factionrealm.item_account[itemName] ~= nil then
Asa@65 341 self.db.factionrealm.items[link] = {
Asa@12 342 count = Altoholic:GetItemCount(self:GetIDFromLink(link)),
Asa@8 343 invested = abs(self.db.factionrealm.item_account[itemName] or 0),
Asa@8 344 }
Asa@8 345 self.db.factionrealm.item_account[itemName] = nil
Asa@8 346 end
Asa@8 347
Asa@65 348 if viewOnly == false and self.db.factionrealm.items[link] == nil then
Asa@24 349
Asa@65 350 self.db.factionrealm.items[link] = {
Asa@10 351 count = Altoholic:GetItemCount(self:GetIDFromLink(link)),
Asa@9 352 invested = abs(self.db.factionrealm.item_account[itemName] or 0),
Asa@9 353 }
Asa@9 354
Asa@9 355 end
Asa@9 356
Asa@65 357 if self.db.factionrealm.items[link] ~= nil then
Asa@65 358 self.db.factionrealm.items[link].count = Altoholic:GetItemCount(self:GetIDFromLink(link))
Asa@45 359
Asa@65 360 if self.db.factionrealm.items[link].invested == nil then
Asa@65 361 self.db.factionrealm.items[link].invested = 0
Asa@45 362 end
Asa@37 363 end
Asa@37 364
Asa@65 365 if viewOnly == true and self.db.factionrealm.items[link] == nil then
Asa@9 366 return {count = 0, invested = 0}
Asa@9 367 elseif viewOnly == true then
Asa@28 368
Asa@65 369 return {count = self.db.factionrealm.items[link].count, invested = self.db.factionrealm.items[link].invested}
Asa@9 370 end
Asa@37 371
Asa@28 372
Asa@28 373
Asa@65 374 return self.db.factionrealm.items[link]
Asa@8 375 end
Asa@8 376
Asa@63 377 function ItemAuditor:RemoveItem(link)
Asa@9 378 self.db.factionrealm.item_account[link] = nil
Asa@9 379 link = self:GetSafeLink(link)
Asa@9 380 if link ~= nil then
Asa@63 381 local item = ItemAuditor:GetItem(link)
Asa@35 382 item.invested = 0
Asa@24 383 else
Asa@24 384 self:Debug('Failed to convert link' .. tostring(link))
Asa@9 385 end
Asa@8 386 end
Asa@8 387
Asa@63 388 function ItemAuditor:SaveValue(link, value, countChange)
Asa@26 389 self:Debug("SaveValue(%s, %s, %s)", tostring(link), value, (countChange or 'default'))
Asa@26 390 countChange = countChange or 0
Asa@9 391 local item = nil
Asa@9 392 local realLink = self:GetSafeLink(link)
Asa@9 393 local itemName = nil
Asa@9 394 if realLink == nil then
Asa@26 395 itemName = link
Asa@23 396 self:Debug('SaveValue: GetSafeLink failed, falling back to storing by name: ' .. tostring(itemName))
Asa@9 397 self.db.factionrealm.item_account[itemName] = (self.db.factionrealm.item_account[itemName] or 0) + value
Asa@9 398 item = {invested = self.db.factionrealm.item_account[itemName], count = 1}
Asa@9 399 else
Asa@23 400
Asa@9 401 item = self:GetItem(realLink)
Asa@9 402 item.invested = item.invested + value
Asa@9 403 itemName = GetItemInfo(realLink)
Asa@9 404 end
Asa@8 405
Asa@26 406 if value > 0 and countChange > 0 and item.invested == value and item.count ~= countChange then
Asa@26 407 local costPerItem = value / countChange
Asa@26 408 value = costPerItem * item.count
Asa@26 409 item.invested = value
Asa@26 410 self:Print("You already owned %s %s with an unknown price, so they have also been updated to %s each", (item.count - countChange), itemName, self:FormatMoney(costPerItem))
Asa@26 411 end
Asa@26 412
Asa@7 413 if abs(value) > 0 then
Asa@22 414 if item.invested < 0 then
Asa@16 415 if self.db.profile.messages.cost_updates then
Asa@16 416 self:Print(format("Updated price of %s from %s to %s. %sYou just made a profit of %s.", itemName, self:FormatMoney(item.invested - value), self:FormatMoney(0), GREEN, self:FormatMoney(abs(item.invested))))
Asa@16 417 end
Asa@12 418 self:RemoveItem(link)
Asa@12 419 -- This doesn't work when you mail the only copy of an item you have to another character.
Asa@12 420 --[[
Asa@12 421 elseif item.count == 0 and realLink and Altoholic:GetItemCount(self:GetIDFromLink(realLink)) then
Asa@15 422 self:Print("You ran out of " .. itemName .. " and never recovered " .. self:FormatMoney(item.invested))
Asa@12 423 self:RemoveItem(link)
Asa@12 424 ]]
Asa@16 425 else
Asa@16 426 if self.db.profile.messages.cost_updates then
Asa@16 427 self:Print(format("Updated price of %s from %s to %s. (total change:%s)", itemName, self:FormatMoney(item.invested - value), self:FormatMoney(item.invested), self:FormatMoney(value)))
Asa@16 428 end
Asa@12 429 end
Asa@0 430 end
Asa@10 431
Asa@10 432 if realLink ~= nil then
Asa@63 433 ItemAuditor:UpdateQAThreshold(realLink)
Asa@10 434 end
Asa@35 435 UpdateInvestedData()
Asa@10 436 end
Asa@12 437
Asa@0 438
Asa@63 439 function ItemAuditor:WatchBags()
Asa@4 440 if self.watch_handle == nil then
Asa@63 441 ItemAuditor:UpdateCurrentInventory()
Asa@23 442 self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, 0.3, "UpdateAudit")
Asa@4 443 end
Asa@0 444 end
Asa@0 445
Asa@63 446 function ItemAuditor:UnwatchBags()
Asa@4 447 if self.watch_handle ~= nil then
Asa@4 448 self:UnregisterBucket(self.watch_handle)
Asa@4 449 self.watch_handle = nil
Asa@4 450 end
Asa@0 451 end
Asa@0 452
Asa@9 453
Asa@63 454 function ItemAuditor:GetSafeLink(link)
Asa@9 455 local newLink = nil
Asa@9 456
Asa@24 457 if link and link == string.match(link, '.-:[-0-9]+[:0-9]*') then
Asa@24 458 newLink = link
Asa@24 459 elseif link then
Asa@9 460 newLink = link and string.match(link, "|H(.-):([-0-9]+):([0-9]+)|h")
Asa@9 461 end
Asa@9 462 if newLink == nil then
Asa@9 463 local itemID = self:GetItemID(link)
Asa@9 464 if itemID ~= nil then
Asa@9 465 _, newLink = GetItemInfo(itemID)
Asa@9 466 return self:GetSafeLink(newLink)
Asa@9 467 end
Asa@9 468 end
Asa@9 469 return newLink and string.gsub(newLink, ":0:0:0:0:0:0", "")
Asa@9 470 end
Asa@9 471
Asa@63 472 function ItemAuditor:GetIDFromLink(link)
Asa@9 473 local _, _, _, _, Id = string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")
Asa@9 474 return tonumber(Id)
Asa@9 475 end
Asa@9 476
Asa@63 477 function ItemAuditor:GetItemCost(link, countModifier)
Asa@9 478 local item = self:GetItem(link, true)
Asa@8 479
Asa@9 480 if item.invested > 0 then
Asa@9 481 local count = item.count
Asa@9 482
Asa@9 483 if countModifier ~= nil then
Asa@9 484 count = count - countModifier
Asa@0 485 end
Asa@9 486 if count > 0 then
Asa@45 487 return ceil(item.invested), ceil(item.invested/count), count
Asa@9 488 end
Asa@9 489
Asa@0 490 end
Asa@35 491 return 0, 0, Altoholic:GetItemCount(ItemAuditor:GetIDFromLink(link))
Asa@0 492 end