You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
745 lines
23 KiB
745 lines
23 KiB
local _, addon = ...
|
|
local API = addon.API;
|
|
|
|
|
|
local VIEWPORT_SCALE = 0.25;
|
|
local VIEWPORT_WIDTH, VIEWPORT_HEIGHT = 3840 * VIEWPORT_SCALE, 2560 * VIEWPORT_SCALE;
|
|
local VIEWPORT_MAX_ZOOM_SCALE = 1;
|
|
local VIEWPORT_MAX_ZOOM_STEPS = 5;
|
|
local MAP_EFFECTIVE_SCALE = 1;
|
|
local PAN_RATIO_X, PAN_RATIO_Y;
|
|
local MAP_CANVAS_TILE_SIZE;
|
|
local MAP_CANVAS_WIDTH, MAP_CANVAS_HEIGHT = 3840 * VIEWPORT_SCALE, 2560 * VIEWPORT_SCALE;
|
|
|
|
do
|
|
local tileX, tileY = 4, 3;
|
|
local tilePixel = 1024;
|
|
local mapPixelX, mapPixelY = 3840, 2560;
|
|
|
|
MAP_CANVAS_TILE_SIZE = tilePixel * VIEWPORT_SCALE;
|
|
PAN_RATIO_X = mapPixelX * VIEWPORT_SCALE * MAP_CANVAS_WIDTH / VIEWPORT_WIDTH;
|
|
PAN_RATIO_Y = mapPixelY * VIEWPORT_SCALE * MAP_CANVAS_HEIGHT / VIEWPORT_HEIGHT;
|
|
end
|
|
|
|
|
|
local MAP_DATA = {
|
|
--[uiMapID] = { zones = { {x1, y1, areaID1}, } }
|
|
[2200] = {--Emerald Dream 10.2.0
|
|
--[[
|
|
zones = {
|
|
{0.2280, 0.3828, 14913},
|
|
{0.3861, 0.1574, 14864},
|
|
{0.6028, 0.2667, 14904},
|
|
{0.3043, 0.5208, 14974},
|
|
{0.5006, 0.4900, 14956},
|
|
{0.7576, 0.4545, 14856},
|
|
{0.5015, 0.5979, 14860},
|
|
{0.6900, 0.6311, 14877},
|
|
{0.3030, 0.7047, 15015},
|
|
},
|
|
--]]
|
|
vignetteIDs = {
|
|
5971, --Emerald Bounty
|
|
5844, 5789, 5792, 5776, 5787, --Dreamseed Cache
|
|
},
|
|
},
|
|
};
|
|
|
|
|
|
local Clamp = API.Clamp;
|
|
local GetPlayerMapCoord = API.GetPlayerMapCoord;
|
|
local GetPlayerFacing = GetPlayerFacing;
|
|
local GetCursorPosition = GetCursorPosition;
|
|
local GetAreaInfo = C_Map.GetAreaInfo;
|
|
local C_VignetteInfo = C_VignetteInfo;
|
|
|
|
|
|
local MainFrame = CreateFrame("Frame", "PMAP", UIParent);
|
|
MainFrame:SetFrameStrata("HIGH");
|
|
MainFrame:SetSize(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
|
|
MainFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0);
|
|
MainFrame:Hide();
|
|
|
|
|
|
local ZoneTextFont = CreateFont("PlumberZoneTextFont1");
|
|
do
|
|
local pixel = API.GetPixelForWidget(UIParent, 1);
|
|
|
|
local font, height = GameFontHighlightSmall:GetFont();
|
|
ZoneTextFont:SetFont(font, 12*pixel, "");
|
|
ZoneTextFont:SetTextColor(93/255, 63/255, 16/255);
|
|
ZoneTextFont:SetJustifyH("CENTER");
|
|
ZoneTextFont:SetJustifyV("MIDDLE");
|
|
ZoneTextFont:SetSpacing(0);
|
|
ZoneTextFont:SetShadowOffset(2*pixel, -2*pixel);
|
|
--ZoneTextFont:SetShadowColor(222/255, 204/255, 90/255);
|
|
ZoneTextFont:SetShadowColor(227/255, 210/255, 132/255);
|
|
|
|
local ZoneTextFont2 = CreateFont("PlumberZoneTextFont2");
|
|
ZoneTextFont2:CopyFontObject(ZoneTextFont);
|
|
ZoneTextFont2:SetShadowOffset(-2*pixel, 2*pixel);
|
|
--ZoneTextFont2:SetTextColor(222/255, 204/255, 90/255);
|
|
--ZoneTextFont2:SetShadowColor(202/255, 190/255, 83/255);
|
|
ZoneTextFont2:SetShadowColor(227/255, 210/255, 132/255, 1);
|
|
ZoneTextFont2:SetTextColor(227/255, 210/255, 132/255);
|
|
|
|
local ZoneTextFont3 = CreateFont("PlumberZoneTextFont3");
|
|
ZoneTextFont3:CopyFontObject(ZoneTextFont2);
|
|
ZoneTextFont3:SetShadowOffset(-2*pixel, -2*pixel);
|
|
|
|
local ZoneTextFont4 = CreateFont("PlumberZoneTextFont4");
|
|
ZoneTextFont4:CopyFontObject(ZoneTextFont2);
|
|
ZoneTextFont4:SetShadowOffset(2*pixel, 2*pixel);
|
|
end
|
|
|
|
local MapPinMixin = {};
|
|
|
|
function MapPinMixin:SetXY(x, y)
|
|
self.x, self.y = x, y;
|
|
if x and y then
|
|
self:UpdatePosition();
|
|
end
|
|
end
|
|
|
|
function MapPinMixin:UpdatePosition()
|
|
if not self.x then return end;
|
|
local offsetX, offsetY = self.x * MAP_CANVAS_WIDTH * MAP_EFFECTIVE_SCALE, self.y * MAP_CANVAS_HEIGHT * MAP_EFFECTIVE_SCALE;
|
|
self:SetPoint("CENTER", offsetX, -offsetY);
|
|
end
|
|
|
|
function MapPinMixin:Update()
|
|
if self.updateFunc then
|
|
self.updateFunc(self);
|
|
end
|
|
end
|
|
|
|
function MapPinMixin:Remove()
|
|
self.active = false;
|
|
self:Hide();
|
|
self:ClearAllPoints();
|
|
if self.Icon then
|
|
self.Icon:SetTexture(nil);
|
|
end
|
|
if self.TinyBar then
|
|
self.TinyBar:Hide();
|
|
end
|
|
self:EnableMouse(false);
|
|
end
|
|
|
|
function MapPinMixin:OnEnter()
|
|
if self.objectGUID then
|
|
GameTooltip:Hide();
|
|
local name = API.DreamseedUtil:GetPlantNameAndProgress(self.objectGUID);
|
|
if name then
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:AddLine(name, 1, 1, 1, true);
|
|
GameTooltip:Show();
|
|
end
|
|
API.DreamseedUtil:GetRewards(self.objectGUID)
|
|
end
|
|
end
|
|
|
|
function MapPinMixin:OnLeave()
|
|
GameTooltip:Hide();
|
|
end
|
|
|
|
function MapPinMixin:OnMouseDown()
|
|
MainFrame:OnMouseDown();
|
|
end
|
|
|
|
function MapPinMixin:OnMouseUp()
|
|
MainFrame:OnMouseUp();
|
|
end
|
|
|
|
|
|
local function PinUpdateFunc_SeedPlanting(self)
|
|
if not self.objectGUID then return end;
|
|
|
|
local currentTime, fullTime = API.DreamseedUtil:GetGrowthTimes(self.objectGUID);
|
|
if currentTime and currentTime > 0 then
|
|
self.Icon:SetTexture("Interface/AddOns/Plumber/Art/MapPin/SeedPlanting-Green");
|
|
self:SetSize(16, 16);
|
|
|
|
if not self.TinyBar then
|
|
self.TinyBar = addon.CreateTinyStatusBar(self);
|
|
self.TinyBar:SetPoint("TOP", self, "BOTTOM", 0, -2);
|
|
self.TinyBar:SetWidth(16);
|
|
end
|
|
self.TinyBar:Show();
|
|
self.TinyBar:UpdateMaxBarFillWidth();
|
|
self.TinyBar:SetReverse(true);
|
|
self.TinyBar:SetTimes(fullTime - currentTime, fullTime);
|
|
else
|
|
self.Icon:SetTexture("Interface/AddOns/Plumber/Art/MapPin/SeedPlanting-Empty-Nearby");
|
|
self:SetSize(12, 12);
|
|
if self.TinyBar then
|
|
self.TinyBar:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
local PinUtil = {};
|
|
|
|
PinUtil.templates = {
|
|
Player = {
|
|
icon = "Player",
|
|
level = 50,
|
|
--size = 32,
|
|
},
|
|
|
|
ZoneText = {
|
|
level = 10,
|
|
hasLabel = true,
|
|
icon = "ZoneTextDropShadow",
|
|
},
|
|
|
|
SeedPlanting = {
|
|
icon = "SeedPlanting-Empty-Nearby",
|
|
level = 40,
|
|
size = 20,
|
|
updateFunc = PinUpdateFunc_SeedPlanting,
|
|
},
|
|
};
|
|
|
|
function PinUtil:RemoveAllPins()
|
|
if not self.pins then return end;
|
|
|
|
for _, pin in pairs(self.pins) do
|
|
if pin.active then
|
|
pin:Remove();
|
|
end
|
|
end
|
|
end
|
|
|
|
function PinUtil:Acquire(templateName)
|
|
if not self.pins then
|
|
self.pins = {};
|
|
self.numPins = 0;
|
|
end
|
|
|
|
local pin;
|
|
|
|
for i, p in ipairs(self.pins) do
|
|
if not p.active then
|
|
pin = p;
|
|
break
|
|
end
|
|
end
|
|
|
|
if not pin then
|
|
pin = CreateFrame("Frame", nil, MainFrame.MapContainer);
|
|
pin:SetSize(16, 16);
|
|
table.insert(self.pins, pin);
|
|
API.Mixin(pin, MapPinMixin);
|
|
pin:SetScript("OnMouseDown", MapPinMixin.OnMouseDown);
|
|
pin:SetScript("OnMouseUp", MapPinMixin.OnMouseUp);
|
|
|
|
self.numPins = self.numPins + 1;
|
|
|
|
pin:SetIgnoreParentScale(true);
|
|
pin.Icon = pin:CreateTexture(nil, "ARTWORK");
|
|
pin.Icon:SetAllPoints(true);
|
|
pin:SetIgnoreParentAlpha(true);
|
|
print("NEW PIN", #self.pins)
|
|
end
|
|
|
|
local templateData = templateName and self.templates[templateName];
|
|
if templateData then
|
|
if templateData.level then
|
|
pin:SetFrameLevel(templateData.level);
|
|
end
|
|
|
|
if templateData.hasLabel then
|
|
if not pin.Label then
|
|
pin.Label = pin:CreateFontString(nil, "OVERLAY", "PlumberZoneTextFont1");
|
|
pin.Label:SetPoint("CENTER", pin, "CENTER", 0, 0);
|
|
pin.Label2 = pin:CreateFontString(nil, "ARTWORK", "PlumberZoneTextFont2");
|
|
pin.Label2:SetPoint("CENTER", pin, "CENTER", 0, 0);
|
|
pin.Label3 = pin:CreateFontString(nil, "ARTWORK", "PlumberZoneTextFont3");
|
|
pin.Label3:SetPoint("CENTER", pin, "CENTER", 0, 0);
|
|
pin.Label4 = pin:CreateFontString(nil, "ARTWORK", "PlumberZoneTextFont4");
|
|
pin.Label4:SetPoint("CENTER", pin, "CENTER", 0, 0);
|
|
end
|
|
pin.Label:Show();
|
|
pin.Label2:Show();
|
|
pin.Label3:Show();
|
|
pin.Label4:Show();
|
|
end
|
|
|
|
if templateData.icon then
|
|
pin.Icon:SetTexture("Interface/AddOns/Plumber/Art/MapPin/"..templateData.icon, nil, nil, "TRILINEAR");
|
|
pin.Icon:ClearAllPoints();
|
|
if templateData.hasLabel then
|
|
pin.Icon:SetPoint("TOPLEFT", pin.Label, "TOPLEFT", -12, 4);
|
|
pin.Icon:SetPoint("BOTTOMRIGHT", pin.Label, "BOTTOMRIGHT", 12, -4);
|
|
else
|
|
pin.Icon:SetAllPoints(true);
|
|
end
|
|
end
|
|
|
|
if templateData.size then
|
|
local a = templateData.size;
|
|
local uiScale = UIParent:GetEffectiveScale();
|
|
pin:SetSize(a*uiScale, a*uiScale);
|
|
local b = a/64;
|
|
pin.Icon:SetTexCoord(0.5 - b, 0.5 + b, 0.5 - b, 0.5 + b);
|
|
else
|
|
pin:SetSize(16, 16);
|
|
pin.Icon:SetTexCoord(0, 1, 0, 1);
|
|
end
|
|
|
|
pin.updateFunc = templateData.updateFunc;
|
|
end
|
|
|
|
pin:SetPoint("CENTER", MainFrame.MapContainer, "TOPLEFT", 0, 0);
|
|
pin:Show();
|
|
pin.active = true;
|
|
|
|
return pin
|
|
end
|
|
|
|
function PinUtil:UpdateAllPins()
|
|
for i, pin in ipairs(self.pins) do
|
|
if pin.active then
|
|
pin:UpdatePosition();
|
|
end
|
|
end
|
|
end
|
|
|
|
local function AddInteractableObject(obj)
|
|
table.insert(MainFrame.InteractableObjects, obj);
|
|
end
|
|
|
|
local function UpdateMaxZoom()
|
|
local SCREEN_WIDTH, SCREEN_HEIGHT = GetPhysicalScreenSize();
|
|
local frameScale = MainFrame:GetEffectiveScale();
|
|
local scale = 768 / SCREEN_HEIGHT / frameScale / VIEWPORT_SCALE;
|
|
|
|
VIEWPORT_MAX_ZOOM_SCALE = scale;
|
|
|
|
--print("MAX_ZOOM: "..VIEWPORT_MAX_ZOOM_SCALE);
|
|
|
|
local zoomScale = 1;
|
|
local scalePerDelta = 0.5;
|
|
local maxZoomSteps = 1;
|
|
|
|
for i = 2, VIEWPORT_MAX_ZOOM_STEPS do
|
|
zoomScale = zoomScale + scalePerDelta;
|
|
if zoomScale < VIEWPORT_MAX_ZOOM_SCALE then
|
|
if zoomScale + scalePerDelta > VIEWPORT_MAX_ZOOM_SCALE then
|
|
MainFrame.zoomScales[i] = VIEWPORT_MAX_ZOOM_SCALE;
|
|
maxZoomSteps = i;
|
|
else
|
|
MainFrame.zoomScales[i] = zoomScale;
|
|
maxZoomSteps = maxZoomSteps + 1;
|
|
end
|
|
else
|
|
MainFrame.zoomScales[i] = VIEWPORT_MAX_ZOOM_SCALE;
|
|
end
|
|
end
|
|
MainFrame.zoomScales[ VIEWPORT_MAX_ZOOM_STEPS ] = VIEWPORT_MAX_ZOOM_SCALE;
|
|
|
|
MainFrame.maxZoomSteps = maxZoomSteps;
|
|
--print("MAX STEPS: "..maxZoomSteps)
|
|
end
|
|
|
|
|
|
function MainFrame:Init()
|
|
self.zoom = 1;
|
|
self.zoomStep = 1;
|
|
self.maxZoomSteps = 1;
|
|
self.zoomScales = {1};
|
|
self.InteractableObjects = {};
|
|
|
|
--Tiles: total = 12(4*3), image = 1024x1024
|
|
self.MapSlices = {};
|
|
|
|
local ClipFrame = CreateFrame("Frame", nil, self);
|
|
self.ClipFrame = ClipFrame;
|
|
ClipFrame:SetClipsChildren(true);
|
|
ClipFrame:SetSize(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
|
|
ClipFrame:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0);
|
|
AddInteractableObject(ClipFrame);
|
|
|
|
local container = CreateFrame("Frame", nil, ClipFrame);
|
|
self.MapContainer = container;
|
|
container:SetSize(8, 8);
|
|
container:SetPoint("TOPLEFT", ClipFrame, "TOPLEFT", 0, 0);
|
|
|
|
local size = MAP_CANVAS_TILE_SIZE;
|
|
local slice;
|
|
local col, row = 0, 0;
|
|
|
|
self.Blackout = ClipFrame:CreateTexture(nil, "BACKGROUND", nil, -1);
|
|
self.Blackout:SetPoint("TOPLEFT", ClipFrame, "TOPLEFT", 0, 0);
|
|
self.Blackout:SetPoint("BOTTOMRIGHT", ClipFrame, "BOTTOMRIGHT", 0, 0);
|
|
|
|
for i = 1, 12 do
|
|
slice = container:CreateTexture(nil, "BACKGROUND");
|
|
self.MapSlices[i] = slice;
|
|
slice:SetSize(size, size);
|
|
slice:SetPoint("TOPLEFT", container, "TOPLEFT", col*size, -row*size);
|
|
col = col + 1;
|
|
if col >= 4 then
|
|
col = 0;
|
|
row = row + 1;
|
|
end
|
|
end
|
|
|
|
UpdateMaxZoom();
|
|
self:RegisterEvent("UI_SCALE_CHANGED");
|
|
self:RegisterEvent("DISPLAY_SIZE_CHANGED");
|
|
|
|
self:LoadMap();
|
|
|
|
--Header
|
|
local CursorPosText = self:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall");
|
|
CursorPosText:SetPoint("BOTTOMLEFT", ClipFrame, "TOPLEFT", 0, 4);
|
|
self.CursorPosText = CursorPosText;
|
|
|
|
self.t1 = 0; --Update player position, 60FPS
|
|
self.t2 = 0; --Update cursor position, 8FPS
|
|
self:SetScript("OnUpdate", self.OnUpdate);
|
|
--self:SetScript("OnMouseWheel", self.OnMouseWheel);
|
|
--self:SetScript("OnMouseDown", self.OnMouseDown);
|
|
--self:SetScript("OnMouseUp", self.OnMouseUp);
|
|
|
|
self.Init = nil;
|
|
end
|
|
|
|
function MainFrame:LoadMap(uiMapID)
|
|
uiMapID = uiMapID or C_Map.GetBestMapForUnit("player");
|
|
|
|
local mapData = MAP_DATA[uiMapID];
|
|
|
|
if not mapData then
|
|
return
|
|
end
|
|
|
|
if uiMapID == self.uiMapID then return end;
|
|
self.uiMapID = uiMapID;
|
|
|
|
local filePrefix = "Interface/AddOns/Plumber/Art/WorldMap/2200_";
|
|
local id;
|
|
local filter = "TRILINEAR"; --TRILINEAR-LINEAR
|
|
|
|
--self.Blackout:SetTexture(filePrefix.."thumbnail", nil, nil, "NEAREST");
|
|
|
|
for i = 1, 12 do
|
|
if i < 10 then
|
|
id = "0"..i;
|
|
else
|
|
id = i;
|
|
end
|
|
self.MapSlices[i]:SetTexture(filePrefix..id, nil, nil, filter);
|
|
end
|
|
|
|
|
|
PinUtil:RemoveAllPins();
|
|
self.PlayerPin = PinUtil:Acquire("Player");
|
|
|
|
if mapData.zones then
|
|
local pin, zoneName;
|
|
for _, zoneData in ipairs(mapData.zones) do
|
|
pin = PinUtil:Acquire("ZoneText");
|
|
pin:SetXY(zoneData[1], zoneData[2]);
|
|
zoneName = GetAreaInfo(zoneData[3]);
|
|
if zoneName then
|
|
zoneName = string.upper(zoneName);
|
|
zoneName = string.gsub(zoneName, " ", "\n", 1);
|
|
pin.Label:SetText(zoneName);
|
|
pin.Label2:SetText(zoneName);
|
|
pin.Label3:SetText(zoneName);
|
|
pin.Label4:SetText(zoneName);
|
|
end
|
|
end
|
|
end
|
|
|
|
self.watchedVigetteIDs = {};
|
|
if mapData.vignetteIDs then
|
|
for i, vignetteID in ipairs(mapData.vignetteIDs) do
|
|
self.watchedVigetteIDs[vignetteID] = true;
|
|
end
|
|
end
|
|
|
|
self:SetMapScale(1);
|
|
self:SetMapOffset(0, 0);
|
|
self:UpdateVignettes();
|
|
end
|
|
|
|
function MainFrame:UpdateVignettes()
|
|
--POIs
|
|
local vignetteGUIDs = C_VignetteInfo.GetVignettes();
|
|
local pin;
|
|
local info, vignettePosition, vignetteFacing;
|
|
local vignettesGUIDs = {};
|
|
local total = 0;
|
|
local uiMapID = self.uiMapID;
|
|
|
|
PinUtil:RemoveAllPins();
|
|
self.PlayerPin = PinUtil:Acquire("Player");
|
|
|
|
for i, guid in ipairs(vignetteGUIDs) do
|
|
info = C_VignetteInfo.GetVignetteInfo(guid);
|
|
if info and info.vignetteID and self.watchedVigetteIDs[info.vignetteID] then
|
|
total = total + 1;
|
|
vignettesGUIDs[total] = info.vignetteGUID;
|
|
vignettePosition, vignetteFacing = C_VignetteInfo.GetVignettePosition(info.vignetteGUID, uiMapID);
|
|
if vignettePosition then
|
|
pin = PinUtil:Acquire("SeedPlanting");
|
|
pin:SetScript("OnEnter", MapPinMixin.OnEnter);
|
|
pin:SetScript("OnLeave", MapPinMixin.OnLeave);
|
|
pin:EnableMouse(true);
|
|
pin:SetXY(vignettePosition:GetXY());
|
|
pin.objectGUID = info.objectGUID;
|
|
pin:Update();
|
|
end
|
|
end
|
|
end
|
|
|
|
--print("UpdateVignettes")
|
|
end
|
|
|
|
function MainFrame:OnUpdate(elapsed)
|
|
self.t1 = self.t1 + elapsed;
|
|
if self.t1 > 0.016 then
|
|
self.t1 = 0;
|
|
if self.PlayerPin then
|
|
local coordX, coordY = GetPlayerMapCoord(self.uiMapID);
|
|
self.PlayerPin:SetXY(coordX, coordY);
|
|
self.facing = GetPlayerFacing();
|
|
self.PlayerPin.Icon:SetRotation(self.facing or 0);
|
|
--self:CenterMapAtCoord(coordX, coordY);
|
|
end
|
|
end
|
|
|
|
self.t2 = self.t2 + elapsed;
|
|
if self.t2 >= 0.125 then
|
|
self.t2 = 0;
|
|
local cx, cy = self:GetCursorMapCoord();
|
|
self.CursorPosText:SetText(string.format("%.2f, %.2f", cx*100, cy*100));
|
|
end
|
|
|
|
if self.isMouseDown then
|
|
self:ProcessMousePan();
|
|
end
|
|
end
|
|
|
|
function MainFrame:GetCursorMapCoord()
|
|
local cursorX, cursorY = GetCursorPosition();
|
|
local effectiveScale = self:GetEffectiveScale();
|
|
cursorX = cursorX / effectiveScale;
|
|
cursorY = cursorY / effectiveScale;
|
|
|
|
local left = MainFrame.ClipFrame:GetLeft();
|
|
local top = MainFrame.ClipFrame:GetTop();
|
|
|
|
local rx = ((cursorX - left)/self.mapScale - self.mapOffsetX)/MAP_CANVAS_WIDTH;
|
|
local ry = ((top - cursorY)/self.mapScale + self.mapOffsetY)/MAP_CANVAS_HEIGHT;
|
|
|
|
rx = Clamp(rx, 0, 1);
|
|
ry = Clamp(ry, 0, 1);
|
|
|
|
return rx, ry
|
|
end
|
|
|
|
function MainFrame:ConvertMapCoordToOffset(coordX, coordY)
|
|
local cursorX, cursorY = GetCursorPosition();
|
|
local effectiveScale = self:GetEffectiveScale();
|
|
cursorX = cursorX / effectiveScale;
|
|
cursorY = cursorY / effectiveScale;
|
|
|
|
local left = MainFrame.ClipFrame:GetLeft();
|
|
local top = MainFrame.ClipFrame:GetTop();
|
|
|
|
local x = (cursorX - left)/self.mapScale - coordX*MAP_CANVAS_WIDTH;
|
|
local y = coordY*MAP_CANVAS_HEIGHT - (top - cursorY)/self.mapScale;
|
|
return x, y
|
|
end
|
|
|
|
function MainFrame:OnMouseWheel(delta)
|
|
if delta > 0 and self.zoomStep < self.maxZoomSteps then
|
|
self.zoomStep = self.zoomStep + 1;
|
|
elseif delta < 0 and self.zoomStep > 1 then
|
|
self.zoomStep = self.zoomStep - 1;
|
|
else
|
|
return
|
|
end
|
|
|
|
local rx, ry = self:GetCursorMapCoord();
|
|
|
|
local newScale = self.zoomScales[self.zoomStep];
|
|
self:SetMapScale(newScale);
|
|
|
|
local x, y = self:ConvertMapCoordToOffset(rx, ry);
|
|
self:SetMapOffset(x, y)
|
|
end
|
|
|
|
function MainFrame:SetMapScale(mapScale)
|
|
self.mapScale = mapScale;
|
|
self.MapContainer:SetScale(mapScale);
|
|
|
|
MAP_EFFECTIVE_SCALE = self.MapContainer:GetEffectiveScale();
|
|
|
|
self.maxPanX = -MAP_CANVAS_WIDTH + VIEWPORT_WIDTH/mapScale;
|
|
self.maxPanY = MAP_CANVAS_HEIGHT - VIEWPORT_HEIGHT/mapScale;
|
|
|
|
if self.mapOffsetX and self.mapOffsetY then
|
|
self:SetMapOffset(self.mapOffsetX, self.mapOffsetY);
|
|
end
|
|
|
|
PinUtil:UpdateAllPins();
|
|
end
|
|
|
|
function MainFrame:SetInteractable(state)
|
|
for _, obj in pairs(self.InteractableObjects) do
|
|
obj:EnableMouse(state);
|
|
end
|
|
end
|
|
|
|
|
|
function MainFrame:ProcessMousePan()
|
|
local cursorX, cursorY = GetCursorPosition();
|
|
local diffX = cursorX - self.fromCursorX;
|
|
local diffY = cursorY - self.fromCursorY;
|
|
diffX = diffX * self.cursorScale / self.mapScale;
|
|
diffY = diffY * self.cursorScale / self.mapScale;
|
|
|
|
self:SetMapOffset(self.fromOffsetX + diffX, self.fromOffsetY + diffY);
|
|
end
|
|
|
|
function MainFrame:SetMapOffset(offsetX, offsetY)
|
|
offsetX = Clamp(offsetX, self.maxPanX, 0);
|
|
offsetY = Clamp(offsetY, 0, self.maxPanY);
|
|
self.MapContainer:SetPoint("TOPLEFT", offsetX, offsetY);
|
|
self.mapOffsetX = offsetX;
|
|
self.mapOffsetY = offsetY;
|
|
end
|
|
|
|
function MainFrame:CenterMapAtCoord(coordX, coordY)
|
|
local canvasX = coordX * MAP_CANVAS_WIDTH;
|
|
local canvasY = coordY * MAP_CANVAS_HEIGHT;
|
|
local viewportX = VIEWPORT_WIDTH * 0.5;
|
|
local viewportY = VIEWPORT_HEIGHT * 0.5;
|
|
local diffX = -canvasX + viewportX/self.mapScale;
|
|
local diffY = canvasY - viewportY/self.mapScale;
|
|
self:SetMapOffset(diffX, diffY);
|
|
end
|
|
|
|
function MainFrame:OnMouseDown()
|
|
self.fromCursorX, self.fromCursorY = GetCursorPosition();
|
|
local _;
|
|
_, _, _, self.fromOffsetX, self.fromOffsetY = self.MapContainer:GetPoint(1);
|
|
self.cursorScale = 1/UIParent:GetEffectiveScale();
|
|
|
|
self.isMouseDown = true;
|
|
end
|
|
|
|
function MainFrame:OnMouseUp()
|
|
self.isMouseDown = false;
|
|
end
|
|
|
|
function MainFrame:OnShow()
|
|
self:RegisterEvent("UPDATE_UI_WIDGET");
|
|
self:RegisterEvent("VIGNETTES_UPDATED");
|
|
end
|
|
MainFrame:SetScript("OnShow", MainFrame.OnShow);
|
|
|
|
function MainFrame:OnHide()
|
|
self.isMouseDown = false;
|
|
self:UnregisterEvent("UPDATE_UI_WIDGET");
|
|
self:UnregisterEvent("VIGNETTES_UPDATED");
|
|
end
|
|
MainFrame:SetScript("OnHide", MainFrame.OnHide);
|
|
|
|
|
|
MainFrame.widgetData = {};
|
|
|
|
function MainFrame:AddWidgetInfo(widgetInfo)
|
|
local widgetID = widgetInfo.widgetID;
|
|
if not self.widgetData[widgetID] then
|
|
self.widgetData[widgetID] = widgetInfo.widgetType;
|
|
print("ID:", widgetInfo.widgetID, " Type:", widgetInfo.widgetType)
|
|
return true
|
|
end
|
|
end
|
|
|
|
local numWidgets = 0;
|
|
local WATCHED_TYPE = {
|
|
[2] = true,
|
|
[27] = true,
|
|
[8] = true,
|
|
[20] = true,
|
|
}
|
|
local function YeetWidgetInfo(widgetID, widgetType)
|
|
--https://wowpedia.fandom.com/wiki/UPDATE_UI_WIDGET
|
|
if not WATCHED_TYPE[widgetType] then return end;
|
|
|
|
local widgetTypeInfo = UIWidgetManager:GetWidgetTypeInfo(widgetType);
|
|
if not widgetTypeInfo then return end;
|
|
|
|
local widgetInfo = widgetTypeInfo.visInfoDataFunction(widgetID);
|
|
if not widgetInfo then return end;
|
|
|
|
if widgetInfo.text then print(widgetInfo.text) end;
|
|
if widgetInfo.tooltip then print(widgetInfo.tooltip) end;
|
|
if widgetInfo.timerTooltip then print(widgetInfo.timerTooltip) end;
|
|
|
|
if false then
|
|
local widgetFrame = CreateFrame(widgetTypeInfo.templateInfo.frameType, nil, MainFrame, widgetTypeInfo.templateInfo.frameTemplate);
|
|
numWidgets = numWidgets + 1;
|
|
widgetFrame:SetPoint("TOP", UIParent, "TOP", 0, -48*numWidgets);
|
|
|
|
widgetFrame.widgetID = widgetID;
|
|
widgetFrame.widgetSetID = 0;
|
|
widgetFrame.widgetType = widgetType;
|
|
widgetFrame.hasTimer = widgetInfo.hasTimer;
|
|
widgetFrame.orderIndex = widgetInfo.orderIndex;
|
|
widgetFrame.widgetTag = widgetInfo.widgetTag;
|
|
widgetFrame.inAnimType = widgetInfo.inAnimType;
|
|
widgetFrame.outAnimType = widgetInfo.outAnimType;
|
|
widgetFrame.layoutDirection = widgetInfo.layoutDirection;
|
|
widgetFrame.modelSceneLayer = widgetInfo.modelSceneLayer;
|
|
widgetFrame.scriptedAnimationEffectID = widgetInfo.scriptedAnimationEffectID;
|
|
widgetFrame.markedForRemove = nil;
|
|
|
|
if widgetFrame.hasTimer then
|
|
print(widgetID, "has a timer");
|
|
end
|
|
|
|
widgetFrame:Setup(widgetInfo, MainFrame);
|
|
|
|
local isNewWidget = true;
|
|
if isNewWidget and widgetFrame.OnAcquired then
|
|
widgetFrame:OnAcquired(widgetInfo);
|
|
end
|
|
end
|
|
end
|
|
|
|
MainFrame:RegisterEvent("VIGNETTES_UPDATED");
|
|
|
|
function MainFrame:OnEvent(event, ...)
|
|
if event == "UPDATE_UI_WIDGET" then
|
|
local widgetInfo = ...
|
|
if API.DreamseedUtil:IsValuableWidget(widgetInfo.widgetID) then
|
|
self:UpdateVignettes();
|
|
end
|
|
local isNew = self:AddWidgetInfo(widgetInfo);
|
|
if isNew then
|
|
YeetWidgetInfo(widgetInfo.widgetID, widgetInfo.widgetType);
|
|
end
|
|
elseif event == "VIGNETTES_UPDATED" then
|
|
self:UpdateVignettes();
|
|
|
|
elseif event == "UI_SCALE_CHANGED" or event == "DISPLAY_SIZE_CHANGED" then
|
|
UpdateMaxZoom();
|
|
end
|
|
end
|
|
|
|
MainFrame:SetScript("OnEvent", MainFrame.OnEvent);
|
|
|
|
--C_UIWidgetManager.GetStatusBarWidgetVisualizationInfo
|
|
|
|
MainFrame:Init()
|
|
MainFrame:Show();
|
|
MainFrame:SetAlpha(0)
|