Files
FishingBuddy/FishingWatcher.lua
Roman Kharitonov 4671cbd714 Merge ilithyia-addons fork (v0.8.8e)
- Russian localization (by Maus)
- FishingSchools: track fishing pools, Gatherer integration
- FishingOutfitter: Outfitter addon integration
- Interface 11200 (patch 1.12 support)
- Improved options system with dependencies
- Better watcher frame positioning
- Various bugfixes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 23:45:01 +10:00

374 lines
11 KiB
Lua
Executable File

-- Display the fish you're catching and/or have caught in a live display
FishingBuddy.WatchFrame = {};
local MAX_FISHINGWATCH_LINES = 20;
local WATCHDRAGGER_SHOW_DELAY = 0.2;
local WATCHDRAGGER_FADE_TIME = 0.15;
local function PlaceDraggerFrame()
local where = FishingBuddy.GetSetting("WatcherLocation");
if ( not where ) then
where = {};
where.x = 0;
where.y = -384;
end
FishingWatchDrag:ClearAllPoints();
FishingWatchDrag:SetPoint("TOPLEFT", "UIParent", "TOPLEFT",
where.x, where.y);
end
local function ShowDraggerFrame()
if ( not FishingWatchDrag:IsVisible() ) then
FishingWatchFrame:Show();
local width = FishingWatchFrame:GetWidth();
local height = FishingWatchFrame:GetHeight();
FishingWatchDrag:SetHeight(height);
FishingWatchDrag:SetWidth(width);
FishingWatchTab:SetText(FishingBuddy.NAME);
PanelTemplates_TabResize(10, FishingWatchTab);
FishingWatchDrag:Show();
FishingWatchTab:Show();
UIFrameFadeIn(FishingWatchDrag, WATCHDRAGGER_FADE_TIME, 0, 0.15);
UIFrameFadeIn(FishingWatchTab, WATCHDRAGGER_FADE_TIME, 0, 1.0);
GameTooltip_AddNewbieTip(FishingBuddy.NAME, 1.0, 1.0, 1.0,
FishingBuddy.WATCHERCLICKHELP, 1);
end
end
local function HideDraggerFrame(save)
if ( FishingWatchDrag:IsVisible() ) then
if ( save ) then
FishingWatchFrame:Show();
local qx = UIParent:GetLeft()
local qy = UIParent:GetTop();
local wx = FishingWatchDrag:GetLeft()
local wy = FishingWatchDrag:GetTop();
local where;
if ( wx and wy ) then
where = {};
where.x = wx - qx;
where.y = wy - qy;
end
FishingBuddy.SetSetting("WatcherLocation", where);
end
UIFrameFadeOut(FishingWatchDrag, WATCHDRAGGER_FADE_TIME, 0.15, 0);
UIFrameFadeOut(FishingWatchTab, WATCHDRAGGER_FADE_TIME, 1.0, 0);
FishingWatchDrag:Hide();
FishingWatchTab:Hide();
GameTooltip:Hide();
end
end
local function ResetWatcherFrame(update)
FishingWatchTab:Show();
FishingWatchDrag:Show();
FishingWatchDrag:ClearAllPoints();
FishingWatchDrag:SetPoint("CENTER", "UIParent", "CENTER", 0, 0);
HideDraggerFrame(true);
if ( update ) then
FishingBuddy.WatchUpdate();
end
end
FishingBuddy.ShowDraggerFrame = ShowDraggerFrame;
FishingBuddy.HideDraggerFrame = HideDraggerFrame;
FishingBuddy.PlaceDraggerFrame = PlaceDraggerFrame;
FishingBuddy.ResetWatcherFrame = ResetWatcherFrame;
FishingBuddy.Commands[FishingBuddy.WATCHER] = {};
FishingBuddy.Commands[FishingBuddy.WATCHER].help = FishingBuddy.WATCHER_HELP;
FishingBuddy.Commands[FishingBuddy.WATCHER].func =
function(what)
if ( what and ( what == FishingBuddy.RESET ) ) then
ResetWatcherFrame(true);
return true;
end
end;
-- fix old data
local function UpdateUnknownZone(zone, subzone, zidx, sidx)
local uzidx = FishingBuddy.GetZoneIndex(FishingBuddy.UNKNOWN);
if ( uzidx ) then
local fh = FishingBuddy_Info["FishingHoles"];
for usidx in fh[uzidx] do
local uszone = FishingBuddy_Info["SubZones"][uzidx][usidx];
if ( uszone == subzone ) then
for k,v in fh[uzidx][usidx] do
if ( fh[zidx][sidx][k] ) then
fh[zidx][sidx][k] = fh[zidx][sidx][k] + v;
else
fh[zidx][sidx][k] = v;
end
end
for k,_ in fh[uzidx][usidx] do
fh[uzidx][usidx][k] = nil;
end
end
end
end
end
-- Fish watcher functions
FishingBuddy.WatchUpdate = function()
if ( FishingWatchFrame:IsVisible() ) then
HideDraggerFrame();
FishingWatchFrame:Hide();
for i=1, MAX_FISHINGWATCH_LINES, 1 do
local line = getglobal("FishingWatchLine"..i);
line:Hide();
end
end
local reset = FishingBuddy.GetSetting("ResetWatcher");
if ( not reset or reset < 1 ) then
ResetWatcherFrame(false);
FishingBuddy.SetSetting("ResetWatcher", 1);
end
local zone, subzone = FishingBuddy.GetZoneInfo();
local zidx, sidx = FishingBuddy.GetZoneIndex(zone, subzone);
UpdateUnknownZone();
if ( FishingBuddy.GetSetting("WatchFishies") == 0 ) then
return;
end
if ( FishingBuddy.GetSetting("WatchOnlyWhenFishing") == 1 and
not FishingBuddy.API.IsFishingPole() ) then
return;
end
local fz = FishingBuddy_Info["FishingHoles"][zidx];
local current = FishingBuddy.currentFishies;
local ff = FishingBuddy_Info["Fishies"];
local fishsort = {};
local totalCount = 0;
local totalCurrent = 0;
local gotDiffs = false;
if ( fz and fz[sidx] ) then
for fishid in fz[sidx] do
local info = {};
if ( not FishingBuddy_Info["HiddenFishies"][fishid] ) then
info.text = ff[fishid].name;
end
info.count = fz[sidx][fishid];
totalCount = totalCount + info.count;
if ( current[sidx] ) then
info.current = current[sidx][fishid] or 0;
else
info.current = 0;
end
if ( info.current > 0 and info.current ~= info.count ) then
gotDiffs = true;
end
totalCurrent = totalCurrent + info.current;
tinsert(fishsort, info);
end
-- if ( totalCount == 0 and totalCurrent == 0 ) then
-- return;
-- end
FishingBuddy.FishSort(fishsort);
end
local fishingWatchMaxWidth = 0;
local tempWidth;
local index = 1;
local start = 1;
local dopercent = FishingBuddy.GetSetting("WatchFishPercent");
if ( FishingBuddy.GetSetting("WatchCurrentZone") == 1 ) then
local entry = getglobal("FishingWatchLine"..index);
local line = zone.." : "..subzone;
entry:SetText(line);
local tempWidth = entry:GetWidth();
if ( tempWidth > fishingWatchMaxWidth ) then
fishingWatchMaxWidth = tempWidth;
end
entry:Show();
index = index + 1;
end
if ( FishingBuddy.GetSetting("WatchCurrentSkill") == 1 ) then
local entry = getglobal("FishingWatchLine"..index);
local skill, mods = FishingBuddy.GetCurrentSkill();
local line = "Skill: |cff00ff00"..skill.."+"..mods.."|r";
local StartedFishing = FishingBuddy.StartedFishing;
if ( StartedFishing ) then
local elapsed = GetTime() - StartedFishing;
local t = math.floor(elapsed);
local seconds = math.mod(t, 60);
t = math.floor(t / 60);
local minutes = math.mod(t, 60);
local hours = math.floor(t / 60);
line = line.." Elapsed: ";
if ( hours < 10 ) then
line = line.."0";
end
line = line..hours..":";
if ( minutes < 10 ) then
line = line.."0";
end
line = line..minutes..":";
if ( seconds < 10 ) then
line = line.."0";
end
line = line..seconds;
end
entry:SetText(line);
local tempWidth = entry:GetWidth();
if ( tempWidth > fishingWatchMaxWidth ) then
fishingWatchMaxWidth = tempWidth;
end
entry:Show();
index = index + 1;
end
for j=1,table.getn(fishsort),1 do
local info = fishsort[j];
if( index <= MAX_FISHINGWATCH_LINES ) then
local entry = getglobal("FishingWatchLine"..index);
local fishie = info.text;
if ( fishie ) then
fishie = FishingBuddy.StripRaw(fishie);
local amount = info.count;
local fishietext = fishie.." ("..amount;
if ( dopercent == 1 ) then
local percent = format("%.1f", ( amount / totalCount ) * 100);
fishietext = fishietext.." : "..percent.."%";
end
if ( gotDiffs ) then
amount = info.current;
local color;
fishietext = fishietext..", |c"..FishingBuddy.Colors.GREEN..amount;
if ( dopercent == 1 ) then
local percent = format("%.1f", ( amount / totalCurrent ) * 100);
fishietext = fishietext.." : "..percent.."%";
end
fishietext = fishietext.."|r";
end
fishietext = fishietext..")";
entry:SetText(fishietext);
tempWidth = entry:GetWidth();
entry:Show();
if ( tempWidth > fishingWatchMaxWidth ) then
fishingWatchMaxWidth = tempWidth;
end
index = index + 1;
end
end
end
FishingWatchFrame:SetHeight((index - 1) * 13);
FishingWatchFrame:SetWidth(fishingWatchMaxWidth + 10);
ShowDraggerFrame();
PlaceDraggerFrame();
FishingWatchFrame:Show();
end
FishingBuddy.WatchFrame.OnLoad = function()
this:ClearAllPoints();
this:SetPoint("TOPLEFT", "FishingWatchDrag", "TOPLEFT", 0, 0);
-- Make everything draw at least once
FishingWatchDrag:Show();
FishingWatchTab:Show();
FishingWatchDrag:Hide();
FishingWatchTab:Hide();
end
local hover;
FishingBuddy.WatchFrame.OnUpdate = function(elapsed)
if ( FishingWatchFrame:IsVisible() ) then
if ( MouseIsOver(FishingWatchFrame) or
( FishingWatchTab:IsVisible() and MouseIsOver(FishingWatchTab) ) ) then
local xPos, yPos = GetCursorPosition();
if ( hover ) then
if ( hover.xPos == xPos and hover.yPos == yPos ) then
hover.hoverTime = hover.hoverTime + elapsed;
else
hover.hoverTime = 0;
hover.xPos = xPos;
hover.yPos = yPos;
end
else
hover = {};
hover.hoverTime = 0;
hover.xPos = xPos;
hover.yPos = yPos;
end
if ( hover.hoverTime > WATCHDRAGGER_SHOW_DELAY ) then
ShowDraggerFrame();
end
else
HideDraggerFrame(true);
hover = nil;
end
elseif ( hover ) then
HideDraggerFrame(true);
hover = nil;
end
end
FishingBuddy.WatchFrame.OnMouseDown = function()
if ( arg1 == "LeftButton" ) then
FishingWatchDrag:StartMoving();
end
end
FishingBuddy.WatchFrame.OnMouseUp = function()
if ( arg1 == "LeftButton" ) then
FishingWatchDrag:StopMovingOrSizing();
end
end
local function HiddenFishToggle(id)
if ( FishingBuddy_Info["HiddenFishies"][id] ) then
FishingBuddy_Info["HiddenFishies"][id] = nil;
else
FishingBuddy_Info["HiddenFishies"][id] = true;
end;
FishingBuddy.WatchUpdate();
end
-- save some memory by keeping one copy of each one
local WatcherToggleFunctions = {};
-- let's use closures
local function WatcherMakeToggle(fishid)
if ( not WatcherToggleFunctions[fishid] ) then
local id = fishid;
WatcherToggleFunctions[fishid] = function() HiddenFishToggle(id); end;
end
return WatcherToggleFunctions[fishid];
end
FishingBuddy.WatchFrame.MakeToggle = WatcherMakeToggle;
local function WatchMenu_Initialize()
local zidx, sidx = FishingBuddy.GetZoneIndex();
local fz = FishingBuddy_Info["FishingHoles"][zidx];
if ( fz and fz[sidx] ) then
local ff = FishingBuddy_Info["Fishies"];
for fishid in fz[sidx] do
info = {};
info.text = ff[fishid].name;
info.func = WatcherMakeToggle(fishid);
info.checked = ( not FishingBuddy_Info["HiddenFishies"][fishid] );
info.keepShownOnClick = 1;
UIDropDownMenu_AddButton(info);
end
end
end
FishingBuddy.WatchFrame.OnClick = function()
if ( arg1 == "RightButton" ) then
local menu = getglobal("FishingBuddyWatcherMenu");
UIDropDownMenu_Initialize(menu, WatchMenu_Initialize, "MENU");
ToggleDropDownMenu(level, nil, menu, "FishingWatchDrag", 0, 0);
end
end