/Tukui/modules/maps/minimap.lua

http://github.com/Asphyxia/Tukui · Lua · 300 lines · 231 code · 37 blank · 32 comment · 46 complexity · 84c8f3775f4700ca54403b90d47a1545 MD5 · raw file

  1. local T, C, L = unpack(select(2, ...)) -- Import: T - functions, constants, variables; C - config; L - locales
  2. --------------------------------------------------------------------
  3. -- Tukui Minimap Script
  4. --------------------------------------------------------------------
  5. local TukuiMinimap = CreateFrame("Frame", "TukuiMinimap", UIParent)
  6. TukuiMinimap:CreatePanel("Default", 1, 1, "CENTER", UIParent, "CENTER", 0, 0)
  7. TukuiMinimap:CreateShadow("Default")
  8. TukuiMinimap:RegisterEvent("ADDON_LOADED")
  9. TukuiMinimap:RegisterEvent("CALENDAR_UPDATE_PENDING_INVITES")
  10. TukuiMinimap:RegisterEvent("UPDATE_PENDING_MAIL")
  11. TukuiMinimap:RegisterEvent("PLAYER_ENTERING_WORLD")
  12. TukuiMinimap:Point("TOPRIGHT", UIParent, "TOPRIGHT", -34, -8)
  13. TukuiMinimap:Size(153)
  14. TukuiMinimap:SetClampedToScreen(true)
  15. TukuiMinimap:SetMovable(true)
  16. TukuiMinimap.text = T.SetFontString(TukuiMinimap, C.media.pixelfont, C["datatext"].fontsize, "MONOCHROMEOUTLINE")
  17. TukuiMinimap.text:SetPoint("CENTER")
  18. TukuiMinimap.text:SetText(L.move_minimap)
  19. -- kill the minimap cluster
  20. MinimapCluster:Kill()
  21. -- Parent Minimap into our Map frame.
  22. Minimap:SetParent(TukuiMinimap)
  23. Minimap:ClearAllPoints()
  24. Minimap:Size(153)
  25. Minimap:Point("TOPLEFT", 2, -2)
  26. Minimap:Point("BOTTOMRIGHT", -2, 2)
  27. -- Hide Border
  28. MinimapBorder:Hide()
  29. MinimapBorderTop:Hide()
  30. -- Hide Zoom Buttons
  31. MinimapZoomIn:Hide()
  32. MinimapZoomOut:Hide()
  33. -- Hide Voice Chat Frame
  34. MiniMapVoiceChatFrame:Hide()
  35. -- Hide North texture at top
  36. MinimapNorthTag:SetTexture(nil)
  37. -- Hide Zone Frame
  38. MinimapZoneTextButton:Hide()
  39. -- Hide Tracking Button
  40. MiniMapTracking:Hide()
  41. -- Hide Calendar Button
  42. GameTimeFrame:Hide()
  43. -- Hide Mail Button
  44. MiniMapMailFrame:ClearAllPoints()
  45. MiniMapMailFrame:Point("TOPRIGHT", Minimap, 3, 3)
  46. MiniMapMailBorder:Hide()
  47. MiniMapMailIcon:SetTexture("Interface\\AddOns\\Tukui\\medias\\textures\\mail")
  48. -- Move battleground icon
  49. MiniMapBattlefieldFrame:ClearAllPoints()
  50. MiniMapBattlefieldFrame:Point("BOTTOMRIGHT", Minimap, 3, -3)
  51. MiniMapBattlefieldBorder:Hide()
  52. -- Ticket Frame
  53. local TukuiTicket = CreateFrame("Frame", "TukuiTicket", TukuiMinimap)
  54. TukuiTicket:CreatePanel("Default", 1, 1, "CENTER", TukuiMinimap, "CENTER", 0, 0)
  55. TukuiTicket:Size(TukuiMinimap:GetWidth() - 4, 24)
  56. TukuiTicket:SetFrameStrata("MEDIUM")
  57. TukuiTicket:SetFrameLevel(20)
  58. TukuiTicket:Point("TOP", 0, -2)
  59. TukuiTicket:FontString("Text", C.media.pixelfont, C["datatext"].fontsize, "MONOCHROMEOUTLINE")
  60. TukuiTicket.Text:SetPoint("CENTER")
  61. TukuiTicket.Text:SetText(T.datacolor.."Edit My Ticket")
  62. TukuiTicket:SetBackdropBorderColor(255/255, 243/255, 82/255)
  63. TukuiTicket.Text:SetTextColor(255/255, 243/255, 82/255)
  64. TukuiTicket:SetAlpha(0)
  65. HelpOpenTicketButton:SetParent(TukuiTicket)
  66. HelpOpenTicketButton:SetFrameLevel(TukuiTicket:GetFrameLevel() + 1)
  67. HelpOpenTicketButton:SetFrameStrata(TukuiTicket:GetFrameStrata())
  68. HelpOpenTicketButton:ClearAllPoints()
  69. HelpOpenTicketButton:SetAllPoints()
  70. HelpOpenTicketButton:SetHighlightTexture(nil)
  71. HelpOpenTicketButton:SetAlpha(0)
  72. HelpOpenTicketButton:HookScript("OnShow", function(self) TukuiTicket:SetAlpha(1) end)
  73. HelpOpenTicketButton:HookScript("OnHide", function(self) TukuiTicket:SetAlpha(0) end)
  74. -- Hide world map button
  75. MiniMapWorldMapButton:Hide()
  76. -- shitty 3.3 flag to move
  77. MiniMapInstanceDifficulty:ClearAllPoints()
  78. MiniMapInstanceDifficulty:SetParent(Minimap)
  79. MiniMapInstanceDifficulty:SetPoint("TOPLEFT", Minimap, "TOPLEFT", 0, 8)
  80. -- 4.0.6 Guild instance difficulty
  81. GuildInstanceDifficulty:ClearAllPoints()
  82. GuildInstanceDifficulty:SetParent(Minimap)
  83. GuildInstanceDifficulty:SetPoint("TOPLEFT", Minimap, "TOPLEFT", 0, 8)
  84. -- Reposition lfg icon at bottom-left
  85. local function UpdateLFG()
  86. MiniMapLFGFrame:ClearAllPoints()
  87. MiniMapLFGFrame:Point("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 2, -3)
  88. MiniMapLFGFrameBorder:Hide()
  89. end
  90. hooksecurefunc("MiniMapLFG_UpdateIsShown", UpdateLFG)
  91. -- reskin LFG dropdown
  92. LFDSearchStatus:SetTemplate("Default")
  93. -- for t13+, if we move map we need to point LFDSearchStatus according to our Minimap position.
  94. local function UpdateLFGTooltip()
  95. local position = TukuiMinimap:GetPoint()
  96. LFDSearchStatus:ClearAllPoints()
  97. if position:match("BOTTOMRIGHT") then
  98. LFDSearchStatus:SetPoint("BOTTOMRIGHT", MiniMapLFGFrame, "BOTTOMLEFT", 0, 0)
  99. elseif position:match("BOTTOM") then
  100. LFDSearchStatus:SetPoint("BOTTOMLEFT", MiniMapLFGFrame, "BOTTOMRIGHT", 4, 0)
  101. elseif position:match("LEFT") then
  102. LFDSearchStatus:SetPoint("TOPLEFT", MiniMapLFGFrame, "TOPRIGHT", 4, 0)
  103. else
  104. LFDSearchStatus:SetPoint("TOPRIGHT", MiniMapLFGFrame, "TOPLEFT", 0, 0)
  105. end
  106. end
  107. LFDSearchStatus:HookScript("OnShow", UpdateLFGTooltip)
  108. -- Enable mouse scrolling
  109. Minimap:EnableMouseWheel(true)
  110. Minimap:SetScript("OnMouseWheel", function(self, d)
  111. if d > 0 then
  112. _G.MinimapZoomIn:Click()
  113. elseif d < 0 then
  114. _G.MinimapZoomOut:Click()
  115. end
  116. end)
  117. -- Set Square Map Mask
  118. Minimap:SetMaskTexture(C.media.blank)
  119. -- For others mods with a minimap button, set minimap buttons position in square mode.
  120. function GetMinimapShape() return "SQUARE" end
  121. -- do some stuff on addon loaded or player login event
  122. TukuiMinimap:SetScript("OnEvent", function(self, event, addon)
  123. if addon == "Blizzard_TimeManager" then
  124. -- Hide Game Time
  125. TimeManagerClockButton:Kill()
  126. else
  127. local inv = CalendarGetNumPendingInvites()
  128. local mail = HasNewMail()
  129. if inv > 0 and mail then -- New invites and mail
  130. TukuiMinimap:SetBackdropBorderColor(1, .5, 0)
  131. if TukuiMinimapStatsLeft then
  132. TukuiMinimapStatsLeft:SetBackdropBorderColor(1, .5, 0)
  133. end
  134. if TukuiMinimapStatsRight then
  135. TukuiMinimapStatsRight:SetBackdropBorderColor(1, .5, 0)
  136. end
  137. elseif inv > 0 and not mail then -- New invites and no mail
  138. TukuiMinimap:SetBackdropBorderColor(1, 30/255, 60/255)
  139. if TukuiMinimapStatsLeft then
  140. TukuiMinimapStatsLeft:SetBackdropBorderColor(1, 30/255, 60/255)
  141. end
  142. if TukuiMinimapStatsRight then
  143. TukuiMinimapStatsRight:SetBackdropBorderColor(1, 30/255, 60/255)
  144. end
  145. elseif inv==0 and mail then -- No invites and new mail
  146. TukuiMinimap:SetBackdropBorderColor(0, 1, 0)
  147. if TukuiMinimapStatsLeft then
  148. TukuiMinimapStatsLeft:SetBackdropBorderColor(0, 1, 0)
  149. end
  150. if TukuiMinimapStatsRight then
  151. TukuiMinimapStatsRight:SetBackdropBorderColor(0, 1, 0)
  152. end
  153. else -- None of the above
  154. TukuiMinimap:SetBackdropBorderColor(unpack(C.media.bordercolor))
  155. if TukuiMinimapStatsLeft then
  156. TukuiMinimapStatsLeft:SetBackdropBorderColor(unpack(C.media.bordercolor))
  157. end
  158. if TukuiMinimapStatsRight then
  159. TukuiMinimapStatsRight:SetBackdropBorderColor(unpack(C.media.bordercolor))
  160. end
  161. end
  162. end
  163. end)
  164. ----------------------------------------------------------------------------------------
  165. -- Map menus, right/middle click
  166. ----------------------------------------------------------------------------------------
  167. Minimap:SetScript("OnMouseUp", function(self, btn)
  168. local xoff = 0
  169. local position = TukuiMinimap:GetPoint()
  170. if btn == "RightButton" then
  171. if position:match("RIGHT") then xoff = T.Scale(-16) end
  172. ToggleDropDownMenu(1, nil, MiniMapTrackingDropDown, TukuiMinimap, xoff, T.Scale(-2))
  173. elseif btn == "MiddleButton" then
  174. if not TukuiMicroMenu then return end
  175. if position:match("RIGHT") then xoff = T.Scale(-14) end
  176. ToggleDropDownMenu(1, nil, TukuiMicroMenu, TukuiMinimap, xoff, T.Scale(-2))
  177. else
  178. Minimap_OnClick(self)
  179. end
  180. end)
  181. ----------------------------------------------------------------------------------------
  182. -- Mouseover map, displaying zone and coords
  183. ----------------------------------------------------------------------------------------
  184. local m_zone = CreateFrame("Frame",nil,TukuiMinimap)
  185. m_zone:CreatePanel("Transparent", 0, 20, "TOPLEFT", TukuiMinimap, "TOPLEFT", 2,-2)
  186. m_zone:SetFrameLevel(5)
  187. m_zone:SetFrameStrata("LOW")
  188. m_zone:Point("TOPRIGHT",TukuiMinimap,-2,-2)
  189. m_zone:SetAlpha(0)
  190. local m_zone_text = m_zone:CreateFontString(nil,"Overlay")
  191. m_zone_text:SetFont(C.media.pixelfont, C["datatext"].fontsize, "MONOCHROMEOUTLINE")
  192. m_zone_text:Point("TOP", 0, -1)
  193. m_zone_text:SetPoint("BOTTOM")
  194. m_zone_text:Height(12)
  195. m_zone_text:Width(m_zone:GetWidth()-6)
  196. m_zone_text:SetAlpha(0)
  197. local m_coord = CreateFrame("Frame",nil,TukuiMinimap)
  198. m_coord:CreatePanel("Transparent", 40, 20, "BOTTOMLEFT", TukuiMinimap, "BOTTOMLEFT", 2,2)
  199. m_coord:SetFrameStrata("LOW")
  200. m_coord:SetAlpha(0)
  201. local m_coord_text = m_coord:CreateFontString(nil,"Overlay")
  202. m_coord_text:SetFont(C.media.pixelfont, C["datatext"].fontsize, "MONOCHROMEOUTLINE")
  203. m_coord_text:Point("Center",-1,0)
  204. m_coord_text:SetAlpha(0)
  205. m_coord_text:SetText("00,00")
  206. Minimap:SetScript("OnEnter",function()
  207. m_zone:SetAlpha(1)
  208. m_zone_text:SetAlpha(1)
  209. m_coord:SetAlpha(1)
  210. m_coord_text:SetAlpha(1)
  211. end)
  212. Minimap:SetScript("OnLeave",function()
  213. m_zone:SetAlpha(0)
  214. m_zone_text:SetAlpha(0)
  215. m_coord:SetAlpha(0)
  216. m_coord_text:SetAlpha(0)
  217. end)
  218. local ela = 0
  219. local coord_Update = function(self,t)
  220. ela = ela - t
  221. if ela > 0 then return end
  222. local x,y = GetPlayerMapPosition("player")
  223. local xt,yt
  224. x = math.floor(100 * x)
  225. y = math.floor(100 * y)
  226. if x == 0 and y == 0 then
  227. m_coord_text:SetText("X _ X")
  228. else
  229. if x < 10 then
  230. xt = "0"..x
  231. else
  232. xt = x
  233. end
  234. if y < 10 then
  235. yt = "0"..y
  236. else
  237. yt = y
  238. end
  239. m_coord_text:SetText(xt..","..yt)
  240. end
  241. ela = .2
  242. end
  243. m_coord:SetScript("OnUpdate",coord_Update)
  244. local zone_Update = function()
  245. local pvp = GetZonePVPInfo()
  246. m_zone_text:SetText(GetMinimapZoneText())
  247. if pvp == "friendly" then
  248. m_zone_text:SetTextColor(0.1, 1.0, 0.1)
  249. elseif pvp == "sanctuary" then
  250. m_zone_text:SetTextColor(0.41, 0.8, 0.94)
  251. elseif pvp == "arena" or pvp == "hostile" then
  252. m_zone_text:SetTextColor(1.0, 0.1, 0.1)
  253. elseif pvp == "contested" then
  254. m_zone_text:SetTextColor(1.0, 0.7, 0.0)
  255. else
  256. m_zone_text:SetTextColor(1.0, 1.0, 1.0)
  257. end
  258. end
  259. m_zone:RegisterEvent("PLAYER_ENTERING_WORLD")
  260. m_zone:RegisterEvent("ZONE_CHANGED_NEW_AREA")
  261. m_zone:RegisterEvent("ZONE_CHANGED")
  262. m_zone:RegisterEvent("ZONE_CHANGED_INDOORS")
  263. m_zone:SetScript("OnEvent",zone_Update)