--[[ main.lua The bagnon driver thingy --]] Bagnon = LibStub('AceAddon-3.0'):NewAddon('Bagnon', 'AceEvent-3.0', 'AceConsole-3.0') local L = LibStub('AceLocale-3.0'):GetLocale('Bagnon') --[[ Binding Setup --]] BINDING_HEADER_BAGNON = 'Bagnon' BINDING_NAME_BAGNON_TOGGLE = L.ToggleBags BINDING_NAME_BANKNON_TOGGLE = L.ToggleBank BINDING_NAME_BAGNON_KEYS_TOGGLE = L.ToggleKeys --[[ Startup --]] function Bagnon:OnInitialize() self.frames = {} self:HookBagClickEvents() self:RegisterAutoDisplayEvents() self:AddSlashCommands() self:CreateOptionsLoader() self:CreateLDBLauncher() self:CreateGuildBankLoader() end --create a loader for the options menu function Bagnon:CreateOptionsLoader() local f = CreateFrame('Frame', nil, InterfaceOptionsFrame) f:SetScript('OnShow', function(self) self:SetScript('OnShow', nil) LoadAddOn('Bagnon_Config') end) end function Bagnon:CreateGuildBankLoader() local name, title, notes, enabled, loadable = GetAddOnInfo('Bagnon_GuildBank') if enabled and loadable then GuildBankFrame_LoadUI = function() LoadAddOn('Bagnon_GuildBank') end end end function Bagnon:CreateLDBLauncher() local LDB = LibStub:GetLibrary('LibDataBroker-1.1', true) if not LDB then return end LDB:NewDataObject('BagnonLauncher', { type = 'launcher', icon = [[Interface\Icons\INV_Misc_Bag_07]], OnClick = function(_, button) if button == 'LeftButton' then if IsShiftKeyDown() then Bagnon:ToggleFrame('bank') elseif IsAltKeyDown() then Bagnon:ToggleFrame('keys') else Bagnon:ToggleFrame('inventory') end elseif button == 'RightButton' then Bagnon:ShowOptions() end end, OnTooltipShow = function(tooltip) if not tooltip or not tooltip.AddLine then return end tooltip:AddLine('Bagnon') tooltip:AddLine(L.TipShowInventory, 1, 1, 1) tooltip:AddLine(L.TipShowBank, 1, 1, 1) tooltip:AddLine(L.TipShowKeyring, 1, 1, 1) tooltip:AddLine(L.TipShowOptions, 1, 1, 1) end, }) end --[[ Frame Display --]] function Bagnon:GetFrame(frameID) for i, frame in pairs(self.frames) do if frame:GetFrameID() == frameID then return frame end end end function Bagnon:CreateFrame(frameID) table.insert(self.frames, self.Frame:New(frameID)) end function Bagnon:ShowFrame(frameID) if self:IsFrameEnabled(frameID) then if not self:GetFrame(frameID) then self:CreateFrame(frameID) end self.FrameSettings:Get(frameID):Show() return true end return false end function Bagnon:HideFrame(frameID) if self:IsFrameEnabled(frameID) then self.FrameSettings:Get(frameID):Hide() return true end return false end function Bagnon:ToggleFrame(frameID) if self:IsFrameEnabled(frameID) then if not self:GetFrame(frameID) then self:CreateFrame(frameID) end self.FrameSettings:Get(frameID):Toggle() return true end return false end function Bagnon:IsFrameEnabled(frameID) return self.Settings:IsFrameEnabled(frameID) end function Bagnon:FrameControlsBag(frameID, bagSlot) return self.FrameSettings:Get(frameID):IsBagSlotShown(bagSlot) or (not self:IsBlizzardBagPassThroughEnabled()) end function Bagnon:IsBlizzardBagPassThroughEnabled() return self.Settings:IsBlizzardBagPassThroughEnabled() end --[[ Bag Click Events --]] function Bagnon:HookBagClickEvents() --backpack hooksecurefunc('CloseBackpack', function() self:HideFrame('inventory') end) local oOpenBackpack = OpenBackpack OpenBackpack = function() local shown = self:FrameControlsBag('inventory', BACKPACK_CONTAINER) and self:ShowFrame('inventory') if not shown then oOpenBackpack() end end local oToggleBackpack = ToggleBackpack ToggleBackpack = function() local toggled = self:FrameControlsBag('inventory', BACKPACK_CONTAINER) and self:ToggleFrame('inventory') if not toggled then oToggleBackpack() end end --single bag local oToggleBag = ToggleBag ToggleBag = function(bagSlot) local frameID = self.BagSlotInfo:IsBankBag(bagSlot) and 'bank' or 'inventory' local toggled = self:FrameControlsBag(frameID, bagSlot) and self:ToggleFrame(frameID) if not toggled then oToggleBag(bagSlot) end end --keyring local oToggleKeyRing = ToggleKeyRing ToggleKeyRing = function() local toggled = self:FrameControlsBag('keys', KEYRING_CONTAINER) and self:ToggleFrame('keys') if not toggled then toggled = self:FrameControlsBag('inventory', KEYRING_CONTAINER) and self:ToggleFrame('inventory') end if not toggled then oToggleKeyRing() end end --all bags --closing the game menu triggers this function, and can be done in combat hooksecurefunc('CloseAllBags', function() self:HideFrame('inventory') end) local oOpenAllBags = OpenAllBags OpenAllBags = function(force) local opened = false if force then opened = self:FrameControlsBag('inventory', BACKPACK_CONTAINER) and self:ShowFrame('inventory') else opened = self:FrameControlsBag('inventory', BACKPACK_CONTAINER) and self:ToggleFrame('inventory') end if not opened then oOpenAllBags(force) end end end --[[ Automatic Display --]] function Bagnon:RegisterAutoDisplayEvents() self.BagEvents:Listen(self, 'BANK_OPENED') self.BagEvents:Listen(self, 'BANK_CLOSED') self:RegisterEvent('MAIL_CLOSED') self:RegisterEvent('AUCTION_HOUSE_SHOW') self:RegisterEvent('AUCTION_HOUSE_CLOSED') self:RegisterEvent('MERCHANT_SHOW') self:RegisterEvent('MERCHANT_CLOSED') self:RegisterEvent('TRADE_SHOW') self:RegisterEvent('TRADE_CLOSED') self:RegisterEvent('TRADE_SKILL_SHOW') self:RegisterEvent('TRADE_SKILL_CLOSE') self:RegisterEvent('GUILDBANKFRAME_OPENED') self:RegisterEvent('GUILDBANKFRAME_CLOSED') --override normal bank display BankFrame:UnregisterEvent('BANKFRAME_OPENED') BankFrame:UnregisterEvent('BANKFRAME_CLOSED') local f = CreateFrame('Frame', nil, CharacterFrame) f:SetScript('OnShow', function() Bagnon:PLAYER_FRAME_SHOW() end) f:SetScript('OnHide', function() Bagnon:PLAYER_FRAME_HIDE() end) end function Bagnon:ShowFrameAtEvent(frameID, event) if self:AutoDisplayingFrameOnEvent(frameID, event) then self:ShowFrame(frameID) end end function Bagnon:HideFrameAtEvent(frameID, event) if self:AutoDisplayingFrameOnEvent(frameID, event) then self:HideFrame(frameID) end end function Bagnon:AutoDisplayingFrameOnEvent(frameID, event) return self.Settings:IsFrameShownAtEvent(frameID, event) end function Bagnon:ShowBlizzardBankFrame() BankFrame_OnEvent(_G['BankFrame'], 'BANKFRAME_OPENED') end function Bagnon:HideBlizzardBankFrame() BankFrame_OnEvent(_G['BankFrame'], 'BANKFRAME_CLOSED') end --[[ Display Events ]]-- --visiting the bank function Bagnon:BANK_OPENED() if not self:ShowFrame('bank') then self:ShowBlizzardBankFrame() end self:ShowFrameAtEvent('inventory', 'bank') end function Bagnon:BANK_CLOSED() if not self:HideFrame('bank') then self:HideBlizzardBankFrame() end self:HideFrameAtEvent('inventory', 'bank') end --visiting the mailbox --mail frame is a special case, since its automatically handled by the stock interface function Bagnon:MAIL_CLOSED() self:HideFrame('inventory') end --visiting the auction house function Bagnon:AUCTION_HOUSE_SHOW() self:ShowFrameAtEvent('inventory', 'ah') end function Bagnon:AUCTION_HOUSE_CLOSED() self:HideFrameAtEvent('inventory', 'ah') end --visitng a vendor function Bagnon:MERCHANT_SHOW() self:ShowFrameAtEvent('inventory', 'vendor') end function Bagnon:MERCHANT_CLOSED() self:HideFrameAtEvent('inventory', 'vendor') end --trading function Bagnon:TRADE_SHOW() self:ShowFrameAtEvent('inventory', 'trade') end function Bagnon:TRADE_CLOSED() self:HideFrameAtEvent('inventory', 'trade') end --visiting the guild bank function Bagnon:GUILDBANKFRAME_OPENED() self:ShowFrameAtEvent('inventory', 'guildbank') end function Bagnon:GUILDBANKFRAME_CLOSED() self:HideFrameAtEvent('inventory', 'guildbank') end --crafting function Bagnon:TRADE_SKILL_SHOW() self:ShowFrameAtEvent('inventory', 'craft') end function Bagnon:TRADE_SKILL_CLOSE() self:HideFrameAtEvent('inventory', 'craft') end --player frame function Bagnon:PLAYER_FRAME_SHOW() self:ShowFrameAtEvent('inventory', 'player') end function Bagnon:PLAYER_FRAME_HIDE() self:HideFrameAtEvent('inventory', 'player') end --[[ Slash Commands --]] function Bagnon:AddSlashCommands() self:RegisterChatCommand('bagnon', 'HandleSlashCommand') self:RegisterChatCommand('bgn', 'HandleSlashCommand') end function Bagnon:HandleSlashCommand(cmd) cmd = cmd and cmd:lower() or '' if cmd == 'bank' then self:ToggleFrame('bank') elseif cmd == 'bags' then self:ToggleFrame('inventory') elseif cmd == 'keys' then self:ToggleFrame('keys') elseif cmd == 'version' then self:PrintVersion() elseif cmd == 'config' then self:ShowOptions() elseif cmd == '?' or cmd == 'help' then self:PrintHelp() else if not self:ShowOptions() then self:PrintHelp() end end end function Bagnon:PrintVersion() self:Print(self.SavedSettings:GetDBVersion()) end function Bagnon:PrintHelp() local function PrintCmd(cmd, desc) print(string.format(' - |cFF33FF99%s|r: %s', cmd, desc)) end self:Print(L.Commands) PrintCmd('bags', L.CmdShowInventory) PrintCmd('bank', L.CmdShowBank) PrintCmd('keys', L.CmdShowKeyring) PrintCmd('version', L.CmdShowVersion) end function Bagnon:ShowOptions() if LoadAddOn('Bagnon_Config') then InterfaceOptionsFrame_OpenToCategory(self.GeneralOptions) return true end return false end