提示渲染系统(Hologram)
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | com.gtnewhorizon.structurelib.ClientProxy |
| 提示数据入口 | com.gtnewhorizon.structurelib.StructureLibAPI |
这是本 mod 的核心功能:把多方块结构中"该放什么方块"的信息,以半透明全息方块的形式叠加显示在世界中,帮助玩家按图施工。所有渲染都在客户端完成,服务端不参与。
全息组(HintGroup)
提示按批次组织。一次右键产生的全部提示归入同一组 HintGroup,ClientProxy 维护两个集合:
| 集合 | 类型 | 作用 |
|---|---|---|
allGroups |
List<HintGroup> |
所有仍存活的全息组,按创建时间从旧到新排列 |
currentHints |
HintGroup |
当前正在累积的组,结束时置为 null |
startHinting 结束上一组并新建一组,endHinting 把它追加进 allGroups 并记录 creationTime = 玩家 ticksExisted。顺序排列这一点被 onClientTick 利用,以便从头扫描就能定位过期区段,无需遍历全部。
allHints 是一个 Map<HintParticleInfo, HintGroup>,用于快速反查某个提示属于哪一组。
生命周期与清理
onClientTick 在 ClientTickEvent 的 END 阶段执行:
- 算出
deadline = 玩家 ticksExisted - hintLifespan - 从
allGroups头部顺序扫描,跳过创建时间晚于deadline的组 - 把扫描到的过期前缀批量移除并清空
- 玩家移动距离超过阈值时,额外触发一次全量重排序
存活上限由 maxCoexisting 控制:新增全息前若 allGroups.size() >= maxCoexisting,从最旧的一组开始裁剪。removeColliding 为 true 时,还会检查新提示位置是否与既有提示重复,命中则直接移除那一组。
渲染
每个提示在世界中渲染为一个边长 0.5 的立方体(居中于方块坐标,加 0.25 偏移),使用 Tessellator 直接绘制:
- 亮度取自方块位置的天空光亮度
- 颜色为提示的 RGBA 染色 × 全局
hintTransparency allHintsForRender列表按由远及近排序,保证半透明叠加顺序正确;该列表预分配 10000 容量renderThrough计数器跟踪"穿透方块渲染"的提示数量,为 0 时可跳过对应优化
染色与错误态
提示支持两种染色状态:
| 状态 | RGBA | 来源 |
|---|---|---|
| 无染色 | {255, 255, 255, 255} |
RGBA_NO_TINT |
| 错误态 | {255, 128, 128, 0} |
RGBA_RED_TINT,alpha 为 0(穿透渲染) |
错误态由通道 show_errors 控制:生成提示时若该通道开启且 couldBeValid 返回 false,就调用 markHintParticleError 把该位置标记为错误。show_errors 通道由 mod 自身注册,翻译键为 channels.structurelib.show_errors。
网络消息
提示状态的同步使用 SimpleNetworkWrapper,共注册 5 条消息(判别值 0–5):
| 判别值 | 消息 | 方向 | 用途 |
|---|---|---|---|
| 0 | AlignmentMessage.AlignmentQuery |
服务端 | 请求某个位置的对齐数据 |
| 1 | AlignmentMessage.AlignmentData |
客户端 | 回传对齐数据 |
| 2 | UpdateHintParticleMessage |
客户端 | 更新某个提示的 RGBA 染色 |
| 3 | SetChannelDataMessage |
服务端 | 同步触发器物品上的通道数据 |
| 4 | ErrorHintParticleMessage |
客户端 | 把某个提示标记为错误态 |
| 5 | RegistryOrderSyncMessage |
服务端 | 同步 SortedRegistry 的排序与禁用列表 |
染色更新与错误标记这两条消息只修改已有提示的状态,不负责创建提示。
装饰粒子
每条提示还会附带一个 Weightless Particle FX 粒子,由客户端本地生成。
相关条目:配置、Hint Block、通道系统。