vanilla-wow-addons – Rev 1
?pathlinks?
local pre = "textures\\Minimap\\";
local MINI2BIGX = 533.3333;
local MINI2BIGY = 533.3333;
YatlasOptions = {}
YA_FRAME_OPTION_DEFAULTS = {
["Locked"] = true,
["Map"] = "Kalimdor",
["Location"] = {31.0625, 33.250},
["Alpha"] = 1,
["IconSize"] = 14,
["PointCfg"] = {},
["Zoom"] = 256,
};
local dummyv = {nil, {0,256}};
local nilfunc = function() end
YatlasFrameTemplate = {};
function YatlasFrame_Bootstrap(frame)
if(frame == nil) then
frame = this;
end
for h,v in pairs(YatlasFrameTemplate) do
if(frame[h]) then
frame["old_"..h] = frame[h];
end
frame[h] = v;
end
frame:OnLoad();
end
function YatlasFrameTemplate:OnLoad()
local lm = self:GetName();
local viewframe = getglobal(lm.."ViewFrame");
self.texturelayout = {};
self.wzoom = 3;
self.hzoom = 3;
self.wzoom_real = 3;
self.hzoom_real = 3;
self.points = {};
self.pointframes = {};
self:RegisterForDrag("LeftButton");
self:RegisterEvent("VARIABLES_LOADED");
self:RegisterEvent("ADDON_LOADED");
self:RegisterEvent("WORLD_MAP_UPDATE");
viewframe:RegisterForDrag("RightButton","LeftButton");
viewframe:EnableMouseWheel(true);
YAPoints_RegisterFrame(self:GetName());
self.update_time = 0;
end
function YatlasFrame_OnLoadExtra()
YatlasFrame.OnEventExtra = YatlasFrame_OnEventExtra;
YatlasFrame.YA_PD_allocText = "YA_PD_allocText";
YatlasFrame.YA_PD_ResetList = "YA_PD_ResetList";
SLASH_YATLAS1 = "/yatlas";
SlashCmdList["YATLAS"] = function() YatlasFrame:Toggle() end
YatlasFrame.hoverTooltip = "YatlasTooltip";
-- initalize zones
for h,v in pairs(Yatlas_WorldMapIds) do
Yatlas_PaperZoneNames[h] = {Yatlas_GetMapZones(h)};
end
-- wrap mapnotes for updates
if(MapNotes_DeleteNote) then
YA_old_MapNotes_DeleteNote = MapNotes_DeleteNote;
MapNotes_DeleteNote = function(...)
local v = YA_old_MapNotes_DeleteNote(unpack(arg))
YAPoints_ForceUpdate();
return v;
end
YA_old_MapNotes_WriteNote = MapNotes_WriteNote;
MapNotes_WriteNote = function(...)
local v = YA_old_MapNotes_WriteNote(unpack(arg));
YAPoints_ForceUpdate();
return v;
end
end
-- wrap gatherer
if(Gatherer_AddGatherHere) then
YA_old_Gatherer_AddGatherHere = Gatherer_AddGatherHere;
Gatherer_AddGatherHere = function(...)
local v = YA_old_Gatherer_AddGatherHere(unpack(arg))
YAPoints_ForceUpdate();
return v;
end
end
-- myaddons support
YatlasDetails = {
name = YATLAS_TITLE,
version = YATLAS_VERSION,
releaseDate = YATLAS_RELEASE_DATE,
author = YATLAS_AUTHOR,
website = YATLAS_WEBSITE,
email = YATLAS_AUTHOR_EMAIL,
category = MYADDONS_CATEGORY_MAP,
};
YatlasMAHelp = YATLAS_HELP_TEXT;
end
function BigYatlasFrame_OnLoadExtra()
UIPanelWindows["BigYatlasFrame"] = { area = "full", pushable = 0, whileDead = 1 };
SLASH_BIGYATLAS1 = "/bigyatlas";
SlashCmdList["BIGYATLAS"] = function() BigYatlasFrame:Toggle() end
BigYatlasFrame.RawBigShow = BigYatlasFrame.Show;
BigYatlasFrame.Show = function(self)
SetupFullscreenScale(self);
return self:RawBigShow();
end
BigYatlasFrame.hoverTooltip = "BigYatlasTooltip";
end
function YatlasFrameTemplate:OnEvent(event)
local framename = self:GetName();
if(event == "VARIABLES_LOADED") then
if(YatlasOptions == nil) then
YatlasOptions = {};
end
if(YatlasOptions.ShowButton == nil) then
YatlasOptions.ShowButton = true;
end
if(YatlasOptions.ButtonLocation == nil) then
YatlasOptions.ButtonLocation = 0;
end
self:EnsureExistingOptions();
self.opt = YatlasOptions.Frames[framename];
self:SetZoom(self.opt.Zoom);
self:SetMap(self.opt.Map);
self:UpdateLock();
self:SetAlpha(self.opt.Alpha);
if(self.opt.track) then
YatlasFramePlayerJumpButton_Seek(this, self.opt.track);
end
elseif(event == "WORLD_MAP_UPDATE") then
self:OnWorldMapUpdate();
end
if(self.OnEventExtra) then
self:OnEventExtra(event);
end
end
function YatlasFrame_OnEventExtra(self, event)
local framename = self:GetName();
if(event == "ADDON_LOADED" and arg1 == "Yatlas") then
if(myAddOnsFrame_Register) then
myAddOnsFrame_Register(YatlasDetails, YatlasMAHelp);
end
end
end
function YatlasFrameTemplate:EnsureExistingOptions()
if(YatlasOptions.Frames == nil) then
YatlasOptions.Frames = {};
end
local name = self:GetName();
if(YatlasOptions.Frames[name] == nil) then
YatlasOptions.Frames[name] = {};
end
for h,v in pairs(YA_FRAME_OPTION_DEFAULTS) do
if(YatlasOptions.Frames[name][h] ~= nil) then
-- don't do anything!
elseif(YatlasOptions[h] ~= nil) then
YatlasOptions.Frames[name][h] = YatlasOptions[h];
YatlasOptions[h] = nil;
elseif(type(v) == "table") then
-- don't copy reference. copy value...unfortunately, we only
-- copy one level deep, which seems good enough...
YatlasOptions.Frames[name][h] = {};
for x,k in pairs(v) do
YatlasOptions.Frames[name][h][x] = k;
end
else
YatlasOptions.Frames[name][h] = v;
end
end
end
function YatlasFrameTemplate:Toggle()
local lm = self:GetName();
if(UIPanelWindows[lm] == nil) then
if(self:IsShown()) then
self:Hide();
else
self:Show();
end
else
if (self:IsVisible() ) then
HideUIPanel(self);
else
-- SetupWorldMapScale();
ShowUIPanel(self);
end
end
end
function YatlasFrameDropDown_OnLoad()
this:RegisterEvent("VARIABLES_LOADED");
end
function YatlasFrameDropDown_OnEvent(event)
if(event == "VARIABLES_LOADED") then
UIDropDownMenu_Initialize(this, YatlasFrameDropDown_Initialize);
UIDropDownMenu_SetSelectedID(this, 1);
UIDropDownMenu_SetWidth(150);
end
end
function YatlasFrameDropDown_Initialize()
local i = 1;
local info;
for h,v in pairs(YA_MAPS) do
info = {
text = h;
func = YatlasFrameDropDownButton_OnClick;
value = getglobal(UIDROPDOWNMENU_INIT_MENU):GetParent();
};
UIDropDownMenu_AddButton(info);
i = i + 1;
end
end
function YatlasFrameDropDownButton_OnClick()
local d = 1;
i = this:GetID();
for h,v in pairs(YA_MAPS) do
if(d == i) then
return this.value:SetMap(v[1]);
end
d = d + 1;
end
end
function YatlasFrameTemplate:ToggleLock()
if(self.opt.Locked) then
self.opt.Locked = false;
else
self.opt.Locked = true;
end
self:UpdateLock();
end
function YatlasFrameTemplate:UpdateLock()
local fm = self:GetName();
local norm = getglobal(fm.."LockButtonNorm");
local push = getglobal(fm.."LockButtonPush");
if(norm and push) then
if(self.opt.Locked) then
norm:SetTexture("Interface\\AddOns\\Yatlas\\images\\LockButton-Locked-Up");
push:SetTexture("Interface\\AddOns\\Yatlas\\images\\LockButton-Locked-Down");
else
norm:SetTexture("Interface\\AddOns\\Yatlas\\images\\LockButton-Unlocked-Up");
push:SetTexture("Interface\\AddOns\\Yatlas\\images\\LockButton-Unlocked-Down");
end
end
end
function YatlasFrameTemplate:SetMap(mapname)
local lm = self:GetName();
self.opt.Map = mapname;
local mapdropdown = getglobal(lm.."DropDown");
if(mapdropdown) then
local i = 1;
for h,v in pairs(YA_MAPS) do
if(v[1] == mapname) then
UIDropDownMenu_SetSelectedID(mapdropdown, i);
UIDropDownMenu_SetText(h,mapdropdown);
end
i = i + 1;
end
end
-- initialize zone pulldown
local mapdropdown2 = getglobal(lm.."DropDown2");
if(mapdropdown2) then
UIDropDownMenu_ClearAll(mapdropdown2);
UIDropDownMenu_Initialize(mapdropdown2, YatlasFrameDropDown2_Initialize);
end
self:AdjustLocation(0,0,true);
YAPoints_OnMapChange(self);
self.lastmap = self.opt.Map;
end
function YatlasFrameDropDown2_OnLoad()
this:RegisterEvent("VARIABLES_LOADED");
end
function YatlasFrameDropDown2_OnEvent(event)
if(event == "VARIABLES_LOADED") then
UIDropDownMenu_SetWidth(150);
end
end
function YatlasFrameDropDown2_Initialize()
local lm = string.gsub(UIDROPDOWNMENU_INIT_MENU,"DropDown2","");
local frame = getglobal(lm);
frame.zonepulldowns = {};
local info;
if(Yatlas_mapareas[frame.opt.Map] ~= nil) then
for h,v in pairs(Yatlas_mapareas[frame.opt.Map]) do
if(Yatlas_areadb[h]) then
tinsert(frame.zonepulldowns, h);
end
end
end
table.sort(frame.zonepulldowns,
function (a,b) return Yatlas_areadb[a][2] < Yatlas_areadb[b][2]; end);
for j,v in ipairs(frame.zonepulldowns) do
info = {
text = Yatlas_areadb[v][2];
value = frame;
func = YatlasFrameDropDownButton2_OnClick;
};
UIDropDownMenu_AddButton(info);
end
end
function YatlasFrameDropDownButton2_OnClick()
local frame = this.value;
local lm = frame:GetName();
local z = frame.zonepulldowns[this:GetID()];
local map = frame.opt.Map;
local zoom = frame:GetZoom();
if(not z or not Yatlas_mapareas[map]) then return; end
if(type(Yatlas_mapareas[map][z]) == "table") then
local x, y, mx, my;
x = (Yatlas_mapareas[map][z][1]+
Yatlas_mapareas[map][z][2])/2;
y = (Yatlas_mapareas[map][z][3]+
Yatlas_mapareas[map][z][4])/2;
mx, my = Yatlas_Big2Mini_Coord(x,y);
if(Yatlas_mapareas_adjust[z]) then
mx = Yatlas_mapareas_adjust[z][1] + mx;
my = Yatlas_mapareas_adjust[z][2] + my;
end
frame:SetLocation(mx-(512/2)/zoom, my-(512/2)/zoom);
end
end
function YatlasFrameTemplate:UpdateDropDown2()
local framename = self:GetName();
local vfname = framename.."ViewFrame";
local vf = getglobal(vfname);
local zoom = self.opt.Zoom;
local dd2 = getglobal(framename.."DropDown2");
if(dd2 and self.zonepulldowns) then
-- FIXME this isn't quite right somehow!! (besides height/width being flipped)
local zid = self:GetZoneIDs((vf:GetHeight()/zoom/2),(vf:GetWidth()/zoom/2));
for i,v in ipairs(self.zonepulldowns) do
if(v == zid) then
UIDropDownMenu_SetSelectedID(dd2, i);
UIDropDownMenu_SetText(Yatlas_areadb[zid][2], dd2);
break;
end
end
end
end
--
function YatlasFramePlayerJumpButton_Toggle(btn)
local f = btn:GetParent();
local o = f.opt;
if(o.track) then
o.track = nil;
else
o.track = "player";
YatlasFramePlayerJumpButton_Seek(f, "player");
end
YatlasFramePlayerJumpButton_Update(btn)
end
function YatlasFramePlayerJumpButton_Jump(btn)
local f = btn:GetParent();
local o = f.opt;
o.track = nil;
YatlasFramePlayerJumpButton_Seek(f, "player");
YatlasFramePlayerJumpButton_Update(btn)
end
function YatlasFramePlayerJumpButton_Seek(frame, unit)
local i,v = next(Yatlas_WorldMapIds);
frame.trackseek = unit;
frame.trackseek_state = i;
if(GetMapInfo() == i) then
frame:OnWorldMapUpdate();
else
SetMapZoom(v);
end
end
function YatlasFramePlayerJumpButton_Update(btn)
if(btn:GetParent() and btn:GetParent().opt) then
local t = btn:GetParent().opt.track;
if(t) then
tex = "Interface\\Buttons\\UI-Panel-Button-Down";
else
tex = "Interface\\Buttons\\UI-Panel-Button-Up";
end
getglobal(btn:GetName().."Left"):SetTexture(tex);
getglobal(btn:GetName().."Middle"):SetTexture(tex);
getglobal(btn:GetName().."Right"):SetTexture(tex);
end
end
function YatlasFrameTemplate:GetMap()
return self.opt.Map;
end
function YatlasFrameTemplate:SetZoom(z, nocenter)
local textureno = 1;
local lm = self:GetName();
local vf = getglobal(lm.."ViewFrame");
self.wzoom = math.floor(vf:GetWidth()/z)+1;
self.hzoom = math.floor(vf:GetHeight()/z)+1;
self.wzoom_real = math.ceil(vf:GetWidth()/z)+1;
self.hzoom_real = math.ceil(vf:GetHeight()/z)+1;
if(getglobal(lm.."MapTexture"..(self.wzoom_real*self.hzoom_real)) == nil) then
return self:SetZoom(z+4);
elseif(z > vf:GetHeight() or z > vf:GetWidth()) then
return self:SetZoom(z-4);
end
local lastzoom = self.opt.Zoom;
self.opt.Zoom = z;
-- allocate textures
self.texturelayout = {};
for hw = 1,self.wzoom_real do
self.texturelayout[hw] = {};
for hh = 1,self.hzoom_real do
self.texturelayout[hw][hh] = getglobal(lm.."MapTexture"..textureno);
self.texturelayout[hw][hh].hx = hw;
self.texturelayout[hw][hh].hy = hh;
textureno = textureno + 1;
end
end
while(getglobal(lm.."MapTexture"..textureno)) do
getglobal(lm.."MapTexture"..textureno):Hide();
textureno = textureno + 1;
end
-- unclip all textures now, ESPECIALLY the middle textures
for hw = 1,self.wzoom_real do
for hh = 1,self.hzoom_real do
self.texturelayout[hw][hh]:Show();
self.texturelayout[hw][hh]:SetTexCoord(0, 1, 0, 1);
self.texturelayout[hw][hh]:SetHeight(z);
self.texturelayout[hw][hh]:SetWidth(z);
self.texturelayout[hw][hh].areaids = {};
end
end
if(nocenter or lastzoom == z) then
self:AdjustLocation(0,0,true)
else
local oldcx, oldcy;
local newcx, newcy;
oldcy = (vf:GetHeight()/2)/lastzoom;
oldcx = (vf:GetWidth()/2)/lastzoom;
newcy = (vf:GetHeight()/2)/z;
newcx = (vf:GetWidth()/2)/z;
self:AdjustLocation(oldcx-newcx,-oldcy+newcy,true)
end
end
function YatlasFrameTemplate:GetZoom()
return self.opt and self.opt.Zoom or 256;
end
function YatlasFrameTemplate:SetLocation(x,y,forceupdate)
local zx, zy, mymap;
local framename = self:GetName();
local vfname = framename.."ViewFrame";
local vf = getglobal(vfname);
local texturelayout = self.texturelayout;
local zoom = self.opt.Zoom;
local wzoom, hzoom = self.wzoom,self.hzoom;
local wzoom_real,hzoom_real = self.wzoom_real, self.hzoom_real;
zx = math.floor(x);
zy = math.floor(y);
mymap = self.opt.Map;
-- offset calc
local px, py;
px = math.floor((x-zx)*zoom);
py = math.floor((y-zy)*zoom);
if(zx ~= math.floor(self.opt.Location[1]) or forceupdate or
zy ~= math.floor(self.opt.Location[2]) or mymap ~= self.lastmap) then
local v = {};
local jx, jy, nsv;
for hx = 1,wzoom_real do
v[hx] = {};
for hy = 1,hzoom_real do
local tex = texturelayout[hx][hy];
-- get info
v[hx][hy] = Yatlas_mapdb1[mymap][format("%.2dx%.2d",zx+hx-1,zy+hy-1)];
if(v[hx][hy] == nil) then
v[hx][hy] = dummyv;
end
-- save area info
tex.areaids = v[hx][hy][2];
-- set textures
if(v[hx][hy][1]) then
tex:SetTexture(pre..v[hx][hy][1]);
tex:SetVertexColor(1,1,1,1);
else
tex:SetTexture("Interface\\Buttons\\WHITE8X8");
tex:SetVertexColor(0,0,0,1);
end
end
end
end
-- Do offset and clipping (:SetTexCoord and :SetHeight/Width)
-- We do the most thinking about border textures
local bottomh = vf:GetHeight()-zoom*(hzoom-2)-(zoom-py);
local rightw = vf:GetWidth()-zoom*(wzoom-2)-(zoom-px);
local needbottom_extra = false;
local needright_extra = false;
local old_bottomh, old_rightw;
if(bottomh > zoom) then
needbottom_extra = true;
old_bottomh = bottomh;
bottomh = zoom;
end
if(rightw > zoom) then
needright_extra = true;
old_rightw = rightw;
rightw = zoom;
end
-- center textures (easy)
for w = 2,wzoom-1 do
for h = 2,hzoom-1 do
ya_raw_setoff(texturelayout[w][h],vfname,px,py);
end
end
-- Upper left corner
texturelayout[1][1]:SetTexCoord( (x-zx), 1, (y-zy), 1);
texturelayout[1][1]:SetHeight( zoom-py);
texturelayout[1][1]:SetWidth( zoom-px);
ya_raw_setoff(texturelayout[1][1],vfname,0,0);
-- Upper right corner
if(px ~= 0 or wzoom ~= wzoom_real) then
texturelayout[wzoom][1]:Show();
texturelayout[wzoom][1]:SetTexCoord( 0, rightw/zoom, (y-zy), 1);
texturelayout[wzoom][1]:SetHeight( zoom-py);
texturelayout[wzoom][1]:SetWidth(rightw);
ya_raw_setoff(texturelayout[wzoom][1],vfname,px,0);
else
texturelayout[wzoom][1]:Hide();
end
-- Lower left corner
if(py ~= 0 or wzoom ~= wzoom_real) then
texturelayout[1][hzoom]:Show();
texturelayout[1][hzoom]:SetTexCoord( (x-zx), 1, 0, bottomh/zoom);
texturelayout[1][hzoom]:SetWidth( zoom-px);
texturelayout[1][hzoom]:SetHeight(bottomh);
ya_raw_setoff(texturelayout[1][hzoom],vfname,0,py);
else
texturelayout[1][hzoom]:Hide();
end
-- lower right corner
if((py ~= 0 and px ~= 0) or wzoom ~= wzoom_real) then
texturelayout[wzoom][hzoom]:Show();
texturelayout[wzoom][hzoom]:SetTexCoord( 0, rightw/zoom, 0, bottomh/zoom);
texturelayout[wzoom][hzoom]:SetHeight(bottomh);
texturelayout[wzoom][hzoom]:SetWidth(rightw);
ya_raw_setoff(texturelayout[wzoom][hzoom],vfname,px,py);
else
texturelayout[wzoom][hzoom]:Hide();
end
-- top line
for h = 2,wzoom-1 do
texturelayout[h][1]:SetTexCoord( 0, 1, (y-zy), 1);
texturelayout[h][1]:SetHeight( zoom-py);
ya_raw_setoff(texturelayout[h][1],vfname,px,0);
end
-- bottom line
if(py ~= 0 or wzoom ~= wzoom_real) then
for h = 2,wzoom-1 do
texturelayout[h][hzoom]:Show();
texturelayout[h][hzoom]:SetTexCoord( 0, 1, 0, bottomh/zoom);
texturelayout[h][hzoom]:SetHeight(bottomh);
ya_raw_setoff(texturelayout[h][hzoom],vfname, px,py);
end
else
for h = 2,wzoom-1 do
texturelayout[h][hzoom]:Hide();
end
end
-- left line
for h = 2,hzoom-1 do
texturelayout[1][h]:SetTexCoord( (x-zx), 1, 0, 1);
texturelayout[1][h]:SetWidth( zoom-px);
ya_raw_setoff(texturelayout[1][h],vfname,0,py);
end
-- right line
if(px ~= 0 or wzoom ~= wzoom_real) then
for h = 2,hzoom-1 do
texturelayout[wzoom][h]:Show();
texturelayout[wzoom][h]:SetTexCoord( 0, rightw/zoom, 0, 1);
texturelayout[wzoom][h]:SetWidth(rightw);
ya_raw_setoff(texturelayout[wzoom][h],vfname,px,py);
end
else
for h = 2,hzoom-1 do
texturelayout[wzoom][h]:Hide();
end
end
-- if our zoom is not a multiple of our size, we have a little extra we
-- need to worry about :X
if(wzoom_real ~= wzoom) then
if(needright_extra) then
rightw = (old_rightw-zoom);
end
if(needbottom_extra) then
bottomh = (old_bottomh-zoom);
for h = 1,wzoom_real-1 do
texturelayout[h][hzoom_real]:SetHeight(bottomh);
if(h == 1) then
texturelayout[h][hzoom_real]:SetTexCoord( (x-zx), 1, 0, bottomh/zoom);
texturelayout[h][hzoom_real]:SetWidth(zoom-px);
ya_raw_setoff(texturelayout[h][hzoom_real],vfname,0,py);
elseif(not needright_extra and h == wzoom_real-1) then
texturelayout[h][hzoom_real]:SetWidth(rightw);
texturelayout[h][hzoom_real]:SetTexCoord( 0, rightw/zoom, 0, bottomh/zoom);
ya_raw_setoff(texturelayout[h][hzoom_real],vfname,px,py);
else
texturelayout[h][hzoom_real]:SetWidth(zoom);
texturelayout[h][hzoom_real]:SetTexCoord( 0, 1, 0, bottomh/zoom);
ya_raw_setoff(texturelayout[h][hzoom_real],vfname,px,py);
end
texturelayout[h][hzoom_real]:Show();
end
else
for h = 1,wzoom_real-1 do
texturelayout[h][hzoom_real]:Hide();
end
end
if(needright_extra) then
for h = 1,hzoom_real do
texturelayout[wzoom_real][h]:SetWidth(rightw);
texturelayout[wzoom_real][h]:Show();
if(h == 1) then
texturelayout[wzoom_real][h]:SetTexCoord( 0, rightw/zoom, (y-zy), 1);
texturelayout[wzoom_real][h]:SetHeight(zoom-py);
ya_raw_setoff(texturelayout[wzoom_real][h],vfname,px,0);
elseif(not needbottom_extra and h == hzoom_real-1) then
texturelayout[wzoom_real][h]:SetHeight(bottomh);
texturelayout[wzoom_real][h]:SetTexCoord( 0, rightw/zoom, 0, bottomh/zoom);
ya_raw_setoff(texturelayout[wzoom_real][h],vfname,px,py);
elseif(h == hzoom_real) then
if(needbottom_extra) then
texturelayout[wzoom_real][h]:SetHeight(bottomh);
texturelayout[wzoom_real][h]:SetTexCoord( 0, rightw/zoom, 0, bottomh/zoom);
ya_raw_setoff(texturelayout[wzoom_real][h],vfname,px,py);
else
texturelayout[wzoom_real][h]:Hide();
end
else
texturelayout[wzoom_real][h]:SetHeight(zoom);
texturelayout[wzoom_real][h]:SetTexCoord( 0, rightw/zoom, 0, 1);
ya_raw_setoff(texturelayout[wzoom_real][h],vfname,px,py);
end
end
else
for h = 1,hzoom_real do
texturelayout[wzoom_real][h]:Hide();
end
end
end
-- set zone text
if(not vf.dragme) then
self:UpdateDropDown2();
end
self.opt.Location[1] = x;
self.opt.Location[2] = y;
YAPoints_OnMove(self, x,y);
end
function YatlasFrameTemplate:GetLocation()
local fm = self:GetName();
return self.opt.Location[1],
self.opt.Location[2];
end
function YatlasFrameTemplate:AdjustLocation(dx,dy,forceupdate)
local fm = self:GetName();
if(self.opt == nil) then
-- we aren't ready yet!
return;
end
self:SetLocation(
self.opt.Location[1] + dx,
self.opt.Location[2] - dy,
forceupdate);
end
function YatlasFrameTemplate:GetZoneText(offx, offy)
-- untested?
local f = {YF_GetZoneIDs(self, offx, offy)};
if(getn(f) < 1) then
return YATLAS_UNKNOWN_ZONE;
end
local r = {};
for h,v in pairs(f) do
r[h] = Yatlas_areadb[v][1];
end
return unpack(r);
end
function YatlasFrameTemplate:GetZoneIDs(offx, offy)
local fm = self:GetName();
local x, y = unpack(self.opt.Location);
local zoom = self:GetZoom();
if(offx == nil) then offx = 0 end
if(offy == nil) then offy = 0 end
local roffx = math.floor((x+offx-math.floor(x))*16);
local roffy = math.floor((y+offx-math.floor(y))*16);
local cv = (math.mod(roffx,16)+1)+(math.mod(roffy,16)+1)*16;
local v = self.texturelayout[math.floor(offx)+1][math.floor(offy)+1].areaids;
local nsv = getn(v)/2 - 1;
local id;
local jbase = 1;
for i = 0,nsv do
local joff = v[2*i+2];
if(cv <= jbase + joff) then
id = v[2*i+1];
break;
end
jbase = jbase + joff;
end
local wd = 0;
if(id == nil or Yatlas_areadb[id] == nil) then
return nil;
end
local r = {id};
while(id ~= nil and Yatlas_areadb[id] ~= nil and wd < 100) do
id = Yatlas_areadb[id][1];
if(id ~= nil and Yatlas_areadb[id] ~= nil) then
tinsert(r, 1, id);
end
wd = wd + 1;
end
return unpack(r);
end
function YatlasFrameTemplate:OnWorldMapUpdate()
-- update landmarks
local mapname, mapszx, mapszy = GetMapInfo();
if(mapname and Yatlas_Landmarks[mapname] == nil and Yatlas_mapareas[mapname]) then
local x1,x2,y1,y2;
if(Yatlas_mapareas[mapname][0] ~= nil) then
x1 = Yatlas_mapareas[mapname][0][1];
x2 = Yatlas_mapareas[mapname][0][2];
y1 = Yatlas_mapareas[mapname][0][3];
y2 = Yatlas_mapareas[mapname][0][4];
else
local _,va = next(Yatlas_mapareas[mapname]);
x1 = va[1];
x2 = va[2];
y1 = va[3];
y2 = va[4];
end
local n = GetNumMapLandmarks();
Yatlas_Landmarks[mapname] = {};
for h = 1,n do
local name, description, text, x, y =
GetMapLandmarkInfo(h);
x = (-x*(x1-x2) + x1);
y = (-y*(y1-y2) + y1);
tinsert(Yatlas_Landmarks[mapname],
{x,y, name, description, text});
end
YAPoints_ForceUpdate();
end
if(self.trackseek or (self.opt and self.opt.track)) then
self:OnWorldMapUpdateU(self.trackseek or self.opt.track)
end
-- zooming to a unit?
if(self.trackseek_state ~= nil) then
local i,v = next(Yatlas_WorldMapIds, self.trackseek_state);
if(v == nil) then
self.trackseek_state = nil;
else
self.trackseek_state = i;
SetMapZoom(v);
end
end
end
function YatlasFrameTemplate:OnWorldMapUpdateU(u)
local map = GetMapInfo();
local x,y = GetPlayerMapPosition(u);
local lm = self:GetName();
local viewframe = getglobal(lm.."ViewFrame");
local zoom = self.opt.Zoom
if(Yatlas_mapareas[map] == nil or (x == 0 and y == 0)) then
return;
end
local x1,x2,y1,y2;
if(Yatlas_mapareas[map][0] ~= nil) then
x1 = Yatlas_mapareas[map][0][1];
x2 = Yatlas_mapareas[map][0][2];
y1 = Yatlas_mapareas[map][0][3];
y2 = Yatlas_mapareas[map][0][4];
else
local _,va = next(Yatlas_mapareas[map]);
x1 = va[1];
x2 = va[2];
y1 = va[3];
y2 = va[4];
end
local unitx, unity = (-x*(x1-x2) + x1), (-y*(y1-y2) + y1);
if(u == self.trackseek) then
local zx,zy = Yatlas_Big2Mini_Coord(unitx, unity);
self:SetMap(map);
self:SetLocation(zx-(viewframe:GetWidth()/2)/zoom,
zy-(viewframe:GetHeight()/2)/zoom);
self.trackseek = nil;
self.trackseek_state = nil;
self.resetmapzoom = true;
elseif(u == self.opt.track) then
local rx,ry = self:GetLocation();
local zx,zy = Yatlas_Big2Mini_Coord(unitx, unity);
local whaffzoom = (viewframe:GetWidth()/2)/zoom;
local hhaffzoom = (viewframe:GetHeight()/2)/zoom;
rx = rx+whaffzoom;
ry = ry+hhaffzoom;
zx = zx-whaffzoom;
zy = zy-hhaffzoom;
if(zx > rx or zx + whaffzoom*2 < rx or
zy > ry or zy + hhaffzoom*2 < ry) then
self:SetMap(map);
self:SetLocation(zx, zy);
end
self.resetmapzoom = true;
end
end
function ya_raw_setoff(texture, parent, px, py)
local zoom = getglobal(parent):GetParent().opt.Zoom
texture:ClearAllPoints();
texture:SetPoint("TOPLEFT", parent,
"TOPLEFT", (zoom)*(texture.hx-1) - px,
-(zoom)*(texture.hy-1) + py);
end
ya_lastdragx, ya_lastdragy = nil, nil;
function YatlasFrameViewFrame_OnDrag()
local x,y = GetCursorPosition();
local fx, fy;
local zoom = this:GetParent().opt.Zoom;
x = x / this:GetEffectiveScale();
y = y / this:GetEffectiveScale();
fx = math.floor(x - this:GetLeft())/(zoom);
fy = math.floor(y - this:GetBottom())/(zoom);
if(ya_lastdragx ~= nil) then
this:GetParent():AdjustLocation(ya_lastdragx - fx, ya_lastdragy - fy);
end
ya_lastdragx = fx;
ya_lastdragy = fy;
end
function YatlasFrameViewFrame_UpdateCursorCoord()
local x, y = GetCursorPosition();
local rx, ry = unpack(YatlasFrame.opt.Location);
local top = this:GetTop();
local zoom = YatlasFrame.opt.Zoom;
if(this.lastoux == x and this.lastouy == y) then
return;
end
this.lastoux = x;
this.lastouy = y;
x = x / this:GetEffectiveScale();
y = y / this:GetEffectiveScale();
rx = rx + math.floor(x - this:GetLeft())/zoom;
ry = ry + 512/zoom-math.floor(y - this:GetBottom())/zoom;
local bigx, bigy = Yatlas_Mini2Big_Coord(rx,ry);
end
function YatlasFrameTemplate:OnUpdate(elapsed)
self.update_time = self.update_time + elapsed;
if(self.update_time > 0.5) then
YAPoints_OnUpdate(self, self.update_time);
if(GetMapInfo() ~= self.opt.Map) then
self.resetmapzoom = 1;
SetMapZoom(Yatlas_WorldMapIds[self.opt.Map]);
else
self:OnWorldMapUpdate()
end
self.update_time = 0;
if(self.resetmapzoom) then
self.resetmapzoom = nil;
SetMapToCurrentZone()
end
end
end
function Yatlas_Mini2Big_Coord(x,y)
return (x - 32)*-MINI2BIGX,(y-32)*-MINI2BIGY;
end
function Yatlas_Big2Mini_Coord(x,y)
return (x/-MINI2BIGX + 32),(y/-MINI2BIGY + 32);
end
function Yatlas_GetMapZones(map)
-- map zone ids to name
local ret = {};
if(Yatlas_ZoneIds[map]) then
for h,v in ipairs(Yatlas_ZoneIds[map]) do
tinsert(ret, Yatlas_areadb[v][2]);
end
end
table.sort(ret);
return unpack(ret);
end
-- YatlasOptionsFrame
function YatlasOptionsFrameSelect_Initialize()
local i = 1;
local info;
for h,v in pairs(YatlasOptions.Frames) do
info = {
text = h;
func = YatlasOptionsFrameSelect_OnClick;
value = getglobal(h);
};
UIDropDownMenu_AddButton(info);
if(i == 1 and YatlasOptionsFrameSelect.currFrame == nil) then
YatlasOptionsFrameSelect.currFrame = getglobal(h);
end
i = i + 1;
end
end
function YatlasOptionsFrameSelect_OnClick()
UIDropDownMenu_SetSelectedID(YatlasOptionsFrameSelect, this:GetID());
YatlasOptionsFrameSelect.currFrame = this.value;
YatlasOptionsFrame_Update();
end
function YatlasOptionsFrame_Update()
local frame = YatlasOptionsFrameSelect.currFrame;
if(frame) then
local lm = frame:GetName();
local opt = YatlasOptions.Frames[lm];
YatlasOptionsAlphaSlider:SetValue(opt.Alpha);
YatlasOptionsIconSizeSlider:SetValue(opt.IconSize);
if(frame == YatlasFrame) then
YatlasOptionsCoordBEnable:Show();
YatlasOptionsCoordBEnable:SetChecked(YatlasOptions.ShowCursorCoords);
else
YatlasOptionsCoordBEnable:Hide();
end
end
end
-- YatlasTooltip
YatlasTooltipTemplate = {};
function YatlasTooltipTemplate:OnLoad()
self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r,
TOOLTIP_DEFAULT_COLOR.g,
TOOLTIP_DEFAULT_COLOR.b);
self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r,
TOOLTIP_DEFAULT_BACKGROUND_COLOR.g,
TOOLTIP_DEFAULT_BACKGROUND_COLOR.b);
self.lines = {};
self.nextnew = 1;
self.nextfree = 1;
end
function YatlasTooltipTemplate:Show()
local r = getmetatable(self).__index(self, "Show")(self);
self:FixSize();
return r;
end
function YatlasTooltipTemplate:GetNext()
if(self.nextfree < self.nextnew) then
self.nextfree = self.nextfree + 1;
return self.lines[self.nextfree-1];
end
if(self.nextnew > 32) then
return;
end
local f = CreateFrame("Button");
f:SetHeight(16);
f:SetWidth(16);
f:SetParent(self);
f:EnableMouse(true);
f.Icon = f:CreateTexture(nil, "OVERLAY");
f.Icon:SetPoint("TOPLEFT", f);
f.Foreground = f:CreateFontString(nil, "ARTWORK");
f.Foreground:SetFontObject(GameFontHighlight);
f.Foreground:SetTextColor(0, 0, 0);
f.Foreground:SetShadowOffset(-1, 0);
f.Foreground:SetPoint("TOPLEFT", f);
f:SetFrameLevel(f:GetFrameLevel() + 4);
f.Clear = YP_Clear;
f.SetOffset = nilfunc;
f.Text = f:CreateFontString(nil, "ARTWORK");
f.Text:SetFontObject(GameFontHighlight);
f.Text:SetPoint("TOPLEFT", f.Icon, 24, 0);
if(self.nextnew == 1) then
f:SetPoint("TOPLEFT", self, "TOPLEFT", 8, -8);
else
f:SetPoint("TOPLEFT", self.lines[self.nextnew-1], "BOTTOMLEFT", 0, -2);
end
tinsert(self.lines, f);
self.nextnew = self.nextnew + 1;
self.nextfree = self.nextfree + 1;
return f;
end
function YatlasTooltipTemplate:FixSize()
local hei = 16;
local wid = 4;
for h = 1,(self.nextfree-1) do
hei = hei + self.lines[h]:GetHeight() + 2;
if(self.lines[h].Text:GetWidth() > wid) then
wid = self.lines[h].Text:GetWidth();
end
end
self:SetHeight(hei);
self:SetWidth(wid+64);
end
function YatlasTooltipTemplate:Clear()
for h = 1,(self.nextfree-1) do
self.lines[h]:Hide();
end
self.nextfree = 1;
self:FixSize();
self:Hide();
end