网络包与 GUI
基本信息
| 属性 | 值 |
|---|---|
| 通道 | NetworkRegistry.INSTANCE.newSimpleChannel(HETags.MODID)(hooks/HEHooksShared.java:48) |
| 通道名 | hydroenergy |
| 包总数 | 5 |
| GUI handler | NetworkRegistry.INSTANCE.registerGuiHandler(HETags.MODID, HE.guiHandler)(hooks/HEHooksShared.java:142) |
| GUI 实现 | HE.guiHandler = new HEGuiHandler()(HE.java) |
| GUI 容器 | network/container/HEHydroDamConfigContainer.java |
5 个包(按注册顺序 / networkId)
hooks/HEHooksShared.java:49-75,networkId 从 0 自增:
| networkId | 包类 | 方向 | 作用 | 行 |
|---|---|---|---|---|
| 0 | HEPacketWaterUpdate |
→ CLIENT | 广播水位(受 minimalWaterUpdateInterval 节流) |
49-54 |
| 1 | HEPacketSynchronize |
→ CLIENT | 玩家登录时的全量同步 | 55-60 |
| 2 | HEPacketConfigUpdate |
→ CLIENT | 广播配置(模式 + 6 方向限高 + 控制器坐标) | 61-66 |
| 3 | HEPacketConfigRequest |
→ SERVER | 客户端提交限高 / 模式修改 | 67-72 |
| 4 | HEPacketChunkUpdate |
→ CLIENT | 发送子区块方块 / 光照数据 | 73-75 |
只有 1 个是客户端 → 服务端(
HEPacketConfigRequest), 其余 4 个都是服务端 → 客户端。
各包字段
HEPacketWaterUpdate(42 行)
public HEPacketWaterUpdate(int waterId, float waterLevel)
(network/packet/HEPacketWaterUpdate.java:15)
由 HEDam.sendWaterUpdate() 发出(server/HEDam.java:191-194):
HE.network.sendToAll(message) —— 发给所有客户端。
HEPacketConfigUpdate(91 行)
public HEPacketConfigUpdate(int waterId, int blockX, int blockY, int blockZ, HE.DamMode mode,
int limitWest, int limitDown, int limitNorth, int limitEast, int limitUp, int limitSouth)
(network/packet/HEPacketConfigUpdate.java:25)
11 个字段:waterId + 控制器 XYZ + 模式 + 6 个限高。
由 HEDam.sendConfigUpdate() 发出(HEDam.java:196-210),
setMode / 任一 setLimitXxx 变化时触发,无节流。
📌 参数顺序在构造器与
HEDam.sendConfigUpdate的实参列表中 都是 West, Down, North, East, Up, South(先 W/D/N,后 E/U/S), 与HEServer.getWaterLimit*的声明顺序(getWaterLimitWest、getWaterLimitDown、getWaterLimitNorth、getWaterLimitEast、getWaterLimitUp、getWaterLimitSouth,HEServer.java:128-197)一致。读 NBT 时注意South是 Z 上界。
HEPacketConfigRequest(76 行)
public HEPacketConfigRequest(int waterId, HE.DamMode mode, int limitWest, int limitDown, int limitNorth,
...)
(network/packet/HEPacketConfigRequest.java:22)
客户端 → 服务端提交修改。服务端侧由
HEServer.onConfigRequest(...)(HEServer.java:221)接收并转交
HEDam.onConfigRequest(...),后者会先用 6 个全局上限夹紧
(HEDam.java:280-285),详见 水体方块与扩散系统。
HEPacketChunkUpdate(168 行)
public HEPacketChunkUpdate(Chunk chunk, short flagsChunkY)
(network/packet/HEPacketChunkUpdate.java:32)
传子区块的方块与光照数据,toBytes / fromBytes 在 75 / 81。
读取时用 HE.blockPerSubChunk(= 4096,HE.java:30
chunkWidth * chunkHeight * chunkDepth)计算长度(HEPacketChunkUpdate.java:104-116):
byte[] lsb = buf.readBytes(HE.blockPerSubChunk).array();
byte[] msb = buf.readBytes(HE.blockPerSubChunk / 2).array();
byte[] metadata = buf.readBytes(HE.blockPerSubChunk / 2).array();
byte[] skylight = buf.readBytes(HE.blockPerSubChunk / 2).array();
即 lsb 4096 字节、其余各 2048 字节的位打包格式。
HE.blockPerSubChunk 在客户端光照管理、渲染、队列等多处复用
(如 client/light/HELightManager.java:259、377、391)。
GUI
| 组件 | 文件 |
|---|---|
| handler | client/gui/HEGuiHandler.java |
| 容器(服务端侧) | network/container/HEHydroDamConfigContainer.java |
| 容器(客户端侧) | client/gui/HEHydroDamConfigContainer.java |
| 限高弹窗 | client/gui/HEPopupLimitGui.java |
| 控件 | 文件 |
|---|---|
| 文本按钮 | client/gui/widgets/HEButtonTextured.java |
| 数字输入 | client/gui/widgets/HENumberInput.java |
| 模式控件 | client/gui/widgets/HEWidgetModes.java |
贴图路径(HE.java)
| 常量 | 值 | 用途 |
|---|---|---|
damBackgroundLocation |
"textures/gui/he_water_config.png" |
主配置界面 |
damLimitBackgroundLocation |
"textures/gui/he_water_config_limits_popup.png" |
限高弹窗 |
📌 贴图实际位于
assets/hydroenergy/textures/gui/,HEPopupLimitGui的类名用Popup而贴图名用popup——大小写不一致, 但 Forge 资源加载路径不区分此处的类名,仅贴图名起作用,不影响功能。
GUI 刷新延迟
public static final int controllerGuiUpdateDelay = 200;
(HE.java)
控制器 GUI 的更新间隔 200 tick = 10 秒。
客户端 Mixin(9 个 early + 1 个 late)
清单文件:mixins.hydroenergy.json(根)、mixins.hydroenergy.early.json、
mixins.hydroenergy.late.json(package 分别为 ...mixins.early / ...mixins.late),
minVersion: 0.7.11,共用 mixins.hydroenergy.refmap.json。
early(9 个,mixins/early/)
| Mixin | 目标 |
|---|---|
ActiveRenderInfoMixin |
渲染信息 |
ChunkClientMixin |
客户端区块 |
ChunkMixin |
区块 |
ChunkProviderClientMixin |
客户端区块提供器 |
EntityMixin |
实体 |
EntityRendererMixin |
实体渲染器 |
WorldMixin |
世界 |
WorldMixinClient |
世界(客户端) |
WorldRendererMixin |
世界渲染器 |
late(1 个,mixins/late/)
| Mixin | 目标 | 注入 |
|---|---|---|
GT_PollutionRendererMixin |
PollutionRenderer |
method = "manipulateColor"(GT_PollutionRendererMixin.java:15、20) |
GT_PollutionRendererMixin是本 mod 唯一触碰其它 mod 的 Mixin—— 打的是 GregTech 的污染渲染器(PollutionRenderer), 目的是让污染着色不覆盖水体的渲染。 GregTech 在本 wiki 有收录(分类gregtech),跨分类链接见 分类页。
Access Transformer
src/main/resources/META-INF/hydroenergy_at.cfg
——本 mod 带 AT(访问转换器)以访问私有成员。
具体条目未逐一核对;若需精确字段请直接查该文件。
自定义着色器
assets/hydroenergy/shader/hewater/:
| 文件 | 用途 |
|---|---|
shader.vsh |
顶点着色器 |
shader.fsh |
片元着色器 |
shader.gsh |
几何着色器 |
配套渲染代码在 client/renderer/:
HEWaterRenderer、HETessalator、HEProgram、HESortedRenderList。
渲染器注册在 client/HEClient.java:24:
RenderingRegistry.registerBlockHandler(HEWaterRenderer.instance);