public
Description: WoW Addon - Automatically restock items from vendors and your bank
Homepage: http://www.tekkub.net
Clone URL: git://github.com/tekkub/stealyourcarbon.git
Click here to lend your support to: stealyourcarbon and make a donation at www.pledgie.com !
stealyourcarbon / StealYourCarbon.lua
100644 203 lines (167 sloc) 6.273 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
--------------------------------
-- Memoizing Tables --
--------------------------------
 
local stacks = setmetatable({}, {__index = function(t,i)
local _, _, _, _, _, _, _, stack = GetItemInfo(i)
t[i] = stack
return stack
end})
 
local ids = setmetatable({}, {__index = function(t,i)
local _, link = GetItemInfo(i)
if not link then return end
local id = tonumber(string.match(link, "item:(%d+):"))
t[i] = id
return id
end})
 
 
-------------------------------------------
-- Namespace and all that shit --
-------------------------------------------
 
StealYourCarbon = CreateFrame("Frame")
local StealYourCarbon = StealYourCarbon
function StealYourCarbon:Print(...) ChatFrame1:AddMessage(string.join(" ", "|cFF33FF99Steal Your Carbon|r:", ...)) end
function StealYourCarbon:PrintF(fmsg, ...) ChatFrame1:AddMessage(string.format("|cFF33FF99Steal Your Carbon|r: "..fmsg, ...)) end
 
local waterupgrades = {33445,33444,27860,28399,8766,1645,1708,1205,1179,159}
for _,id in pairs(waterupgrades) do if not GetItemInfo(id) then GameTooltip:SetHyperlink("item:"..id) end end -- Query server to ensure GetItemInfo doesn't nil out.
function StealYourCarbon:UpgradeWater()
local level = UnitLevel("player")
 
local buy, found, oldid = 0
for _,id in pairs(waterupgrades) do
if found then
buy = buy + (self.db.stocklist[id] or 0)
if self.db.stocklist[id] then oldid = id end
self.db.stocklist[id] = nil
else
local _, _, _, _, reqlvl = GetItemInfo(id)
if reqlvl and level >= reqlvl then found = id end
end
end
 
if found and buy > 0 then
self.db.stocklist[found] = buy
if self.db.chatter then self:PrintF("Upgrading %s to %s", select(2, GetItemInfo(oldid)), select(2, GetItemInfo(found))) end
end
end
 
 
-----------------------------
-- Slash Command --
-----------------------------
 
SLASH_CARBON1 = "/carbon"
SLASH_CARBON2 = "/syc"
SlashCmdList.CARBON = function(input)
if input == "" then
InterfaceOptionsFrame_OpenToCategory(StealYourCarbon.configframe)
else
local id, qty = string.match(input, "add .*item:(%d+):.*%s+(%d+)%s*$")
if id and qty then
StealYourCarbon.db.stocklist[tonumber(id)] = tonumber(qty)
StealYourCarbon:PrintF("Added %s x%d", select(2, GetItemInfo(id)), qty)
StealYourCarbon:UpdateConfigList()
else
StealYourCarbon:Print("Automatically restock items from vendors and your bank")
ChatFrame1:AddMessage(" /carbon /syc")
ChatFrame1:AddMessage(" |cffff9933(no command)|r: Open config panel")
ChatFrame1:AddMessage(" |cffff9933add [Item Link] quantity|r: Add an item to be restocked")
end
end
end
 
 
----------------------------------------
-- Quicklaunch registration --
----------------------------------------
 
LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("StealYourCarbon", {
type = "launcher",
icon = "Interface\\Icons\\INV_Misc_Gem_Diamond_01",
OnClick = function() InterfaceOptionsFrame_OpenToCategory(StealYourCarbon.configframe) end,
})
 
 
----------------------
-- Events --
----------------------
 
StealYourCarbon:SetScript("OnEvent", function(self, event, ...) self[event](self, event, ...) end)
StealYourCarbon:RegisterEvent("ADDON_LOADED")
 
 
function StealYourCarbon:ADDON_LOADED(event, addon)
if addon:lower() ~= "stealyourcarbon" then return end
 
StealYourCarbonDB = StealYourCarbonDB or {stocklist = {}}
StealYourCarbonDB.tradestocklist = StealYourCarbonDB.tradestocklist or {}
self.db = StealYourCarbonDB
 
self:UnregisterEvent("ADDON_LOADED")
self:RegisterEvent("MERCHANT_SHOW")
self:RegisterEvent("BANKFRAME_OPENED")
 
if MerchantFrame:IsVisible() then self:MERCHANT_SHOW() end
if BankFrame:IsVisible() then self:BANKFRAME_OPENED() end
end
 
 
local function GS(cash)
if not cash then return end
cash = cash/100
local s = floor(cash%100)
local g = floor(cash/100)
if g > 0 then return string.format("|cffffd700%d.|cffc7c7cf%02d", g, s)
else return string.format("|cffc7c7cf%d", s) end
end
 
 
local tradebags = {
[8] = true, -- Leatherworking
[16] = true, -- Inscription
[32] = true, -- Herb
[128] = true, -- Engineering
}
local function HasTradeskillBag()
for i=1,4 do
if tradebags[select(2, GetContainerNumFreeSlots(i))] then return true end
end
end
 
 
function StealYourCarbon:MERCHANT_SHOW()
local hastradebag = HasTradeskillBag()
if self.db.upgradewater and not hastradebag then self:UpgradeWater() end
local spent, stocklist = 0, hastradebag and self.db.tradestocklist or self.db.stocklist
for i=1,GetMerchantNumItems() do
local link = GetMerchantItemLink(i)
local itemID = link and ids[link]
if itemID and stocklist[itemID] then
local needed = stocklist[itemID] - GetItemCount(itemID)
if needed > 0 then
local _, _, price, qty, avail = GetMerchantItemInfo(i)
local tobuy = avail > 0 and avail < needed and avail or needed
local diff = math.fmod(tobuy, qty)
tobuy = tobuy - diff + ((diff > 0) and self.db.overstock and qty or 0)
 
if self.db.chatter then self:PrintF("Buying %s x%d", select(2, GetItemInfo(itemID)), tobuy) end
 
while tobuy > 0 do
local thisbuy = min(tobuy, stacks[itemID])
BuyMerchantItem(i, thisbuy/qty)
spent = spent + price*thisbuy/qty
tobuy = tobuy - thisbuy
end
end
end
end
if spent > 0 and self.db.chatter then self:Print("Spent", GS(spent)) end
end
 
 
local BANKBAGS = {-1,5,6,7,8,9,10,11}
local function SwapFromBank(id, partial)
for _,bag in ipairs(BANKBAGS) do
for slot=1,GetContainerNumSlots(bag) do
local link = GetContainerItemLink(bag, slot)
local itemID = link and ids[link]
if itemID == id then
if partial then
PickupContainerItem(bag, slot)
for bag2=0,4 do
for slot2=1,GetContainerNumSlots(bag2) do
local link2 = GetContainerItemLink(bag2, slot2)
local itemID2 = link2 and ids[link2]
if itemID2 == id then
PickupContainerItem(bag2, slot2)
return
end
end
end
else
UseContainerItem(bag, slot)
return
end
end
end
end
end
 
 
function StealYourCarbon:BANKFRAME_OPENED()
if HasTradeskillBag() then return end
for id,num in pairs(self.db.stocklist) do
local inbag = GetItemCount(id)
if inbag < num and GetItemCount(id, true) > inbag then SwapFromBank(id, inbag ~= 0) end
end
end