vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        BagnonForever.lua
                Records inventory data about the current player
                
        BagnonForeverData has the following format, which was adapted from KC_Items
        BagnonForeverData = {
                Realm
                        Character
                                BagID = size,count,[link]
                                        ItemSlot = link,[count]
                                Money = money
        }
--]]

--local globals
local currentPlayer = UnitName("player"); --the name of the current player that's logged on
local currentRealm = GetRealmName(); --what currentRealm we're on
local atBank; --is the current player at the bank or not

--[[ Utility Functions ]]--

--takes a hyperlink (what you see in chat) and converts it to a shortened item link.
--a shortened item link is either the item:w:x:y:z form without the 'item:' part, or just the item's ID (the 'w' part)
function BagnonForever_HyperlinkToShortLink(hyperLink)
        if(hyperLink) then
                local _, _, w, x, y, z = string.find(hyperLink, "item:(%d+):(%d+):(%d+):(%d+)");
                if(tonumber(x) == 0 and tonumber(y) == 0 and tonumber(z) == 0) then
                        return w;
                else
                        return w .. ":" .. x .. ":" .. y .. ":" .. z;
                end
        end
end

--[[  Storage Functions ]]--

--saves data about a specific item the current player has
local function SaveItemData(bagID, itemSlot)
        local texture, count = GetContainerItemInfo(bagID, itemSlot);
        local data;
        
        if(texture) then
                data = BagnonForever_HyperlinkToShortLink( GetContainerItemLink(bagID, itemSlot) );
                if(count > 1) then
                        data = data .. "," .. count;
                end
        end
        
        BagnonForeverData[currentRealm][currentPlayer][bagID][itemSlot] = data;
end

--saves all the data about the current player's bag
local function SaveBagData(bagID)
        --don't save bank data unless you're at the bank
        if Bagnon_IsBankBag(bagID) and not atBank then
                return;
        end
        
        local size;
        if(bagID == KEYRING_CONTAINER) then
                size = GetKeyRingSize();
        else
                size = GetContainerNumSlots(bagID);
        end
        
        if(size > 0) then
                local link, count;
                
                if bagID > 0 then
                        link = BagnonForever_HyperlinkToShortLink( GetInventoryItemLink("player", ContainerIDToInventoryID(bagID) ) );
                end
                
                count = GetInventoryItemCount("player", ContainerIDToInventoryID(bagID));
                
                --save bag size
                BagnonForeverData[currentRealm][currentPlayer][bagID] = {};
                BagnonForeverData[currentRealm][currentPlayer][bagID].s = size .. "," .. count .. ",";
                
                if link then
                        BagnonForeverData[currentRealm][currentPlayer][bagID].s = BagnonForeverData[currentRealm][currentPlayer][bagID].s .. link;
                end

                --save all item info
                for index = 1, size, 1 do
                        SaveItemData(bagID, index);
                end
        else
                BagnonForeverData[currentRealm][currentPlayer][bagID] = nil;
        end
end

local function SavePlayerMoney()
        BagnonForeverData[currentRealm][currentPlayer].g = GetMoney();
end

--save all bank data about the current player
local function SaveBankData()
        SaveBagData(-1);
        local bagID;
        for bagID = 5, 10, 1 do
                SaveBagData(bagID);
        end
end

--save all inventory data about the current player
local function SaveAllData()
        local i;
        --you know, this should probably be a constant
        for i = -2, 10, 1 do
                SaveBagData(i);
        end
        SavePlayerMoney();
end

--[[ Removal Functions ]]--

--removes all saved data about the given player
function BagnonForever_RemovePlayer(player, realm)
        if(BagnonForeverData[realm]) then
                BagnonForeverData[realm][player] = nil;
        end
end

--[[ Startup Functions ]]--

local function UpdateVersion()
        BagnonForeverData.version = BAGNON_FOREVER_VERSION;
        
        BagnonMsg(BAGNON_FOREVER_UPDATED);
end

--[[
        BagnonForever's settings are set to default under the following conditions
                No saved variables (duh)
                Versions that did not know about the wowVersion (should only be on new installs)
                Right after any WoW Patch
                
        I think that the itemcache is rebuilt whenever there's an update to the game, so saved data becomes corrupt.
--]]
local function LoadVariables()  
        if(not (BagnonForeverData and BagnonForeverData.wowVersion and BagnonForeverData.wowVersion == GetBuildInfo()) ) then
                BagnonForeverData = {
                        version = BAGNON_FOREVER_VERSION,
                        wowVersion = GetBuildInfo();
                };
        end
        
        --this handles upgrading from 6.7.19 or earlier
        if(BagnonDB and not (BagnonDB.GetPlayers or BagnonDB.GetPlayerList)) then
                message("BagnonForever:  Updating from an old version.  Saved data will be available on your next login.");
                BagnonDB = nil;
        end
        
        if(not BagnonForeverData[currentRealm]) then
                BagnonForeverData[currentRealm] = {};
        end
        
        if(not BagnonForeverData[currentRealm][UnitName("player")]) then
                BagnonForeverData[currentRealm][UnitName("player")] = {};
                SaveAllData();
        end
        
        if(BagnonForeverData.version ~= BAGNON_FOREVER_VERSION) then
                UpdateVersion();
        end
end

--Event handler creation
CreateFrame("Frame", "BagnonForever");

BagnonForever:RegisterEvent("BAG_UPDATE");
BagnonForever:RegisterEvent("PLAYER_LOGIN");
BagnonForever:RegisterEvent("BANKFRAME_CLOSED");
BagnonForever:RegisterEvent("BANKFRAME_OPENED");
BagnonForever:RegisterEvent("PLAYERBANKSLOTS_CHANGED");
BagnonForever:RegisterEvent("PLAYER_MONEY");

BagnonForever:SetScript("OnEvent", function()
        if(event == "BAG_UPDATE") then
                SaveBagData(arg1);
        elseif(event == "PLAYERBANKSLOTS_CHANGED") then
                SaveBagData(-1);
        elseif(event == "BANKFRAME_CLOSED") then
                atBank = nil;
                SaveBankData();
        elseif(event == "BANKFRAME_OPENED") then
                atBank = 1;
                SaveBankData();
        elseif(event == "PLAYER_MONEY") then
                SavePlayerMoney();
        elseif(event == "PLAYER_LOGIN") then
                LoadVariables();
                SavePlayerMoney();
        end
end);

Generated by GNU Enscript 1.6.5.90.