Wetxius

Untitled

Dec 28th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.75 KB | None | 0 0
  1. local T, C, L, _ = unpack(select(2, ...))
  2. if C.bag.enable ~= true then return end
  3.  
  4. ----------------------------------------------------------------------------------------
  5. -- Based on Stuffing(by Hungtar, editor Tukz)
  6. ----------------------------------------------------------------------------------------
  7. local BAGS_BACKPACK = {0, 1, 2, 3, 4}
  8. local BAGS_BANK = {-1, 5, 6, 7, 8, 9, 10, 11}
  9. local ST_NORMAL = 1
  10. local ST_FISHBAG = 2
  11. local ST_SPECIAL = 3
  12. local bag_bars = 0
  13. local unusable
  14.  
  15. if T.class == "DEATHKNIGHT" then
  16. unusable = {{LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_STAFF, LE_ITEM_WEAPON_UNARMED, LE_ITEM_WEAPON_DAGGER, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_SHIELD}} -- weapons, armor, dual wield
  17. elseif T.class == "DEMONHUNTER" then
  18. unusable = {{LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_POLEARM, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_STAFF, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}}
  19. elseif T.class == "DRUID" then
  20. unusable = {{LE_ITEM_WEAPON_AXE1H, LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_SWORD1H, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}, true}
  21. elseif T.class == "HUNTER" then
  22. unusable = {{LE_ITEM_WEAPON_MACE1H, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}}
  23. elseif T.class == "MAGE" then
  24. unusable = {{LE_ITEM_WEAPON_AXE1H, LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_MACE1H, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_POLEARM, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_UNARMED, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW}, {LE_ITEM_ARMOR_LEATHER, LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD,}, true}
  25. elseif T.class == "MONK" then
  26. unusable = {{LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_DAGGER, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}}
  27. elseif T.class == "PALADIN" then
  28. unusable = {{LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_STAFF, LE_ITEM_WEAPON_UNARMED, LE_ITEM_WEAPON_DAGGER, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW, LE_ITEM_WEAPON_WAND}, {}, true}
  29. elseif T.class == "PRIEST" then
  30. unusable = {{LE_ITEM_WEAPON_AXE1H, LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_POLEARM, LE_ITEM_WEAPON_SWORD1H, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_UNARMED, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW}, {LE_ITEM_ARMOR_LEATHER, LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}, true}
  31. elseif T.class == "ROGUE" then
  32. unusable = {{LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_POLEARM, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_STAFF, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}}
  33. elseif T.class == "SHAMAN" then
  34. unusable = {{LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_POLEARM, LE_ITEM_WEAPON_SWORD1H, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW, LE_ITEM_WEAPON_WAND}, {LE_ITEM_ARMOR_PLATEM}}
  35. elseif T.class == "WARLOCK" then
  36. unusable = {{LE_ITEM_WEAPON_AXE1H, LE_ITEM_WEAPON_AXE2H, LE_ITEM_WEAPON_BOWS, LE_ITEM_WEAPON_GUNS, LE_ITEM_WEAPON_MACE1H, LE_ITEM_WEAPON_MACE2H, LE_ITEM_WEAPON_POLEARM, LE_ITEM_WEAPON_SWORD2H, LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_UNARMED, LE_ITEM_WEAPON_THROWN, LE_ITEM_WEAPON_CROSSBOW}, {LE_ITEM_ARMOR_LEATHER, LE_ITEM_ARMOR_MAIL, LE_ITEM_ARMOR_PLATE, LE_ITEM_ARMOR_SHIELD}, true}
  37. elseif T.class == "WARRIOR" then
  38. unusable = {{LE_ITEM_WEAPON_WARGLAIVE, LE_ITEM_WEAPON_WAND}, {}}
  39. else
  40. unusable = {{}, {}}
  41. end
  42.  
  43. local subs = {}
  44. for k = 0, 20 do
  45. subs[k + 1] = GetItemSubClassInfo(LE_ITEM_CLASS_WEAPON, k)
  46. end
  47.  
  48. for i, subclass in ipairs(unusable[1]) do
  49. unusable[subs[subclass+1]] = true
  50. end
  51.  
  52. subs = {}
  53. for k = 0, 11 do
  54. subs[k + 1] = GetItemSubClassInfo(LE_ITEM_CLASS_ARMOR, k)
  55. end
  56.  
  57. for i, subclass in ipairs(unusable[2]) do
  58. unusable[subs[subclass + 1]] = true
  59. end
  60.  
  61.  
  62. local function IsClassUnusable(subclass, slot)
  63. if subclass then
  64. return slot ~= "" and unusable[subclass] or slot == "INVTYPE_WEAPONOFFHAND" and unusable[3]
  65. end
  66. end
  67.  
  68. local function IsItemUnusable(...)
  69. if ... then
  70. local subclass, _, slot = select(7, GetItemInfo(...))
  71. return IsClassUnusable(subclass, slot)
  72. end
  73. end
  74.  
  75. Stuffing = CreateFrame("Frame", nil, UIParent)
  76. Stuffing:RegisterEvent("ADDON_LOADED")
  77. Stuffing:RegisterEvent("PLAYER_ENTERING_WORLD")
  78. Stuffing:SetScript("OnEvent", function(this, event, ...)
  79. if IsAddOnLoaded("AdiBags") or IsAddOnLoaded("ArkInventory") or IsAddOnLoaded("cargBags_Nivaya") or IsAddOnLoaded("cargBags") or IsAddOnLoaded("Bagnon") or IsAddOnLoaded("Combuctor") or IsAddOnLoaded("TBag") or IsAddOnLoaded("BaudBag") then return end
  80. Stuffing[event](this, ...)
  81. end)
  82.  
  83. -- Drop down menu stuff from Postal
  84. local Stuffing_DDMenu = CreateFrame("Frame", "StuffingDropDownMenu")
  85. Stuffing_DDMenu.displayMode = "MENU"
  86. Stuffing_DDMenu.info = {}
  87. Stuffing_DDMenu.HideMenu = function()
  88. if UIDROPDOWNMENU_OPEN_MENU == Stuffing_DDMenu then
  89. CloseDropDownMenus()
  90. end
  91. end
  92.  
  93. local function Stuffing_OnShow()
  94. Stuffing:PLAYERBANKSLOTS_CHANGED(29)
  95.  
  96. for i = 0, #BAGS_BACKPACK - 1 do
  97. Stuffing:BAG_UPDATE(i)
  98. end
  99.  
  100. Stuffing:Layout()
  101. Stuffing:SearchReset()
  102. PlaySound("igBackPackOpen")
  103. collectgarbage("collect")
  104. end
  105.  
  106. local function StuffingBank_OnHide()
  107. CloseBankFrame()
  108. if Stuffing.frame:IsShown() then
  109. Stuffing.frame:Hide()
  110. end
  111. PlaySound("igBackPackClose")
  112. end
  113.  
  114. local function Stuffing_OnHide()
  115. if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
  116. Stuffing.bankFrame:Hide()
  117. end
  118. PlaySound("igBackPackClose")
  119. end
  120.  
  121. local function Stuffing_Open()
  122. if not Stuffing.frame:IsShown() then
  123. Stuffing.frame:Show()
  124. end
  125. end
  126.  
  127. local function Stuffing_Close()
  128. Stuffing.frame:Hide()
  129. end
  130.  
  131. local function Stuffing_Toggle()
  132. if Stuffing.frame:IsShown() then
  133. Stuffing.frame:Hide()
  134. else
  135. Stuffing.frame:Show()
  136. end
  137. end
  138.  
  139. -- Bag slot stuff
  140. local trashButton = {}
  141. local trashBag = {}
  142.  
  143. local ItemDB = {}
  144.  
  145. -- Tooltip and scanning by Phanx @ http://www.wowinterface.com/forums/showthread.php?p=271406
  146. local S_ITEM_LEVEL = "^" .. gsub(ITEM_LEVEL, "%%d", "(%%d+)")
  147.  
  148. local scantip = CreateFrame("GameTooltip", "iLvlScanningTooltip", nil, "GameTooltipTemplate")
  149. scantip:SetOwner(UIParent, "ANCHOR_NONE")
  150.  
  151. local function _getRealItemLevel(link)
  152. if ItemDB[link] then return ItemDB[link] end
  153.  
  154. local realItemLevel
  155. scantip:SetHyperlink(link)
  156.  
  157. for i = 2, scantip:NumLines() do -- Line 1 is always the name so you can skip it.
  158. local text = _G["iLvlScanningTooltipTextLeft"..i]:GetText()
  159. if text and text ~= "" then
  160. realItemLevel = realItemLevel or strmatch(text, S_ITEM_LEVEL)
  161.  
  162. if realItemLevel then
  163. ItemDB[link] = tonumber(realItemLevel)
  164. return realItemLevel
  165. end
  166. end
  167. end
  168.  
  169. return realItemLevel
  170. end
  171.  
  172. function Stuffing:SlotUpdate(b)
  173. local texture, count, locked, quality = GetContainerItemInfo(b.bag, b.slot)
  174. local clink = GetContainerItemLink(b.bag, b.slot)
  175. local isQuestItem, questId = GetContainerItemQuestInfo(b.bag, b.slot)
  176.  
  177. -- Set all slot color to default ShestakUI on update
  178. if not b.frame.lock then
  179. b.frame:SetBackdropBorderColor(unpack(C.media.border_color))
  180. end
  181.  
  182. if C.bag.ilvl == true then
  183. b.frame.text:SetText("")
  184. end
  185.  
  186. if b.cooldown and StuffingFrameBags and StuffingFrameBags:IsShown() then
  187. local start, duration, enable = GetContainerItemCooldown(b.bag, b.slot)
  188. CooldownFrame_Set(b.cooldown, start, duration, enable)
  189. end
  190.  
  191. if clink then
  192. b.name, _, _, b.itemlevel, b.level, _, _, _, _, _, _, b.itemClassID = GetItemInfo(clink)
  193.  
  194. if C.bag.ilvl == true and b.itemlevel and quality > 1 and (b.itemClassID == 2 or b.itemClassID == 4) then
  195. -- if quality == 7 and b.itemlevel == 1 then
  196. -- local id = tonumber(strmatch(clink, "item:(%d+)"))
  197. -- b.frame.text:SetText(BOALevel(T.level, id))
  198. -- elseif b.itemlevel > 1 then
  199. b.itemlevel = _getRealItemLevel(clink) or b.itemlevel
  200. b.frame.text:SetText(b.itemlevel)
  201. -- end
  202. end
  203.  
  204. if (IsItemUnusable(clink) or b.level and b.level > T.level) and not locked then
  205. _G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
  206. else
  207. _G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 1, 1)
  208. end
  209.  
  210. -- Color slot according to item quality
  211. if not b.frame.lock and quality and quality > 1 and not (isQuestItem or questId) then
  212. b.frame:SetBackdropBorderColor(GetItemQualityColor(quality))
  213. elseif isQuestItem or questId then
  214. b.frame:SetBackdropBorderColor(1, 1, 0)
  215. end
  216. else
  217. b.name, b.level = nil, nil
  218. end
  219.  
  220. SetItemButtonTexture(b.frame, texture)
  221. SetItemButtonCount(b.frame, count)
  222. SetItemButtonDesaturated(b.frame, locked)
  223.  
  224. b.frame:Show()
  225. end
  226.  
  227. function Stuffing:BagSlotUpdate(bag)
  228. if not self.buttons then
  229. return
  230. end
  231.  
  232. for _, v in ipairs(self.buttons) do
  233. if v.bag == bag then
  234. self:SlotUpdate(v)
  235. end
  236. end
  237. end
  238.  
  239. function CreateReagentContainer()
  240. ReagentBankFrame:StripTextures()
  241.  
  242. local Reagent = CreateFrame("Frame", "StuffingFrameReagent", UIParent)
  243. local SwitchBankButton = CreateFrame("Button", nil, Reagent)
  244. local NumButtons = ReagentBankFrame.size
  245. local NumRows, LastRowButton, NumButtons, LastButton = 0, ReagentBankFrameItem1, 1, ReagentBankFrameItem1
  246. local Deposit = ReagentBankFrame.DespositButton
  247.  
  248. Reagent:SetWidth(((C.bag.button_size + C.bag.button_space) * C.bag.bank_columns) + 17)
  249. Reagent:SetPoint("TOPLEFT", _G["StuffingFrameBank"], "TOPLEFT", 0, 0)
  250. Reagent:SetTemplate("Transparent")
  251. Reagent:SetFrameStrata(_G["StuffingFrameBank"]:GetFrameStrata())
  252. Reagent:SetFrameLevel(_G["StuffingFrameBank"]:GetFrameLevel() + 5)
  253. Reagent:EnableMouse(true)
  254. Reagent:SetMovable(true)
  255. Reagent:SetClampedToScreen(true)
  256. Reagent:SetClampRectInsets(0, 0, 0, -20)
  257. Reagent:SetScript("OnMouseDown", function(self, button)
  258. if IsShiftKeyDown() and button == "LeftButton" then
  259. self:StartMoving()
  260. end
  261. end)
  262. Reagent:SetScript("OnMouseUp", Reagent.StopMovingOrSizing)
  263.  
  264. SwitchBankButton:SetSize(80, 20)
  265. SwitchBankButton:SkinButton()
  266. SwitchBankButton:SetPoint("TOPLEFT", 10, -4)
  267. SwitchBankButton:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  268. SwitchBankButton.text:SetPoint("CENTER")
  269. SwitchBankButton.text:SetText(BANK)
  270. SwitchBankButton:SetScript("OnClick", function()
  271. Reagent:Hide()
  272. _G["StuffingFrameBank"]:Show()
  273. _G["StuffingFrameBank"]:SetAlpha(1)
  274. BankFrame_ShowPanel(BANK_PANELS[1].name)
  275. PlaySound("igBackPackOpen")
  276. end)
  277.  
  278. Deposit:SetParent(Reagent)
  279. Deposit:ClearAllPoints()
  280. Deposit:SetSize(170, 20)
  281. Deposit:SetPoint("TOPLEFT", SwitchBankButton, "TOPRIGHT", 3, 0)
  282. Deposit:SkinButton()
  283. Deposit:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  284. Deposit.text:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
  285. Deposit.text:SetTextColor(1, 1, 1)
  286. Deposit.text:SetText(REAGENTBANK_DEPOSIT)
  287. Deposit:SetFontString(Deposit.text)
  288.  
  289. -- Close button
  290. local Close = CreateFrame("Button", "StuffingCloseButtonReagent", Reagent, "UIPanelCloseButton")
  291. T.SkinCloseButton(Close, nil, nil, true)
  292. Close:SetSize(15, 15)
  293. Close:RegisterForClicks("AnyUp")
  294. Close:SetScript("OnClick", function(self, btn)
  295. if btn == "RightButton" then
  296. if Stuffing_DDMenu.initialize ~= Stuffing.Menu then
  297. CloseDropDownMenus()
  298. Stuffing_DDMenu.initialize = Stuffing.Menu
  299. end
  300. ToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0)
  301. return
  302. else
  303. StuffingBank_OnHide()
  304. end
  305. end)
  306.  
  307. local tooltip_hide = function()
  308. GameTooltip:Hide()
  309. end
  310.  
  311. local tooltip_show = function(self)
  312. GameTooltip:SetOwner(self, "ANCHOR_LEFT", 19, 7)
  313. GameTooltip:ClearLines()
  314. GameTooltip:SetText(L_BAG_RIGHT_CLICK_CLOSE)
  315. end
  316.  
  317. Close:HookScript("OnEnter", tooltip_show)
  318. Close:HookScript("OnLeave", tooltip_hide)
  319.  
  320. for i = 1, 98 do
  321. local button = _G["ReagentBankFrameItem" .. i]
  322. local icon = _G[button:GetName() .. "IconTexture"]
  323. local count = _G[button:GetName().."Count"]
  324.  
  325. ReagentBankFrame:SetParent(Reagent)
  326. ReagentBankFrame:ClearAllPoints()
  327. ReagentBankFrame:SetAllPoints()
  328.  
  329. button:StyleButton()
  330. button:SetTemplate("Default")
  331. button:SetNormalTexture(nil)
  332. button.IconBorder:SetAlpha(0)
  333.  
  334. button:ClearAllPoints()
  335. button:SetSize(C.bag.button_size, C.bag.button_size)
  336.  
  337. local _, _, _, quality = GetContainerItemInfo(-3, i)
  338. local clink = GetContainerItemLink(-3, i)
  339. if clink then
  340. if quality and quality > 1 then
  341. button:SetBackdropBorderColor(GetItemQualityColor(quality))
  342. end
  343. end
  344.  
  345. if i == 1 then
  346. button:SetPoint("TOPLEFT", Reagent, "TOPLEFT", 10, -27)
  347. LastRowButton = button
  348. LastButton = button
  349. elseif NumButtons == C.bag.bank_columns then
  350. button:SetPoint("TOPRIGHT", LastRowButton, "TOPRIGHT", 0, -(C.bag.button_space + C.bag.button_size))
  351. button:SetPoint("BOTTOMLEFT", LastRowButton, "BOTTOMLEFT", 0, -(C.bag.button_space + C.bag.button_size))
  352. LastRowButton = button
  353. NumRows = NumRows + 1
  354. NumButtons = 1
  355. else
  356. button:SetPoint("TOPRIGHT", LastButton, "TOPRIGHT", (C.bag.button_space + C.bag.button_size), 0)
  357. button:SetPoint("BOTTOMLEFT", LastButton, "BOTTOMLEFT", (C.bag.button_space + C.bag.button_size), 0)
  358. NumButtons = NumButtons + 1
  359. end
  360.  
  361. icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
  362. icon:SetPoint("TOPLEFT", 2, -2)
  363. icon:SetPoint("BOTTOMRIGHT", -2, 2)
  364.  
  365. count:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  366. count:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
  367. count:SetPoint("BOTTOMRIGHT", 1, 1)
  368.  
  369. LastButton = button
  370. end
  371. Reagent:SetHeight(((C.bag.button_size + C.bag.button_space) * (NumRows + 1) + 40) - C.bag.button_space)
  372.  
  373. MoneyFrame_Update(ReagentBankFrame.UnlockInfo.CostMoneyFrame, GetReagentBankCost())
  374. ReagentBankFrameUnlockInfo:StripTextures()
  375. ReagentBankFrameUnlockInfo:SetAllPoints(Reagent)
  376. ReagentBankFrameUnlockInfo:SetTemplate("Overlay")
  377. ReagentBankFrameUnlockInfo:SetFrameStrata("FULLSCREEN")
  378. ReagentBankFrameUnlockInfoPurchaseButton:SkinButton()
  379. end
  380.  
  381. function Stuffing:BagFrameSlotNew(p, slot)
  382. for _, v in ipairs(self.bagframe_buttons) do
  383. if v.slot == slot then
  384. return v, false
  385. end
  386. end
  387.  
  388. local ret = {}
  389.  
  390. if slot > 3 then
  391. ret.slot = slot
  392. slot = slot - 4
  393. ret.frame = CreateFrame("CheckButton", "StuffingBBag"..slot.."Slot", p, "BankItemButtonBagTemplate")
  394. ret.frame:StripTextures()
  395. ret.frame:SetID(slot)
  396. table.insert(self.bagframe_buttons, ret)
  397.  
  398. BankFrameItemButton_Update(ret.frame)
  399. BankFrameItemButton_UpdateLocked(ret.frame)
  400.  
  401. if not ret.frame.tooltipText then
  402. ret.frame.tooltipText = ""
  403. end
  404. else
  405. ret.frame = CreateFrame("CheckButton", "StuffingFBag"..slot.."Slot", p, "BagSlotButtonTemplate")
  406.  
  407. hooksecurefunc(ret.frame.IconBorder, "SetVertexColor", function(self, r, g, b)
  408. if r ~= 0.65882 and g ~= 0.65882 and b ~= 0.65882 then
  409. self:GetParent():SetBackdropBorderColor(r, g, b)
  410. end
  411. self:SetTexture("")
  412. end)
  413.  
  414. hooksecurefunc(ret.frame.IconBorder, "Hide", function(self)
  415. self:GetParent():SetBackdropBorderColor(unpack(C.media.border_color))
  416. end)
  417.  
  418. ret.slot = slot
  419. table.insert(self.bagframe_buttons, ret)
  420. end
  421.  
  422. ret.frame:SetTemplate("Default")
  423. ret.frame:StyleButton()
  424. ret.frame:SetNormalTexture("")
  425. ret.frame:SetCheckedTexture("")
  426.  
  427. ret.icon = _G[ret.frame:GetName().."IconTexture"]
  428. ret.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
  429. ret.icon:SetPoint("TOPLEFT", ret.frame, 2, -2)
  430. ret.icon:SetPoint("BOTTOMRIGHT", ret.frame, -2, 2)
  431.  
  432. return ret
  433. end
  434.  
  435. function Stuffing:SlotNew(bag, slot)
  436. for _, v in ipairs(self.buttons) do
  437. if v.bag == bag and v.slot == slot then
  438. v.lock = false
  439. return v, false
  440. end
  441. end
  442.  
  443. local tpl = "ContainerFrameItemButtonTemplate"
  444.  
  445. if bag == -1 then
  446. tpl = "BankItemButtonGenericTemplate"
  447. end
  448.  
  449. local ret = {}
  450.  
  451. if #trashButton > 0 then
  452. local f = -1
  453. for i, v in ipairs(trashButton) do
  454. local b, s = v:GetName():match("(%d+)_(%d+)")
  455.  
  456. b = tonumber(b)
  457. s = tonumber(s)
  458.  
  459. if b == bag and s == slot then
  460. f = i
  461. break
  462. else
  463. v:Hide()
  464. end
  465. end
  466.  
  467. if f ~= -1 then
  468. ret.frame = trashButton[f]
  469. table.remove(trashButton, f)
  470. ret.frame:Show()
  471. end
  472. end
  473.  
  474. if not ret.frame then
  475. ret.frame = CreateFrame("Button", "StuffingBag"..bag.."_"..slot, self.bags[bag], tpl)
  476. ret.frame:StyleButton()
  477. ret.frame:SetTemplate("Default")
  478. ret.frame:SetNormalTexture(nil)
  479.  
  480. ret.icon = _G[ret.frame:GetName().."IconTexture"]
  481. ret.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
  482. ret.icon:SetPoint("TOPLEFT", ret.frame, 2, -2)
  483. ret.icon:SetPoint("BOTTOMRIGHT", ret.frame, -2, 2)
  484.  
  485. ret.count = _G[ret.frame:GetName().."Count"]
  486. ret.count:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  487. ret.count:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
  488. ret.count:SetPoint("BOTTOMRIGHT", 1, 1)
  489.  
  490. if C.bag.ilvl == true then
  491. ret.frame:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  492. ret.frame.text:SetPoint("TOPLEFT", 1, -1)
  493. ret.frame.text:SetTextColor(1, 1, 0)
  494. end
  495.  
  496. local Battlepay = _G[ret.frame:GetName()].BattlepayItemTexture
  497. if Battlepay then
  498. Battlepay:SetAlpha(0)
  499. end
  500. end
  501.  
  502. ret.bag = bag
  503. ret.slot = slot
  504. ret.frame:SetID(slot)
  505.  
  506. ret.cooldown = _G[ret.frame:GetName().."Cooldown"]
  507. ret.cooldown:Show()
  508.  
  509. self:SlotUpdate(ret)
  510.  
  511. return ret, true
  512. end
  513.  
  514. -- From OneBag
  515. local BAGTYPE_PROFESSION = 0x0008 + 0x0010 + 0x0020 + 0x0040 + 0x0080 + 0x0200 + 0x0400 + 0x10000
  516. local BAGTYPE_FISHING = 32768
  517.  
  518. function Stuffing:BagType(bag)
  519. local bagType = select(2, GetContainerNumFreeSlots(bag))
  520.  
  521. if bagType and bit.band(bagType, BAGTYPE_FISHING) > 0 then
  522. return ST_FISHBAG
  523. elseif bagType and bit.band(bagType, BAGTYPE_PROFESSION) > 0 then
  524. return ST_SPECIAL
  525. end
  526.  
  527. return ST_NORMAL
  528. end
  529.  
  530. function Stuffing:BagNew(bag, f)
  531. for i, v in pairs(self.bags) do
  532. if v:GetID() == bag then
  533. v.bagType = self:BagType(bag)
  534. return v
  535. end
  536. end
  537.  
  538. local ret
  539.  
  540. if #trashBag > 0 then
  541. local f = -1
  542. for i, v in pairs(trashBag) do
  543. if v:GetID() == bag then
  544. f = i
  545. break
  546. end
  547. end
  548.  
  549. if f ~= -1 then
  550. ret = trashBag[f]
  551. table.remove(trashBag, f)
  552. ret:Show()
  553. ret.bagType = self:BagType(bag)
  554. return ret
  555. end
  556. end
  557.  
  558. ret = CreateFrame("Frame", "StuffingBag"..bag, f)
  559. ret.bagType = self:BagType(bag)
  560.  
  561. ret:SetID(bag)
  562. return ret
  563. end
  564.  
  565. function Stuffing:SearchUpdate(str)
  566. str = string.lower(str)
  567.  
  568. for _, b in ipairs(self.buttons) do
  569. if b.frame and not b.name then
  570. b.frame:SetAlpha(0.2)
  571. end
  572. if b.name then
  573. local _, setName = GetContainerItemEquipmentSetInfo(b.bag, b.slot)
  574. setName = setName or ""
  575. local ilink = GetContainerItemLink(b.bag, b.slot)
  576. local class, subclass, _, equipSlot = select(6, GetItemInfo(ilink))
  577. local minLevel = select(5, GetItemInfo(ilink))
  578. equipSlot = _G[equipSlot] or ""
  579. if not string.find(string.lower(b.name), str) and not string.find(string.lower(setName), str) and not string.find(string.lower(class), str) and not string.find(string.lower(subclass), str) and not string.find(string.lower(equipSlot), str) then
  580. if IsItemUnusable(b.name) or minLevel > T.level then
  581. _G[b.frame:GetName().."IconTexture"]:SetVertexColor(0.5, 0.5, 0.5)
  582. end
  583. SetItemButtonDesaturated(b.frame, true)
  584. b.frame:SetAlpha(0.2)
  585. else
  586. if IsItemUnusable(b.name) or minLevel > T.level then
  587. _G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
  588. end
  589. SetItemButtonDesaturated(b.frame, false)
  590. b.frame:SetAlpha(1)
  591. end
  592. end
  593. end
  594. end
  595.  
  596. function Stuffing:SearchReset()
  597. for _, b in ipairs(self.buttons) do
  598. if IsItemUnusable(b.name) or (b.level and b.level > T.level) then
  599. _G[b.frame:GetName().."IconTexture"]:SetVertexColor(1, 0.1, 0.1)
  600. end
  601. b.frame:SetAlpha(1)
  602. SetItemButtonDesaturated(b.frame, false)
  603. end
  604. end
  605.  
  606. local function DragFunction(self, mode)
  607. for index = 1, select("#", self:GetChildren()) do
  608. local frame = select(index, self:GetChildren())
  609. if frame:GetName() and frame:GetName():match("StuffingBag") then
  610. if mode then
  611. frame:Hide()
  612. else
  613. frame:Show()
  614. end
  615. end
  616. end
  617. end
  618.  
  619. function Stuffing:CreateBagFrame(w)
  620. local n = "StuffingFrame"..w
  621. local f = CreateFrame("Frame", n, UIParent)
  622. f:EnableMouse(true)
  623. f:SetMovable(true)
  624. f:SetFrameStrata("MEDIUM")
  625. f:SetFrameLevel(5)
  626. f:RegisterForDrag("LeftButton")
  627. f:SetScript("OnDragStart", function(self)
  628. if IsShiftKeyDown() then
  629. self:StartMoving()
  630. DragFunction(self, true)
  631. end
  632. end)
  633. f:SetScript("OnDragStop", function(self)
  634. self:StopMovingOrSizing()
  635. DragFunction(self, false)
  636. end)
  637.  
  638. if w == "Bank" then
  639. f:SetPoint(unpack(C.position.bank))
  640. else
  641. f:SetPoint(unpack(C.position.bag))
  642. end
  643.  
  644. if w == "Bank" then
  645. -- Reagent button
  646. f.b_reagent = CreateFrame("Button", "StuffingReagentButton"..w, f)
  647. f.b_reagent:SetSize(105, 20)
  648. f.b_reagent:SetPoint("TOPLEFT", 10, -4)
  649. f.b_reagent:RegisterForClicks("AnyUp")
  650. f.b_reagent:SkinButton()
  651. f.b_reagent:SetScript("OnClick", function()
  652. BankFrame_ShowPanel(BANK_PANELS[2].name)
  653. PlaySound("igBackPackOpen")
  654. if not ReagentBankFrame.isMade then
  655. CreateReagentContainer()
  656. ReagentBankFrame.isMade = true
  657. else
  658. _G["StuffingFrameReagent"]:Show()
  659. end
  660. _G["StuffingFrameBank"]:SetAlpha(0)
  661. end)
  662. f.b_reagent:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  663. f.b_reagent.text:SetPoint("CENTER")
  664. f.b_reagent.text:SetText(REAGENT_BANK)
  665. f.b_reagent:SetFontString(f.b_reagent.text)
  666.  
  667. -- Buy button
  668. f.b_purchase = CreateFrame("Button", "StuffingPurchaseButton"..w, f)
  669. f.b_purchase:SetSize(80, 20)
  670. f.b_purchase:SetPoint("TOPLEFT", f.b_reagent, "TOPRIGHT", 3, 0)
  671. f.b_purchase:RegisterForClicks("AnyUp")
  672. f.b_purchase:SkinButton()
  673. f.b_purchase:SetScript("OnClick", function(self) StaticPopup_Show("CONFIRM_BUY_BANK_SLOT") end)
  674. f.b_purchase:FontString("text", C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  675. f.b_purchase.text:SetPoint("CENTER")
  676. f.b_purchase.text:SetText(BANKSLOTPURCHASE)
  677. f.b_purchase:SetFontString(f.b_purchase.text)
  678. local _, full = GetNumBankSlots()
  679. if full then
  680. f.b_purchase:Hide()
  681. else
  682. f.b_purchase:Show()
  683. end
  684. end
  685.  
  686. -- Close button
  687. f.b_close = CreateFrame("Button", "StuffingCloseButton"..w, f, "UIPanelCloseButton")
  688. T.SkinCloseButton(f.b_close, nil, nil, true)
  689. f.b_close:SetSize(15, 15)
  690. f.b_close:RegisterForClicks("AnyUp")
  691. f.b_close:SetScript("OnClick", function(self, btn)
  692. if btn == "RightButton" then
  693. if Stuffing_DDMenu.initialize ~= Stuffing.Menu then
  694. CloseDropDownMenus()
  695. Stuffing_DDMenu.initialize = Stuffing.Menu
  696. end
  697. ToggleDropDownMenu(nil, nil, Stuffing_DDMenu, self:GetName(), 0, 0)
  698. return
  699. end
  700. self:GetParent():Hide()
  701. end)
  702.  
  703. local tooltip_hide = function()
  704. GameTooltip:Hide()
  705. end
  706.  
  707. local tooltip_show = function(self)
  708. GameTooltip:SetOwner(self, "ANCHOR_LEFT", 19, 7)
  709. GameTooltip:ClearLines()
  710. GameTooltip:SetText(L_BAG_RIGHT_CLICK_CLOSE)
  711. end
  712.  
  713. f.b_close:HookScript("OnEnter", tooltip_show)
  714. f.b_close:HookScript("OnLeave", tooltip_hide)
  715.  
  716. -- Create the bags frame
  717. local fb = CreateFrame("Frame", n.."BagsFrame", f)
  718. fb:SetPoint("BOTTOMLEFT", f, "TOPLEFT", 0, 3)
  719. fb:SetFrameStrata("MEDIUM")
  720. f.bags_frame = fb
  721.  
  722. return f
  723. end
  724.  
  725. function Stuffing:InitBank()
  726. if self.bankFrame then
  727. return
  728. end
  729.  
  730. local f = self:CreateBagFrame("Bank")
  731. f:SetScript("OnHide", StuffingBank_OnHide)
  732. self.bankFrame = f
  733. end
  734.  
  735. function Stuffing:InitBags()
  736. if self.frame then return end
  737.  
  738. self.buttons = {}
  739. self.bags = {}
  740. self.bagframe_buttons = {}
  741.  
  742. local f = self:CreateBagFrame("Bags")
  743. f:SetScript("OnShow", Stuffing_OnShow)
  744. f:SetScript("OnHide", Stuffing_OnHide)
  745.  
  746. -- Search editbox (tekKonfigAboutPanel.lua)
  747. local editbox = CreateFrame("EditBox", nil, f)
  748. editbox:Hide()
  749. editbox:SetAutoFocus(true)
  750. editbox:SetHeight(32)
  751. editbox:CreateBackdrop("Default")
  752. editbox.backdrop:SetPoint("TOPLEFT", -2, 1)
  753. editbox.backdrop:SetPoint("BOTTOMRIGHT", 2, -1)
  754.  
  755. local resetAndClear = function(self)
  756. self:GetParent().detail:Show()
  757. self:ClearFocus()
  758. Stuffing:SearchReset()
  759. end
  760.  
  761. local updateSearch = function(self, t)
  762. if t == true then
  763. Stuffing:SearchUpdate(self:GetText())
  764. end
  765. end
  766.  
  767. editbox:SetScript("OnEscapePressed", resetAndClear)
  768. editbox:SetScript("OnEnterPressed", resetAndClear)
  769. editbox:SetScript("OnEditFocusLost", editbox.Hide)
  770. editbox:SetScript("OnEditFocusGained", editbox.HighlightText)
  771. editbox:SetScript("OnTextChanged", updateSearch)
  772. editbox:SetText(SEARCH)
  773.  
  774. local detail = f:CreateFontString(nil, "ARTWORK", "GameFontHighlightLarge")
  775. detail:SetPoint("TOPLEFT", f, 11, -10)
  776. detail:SetPoint("RIGHT", f, -140, -10)
  777. detail:SetHeight(13)
  778. detail:SetShadowColor(0, 0, 0, 0)
  779. detail:SetJustifyH("LEFT")
  780. detail:SetText("|cff9999ff"..SEARCH.."|r")
  781. editbox:SetAllPoints(detail)
  782.  
  783. local button = CreateFrame("Button", nil, f)
  784. button:EnableMouse(true)
  785. button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
  786. button:SetAllPoints(detail)
  787. button:SetScript("OnClick", function(self, btn)
  788. if btn == "RightButton" then
  789. self:GetParent().detail:Hide()
  790. self:GetParent().editbox:Show()
  791. self:GetParent().editbox:HighlightText()
  792. else
  793. if self:GetParent().editbox:IsShown() then
  794. self:GetParent().editbox:Hide()
  795. self:GetParent().editbox:ClearFocus()
  796. self:GetParent().detail:Show()
  797. Stuffing:SearchReset()
  798. end
  799. end
  800. end)
  801.  
  802. local tooltip_hide = function()
  803. GameTooltip:Hide()
  804. end
  805.  
  806. local tooltip_show = function(self)
  807. GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", -12, 11)
  808. GameTooltip:ClearLines()
  809. GameTooltip:SetText(L_BAG_RIGHT_CLICK_SEARCH)
  810. end
  811.  
  812. button:SetScript("OnEnter", tooltip_show)
  813. button:SetScript("OnLeave", tooltip_hide)
  814.  
  815. f.editbox = editbox
  816. f.detail = detail
  817. f.button = button
  818. self.frame = f
  819. f:Hide()
  820. end
  821.  
  822. function Stuffing:Layout(isBank)
  823. local slots = 0
  824. local rows = 0
  825. local off = 20
  826. local cols, f, bs
  827.  
  828. if isBank then
  829. bs = BAGS_BANK
  830. cols = C.bag.bank_columns
  831. f = self.bankFrame
  832. f:SetAlpha(1)
  833. else
  834. bs = BAGS_BACKPACK
  835. cols = C.bag.bag_columns
  836. f = self.frame
  837.  
  838. f.editbox:SetFont(C.media.normal_font, C.font.bags_font_size + 3)
  839. f.detail:SetFont(C.font.bags_font, C.font.bags_font_size, C.font.bags_font_style)
  840. f.detail:SetShadowOffset(C.font.bags_font_shadow and 1 or 0, C.font.bags_font_shadow and -1 or 0)
  841.  
  842. f.detail:ClearAllPoints()
  843. f.detail:SetPoint("TOPLEFT", f, 12, -8)
  844. f.detail:SetPoint("RIGHT", f, -140, 0)
  845. end
  846.  
  847. f:SetClampedToScreen(1)
  848. f:SetTemplate("Transparent")
  849.  
  850. -- Bag frame stuff
  851. local fb = f.bags_frame
  852. if bag_bars == 1 then
  853. fb:SetClampedToScreen(1)
  854. fb:SetTemplate("Transparent")
  855.  
  856. local bsize = C.bag.button_size
  857.  
  858. local w = 2 * 10
  859. w = w + ((#bs - 1) * bsize)
  860. w = w + ((#bs - 2) * 4)
  861.  
  862. fb:SetHeight(2 * 10 + bsize)
  863. fb:SetWidth(w)
  864. fb:Show()
  865. else
  866. fb:Hide()
  867. end
  868.  
  869. local idx = 0
  870. for _, v in ipairs(bs) do
  871. if (not isBank and v <= 3 ) or (isBank and v ~= -1) then
  872. local bsize = C.bag.button_size
  873. local b = self:BagFrameSlotNew(fb, v)
  874. local xoff = 10
  875.  
  876. xoff = xoff + (idx * bsize)
  877. xoff = xoff + (idx * 4)
  878.  
  879. b.frame:ClearAllPoints()
  880. b.frame:SetPoint("LEFT", fb, "LEFT", xoff, 0)
  881. b.frame:SetSize(bsize, bsize)
  882.  
  883. local btns = self.buttons
  884. b.frame:HookScript("OnEnter", function(self)
  885. local bag
  886. if isBank then bag = v else bag = v + 1 end
  887.  
  888. for ind, val in ipairs(btns) do
  889. if val.bag == bag then
  890. val.frame:SetAlpha(1)
  891. else
  892. val.frame:SetAlpha(0.2)
  893. end
  894. end
  895. end)
  896.  
  897. b.frame:HookScript("OnLeave", function(self)
  898. for _, btn in ipairs(btns) do
  899. btn.frame:SetAlpha(1)
  900. end
  901. end)
  902.  
  903. b.frame:SetScript("OnClick", nil)
  904.  
  905. idx = idx + 1
  906. end
  907. end
  908.  
  909. for _, i in ipairs(bs) do
  910. local x = GetContainerNumSlots(i)
  911. if x > 0 then
  912. if not self.bags[i] then
  913. self.bags[i] = self:BagNew(i, f)
  914. end
  915.  
  916. slots = slots + GetContainerNumSlots(i)
  917. end
  918. end
  919.  
  920. rows = floor(slots / cols)
  921. if (slots % cols) ~= 0 then
  922. rows = rows + 1
  923. end
  924.  
  925. f:SetWidth(cols * C.bag.button_size + (cols - 1) * C.bag.button_space + 10 * 2)
  926. f:SetHeight(rows * C.bag.button_size + (rows - 1) * C.bag.button_space + off + 10 * 2)
  927.  
  928. local idx = 0
  929. for _, i in ipairs(bs) do
  930. local bag_cnt = GetContainerNumSlots(i)
  931. local specialType = select(2, GetContainerNumFreeSlots(i))
  932. if bag_cnt > 0 then
  933. self.bags[i] = self:BagNew(i, f)
  934. local bagType = self.bags[i].bagType
  935.  
  936. self.bags[i]:Show()
  937. for j = 1, bag_cnt do
  938. local b, isnew = self:SlotNew(i, j)
  939. local xoff
  940. local yoff
  941. local x = (idx % cols)
  942. local y = floor(idx / cols)
  943.  
  944. if isnew then
  945. table.insert(self.buttons, idx + 1, b)
  946. end
  947.  
  948. xoff = 10 + (x * C.bag.button_size) + (x * C.bag.button_space)
  949. yoff = off + 10 + (y * C.bag.button_size) + ((y - 1) * C.bag.button_space)
  950. yoff = yoff * -1
  951.  
  952. b.frame:ClearAllPoints()
  953. b.frame:SetPoint("TOPLEFT", f, "TOPLEFT", xoff, yoff)
  954. b.frame:SetSize(C.bag.button_size, C.bag.button_size)
  955. b.frame.lock = false
  956. b.frame:SetAlpha(1)
  957.  
  958. if bagType == ST_FISHBAG then
  959. b.frame:SetBackdropBorderColor(1, 0, 0) -- Tackle
  960. b.frame.lock = true
  961. elseif bagType == ST_SPECIAL then
  962. if specialType == 0x0008 then -- Leatherworking
  963. b.frame:SetBackdropBorderColor(0.8, 0.7, 0.3)
  964. elseif specialType == 0x0010 then -- Inscription
  965. b.frame:SetBackdropBorderColor(0.3, 0.3, 0.8)
  966. elseif specialType == 0x0020 then -- Herbs
  967. b.frame:SetBackdropBorderColor(0.3, 0.7, 0.3)
  968. elseif specialType == 0x0040 then -- Enchanting
  969. b.frame:SetBackdropBorderColor(0.6, 0, 0.6)
  970. elseif specialType == 0x0080 then -- Engineering
  971. b.frame:SetBackdropBorderColor(0.9, 0.4, 0.1)
  972. elseif specialType == 0x0200 then -- Gems
  973. b.frame:SetBackdropBorderColor(0, 0.7, 0.8)
  974. elseif specialType == 0x0400 then -- Mining
  975. b.frame:SetBackdropBorderColor(0.4, 0.3, 0.1)
  976. elseif specialType == 0x10000 then -- Cooking
  977. b.frame:SetBackdropBorderColor(0.9, 0, 0.1)
  978. end
  979. b.frame.lock = true
  980. end
  981.  
  982. idx = idx + 1
  983. end
  984. end
  985. end
  986. end
  987.  
  988. function Stuffing:SetBagsForSorting(c)
  989. Stuffing_Open()
  990.  
  991. self.sortBags = {}
  992.  
  993. local cmd = ((c == nil or c == "") and {"d"} or {strsplit("/", c)})
  994.  
  995. for _, s in ipairs(cmd) do
  996. if s == "c" then
  997. self.sortBags = {}
  998. elseif s == "d" then
  999. if not self.bankFrame or not self.bankFrame:IsShown() then
  1000. for _, i in ipairs(BAGS_BACKPACK) do
  1001. if self.bags[i] and self.bags[i].bagType == ST_NORMAL then
  1002. table.insert(self.sortBags, i)
  1003. end
  1004. end
  1005. elseif not _G["StuffingFrameReagent"] or not _G["StuffingFrameReagent"]:IsShown() then
  1006. for _, i in ipairs(BAGS_BANK) do
  1007. if self.bags[i] and self.bags[i].bagType == ST_NORMAL then
  1008. table.insert(self.sortBags, i)
  1009. end
  1010. end
  1011. end
  1012. elseif s == "p" then
  1013. if not self.bankFrame or not self.bankFrame:IsShown() then
  1014. for _, i in ipairs(BAGS_BACKPACK) do
  1015. if self.bags[i] and self.bags[i].bagType == ST_SPECIAL then
  1016. table.insert(self.sortBags, i)
  1017. end
  1018. end
  1019. else
  1020. for _, i in ipairs(BAGS_BANK) do
  1021. if self.bags[i] and self.bags[i].bagType == ST_SPECIAL then
  1022. table.insert(self.sortBags, i)
  1023. end
  1024. end
  1025. end
  1026. else
  1027. table.insert(self.sortBags, tonumber(s))
  1028. end
  1029. end
  1030. end
  1031.  
  1032. function Stuffing:ADDON_LOADED(addon)
  1033. if addon ~= "ShestakUI" then return nil end
  1034.  
  1035. self:RegisterEvent("BAG_UPDATE")
  1036. self:RegisterEvent("ITEM_LOCK_CHANGED")
  1037. self:RegisterEvent("BANKFRAME_OPENED")
  1038. self:RegisterEvent("BANKFRAME_CLOSED")
  1039. self:RegisterEvent("GUILDBANKFRAME_OPENED")
  1040. self:RegisterEvent("GUILDBANKFRAME_CLOSED")
  1041. self:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
  1042. self:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED")
  1043. self:RegisterEvent("PLAYERREAGENTBANKSLOTS_CHANGED")
  1044. self:RegisterEvent("BAG_CLOSED")
  1045. self:RegisterEvent("BAG_UPDATE_COOLDOWN")
  1046. --self:RegisterEvent("REAGENTBANK_UPDATE")
  1047.  
  1048. self:InitBags()
  1049.  
  1050. tinsert(UISpecialFrames, "StuffingFrameBags")
  1051. tinsert(UISpecialFrames, "StuffingFrameReagent")
  1052.  
  1053. ToggleBackpack = Stuffing_Toggle
  1054. ToggleBag = Stuffing_Toggle
  1055. ToggleAllBags = Stuffing_Toggle
  1056. OpenAllBags = Stuffing_Open
  1057. OpenBackpack = Stuffing_Open
  1058. CloseAllBags = Stuffing_Close
  1059. CloseBackpack = Stuffing_Close
  1060.  
  1061. --BankFrame:UnregisterAllEvents()
  1062. BankFrame:SetScale(0.00001)
  1063. BankFrame:SetAlpha(0)
  1064. BankFrame:SetPoint("TOPLEFT")
  1065. end
  1066.  
  1067. function Stuffing:PLAYER_ENTERING_WORLD()
  1068. Stuffing:UnregisterEvent("PLAYER_ENTERING_WORLD")
  1069. ToggleBackpack()
  1070. ToggleBackpack()
  1071. end
  1072.  
  1073. function Stuffing:PLAYERBANKSLOTS_CHANGED(id)
  1074. if id > 28 then
  1075. for _, v in ipairs(self.bagframe_buttons) do
  1076. if v.frame and v.frame.GetInventorySlot then
  1077.  
  1078. BankFrameItemButton_Update(v.frame)
  1079. BankFrameItemButton_UpdateLocked(v.frame)
  1080.  
  1081. if not v.frame.tooltipText then
  1082. v.frame.tooltipText = ""
  1083. end
  1084. end
  1085. end
  1086. end
  1087.  
  1088. if self.bankFrame and self.bankFrame:IsShown() then
  1089. self:BagSlotUpdate(-1)
  1090. end
  1091. end
  1092.  
  1093. function Stuffing:PLAYERREAGENTBANKSLOTS_CHANGED()
  1094. for i = 1, 98 do
  1095. local button = _G["ReagentBankFrameItem" .. i]
  1096. if not button then return end
  1097. local _, _, _, quality = GetContainerItemInfo(-3, i)
  1098. local clink = GetContainerItemLink(-3, i)
  1099. button:SetBackdropBorderColor(unpack(C.media.border_color))
  1100.  
  1101. if clink then
  1102. if quality and quality > 1 then
  1103. button:SetBackdropBorderColor(GetItemQualityColor(quality))
  1104. end
  1105. end
  1106. end
  1107. end
  1108.  
  1109. function Stuffing:BAG_UPDATE(id)
  1110. self:BagSlotUpdate(id)
  1111. end
  1112.  
  1113. function Stuffing:ITEM_LOCK_CHANGED(bag, slot)
  1114. if slot == nil then return end
  1115. for _, v in ipairs(self.buttons) do
  1116. if v.bag == bag and v.slot == slot then
  1117. self:SlotUpdate(v)
  1118. break
  1119. end
  1120. end
  1121. end
  1122.  
  1123. function Stuffing:BANKFRAME_OPENED()
  1124. if not self.bankFrame then
  1125. self:InitBank()
  1126. end
  1127.  
  1128. self:Layout(true)
  1129. for _, x in ipairs(BAGS_BANK) do
  1130. self:BagSlotUpdate(x)
  1131. end
  1132.  
  1133. self.bankFrame:Show()
  1134. Stuffing_Open()
  1135. end
  1136.  
  1137. function Stuffing:BANKFRAME_CLOSED()
  1138. if StuffingFrameReagent then
  1139. StuffingFrameReagent:Hide()
  1140. end
  1141. if self.bankFrame then
  1142. self.bankFrame:Hide()
  1143. end
  1144. end
  1145.  
  1146. function Stuffing:GUILDBANKFRAME_OPENED()
  1147. Stuffing_Open()
  1148. end
  1149.  
  1150. function Stuffing:GUILDBANKFRAME_CLOSED()
  1151. Stuffing_Close()
  1152. end
  1153.  
  1154. function Stuffing:BAG_CLOSED(id)
  1155. local b = self.bags[id]
  1156. if b then
  1157. table.remove(self.bags, id)
  1158. b:Hide()
  1159. table.insert(trashBag, #trashBag + 1, b)
  1160. end
  1161.  
  1162. while true do
  1163. local changed = false
  1164.  
  1165. for i, v in ipairs(self.buttons) do
  1166. if v.bag == id then
  1167. v.frame:Hide()
  1168. v.frame.lock = false
  1169.  
  1170. table.insert(trashButton, #trashButton + 1, v.frame)
  1171. table.remove(self.buttons, i)
  1172.  
  1173. v = nil
  1174. changed = true
  1175. end
  1176. end
  1177.  
  1178. if not changed then
  1179. break
  1180. end
  1181. end
  1182. end
  1183.  
  1184. function Stuffing:BAG_UPDATE_COOLDOWN()
  1185. for i, v in pairs(self.buttons) do
  1186. self:SlotUpdate(v)
  1187. end
  1188. end
  1189.  
  1190. local function InBags(x)
  1191. if not Stuffing.bags[x] then
  1192. return false
  1193. end
  1194.  
  1195. for _, v in ipairs(Stuffing.sortBags) do
  1196. if x == v then
  1197. return true
  1198. end
  1199. end
  1200. return false
  1201. end
  1202.  
  1203. local BS_bagGroups
  1204. local BS_itemSwapGrid
  1205.  
  1206. local function BS_clearData()
  1207. BS_itemSwapGrid = {}
  1208. BS_bagGroups = {}
  1209. end
  1210.  
  1211. function Stuffing:SortOnUpdate(elapsed)
  1212. self.elapsed = (self.elapsed or 0) + elapsed
  1213.  
  1214. if self.elapsed < 0.05 then
  1215. return
  1216. end
  1217.  
  1218. self.elapsed = 0
  1219.  
  1220. local changed = false
  1221. local blocked = false
  1222.  
  1223. for bagIndex in pairs(BS_itemSwapGrid) do
  1224. for slotIndex in pairs(BS_itemSwapGrid[bagIndex]) do
  1225. local destinationBag = BS_itemSwapGrid[bagIndex][slotIndex].destinationBag
  1226. local destinationSlot = BS_itemSwapGrid[bagIndex][slotIndex].destinationSlot
  1227.  
  1228. local _, _, locked1 = GetContainerItemInfo(bagIndex, slotIndex)
  1229. local _, _, locked2 = GetContainerItemInfo(destinationBag, destinationSlot)
  1230.  
  1231. if locked1 or locked2 then
  1232. blocked = true
  1233. elseif bagIndex ~= destinationBag or slotIndex ~= destinationSlot then
  1234. PickupContainerItem(bagIndex, slotIndex)
  1235. PickupContainerItem(destinationBag, destinationSlot)
  1236.  
  1237. local tempItem = BS_itemSwapGrid[destinationBag][destinationSlot]
  1238. BS_itemSwapGrid[destinationBag][destinationSlot] = BS_itemSwapGrid[bagIndex][slotIndex]
  1239. BS_itemSwapGrid[bagIndex][slotIndex] = tempItem
  1240.  
  1241. changed = true
  1242. return
  1243. end
  1244. end
  1245. end
  1246.  
  1247. if not changed and not blocked then
  1248. self:SetScript("OnUpdate", nil)
  1249. BS_clearData()
  1250. end
  1251. end
  1252.  
  1253. function Stuffing:SortBags()
  1254. BS_clearData()
  1255.  
  1256. local bagList
  1257. if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then
  1258. bagList = {-3}
  1259. elseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
  1260. bagList = {11, 10, 9, 8, 7, 6, 5, -1}
  1261. else
  1262. bagList = {4, 3, 2, 1, 0}
  1263. end
  1264.  
  1265. for _, slotNum in pairs(bagList) do
  1266. if GetContainerNumSlots(slotNum) > 0 then
  1267. BS_itemSwapGrid[slotNum] = {}
  1268. local family = select(2, GetContainerNumFreeSlots(slotNum))
  1269. if family then
  1270. if family == 0 then family = "Default" end
  1271. if not BS_bagGroups[family] then
  1272. BS_bagGroups[family] = {}
  1273. BS_bagGroups[family].bagSlotNumbers = {}
  1274. end
  1275. table.insert(BS_bagGroups[family].bagSlotNumbers, slotNum)
  1276. end
  1277. end
  1278. end
  1279.  
  1280. for _, group in pairs(BS_bagGroups) do
  1281. group.itemList = {}
  1282. for _, bagSlot in pairs(group.bagSlotNumbers) do
  1283. for itemSlot = 1, GetContainerNumSlots(bagSlot) do
  1284.  
  1285. local itemLink = GetContainerItemLink(bagSlot, itemSlot)
  1286. if itemLink ~= nil then
  1287.  
  1288. local newItem = {}
  1289.  
  1290. local n, _, q, iL, rL, c1, c2, _, Sl = GetItemInfo(itemLink)
  1291. if n == GetItemInfo(6948) then c1 = "1" end -- Hearthstone
  1292. if n == GetItemInfo(110560) then c1 = "12" end -- Garrison Hearthstone
  1293. if n == GetItemInfo(64488) then c1 = "1" end -- The Innkeeper's Daughter
  1294. -- Fix for battle pets
  1295. if not n then
  1296. n = itemLink
  1297. q = select(4, GetContainerItemInfo(bagSlot, itemSlot))
  1298. iL = 1
  1299. rL = 1
  1300. c1 = "Pet"
  1301. c2 = "Pet"
  1302. Sl = ""
  1303. end
  1304.  
  1305. newItem.sort = q..c1..c2..rL..n..iL..Sl
  1306.  
  1307. tinsert(group.itemList, newItem)
  1308.  
  1309. BS_itemSwapGrid[bagSlot][itemSlot] = newItem
  1310. newItem.startBag = bagSlot
  1311. newItem.startSlot = itemSlot
  1312. end
  1313. end
  1314. end
  1315.  
  1316. table.sort(group.itemList, function(a, b)
  1317. return a.sort > b.sort
  1318. end)
  1319.  
  1320. for index, item in pairs(group.itemList) do
  1321. local gridSlot = index
  1322. for _, bagSlotNumber in pairs(group.bagSlotNumbers) do
  1323. if gridSlot <= GetContainerNumSlots(bagSlotNumber) then
  1324. BS_itemSwapGrid[item.startBag][item.startSlot].destinationBag = bagSlotNumber
  1325. BS_itemSwapGrid[item.startBag][item.startSlot].destinationSlot = GetContainerNumSlots(bagSlotNumber) - gridSlot + 1
  1326. break
  1327. else
  1328. gridSlot = gridSlot - GetContainerNumSlots(bagSlotNumber)
  1329. end
  1330. end
  1331. end
  1332. end
  1333.  
  1334. self:SetScript("OnUpdate", Stuffing.SortOnUpdate)
  1335. end
  1336.  
  1337. function Stuffing:RestackOnUpdate(e)
  1338. if not self.elapsed then
  1339. self.elapsed = 0
  1340. end
  1341.  
  1342. self.elapsed = self.elapsed + e
  1343.  
  1344. if self.elapsed < 0.1 then return end
  1345.  
  1346. self.elapsed = 0
  1347. self:Restack()
  1348. end
  1349.  
  1350. function Stuffing:Restack()
  1351. local st = {}
  1352.  
  1353. Stuffing_Open()
  1354.  
  1355. for i, v in pairs(self.buttons) do
  1356. if InBags(v.bag) then
  1357. local _, cnt, _, _, _, _, clink = GetContainerItemInfo(v.bag, v.slot)
  1358. if clink then
  1359. local n, _, _, _, _, _, _, s = GetItemInfo(clink)
  1360.  
  1361. if n and cnt ~= s then
  1362. if not st[n] then
  1363. st[n] = {{item = v, size = cnt, max = s}}
  1364. else
  1365. table.insert(st[n], {item = v, size = cnt, max = s})
  1366. end
  1367. end
  1368. end
  1369. end
  1370. end
  1371.  
  1372. local did_restack = false
  1373.  
  1374. for i, v in pairs(st) do
  1375. if #v > 1 then
  1376. for j = 2, #v, 2 do
  1377. local a, b = v[j - 1], v[j]
  1378. local _, _, l1 = GetContainerItemInfo(a.item.bag, a.item.slot)
  1379. local _, _, l2 = GetContainerItemInfo(b.item.bag, b.item.slot)
  1380.  
  1381. if l1 or l2 then
  1382. did_restack = true
  1383. else
  1384. PickupContainerItem(a.item.bag, a.item.slot)
  1385. PickupContainerItem(b.item.bag, b.item.slot)
  1386. did_restack = true
  1387. end
  1388. end
  1389. end
  1390. end
  1391.  
  1392. if did_restack then
  1393. self:SetScript("OnUpdate", Stuffing.RestackOnUpdate)
  1394. else
  1395. self:SetScript("OnUpdate", nil)
  1396. end
  1397. end
  1398.  
  1399. function Stuffing:PLAYERBANKBAGSLOTS_CHANGED()
  1400. if not StuffingPurchaseButtonBank then return end
  1401. local _, full = GetNumBankSlots()
  1402. if full then
  1403. StuffingPurchaseButtonBank:Hide()
  1404. else
  1405. StuffingPurchaseButtonBank:Show()
  1406. end
  1407. end
  1408.  
  1409. function Stuffing.Menu(self, level)
  1410. if not level then return end
  1411.  
  1412. local info = self.info
  1413.  
  1414. wipe(info)
  1415.  
  1416. if level ~= 1 then return end
  1417.  
  1418. wipe(info)
  1419. info.text = BAG_FILTER_CLEANUP.." Blizzard"
  1420. info.notCheckable = 1
  1421. info.func = function()
  1422. if _G["StuffingFrameReagent"] and _G["StuffingFrameReagent"]:IsShown() then
  1423. SortReagentBankBags()
  1424. elseif Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
  1425. SortBankBags()
  1426. else
  1427. SortBags()
  1428. end
  1429. end
  1430. UIDropDownMenu_AddButton(info, level)
  1431.  
  1432. wipe(info)
  1433. info.text = BAG_FILTER_CLEANUP
  1434. info.notCheckable = 1
  1435. info.func = function()
  1436. if InCombatLockdown() then
  1437. print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return
  1438. end
  1439. Stuffing:SortBags()
  1440. end
  1441. UIDropDownMenu_AddButton(info, level)
  1442.  
  1443. wipe(info)
  1444. info.text = L_BAG_STACK_MENU
  1445. info.notCheckable = 1
  1446. info.func = function()
  1447. if InCombatLockdown() then
  1448. print("|cffffff00"..ERR_NOT_IN_COMBAT.."|r") return
  1449. end
  1450. Stuffing:SetBagsForSorting("d")
  1451. Stuffing:Restack()
  1452. end
  1453. UIDropDownMenu_AddButton(info, level)
  1454.  
  1455. wipe(info)
  1456. info.text = L_BAG_SHOW_BAGS
  1457. info.checked = function()
  1458. return bag_bars == 1
  1459. end
  1460.  
  1461. info.func = function()
  1462. if bag_bars == 1 then
  1463. bag_bars = 0
  1464. else
  1465. bag_bars = 1
  1466. end
  1467. Stuffing:Layout()
  1468. if Stuffing.bankFrame and Stuffing.bankFrame:IsShown() then
  1469. Stuffing:Layout(true)
  1470. end
  1471. end
  1472. UIDropDownMenu_AddButton(info, level)
  1473.  
  1474. wipe(info)
  1475. info.disabled = nil
  1476. info.notCheckable = 1
  1477. info.text = CLOSE
  1478. info.func = self.HideMenu
  1479. info.tooltipTitle = CLOSE
  1480. UIDropDownMenu_AddButton(info, level)
  1481. end
  1482.  
  1483. -- Kill Blizzard functions
  1484. LootWonAlertFrame_OnClick = T.dummy
  1485. LootUpgradeFrame_OnClick = T.dummy
  1486. StorePurchaseAlertFrame_OnClick = T.dummy
Add Comment
Please, Sign In to add comment