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)。

相关条目