-- ----------------------------------------------------------------- -- File: AllInOneBank.lua -- -- Purpose: Functions for AIOB WoW Window. -- -- Author: Ramble -- -- Credits: -- Starven, for MyInventory -- Kaitlin, for BankItems -- Sarf, for the original concept of AllInOneInventory -- ----------------------------------------------------------------- ----------------------- -- Saved Configuration ----------------------- AIOBProfile = {} AIOB_VERSION = "1.5.2"; local PlayerName = nil; -- Logged in player name local bankPlayer = nil; -- viewing player pointer local bankPlayerName = nil; -- Viewing player name ------------------------ -- Saved Function Calls ------------------------ local BankFrame_Saved = nil; local PurchaseSlot_Saved = nil; ----------------------- -- Local Configuration ----------------------- local AIOB_Loaded = nil; local AtBank = false; AIOB_MAX_ID = 132; -- 6 * 18 slot bags, 24 Bankslots AIOB_COLUMNS_MIN = 6; -- 6 Bags, so it has to be at least 6 wide AIOB_COLUMNS_MAX = 18; -- Same as MI AIOB_BASE_HEIGHT = 153; -- Height of Borders + Title + Bottom AIOB_ROW_HEIGHT = 40; -- One Row AIOB_BASE_WIDTH = 12; -- Width of the borders AIOB_COL_WIDTH = 39; -- One Column AIOB_FIRST_ITEM_OFFSET_X = 7; -- Leave room for the border AIOB_FIRST_ITEM_OFFSET_Y = -28 - 39; -- Leave room for the title. AIOB_ITEM_OFFSET_X = 39; -- Each is 39 apart AIOB_ITEM_OFFSET_Y = -39; -- Each is 39 apart AIOBDEBUG = 0; -- Not Saved between Sessions AIOBAllRealms = 0; -- Saved Between Sessions AIOBReplaceBank = 1; AIOBColumns = 10; AIOBFreeze = 0; AIOBHighlightItems = 1; AIOBHighlightBags = 1; AIOBBagView = 0; AIOBGraphics = 1; AIOBBackground = 1; AIOBShowPlayers = 1; --InitializeProfile: Initializes a players profile {{{ -- If Player's profile is not found, it makes a new one from defaults -- If Player's profile is found, it loads the values from AIOBProfile function AIOB_InitializeProfile() if ( UnitName("player") ) then PlayerName = UnitName('player').."|"..AIOB_Trim(GetCVar("realmName")); AIOB_LoadSettings(); AIOB_DEBUG("AIOB: Profile for "..PlayerName.." Initilized."); AIOBFrame_PopulateFrame(); -- TODO: why is this here? -- AIOB_UpdateBagCost(AIOBProfile[PlayerName].Bags); end end function AIOB_LoadSettings() if ( AIOBProfile[PlayerName] == nil ) then AIOBProfile[PlayerName] = {}; AIOB_Print("Creating new Profile for "..PlayerName); end AIOBReplaceBank = AIOB_SavedOrDefault("ReplaceBank"); AIOBColumns = AIOB_SavedOrDefault("Columns"); AIOBFreeze = AIOB_SavedOrDefault("Freeze"); AIOBHighlightItems = AIOB_SavedOrDefault("HighlightItems"); AIOBHighlightBags = AIOB_SavedOrDefault("HighlightBags"); AIOBBagView = AIOB_SavedOrDefault("BagView"); AIOBGraphics = AIOB_SavedOrDefault("Graphics"); AIOBBackground = AIOB_SavedOrDefault("Background"); AIOBShowPlayers = AIOB_SavedOrDefault("ShowPlayers"); AIOB_SetGraphics(); AIOB_SetReplaceBank(); AIOB_SetFreeze(); end function AIOB_SavedOrDefault(varname) if PlayerName == nil or varname == nil then AIOB_DEBUG("ERR: nil value"); return nil; end if AIOBProfile[PlayerName][varname] == nil then -- Setting not set AIOBProfile[PlayerName][varname] = getglobal("AIOB"..varname); -- Load Default end return AIOBProfile[PlayerName][varname]; -- Return Setting. end -- END Initialization }}} function AIOB_GetPlayer(playerName) if ( not AIOBProfile[playerName] ) then AIOB_InitializeProfile(); end bankPlayerName = playerName; UIDropDownMenu_SetSelectedValue(AIOBDropDown, bankPlayerName); return AIOBProfile[playerName]; end function AIOB_GetBag(bagIndex) local curBag if bagIndex == BANK_CONTAINER then curBag = bankPlayer["Bank"]; else curBag = bankPlayer["Bag"..bagIndex]; end return curBag; end function AIOB_GetBagsTotalSlots() local slots = 24; if bankPlayer == nil then return slots; end for bag = 5, 10 do local curBag = bankPlayer["Bag"..bag]; if (curBag ~= nil) then if curBag["s"] ~=nil then slots = slots + curBag["s"]; end end end return slots; end -- == Event Handling == -- OnLoad {{{ function AIOBFrame_OnLoad() AIOB_Register(); -- Slash Commands this:RegisterEvent("PLAYER_ENTERING_WORLD"); this:RegisterEvent("BAG_UPDATE"); this:RegisterEvent("ITEM_LOCK_CHANGED"); this:RegisterEvent("UPDATE_INVENTORY_ALERTS"); this:RegisterEvent("BANKFRAME_OPENED"); this:RegisterEvent("BANKFRAME_CLOSED"); this:RegisterEvent("PLAYERBANKSLOTS_CHANGED"); this:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED"); this:RegisterEvent("PLAYER_MONEY"); tinsert(UISpecialFrames, "AIOBFrame"); -- Esc Closes AIOB end function AIOB_Register() SlashCmdList["AIOBSLASHMAIN"] = AIOB_ChatCommandHandler; SLASH_AIOBSLASHMAIN1 = "/AIOB"; this:RegisterEvent("VARIABLES_LOADED"); end -- End Load }}} -- Confirm Dialog for buying bag slot {{{ function AIOB_RegisterConfirm() PurchaseSlot_Saved = PurchaseSlot; PurchaseSlot = AIOB_PurchaseSlot; StaticPopupDialogs["PURCHASE_BANKBAG"] = { text = TEXT(AIOB_PURCHASE_CONFIRM_S), button1 = TEXT(ACCEPT), button2 = TEXT(CANCEL), OnAccept = function() PurchaseSlot_Saved(); end, showAlert = 1, timeout = 0, }; end function AIOB_PurchaseSlot() if not StaticPopupDialogs["PURCHASE_BANKBAG"] then return; end local cost = GetBankSlotCost(); if cost < 10000 then StaticPopupDialogs["PURCHASE_BANKBAG"]["text"] = format(AIOB_PURCHASE_CONFIRM_S,(cost/100)); else StaticPopupDialogs["PURCHASE_BANKBAG"]["text"] = format(AIOB_PURCHASE_CONFIRM_G,(cost/10000)); end StaticPopup_Show("PURCHASE_BANKBAG"); end -- End buy bag slot config }}} -- Register with MyAddons function AIOB_MyAddonsRegister() if (myAddOnsFrame) then myAddOnsList.AIOB = { name = AIOB_MYADDON_NAME, description = AIOB_MYADDON_DESCRIPTION, version = AIOB_VERSION, category = MYADDONS_CATEGORY_INVENTORY, frame = "AIOBFrame", optionsframe = "AIOBConfigFrame" }; end end function AIOBFrame_OnEvent(event) if ( event == "VARIABLES_LOADED" ) then AIOB_Loaded = 1; AIOB_MyAddonsRegister(); AIOB_InitializeProfile(); if not BankBuyFrame then AIOB_RegisterConfirm(); end end if (not AIOB_Loaded) then return; end if ( event == "PLAYER_ENTERING_WORLD" and bankPlayer == nil ) then PlayerName = UnitName("player").."|"..AIOB_Trim(GetCVar("realmName")); bankPlayer = AIOB_GetPlayer(PlayerName); AIOB_InitializeProfile(); AIOB_SaveMoney(); elseif ( event == "BAG_UPDATE" ) then if AtBank and arg1 >=5 and arg1 <=10 then AIOBFrame_SaveItems(); end elseif (event == "PLAYERBANKSLOTS_CHANGED" or event=="PLAYERBANKBAGSLOTS_CHANGED") then AIOBFrame_SaveItems(); elseif ( event == "ITEM_LOCK_CHANGED" or event == "UPDATE_INVENTORY_ALERTS" ) then if ( AtBank ) then AIOBFrame_PopulateFrame(); end end if (event == "BANKFRAME_OPENED") then AtBank = true; SetPortraitTexture(AIOBFramePortrait, "npc"); AIOBFrameAtBankText:Show(); OpenBackpack(); -- Open Backpack at Bank bankPlayer = AIOB_GetPlayer(PlayerName); AIOBFrame_SaveItems(); AIOBFramePurchaseButton:Enable(); if AIOBReplaceBank == 1 then OpenAIOBFrame(); end elseif (event == "BANKFRAME_CLOSED") then AtBank = false; AIOBFramePortrait:SetTexture("Interface\\Addons\\AllInOneInventory\\Skin\\AIOBPortait"); AIOBFrameAtBankText:Hide(); AIOBFramePurchaseButton:Disable(); CloseBackpack(); -- Close Backpack when leaving if AIOBReplaceBank == 1 then if AIOBFreeze == 0 then CloseAIOBFrame(); end end if StackSplitFrame:IsVisible() then StackSplitFrame:Hide(); end elseif (event == "PLAYER_MONEY" ) then AIOB_SaveMoney(); return; end end function AIOB_HighlightBag(bagID, bagName, isItem) if AIOBHighlightBags == 0 and isItem then return; end if AIOBHighlightItems == 0 and (not isItem) then return; end if isItem then if bagID > -1 then getglobal("AIOBFrameBag"..bagID):LockHighlight(); end end if(bankPlayer[bagName])then local i, found; for i=1, AIOB_MAX_ID do local itemButton = getglobal("AIOBFrameItem"..i); if not itemButton:IsVisible() then break; end if itemButton.bagIndex == bagID then found = true; itemButton:LockHighlight(); else if found then break; end end end end end function AIOB_GetCooldown(item) if item["d"] then local cooldownInfo = item["d"]; local CoolDownRemaining; if cooldownInfo and cooldownInfo["d"] and cooldownInfo["s"] then CoolDownRemaining = cooldownInfo["d"] - (GetTime() - cooldownInfo["s"]); else CoolDownRemaining = 0; end if CoolDownRemaining <= 0 then item["d"] = nil; else return cooldownInfo; end end return nil; end function AIOB_GetCooldownString(cooldownInfo) local CoolDownRemaining = cooldownInfo["d"] - (GetTime() - cooldownInfo["s"]); -- 60 secs in a min -- 3600 secs in an hour -- 86400 secs in a day local days, hours, minutes, seconds; days = math.floor(CoolDownRemaining / 86400); CoolDownRemaining = CoolDownRemaining - 86400 * days; hours = math.floor(CoolDownRemaining / 3600); CoolDownRemaining = CoolDownRemaining - 3600 * hours; minutes = math.floor(CoolDownRemaining / 60); seconds = math.floor(CoolDownRemaining - 60 * minutes); if days > 0 then return format(ITEM_COOLDOWN_TIME_DAYS_P1, days+1); elseif hours > 0 then return format(ITEM_COOLDOWN_TIME_HOURS_P1, hours+1); elseif minutes > 0 then return format(ITEM_COOLDOWN_TIME_MIN, minutes+1); else return format(ITEM_COOLDOWN_TIME_SEC, seconds); end end function AIOB_MakeLink(item) if item and item["l"] then local name; _,_,_, name = strfind(item["l"],"|H(item:%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r"); item["name"] = name; item["l"] = nil; end if item and item["name"] then local myHyperlink; if ItemsMatrix_GetHyperlink then myHyperlink = ItemsMatrix_GetHyperlink(item["name"]); elseif LootLink_GetHyperlink then myHyperlink = LootLink_GetHyperlink(item["name"]); else myHyperlink = AIOB_GetHyperlink(item); end if myHyperlink then GameTooltip:Hide(); GameTooltip:SetOwner(this,"ANCHOR_RIGHT"); GameTooltip:SetHyperlink(myHyperlink); if item["sb"] then GameTooltipTextLeft2:SetText(ITEM_SOULBOUND); end if item["m"] then GameTooltip:AddLine(format(ITEM_CREATED_BY, item["m"])); end local cooldownInfo = item["d"]; if cooldownInfo and cooldownInfo["e"] and cooldownInfo["e"] > 0 and cooldownInfo["d"] > 0 then CoolDownString = AIOB_GetCooldownString(cooldownInfo); GameTooltip:AddLine(CoolDownString, 1.0, 1.0, 1.0); end GameTooltip:Show(); end end end function AIOBFrame_Button_OnEnter() --show tooltip local myLink, MadeBy, Soulbound, count; local bagName = strsub(this:GetName(), 10, 13); local curBag; local cooldownInfo; if AtBank then local hasCooldown, repairCost; GameTooltip:SetOwner(this,"ANCHOR_RIGHT"); if (this.isBag) then AIOB_HighlightBag(this:GetID(), bagName); local inventoryID = BankButtonIDToInvSlotID(this:GetID(), 1); hasCooldown, repairCost = GameTooltip:SetInventoryItem("player", inventoryID); else AIOB_HighlightBag(this.bagIndex, bagName, 1); if this.bagIndex < 0 then local newIndex =BankFrameItem1:GetInventorySlot(); hasCooldown, repairCost = GameTooltip:SetInventoryItem("player", newIndex); else hasCooldown, repairCost = GameTooltip:SetBagItem(this.bagIndex, this.itemIndex); end end else if LootLink_AutoInfoOff then LootLink_AutoInfoOff(); end if (this.isBag) then AIOB_MakeLink(bankPlayer[bagName]); AIOB_HighlightBag(this:GetID(), bagName); else AIOB_HighlightBag(this.bagIndex, bagName, 1); curBag = AIOB_GetBag(this.bagIndex); if curBag and curBag[this.itemIndex] then AIOB_MakeLink(curBag[this.itemIndex]); end end if LootLink_AutoInfoOn then LootLink_AutoInfoOn(); end end end function AIOBFrame_Button_OnLeave() if this.isBag then local bagName= strsub(this:GetName(), 10, 13); local i, found; for i=1, AIOB_MAX_ID do local itemButton = getglobal("AIOBFrameItem"..i); if itemButton.bagIndex == this:GetID() then found = true; itemButton:UnlockHighlight(); else if found then break; end end end else if this.bagIndex > -1 then getglobal("AIOBFrameBag"..(this.bagIndex)):UnlockHighlight(); end end GameTooltip:Hide(); end function AIOBFrame_UpdateCooldown(button) if (not button.bagIndex) or (not button.itemIndex) then return; end local cooldown = getglobal(button:GetName().."Cooldown"); local start, duration, enable = GetContainerItemCooldown(button.bagIndex, button.itemIndex); CooldownFrame_SetTimer(cooldown, start, duration, enable); if ( duration > 0 and enable == 0 ) then SetItemButtonTextureVertexColor(button, 0.4, 0.4, 0.4); end end function AIOBFrame_OnHide() if AtBank then CloseBankFrame(); end PlaySound("igBackPackClose"); end function AIOBFrame_OnShow() if AtBank then AIOBFramePurchaseButton:Enable(); else AIOBFramePurchaseButton:Disable(); end AIOB_UpdateTotalMoney(); AIOBFrame_UpdateLookIfNeeded(); PlaySound("igBackPackOpen"); end function AIOBFrameItemButton_OnLoad() this:RegisterForClicks("LeftButtonUp", "RightButtonUp"); this:RegisterForDrag("LeftButton"); this.SplitStack = function(button, split) SplitContainerItem(button:GetParent():GetID(), button:GetID(), split); end end function AIOBFrameItemButton_OnClick(button, ignoreShift) local myLink; local item = AIOB_GetBag(this.bagIndex)[this.itemIndex]; if (button == "LeftButton" ) then if (IsShiftKeyDown() and (not ignoreShift)) then if ChatFrameEditBox:IsVisible() or ( MacroFrameText and MacroFrameText:IsVisible() ) then -- Insert Link if ItemsMatrix_GetLink then myLink = ItemsMatrix_GetLink(item["name"]); elseif LootLink_GetLink then myLink = LootLink_GetLink(item["name"]); else myLink = AIOB_GetLink(item); end if myLink then if ChatFrameEditBox:IsVisible() then ChatFrameEditBox:Insert(myLink); elseif ( MacroFrameText and MacroFrameText:IsVisible() ) then MacroFrameText:Insert(myLink); end end else if AtBank then --Shift key down, left mouse button local texture, itemCount, locked = GetContainerItemInfo(this.bagIndex, this.itemIndex); if ( not locked ) then this.SplitStack = function(button, split) SplitContainerItem(button.bagIndex, button.itemIndex, split); end OpenStackSplitFrame(this.count, this, "BOTTOMRIGHT", "TOPRIGHT"); end end end else -- no shift, left mouse button if AtBank==true then PickupContainerItem(this.bagIndex, this.itemIndex); end end elseif (button == "RightButton") then if AtBank==true then UseContainerItem(this.bagIndex, this.itemIndex); end end end function AIOBFrameItemButtonBag_OnShiftClick(button, ignoreShift) local bankBag = getglobal("BankFrameBag"..(tonumber(strsub(this:GetName(), 13, 15))-4)); local inventoryID = BankButtonIDToInvSlotID(bankBag:GetID(), 1); if ( ChatFrameEditBox:IsVisible() ) then local bagName= strsub(this:GetName(), 10, 13); local myLink; if ItemsMatrix_GetLink then myLink = ItemsMatrix_GetLink(bankPlayer[bagName]["name"]); elseif LootLink_GetLink then myLink = LootLink_GetLink(bankPlayer[bagName]["name"]); else myLink = AIOB_GetLink(bankPlayer[bagName]); end if myLink then if ChatFrameEditBox:IsVisible() then ChatFrameEditBox:Insert(myLink); elseif ( MacroFrameText and MacroFrameText:IsVisible() ) then MacroFrameText:Insert(myLink); end end else -- Shift key, no chat box if AtBank then PickupBagFromSlot(inventoryID); PlaySound("BAGMENUBUTTONPRESS"); end end end function AIOBFrameItemButtonBag_OnClick(button, ignoreShift) local bankBag = getglobal("BankFrameBag"..(tonumber(strsub(this:GetName(), 13, 15))-4)); local inventoryID = BankButtonIDToInvSlotID(bankBag:GetID(), 1); AIOB_DEBUG(bankBag:GetName().." "..inventoryID); -- No ShiftKey if AtBank then local hadItem = PutItemInBag(inventoryID); local id = this:GetID(); end end -- == End Event Handling == function AIOBFrame_SetColumns(col) if ( type(col) ~= "number" ) then col = tonumber(col); end if ( ( col >= AIOB_COLUMNS_MIN ) and ( col <= AIOB_COLUMNS_MAX ) ) then AIOBColumns = col; bankPlayer.Columns = AIOBColumns; AIOBFrame_UpdateLook(getglobal("AIOBFrame"), AIOB_GetBagsTotalSlots()); end end function AIOBFrame_GetAppropriateHeight(rows) local height = AIOB_BASE_HEIGHT + ( AIOB_ROW_HEIGHT * (AIOBBagView - 1 + rows )); if AIOBShowPlayers == 0 and AIOBGraphics == 0 then height = height - AIOB_ROW_HEIGHT; end return height; end function AIOBFrame_GetAppropriateWidth(cols) return AIOB_BASE_WIDTH + ( AIOB_COL_WIDTH * cols ); end function AIOBTitle_Update() local i, j, totalSlots, takenSlots = 0, 0, 0, 0; totalSlots = AIOB_GetBagsTotalSlots(); -- Need to calculate Free slots. if bankPlayer and bankPlayer["Bank"] then for i = 1, 24 do if bankPlayer["Bank"][i] then takenSlots = takenSlots + 1; end end for i = 5, 10 do if bankPlayer["Bag"..i] and bankPlayer["Bag"..i]["s"] then for j = 1, bankPlayer["Bag"..i]["s"] do if bankPlayer["Bag"..i][j] then takenSlots = takenSlots + 1; end end end end end if ( bankPlayerName ) then local playername = AIOB_Split(bankPlayerName, "|"); if ( AIOBColumns >= 9 ) then AIOBFrameName:SetText(format(AIOB_FRAME_PLAYERANDREGION, playername[1], playername[2])); else AIOBFrameName:SetText(format(AIOB_FRAME_PLAYERONLY, playername[1])); end AIOBFrameName:SetTextColor(1.0, 1.0, 1.0); end AIOBFrameSlots:SetText(format(AIOB_FRAME_SLOTS, (totalSlots-takenSlots), (totalSlots))); end function AIOB_UpdateTotalMoney() local totalMoney = 0; for key, value in AIOBProfile do local thisRealmPlayers = AIOB_Split(key, "|")[2]; if AIOBAllRealms == 1 or thisRealmPlayers == AIOB_Trim(GetCVar("realmName")) then if ( AIOBProfile[key].money ) then totalMoney = totalMoney + AIOBProfile[key].money; end end end if AIOBColumns < 8 then totalMoney = math.floor(totalMoney / 10000) * 10000; end MoneyFrame_Update("AIOB_MoneyFrameTotal", totalMoney); end function AIOB_UpdateBagCost(bags) if not bags then bags=0; end if bags < 6 then AIOBFramePurchaseInfo:Show(); local cost = AIOB_GetBankSlotCost(bags); MoneyFrame_Update("AIOBFrameDetailMoneyFrame", cost); if ( bankPlayer and bankPlayer["money"] and bankPlayer["money"] >= cost ) then SetMoneyFrameColor("AIOBFrameDetailMoneyFrame", 1.0, 1.0, 1.0); else SetMoneyFrameColor("AIOBFrameDetailMoneyFrame", 1.0, 0.1, 0.1) end else -- Hide frame AIOBFramePurchaseInfo:Hide(); end end function AIOBFrame_UpdateLookIfNeeded() local slots = AIOB_GetBagsTotalSlots(); if ( ( not AIOBFrame.size ) or ( slots ~= AIOBFrame.size ) ) then AIOBFrame_UpdateLook(getglobal("AIOBFrame"), slots); end end function AIOBFrame_UpdateLook(frame, frameSize) frame.size = frameSize; local name = frame:GetName(); local columns = AIOBColumns; local rows = ceil(frame.size / columns); local height = AIOBFrame_GetAppropriateHeight(rows); frame:SetHeight(height); local width = AIOBFrame_GetAppropriateWidth(columns); frame:SetWidth(width); AIOBTitle_Update(); if AIOBShowPlayers ==1 then AIOBDropDown:Show(); AIOB_AllRealms_Check:Show(); --MYINVENTORY_BASE_HEIGHT = MYINVENTORY_BASE_HEIGHT - MYINVENTORY_ITEM_OFFSET_Y; else AIOBDropDown:Hide(); AIOB_AllRealms_Check:Hide(); end for j=5,10 do local bagButton=getglobal("AIOBFrameBag"..j); bagButton:ClearAllPoints(); if j == 5 then bagButton:SetPoint("TOPLEFT", "AIOBBagButtonsBar", "TOPLEFT", 0, 0); else bagButton:SetPoint("TOPLEFT", "AIOBFrameBag"..(j-1), "TOPLEFT", AIOB_ITEM_OFFSET_X, 0); end bagButton:Show(); end local First_Y; First_Y = AIOB_FIRST_ITEM_OFFSET_Y; if AIOBBagView == 1 then First_Y = AIOB_FIRST_ITEM_OFFSET_Y + AIOB_ITEM_OFFSET_Y; AIOBBagButtonsBar:Show(); else First_Y = AIOB_FIRST_ITEM_OFFSET_Y; AIOBBagButtonsBar:Hide(); end if (AIOBShowPlayers == 0 and AIOBGraphics == 0 ) then AIOB_DEBUG("move up"); First_Y = First_Y - AIOB_ITEM_OFFSET_Y; AIOBBagButtonsBar:ClearAllPoints(); AIOBBagButtonsBar:SetPoint("TOP", "AIOBFrame", "TOP", 0, -28); else AIOBBagButtonsBar:ClearAllPoints(); AIOBBagButtonsBar:SetPoint("TOP", "AIOBFrame", "TOP", 0, -28-39); end for j=1, frame.size, 1 do local itemButton = getglobal(name.."Item"..j); -- Set first button itemButton:ClearAllPoints(); if ( j == 1 ) then itemButton:SetPoint("TOPLEFT", name, "TOPLEFT", AIOB_FIRST_ITEM_OFFSET_X, First_Y); else if ( mod((j-1), columns) == 0 ) then itemButton:SetPoint("TOPLEFT", name.."Item"..(j - columns), "TOPLEFT", 0, AIOB_ITEM_OFFSET_Y); else itemButton:SetPoint("TOPLEFT", name.."Item"..(j - 1), "TOPLEFT", AIOB_ITEM_OFFSET_X, 0); end end itemButton.readable = readable; itemButton:Show(); end local button = nil; for i = frame.size+1, AIOB_MAX_ID do button = getglobal("AIOBFrameItem"..i); if ( button ) then button:Hide(); end end AIOBFrame_PopulateFrame(); end function AIOB_GetTooltipData() local soulbound = nil; local madeBy = nil; local field; local left, right; for index = 1, 15, 1 do field = getglobal("AIOBHiddenTooltipTextLeft"..index); if( field and field:IsVisible() ) then left = field:GetText(); else left = ""; end field = getglobal("AIOBHiddenTooltipTextRight"..index); if( field and field:IsVisible() ) then right = field:GetText(); else right = ""; end if ( string.find(left, ITEM_SOULBOUND) ) then soulbound = 1; end local iStart, iEnd, val1 = string.find(left, ""); if (val1) then madeBy = val1; end end return soulbound, madeBy; end function AIOBFrame_SaveBagInfo(currPlayer, bagIndex, bagName) if bagName=="Bank" then return 24; end local bagNum_Slots = GetContainerNumSlots(bagIndex); local bagNum_ID = BankButtonIDToInvSlotID(bagIndex, 1); local itemLink = GetInventoryItemLink("player", bagNum_ID); local texture = GetInventoryItemTexture("player", bagNum_ID); local hasCooldown, repairCost = AIOBHiddenTooltip:SetInventoryItem("player", bagNum_ID); local soulbound, madeBy = AIOB_GetTooltipData(); if (itemLink) then currPlayer[bagName]= {}; AIOB_SaveItemData(currPlayer[bagName], itemLink, strsub(texture,17), bagNum_Slots, _ , _ , soulbound, madeBy, _); return bagNum_Slots; else currPlayer[bagName] = nil; return 0; end end function AIOBSaveBagItem(currPlayer, bagNewIndex, itemIndex, bagName) local itemLink = GetContainerItemLink(bagNewIndex, itemIndex); local texture, itemCount, _, itemQuality = GetContainerItemInfo(bagNewIndex, itemIndex); local hasCooldown, repairCost; if bagNewIndex == BANK_CONTAINER then local newIndex = 39 + itemIndex; hasCooldown, repairCost = AIOBHiddenTooltip:SetInventoryItem("player", newIndex); else hasCooldown, repairCost = AIOBHiddenTooltip:SetBagItem(bagNewIndex, itemIndex); end local start, duration, enable = GetContainerItemCooldown(bagNewIndex, itemIndex); local soulbound, madeBy = AIOB_GetTooltipData(); local cooldown; if hasCooldown and enable > 0 then cooldown = { ["s"] = start, ["d"] = duration, ["e"] = enable }; end if (itemLink) then currPlayer[bagName][itemIndex] = {}; AIOB_SaveItemData(currPlayer[bagName][itemIndex], itemLink, strsub(texture,17), _, itemCount, itemQuality, soulbound, madeBy, cooldown); else currPlayer[bagName][itemIndex] = nil; end end function AIOB_SaveItemData(AIOBItem, itemLink, texture, Slots, Count, Quality, soulbound, madeBy, Cooldown) local myColor, myLink, name; local _,_, myColor, myLink, name = strfind(itemLink, "|c(%x+)|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r"); AIOBItem["name"] = name; AIOBItem["i"] = texture; AIOBItem["s"] = Slots; AIOBItem["c"] = Count; AIOBItem["q"] = Quality; if (ItemsMatrix_GetLink or LootLink_GetLink) then AIOBItem["color"] = nil; AIOBItem["item"] = nil; else AIOBItem["color"] = myColor; AIOBItem["item"] = myLink; end AIOBItem["sb"] = soulbound; AIOBItem["m"] = madeBy; AIOBItem["d"] = Cooldown; end function AIOB_SaveMoney() if ( PlayerName ) then if ( AIOBProfile[PlayerName] ) then AIOBProfile[PlayerName]["money"] = GetMoney(); end if ( AIOB_MoneyFrame:IsVisible() ) then MoneyFrame_Update("AIOB_MoneyFrame", bankPlayer.money); AIOB_UpdateTotalMoney(); end end end function AIOBFrame_SaveItems() local currPlayer=AIOBProfile[PlayerName]; if currPlayer == nil then return; end if not AtBank then return; end AIOB_DEBUG("SaveItems"); currPlayer.Bags, _ = GetNumBankSlots(); local bagName, bagMaxIndex, bagNewIndex; for bagNum = 0, currPlayer.Bags do if bagNum == 0 then -- Is it the bank? bagName = "Bank"; bagNewIndex = BANK_CONTAINER; else -- It's in a bag slot bagName = "Bag"..(4+bagNum); bagNewIndex = (4+bagNum); end if (not currPlayer[bagName]) then AIOB_DEBUG("Clearing "..bagName); currPlayer[bagName] = {} ; end bagMaxIndex = AIOBFrame_SaveBagInfo(currPlayer, bagNewIndex, bagName); for itemIndex = 1, bagMaxIndex do AIOBSaveBagItem(currPlayer, bagNewIndex, itemIndex, bagName); end end for bagNum = 5+currPlayer.Bags, 10 do currPlayer["Bag"..bagNum] = nil; end AIOB_SaveMoney(); AIOBFrame_PopulateFrame(); end function AIOBFrame_PopulateFrame() local texture, itemButton, itemCount, itemQuality; local bagName, bagMaxIndex, bagNewIndex; local buttonIndex = 1; local BlankTexture; local maxBags; if not bankPlayer then return; end if bankPlayer.Bags then maxBags = bankPlayer.Bags; else maxBags = 0; end AIOB_UpdateBagCost(maxBags); _, BlankTexture = GetInventorySlotInfo("Bag0Slot"); for bagNum = 0, maxBags do if bagNum == 0 then -- Is it the bank? bagName = "Bank"; bagNewIndex = BANK_CONTAINER; bagMaxIndex = 24; else bagName = "Bag"..(4+bagNum); bagNewIndex = (4+bagNum); local bagButton = getglobal("AIOBFrameBag"..(bagNewIndex)); SetItemButtonNormalTextureVertexColor(bagButton, 1.0,1.0,1.0); SetItemButtonTextureVertexColor(bagButton, 1.0,1.0,1.0); if bankPlayer[bagName] and bankPlayer[bagName]["s"] then bagMaxIndex = bankPlayer[bagName]["s"]; SetItemButtonTexture(bagButton, "Interface\\Icons\\"..bankPlayer[bagName]["i"]); else bagMaxIndex = 0; SetItemButtonTexture(bagButton, BlankTexture); end end for itemIndex = 1,bagMaxIndex do itemButton = getglobal("AIOBFrameItem"..buttonIndex); buttonIndex = buttonIndex + 1; if(bankPlayer and bankPlayer[bagName] and bankPlayer[bagName][itemIndex]) then texture = "Interface\\Icons\\"..bankPlayer[bagName][itemIndex]["i"]; itemCount = bankPlayer[bagName][itemIndex]["c"]; else texture = nil; itemCount = 0; end if(itemButton) then local locked; if AtBank then texture, itemCount, locked, itemQuality, itemReadable = GetContainerItemInfo(bagNewIndex, itemIndex); AIOBFrame_UpdateCooldown(itemButton); else locked = nil; end if bankPlayer[bagName] and bankPlayer[bagName][itemIndex] and bankPlayer[bagName][itemIndex]["d"] then local cooldown = getglobal(itemButton:GetName().."Cooldown"); local cooldownInfo = bankPlayer[bagName][itemIndex]["d"]; if cooldownInfo and cooldownInfo["e"] then local start, duration, enable = cooldownInfo["s"], cooldownInfo["d"], cooldownInfo["e"]; if duration > 0 then CooldownFrame_SetTimer(cooldown, start, duration, enable); else cooldown:Hide(); end else cooldown:Hide(); end end if bankPlayer[bagName] and bankPlayer[bagName][itemIndex] and bankPlayer[bagName][itemIndex]["q"] then AIOB_UpdateBorder(itemButton, bankPlayer[bagName][itemIndex]["q"]); else AIOB_UpdateBorder(itemButton, itemQuality); end SetItemButtonTexture(itemButton, texture); SetItemButtonCount(itemButton, itemCount); SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5); itemButton.bagIndex = bagNewIndex; itemButton.itemIndex= itemIndex; end end end for bagNum = 5+maxBags, 10 do local bagButton = getglobal("AIOBFrameBag"..(bagNum)); SetItemButtonNormalTextureVertexColor(bagButton, 1.0,0.1,0.1); SetItemButtonTextureVertexColor(bagButton, 1.0,0.1,0.1); SetItemButtonTexture(bagButton, BlankTexture); end if ( bankPlayer and bankPlayer["money"] ) then MoneyFrame_Update("AIOB_MoneyFrame", bankPlayer["money"]); AIOB_MoneyFrame:Show(); else AIOB_MoneyFrame:Hide(); end AIOB_UpdateTotalMoney(); AIOBFrame_UpdateLookIfNeeded(); end function AIOB_UpdateBorder(itemButton, itemQuality) local color = { ["r"]=0.5, ["g"]=0.5, ["b"]=0.5 }; if ( itemQuality ) then if itemQuality == -1 then color = { ["r"]=1, ["g"]=1, ["b"]=1 } -- white elseif itemQuality == 1 then color = { ["r"]=0.5, ["g"]=0.5, ["b"]=0.5 } -- grey elseif itemQuality == 2 then color = { ["r"]=0.0, ["g"]=1.0, ["b"]=0.0 } -- green elseif itemQuality == 3 then color = { ["r"]=0.5, ["g"]=0.5, ["b"]=1.0 } -- blue elseif itemQuality == 4 then color = { ["r"]=0.7, ["g"]=0.1, ["b"]=1.0 } -- purple else color = { ["r"]=0.0, ["g"]=0.0, ["b"]=0.0 } -- black end end SetItemButtonNormalTextureVertexColor(itemButton, color.r, color.g, color.b); end -- == Viewing other peoples banks == function AIOB_UserDropDown_GetValue() if ( bankPlayerName ) then return bankPlayerName; else return (UnitName("player").."|"..AIOB_Trim(GetCVar("realmName"))); end end function AIOB_UserDropDown_OnLoad() UIDropDownMenu_Initialize(this, AIOB_UserDropDown_Initialize); UIDropDownMenu_SetSelectedValue(this, AIOB_UserDropDown_GetValue()); AIOBDropDown.tooltip = "You are viewing this player's bank contents."; UIDropDownMenu_SetWidth(140, AIOBDropDown); OptionsFrame_EnableDropDown(AIOBDropDown); end function AIOB_UserDropDown_OnClick() if ( not bankPlayer ) then return; end if AtBank then CloseBankFrame(); OpenAIOBFrame(); end -- UIDropDownMenu_SetSelectedValue(AIOBDropDown, this.value); if ( this.value ) then bankPlayer = AIOB_GetPlayer(this.value); end AIOBFrame_PopulateFrame(); end function AIOB_UserDropDown_Initialize() local selectedValue = UIDropDownMenu_GetSelectedValue(AIOBDropDown); local info; for key, value in AIOBProfile do local thisRealmPlayers = AIOB_Split(key, "|")[2]; if ( table.getn(AIOBProfile[key]) > 0 or AIOBProfile[key].money ) then if (AIOBAllRealms == 1 or thisRealmPlayers == AIOB_Trim(GetCVar("realmName")) ) then info = {}; info.text = AIOB_Split(key,"|")[1].." of "..AIOB_Split(key,"|")[2]; info.value = key; info.func = AIOB_UserDropDown_OnClick; if ( selectedValue == info.value ) then info.checked = 1; else info.checked = nil; end UIDropDownMenu_AddButton(info); end end end end function AIOB_ShowAllRealms_Check_OnClick() if ( AIOBAllRealms == 0 ) then AIOBAllRealms = 1; else AIOBAllRealms = 0; end AIOB_UpdateTotalMoney(); end function AIOB_ShowAllRealms_Check_OnShow() if ( AIOBAllRealms == 1 ) then this.checked = 1; else this.checked = nil; end OptionsFrame_EnableCheckBox(this); this:SetChecked(this.checked); this.tooltipText = "Check to show all saved characters, regardless of realm."; end -- === Toggle Functions === -- All toggling of options function ToggleAIOBFrame() if ( AIOBFrame:IsVisible() ) then CloseAIOBFrame(); else OpenAIOBFrame(); end end function CloseAIOBFrame() if AtBank then CloseBankFrame(); end if ( AIOBFrame:IsVisible() ) then HideUIPanel(AIOBFrame); end end function OpenAIOBFrame() AIOBFrame_UpdateLookIfNeeded(); ShowUIPanel(AIOBFrame, 1); end function AIOB_Toggle_Option(option, value, quiet) if value == nil then if getglobal("AIOB"..option) == 1 then value = 0; else value = 1; end end setglobal("AIOB"..option, value); AIOBProfile[PlayerName][option] = value; if not quiet then local chat_message; local globalName = "AIOB_CHAT_"..string.upper(option); if value == 0 then globalName = globalName.."OFF"; else globalName = globalName.."ON"; end chat_message = getglobal(globalName); if ( chat_message ) then AIOB_Print(chat_message); else AIOB_DEBUG("ERROR: No global "..globalName); end end if option == "ReplaceBank" then AIOB_SetReplaceBank(); elseif option == "ShowPlayers" or option == "BagView" then AIOBFrame_UpdateLook(getglobal("AIOBFrame"),AIOB_GetBagsTotalSlots()); elseif option == "Graphics" or option == "Background" then AIOB_SetGraphics(); AIOBFrame_UpdateLook(getglobal("AIOBFrame"),AIOB_GetBagsTotalSlots()); elseif option == "Freeze" then AIOB_SetFreeze(); end end function AIOB_SetGraphics() if AIOBGraphics == 1 then AIOBFrame:SetBackdropColor(0,0,0,0); AIOBFrame:SetBackdropBorderColor(0,0,0,0); AIOBFramePortrait:Show(); AIOBFrameTextureTopLeft:Show(); AIOBFrameTextureTopCenter:Show(); AIOBFrameTextureTopRight:Show(); AIOBFrameTextureLeft:Show(); AIOBFrameTextureCenter:Show(); AIOBFrameTextureRight:Show(); AIOBFrameTextureBottomLeft:Show(); AIOBFrameTextureBottomCenter:Show(); AIOBFrameTextureBottomRight:Show(); AIOBFrameName:ClearAllPoints(); AIOBFrameName:SetPoint("TOPLEFT", "AIOBFrame", "TOPLEFT", 70, -8); AIOBFrameCloseButton:ClearAllPoints(); AIOBFrameCloseButton:SetPoint("TOPRIGHT", "AIOBFrame", "TOPRIGHT", 10, 0); else if AIOBBackground==1 then AIOBFrame:SetBackdropColor(0,0,0,0.7); AIOBFrame:SetBackdropBorderColor(1,1,1,0.7); else AIOBFrame:SetBackdropColor(0,0,0,0); AIOBFrame:SetBackdropBorderColor(1,1,1,0); end AIOBFramePortrait:Hide(); AIOBFrameTextureTopLeft:Hide(); AIOBFrameTextureTopCenter:Hide(); AIOBFrameTextureTopRight:Hide(); AIOBFrameTextureLeft:Hide(); AIOBFrameTextureCenter:Hide(); AIOBFrameTextureRight:Hide(); AIOBFrameTextureBottomLeft:Hide(); AIOBFrameTextureBottomCenter:Hide(); AIOBFrameTextureBottomRight:Hide(); AIOBFrameName:ClearAllPoints(); AIOBFrameName:SetPoint("TOPLEFT", "AIOBFrame", "TOPLEFT", 5, -6); AIOBFrameCloseButton:ClearAllPoints(); AIOBFrameCloseButton:SetPoint("TOPRIGHT", "AIOBFrame", "TOPRIGHT", 2, 2); end end function AIOB_SetFreeze() if AIOBFreeze == 1 then AIOBFreezeNormalTexture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\LockButton-Locked-Up"); else AIOBFreezeNormalTexture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\LockButton-Unlocked-Up"); end end -- SetReplaceBank: Sets if AIOB replaces the official Bank frame -- Unhooks the Official blizzard frome from the opened and closed events function AIOB_SetReplaceBank() if BankFrame_Saved == nil then BankFrame_Saved = getglobal("BankFrame"); end if ( AIOBReplaceBank == 0 ) then BankFrame_Saved:RegisterEvent("BANKFRAME_OPENED"); BankFrame_Saved:RegisterEvent("BANKFRAME_CLOSED"); setglobal("BankFrame", BankFrame_Saved); BankFrame_Saved = nil; else if BankFrame_Saved:IsVisible() then BankFrame_Saved:Hide(); end BankFrame_Saved:UnregisterEvent("BANKFRAME_OPENED"); BankFrame_Saved:UnregisterEvent("BANKFRAME_CLOSED"); setglobal("BankFrame", AIOBFrameAtBankText); end end -- == End Toggle Functions == -- Get Link and Get Hyperlink - maintain independance. function AIOB_GetLink(item) if item and item.color and item.item and item.name then local link = "|c"..item.color.."|H"..AIOB_GetHyperlink(item).."|h["..item.name.."]|h|r"; return link; end return nil; end function AIOB_GetHyperlink(item) if item and item.item then local link = string.gsub(item.item, "(%d+):(%d+):(%d+):(%d+)", "%1:0:%3:%4"); return "item:"..link; end return nil; end