-- 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