-- Handle tracking cycle fish FB_TFConstants = {}; -- set up FishingBuddy.Setup.Translate("FB_OutfitDisplayFrame", FB_TFTranslations, FB_TFConstants); local byweeks = {}; byweeks[FB_TFConstants.ABBREV_JANUARY] = 0; byweeks[FB_TFConstants.ABBREV_APRIL] = 13; byweeks[FB_TFConstants.ABBREV_JULY] = 26; byweeks[FB_TFConstants.ABBREV_OCTOBER] = 39; byweeks[FB_TFConstants.ABBREV_DECEMBER] = 52; FB_TFConstants.BYWEEKS_TABLE = byweeks; if ( FishingBuddy_Info and FishingBuddy_Info["FishTracking"] ) then PBTF_Info = {}; for k,v in pairs(FishingBuddy_Info["FishTracking"]) do PBTF_Info[k] = v; end FishingBuddy_Info["FishTracking"] = nil; end -- free up the space FB_TFTranslations = nil; -- FB_TrackingFrame = {}; local GRAPH_HEIGHT = 120; local trackingWordMap = { ["WEEKLY"] = FBConstants.WEEKLY, ["HOURLY"] = FBConstants.HOURLY, [FBConstants.WEEKLY] = "WEEKLY", [FBConstants.HOURLY] = "HOURLY", }; local byhours = { [13759] = { ["enUS"] = "Raw Nightfin Snapper", ["deDE"] = "Roher Nachtflossenschnapper", ["frFR"] = "Lutjan nagenuit cru", ["c"] = { r = 0.5, g = 0.5, b = 1.0, a = 0.75 }, }, [13760] = { ["enUS"] = "Raw Sunscale Salmon", ["deDE"] = "Roher Sonnenschuppenlachs", ["frFR"] = "Saumon sol\195\169caille cru", ["c"] = { r = 0.8, g = 0.8, b = 0.1, a = 0.75 }, }, }; local byweeks = { [13756] = { ["enUS"] = "Raw Summer Bass", ["deDE"] = "Roher Sommerbarsch", ["frFR"] = "Perche estivale crue", ["c"] = { r = 1.0, g = 1.0, b = 0.0, a = 0.75 }, }, [13755] = { ["enUS"] = "Winter Squid", ["deDE"] = "Winterkalmar", ["frFR"] = "Calmar hivernal", ["c"] = { r = 0.4, g = 0.1, b = 0.4, a = 0.75 }, }, }; local function UntrackThis(id, name) if ( not byhours[id] and not byweeks[id] ) then for how in pairs(PBTF_Info) do if ( PBTF_Info[how][id] ) then PBTF_Info[how][id] = nil; FishingBuddy.Print(FB_TFConstants.NOTRACKMSG, name); end end else FishingBuddy.Message(FB_TFConstants.NOTRACKERRMSG); end end local function TrackThis(how, id, color, name) if ( not PBTF_Info[how] ) then PBTF_Info[how] = {}; end local limit = 23; if ( how == "WEEKLY" ) then limit = 52; end if ( not PBTF_Info[how][id] ) then PBTF_Info[how][id] = {}; PBTF_Info[how][id].data = {}; for i=0,limit,1 do PBTF_Info[how][id].data[i] = 0; end PBTF_Info[how][id].data.n = limit+1; end if ( name and not PBTF_Info[how][id].name ) then PBTF_Info[how][id].name = name; end if ( color ) then if ( type(color) == "string") then local a = tonumber(string.sub(color,1,2),16); local r = tonumber(string.sub(color,3,4),16); local g = tonumber(string.sub(color,5,6),16); local b = tonumber(string.sub(color,7,8),16); color = { a = a, r = r, g = g, b = b }; end PBTF_Info[how][id].color = color; end end FishingBuddy.TrackThis = TrackThis; FishingBuddy.Commands[FB_TFConstants.TRACK] = {}; FishingBuddy.Commands[FB_TFConstants.TRACK].args = {}; FishingBuddy.Commands[FB_TFConstants.TRACK].args[1] = "[%w]+"; FishingBuddy.Commands[FB_TFConstants.TRACK].args[2] = "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[.-%]|h|r"; FishingBuddy.Commands[FB_TFConstants.TRACK].help = FB_TFConstants.TRACKING_HELP; FishingBuddy.Commands[FB_TFConstants.TRACK].func = function(how, fishlink) if ( how and (how == FBConstants.HOURLY or how == FBConstants.WEEKLY)) then local c, i, n = FishingBuddy.SplitFishLink(fishlink); if ( i ) then TrackThis(trackingWordMap[how], i, c, n); FishingBuddy.Print(FB_TFConstants.TRACKINGMSG, n, how); return true; end end end; FishingBuddy.Commands[FB_TFConstants.NOTRACK] = {}; FishingBuddy.Commands[FB_TFConstants.NOTRACK].args = {}; FishingBuddy.Commands[FB_TFConstants.NOTRACK].args[1] = "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[.-%]|h|r"; FishingBuddy.Commands[FB_TFConstants.NOTRACK].help = FB_TFConstants.TRACKING_HELP; FishingBuddy.Commands[FB_TFConstants.NOTRACK].func = function(fishlink) local c, i, n = FishingBuddy.SplitFishLink(fishlink); if ( i ) then UntrackThis(i, n); return true; end end; FishingBuddy.Commands[FB_TFConstants.TRACKING] = {}; FishingBuddy.Commands[FB_TFConstants.TRACKING].help = FB_TFConstants.TRACKING_HELP; FishingBuddy.Commands[FB_TFConstants.TRACKING].func = function() local pr = FishingBuddy.Print; for jdx in pairs(PBTF_Info) do local how = trackingWordMap[jdx]; pr("Tracking "..how); local ft = PBTF_Info; for id in pairs(ft[jdx]) do local name; if ( ft[jdx][id].name ) then name = ft[jdx][id].name; else name = id; end local line = name.."; "; for k,v in pairs(ft[jdx][id].data) do line = line.." "..k..": "..v; end pr(line); end end return true; end; local function InitTracking() if ( not PBTF_Info ) then PBTF_Info = { }; end for k,v in pairs(byhours) do TrackThis("HOURLY", k, v.c); end for k,v in pairs(byweeks) do TrackThis("WEEKLY", k, v.c); end end local function AddTracking(id, name) local ft = PBTF_Info; local index, how; -- clean up fish removed from the tracking system local hourly = ft["HOURLY"][id]; local weekly = ft["WEEKLY"][id]; if ( hourly and hourly.nevermore ) then PBTF_Info["HOURLY"][id] = nil; end if ( weekly and weekly.nevermore ) then PBTF_Info["WEEKLY"][id] = nil; end ft = PBTF_Info; if ( ft["HOURLY"][id] ) then how = "HOURLY"; index,_ = GetGameTime(); elseif ( ft["WEEKLY"][id] ) then how = "WEEKLY"; index = date("%W"); else return false; end if ( not PBTF_Info[how][id].name ) then PBTF_Info[how][id].name = name; end index = tonumber(index); local p = FishingBuddy.printable; PBTF_Info[how][id].data[index] = PBTF_Info[how][id].data[index] + 1; return true; end FishingBuddy.AddTracking = AddTracking; local function PlotData(graph, num, bw, bs, graphdata, plotthese, hlabels) local maxval = 0; local width = 0; local line; GraphHandler.ClearPlot(graph); for _,info in pairs(graphdata) do if ( info.maxval and info.maxval > maxval ) then maxval = info.maxval; end local w = info.count * (bw+bs); if ( w > width ) then width = w; end end local delta = math.mod(maxval, 5); if ( delta > 0 ) then maxval = maxval + (5 - delta); end graph.maxVal = maxval; graph.barWidth = bw; graph.barSpacing = bs; local count = num; for idx,fishid in pairs(plotthese) do local info = graphdata[fishid]; local c = info.color; GraphHandler.PlotLegend(graph, num-count+1, info.name, info.item, info.texture, c.r, c.g, c.b); _ = GraphHandler.PlotData(graph, info.data, num-count, 1, c.r, c.g, c.b); if ( line ) then line = line.." / "..info.name; else line = info.name; end count = count - 1; end local values = {}; local delta = maxval/5; for v=0,5 do values[string.format("%d", v*delta)] = v; end GraphHandler.PlotGrid(graph, line or "", values, width, hlabels); end local function UpdateGraphData(id, info) local maxval = 0; local n = table.getn(info.data); info.count = n; -- we're zero based n = n - 1; for idx=0,n do if ( info.data[idx] > maxval ) then maxval = info.data[idx]; end end info.maxval = maxval; info.data = info.data; if ( not info.color ) then info.color = {}; else if ( type(info.color) == "string") then local a = tonumber(string.sub(color,1,2),16); local r = tonumber(string.sub(color,3,4),16); local g = tonumber(string.sub(color,5,6),16); local b = tonumber(string.sub(color,7,8),16); info.color = { a = a, r = r, g = g, b = b }; end end local name; info.item, info.texture, _, _, _, name = FishingBuddy.GetFishie(id); local loc = GetLocale(); if ( not info.name ) then if ( byhours[id] and byhours[id][loc] ) then info.name = byhours[id][loc]; elseif ( byweeks[id] and byweeks[id][loc] ) then info.name = byweeks[id][loc]; elseif ( not name ) then info.name = FBConstants.FISH.." ("..id..")"; else info.name = name; end end info.name = FishingBuddy.StripRaw(info.name); end local function DrawTrackingGraph(how, num, bw, bs) local fi = PBTF_Info; local graph; local labels; if ( how == "HOURLY" ) then graph = getglobal("FishingTrackingFrameGraph1"); labels = {["00:00"] = 0, ["06:00"] = 6, ["12:00"] = 12, ["18:00"] = 18, ["23:59"] = 24}; if ( not num ) then num = 2; bw = 5; bs = 5; end else graph = getglobal("FishingTrackingFrameGraph2"); labels = FBConstants.BYWEEKS_TABLE; if ( not num ) then num = 2; bw = 3; bs = 2; end end local plotthese = {}; local count = 0; graph.tracking = how; for id,info in pairs(fi[how]) do UpdateGraphData(id, info); if ( count < num and fi[how][id].plot == 1 ) then count = count + 1; tinsert(plotthese, id); end end PlotData(graph, num, bw, bs, fi[how], plotthese, labels); end local function DrawTrackingGraphs() DrawTrackingGraph("HOURLY"); DrawTrackingGraph("WEEKLY"); end local function PlotFishToggle(fishid, how) local tab = PBTF_Info[how]; if ( not tab[fishid].plot ) then tab[fishid].plot = 1; else tab[fishid].plot = 1 - tab[fishid].plot; end DrawTrackingGraph(how); end local PlotToggleFunctions = {}; local function PlotMakeToggle(fishid, how) if ( not PlotToggleFunctions[fishid] ) then local id = fishid; local h = how; PlotToggleFunctions[fishid] = function() PlotFishToggle(id, h); end; end return PlotToggleFunctions[fishid]; end local function PlotMenuInitialize() local fi = PBTF_Info; local ff = FishingBuddy_Info["Fishies"]; local how = this.tracking; local locale = GetLocale(); for id,_ in pairs(fi[how]) do if ( not fi[how][id].plot ) then fi[how][id].plot = 1; end info = {}; if ( ff[id] and ff[id].name ) then info.text = ff[id].name; elseif ( byhours[id] ) then info.text = byhours[id][locale]; elseif ( byweeks[id] ) then info.text = byweeks[id][locale]; end if ( info.text ) then info.func = PlotMakeToggle(id, how); info.checked = ( fi[how][id].plot == 1 ); UIDropDownMenu_AddButton(info); end end end FB_TrackingFrame.OnClick = function(button, graph) if ( button == "RightButton" ) then local menu = getglobal("FishingBuddyGraphMenu"); menu.tracking = this.tracking; menu.point = "CENTER"; menu.relativePoint = "CENTER"; UIDropDownMenu_Initialize(menu, PlotMenuInitialize, "MENU"); FishingBuddy.ToggleDropDownMenu(1, nil, menu, this, 0, 0); end end FB_TrackingFrame.OnShow = function() DrawTrackingGraphs(); end FB_TrackingFrame.OnEnter = function() GameTooltip_AddNewbieTip(FB_TFConstants.TRACKINGFRAME, 1.0, 1.0, 1.0, FB_TFConstants.TRACKINGFRAME_CLICKS, 1); end FB_TrackingFrame.OnLeave = function() GameTooltip:Hide(); end local TrackingEvents = {}; TrackingEvents[FBConstants.ADD_FISHIE_EVT] = function(id, name, zone, subzone) AddTracking(id, name); end FB_TrackingFrame.OnLoad = function() this:RegisterEvent("VARIABLES_LOADED"); InitTracking(); end local function TrackFishToggle(fishid, how) local tab = PBTF_Info[how]; if ( not tab[fishid] ) then local ff = FishingBuddy_Info["Fishies"]; FishingBuddy.TrackThis(how, fishid, ff[fishid].color, ff[fishid].name); else if ( not tab[fishid].nevermore ) then tab[fishid].nevermore = true; else tab[fishid].nevermore = nil; end end end local function MakeTrackFishToggle(fishid, how) local id = fishid; local h = how; return function() TrackFishToggle(id, h); end; end local function TrackFishEntry(fishid, how) local fi = PBTF_Info; local info = {}; info.text = FB_TFConstants["TRACKFISH"..how]; info.func = MakeTrackFishToggle(fishid, how); info.checked = ( fi[how][fishid] and not fi[how][fishid].nevermore ); return info; end local function TrackOptionsMenu(fishid) UIDropDownMenu_AddButton(TrackFishEntry(fishid, "HOURLY")); UIDropDownMenu_AddButton(TrackFishEntry(fishid, "WEEKLY")); end FB_TrackingFrame.OnEvent = function() FishingBuddy.API.RegisterHandlers(TrackingEvents); FishingBuddy.Locations.PerFishOptions(TrackOptionsMenu); FishingBuddy.ManageFrame(FishingTrackingFrame, FB_TFConstants.TRACKING_TAB, FB_TFConstants.TRACKING_INFO, "_TRK"); this:UnregisterEvent("VARIABLES_LOADED"); end