VisualsHandler

基本信息

属性 值
类名 mytown.handlers.VisualsHandler
文件 src/main/java/mytown/handlers/VisualsHandler.java
行数 463
单例 public static final VisualsHandler instance
启用版本 Minecraft 1.7.10

功能

领地可视化 —— 把城镇 / 地块的边界以高亮方块的形式发给客户端显示。 本 mod 本身是纯服务端的,但 GTNH 玩家需要直观看到「哪里是别人的地」。

由 Mod 入口 注册到 FML bus(FMLCommonHandler.instance().bus()), 订阅 TickEvent.ServerTickEvent。

核心状态

字段 说明
instance public static final 单例
markedBlocks List<VisualObject>,记录已标记的方块

tick(TickEvent.ServerTickEvent)

开头即双重过滤:

if (ev.side != Side.SERVER || ev.phase != TickEvent.Phase.START) return;

即仅服务端、仅每 tick 的 START 阶段处理。

标记方法

方法 用途
markBlock(x, y, z, dim, block, caller, key) 标记单个方块
markBlocks(caller, key, List<BlockCoords>) 批量标记
markCorners(x1, y1, z1, x2, y2, z2, ...) 标记长方体角点
markPlotBorders(Plot, caller) 地块边框(按 Plot)
markPlotBorders(x1, y1, z1, x2, y2, z2, dim, caller) 地块边框(按坐标)
markTownBorders(TownBlock.Container, caller) 城镇边框
addMarkedBlocks(caller, key, List<BlockCoords>) 投递到客户端

所有方法都带 caller(EntityPlayerMP)参数 —— 高亮是按玩家单独发送的,不是广播。

实现要点

⚠️ markCorners 与 markPlotBorders 标的是「边框 / 角点」,不是填充整个区域。 长方体内部方块不会被标记。看到「只有一圈高亮」是正确行为, 不是渲染缺失。

⚠️ 坐标一律带 dim(维度 ID),与全 mod 的 「坐标 = (dim, x, y, z)」约定一致。

⚠️ addMarkedBlocks 内部用匿名 Runnable(VisualsHandler.java:296) 在客户端线程侧执行方块标记,跨线程发送数据包 —— 高亮延迟是正常现象。

⚠️ 单例暴露方式是 public static final instance(字段), 而 ExtraEventsHandler 用的是 getInstance()(方法)。两种风格在本 mod 内不统一。

相关条目