网络包与 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);

关联