diff --git a/mods/minimap-clock.lua b/mods/minimap-clock.lua index 25f3123..08fad00 100644 --- a/mods/minimap-clock.lua +++ b/mods/minimap-clock.lua @@ -187,6 +187,13 @@ module.enable = function(self) MinimapClock:SetScript("OnEnter", function() local h, m = GetGameTime() local servertime = string.format("%.2d:%.2d", h, m) + local zonetime + local turtleClock = ShaguTweaks.GetTurtleClockTimes + + if turtleClock then + servertime, zonetime = turtleClock() + end + local time = date("%H:%M") GameTooltip:ClearLines() @@ -195,6 +202,9 @@ module.enable = function(self) GameTooltip:AddLine(T["Clock"]) GameTooltip:AddDoubleLine(T["Localtime"], time, 1,1,1,1,1,1) GameTooltip:AddDoubleLine(T["Servertime"], servertime, 1,1,1,1,1,1) + if zonetime then + GameTooltip:AddDoubleLine(T["Zonetime"], zonetime, 1,1,1,1,1,1) + end GameTooltip:Show() end) diff --git a/mods/social-colors.lua b/mods/social-colors.lua index 15f4213..b88626f 100644 --- a/mods/social-colors.lua +++ b/mods/social-colors.lua @@ -2,6 +2,7 @@ local _G = ShaguTweaks.GetGlobalEnv() local T = ShaguTweaks.T local L = ShaguTweaks.L local gfind = string.gmatch or string.gfind +local strfind = string.find local GetUnitData = ShaguTweaks.GetUnitData local GetPlayerCache = ShaguTweaks.GetPlayerCache local hooksecurefunc = ShaguTweaks.hooksecurefunc @@ -119,7 +120,7 @@ end local classHex = {} local function GetPlayerNameFromLink(payload) - local colon = string.find(payload, ":") + local colon = strfind(payload, ":") if colon then return string.sub(payload, 1, colon - 1) end @@ -128,6 +129,7 @@ end local function ColorPlayerLinks(text) if not text then return text end + if not strfind(text, "|Hplayer:", 1, true) then return text end for name in gfind(text, "|Hplayer:(.-)|h") do -- Player hyperlinks may contain Turtle metadata after the real name. Avoid @@ -384,4 +386,4 @@ module.enable = function(self) end end) end -end +end \ No newline at end of file diff --git a/mods/turtle-wow.lua b/mods/turtle-wow.lua index 216978e..b229755 100644 --- a/mods/turtle-wow.lua +++ b/mods/turtle-wow.lua @@ -15,63 +15,62 @@ local module = ShaguTweaks:register({ }) module.enable = function(self) - if ShaguTweaks_config[T["MiniMap Clock"]] == 1 then - MinimapClock:SetScript("OnEnter", function() - -- read game time - local zh, zm = GetGameTime() - local sh, sm = zh, zm + -- Minimap Clock owns its tooltip script. Expose only Turtle's time conversion + -- so the clock can consume it dynamically regardless of module enable order. + ShaguTweaks.GetTurtleClockTimes = function() + local zh, zm = GetGameTime() + local sh, sm = zh, zm - -- convert custom zonetime to servertime - SetMapToCurrentZone() - if GetCurrentMapContinent() == 1 then - sh = sh + 12 - sh = sh >= 24 and sh - 24 or sh + SetMapToCurrentZone() + if GetCurrentMapContinent() == 1 then + sh = sh + 12 + sh = sh >= 24 and sh - 24 or sh + end + + local servertime = string.format("%.2d:%.2d", sh, sm) + local zonetime = string.format("%.2d:%.2d", zh, zm) + return servertime, zonetime + end + + -- Turtle changes WorldMapFrame_Maximize. Keep our compatibility wrapper + -- completely out of the way when a dedicated map addon owns the world map. + if not Cartographer and not METAMAP_TITLE then + local HookWorldMapFrame_Maximize = WorldMapFrame_Maximize + WorldMapFrame_Maximize = function() + -- run original function + HookWorldMapFrame_Maximize() + + -- Re-apply only when WorldMap Window really initialized. + if ShaguTweaks.WorldMapWindowActive then + WorldMapFrame:SetMovable(true) + WorldMapFrame:EnableMouse(true) + + WorldMapFrame:SetScale(.85) + WorldMapFrame:ClearAllPoints() + WorldMapFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 30) + WorldMapFrame:SetWidth(WorldMapButton:GetWidth() + 15) + WorldMapFrame:SetHeight(WorldMapButton:GetHeight() + 55) + + -- overwrite wrong title position set by turtlewow + WorldMapFrameTitle:SetPoint("TOP", WorldMapFrame, 0, 17) + + BlackoutWorld:Hide() end + end - -- format time to strings - local zonetime = string.format("%.2d:%.2d", zh, zm) - local servertime = string.format("%.2d:%.2d", sh, sm) - local time = date("%H:%M") - - -- create the tooltip - GameTooltip:ClearLines() - GameTooltip:SetOwner(this, ANCHOR_BOTTOMLEFT) - - GameTooltip:AddLine(T["Clock"]) - GameTooltip:AddDoubleLine(T["Localtime"], time, 1,1,1,1,1,1) - GameTooltip:AddDoubleLine(T["Servertime"], servertime, 1,1,1,1,1,1) - GameTooltip:AddDoubleLine(T["Zonetime"], zonetime, 1,1,1,1,1,1) - GameTooltip:Show() + -- Trigger once after every module has handled PLAYER_ENTERING_WORLD. A + -- zero-delay ClassicAPI timer makes the result independent of event order. + local worldmapInit = CreateFrame("Frame") + worldmapInit:RegisterEvent("PLAYER_ENTERING_WORLD") + worldmapInit:SetScript("OnEvent", function() + this:UnregisterAllEvents() + this:Hide() + C_Timer.After(0, function() + WorldMapFrame_Maximize() + end) end) end - -- compatibility for turtle-wow's worldmap window - local HookWorldMapFrame_Maximize = WorldMapFrame_Maximize - WorldMapFrame_Maximize = function() - -- run original function - HookWorldMapFrame_Maximize() - - -- re-apply worldmap window - if ShaguTweaks_config[T["WorldMap Window"]] == 1 then - WorldMapFrame:SetMovable(true) - WorldMapFrame:EnableMouse(true) - - WorldMapFrame:SetScale(.85) - WorldMapFrame:ClearAllPoints() - WorldMapFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 30) - WorldMapFrame:SetWidth(WorldMapButton:GetWidth() + 15) - WorldMapFrame:SetHeight(WorldMapButton:GetHeight() + 55) - - -- overwrite wrong title position set by turtlewow - WorldMapFrameTitle:SetPoint("TOP", WorldMapFrame, 0, 17) - - BlackoutWorld:Hide() - end - end - - -- trigger once to avoid graphical glitches - WorldMapFrame_Maximize() - -- Vendor Values exposes a lazy ClassicAPI-backed SellValueDB compatibility -- table, so do not allocate a second Turtle-specific static price database. diff --git a/mods/worldmap-window.lua b/mods/worldmap-window.lua index 3c4f1dd..06ba61d 100644 --- a/mods/worldmap-window.lua +++ b/mods/worldmap-window.lua @@ -19,20 +19,9 @@ local function AddSpecialFrame(name) end module.enable = function(self) - AddSpecialFrame("WorldMapFrame") - - -- Window mode requires a direct Show/Hide toggle instead of the stock - -- full-screen panel toggle. Install it once when this module is enabled. - if not self.toggleInstalled then - self.toggleInstalled = true - function _G.ToggleWorldMap() - if WorldMapFrame:IsShown() then - WorldMapFrame:Hide() - else - WorldMapFrame:Show() - end - end - end + -- Only advertise the window as active after the delayed compatibility check. + -- Turtle WoW consumes this flag instead of looking at config alone. + ShaguTweaks.WorldMapWindowActive = nil -- Reuse one initialization frame so repeated enable() calls cannot stack -- PLAYER_ENTERING_WORLD handlers or duplicate WorldMapFrame hooks. @@ -43,13 +32,31 @@ module.enable = function(self) local delay = self.delay delay:RegisterEvent("PLAYER_ENTERING_WORLD") delay:SetScript("OnEvent", function() - -- Do not interfere with dedicated map addons. + -- Do not touch the stock world-map controls at all when a dedicated map + -- addon owns them. Run this before replacing ToggleWorldMap or adding hooks. if Cartographer or METAMAP_TITLE then + ShaguTweaks.WorldMapWindowActive = nil this:UnregisterAllEvents() this:Hide() return end + ShaguTweaks.WorldMapWindowActive = true + AddSpecialFrame("WorldMapFrame") + + -- Window mode requires a direct Show/Hide toggle instead of the stock + -- full-screen panel toggle. Install it only after the compatibility check. + if not self.toggleInstalled then + self.toggleInstalled = true + function _G.ToggleWorldMap() + if WorldMapFrame:IsShown() then + WorldMapFrame:Hide() + else + WorldMapFrame:Show() + end + end + end + UIPanelWindows["WorldMapFrame"] = { area = "center" } if not self.hooked then