4.1 KiB
4.1 KiB
MapReveal Standalone
目标
把 Nanami-UI 里的地图迷雾揭示功能单独提纯出来,方便其他插件作者复用,而不依赖整套 SFrames / Nanami-UI 框架。
当前实现包含什么
原始实现位于 MapReveal.lua,核心能力有 4 部分:
- 基于
LibMapOverlayData/MapOverlayData补全地图 overlay 数据。 - Hook
WorldMapFrame_Update,在世界地图刷新后把未探索区域重新画出来,并降低亮度显示。 - 被动采集当前角色已经探索过的 overlay,持久化到 SavedVariables。
- 主动扫描全部大陆与区域,把当前角色已经探索到的 overlay 批量收集出来。
与 Nanami-UI 的耦合点
真正的强耦合不多,主要只有这些:
SFrames:Print用于聊天框输出提示。SFramesDB/SFramesGlobalDB分别保存角色配置和账号级扫描数据。SFrames:CallWithPreservedBattlefieldMinimap用来保护战场小地图状态,避免SetMapZoom/SetMapToCurrentZone带来副作用。/nui ...命令入口挂在Nanami-UI的统一 Slash Command 里。ConfigUI.lua只是配置面板入口,不影响核心迷雾逻辑。
提纯后的最小依赖
独立插件只需要:
LibMapOverlayData或兼容的 overlay 数据表。WorldMapFrame_UpdateGetMapInfo/GetNumMapOverlays/GetMapOverlayInfoSetMapZoom/SetMapToCurrentZone- SavedVariables
也就是说,这个功能本质上可以完全脱离 UI 框架。
推荐拆分方式
建议拆成一个独立插件:
Nanami-MapReveal.tocCore.luaMapReveal.lua
其中:
Core.lua负责初始化、打印、Slash 命令、配置默认值。MapReveal.lua只保留地图迷雾逻辑、扫描逻辑、数据持久化。- 独立版会在世界地图右上角放一个
Reveal勾选框,方便用户直接开关迷雾揭示。
数据结构建议
角色级配置:
NanamiMapRevealDB = {
enabled = true,
unexploredAlpha = 0.7,
}
账号级扫描数据:
NanamiMapRevealGlobalDB = {
scanned = {
["ZoneName"] = {
"OVERLAYNAME:width:height:offsetX:offsetY",
},
},
}
Hook 策略
最稳妥的方式仍然是包裹 WorldMapFrame_Update:
- 先隐藏现有
WorldMapOverlay1..N - 调用原始
WorldMapFrame_Update - 被动收集当前可见的 explored overlays
- 如果开关开启,再自行补画 unexplored overlays
这样兼容原版地图逻辑,也不需要重做整张世界地图。
兼容注意点
NUM_WORLDMAP_OVERLAYS不够时要动态扩容。- 最后一行/列贴图可能不是 256,必须重新计算
TexCoord。 - 个别地图 overlay 偏移有 errata,需要单独修正。
- 扫描地图时可能影响当前地图上下文,结束后要恢复原地图层级。
- 如果服务端或整合包已经补过
MapOverlayData,合并时要按 overlay 名去重。
已提取的独立插件样板
仓库里已经附带一个可复用版本:
- standalone/Nanami-MapReveal/Nanami-MapReveal.toc
- standalone/Nanami-MapReveal/Core.lua
- standalone/Nanami-MapReveal/MapReveal.lua
给其他作者的接入建议
如果对方已经有自己的框架:
- 保留
MapReveal.lua主体逻辑。 - 把打印函数替换成自己的日志函数。
- 把 DB 名称换成自己的 SavedVariables。
- 把 Slash 命令合并进自己的命令系统。
如果对方只想直接用:
- 复制
standalone/Nanami-MapReveal整个目录。 - 放进
Interface/AddOns/ - 确保客户端有
LibMapOverlayData或兼容数据源。
后续可继续提纯的方向
- 把
TurtleWoW_Zones再单独拆成数据文件。 - 增加一个纯 API 层,只暴露
Toggle/Refresh/ScanAllMaps/ExportScannedData。 - 为不同端做兼容层,比如 Turtle WoW、Vanilla、1.12 私服整合端分别适配。