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