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.
299 lines
12 KiB
299 lines
12 KiB
|
3 years ago
|
-- Custom POIs for quest objectives, this isnt needed on more recent wow versions
|
||
|
|
if GetQuestPOIs then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local LinePoolMixin, LinePool_Hide, LinePool_HideAndClearAnchors, CreateLinePool = LinePoolMixin, LinePool_Hide, LinePool_HideAndClearAnchors, CreateLinePool
|
||
|
|
if not LinePool then
|
||
|
|
LinePoolMixin = CreateFromMixins(ObjectPoolMixin);
|
||
|
|
|
||
|
|
local function LinePoolFactory(linePool)
|
||
|
|
return linePool.parent:CreateLine(nil, linePool.layer, linePool.lineTemplate, linePool.subLayer);
|
||
|
|
end
|
||
|
|
|
||
|
|
function LinePoolMixin:OnLoad(parent, layer, subLayer, lineTemplate, resetterFunc)
|
||
|
|
ObjectPoolMixin.OnLoad(self, LinePoolFactory, resetterFunc);
|
||
|
|
self.parent = parent;
|
||
|
|
self.layer = layer;
|
||
|
|
self.subLayer = subLayer;
|
||
|
|
self.lineTemplate = lineTemplate;
|
||
|
|
end
|
||
|
|
|
||
|
|
LinePool_Hide = FramePool_Hide;
|
||
|
|
LinePool_HideAndClearAnchors = FramePool_HideAndClearAnchors;
|
||
|
|
|
||
|
|
function CreateLinePool(parent, layer, subLayer, lineTemplate, resetterFunc)
|
||
|
|
local linePool = CreateFromMixins(LinePoolMixin);
|
||
|
|
linePool:OnLoad(parent, layer, subLayer, lineTemplate, resetterFunc or LinePool_HideAndClearAnchors);
|
||
|
|
return linePool;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
BtWQuestsQuestPOIDataProviderMixin = CreateFromMixins(MapCanvasDataProviderMixin);
|
||
|
|
function BtWQuestsQuestPOIDataProviderMixin:OnAdded(mapCanvas)
|
||
|
|
MapCanvasDataProviderMixin.OnAdded(self, mapCanvas);
|
||
|
|
mapCanvas:SetPinTemplateType("BtWQuestsQuestPOITemplate", "BUTTON");
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIDataProviderMixin:RemoveAllData()
|
||
|
|
self:GetMap():RemoveAllPinsByTemplate("BtWQuestsQuestPOITemplate");
|
||
|
|
end
|
||
|
|
local GetNumQuestWatches = C_QuestLog and C_QuestLog.GetNumQuestWatches or GetNumQuestWatches
|
||
|
|
local GetQuestIDForQuestWatchIndex = C_QuestLog and C_QuestLog.GetQuestIDForQuestWatchIndex or GetQuestWatchInfo
|
||
|
|
function BtWQuestsQuestPOIDataProviderMixin:RefreshAllData(fromOnShow)
|
||
|
|
self:RemoveAllData();
|
||
|
|
|
||
|
|
local uiMapID = self:GetMap():GetMapID()
|
||
|
|
if BtWQuests.Settings.showMapPOIs then
|
||
|
|
for i=1,GetNumQuestWatches() do
|
||
|
|
local questID = GetQuestIDForQuestWatchIndex(i)
|
||
|
|
local data = BtWQuests.Database:GetQuestByID(questID)
|
||
|
|
if data and data.objectives then
|
||
|
|
local objectives = C_QuestLog.GetQuestObjectives(questID)
|
||
|
|
for index,objective in ipairs(objectives) do
|
||
|
|
local objectivesData = data.objectives[index]
|
||
|
|
if objectivesData then
|
||
|
|
if objectivesData.mapID then
|
||
|
|
objectivesData = {objectivesData}
|
||
|
|
end
|
||
|
|
for _, objectiveData in ipairs(objectivesData) do
|
||
|
|
if not objective.finished and objectiveData.mapID == uiMapID then
|
||
|
|
if objectiveData.type == "coords" then
|
||
|
|
local points = {-0.01, 0, 0, -0.01, 0.01, 0, 0, 0.01}
|
||
|
|
local pin = self:GetMap():AcquirePin("BtWQuestsQuestPOITemplate", questID, index, "area", points);
|
||
|
|
pin:SetPosition(objectiveData.x, objectiveData.y);
|
||
|
|
pin:Show();
|
||
|
|
else
|
||
|
|
local source = objectiveData.points
|
||
|
|
if #source ~= 1 then
|
||
|
|
local points = {}
|
||
|
|
local rect = {nil, nil, nil, nil}
|
||
|
|
for _,point in ipairs(source) do
|
||
|
|
rect[1] = math.min(rect[1] or point[1], point[1])
|
||
|
|
rect[2] = math.max(rect[2] or point[1], point[1])
|
||
|
|
rect[3] = math.min(rect[3] or point[2], point[2])
|
||
|
|
rect[4] = math.max(rect[4] or point[2], point[2])
|
||
|
|
end
|
||
|
|
|
||
|
|
local x, y = (rect[2] - rect[1]) * 0.5 + rect[1], (rect[4] - rect[3]) * 0.5 + rect[3]
|
||
|
|
|
||
|
|
for _,point in ipairs(source) do
|
||
|
|
points[#points+1] = point[1] - x
|
||
|
|
points[#points+1] = point[2] - y
|
||
|
|
end
|
||
|
|
|
||
|
|
local pin = self:GetMap():AcquirePin("BtWQuestsQuestPOITemplate", questID, index, "area", points);
|
||
|
|
pin:SetPosition(x, y);
|
||
|
|
pin:Show();
|
||
|
|
else
|
||
|
|
local points = {-0.01, 0, 0, -0.01, 0.01, 0, 0, 0.01}
|
||
|
|
local pin = self:GetMap():AcquirePin("BtWQuestsQuestPOITemplate", questID, index, "area", points);
|
||
|
|
-- local pin = self:GetMap():AcquirePin("BtWQuestsQuestPOITemplate", questID, index, "coords");
|
||
|
|
pin:SetPosition(source[1][1], source[1][2]);
|
||
|
|
pin:Show();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if BtWQuests.Settings.showMapTurnIns then
|
||
|
|
for i=1,GetNumQuestLogEntries() do
|
||
|
|
local questID = select(8, GetQuestLogTitle(i))
|
||
|
|
if questID and questID ~= 0 and IsQuestComplete(questID) then
|
||
|
|
local data = BtWQuests.Database:GetQuestByID(questID)
|
||
|
|
if data and data.targets then
|
||
|
|
if data.targets.type == "coords" and data.targets.mapID == uiMapID then
|
||
|
|
local pin = self:GetMap():AcquirePin("BtWQuestsQuestPOITemplate", questID, -1, "coords");
|
||
|
|
pin:SetPosition(data.targets.x, data.targets.y);
|
||
|
|
pin:Show();
|
||
|
|
elseif data.targets.points and data.targets.mapID == uiMapID then
|
||
|
|
local pin = self:GetMap():AcquirePin("BtWQuestsQuestPOITemplate", questID, -1, "coords");
|
||
|
|
pin:SetPosition(data.targets.points[1][1], data.targets.points[1][2]);
|
||
|
|
pin:Show();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
BtWQuestsQuestPOIMixin = CreateFromMixins(MapCanvasPinMixin);
|
||
|
|
function BtWQuestsQuestPOIMixin:OnLoad()
|
||
|
|
self:UseFrameLevelType("PIN_FRAME_LEVEL_STORY_LINE");
|
||
|
|
self.linePool = CreateLinePool(self)
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:OnAcquired(questID, objectiveIndex, type, points)
|
||
|
|
self.questID = questID;
|
||
|
|
self.objectiveIndex = objectiveIndex
|
||
|
|
self.mapID = self:GetMap():GetMapID();
|
||
|
|
self.type = type
|
||
|
|
self.normalizedPoints = points
|
||
|
|
local adjustedPoints = {}
|
||
|
|
|
||
|
|
self.linePool:ReleaseAll()
|
||
|
|
if type == "coords" then
|
||
|
|
self:SetScalingLimits(1, 1.0, 1.2)
|
||
|
|
self.Circle:SetShown(objectiveIndex ~= -1)
|
||
|
|
self.Turnin:SetShown(objectiveIndex == -1)
|
||
|
|
if objectiveIndex == -1 and BtWQuests.Settings.smallMapPins then
|
||
|
|
self:SetSize(16, 16)
|
||
|
|
else
|
||
|
|
self:SetSize(22, 22)
|
||
|
|
end
|
||
|
|
elseif type == "area" then
|
||
|
|
self.Circle:SetShown(false)
|
||
|
|
self.Turnin:SetShown(false)
|
||
|
|
if #points <= 2 then
|
||
|
|
error("To few points")
|
||
|
|
else
|
||
|
|
self:SetScalingLimits(nil, nil, nil)
|
||
|
|
local w, h = self:GetMap():GetCanvas():GetWidth(), self:GetMap():GetCanvas():GetHeight()
|
||
|
|
|
||
|
|
for i=1,#points,2 do
|
||
|
|
local ax, ay = points[i ], points[i+1]
|
||
|
|
adjustedPoints[i], adjustedPoints[i+1] = ax * w, -ay * h
|
||
|
|
end
|
||
|
|
|
||
|
|
local rect = {nil, nil, nil, nil}
|
||
|
|
for i=1,#points-2,2 do
|
||
|
|
local ax, ay = points[i ], points[i+1]
|
||
|
|
local bx, by = points[i+2], points[i+3]
|
||
|
|
|
||
|
|
rect[1] = math.min(rect[1] or ax, ax, bx)
|
||
|
|
rect[2] = math.max(rect[2] or ax, ax, bx)
|
||
|
|
rect[3] = math.min(rect[3] or ay, ay, by)
|
||
|
|
rect[4] = math.max(rect[4] or ay, ay, by)
|
||
|
|
|
||
|
|
local line = self.linePool:Acquire()
|
||
|
|
line:SetThickness(3)
|
||
|
|
line:SetColorTexture(0.409,0.678,1,1)
|
||
|
|
line:SetStartPoint("CENTER", ax * w, -ay * h)
|
||
|
|
line:SetEndPoint ("CENTER", bx * w, -by * h)
|
||
|
|
line:Show()
|
||
|
|
end
|
||
|
|
|
||
|
|
local ax, ay = points[1], points[2]
|
||
|
|
local bx, by = points[#points-1], points[#points]
|
||
|
|
|
||
|
|
rect[1] = math.min(rect[1] or ax, ax, bx)
|
||
|
|
rect[2] = math.max(rect[2] or ax, ax, bx)
|
||
|
|
rect[3] = math.min(rect[3] or ay, ay, by)
|
||
|
|
rect[4] = math.max(rect[4] or ay, ay, by)
|
||
|
|
|
||
|
|
local line = self.linePool:Acquire()
|
||
|
|
line:SetThickness(3)
|
||
|
|
line:SetColorTexture(0.409,0.678,1,1)
|
||
|
|
line:SetStartPoint("CENTER", ax * w, -ay * h)
|
||
|
|
line:SetEndPoint ("CENTER", bx * w, -by * h)
|
||
|
|
line:Show()
|
||
|
|
|
||
|
|
self:SetSize((rect[2] - rect[1]) * w, (-rect[4] - -rect[3]) * h)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
self.adjustedPoints = adjustedPoints
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:GetQuestID()
|
||
|
|
return self.questID
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:GetObjectiveIndex()
|
||
|
|
return self.objectiveIndex, self.questID
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:IsMouseWithin()
|
||
|
|
if not MouseIsOver(self) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if self.type == "area" then
|
||
|
|
local inside = false;
|
||
|
|
|
||
|
|
local x, y = self:GetMap():GetCanvasContainer():GetNormalizedCursorPosition()
|
||
|
|
local centerX, centerY = self:GetPosition()
|
||
|
|
x = x - centerX
|
||
|
|
y = y - centerY
|
||
|
|
|
||
|
|
local points = self.normalizedPoints
|
||
|
|
local length = #points * 0.5
|
||
|
|
local oldX, oldY = points[length * 2 - 1], points[length * 2]
|
||
|
|
|
||
|
|
for i=1,length do
|
||
|
|
local newX, newY = points[(i-1) * 2 + 1], points[(i-1) * 2 + 2]
|
||
|
|
|
||
|
|
local leftX, leftY;
|
||
|
|
local rightX, rightY;
|
||
|
|
if newX > oldX then
|
||
|
|
leftX, leftY = oldX, oldY;
|
||
|
|
rightX, rightY = newX, newY;
|
||
|
|
else
|
||
|
|
leftX, leftY = newX, newY;
|
||
|
|
rightX, rightY = oldX, oldY;
|
||
|
|
end
|
||
|
|
|
||
|
|
if leftX < x and x <= rightX and (y - leftY) * (rightX - leftX) < (rightY - leftY) * (x - leftX) then
|
||
|
|
inside = not inside;
|
||
|
|
end
|
||
|
|
|
||
|
|
oldX, oldY = newX, newY;
|
||
|
|
end
|
||
|
|
|
||
|
|
return inside;
|
||
|
|
else
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local byQuestID = {}
|
||
|
|
function BtWQuestsQuestPOIMixin:OnUpdate()
|
||
|
|
local x, y = GetCursorPosition()
|
||
|
|
if x == self.lastMouseX and y == self.lastMouseY then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
self.lastMouseX, self.lastMouseY = x, y
|
||
|
|
|
||
|
|
wipe(byQuestID)
|
||
|
|
for pin in self:GetMap():EnumeratePinsByTemplate("BtWQuestsQuestPOITemplate") do
|
||
|
|
if pin:IsMouseWithin() then
|
||
|
|
local objective, questID = pin:GetObjectiveIndex()
|
||
|
|
if objective ~= -1 then
|
||
|
|
byQuestID[questID] = byQuestID[questID] or {}
|
||
|
|
byQuestID[questID][#byQuestID[questID]+1] = objective
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local tooltip = WorldMapTooltip or GameTooltip
|
||
|
|
tooltip:SetOwner(self, "ANCHOR_CURSOR_RIGHT");
|
||
|
|
for questID, visibleObjectives in pairs(byQuestID) do
|
||
|
|
local objectives = C_QuestLog.GetQuestObjectives(questID)
|
||
|
|
table.sort(visibleObjectives)
|
||
|
|
|
||
|
|
tooltip:AddLine(QuestUtils_GetQuestName(questID));
|
||
|
|
for _,objective in ipairs(visibleObjectives) do
|
||
|
|
tooltip:AddLine('- ' .. objectives[objective].text, 1, 1, 1, true);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
tooltip:Show();
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:OnMouseEnter()
|
||
|
|
if self.objectiveIndex == -1 then
|
||
|
|
local tooltip = WorldMapTooltip or GameTooltip
|
||
|
|
tooltip:SetOwner(self, "ANCHOR_CURSOR_RIGHT");
|
||
|
|
tooltip:SetText(QuestUtils_GetQuestName(self.questID));
|
||
|
|
tooltip:Show();
|
||
|
|
else
|
||
|
|
self:SetScript("OnUpdate", self.OnUpdate)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:OnMouseLeave()
|
||
|
|
self:SetScript("OnUpdate", nil)
|
||
|
|
|
||
|
|
local tooltip = WorldMapTooltip or GameTooltip
|
||
|
|
tooltip:Hide();
|
||
|
|
end
|
||
|
|
function BtWQuestsQuestPOIMixin:OnClick(button)
|
||
|
|
if button == "RightButton" then
|
||
|
|
self:GetMap():GetOwner():NavigateToParentMap()
|
||
|
|
end
|
||
|
|
end
|