AntiqueAtlas

GTNH 的 Antique Atlas 分支。一个纯数据型地图模组:注册 2 个物品、0 个方块,地图内容全部存在 WorldSavedData 的 NBT 里,通过 11 条封包同步。

项目 值
modid antiqueatlas(gradle.properties 的 modId)
源仓库 https://github.com/GTNewHorizons/AntiqueAtlas.git(GTNH fork,原作者 Hunternif)
源 commit 6ce6d82(2025-01-22T20:45:43-08:00)
Minecraft 1.7.10(gradle.properties 的 minecraftVersion)
Java 包根 hunternif.mc.atlas(modGroup)
网络通道 AntiqueAtlasMod.CHANNEL,值就是 antiqueatlas
主源文件数 104(另 4 个 JUnit 测试文件)

物品(2)

物品 注册名 说明
Antique Atlas antiqueatlas:antiqueAtlas 地图册本体。子类型即 atlasID(物品 damage 值)
空白 Antique Atlas antiqueatlas:emptyAntiqueAtlas 书 + 指南针合成,右键换一本新图册

没有方块。整个 mod 没有 registerBlock 调用,没有方块类,也没有 TileEntity——地图不是靠方块载体存的。详见下方「本 mod 没有」。

物品效果(2)

效果 来源 说明
地图扫描 携带 antiqueatlas:antiqueAtlas 被动扫描半径 11 区块的圆形区域写入群系
自动标记 同上 / 世界生成 三个 watcher 自动写 tomb、village、nether_portal

游戏设定(5)

条目 内容
SettingsConfig 14 项 .cfg 配置 + 5 个 JSON 配置文件
地图数据模型 Tile / ITileStorage / TileGroup / DimensionData / AtlasData 与全部 NBT 字段名
网络消息 11 条封包的 ID、方向、载荷、发送时机
标记系统 Marker / MarkersData / GlobalMarkersData、13 种内置类型与 NBT 路径
群系检测 BiomeDetectorBase / BiomeDetectorNether 与 25 个预定义伪群系名

数据流

玩家移动
  └─ ItemAtlas.onUpdate(每 20 tick)
      └─ IBiomeDetector.getBiomeID(chunk)      → 决定该区块一格的颜色
          ├─ BiomeDetectorBase   维度 0 及其它
          └─ BiomeDetectorNether 维度 -1
      └─ AtlasData.setTile → WorldSavedData "aAtlas_<atlasID>"
  └─ MapDataPacket / TileGroupsPacket / TilesPacket / TileNameIDPacket  → 客户端
客户端右键
  └─ GuiAtlas 渲染 DimensionData + MarkersData

图册的存储键(4 份并存):

数据 键 版本
群系地图 aAtlas_<atlasID> 3
本地标记 aaMarkers_<atlasID> 3
伪群系坐标 aAtlasExtTiles 1
全局标记 aAtlasGlobalMarkers 3

供其他 mod 调用的 API

hunternif.mc.atlas.api.AtlasAPI,两个静态实例:

API 版本 用途
AtlasAPI.tiles(TileAPI) 5 读写群系 tile 与伪群系
AtlasAPI.markers(MarkerAPI) 3 增删本地 / 全局标记,客户端侧设贴图
AtlasAPI.getVersion() 3 AtlasAPI 自身的版本(与上面两个独立)

辅助方法 AtlasAPI.getPlayerAtlases(player) 返回玩家主物品栏里所有图册的 atlasID 列表,被 DeathWatcher 用来逐本写墓碑。

本 mod 没有的内容

以下 10 个维度经源码检索确认完全没有,因此不建目录、不建条目。证据均来自 /Users/evlos/a/mirror/AntiqueAtlas(commit 6ce6d82)的 src/main/java:

方块 / 多方块结构

$ grep -rn "registerBlock\|extends Block\b\|setHardness" src/main/java
(无输出)

$ grep -rn "Multiblock\|ICommand\|CommandBase" src/main/java
(无输出)

注册调用总共只有两条,都是物品:

$ grep -rn "GameRegistry.registerItem\|GameRegistry.registerBlock" src/main/java
src/main/java/hunternif/mc/atlas/AntiqueAtlasMod.java:71:	GameRegistry.registerItem(itemAtlas, "antiqueAtlas");
src/main/java/hunternif/mc/atlas/AntiqueAtlasMod.java:72:	GameRegistry.registerItem(itemEmptyAtlas, "emptyAntiqueAtlas");

因此没有方块硬度、方块附魔、TileEntity、多方块结构、指令。地图数据完全挂在 WorldSavedData 上,与方块无关。

实体

$ grep -rn "extends Entity\b\|registerModEntity\|EntityRegistry" src/main/java
(无输出)

NetherPortalWatcher extends DummyWorldAccess 只是 IWorldAccess 的实现,用来监听实体生命周期,不注册任何实体类型。

附魔 / 药水效果 / 成就

$ grep -rniE "Enchantment|Achievement|PotionEffect|extends Potion" src/main/java
(无输出)

维度

$ grep -rn "registerDimension\|extends WorldProvider\|DimensionManager" src/main/java
(无输出)

本 mod 不注册新维度。它对下界的支持是「在维度 -1 上用 BiomeDetectorNether 检测」,属于读原版维度。GTNH 其它 mod 维度会回落到主世界检测器(见 群系检测)。

群系 / 世界生成 / 结构

$ grep -rn "extends BiomeGenBase\|BiomeProvider\|IWorldGenerator\|IWorldChunkGenerator" src/main/java
(无输出)

本 mod 不新增群系,也不做世界生成。VillageWatcher 和 NetherFortressWatcher 只是读原版生成的 MapGenStructureData(键 "Village" / "Fortress")把结果画到地图上,不生成任何结构。

ExtTileIdMap 里那 25 个 npcVillage* / nether* 常量是伪群系的字符串名,用于选择贴图集,不是方块或物品注册名。

键位

$ grep -rn "registerKeyBinding\|new KeyBinding" src/main/java
(无输出)

GuiAtlas 里用 Keyboard.KEY_UP / KEY_ADD / Keyboard.getEventKey() 处理方向键和 +/-,但没有注册任何 KeyBinding——地图界面全靠方向键和加减号导航,不占用独立键位。

未文档化的测试

src/test/java 下有 4 个 JUnit 测试:TestMath、TestSubTileUV、TestNBT、TestListMapValueIterator。它们只验证工具类行为,不构成游戏内容,故不建条目。其中 TestNBT 验证 NBT 读写往返,是 地图数据模型 与 标记系统 中 NBT 字段的旁证。