You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
5.4 KiB

local Guide = {Waypoints = {}, Focus = nil, UserWaypoint = nil}
BtWQuests.Guide = Guide;
function Guide:AddWayPoint(mapId, x, y, name)
if not self.DataProvider then
self.DataProvider = CreateFromMixins(BtWQuestsGuideDataProviderMixin)
LibMapPinHandler[WorldMapFrame]:AddDataProvider(self.DataProvider);
end
local continentMapId = mapId
local mapInfo = C_Map.GetMapInfo(continentMapId)
while mapInfo and mapInfo.mapType > Enum.UIMapType.Continent do
continentMapId = mapInfo.parentMapID
mapInfo = C_Map.GetMapInfo(continentMapId)
end
if not continentMapId or not mapInfo then
return
end
local continentId, position = C_Map.GetWorldPosFromMapPos(mapId, {
x = x,
y = y,
})
if not continentId or not position then
return
end
local _, mapPosition = C_Map.GetMapPosFromWorldPos(continentId, position, continentMapId)
if not mapPosition then
continentMapId = mapId
mapPosition = select(2, C_Map.GetMapPosFromWorldPos(continentId, position, continentMapId))
end
if not mapPosition then
return
end
local waypoints = self.Waypoints[continentMapId]
if not waypoints then
waypoints = {}
self.Waypoints[continentMapId] = waypoints
end
mapPosition.mapId = continentMapId
mapPosition.itemName = name
waypoints[mapPosition] = true
self:SetFocus(mapPosition)
end
function Guide:SetFocus(item)
assert(item and item.mapId and self.Waypoints[item.mapId])
self.Focus = item
if C_Map and C_Map.SetUserWaypoint then
local waypoint = UiMapPoint.CreateFromVector2D(item.mapId, item)
self.UserWaypoint = waypoint
C_Map.SetUserWaypoint(waypoint)
C_SuperTrack.SetSuperTrackedUserWaypoint(true)
end
if WorldMapFrame:IsShown() then
self.DataProvider:RefreshAllData()
end
end
-- /run BtWQuests_QuestDataProvider = CreateFromMixins(BtWQuests_QuestDataProviderMixin);WorldMapFrame:AddDataProvider(BtWQuests_QuestDataProvider);
BtWQuestsGuideDataProviderMixin = CreateFromMixins(MapCanvasDataProviderMixin);
function BtWQuestsGuideDataProviderMixin:OnAdded(mapCanvas)
MapCanvasDataProviderMixin.OnAdded(self, mapCanvas);
mapCanvas:SetPinTemplateType("BtWQuestsGuidePinTemplate", "BUTTON");
end
function BtWQuestsGuideDataProviderMixin:RemoveAllData()
self:GetMap():RemoveAllPinsByTemplate("BtWQuestsGuidePinTemplate");
end
function BtWQuestsGuideDataProviderMixin:RefreshAllData(fromOnShow)
self:RemoveAllData();
local mapId = self:GetMap():GetMapID();
if not mapId then
return
end
local continentMapId = mapId
local mapInfo = C_Map.GetMapInfo(continentMapId)
while mapInfo and mapInfo.mapType > Enum.UIMapType.Continent do
continentMapId = mapInfo.parentMapID
mapInfo = C_Map.GetMapInfo(continentMapId)
end
local waypoints = Guide.Waypoints[continentMapId]
if not waypoints then
continentMapId = mapId
waypoints = Guide.Waypoints[continentMapId]
end
if not waypoints then
return
end
for item in pairs(waypoints) do
local position = item
if continentMapId ~= mapId then
local continentId, continentPosition = C_Map.GetWorldPosFromMapPos(continentMapId, item)
position = select(2, C_Map.GetMapPosFromWorldPos(continentId, continentPosition, mapId))
end
if position and position.x > 0 and position.x < 1 and position.y > 0 and position.y < 1 then
local pin = self:GetMap():AcquirePin("BtWQuestsGuidePinTemplate", item.itemName);
pin.waypoints = waypoints
pin.item = item
pin:SetPosition(position.x, position.y);
pin.Focus:SetShown(false);--item == Guide.Focus)
pin:Show();
end
end
end
BtWQuestsGuidePinMixin = CreateFromMixins(MapCanvasPinMixin);
function BtWQuestsGuidePinMixin:OnLoad()
self:SetScalingLimits(1, 1.0, 1.2);
self:UseFrameLevelType("PIN_FRAME_LEVEL_STORY_LINE");
end
function BtWQuestsGuidePinMixin:OnAcquired(itemName)
self.itemName = itemName;
self.mapID = self:GetMap():GetMapID();
end
function BtWQuestsGuidePinMixin:SetName(value)
self.name = value
end
function BtWQuestsGuidePinMixin:OnMouseEnter()
local tooltip = WorldMapTooltip or GameTooltip
tooltip:SetOwner(self, "ANCHOR_LEFT");
tooltip:SetText(self.itemName);
tooltip:Show();
end
function BtWQuestsGuidePinMixin:OnMouseLeave()
local tooltip = WorldMapTooltip or GameTooltip
tooltip:Hide();
end
function BtWQuestsGuidePinMixin:OnClick(button)
if button == "RightButton" or (button == "LeftButton" and IsControlKeyDown()) then
self.waypoints[self.item] = nil
self:GetMap():RemovePin(self);
elseif button == "LeftButton" then
Guide:SetFocus(self.item)
end
end
if C_Map and C_Map.SetUserWaypoint then
hooksecurefunc(C_Map, "SetUserWaypoint", function (waypoint)
if Guide.UserWaypoint ~= waypoint then
Guide.UserWaypoint = nil
end
end)
hooksecurefunc(C_Map, "ClearUserWaypoint", function ()
if Guide.UserWaypoint then
Guide.UserWaypoint = nil
Guide.Waypoints[Guide.Focus.mapId][Guide.Focus] = nil
Guide.DataProvider:RefreshAllData()
end
end)
end