vanilla-wow-addons – Rev 1
?pathlinks?
-- FishingBuddy
--
-- Everything you wanted support for in your fishing endeavors
local gotSetupDone = false;
local playerName;
local realmName;
local DEFAULT_MINIMAP_POSITION = 256;
FishingBuddy.IsLoaded = function()
return gotSetupDone;
end
-- if the old information is still there, then we might not have per
-- character saved info, so let's save it away just in case. It'll go
-- away the second time we load the add-on
FishingBuddy.SavePlayerInfo = function()
if ( FishingBuddy_Info[realmName] and
FishingBuddy_Info[realmName]["Settings"] and
FishingBuddy_Info[realmName]["Settings"][playerName] ) then
local tabs = { "Settings", "Outfit", "WasWearing" };
for _,tab in tabs do
for k,v in FishingBuddy_Player[tab] do
FishingBuddy_Info[realmName][tab][playerName][k] = v;
end
end
end
end
local Setup = {};
Setup.CheckPlayerInfo = function()
local tabs = { "Settings", "Outfit", "WasWearing" };
if ( not FishingBuddy_Player ) then
FishingBuddy_Player = {};
for _,tab in tabs do
FishingBuddy_Player[tab] = { };
end
if ( FishingBuddy_Info[realmName] and
FishingBuddy_Info[realmName]["Settings"] and
FishingBuddy_Info[realmName]["Settings"][playerName] ) then
for _,tab in tabs do
if ( FishingBuddy_Info[realmName][tab] and
FishingBuddy_Info[realmName][tab][playerName] ) then
for k,v in FishingBuddy_Info[realmName][tab][playerName] do
FishingBuddy_Player[tab][k] = v;
end
end
end
end
elseif ( FishingBuddy_Info[realmName] and
FishingBuddy_Info[realmName]["Settings"] ) then
-- the saved information is there, kill the old stuff
for _,tab in tabs do
if ( FishingBuddy_Info[realmName][tab] ) then
FishingBuddy_Info[realmName][tab][playerName] = nil;
-- Duh, table.getn doesn't work because there
-- aren't any integer keys in this table
if ( next(FishingBuddy_Info[realmName][tab]) == nil ) then
FishingBuddy_Info[realmName][tab] = nil;
end
end
end
if ( next(FishingBuddy_Info[realmName]) == nil ) then
FishingBuddy_Info[realmName] = nil;
end
end
end
Setup.CheckPlayerSetting = function(setting, defaultvalue)
if ( not FishingBuddy_Player["Settings"] ) then
FishingBuddy_Player["Settings"] = { };
end
if ( not FishingBuddy_Player["Settings"][setting] ) then
FishingBuddy_Player["Settings"][setting] = defaultvalue;
end
end
Setup.CheckGlobalSetting = function(setting, defaultvalue)
if ( not FishingBuddy_Info[setting] ) then
if ( not defaultvalue ) then
FishingBuddy_Info[setting] = {};
else
FishingBuddy_Info[setting] = defaultvalue;
end
end
end
Setup.CheckRealm = function()
local tabs = { "Settings", "Outfit", "WasWearing" };
for _,tab in tabs do
if ( FishingBuddy_Info[tab] ) then
local old = FishingBuddy_Info[tab][playerName];
if ( old ) then
if ( not FishingBuddy_Info[realmName] ) then
FishingBuddy_Info[realmName] = { };
for _,tab in tabs do
FishingBuddy_Info[realmName][tab] = { };
end
end
FishingBuddy_Info[realmName][tab][playerName] = { };
for k, v in old do
FishingBuddy_Info[realmName][tab][playerName][k] = v;
end
FishingBuddy_Info[tab][playerName] = nil;
end
-- clean out cruft, if we have some
FishingBuddy_Info[tab][UNKNOWNOBJECT] = nil;
FishingBuddy_Info[tab][UKNOWNBEING] = nil;
-- Duh, table.getn doesn't work because there
-- aren't any integer keys in this table
if ( next(FishingBuddy_Info[tab]) == nil ) then
FishingBuddy_Info[tab] = nil;
end
end
end
end
Setup.UpdateFishingDB1 = function()
local version = FishingBuddy_Info["Version"];
if ( not version ) then
version = 7700; -- be really old
end
if ( FishingBuddy_Info["FishingHoles"] ) then
if ( version < 8300 ) then
-- handle a beta bug where we missed that GetSubZoneText() returns "" and not nil
for zone in FishingBuddy_Info["FishingHoles"] do
if ( FishingBuddy_Info["FishingHoles"][zone][""] ) then
if ( not FishingBuddy_Info["FishingHoles"][zone][zone] ) then
FishingBuddy_Info["FishingHoles"][zone][zone] = { };
end
for k,v in FishingBuddy_Info["FishingHoles"][zone][""] do
FishingBuddy_Info["FishingHoles"][zone][zone][k] = v;
end
FishingBuddy_Info["FishingHoles"][zone][""] = nil;
end
end
end
if ( version < 8503 ) then
local fh = FishingBuddy_Info["FishingHoles"];
local ff = FishingBuddy_Info["Fishies"];
for zone in fh do
for subzone in fh[zone] do
local crap = {};
for fishie in fh[zone][subzone] do
if ( type(fishie) == "string" ) then
tinsert(crap, fishie);
end
end
for _,fishie in crap do
if ( ff[fishie] ) then
local item = ff[fishie].item;
if ( item ) then
local _,_,id = string.find(item, "^(%d+):");
id = id + 0;
fh[zone][subzone][id] = fh[zone][subzone][fishie];
fh[zone][subzone][fishie] = nil;
end
end
end
end
end
local fishes = {};
for fishie in ff do
if ( type(fishie) == "string" ) then
tinsert(fishes, fishie);
end
end
for _,fishie in fishes do
local item = ff[fishie].item;
if ( item ) then
local _,_,id = string.find(item, "^(%d+):");
id = id + 0;
ff[id] = {};
ff[id].name = fishie;
for k,v in ff[fishie] do
if ( k ~= "item" ) then
ff[id][k] = v;
end
end
ff[fishie] = nil;
end
end
-- tracking information
local ft = FishingBuddy_Info["FishTracking"];
for how in ft do
local fishes = {};
for item in ft[how] do
if ( type(item) == "string" ) then
tinsert(fishes, item);
end
end
for _,item in fishes do
local _,_,id = string.find(item, "^(%d+):");
id = tonumber(id);
ft[how][id] = {};
for k,v in ft[how][item] do
ft[how][id][k] = v;
end
if ( ft[how][id].count ) then
ft[how][id].data = {};
for k,v in ft[how][id].count do
ft[how][id].data[k] = v;
end
ft[how][id].count = nil;
end
end
for _,item in fishes do
ft[how][item] = nil;
end
end
end
end
if ( version < 8504 ) then
-- Let's not store default colors for things
local ff = FishingBuddy_Info["Fishies"];
if ( ff ) then
for id in ff do
if ( ff[id].color and ff[id].color == "ffffffff" ) then
ff[id].color = nil;
end
end
end
end
if ( version < 8509 and FishingBuddy_Info["FishTracking"] ) then
local ft = FishingBuddy_Info["FishTracking"]["WEEKLY"];
for id,what in ft do
if ( not ft[id].data[52] ) then
ft[id].data[52] = 0;
table.setn(ft[id].data, 53);
end
end
end
if ( not FishingBuddy_Info["Locations"] ) then
return;
end
-- Duh, table.getn doesn't work because there aren't any integer
-- keys in this table
if ( next(FishingBuddy_Info["Locations"]) == nil ) then
FishingBuddy_Info["Locations"] = nil;
return;
end
FishingBuddy_Info["FishingHoles"] = { };
FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN] = { };
for zone in FishingBuddy_Info["Locations"] do
FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][zone] = { };
local tab = FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][zone];
for k,v in FishingBuddy_Info["Locations"][zone] do
tab[k] = v;
end
end
FishingBuddy_Info["Locations"] = nil;
end
Setup.UpdateFishingDB2 = function()
local version = FishingBuddy_Info["Version"];
if ( not version ) then
version = 7700; -- be really old
end
-- track the weekly fish that got missed at the end of the year
if ( version < 8509 ) then
local ft = FishingBuddy_Info["FishTracking"]["WEEKLY"];
for id,what in ft do
if ( FishingBuddy.ByFishie[id] ) then
local total = 0;
for subzone,count in FishingBuddy.ByFishie[id] do
total = total + count;
end
local tracked = 0;
local limit = table.getn(what.data)-1;
for i=0,limit do
tracked = tracked + what.data[i];
end
local diff = total - tracked;
if ( diff > 0 ) then
ft[id].data[52] = ft[id].data[52] + diff;
end
end
end
end
FishingBuddy_Info["Version"] = FishingBuddy.CURRENTVERSION;
end
-- Based on code in QuickMountEquip
Setup.HookFunction = function(func, newfunc)
local oldValue = getglobal(func);
if ( oldValue ~= getglobal(newfunc) ) then
setglobal(func, getglobal(newfunc));
return true;
end
return false;
end
-- set up alternate view of fish data. do this as startup to
-- lower overall dynamic hit when loading the window
Setup.SetupByFishie = function()
if ( not FishingBuddy.ByFishie ) then
local fh = FishingBuddy_Info["FishingHoles"];
local ff = FishingBuddy_Info["Fishies"];
FishingBuddy.ByFishie = { };
FishingBuddy.SortedFishies = { };
for zone in fh do
for subzone in fh[zone] do
for id in fh[zone][subzone] do
local quantity = fh[zone][subzone][id];
if ( not FishingBuddy.ByFishie[id] ) then
FishingBuddy.ByFishie[id] = { };
tinsert(FishingBuddy.SortedFishies,
{ text = ff[id].name, id = id });
end
if ( not FishingBuddy.ByFishie[id][subzone] ) then
FishingBuddy.ByFishie[id][subzone] = quantity;
else
FishingBuddy.ByFishie[id][subzone] = FishingBuddy.ByFishie[id][subzone] + quantity;
end
end
end
end
FishingBuddy.FishSort(FishingBuddy.SortedFishies, true);
end
end
Setup.InitSortHelpers = function()
local fh = FishingBuddy_Info["FishingHoles"];
FishingBuddy.SortedZones = {};
FishingBuddy.SortedByZone = {};
FishingBuddy.SortedSubZones = {};
for zone in fh do
tinsert(FishingBuddy.SortedZones, zone);
FishingBuddy.SortedByZone[zone] = {};
for subzone in fh[zone] do
tinsert(FishingBuddy.SortedByZone[zone], subzone);
tinsert(FishingBuddy.SortedSubZones, subzone);
end
table.sort(FishingBuddy.SortedByZone[zone]);
end
table.sort(FishingBuddy.SortedZones);
table.sort(FishingBuddy.SortedSubZones);
end
Setup.EnhanceSoundDefaults = function()
Setup.CheckPlayerSetting("EnhanceSoundSoundVolume", 1.0);
Setup.CheckPlayerSetting("EnhanceSoundMusicVolume", 0.0);
Setup.CheckPlayerSetting("EnhanceSoundAmbienceVolume", 0.0);
end
Setup.InitSettings = function()
if( not FishingBuddy_Info ) then
FishingBuddy_Info = { };
end
-- global stuff
Setup.UpdateFishingDB1();
Setup.CheckRealm();
Setup.CheckGlobalSetting("ImppDBLoaded", 0);
Setup.CheckGlobalSetting("FishInfo2", 0);
Setup.CheckGlobalSetting("DataFish", 0);
Setup.CheckGlobalSetting("FishingHoles");
Setup.CheckGlobalSetting("FishingSkill");
Setup.CheckGlobalSetting("Fishies");
Setup.CheckPlayerInfo();
-- per user stuff
for _,option in FishingBuddy.OPTIONS do
local setting = option.default;
if ( option.check and option.checkfail ) then
if ( not option.check() ) then
setting = option.checkfail;
end
end
Setup.CheckPlayerSetting(option.name, setting);
end
-- setting not on option pane (or not checkboxes)
Setup.CheckPlayerSetting("ShowLocationZones", 1);
Setup.CheckPlayerSetting("GroupByLocation", 1);
-- titan panel support
Setup.CheckPlayerSetting("TitanClickToSwitch", 1);
-- InfoBar support
Setup.CheckPlayerSetting("InfoBarClickToSwitch", 1);
-- minimap button support
Setup.CheckPlayerSetting("MinimapClickToSwitch", 1);
Setup.CheckPlayerSetting("MinimapButtonPosition", DEFAULT_MINIMAP_POSITION);
-- Option key casting
Setup.CheckPlayerSetting("EasyCastKeys", FishingBuddy.KEYS_NONE);
Setup.CheckPlayerSetting("SuitUpKeys", FishingBuddy.KEYS_NONE);
Setup.EnhanceSoundDefaults();
if ( FishingBuddy.InitTracking ) then
FishingBuddy.InitTracking();
end
Setup.SetupByFishie();
Setup.UpdateFishingDB2();
Setup.InitSortHelpers();
end
Setup.RegisterMyAddOn = function()
-- Register the addon in myAddOns
if (myAddOnsFrame_Register) then
local details = {
name = FishingBuddy.ID,
description = FishingBuddy.DESCRIPTION,
version = FishingBuddy.VERSION,
releaseDate = 'July 21, 2005',
author = 'Sutorix',
email = 'Windrunner',
category = MYADDONS_CATEGORY_PROFESSIONS,
frame = "FishingBuddy",
optionsframe = "FishingBuddyFrame",
};
local help = "";
for _,line in FishingBuddy.HELPMSG do
if ( type(line) == "table" ) then
for _,l in line do
help = help.."\n"..l;
end
else
help = help.."\n"..line;
end
end
myAddOnsFrame_Register(details, { help });
end
end
Setup.RegisterHandlers = function()
temp = ToggleMinimap;
if ( Setup.HookFunction("ToggleMinimap", "FishingBuddy_ToggleMinimap") ) then
FishingBuddy.SavedToggleMinimap = temp;
end
FishingBuddy.TrapWorldMouse()
end
FishingBuddy.Initialize = function()
-- Set everything up, then dump the code we don't need anymore
playerName, realmName = FishingBuddy.SetupNameInfo();
if ( Setup ) then
if ( GetBuildInfo ) then
local version, buildnum, builddate = GetBuildInfo();
else
FishingBuddy.Is10900 = true;
end
Setup.RegisterHandlers();
Setup.InitSettings();
-- register with myAddOn
Setup.RegisterMyAddOn();
gotSetupDone = true;
FishingBuddy.WatchUpdate();
-- we don't need these functions anymore, gc 'em
Setup = nil;
end
end