327 lines
10 KiB
Lua
Executable File
327 lines
10 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 DRAGFRAME_TEXTURES = {
|
|
"Background",
|
|
"TopLeft",
|
|
"TopRight",
|
|
"BottomLeft",
|
|
"BottomRight",
|
|
"Top",
|
|
"Bottom",
|
|
"Left",
|
|
"Right"
|
|
};
|
|
|
|
local function ShowDraggerFrame()
|
|
if ( not FishingWatchDragFrame:IsVisible() ) then
|
|
local width = FishingWatchFrame:GetWidth();
|
|
local height = FishingWatchFrame:GetHeight();
|
|
FishingWatchDragFrame:SetHeight(height);
|
|
FishingWatchDragFrame:SetWidth(width);
|
|
FishingWatchDragFrame:Show();
|
|
for index, value in DRAGFRAME_TEXTURES do
|
|
UIFrameFadeIn(getglobal("FishingWatchDragFrame"..value), WATCHDRAGGER_FADE_TIME, 0, 0.25);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function HideDraggerFrame()
|
|
if ( FishingWatchDragFrame:IsVisible() ) then
|
|
for index, value in DRAGFRAME_TEXTURES do
|
|
UIFrameFadeOut(getglobal("FishingWatchDragFrame"..value), WATCHDRAGGER_FADE_TIME, 0.25, 0);
|
|
end
|
|
FishingWatchDragFrame:Hide();
|
|
local qx, qy = UIParent:GetCenter();
|
|
local wx, wy = FishingWatchDragFrame:GetCenter();
|
|
local where = {};
|
|
where.x = qx - wx;
|
|
where.y = wy - qy;
|
|
FishingBuddy.SetSetting("WatcherLocation", where);
|
|
end
|
|
end
|
|
|
|
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
|
|
FishingWatchDragFrame:ClearAllPoints();
|
|
FishingWatchDragFrame:SetPoint("CENTER", "UIParent",
|
|
"CENTER", 0, 0);
|
|
FishingWatchDragFrame:Hide();
|
|
FishingBuddy.SetSetting("WatcherLocation", nil);
|
|
return true;
|
|
end
|
|
end;
|
|
|
|
-- handle really old versions
|
|
local function UpdateUnknownZones(zone, subzone)
|
|
if ( FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN] ) then
|
|
if ( FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][subzone] ) then
|
|
if ( not FishingBuddy_Info["FishingHoles"][zone] ) then
|
|
FishingBuddy_Info["FishingHoles"][zone] = { };
|
|
tinsert(FishingBuddy.SortedZones, zone);
|
|
table.sort(FishingBuddy.SortedZones);
|
|
end
|
|
if ( not FishingBuddy_Info["FishingHoles"][zone][subzone] ) then
|
|
FishingBuddy_Info["FishingHoles"][zone][subzone] = { };
|
|
end
|
|
for k,v in FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][subzone] do
|
|
FishingBuddy_Info["FishingHoles"][zone][subzone][k] = v;
|
|
end
|
|
FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][subzone] = nil;
|
|
end
|
|
FishingBuddy.Locations.DataChanged(zone, subzone);
|
|
-- Duh, table.getn doesn't work because there aren't any integer
|
|
-- keys in this table
|
|
if ( next(FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN]) == nil ) then
|
|
FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN] = nil;
|
|
local pos;
|
|
while ( pos < table.getn(FishingBuddy.SortedZones) ) do
|
|
if ( FishingBuddy.SortedZones[pos] == FishingBuddy.UNKNOWN ) then
|
|
break;
|
|
end
|
|
pos = pos + 1;
|
|
end
|
|
tremove(FishingBuddy.SortedZones, pos);
|
|
end
|
|
end
|
|
end
|
|
|
|
-- fix a bug where we were recording 'GetZoneText' instead
|
|
-- of 'GetRealZoneText'
|
|
local function UpdateRealZones(zone, subzone)
|
|
local oldzone = GetZoneText();
|
|
if ( FishingBuddy_Info["FishingHoles"][oldzone] and oldzone ~= zone ) then
|
|
if ( not FishingBuddy_Info["FishingHoles"][zone] ) then
|
|
FishingBuddy_Info["FishingHoles"][zone] = { };
|
|
end
|
|
for oldsubzone in FishingBuddy_Info["FishingHoles"][oldzone] do
|
|
local sub = oldsubzone;
|
|
if ( oldsubzone == oldzone ) then
|
|
sub = subzone;
|
|
end
|
|
if ( not FishingBuddy_Info["FishingHoles"][zone][sub] ) then
|
|
FishingBuddy_Info["FishingHoles"][zone][sub] = {};
|
|
end
|
|
for k,v in FishingBuddy_Info["FishingHoles"][oldzone][oldsubzone] do
|
|
FishingBuddy_Info["FishingHoles"][zone][sub][k] = v;
|
|
end
|
|
end
|
|
FishingBuddy_Info["FishingHoles"][oldzone] = nil;
|
|
end
|
|
end
|
|
|
|
-- Fish watcher functions
|
|
FishingBuddy.WatchUpdate = function()
|
|
if ( FishingWatchFrame:IsVisible() ) then
|
|
FishingWatchFrame:Hide();
|
|
for i=1, MAX_FISHINGWATCH_LINES, 1 do
|
|
local line = getglobal("FishingWatchLine"..i);
|
|
line:Hide();
|
|
end
|
|
end
|
|
|
|
local zone, subzone = FishingBuddy.GetZoneInfo();
|
|
|
|
UpdateUnknownZones(zone, subzone);
|
|
UpdateRealZones(zone, subzone);
|
|
|
|
local fz = FishingBuddy_Info["FishingHoles"][zone];
|
|
if ( FishingBuddy.GetSetting("WatchFishies") == 0 or
|
|
not fz or not fz[subzone] ) then
|
|
return;
|
|
end
|
|
|
|
if ( FishingBuddy.GetSetting("WatchOnlyWhenFishing") == 1 and
|
|
not FishingBuddy.IsFishingPole() ) then
|
|
return;
|
|
end
|
|
|
|
local current = FishingBuddy.currentFishies;
|
|
local ff = FishingBuddy_Info["Fishies"];
|
|
local fishsort = {};
|
|
local totalCount = 0;
|
|
local totalCurrent = 0;
|
|
local gotDiffs = false;
|
|
for fishid in fz[subzone] do
|
|
local info = {};
|
|
info.text = ff[fishid].name;
|
|
info.count = fz[subzone][fishid];
|
|
totalCount = totalCount + info.count;
|
|
if ( current[subzone] ) then
|
|
info.current = current[subzone][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 ) then
|
|
return;
|
|
end
|
|
|
|
FishingBuddy.FishSort(fishsort);
|
|
|
|
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";
|
|
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;
|
|
local amount = info.count;
|
|
local s,e = string.find(fishie, FishingBuddy.RAW.." ");
|
|
if ( s ) then
|
|
if ( s > 1 ) then
|
|
fishie = string.sub(fishie, 1, s-1)..string.sub(fishie, e+1);
|
|
else
|
|
fishie = string.sub(fishie, e+1);
|
|
end
|
|
else
|
|
s,e = string.find(fishie, " "..FishingBuddy.RAW);
|
|
if ( s ) then
|
|
fishie = string.sub(fishie, 1, s-1)..string.sub(fishie, e+1);
|
|
end
|
|
end
|
|
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
|
|
end
|
|
index = index + 1;
|
|
end
|
|
|
|
FishingWatchFrame:SetHeight(index * 13);
|
|
FishingWatchFrame:SetWidth(fishingWatchMaxWidth + 10);
|
|
FishingWatchFrame:Show();
|
|
end
|
|
|
|
FishingBuddy.WatchFrame.OnLoad = function()
|
|
local where = FishingBuddy.GetSetting("WatcherLocation");
|
|
if ( not where ) then
|
|
where = {};
|
|
where.x = 0;
|
|
where.y = 0;
|
|
end
|
|
FishingWatchDragFrame:ClearAllPoints();
|
|
FishingWatchDragFrame:SetPoint("CENTER", "UIParent", "CENTER",
|
|
where.x, where.y);
|
|
FishingWatchDragFrame:Hide();
|
|
|
|
this:ClearAllPoints();
|
|
this:SetPoint("TOPRIGHT", "FishingWatchDragFrame", "TOPRIGHT", 0, 0);
|
|
end
|
|
|
|
local hover;
|
|
FishingBuddy.WatchFrame.OnUpdate = function(elapsed)
|
|
if ( FishingWatchFrame:IsVisible() ) then
|
|
if ( MouseIsOver(FishingWatchFrame) ) 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();
|
|
hover = nil;
|
|
end
|
|
elseif ( hover ) then
|
|
HideDraggerFrame();
|
|
hover = nil;
|
|
end
|
|
end
|
|
|