273 lines
8.5 KiB
Lua
273 lines
8.5 KiB
Lua
local E, L, V, P, G = unpack(select(2, ...)) --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local M = E:GetModule("WorldMap")
|
|
|
|
--Lua functions
|
|
local find = string.find
|
|
--WoW API / Variables
|
|
local CreateFrame = CreateFrame
|
|
local GetCVarBool = GetCVarBool
|
|
local GetCursorPosition = GetCursorPosition
|
|
local GetPlayerMapPosition = GetPlayerMapPosition
|
|
local GetUnitSpeed = GetUnitSpeed
|
|
|
|
local MOUSE_LABEL = MOUSE_LABEL
|
|
local PLAYER = PLAYER
|
|
local WORLDMAP_SETTINGS = WORLDMAP_SETTINGS
|
|
|
|
local INVERTED_POINTS = {
|
|
["TOPLEFT"] = "BOTTOMLEFT",
|
|
["TOPRIGHT"] = "BOTTOMRIGHT",
|
|
["BOTTOMLEFT"] = "TOPLEFT",
|
|
["BOTTOMRIGHT"] = "TOPRIGHT",
|
|
["TOP"] = "BOTTOM",
|
|
["BOTTOM"] = "TOP"
|
|
}
|
|
|
|
local function BlobFrameHide()
|
|
M.blobWasVisible = nil
|
|
end
|
|
|
|
local function BlobFrameShow()
|
|
M.blobWasVisible = true
|
|
end
|
|
|
|
function M:PLAYER_REGEN_ENABLED()
|
|
WorldMapBlobFrame.SetFrameLevel = nil
|
|
WorldMapBlobFrame.SetScale = nil
|
|
WorldMapBlobFrame.Hide = nil
|
|
WorldMapBlobFrame.Show = nil
|
|
|
|
local frameLevel = WorldMapDetailFrame:GetFrameLevel() + 1
|
|
|
|
WorldMapBlobFrame:SetParent(WorldMapFrame)
|
|
WorldMapBlobFrame:ClearAllPoints()
|
|
WorldMapBlobFrame:SetPoint("TOPLEFT", WorldMapDetailFrame)
|
|
WorldMapBlobFrame:SetScale(self.blobNewScale or WORLDMAP_SETTINGS.size)
|
|
WorldMapBlobFrame:SetFrameLevel(frameLevel)
|
|
WorldMapBlobFrame:SetFrameLevel(frameLevel) -- called twice to set frame level above the default limit (256)
|
|
|
|
if self.blobWasVisible then
|
|
WorldMapBlobFrame:Show()
|
|
end
|
|
|
|
if WORLDMAP_SETTINGS.selectedQuest then
|
|
WorldMapBlobFrame:DrawQuestBlob(WORLDMAP_SETTINGS.selectedQuest.questId, false)
|
|
end
|
|
|
|
if self.blobWasVisible then
|
|
WorldMapBlobFrame_CalculateHitTranslations()
|
|
|
|
if WORLDMAP_SETTINGS.selectedQuest and not WORLDMAP_SETTINGS.selectedQuest.completed then
|
|
WorldMapBlobFrame:DrawQuestBlob(WORLDMAP_SETTINGS.selectedQuest.questId, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
function M:PLAYER_REGEN_DISABLED()
|
|
self.blobWasVisible = WorldMapFrame:IsShown() and WorldMapBlobFrame:IsShown()
|
|
|
|
WorldMapBlobFrame:SetParent(nil)
|
|
WorldMapBlobFrame:ClearAllPoints()
|
|
WorldMapBlobFrame:SetPoint("TOP", UIParent, "BOTTOM")
|
|
WorldMapBlobFrame:Hide()
|
|
WorldMapBlobFrame.Hide = BlobFrameHide
|
|
WorldMapBlobFrame.Show = BlobFrameShow
|
|
WorldMapBlobFrame.SetFrameLevel = E.noop
|
|
WorldMapBlobFrame.SetScale = E.noop
|
|
|
|
self.blobNewScale = nil
|
|
end
|
|
|
|
local t = 0
|
|
local function UpdateCoords(self, elapsed)
|
|
t = t + elapsed
|
|
if t < 0.03333 then return end
|
|
t = 0
|
|
|
|
local x, y = GetPlayerMapPosition("player")
|
|
|
|
if self.playerCoords.x ~= x or self.playerCoords.y ~= y then
|
|
if x ~= 0 or y ~= 0 then
|
|
self.playerCoords.x = x
|
|
self.playerCoords.y = y
|
|
self.playerCoords:SetFormattedText("%s: %.2f, %.2f", PLAYER, x * 100, y * 100)
|
|
else
|
|
self.playerCoords.x = nil
|
|
self.playerCoords.y = nil
|
|
self.playerCoords:SetFormattedText("%s: %s", PLAYER, "N/A")
|
|
end
|
|
end
|
|
|
|
if WorldMapDetailFrame:IsMouseOver() then
|
|
local curX, curY = GetCursorPosition()
|
|
|
|
if self.mouseCoords.x ~= curX or self.mouseCoords.y ~= curY then
|
|
local scale = WorldMapDetailFrame:GetEffectiveScale()
|
|
local width, height = WorldMapDetailFrame:GetSize()
|
|
local centerX, centerY = WorldMapDetailFrame:GetCenter()
|
|
local adjustedX = (curX / scale - (centerX - (width * 0.5))) / width
|
|
local adjustedY = (centerY + (height * 0.5) - curY / scale) / height
|
|
|
|
if adjustedX >= 0 and adjustedY >= 0 and adjustedX <= 1 and adjustedY <= 1 then
|
|
self.mouseCoords.x = curX
|
|
self.mouseCoords.y = curY
|
|
self.mouseCoords:SetFormattedText("%s: %.2f, %.2f", MOUSE_LABEL, adjustedX * 100, adjustedY * 100)
|
|
else
|
|
self.mouseCoords.x = nil
|
|
self.mouseCoords.y = nil
|
|
self.mouseCoords:SetText("")
|
|
end
|
|
end
|
|
elseif self.mouseCoords.x then
|
|
self.mouseCoords.x = nil
|
|
self.mouseCoords.y = nil
|
|
self.mouseCoords:SetText("")
|
|
end
|
|
end
|
|
|
|
function M:PositionCoords()
|
|
if not self.coordsHolder then return end
|
|
|
|
local db = E.global.general.WorldMapCoordinates
|
|
local position = db.position
|
|
|
|
local x = find(position, "RIGHT") and -5 or 5
|
|
local y = find(position, "TOP") and -5 or 5
|
|
|
|
self.coordsHolder.playerCoords:ClearAllPoints()
|
|
self.coordsHolder.playerCoords:Point(position, WorldMapDetailFrame, position, x + db.xOffset, y + db.yOffset)
|
|
|
|
self.coordsHolder.mouseCoords:ClearAllPoints()
|
|
self.coordsHolder.mouseCoords:Point(position, self.coordsHolder.playerCoords, INVERTED_POINTS[position], 0, y)
|
|
end
|
|
|
|
function M:ToggleMapFramerate()
|
|
if WORLDMAP_SETTINGS.size == WORLDMAP_FULLMAP_SIZE or WORLDMAP_SETTINGS.size == WORLDMAP_QUESTLIST_SIZE then
|
|
WorldMapFrame:SetAttribute("UIPanelLayout-area", "center")
|
|
WorldMapFrame:SetAttribute("UIPanelLayout-allowOtherPanels", true)
|
|
|
|
WorldMapFrame:SetScale(1)
|
|
end
|
|
end
|
|
|
|
function M:CheckMovement()
|
|
if not WorldMapFrame:IsShown() then return end
|
|
|
|
if GetUnitSpeed("player") ~= 0 and not WorldMapPositioningGuide:IsMouseOver() then
|
|
WorldMapFrame:SetAlpha(E.global.general.mapAlphaWhenMoving)
|
|
WorldMapBlobFrame:SetFillAlpha(128 * E.global.general.mapAlphaWhenMoving)
|
|
WorldMapBlobFrame:SetBorderAlpha(192 * E.global.general.mapAlphaWhenMoving)
|
|
else
|
|
WorldMapFrame:SetAlpha(1)
|
|
WorldMapBlobFrame:SetFillAlpha(128)
|
|
WorldMapBlobFrame:SetBorderAlpha(192)
|
|
end
|
|
end
|
|
|
|
function M:UpdateMapAlpha()
|
|
if (not E.global.general.fadeMapWhenMoving or E.global.general.mapAlphaWhenMoving >= 1) and self.MovingTimer then
|
|
self:CancelTimer(self.MovingTimer)
|
|
self.MovingTimer = nil
|
|
|
|
WorldMapFrame:SetAlpha(1)
|
|
WorldMapBlobFrame:SetFillAlpha(128)
|
|
WorldMapBlobFrame:SetBorderAlpha(192)
|
|
elseif E.global.general.fadeMapWhenMoving and E.global.general.mapAlphaWhenMoving < 1 and not self.MovingTimer then
|
|
self.MovingTimer = self:ScheduleRepeatingTimer("CheckMovement", 0.2)
|
|
end
|
|
end
|
|
|
|
function M:IsMapsterEnabled()
|
|
local Mapster = LibStub("AceAddon-3.0"):GetAddon("Mapster", true)
|
|
return Mapster ~= nil
|
|
end
|
|
|
|
function M:Initialize()
|
|
self:UpdateMapAlpha()
|
|
|
|
local mapsterEnabled = self:IsMapsterEnabled()
|
|
|
|
if not E.private.worldmap.enable then return end
|
|
|
|
if E.global.general.WorldMapCoordinates.enable then
|
|
local coordsHolder = CreateFrame("Frame", "ElvUI_CoordsHolder", WorldMapFrame)
|
|
coordsHolder:SetFrameLevel(WORLDMAP_POI_FRAMELEVEL + 100)
|
|
coordsHolder:SetFrameStrata(WorldMapDetailFrame:GetFrameStrata())
|
|
|
|
coordsHolder.playerCoords = coordsHolder:CreateFontString(nil, "OVERLAY")
|
|
coordsHolder.playerCoords:SetTextColor(1, 1, 0)
|
|
coordsHolder.playerCoords:SetFontObject(NumberFontNormal)
|
|
coordsHolder.playerCoords:SetPoint("BOTTOMLEFT", WorldMapDetailFrame, "BOTTOMLEFT", 5, 5)
|
|
coordsHolder.playerCoords:SetFormattedText("%s: 0, 0", PLAYER)
|
|
|
|
coordsHolder.mouseCoords = coordsHolder:CreateFontString(nil, "OVERLAY")
|
|
coordsHolder.mouseCoords:SetTextColor(1, 1, 0)
|
|
coordsHolder.mouseCoords:SetFontObject(NumberFontNormal)
|
|
coordsHolder.mouseCoords:SetPoint("BOTTOMLEFT", coordsHolder.playerCoords, "TOPLEFT", 0, 5)
|
|
|
|
coordsHolder:SetScript("OnUpdate", UpdateCoords)
|
|
|
|
self.coordsHolder = coordsHolder
|
|
self:PositionCoords()
|
|
end
|
|
|
|
if E.global.general.smallerWorldMap or (E.private.skins.blizzard.enable and E.private.skins.blizzard.worldmap) then
|
|
self:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
self:RegisterEvent("PLAYER_REGEN_DISABLED")
|
|
end
|
|
|
|
-- Only disable mouse interaction if Mapster is not enabled
|
|
-- Mapster needs mouse events for dragging the map
|
|
if not mapsterEnabled then
|
|
WorldMapFrame:EnableMouse(false)
|
|
WorldMapFrame.EnableMouse = E.noop
|
|
end
|
|
|
|
if E.global.general.smallerWorldMap then
|
|
-- Only modify these if Mapster is not handling positioning
|
|
if not mapsterEnabled then
|
|
BlackoutWorld:SetTexture(nil)
|
|
|
|
WorldMapFrame:SetParent(UIParent)
|
|
WorldMapFrame.SetParent = E.noop
|
|
|
|
WorldMapFrame:EnableKeyboard(false)
|
|
WorldMapFrame.EnableKeyboard = E.noop
|
|
end
|
|
|
|
if not GetCVarBool("miniWorldMap") then
|
|
ShowUIPanel(WorldMapFrame)
|
|
self:ToggleMapFramerate()
|
|
HideUIPanel(WorldMapFrame)
|
|
end
|
|
|
|
self:SecureHook("ToggleMapFramerate")
|
|
|
|
hooksecurefunc(WorldMapDetailFrame, "SetScale", function(_, scale)
|
|
self.blobNewScale = scale
|
|
end)
|
|
|
|
DropDownList1:HookScript("OnShow", function(self)
|
|
if self:GetScale() ~= UIParent:GetScale() then
|
|
self:SetScale(UIParent:GetScale())
|
|
end
|
|
end)
|
|
|
|
self:RawHook("WorldMapQuestPOI_OnLeave", function()
|
|
WorldMapPOIFrame.allowBlobTooltip = true
|
|
WorldMapTooltip:Hide()
|
|
end, true)
|
|
|
|
-- WorldMapTooltip:SetFrameLevel(WORLDMAP_POI_FRAMELEVEL + 110)
|
|
-- WorldMapCompareTooltip1:SetFrameLevel(WORLDMAP_POI_FRAMELEVEL + 110)
|
|
-- WorldMapCompareTooltip2:SetFrameLevel(WORLDMAP_POI_FRAMELEVEL + 110)
|
|
end
|
|
|
|
self.Initialized = true
|
|
end
|
|
|
|
local function InitializeCallback()
|
|
M:Initialize()
|
|
end
|
|
|
|
E:RegisterInitialModule(M:GetName(), InitializeCallback) |