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 内不统一。
相关条目
- Plot -
markPlotBorders入参 - TownBlock -
markTownBorders入参 - Mod 入口 - FML bus 注册
- MyTown2-Client - 客户端侧 GUI