408 lines
9.2 KiB
Lua
408 lines
9.2 KiB
Lua
--[[
|
|
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 |