Antique Atlas 集成
SignPosts 是 Antique Atlas 的硬依赖:@Mod(modid = SignPostsMod.ID, ..., dependencies = "required-after:antiqueatlas"),dependencies.gradle 中为 implementation("com.github.GTNewHorizons:AntiqueAtlas:4.4.6-GTNH:dev")。没有 Antique Atlas 本模组无法加载。
@Mod 声明中没有声明对 signpost(Gollorum)的依赖,见 Gollorum 集成。
标记类型 signPost
| 常量 | 值 | 用途 |
|---|---|---|
SignPostsMod.MARKERTYPE |
"signPost" |
传给 createAndSaveMarker 的标记类型串 |
SignPostsMod.aaModName |
"antiqueatlas" |
依赖检测用(aaModName 在源码中定义但未被使用) |
SignPostsMod.aaItemName |
"antiqueAtlas" |
同样定义但未被使用 |
| 标记图标贴图 | signposts:textures/gui/markers/signPost.png |
客户端 AtlasAPI.getMarkerAPI().setTexture("signPost", ...) |
| 文字贴图 | textures/entity/sign.png |
路牌 上绘制铭文 |
SignPostsAtlasGui.renderMarker 用 marker.getType().equals("signPost") 判定「可传送标记」,并把它染成灰色 GL11.glColor4f(0.5f, 0.5f, 0.5f, 1) 作为悬停提示;toJump 只会被赋成 signPost 类型的标记。
新增标记
public static int addGlobalMarker(int x, int z, String label, World world) {
MarkersData data = AntiqueAtlasMod.globalMarkersData.getData();
Marker marker = data.createAndSaveMarker(MARKERTYPE, label, world.provider.dimensionId, x, z, false);
PacketDispatcher.sendToAll(new MarkersPacket(world.provider.dimensionId, marker));
return marker.getId();
}
| 要点 | 说明 |
|---|---|
| 存储位置 | AntiqueAtlasMod.globalMarkersData(全局标记,所有玩家的 Atlas 都可见) |
| 维度 | world.provider.dimensionId,按维度分组 |
| 只取 X/Z | 不记录 Y——Atlas 标记本质是 2D chunk 级标记 |
| 最后一个 boolean | 传 false(源码未使用具名参数,行为由 Antique Atlas 决定) |
| 广播 | PacketDispatcher.sendToAll(new MarkersPacket(...)),立即推给所有客户端 |
removeGlobalMarker(markerId, world) 则走 AtlasAPI.markers.deleteGlobalMarker(world, markerId)。
MarkerToTileMap(世界存档数据)
Atlas 标记只存 X/Z,不存方块 Y。为了支持按标记反查路牌方块位置(传送时需要精确的 Y),本模组自建一份 WorldSavedData。
| 属性 | 值 |
|---|---|
| 类 | harceroi.mc.signposts.data.MarkerToTileMap extends WorldSavedData |
DATA_NAME |
SignPostsMod.ID + "_MarkerToTileMap" = signposts_MarkerToTileMap |
| 内部映射 | Map<Integer, int[]> tileMap(ConcurrentHashMap),键 = markerId,值 = {x, y, z} |
| 存储 | world.perWorldStorage(每维度独立一份) |
NBT 结构
顶层标签 arrayList(getTagList("arrayList", 10),类型 10 = NBTTagList),每个元素是含 4 个 int 的 NBTTagCompound:
| 字段 | 类型 | 含义 |
|---|---|---|
markerId |
int | Atlas 标记 ID(映射键) |
x |
int | 路牌方块 X |
y |
int | 路牌方块 Y |
z |
int | 路牌方块 Z |
方法
| 方法 | 行为 |
|---|---|
get(World) |
经 MapStorage.loadData 懒加载,不存在则 new 并 setData |
setTileForMarker(x, y, z, markerId) |
put + setDirty(true) |
removeMarker(markerId) |
remove + setDirty(true) |
getTileForMarker(markerId) |
返回 int[] 或 null |
getMarkerForTile(x, y, z) |
线性遍历整个 map 找匹配坐标,无匹配返回 -1 |
getMarkerForTile是 O(n) 线性扫描,只在 Gollorum 的DESTROYED/NAMECHANGED路径上被调用。路牌数量很大时删除传送石会变慢。
客户端界面 SignPostsAtlasGui
SignPostsAtlasGui 是 Antique Atlas 原生 Atlas 界面的加宽版本(WIDTH = 310、HEIGHT = 218,而 Atlas 原版更小),地图区 MAP_WIDTH = WIDTH - 17*2 = 276、MAP_HEIGHT = 194。
| 项 | 值 |
|---|---|
| 标记图标尺寸 | MARKER_SIZE = 32 |
| 悬停判定半径 | MARKER_RADIUS = 7 |
| 缩放下限阈值 | MIN_SCALE_THRESHOLD = 0.5(低于此值瓦片不再缩小,改用 tile2ChunkScale 合并) |
| 每次平移步长 | navigateStep = 24 格 |
| 初始缩放 | setMapScale(0.5),上下限取自 AntiqueAtlasMod.settings.minScale / maxScale |
沿用 Atlas 的设置项:doSaveBrowsingPos(保存浏览位置)、doReverseWheelZoom(反转滚轮缩放)、doScaleMarkers(标记随缩放放大,0.5~1 倍用 1x、>1 倍用 2x)。
键盘操作
| 按键 | 行为 |
|---|---|
| 方向键 | 平移地图 navigateStep 格 |
+ / = |
放大 2 倍 |
- / _ |
缩小 2 倍 |
| 快捷栏键(1~9) | 关闭界面 |
滚轮缩放在 handleMouseInput 中处理。这些键位是硬编码的 Keyboard.getEventKey() 比对,本模组没有注册任何 KeyBinding,所以本 wiki 没有 keybinding/ 条目,也不可自定义。
关闭界面时
biomeData.setBrowsingPosition(mapOffsetX, mapOffsetY, mapScale);
PacketDispatcher.sendToServer(new BrowsingPositionPacket(stack.getItemDamage(), player.dimension, mapOffsetX, mapOffsetY, mapScale));
复用 Atlas 的浏览位置机制(按 Atlas 物品的 damage 值区分不同 Atlas)。
相关条目
- 路牌 - 铭文文字取自 Atlas 标记的本地化 label
- 传送目标流程 - 标记 → 坐标反查
- Gollorum 集成 - 传送石复用同一套标记机制
- 网络消息 - 自定义消息 vs Atlas 自带数据包