Zerotorescue@17: local addon = select(2, ...); Zerotorescue@13: local mod = addon:NewModule("Queue", "AceEvent-3.0", "AceTimer-3.0"); Zerotorescue@13: Zerotorescue@62: local pairs = pairs; Zerotorescue@62: Zerotorescue@13: function mod:OnEnable() Zerotorescue@13: -- Register our own slash commands Zerotorescue@62: -- /im queue Zerotorescue@13: addon:RegisterSlash(function() Zerotorescue@36: mod:QueueAll(); Zerotorescue@36: end, { "q", "que", "queue" }, "|Hfunction:InventoriumCommandHandler:queue|h|cff00fff7/im queue|r|h (or /im q) - Queue all items found in the currently opened profession that are within the groups tracked at this current character."); Zerotorescue@14: Zerotorescue@14: self:RegisterMessage("IM_QUEUE_ALL"); Zerotorescue@14: self:RegisterMessage("IM_QUEUE_GROUP"); Zerotorescue@14: end Zerotorescue@14: Zerotorescue@14: function mod:IM_QUEUE_ALL() Zerotorescue@14: self:QueueAll(); Zerotorescue@14: end Zerotorescue@14: Zerotorescue@14: function mod:IM_QUEUE_GROUP(event, groupName) Zerotorescue@14: self:QueueGroup(groupName); Zerotorescue@13: end Zerotorescue@13: Zerotorescue@13: function mod:QueueAll() Zerotorescue@14: local playerName = UnitName("player"); Zerotorescue@14: Zerotorescue@14: -- Go through all groups Zerotorescue@61: for groupName, values in pairs(addon.db.profile.groups) do Zerotorescue@62: local trackAt = addon:GetOptionByKey(groupName, "trackAtCharacters"); Zerotorescue@14: Zerotorescue@14: if trackAt[playerName] then Zerotorescue@14: self:QueueGroup(groupName); Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: Zerotorescue@13: function mod:QueueGroup(groupName) Zerotorescue@61: if not addon.db.profile.groups[groupName] then Zerotorescue@98: addon:Print(("Tried to queue items from a group named \"%s\", but no such group exists."):format(groupName), addon.Colors.Red); Zerotorescue@14: return; Zerotorescue@14: end Zerotorescue@14: Zerotorescue@14: local temp = {}; Zerotorescue@13: Zerotorescue@75: local tradeskillName, currentLevel, maxLevel = GetTradeSkillLine(); Zerotorescue@75: Zerotorescue@75: if tradeskillName ~= "UNKNOWN" then Zerotorescue@75: -- Go through all trade skills for the profession Zerotorescue@75: for i = 1, GetNumTradeSkills() do Zerotorescue@75: -- Process every single tradeskill Zerotorescue@75: self:ProcessTradeSkill(i, groupName, temp); Zerotorescue@75: end Zerotorescue@14: end Zerotorescue@36: Zerotorescue@61: if addon.db.profile.groups[groupName].items then Zerotorescue@61: for itemId, _ in pairs(addon.db.profile.groups[groupName].items) do Zerotorescue@36: if not temp[itemId] then Zerotorescue@36: local itemLink = select(2, GetItemInfo(itemId)); Zerotorescue@36: Zerotorescue@98: addon:Print(("Couldn't queue %s (not part of this profession)"):format((itemLink or itemId or "???")), addon.Colors.Orange); Zerotorescue@36: end Zerotorescue@14: end Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: Zerotorescue@14: function mod:ProcessTradeSkill(i, groupName, temp) Zerotorescue@13: -- Try to retrieve the itemlink, this will be nil if current item is a group instead Zerotorescue@13: local itemLink = GetTradeSkillItemLink(i); Zerotorescue@13: Zerotorescue@13: if itemLink then Zerotorescue@95: local itemId = addon:GetItemId(itemLink); Zerotorescue@13: if not itemId then Zerotorescue@13: -- If this isn't an item, it can only be an enchant instead Zerotorescue@13: itemId = tonumber(itemLink:match("|Henchant:([-0-9]+)|h")); Zerotorescue@13: Zerotorescue@17: itemId = addon.scrollIds[itemId]; -- change enchantIds into scrollIds Zerotorescue@13: end Zerotorescue@13: Zerotorescue@89: if addon.db.profile.groups[groupName].items and addon.db.profile.groups[groupName].items[itemId] then Zerotorescue@13: -- This item is in this group, queue it! Zerotorescue@13: Zerotorescue@14: if temp then Zerotorescue@14: -- Remember which items have been processed Zerotorescue@14: temp[itemId] = true; Zerotorescue@14: end Zerotorescue@13: Zerotorescue@23: local currentStock = addon:GetItemCount(itemId, groupName); Zerotorescue@31: Zerotorescue@14: if currentStock >= 0 then Zerotorescue@14: -- Current stock will be -1 when no itemcount addon was found Zerotorescue@31: Zerotorescue@31: -- Retrieve group settings Zerotorescue@17: local restockTarget = addon:GetOptionByKey(groupName, "restockTarget"); Zerotorescue@17: local bonusQueue = addon:GetOptionByKey(groupName, "bonusQueue"); Zerotorescue@110: local minCraftingQueue = floor( addon:GetOptionByKey(groupName, "minCraftingQueue") * restockTarget ); -- If the minCraftingQueue is 5% and restockTarget is 60, this will result in 3 Zerotorescue@13: Zerotorescue@31: -- Calculate the amount to be queued Zerotorescue@17: local amount = ( restockTarget - currentStock ); Zerotorescue@17: Zerotorescue@17: if currentStock == 0 and bonusQueue > 0 then Zerotorescue@31: -- If we have none left and the bonus queue is enabled, modify the amount to be queued Zerotorescue@31: Zerotorescue@17: amount = floor( ( amount * ( bonusQueue + 1 ) ) + .5 ); -- round Zerotorescue@17: end Zerotorescue@17: Zerotorescue@17: if amount > 0 and amount >= minCraftingQueue then Zerotorescue@31: -- If we are queueing at least one AND more than the minimum amount, then proceed Zerotorescue@14: Zerotorescue@31: -- Auction value settings Zerotorescue@31: local priceThreshold = addon:GetOptionByKey(groupName, "priceThreshold"); Zerotorescue@92: local value = (priceThreshold ~= 0 and addon:GetAuctionValue(itemLink, groupName)); Zerotorescue@31: Zerotorescue@92: if priceThreshold == 0 or value == -1 or value >= priceThreshold then Zerotorescue@31: -- If no price threshold is set or the auction value is equal to or larger than the price threshold, then proceed Zerotorescue@31: Zerotorescue@31: self:Queue(i, amount, groupName); Zerotorescue@31: Zerotorescue@98: addon:Print(("Queued %d of %s"):format(amount, itemLink)); Zerotorescue@31: end Zerotorescue@14: end Zerotorescue@14: else Zerotorescue@98: addon:Print("No usable itemcount addon found."); Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: Zerotorescue@23: function mod:Queue(tradeSkillIndex, amount, group) Zerotorescue@13: tradeSkillIndex = tonumber(tradeSkillIndex); Zerotorescue@13: amount = tonumber(amount); Zerotorescue@13: Zerotorescue@13: if not tradeSkillIndex or not amount then return; end Zerotorescue@13: Zerotorescue@23: local selectedExternalAddon = addon:GetOptionByKey(group, "craftingAddon"); Zerotorescue@23: Zerotorescue@23: if addon.supportedAddons.crafting[selectedExternalAddon] and addon.supportedAddons.crafting[selectedExternalAddon].IsEnabled() then Zerotorescue@13: -- Try to use the default auction pricing addon Zerotorescue@13: Zerotorescue@23: return addon.supportedAddons.crafting[selectedExternalAddon].Queue(tradeSkillIndex, amount); Zerotorescue@13: else Zerotorescue@13: -- Default not available, get the first one then Zerotorescue@13: Zerotorescue@13: for name, value in pairs(addon.supportedAddons.crafting) do Zerotorescue@13: if value.IsEnabled() then Zerotorescue@13: return value.Queue(tradeSkillIndex, amount); Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: end Zerotorescue@13: Zerotorescue@13: return -2; Zerotorescue@13: end