191 lines
5.7 KiB
Lua
191 lines
5.7 KiB
Lua
local E, L, V, P, G = unpack(select(2, ...)) --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
-- local MM = {}
|
|
local MM = E:GetModule("MapMarkers")
|
|
local ElvUI_AllMarkers = {};
|
|
local ElvUI_ShowedMarkers = {};
|
|
local debug = false
|
|
-- local _print = print
|
|
local dprint = function(...)
|
|
if debug then print(...) end
|
|
end
|
|
|
|
local IgnoreList = {};
|
|
|
|
-- LibStub("AceComm-3.0"):Embed(MM);
|
|
-- LibStub("AceSerializer-3.0"):Embed(MM);
|
|
local coords = {0.499, 0.751, 0.276, 0.484};
|
|
-- local mapX,mapY = WorldMapButton:GetSize()
|
|
local prefix = "ElvUI_Marker";
|
|
local texturePath = "Interface\\AddOns\\ElvUI\\Media\\Textures\\RaidIcons";
|
|
|
|
|
|
local SYNC_INFO = "|Hplayer:%1$s|h[%1$s]|h Places a marker on the map " ..
|
|
": \n|Helvm:show:%2$s:%3$s:%4$s:nil|h|cff3588ff[Show Location]|r|h |Helvm:ignore:%1$s|h|cff3588ff[Ignore markers from: %1$s]|r|h"
|
|
|
|
function MM:SendMark(text, distribution)
|
|
MM:SendCommMessage(prefix, text, distribution or "RAID");
|
|
end
|
|
local pname = UnitName("player");
|
|
|
|
function MM:RecieveMark(text, distribution, target)
|
|
|
|
local success,mapid, x, y, who = MM:Deserialize(text);
|
|
mapid = tonumber(mapid)
|
|
if success and mapid and x and y and who ~= pname and not IgnoreList[who] then
|
|
MM:PrintMarkInfo(mapid, x, y, who);
|
|
end
|
|
end
|
|
function MM:PrintMarkInfo(mapid, x, y, who)
|
|
DEFAULT_CHAT_FRAME:AddMessage(string.format(SYNC_INFO,who,mapid,x,y), 0.41, 0.8, 0.94);
|
|
end
|
|
function MM:HideAll()
|
|
for i = 1, #ElvUI_ShowedMarkers do
|
|
ElvUI_ShowedMarkers[i]:Hide();
|
|
end
|
|
table.wipe(ElvUI_ShowedMarkers);
|
|
end
|
|
|
|
function MM:ShowMark(i,mapid)
|
|
local marker = ElvUI_AllMarkers[mapid][i];
|
|
|
|
if marker.showed then
|
|
marker:Show()
|
|
table.insert(ElvUI_ShowedMarkers, marker);
|
|
elseif not marker.showed then
|
|
marker:Hide()
|
|
end
|
|
|
|
end
|
|
|
|
function MM:CreateMark(mapid,IsSendedMark,x,y)
|
|
|
|
mapid = mapid or GetCurrentMapAreaID();
|
|
mapid = tonumber(mapid)
|
|
if not WorldMapFrame:IsShown() and IsSendedMark then
|
|
ToggleFrame(WorldMapFrame)
|
|
SetMapByID(mapid-1)
|
|
end
|
|
local curX, curY = GetCursorPosition();
|
|
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;
|
|
x = IsSendedMark and x or adjustedX * 100;
|
|
y = IsSendedMark and y or adjustedY * 100;
|
|
ElvUI_AllMarkers[mapid] = ElvUI_AllMarkers[mapid] or {};
|
|
|
|
local lastIndex = #ElvUI_AllMarkers[mapid];
|
|
ElvUI_AllMarkers[mapid][lastIndex+1] = CreateFrame("Frame", "Marker"..mapid..lastIndex+1, WorldMapDetailFrame);
|
|
local marker = ElvUI_AllMarkers[mapid][lastIndex+1];
|
|
marker.name = "Marker"..mapid..lastIndex;
|
|
marker.index = lastIndex+1;
|
|
marker.x = x;
|
|
marker.y = y;
|
|
marker.Texture = marker:CreateTexture();
|
|
marker.Texture:SetTexture(texturePath);
|
|
marker.Texture:SetAllPoints();
|
|
marker.Texture:SetTexCoord(unpack(coords))
|
|
marker:SetPoint("CENTER", WorldMapDetailFrame, "TOPLEFT", (x / 100) * WorldMapDetailFrame:GetWidth(), (-y / 100) * WorldMapDetailFrame:GetHeight());
|
|
marker:SetWidth(31);
|
|
marker:SetHeight(31);
|
|
marker:SetFrameStrata("DIALOG");
|
|
marker:EnableMouse(true);
|
|
marker:HookScript("OnEnter", function(self)
|
|
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
|
|
GameTooltip:SetText("SHIFT + Middle click to remove.", 1, 1, 1)
|
|
GameTooltip:Show()
|
|
end)
|
|
marker:SetScript("OnLeave", function()
|
|
GameTooltip:Hide()
|
|
end)
|
|
marker:SetScript("OnMouseDown",function(self,click)
|
|
if IsShiftKeyDown() and click == "MiddleButton" then
|
|
self:Hide();
|
|
self.showed = false;
|
|
MM:RefreshAll();
|
|
end
|
|
end)
|
|
marker.showed = true;
|
|
table.insert(ElvUI_ShowedMarkers, marker);
|
|
marker:Show();
|
|
if IsSendedMark then
|
|
local mname = GetMapName(mapid) or (mapid .." (mapid)")
|
|
print(format("Map marker added in %s at (%.1f, %.1f)", mname, x, y))
|
|
else
|
|
MM:SendMark(MM:Serialize(mapid, x, y, pname));
|
|
end
|
|
end
|
|
|
|
function MM:RefreshAll()
|
|
MM:HideAll();
|
|
local mapid = GetCurrentMapAreaID();
|
|
mapid = tonumber(mapid)
|
|
ElvUI_AllMarkers[mapid] = ElvUI_AllMarkers[mapid] or {};
|
|
local leng = #ElvUI_AllMarkers[mapid];
|
|
if leng and leng > 0 then
|
|
for i = 1, leng do
|
|
MM:ShowMark(i,mapid);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function createMark(self, link)
|
|
local _,_, mapid, x, y = strsplit(":", link);
|
|
mapid = tonumber(mapid)
|
|
MM:CreateMark(mapid,true,x,y);
|
|
end
|
|
local function AddToIgnore(self,link)
|
|
local _,_, name = strsplit(":", link);
|
|
-- MM:CreateMark(mapid,true,x,y)
|
|
IgnoreList[name] = true;
|
|
print(name.." was added to ignored markers list.");
|
|
end
|
|
function MM:Initialize()
|
|
if not E.db.general.mapMarkers.enable then return end
|
|
|
|
local _SetItemRef = SetItemRef
|
|
function SetItemRef(link, textref, button, chatFrame)
|
|
if link:match("elvm:show") then
|
|
createMark(chatFrame,link);
|
|
elseif link:match("elvm:ignore") then
|
|
AddToIgnore(chatFrame,link);
|
|
else
|
|
_SetItemRef(link, textref, button, chatFrame);
|
|
end
|
|
end
|
|
|
|
WorldMapButton:RegisterForClicks("LeftButtonDownm", "RightButtonDown","MiddleButtonDown");
|
|
WorldMapButton:HookScript("OnClick",function(self,click)
|
|
if click == "MiddleButton" and not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then
|
|
MM:CreateMark(nil,false);
|
|
end
|
|
end)
|
|
|
|
local function EventHandler(self, event, ...)
|
|
MM:RefreshAll();
|
|
end
|
|
MM.imFrame = CreateFrame("Frame",nil,UIParent);
|
|
|
|
MM.imFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
|
|
MM.imFrame:RegisterEvent("ZONE_CHANGED_NEW_AREA");
|
|
MM.imFrame:RegisterEvent("WORLD_MAP_UPDATE");
|
|
MM.imFrame:RegisterEvent("WORLD_MAP_NAME_UPDATE");
|
|
MM.imFrame:SetScript("OnEvent", EventHandler);
|
|
|
|
if E.db.general.mapMarkers.showRaidMarkers then
|
|
MM:RegisterComm(prefix, MM.RecieveMark);
|
|
end
|
|
|
|
end
|
|
|
|
|
|
local function InitializeCallback()
|
|
MM:Initialize()
|
|
end
|
|
|
|
E:RegisterInitialModule(MM:GetName(), InitializeCallback)
|
|
|
|
|
|
|