fix: stabilize minimap range cutoff and update release docs
@@ -5,6 +5,7 @@
|
|||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
- **[Docs - Release Metadata Sync]** Updated the README badge, documentation version badges, and in-game addon version to `v1.6.3`, then tightened the release filters so handoff notes, local dev settings, and other workspace-only artifacts stay out of the exported release archive.
|
- **[Docs - Release Metadata Sync]** Updated the README badge, documentation version badges, and in-game addon version to `v1.6.3`, then tightened the release filters so handoff notes, local dev settings, and other workspace-only artifacts stay out of the exported release archive.
|
||||||
|
- **[Docs — Minimap Range Cutoff]** Documented the new minimap icon range cutoff slider and its real-time refresh behavior so the published release notes match the current UI and runtime behavior.
|
||||||
- **[Fix - Arrow Asset Regression]** Restored the default `Arrow1` asset from the original `XPArrow4.png` source, renamed the bundled image arrows to `Arrow1` through `Arrow4`, regenerated the bundled arrow manifest from the actual image data, and added a busted regression test so `arrowold` remains the only bundled sprite sheet.
|
- **[Fix - Arrow Asset Regression]** Restored the default `Arrow1` asset from the original `XPArrow4.png` source, renamed the bundled image arrows to `Arrow1` through `Arrow4`, regenerated the bundled arrow manifest from the actual image data, and added a busted regression test so `arrowold` remains the only bundled sprite sheet.
|
||||||
- **[Fix - Arrow UI / Attachment Redesign]** Reworked the Arrow tab so the arrow and objective text can be detached, reattached, locked independently, and reset independently. Added an attached-gap slider, objective transparency slider, distance-unit selector, larger font sizing, and drop-in preview support for the generated arrow swatches.
|
- **[Fix - Arrow UI / Attachment Redesign]** Reworked the Arrow tab so the arrow and objective text can be detached, reattached, locked independently, and reset independently. Added an attached-gap slider, objective transparency slider, distance-unit selector, larger font sizing, and drop-in preview support for the generated arrow swatches.
|
||||||
- **[Fix - Arrow Asset Size Reduction]** Rewrote the bundled image arrows to their visible bounds and saved them with TGA RLE compression, which keeps the same in-game appearance while reducing the arrow asset footprint dramatically.
|
- **[Fix - Arrow Asset Size Reduction]** Rewrote the bundled image arrows to their visible bounds and saved them with TGA RLE compression, which keeps the same in-game appearance while reducing the arrow asset footprint dramatically.
|
||||||
|
|||||||
@@ -468,6 +468,19 @@ local function drawMinimapPin(pin, data)
|
|||||||
-- data.floatOnEdge is replaced by (data.floatOnEdge and ((pin.texture and pin.texture.a and pin.texture.a ~= 0) or pin.texture == nil))
|
-- data.floatOnEdge is replaced by (data.floatOnEdge and ((pin.texture and pin.texture.a and pin.texture.a ~= 0) or pin.texture == nil))
|
||||||
-- icons will now only float on edge if they have an opacity which is not 0 or if no texture exist.
|
-- icons will now only float on edge if they have an opacity which is not 0 or if no texture exist.
|
||||||
data.distanceFromMinimapCenter = dist
|
data.distanceFromMinimapCenter = dist
|
||||||
|
local minimapVisibilityCutoff = pin.minimapVisibilityCutoff
|
||||||
|
or (Questie and Questie.db and Questie.db.profile and Questie.db.profile.minimapIconRangeCutoff)
|
||||||
|
if minimapVisibilityCutoff and lastXY and lastYY and data.x and data.y then
|
||||||
|
local xd, yd = lastXY - data.x, lastYY - data.y
|
||||||
|
local distance = (xd * xd + yd * yd)^0.5
|
||||||
|
if distance > minimapVisibilityCutoff then
|
||||||
|
pin:Hide()
|
||||||
|
data.onEdge = nil
|
||||||
|
data.keep = nil
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if dist <= 1 or (data.floatOnEdge and ((pin.texture and pin.texture.a and pin.texture.a ~= 0) or pin.texture == nil)) then
|
if dist <= 1 or (data.floatOnEdge and ((pin.texture and pin.texture.a and pin.texture.a ~= 0) or pin.texture == nil)) then
|
||||||
pin:Show()
|
pin:Show()
|
||||||
pin:ClearAllPoints()
|
pin:ClearAllPoints()
|
||||||
@@ -708,6 +721,24 @@ local function UpdateMinimapZoom()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function pins:RefreshMinimap()
|
||||||
|
queueFullUpdate = true
|
||||||
|
UpdateMinimapPins(true)
|
||||||
|
UpdateMinimapIconPosition()
|
||||||
|
end
|
||||||
|
|
||||||
|
function pins:SetMinimapVisibilityCutoff(cutoff)
|
||||||
|
for pin, data in pairs(minimapPins) do
|
||||||
|
pin.minimapVisibilityCutoff = cutoff
|
||||||
|
data.minimapVisibilityCutoff = cutoff
|
||||||
|
end
|
||||||
|
|
||||||
|
for pin, data in pairs(activeMinimapPins) do
|
||||||
|
pin.minimapVisibilityCutoff = cutoff
|
||||||
|
data.minimapVisibilityCutoff = cutoff
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------
|
||||||
-- WorldMap data provider
|
-- WorldMap data provider
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
@@ -254,9 +254,17 @@ end
|
|||||||
|
|
||||||
local function _GetArrowPreviewPath()
|
local function _GetArrowPreviewPath()
|
||||||
local style = _GetArrowStyle()
|
local style = _GetArrowStyle()
|
||||||
|
if not style then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if style.previewPath and (type(DoesFileExist) ~= "function" or DoesFileExist(style.previewPath)) then
|
||||||
return style.previewPath
|
return style.previewPath
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return style.texturePath
|
||||||
|
end
|
||||||
|
|
||||||
local function _IsArrowSpriteSheet()
|
local function _IsArrowSpriteSheet()
|
||||||
return (_GetArrowStyle().mode == "sheet")
|
return (_GetArrowStyle().mode == "sheet")
|
||||||
end
|
end
|
||||||
@@ -355,13 +363,9 @@ local function _UpdateObjectiveFramePosition()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if _IsObjectiveAttached() and arrowFrame then
|
if _IsObjectiveAttached() and arrowFrame then
|
||||||
local style = arrowFrame._arrowStyle or _GetArrowStyle()
|
|
||||||
local inset = (style and style.visualBottomInset) or 0
|
|
||||||
local scale = _GetArrowScale()
|
|
||||||
local visibleBottomOffset = math.floor(inset * scale + 0.5)
|
|
||||||
local gap = _GetObjectiveGap()
|
local gap = _GetObjectiveGap()
|
||||||
objectiveFrame:ClearAllPoints()
|
objectiveFrame:ClearAllPoints()
|
||||||
objectiveFrame:SetPoint("TOP", arrowFrame, "BOTTOM", 0, gap - visibleBottomOffset)
|
objectiveFrame:SetPoint("TOP", arrowFrame, "BOTTOM", 0, gap)
|
||||||
objectiveFrame._useDefaultPosition = false
|
objectiveFrame._useDefaultPosition = false
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -810,9 +814,12 @@ EnsureArrowFrame = function()
|
|||||||
local dist = HBD:GetWorldDistance(targetInstance, playerX, playerY, targetX, targetY)
|
local dist = HBD:GetWorldDistance(targetInstance, playerX, playerY, targetX, targetY)
|
||||||
if dist then
|
if dist then
|
||||||
local area = 1
|
local area = 1
|
||||||
local alpha = dist - area
|
local alpha = 1
|
||||||
|
if dist <= area then
|
||||||
|
alpha = dist / area
|
||||||
alpha = alpha > 1 and 1 or alpha
|
alpha = alpha > 1 and 1 or alpha
|
||||||
alpha = alpha < 0.5 and 0.5 or alpha
|
alpha = alpha < 0.5 and 0.5 or alpha
|
||||||
|
end
|
||||||
|
|
||||||
local texalpha = (1 - alpha) * 2
|
local texalpha = (1 - alpha) * 2
|
||||||
texalpha = texalpha > 1 and 1 or texalpha
|
texalpha = texalpha > 1 and 1 or texalpha
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ QuestieArrowAssets.styles = {
|
|||||||
displayWidth = 71,
|
displayWidth = 71,
|
||||||
displayHeight = 96,
|
displayHeight = 96,
|
||||||
visualBottomInset = 0,
|
visualBottomInset = 0,
|
||||||
textureCoordLeft = 0.187500,
|
textureCoordLeft = 0.195312,
|
||||||
textureCoordRight = 0.812500,
|
textureCoordRight = 0.808594,
|
||||||
textureCoordTop = 0.078125,
|
textureCoordTop = 0.093750,
|
||||||
textureCoordBottom = 0.917969,
|
textureCoordBottom = 0.917969,
|
||||||
},
|
},
|
||||||
["arrow2"] = {
|
["arrow2"] = {
|
||||||
@@ -28,7 +28,7 @@ QuestieArrowAssets.styles = {
|
|||||||
visualBottomInset = 0,
|
visualBottomInset = 0,
|
||||||
textureCoordLeft = 0.082031,
|
textureCoordLeft = 0.082031,
|
||||||
textureCoordRight = 0.917969,
|
textureCoordRight = 0.917969,
|
||||||
textureCoordTop = 0.097656,
|
textureCoordTop = 0.101562,
|
||||||
textureCoordBottom = 0.898438,
|
textureCoordBottom = 0.898438,
|
||||||
},
|
},
|
||||||
["arrow3"] = {
|
["arrow3"] = {
|
||||||
@@ -36,13 +36,13 @@ QuestieArrowAssets.styles = {
|
|||||||
texture = "Icons\\Arrows\\Arrow3.tga",
|
texture = "Icons\\Arrows\\Arrow3.tga",
|
||||||
preview = "Icons\\Arrows\\Arrow3_preview.tga",
|
preview = "Icons\\Arrows\\Arrow3_preview.tga",
|
||||||
mode = "image",
|
mode = "image",
|
||||||
displayWidth = 65,
|
displayWidth = 66,
|
||||||
displayHeight = 96,
|
displayHeight = 96,
|
||||||
visualBottomInset = 0,
|
visualBottomInset = 0,
|
||||||
textureCoordLeft = 0.214844,
|
textureCoordLeft = 0.218750,
|
||||||
textureCoordRight = 0.785156,
|
textureCoordRight = 0.781250,
|
||||||
textureCoordTop = 0.078125,
|
textureCoordTop = 0.093750,
|
||||||
textureCoordBottom = 0.914062,
|
textureCoordBottom = 0.917969,
|
||||||
},
|
},
|
||||||
["arrow4"] = {
|
["arrow4"] = {
|
||||||
label = "Arrow 4",
|
label = "Arrow 4",
|
||||||
@@ -52,21 +52,21 @@ QuestieArrowAssets.styles = {
|
|||||||
displayWidth = 68,
|
displayWidth = 68,
|
||||||
displayHeight = 96,
|
displayHeight = 96,
|
||||||
visualBottomInset = 0,
|
visualBottomInset = 0,
|
||||||
textureCoordLeft = 0.203125,
|
textureCoordLeft = 0.347656,
|
||||||
textureCoordRight = 0.796875,
|
textureCoordRight = 0.648438,
|
||||||
textureCoordTop = 0.078125,
|
textureCoordTop = 0.289062,
|
||||||
textureCoordBottom = 0.917969,
|
textureCoordBottom = 0.714844,
|
||||||
},
|
},
|
||||||
["hordearrow"] = {
|
["hordearrow"] = {
|
||||||
label = "Horde Arrow",
|
label = "Horde Arrow",
|
||||||
texture = "Icons\\Arrows\\HordeArrow.tga",
|
texture = "Icons\\Arrows\\HordeArrow.tga",
|
||||||
preview = "Icons\\Arrows\\HordeArrow_preview.tga",
|
preview = "Icons\\Arrows\\HordeArrow_preview.tga",
|
||||||
mode = "image",
|
mode = "image",
|
||||||
displayWidth = 84,
|
displayWidth = 120,
|
||||||
displayHeight = 96,
|
displayHeight = 96,
|
||||||
visualBottomInset = 0,
|
visualBottomInset = 0,
|
||||||
textureCoordLeft = 0.207031,
|
textureCoordLeft = 0.078125,
|
||||||
textureCoordRight = 0.789062,
|
textureCoordRight = 0.917969,
|
||||||
textureCoordTop = 0.078125,
|
textureCoordTop = 0.078125,
|
||||||
textureCoordBottom = 0.917969,
|
textureCoordBottom = 0.917969,
|
||||||
},
|
},
|
||||||
@@ -75,50 +75,11 @@ QuestieArrowAssets.styles = {
|
|||||||
texture = "Icons\\Arrows\\AllianceArrow.tga",
|
texture = "Icons\\Arrows\\AllianceArrow.tga",
|
||||||
preview = "Icons\\Arrows\\AllianceArrow_preview.tga",
|
preview = "Icons\\Arrows\\AllianceArrow_preview.tga",
|
||||||
mode = "image",
|
mode = "image",
|
||||||
displayWidth = 116,
|
displayWidth = 177,
|
||||||
displayHeight = 96,
|
displayHeight = 96,
|
||||||
visualBottomInset = 0,
|
visualBottomInset = 0,
|
||||||
textureCoordLeft = 0.222656,
|
textureCoordLeft = 0.078125,
|
||||||
textureCoordRight = 0.773438,
|
textureCoordRight = 0.917969,
|
||||||
textureCoordTop = 0.078125,
|
|
||||||
textureCoordBottom = 0.917969,
|
|
||||||
},
|
|
||||||
["minimal1"] = {
|
|
||||||
label = "Waypoint 1",
|
|
||||||
texture = "Icons\\Arrows\\Minimal1.tga",
|
|
||||||
preview = "Icons\\Arrows\\Minimal1_preview.tga",
|
|
||||||
mode = "image",
|
|
||||||
displayWidth = 68,
|
|
||||||
displayHeight = 96,
|
|
||||||
visualBottomInset = 0,
|
|
||||||
textureCoordLeft = 0.203125,
|
|
||||||
textureCoordRight = 0.796875,
|
|
||||||
textureCoordTop = 0.078125,
|
|
||||||
textureCoordBottom = 0.917969,
|
|
||||||
},
|
|
||||||
["minimal2"] = {
|
|
||||||
label = "Waypoint 2",
|
|
||||||
texture = "Icons\\Arrows\\Minimal2.tga",
|
|
||||||
preview = "Icons\\Arrows\\Minimal2_preview.tga",
|
|
||||||
mode = "image",
|
|
||||||
displayWidth = 74,
|
|
||||||
displayHeight = 96,
|
|
||||||
visualBottomInset = 0,
|
|
||||||
textureCoordLeft = 0.175781,
|
|
||||||
textureCoordRight = 0.820312,
|
|
||||||
textureCoordTop = 0.078125,
|
|
||||||
textureCoordBottom = 0.917969,
|
|
||||||
},
|
|
||||||
["minimal3"] = {
|
|
||||||
label = "Waypoint 3",
|
|
||||||
texture = "Icons\\Arrows\\Minimal3.tga",
|
|
||||||
preview = "Icons\\Arrows\\Minimal3_preview.tga",
|
|
||||||
mode = "image",
|
|
||||||
displayWidth = 83,
|
|
||||||
displayHeight = 96,
|
|
||||||
visualBottomInset = 0,
|
|
||||||
textureCoordLeft = 0.132812,
|
|
||||||
textureCoordRight = 0.863281,
|
|
||||||
textureCoordTop = 0.078125,
|
textureCoordTop = 0.078125,
|
||||||
textureCoordBottom = 0.917969,
|
textureCoordBottom = 0.917969,
|
||||||
},
|
},
|
||||||
@@ -144,9 +105,6 @@ QuestieArrowAssets.order = {
|
|||||||
"arrow4",
|
"arrow4",
|
||||||
"hordearrow",
|
"hordearrow",
|
||||||
"alliancearrow",
|
"alliancearrow",
|
||||||
"minimal1",
|
|
||||||
"minimal2",
|
|
||||||
"minimal3",
|
|
||||||
"arrowold",
|
"arrowold",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -256,6 +256,7 @@ function QuestieMap:ProcessShownMinimapIcons()
|
|||||||
while true do
|
while true do
|
||||||
count = 0
|
count = 0
|
||||||
playerX, playerY = getWorldPos()
|
playerX, playerY = getWorldPos()
|
||||||
|
|
||||||
xd = (playerX or 0) - (QuestieMap.playerX or 0)
|
xd = (playerX or 0) - (QuestieMap.playerX or 0)
|
||||||
yd = (playerY or 0) - (QuestieMap.playerY or 0)
|
yd = (playerY or 0) - (QuestieMap.playerY or 0)
|
||||||
totalDistance = totalDistance + (xd * xd + yd * yd)
|
totalDistance = totalDistance + (xd * xd + yd * yd)
|
||||||
@@ -296,6 +297,30 @@ function QuestieMap:ProcessShownMinimapIcons()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function QuestieMap:RefreshMinimapIconVisibility()
|
||||||
|
if not HBDPins or not HBDPins.activeMinimapPins then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local minimapVisibilityCutoff = Questie.db.profile.minimapIconRangeCutoff or 100
|
||||||
|
if HBDPins.SetMinimapVisibilityCutoff then
|
||||||
|
HBDPins:SetMinimapVisibilityCutoff(minimapVisibilityCutoff)
|
||||||
|
end
|
||||||
|
if HBDPins.RefreshMinimap then
|
||||||
|
HBDPins:RefreshMinimap()
|
||||||
|
end
|
||||||
|
|
||||||
|
for minimapFrame, data in pairs(HBDPins.activeMinimapPins) do
|
||||||
|
if minimapFrame and minimapFrame.miniMapIcon and minimapFrame.FadeLogic then
|
||||||
|
minimapFrame.minimapVisibilityCutoff = minimapVisibilityCutoff
|
||||||
|
minimapFrame:FadeLogic()
|
||||||
|
if minimapFrame.GlowUpdate then
|
||||||
|
minimapFrame:GlowUpdate()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function QuestieMap:QueueDraw(drawType, ...)
|
function QuestieMap:QueueDraw(drawType, ...)
|
||||||
if (not isDrawQueueDisabled) then
|
if (not isDrawQueueDisabled) then
|
||||||
if _G.QuestieDebugPins then
|
if _G.QuestieDebugPins then
|
||||||
@@ -570,6 +595,71 @@ function QuestieMap:DrawManualIcon(data, areaID, x, y, typ)
|
|||||||
iconMinimap.texture:SetTexture(texture)
|
iconMinimap.texture:SetTexture(texture)
|
||||||
iconMinimap.texture:SetVertexColor(colorsMinimap[1], colorsMinimap[2], colorsMinimap[3], 1);
|
iconMinimap.texture:SetVertexColor(colorsMinimap[1], colorsMinimap[2], colorsMinimap[3], 1);
|
||||||
iconMinimap.miniMapIcon = true;
|
iconMinimap.miniMapIcon = true;
|
||||||
|
iconMinimap.minimapVisibilityCutoff = Questie.db.profile.minimapIconRangeCutoff or 100
|
||||||
|
|
||||||
|
if (not iconMinimap.FadeLogic) then
|
||||||
|
function iconMinimap:SetFade(value)
|
||||||
|
if self.lastGlowFade ~= value then
|
||||||
|
self.lastGlowFade = value
|
||||||
|
if self.glowTexture then
|
||||||
|
local r, g, b = self.glowTexture:GetVertexColor()
|
||||||
|
self.glowTexture:SetVertexColor(r, g, b, value)
|
||||||
|
end
|
||||||
|
self.texture:SetVertexColor(colorsMinimap[1], colorsMinimap[2], colorsMinimap[3], value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function iconMinimap:FadeLogic()
|
||||||
|
local profile = Questie.db.profile
|
||||||
|
if self.miniMapIcon and self.x and self.y and self.texture and self.UiMapID and self.texture.SetVertexColor and HBD and HBD.GetPlayerZonePosition then
|
||||||
|
if (QuestieMap.playerX and QuestieMap.playerY) then
|
||||||
|
local x, y
|
||||||
|
if not self.worldX then
|
||||||
|
x, y = HBD:GetWorldCoordinatesFromZone(self.x / 100, self.y / 100, self.UiMapID)
|
||||||
|
self.worldX = x
|
||||||
|
self.worldY = y
|
||||||
|
else
|
||||||
|
x = self.worldX
|
||||||
|
y = self.worldY
|
||||||
|
end
|
||||||
|
if (x and y) then
|
||||||
|
local xd = QuestieMap.playerX - x
|
||||||
|
local yd = QuestieMap.playerY - y
|
||||||
|
local distance = math.sqrt(xd * xd + yd * yd)
|
||||||
|
local minimapVisibilityCutoff = self.minimapVisibilityCutoff or profile.minimapIconRangeCutoff or 100
|
||||||
|
|
||||||
|
if (distance > minimapVisibilityCutoff) then
|
||||||
|
self:FakeHide()
|
||||||
|
return
|
||||||
|
elseif self.hidden then
|
||||||
|
self:FakeShow()
|
||||||
|
elseif (distance > profile.fadeLevel) then
|
||||||
|
local fade = 1 - (math.min(10, (distance - profile.fadeLevel)) * normalizedValue)
|
||||||
|
self:SetFade(fade)
|
||||||
|
elseif (distance < profile.fadeOverPlayerDistance) and profile.fadeOverPlayer then
|
||||||
|
local fadeAmount = profile.fadeOverPlayerLevel + distance * (1 - profile.fadeOverPlayerLevel) / profile.fadeOverPlayerDistance
|
||||||
|
if self.faded and fadeAmount > profile.iconFadeLevel then
|
||||||
|
fadeAmount = profile.iconFadeLevel
|
||||||
|
end
|
||||||
|
self:SetFade(fadeAmount)
|
||||||
|
else
|
||||||
|
if self.faded then
|
||||||
|
self:SetFade(profile.iconFadeLevel)
|
||||||
|
else
|
||||||
|
self:SetFade(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if self.faded then
|
||||||
|
self:SetFade(profile.iconFadeLevel)
|
||||||
|
else
|
||||||
|
self:SetFade(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
QuestieMap:QueueDraw(QuestieMap.ICON_MINIMAP_TYPE, Questie, iconMinimap, iconMinimap.UiMapID, x / 100, y / 100, true, true);
|
QuestieMap:QueueDraw(QuestieMap.ICON_MINIMAP_TYPE, Questie, iconMinimap, iconMinimap.UiMapID, x / 100, y / 100, true, true);
|
||||||
tinsert(QuestieMap.manualFrames[typ][data.id], iconMinimap:GetName())
|
tinsert(QuestieMap.manualFrames[typ][data.id], iconMinimap:GetName())
|
||||||
@@ -650,6 +740,7 @@ function QuestieMap:DrawWorldIcon(data, areaID, x, y, showFlag)
|
|||||||
iconMinimap.AreaID = areaID
|
iconMinimap.AreaID = areaID
|
||||||
iconMinimap.UiMapID = uiMapId
|
iconMinimap.UiMapID = uiMapId
|
||||||
iconMinimap.miniMapIcon = true;
|
iconMinimap.miniMapIcon = true;
|
||||||
|
iconMinimap.minimapVisibilityCutoff = Questie.db.profile.minimapIconRangeCutoff or 100
|
||||||
iconMinimap:UpdateTexture(Questie.usedIcons[data.Icon]);
|
iconMinimap:UpdateTexture(Questie.usedIcons[data.Icon]);
|
||||||
|
|
||||||
if (not iconMinimap.FadeLogic) then
|
if (not iconMinimap.FadeLogic) then
|
||||||
@@ -680,9 +771,17 @@ function QuestieMap:DrawWorldIcon(data, areaID, x, y, showFlag)
|
|||||||
if (x and y) then
|
if (x and y) then
|
||||||
local xd = QuestieMap.playerX - x
|
local xd = QuestieMap.playerX - x
|
||||||
local yd = QuestieMap.playerY - y
|
local yd = QuestieMap.playerY - y
|
||||||
local distance = math.sqrt(xd * xd + yd * yd) / 10;
|
local distance = math.sqrt(xd * xd + yd * yd);
|
||||||
|
local minimapVisibilityCutoff = self.minimapVisibilityCutoff or profile.minimapIconRangeCutoff or 100;
|
||||||
|
|
||||||
if (distance > profile.fadeLevel) then
|
-- Hard stop: keep minimap pins from remaining visible beyond
|
||||||
|
-- the configured minimap range cutoff.
|
||||||
|
if (distance > minimapVisibilityCutoff) then
|
||||||
|
self:FakeHide()
|
||||||
|
return
|
||||||
|
elseif self.hidden then
|
||||||
|
self:FakeShow()
|
||||||
|
elseif (distance > profile.fadeLevel) then
|
||||||
local fade = 1 - (math.min(10, (distance - profile.fadeLevel)) * normalizedValue);
|
local fade = 1 - (math.min(10, (distance - profile.fadeLevel)) * normalizedValue);
|
||||||
self:SetFade(fade)
|
self:SetFade(fade)
|
||||||
elseif (distance < profile.fadeOverPlayerDistance) and profile.fadeOverPlayer then
|
elseif (distance < profile.fadeOverPlayerDistance) and profile.fadeOverPlayer then
|
||||||
|
|||||||
@@ -510,6 +510,21 @@ function QuestieOptions.tabs.icons:Initialize()
|
|||||||
QuestieFramePool:UpdateColorConfig(true, value)
|
QuestieFramePool:UpdateColorConfig(true, value)
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
minimapIconRangeCutoff = {
|
||||||
|
type = "range",
|
||||||
|
order = 4.35,
|
||||||
|
name = function() return l10n('Minimap Icon Range Cutoff'); end,
|
||||||
|
desc = function() return l10n('How far away minimap icons can remain visible.\n(Default: %s)', optionsDefaults.profile.minimapIconRangeCutoff); end,
|
||||||
|
width = 3.1,
|
||||||
|
min = 25,
|
||||||
|
max = 200,
|
||||||
|
step = 5,
|
||||||
|
disabled = function() return ((not Questie.db.profile.enabled) or (not Questie.db.profile.enableMiniMapIcons)); end,
|
||||||
|
get = function(info) return QuestieOptions:GetProfileValue(info); end,
|
||||||
|
set = function (info, value)
|
||||||
|
QuestieOptions:SetProfileValue(info, value)
|
||||||
|
end,
|
||||||
|
},
|
||||||
fadeLevel = {
|
fadeLevel = {
|
||||||
type = "range",
|
type = "range",
|
||||||
order = 4.4,
|
order = 4.4,
|
||||||
|
|||||||
@@ -102,10 +102,18 @@ end
|
|||||||
|
|
||||||
-- set option value
|
-- set option value
|
||||||
function QuestieOptions:SetProfileValue(info, value)
|
function QuestieOptions:SetProfileValue(info, value)
|
||||||
if debug and Questie.db.profile[info[#info]] ~= value then
|
local key = info[#info]
|
||||||
Questie:Debug(Questie.DEBUG_SPAM, "DEBUG: global option", info[#info], "changed from '" .. tostring(Questie.db.profile[info[#info]]) .. "' to '" .. tostring(value) .. "'")
|
if debug and Questie.db.profile[key] ~= value then
|
||||||
|
Questie:Debug(Questie.DEBUG_SPAM, "DEBUG: global option", key, "changed from '" .. tostring(Questie.db.profile[key]) .. "' to '" .. tostring(value) .. "'")
|
||||||
|
end
|
||||||
|
Questie.db.profile[key] = value
|
||||||
|
|
||||||
|
if key == "minimapIconRangeCutoff" then
|
||||||
|
local QuestieMap = QuestieLoader:ImportModule("QuestieMap")
|
||||||
|
if QuestieMap and QuestieMap.RefreshMinimapIconVisibility then
|
||||||
|
QuestieMap:RefreshMinimapIconVisibility()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
Questie.db.profile[info[#info]] = value
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function QuestieOptions:ClusterRedraw()
|
function QuestieOptions:ClusterRedraw()
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ function QuestieOptionsDefaults:Load()
|
|||||||
objectScale = 1,
|
objectScale = 1,
|
||||||
globalScale = 0.6,
|
globalScale = 0.6,
|
||||||
globalMiniMapScale = 0.7,
|
globalMiniMapScale = 0.7,
|
||||||
fadeLevel = 20,
|
minimapIconRangeCutoff = 100,
|
||||||
|
fadeLevel = 100,
|
||||||
fadeOverPlayer = true,
|
fadeOverPlayer = true,
|
||||||
fadeOverPlayerLevel = 0.5,
|
fadeOverPlayerLevel = 0.5,
|
||||||
fadeOverPlayerDistance = 5,
|
fadeOverPlayerDistance = 5,
|
||||||
|
|||||||
@@ -198,7 +198,6 @@ Bundled arrow assets are detected automatically as either sprite sheets or regul
|
|||||||
|
|
||||||
- `Arrow1` through `Arrow4` are the bundled image styles, while `arrowold` remains the only bundled sprite sheet.
|
- `Arrow1` through `Arrow4` are the bundled image styles, while `arrowold` remains the only bundled sprite sheet.
|
||||||
- `Horde Arrow` and `Alliance Arrow` add faction-themed styles with their insignia built into the art.
|
- `Horde Arrow` and `Alliance Arrow` add faction-themed styles with their insignia built into the art.
|
||||||
- `Waypoint 1` through `Waypoint 3` add a calmer, lower-profile look for players who want something closer to a plain game marker.
|
|
||||||
- The dropdown now uses generated preview swatches from `Icons/Arrows`, so each bundled style shows a live thumbnail instead of a text-only entry.
|
- The dropdown now uses generated preview swatches from `Icons/Arrows`, so each bundled style shows a live thumbnail instead of a text-only entry.
|
||||||
- Image arrows rotate as a single texture and keep their native art, while sprite sheets only use sheet-cell logic when the style is explicitly `arrowold` or a custom sheet is marked as such.
|
- Image arrows rotate as a single texture and keep their native art, while sprite sheets only use sheet-cell logic when the style is explicitly `arrowold` or a custom sheet is marked as such.
|
||||||
- The arrow and objective text can be detached or reattached independently, locked separately, and reset with one-click actions.
|
- The arrow and objective text can be detached or reattached independently, locked separately, and reset with one-click actions.
|
||||||
@@ -224,6 +223,7 @@ Bundled arrow assets are detected automatically as either sprite sheets or regul
|
|||||||
- Fixed `RequestMapUpdate` logic that caused completed quest icons to persist across zone transitions.
|
- Fixed `RequestMapUpdate` logic that caused completed quest icons to persist across zone transitions.
|
||||||
- Downgraded spurious `[CRITICAL] No AreaId found for UiMapId` log spam to debug level. On some servers, `C_Map.GetBestMapForUnit` returns a continent-level UiMapId for capital cities; the nil return was already handled gracefully but was incorrectly logged as critical.
|
- Downgraded spurious `[CRITICAL] No AreaId found for UiMapId` log spam to debug level. On some servers, `C_Map.GetBestMapForUnit` returns a continent-level UiMapId for capital cities; the nil return was already handled gracefully but was incorrectly logged as critical.
|
||||||
- Fixed map pins for `killCredit`-type objectives not resolving spawn locations correctly.
|
- Fixed map pins for `killCredit`-type objectives not resolving spawn locations correctly.
|
||||||
|
- Added a configurable minimap icon range cutoff so players can choose how far away quest icons remain visible before fading out.
|
||||||
|
|
||||||
### Tooltips
|
### Tooltips
|
||||||
|
|
||||||
|
|||||||
@@ -179,6 +179,7 @@
|
|||||||
<h2 id="v163">[v1.6.3] — Arrow Redesign, Minimap Pin Drift Fix (Live API + Corrected Pixel Math), Sunstrider Isle Arrow Distance, Map Pins, Tooltip Schema Fixes, QuestData String Safety</h2>
|
<h2 id="v163">[v1.6.3] — Arrow Redesign, Minimap Pin Drift Fix (Live API + Corrected Pixel Math), Sunstrider Isle Arrow Distance, Map Pins, Tooltip Schema Fixes, QuestData String Safety</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>[Docs — Release Metadata Sync]</strong> Updated the README badge, documentation version badges, and in-game addon version to <code>v1.6.3</code>, then tightened the release filters so handoff notes, local dev settings, and other workspace-only artifacts stay out of the exported release archive.</li>
|
<li><strong>[Docs — Release Metadata Sync]</strong> Updated the README badge, documentation version badges, and in-game addon version to <code>v1.6.3</code>, then tightened the release filters so handoff notes, local dev settings, and other workspace-only artifacts stay out of the exported release archive.</li>
|
||||||
|
<li><strong>[Docs — Minimap Range Cutoff]</strong> Documented the new minimap icon range cutoff slider and its real-time refresh behavior so the published notes match the current UI and runtime behavior.</li>
|
||||||
<li><strong>[Fix — Arrow Asset Regression & Redesign]</strong> Rebuilt the bundled arrow set so the live dropdown is backed by four image arrows (<code>Arrow1</code> through <code>Arrow4</code>) plus one legacy sheet arrow (<code>arrowold</code>). The old default <code>arrow.tga</code> cache path was retired in favor of the new image-specific asset names, and the generator now keeps sheet-mode detection isolated so only <code>arrowold</code> or an explicitly custom sheet can enter the sprite-sheet path.
|
<li><strong>[Fix — Arrow Asset Regression & Redesign]</strong> Rebuilt the bundled arrow set so the live dropdown is backed by four image arrows (<code>Arrow1</code> through <code>Arrow4</code>) plus one legacy sheet arrow (<code>arrowold</code>). The old default <code>arrow.tga</code> cache path was retired in favor of the new image-specific asset names, and the generator now keeps sheet-mode detection isolated so only <code>arrowold</code> or an explicitly custom sheet can enter the sprite-sheet path.
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Bundled asset layout</strong>: The new arrow images live under <code>Icons\\Arrows</code>, with matching generated preview TGAs so the dropdown can show a visible swatch for each style.</li>
|
<li><strong>Bundled asset layout</strong>: The new arrow images live under <code>Icons\\Arrows</code>, with matching generated preview TGAs so the dropdown can show a visible swatch for each style.</li>
|
||||||
|
|||||||