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 无同步保护

条目索引

机制

配方

  • 装配机配方 - 遍历 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

兼容

覆盖率

维度 注册真源实测 已收录
水体方块 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。