ed8bdf1118
* add missing Locale entries * add size option * link option to icon size * add icon size option to menu * shorten option name * update to match naming * map marker translations * map marker translations * map marker translations * map marker translations * map marker translations * map makers translations * map markers translations * map markers translations * remove spacer originally I added the space because the previous option was too long and had ... at the end of the name, but now that its shorter it looks odd on its own line
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(E.db.general.mapMarkers.iconSize);
|
|
marker:SetHeight(E.db.general.mapMarkers.iconSize);
|
|
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)
|
|
|
|
|
|
|