vanilla-wow-addons – Rev 1
?pathlinks?
--[[
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.