HydroEnergy
[!INFO] Git Commit:
21f2095| Updated: 2026-10-01
modid:hydroenergy(HETags.java:8
public static final String MODID = "hydroenergy";,
由 @Mod(modid = HETags.MODID, ...) 在 HEMod.java:18 引用)。
gradle.properties 的 modId = hydroenergy 一致。全小写。
⚠️ mcmod.info 的 modid/name/version/mcversion 全是构建期占位符
("${modId}" / "${modName}" / "${modVersion}" / "${minecraftVersion}"),
无法从这里读 modid。唯一的真实描述是手写字段:
“Unlimited hydro-electric storage for GregTech5 Unofficial with rendered water levels.”
(src/main/resources/mcmod.info:6)
显示名:HydroEnergy(HETags.java:9 MODNAME,
gradle.properties 的 modName = HydroEnergy)
网址: https://github.com/SinTh0r4s/HydroEnergy
作者: SinTh0r4s(mcmod.info 的 authorList)
根包名: com.sinthoras.hydroenergy(HETags.GROUPNAME)
一句话:给 GT5 加「水力发电」整条链
61 个 Java 文件。本 mod 不生成任何电力,它做的是把水接进 GT5 的电力体系:
水 →(水力泵 Hydro Pump,吃电)→ 加压水
→(水力坝 Hydro Dam,蓄能/控水位)→ 压力水
→(水力涡轮 Hydro Turbine)→ 普通水 + EU
外加一整套可渲染、可编辑、可存档的巨型水体。
注册清单(真源:hooks/HEHooksShared.java)
| 类别 | 数量 | 说明 | 行 |
|---|---|---|---|
| 水体方块 | maxDams 个(默认 16,可配 1–16) |
每 waterId 一个 HEWaterStill,数量随配置变化 |
77-83 |
| 水力坝控制器 | 1 | blockIdOffset + 0 = 17000,GT MetaTileEntity |
96 |
| 水力泵 | 14 档(LV~MAX) | 全部共用 blockIdOffset + 1 = 17001,靠 metadata 区分 |
94-121 |
| 水力涡轮 | 14 档(LV~MAX) | 全部共用 blockIdOffset + 17 = 17017,靠 metadata 区分 |
94-121 |
| 流体 | 1 | pressurized_water |
85 |
| 指令 | 3 | hesetwater / hedebug / helistcontrollers |
151-153 |
| 网络包 | 5 | 4 个下行 + 1 个上行 | 49-75 |
| 配置项 | 21 | General 9 / Spreading 6 / Energy Balance 6 | config/HEConfig.java |
| Mixin | 10 | 9 个 early(Minecraft 类)+ 1 个 late(GT PollutionRenderer) |
mixins/ |
| 配方 | 动态 | N_钎焊材料 × (1 + 2 × M_启用档位),装配机 |
blocks/HEBlockRecipes.java |
没有方块以外的物品、没有实体、没有附魔、没有新维度。
api/HEGetMaterialUtil.java与api/IHEHasCustomMaterialCalculation.java是给其它 mod 用的材质计算接口。
三台机器的多方块结构(逐格实测)
⚠️ 本 mod 有多方块结构,且是本仓库最易写错的字段。 三台的控制器位置与尺寸:
| 机器 | 尺寸 | 控制器 | 壳体 | 内部空腔 | 必需舱室 |
|---|---|---|---|---|---|
| Hydro Dam | 5 × 5 × 5 | 正面中心 (x+2, y+3, z+0) |
GT 混凝土 meta 8 | 3×3×3(水在此) | 输入舱(可放 H 位) |
| Hydro Pump | 3 × 3 × 3 | 正面中心 (x+1, y+1, z+0) |
按档位 | 中心 1 格 (1,1,1) |
能源 + 输入 + 输出 + 维护 各 ×1 |
| Hydro Turbine | 3 × 3 × 3 | 正面中心 (x+1, y+1, z+0) |
按档位 | 中心 1 格 (1,1,1) |
发电机 + 输入 + 输出 + 维护 各 ×1 |
| 共同点 | 说明 |
|---|---|
| 固定朝向 | 结构定义无对称性声明,控制器必须在 z+0 面;源码无任何旋转支持 |
| 坝不需要维护舱 | 6 个扳手类标志在构造时全置 true(HEHydroDamTileEntity.java:95-101) |
| ULV 不存在 | 配方数组索引 0 是 null,注释 // ULV is disabled! |
依赖声明
HETags.java:12:
public static final String DEPENDENCIES = "required-after:gregtech;required-after:tectech";
(HETags.java:12,由 @Mod(dependencies = HETags.DEPENDENCIES, ...) 在 HEMod.java:21 引用)
| 依赖 | 级别 | 说明 | 在本 wiki 收录范围? |
|---|---|---|---|
gregtech |
required-after | 硬前置。三台机器全部继承 TTMultiblockBase,配方走 assemblerRecipes |
✅ 在(分类 gregtech) |
tectech |
required-after | 硬前置(GT5 配套的 Tectech) | ❌ 不在(data/relation.md 无该分类) |
| MyTown2 | 隐式可选 | 地块保护集成 | ⚠️ relation.md 有 mytown2 行,但 data/mytown2/ 目录尚未建立 |
| NotEnoughItems | 隐式 | API.hideItem(...) 隐藏方块 |
✅ 在 |
| Angelica | 隐式可选 | 检测到就强制受限渲染 | ✅ 在(分类 angelica) |
| endlessids | 隐式可选 | HE.EID_LOADED = Loader.isModLoaded("endlessids")(hooks/HEHooksShared.java:87) |
不在 |
⚠️ 关于不在收录范围的依赖
tectech不在本 wiki 收录范围。本条目不复述 Tectech 的功能, 也不展开本 mod 与 Tectech 的交互——源码中除DEPENDENCIES声明外 没有任何 Tectech 相关代码。- MyTown2 的分类行已在
relation.md中预留,但目录尚未建立, 故本 wiki 尚未收录完成。本条目只记本 mod 侧代码, 不复述 MyTown2 功能(见 MyTown2 集成 内的说明)。
modid 陷阱
| 坑 | 正确值 | 出现位置 |
|---|---|---|
mcmod.info 全是 ${modId} 占位符 |
必须从 HETags.java:8 读 |
src/main/resources/mcmod.info |
| 版本号也是占位符 | HETags.java:10 VERSION = tags.VERSION,由 generateGradleTokenClass 在构建期生成 |
HETags.java:10 |
MyTown2 区分大小写 |
HETags.MyTown2_MODID = "MyTown2"(不是 mytown2) |
HETags.java:38 |
angelica / endlessids 全小写 |
用 Loader.isModLoaded("angelica") / ("endlessids") |
HEConfig.java:124、hooks/HEHooksShared.java:87 |
生命周期
HEMod.java 注册 8 个 @Mod.EventHandler(全是重载名 fmlLifeCycle),
全部转发给 @SidedProxy 的 proxy.fmlLifeCycleEvent(event):
| 事件 | HEMod.java 行 |
实际动作(hooks/HEHooksShared.java) |
|---|---|---|
FMLPreInitializationEvent |
30-37 |
读配置;建网络通道;注册 5 个包;注册 maxDams 个水体方块;注册流体;EID_LOADED |
FMLInitializationEvent |
39-44 |
注册 HEHooksFML + HEHooksEVENT_BUS;创建 29 个机器物品(坝 1 + 泵 14 + 涡轮 14);隐藏未启用档位 |
FMLPostInitializationEvent |
46-51 |
注册 GUI handler;HEBlockRecipes.registerRecipes() |
FMLServerAboutToStartEvent |
53-57 |
空实现(HEHooksShared.java:145) |
FMLServerStartingEvent |
59-64 |
注册 3 个指令;HEServer.instance = HEServer.load(worldServers[0]) |
FMLServerStartedEvent |
66-70 |
空实现(HEHooksShared.java:158) |
FMLServerStoppingEvent |
72-76 |
空实现(HEHooksShared.java:160) |
FMLServerStoppedEvent |
78-82 |
空实现(HEHooksShared.java:162) |
HETags.java:3的类注释是一条重要约束:// Use this class for Strings only. Do not import any classes here. It will lead to issues with Mixins if in use!——HETags只能放字符串常量,导入任何类都会破坏 Mixin。HETags.java:10的tags.VERSION是构建期生成类,源码中不存在。
已确认的源码缺陷
| # | 位置 | 问题 |
|---|---|---|
| 1 | server/mytown2/HEMyTown2Integration.java:16 |
Class.forName 类名错误(包名缺 .mytown2、类名缺 Integration)→ MyTown2 集成永不生效,恒回退 Dummy(恒 true)。详见 MyTown2 集成 |
| 2 | server/commands/HECommandSetWater.java:31 |
if (controllerId >= 0 || controllerId < HEConfig.maxDams) —— 应为 &&,写成 ` |
| 3 | server/commands/HECommandDebug.java |
完全没有 ID 边界检查,越界同样抛 AIOOBE |
| 4 | 三个指令的 catch (Exception ex) |
把越界、格式错误等所有异常统一报成 "Could not parse command!",误导 |
| 5 | blocks/HETieredTileEntity.java:46-64、67-88 |
getCasingBlock() / getCasingMeta() 的 switch 只覆盖 case 1–9 和 11,UEV(10)、UMV(12)、UXV(13)、MAX(14) 落到 default,误用 LV 同款 sBlockCasings2 meta 0。源码自带 // TODO: case 10, 12 - 15(且 15 不存在,最大 tierId 是 14) |
| 6 | server/HEDam.java:340-343 |
setWaterLevel(long) 中 energyCapacityAtY 在 blocksPerY[blockY] == 0 的空层为 0 → 除零得 Infinity/NaN,无防护 |
| 7 | blocks/HEHydroDamTileEntity.java:163 |
fluidStack.amount -= storableEnergy; —— storableEnergy 是按 euPerMilliBucket 换算的能量,却直接从流体数量里扣。默认值 1.0 时数值巧合相同,改配置即失衡 |
| 8 | config/HEConfig.java:233-240 |
enabledTiers 是 static 数组且只置 true 从不置 false,改配置文件删档位在同进程内不生效 |
| 9 | config/HEConfig.java:30 vs 183 |
damDrainPerSecond 名字写 “second”、注释写 “per tick”、代码在 onRunningTick 里用(= 每 tick)。按「每秒」推算产能会错 |
| 10 | server/HEDam.java:72、63-67 |
存档只存 drainState 布尔,DamMode.DEBUG 无法持久化,重载后变 SPREAD |
| 11 | config/HEConfig.java:124 |
if (Loader.isModLoaded("angelica")) useLimitedRendering = true; 覆盖用户配置但不写回文件 → 配置文件显示 false 实际为 true |
| 12 | assets/hydroenergy/lang/en_US.lang |
tile.water13.name=tWater —— 多一个字母 t,应为 Water |
| 13 | 全仓库 | 没有 zh_CN.lang,本 mod 无任何中文翻译 |
| 14 | client/renderer/HEProgram.java:78 vs HEWaterRenderer.java:49 / HETessalator.java:124 |
三处 GL 能力判定互不一致:HEProgram 多一个 || forceOpenGL,且分别用 OpenGL32 与 OpenGL30 两个阈值,存在互相矛盾的中间地带 |
| 15 | blocks/HEHydroPumpTileEntity.java:434 vs HEHydroTurbineTileEntity.java:425 |
beginStructureBlock(3,3,3, 第四参一个是 true 一个是 false(该参数是「是否含控制器」),源码无解释 |
| 16 | HE.java:34 |
kiloBucketToMilliBucket = 1_000_000 全代码库无读取点(已 grep 确认) |
| 17 | server/HEDam.java:279 |
注释 // Clap change requests to server limits —— Clap 应为 Clamp |
| 18 | blocks/HEWater.java:114 |
源码自嘲注释 // This constant is so magic I'm gonna die!(指 getMaterial(double) 里硬编码的 0.120f) |
| 19 | HETags.java:37、39 |
mainStructure 与 structurePieceMain 是两个不同常量,值都是 "main" |
| 20 | server/mytown2/HEMyTown2Integration.java:12 |
getInstance() 的单例 instance 无同步保护 |
条目索引
机制
- 水力坝(Hydro Dam) - 5×5×5 多方块,控制器
(x+2, y+3, z+0),3×3×3 水腔;档位靠槽 1 电路;蓄能 = Σ(方块数 × 深度) - 水力泵(Hydro Pump) - 3×3×3,14 档 LV~MAX 共用一个方块 ID;吃电把普通水变加压水并写入压力 NBT
- 水力涡轮(Hydro Turbine) - 3×3×3,14 档;吃加压水产电并把水还原成普通水;不读压力
- 水体方块与扩散系统 -
maxDams个独立水方块(不可抽水、不流动)、三模式、六向限高与静水压能量模型 - 加压水与能量换算 -
pressurized_water流体 +pres压力 NBT;milliBucketPerEU/euPerMilliBucket互逆换算
配方
- 装配机配方 - 遍历 GT 全部钎焊材料生成,条数随
enabledTiers动态变化;泵与涡轮材料相同、仅电路数量不同
配置
- 配置项 -
config/hydroenergy.cfg共 21 项(General 9 / Spreading 6 / Energy Balance 6)
指令
- 服务端指令 -
hesetwater/hedebug/helistcontrollers,均为 OP 级;前两个的 ID 边界检查均不可靠
网络
- 网络包与 GUI - 5 个 SimpleNetworkWrapper 包(4 下行 1 上行)+ 坝配置 GUI 三件套 + 10 个 Mixin
兼容
- MyTown2 集成(已失效) -
Class.forName类名写错,地块保护永不生效 - 客户端渲染与光照 - OpenGL 3.2 分档渲染、自定义着色器、子区块级光照延迟、Angelica 强制受限
覆盖率
| 维度 | 注册真源实测 | 已收录 |
|---|---|---|
| 水体方块 | maxDams = 16(HEConfig.java:18;hooks/HEHooksShared.java:77-83) |
16(在 水体方块与扩散系统 说明数量可配与注册方式) |
| 水力坝 | 1(hooks/HEHooksShared.java:96) |
1(专页) |
| 水力泵 | 14 档(hooks/HEHooksShared.java:94-107) |
14(专页 逐档列出壳体/压力/效率) |
| 水力涡轮 | 14 档(hooks/HEHooksShared.java:94-121) |
14(专页) |
| 流体 | 1(hooks/HEHooksShared.java:85) |
1(专页) |
| 指令 | 3(hooks/HEHooksShared.java:151-153) |
3(专页 全部,含用法与缺陷) |
| 网络包 | 5(hooks/HEHooksShared.java:49-75) |
5(专页 全部,含 networkId 与方向) |
| 配置项 | 21(config/HEConfig.java) |
21(专页 全部列出默认值与侧别) |
| Mixin | 10(9 early + 1 late) | 10(专页 全部列出) |
| GUI 组件 | 7 个类 | 7(专页 全部列出) |
| 配方 | 动态,源码无固定条数 | 模板全覆盖(专页 给出公式 N × (1 + 2M),未编造具体条数) |
覆盖率:方块 35/35(16+1+14+14)、流体 1/1、指令 3/3、包 5/5、配置 21/21、Mixin 10/10。