promotional bannermobile promotional banner

Singularity Iteration

Singularity Iteration is a tech mod inspired by the Industrial Craft 2, bringing a relatively complete yet streamlined industrialization experience to Minecraft.
Back to Files

[SI] SingularityIteration-0.1.7.1-beta.jar

File name[SI] SingularityIteration-0.1.7.1-beta.jar
Uploader
MioPhaSideMioPhaSide
Uploaded
Aug 12, 2026
Downloads
140
Size
6.3 MB
Mod Loaders
NeoForge
File ID
8630149
Type
B
Beta
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:singularity-iteration-1617642:8630149"

Learn more about Curse Maven

What's new

# 更新日志 v0.1.7.1

**发布日期**: 待定

---

## 新增内容

### METS 移植电池
从 More Electric Tools (METS) 模组移植了 5 种高级电池:

- **超级兰波顿水晶** — 100,000,000 EU 容量,8192 EU/t 传输速率,Tier 5
- **充电超级兰波顿水晶** — 400,000,000 EU 容量,8192 EU/t 传输速率,Tier 5
- **锂电池** — 50,000 EU 容量,128 EU/t 传输速率,Tier 2,可堆叠至 16
- **高级锂电池** — 200,000 EU 容量,128 EU/t 传输速率,Tier 2,可堆叠至 16
- **钍电池** — 近乎无限容量(Integer.MAX_VALUE),9 EU/t 传输速率,自动充电

所有电池均支持 5 级充电动画纹理(lev0-lev4),并在创造模式物品栏中提供空电和满电两种状态。

### 合成配方
为 5 种新电池添加了合成配方:
- 锂电池:绝缘锡导线 + 锡板 + 锂粉 + 红石
- 高级锂电池:锂粉 + 高级电路 + 锂电池
- 超级兰波顿水晶:铱板 + 超级电路 + 蓝波顿水晶
- 充电超级兰波顿水晶:场发生器 + 超级兰波顿水晶 + 活体电路
- 钍电池:钍粉 + 铱板 + RTG 燃料靶丸

---

## 修复

### 升级槽自动化交互修复
- **修复末影管道(EIO)等模组可以从升级槽吸走升级插件的问题**
  - 原因:机器的 `getSlotsForDirection()` 返回了升级槽,导致管道/漏斗可以访问升级槽
  - 修复:
    - 从所有机器的 `getSlotsForDirection()` 返回数组中移除升级槽
    - 修改 `canInsertItem()` 方法,升级槽返回 `false`,阻止漏斗/管道插入物品
    - 与 IC2 原版 1.12.2 对齐:`InvSlotUpgrade` 使用 `Access.NONE`,升级槽不参与任何自动化交互
  - 影响文件:
    - 基类:`mio_icif_producer.java`
    - Producer:`mio_icif_recycler_elc.java`、`mio_icif_block_cutter.java`、`mio_icif_compressor_elc.java`、`mio_icif_extrator_elc.java`、`mio_icif_powder_elc.java`、`mio_icif_furnace_elc.java`、`mio_icif_induction_elc.java`、`mio_icif_condenser.java`、`mio_icif_metal_former.java`、`mio_icif_harvest_elc.java`、`mio_icif_miner_elc.java`、`mio_icif_pump_elc.java`、`mio_icif_matter_elc.java`、`mio_icif_replicator_elc.java`
  - 效果:升级槽只能通过玩家手动操作,管道mod和漏斗都无法传输升级插件

### 空单元装流体修复
- **修复空单元无法装填自定义流体(如蒸馏水、生物气体等)的问题**
  - 原因1:`mio_icif_cell.java` 的 `getFilledCell()` 方法中检查的是 cell 物品而不是 bucket 物品
  - `pickupBlock()` 返回的是桶物品(如 `DISTILLEDWATER_BUCKET`),但代码检查 `pickupResult.is(mio_icif_cells.CELL_DISTILLEDWATER.get())`,永远为 false
  - 修复:将所有检查从 `CELL_X` 改为对应的 `X_BUCKET`
  - 原因2:对于不支持的流体(如原油、柴油),`pickupBlock()` 会移除流体但返回的桶物品无法转换,导致流体被吞掉
  - 修复:添加 `isSupportedFluid()` 方法,在调用 `pickupBlock()` 之前先检查流体类型,不支持的流体直接跳过
  - 影响文件:`mio_icif_cell.java`
  - 效果:
    - 空单元现在可以正确装填所有自定义流体,包括蒸馏水、生物气体、热水、生物质、建筑泡沫、冷却剂、热冷却剂、玄武岩熔岩、蒸汽、过热蒸汽、UU物质
    - 对于不支持的流体(如原油、柴油),空单元不会与之交互,流体不会被吞掉

### 流体单元合成剩余物品修复
- **修复流体单元参与合成时不返回空单元的问题**
  - 原因:流体单元注册时未设置 `craftRemainder` 属性
  - 修复:为所有流体单元(水、岩浆、生物气体、热水、生物质、建筑泡沫、冷却剂、蒸馏水、热冷却剂、玄武岩熔岩、蒸汽、过热蒸汽、UU物质、压缩空气)添加 `.craftRemainder(mio_icif_cells.CELL_EMPTY.get())` 属性
  - 影响文件:`mio_icif_cells.java`
  - 效果:流体单元参与合成时,合成结果会正确返回空单元,与原版桶返回空桶的行为一致

### Curios 模组兼容性修复
- **修复未安装 Curios 模组时游戏崩溃的问题**
  - 原因:喷气背包胸甲类(`mio_icif_chestplate_jetpack_elc`、`mio_icif_chestplate_advanced_jetpack`)直接实现了 Curios API 的 `ICurioItem` 接口,导致类加载时触发 `ClassNotFoundException`
  - 修复:
    - 移除喷气背包胸甲类的 `ICurioItem` 接口实现,保留普通物品功能
    - 删除旧的 Trinket 目录下的饰品类(已迁移至 `integration/curios` 包)
    - 所有 Curios 相关代码已隔离至 `integration/curios` 包中,仅在 Curios 已安装时通过反射延迟加载
  - 影响文件:`mio_icif_chestplate_jetpack_elc.java`、`mio_icif_chestplate_advanced_jetpack.java`、`CuriosIntegration.java`

### 超导合金导线电压等级修复
- **修复超导合金导线耐压过低导致爆炸的问题**
  - 原因:`mio_icif_wire.java` 和 `mio_icif_wire_isolation.java` 中缺少 LuV 等级的处理分支
  - `getConductorBreakdownEnergy()` 回退到默认值 33,导致导线在超过 33 EU/t 时爆炸
  - `getInsulationEnergyAbsorption()` 回退到默认值 8/32,绝缘吸收阈值极低
  - `getConductionLoss()` 回退到默认值 0.002/0.0015,存在不必要的传导损耗
  - 修复:为 LuV 等级添加正确的数值:
    - `getConductorBreakdownEnergy()` → 32769
    - `getInsulationEnergyAbsorption()` → 32768
    - `getConductionLoss()` → 0.0(符合超导特性,零损耗)
  - 影响文件:`mio_icif_wire.java`、`mio_icif_wire_isolation.java`

### 模型文件修复
- **修复新电池空电状态显示黑紫块的问题**
  - 原因:主模型 JSON 的 overrides 中 lev0 指向的子模型文件不存在
  - 修复:补全 5 种新电池的 lev0 独立模型文件
  - 影响文件:`item_super_lapotron_crystal_lev0.json`、`item_charging_super_lapotron_crystal_lev0.json`、`item_lithium_battery_lev0.json`、`item_adv_lithium_battery_lev0.json`、`item_thorium_battery_lev0.json`

---

## 已知漏洞

### 当 Curios API 饰品效果遗留
- 当卸载了cruios api后,原先佩戴的 "电力飞行指环" 饰品的能力并不会被清除,玩家在生存模式依然能够继续飞行。当玩家死亡后,飞行能力消失。

## 技术改进

### 配方通用标签化
- 新电池配方中所有金属资源统一使用 `c:` 通用标签:
  - `c:plates/tin`、`c:plates/iridium`
  - `c:dusts/lithium`、`c:dusts/thorium`
- 提高与其他 Mod 的兼容性

### 电线系统重构
- **统一电线参数管理**:将所有电线电气参数(导体熔毁能量、绝缘熔毁能量、绝缘吸收阈值、传导损耗、触电伤害)统一收归到 `CableTier` 类中
  - 修改电线参数只需修改 `CableTier.java` 中的实例定义,无需改动多处代码
  - 每个电压等级的所有参数在一处完整呈现
- **删除冗余电线类**:
  - 删除 `mio_icif_wire_isolation.java`(绝缘电线实体类)
  - 删除 `mio_icif_block_wire_isolation.java`(绝缘电线方块类)
  - 删除 `mio_icif_block_wire_superconducting.java`(超导电缆方块类)
  - 所有电线统一使用 `mio_icif_block_wire` 和 `mio_icif_wire`,通过 `insulated` 参数区分绝缘与否
- **绝缘电线设计**:绝缘电线本质就是没有触电伤害的电线,`insulated=true` 时触电伤害自动为 0

### 电缆过载融毁稳定性修复
- **修复低等级电线连接高等级电网时融毁行为不稳定的问题**
  - 原因:能源分配使用随机路径排序,导致同一物理设置在不同 tick 产生不同结果
  - 修复:添加基于源电压等级的过载检查,如果源可以提供的电压超过路径中最弱电缆的承受能力,则必定触发融毁
  - 效果:IV 电网 + EV 电线 → 必定融毁;IV 电网 + IV 电线 → 不会融毁
  - 影响文件:`EnergyCalculator.java`

### 电缆融毁后机器无法充电修复
- **修复电缆过载融毁导致电网分裂后,分裂出的新电网中的机器无法继续充电的问题**
  - 原因:当导体电缆融毁时,`Grid.remove()` 会将原电网分裂成多个子电网。但新创建的子电网对象没有被标记为 dirty,导致 `GridUpdater.notifyCalculator()` 不会处理它,路径缓存(`GridData`)没有被更新,能源分配计算跳过这些新电网
  - 修复:在 `Grid.remove()` 中创建新电网后调用 `grid.invalidate()`,确保新电网被标记为 dirty,下一个 tick 会重新计算路径缓存
  - 效果:EV电线融毁后,剩余电网中的机器可以立即恢复正常充电,无需手动敲掉方块重新放置来触发电网更新
  - 影响文件:`src/main/java/com/singularity_iteration/mio_icif/energy/grid/Grid.java`

### 世界加载初期过载检测失效修复
- **修复进入世界后约1分钟内电缆过载检测不生效的问题**
  - 原因:世界加载期间方块实体逐步注册,`hasPendingChanges` 持续为 true,导致 `startTransferCalc()`(能源分配+过载检测)从不执行
  - 修复:在 `onTickEnd()` 中始终调用 `startTransferCalc()`,确保即使有 pending changes 也执行能源分配和过载检测
  - 效果:进入世界后电缆过载检测立即生效,无需等待所有方块加载完成
  - 影响文件:`EnergyNetLocal.java`

### METS 超导合金导线兼容性确认
- 确认 METS 的超导合金导线对应 LuV 等级(32768 EU/t)
- 与现有 `CableTier.LuV` 完全兼容,无需新增电压值

### METS 转子系统移植
从 More Electric Tools (METS) 模组移植了 4 种转子组件:

- **钛铁合金转子** — 耐久 192,800,直径 9,效率 91%,最小风力 12,最大风力 100
- **超级铱合金转子** — 耐久 MAX_INT(不损毁),直径 11,效率 100%,最小风力 18,最大风力 155
- **钛铁合金扇叶** — 转子合成材料
- **超级铱合金扇叶** — 转子合成材料

所有转子均支持风力/水力动能发生机,带有完整的 3D 渲染、耐久度显示和 enchantable/mending 附魔支持。

### 铱金散热器系统
从 METS 移植了 2 种高级核反应堆散热片:

- **铱金散热器** — 4,000 热量存储,自身散热 36/s,不从反应堆吸热
- **铱金超频散热器** — 4,000 热量存储,自身散热 56/s,从反应堆吸热 72/s

---

## 系统重构

### 转子系统 IC2 兼容重构
将转子系统从硬编码 `RotorType` 枚举重构为 IC2 风格的物品自带属性模式:

- **`mio_icif_rotor.java`** — 新增 `diameter`、`efficiency`、`minWindStrength`、`maxWindStrength`、`renderTexture`、`waterCompatible` 属性
- **`mio_icif_Wind_Kinetic_Generator.java`** — 移除 `RotorType` 枚举和字符串匹配,改为从转子物品读取属性;输出公式对齐 IC2:`KU = windStrength × efficiency × 10`;新增过载损伤(风力 > maxWindStrength 时 4 倍损伤)
- **`mio_icif_Water_Kinetic_Generator.java`** — 移除 `RotorType` 枚举;水力准入改为 `rotor.isWaterCompatible()` 判断;振幅从转子直径派生

### 转子渲染器光照修复
修复转子 3D 渲染过暗的问题:

- 原因:使用 `getBrightness(LightLayer.BLOCK)` 在客户端渲染时返回 0
- 修复:改用 `LevelRenderer.getLightColor(level, pos.relative(facing))`,在转子实际位置采样光照
- 对齐 IC2 1.12.2 的 `world.getCombinedLight(pos.offset(facing), 0)` 行为
- 影响文件:`mio_icif_RotorRender.java`、`mio_icif_WaterRotorRender.java`

---

## 新增内容

### 合成配方
- **钛铁合金扇叶**:`c:plates/titanium` × 3 + `c:ingots/titanium` × 3(3×3 PSP 排列)
- **超级铱合金扇叶**:`c:plates/super_iridium` × 3 + `c:ingots/super_iridium` × 3(3×3 PSP 排列)
- **钛铁合金转子**:钛铁合金扇叶 × 4 + `c:shafts/titanium`(经典十字形)
- **超级铱合金转子**:超级铱合金扇叶 × 4 + `c:shafts/titanium`(经典十字形)
- **铱金散热器**:`c:casings/titanium` × 4 + `c:plates/niobium_titanium` × 2 + 高级散热片 × 2 + `c:ingots/iridium`
- **铱金超频散热器**:电动马达 × 4 + `c:plates/niobium_titanium` × 2 + 超频散热片 × 2 + `c:ingots/iridium`

### 物品标签
- `c:rotors/titanium_iron_alloy` — 钛铁合金转子
- `c:rotors/super_iridium_alloy` — 超级铱合金转子
- `c:rotor_blades/titanium_iron_alloy` — 钛铁合金扇叶
- `c:rotor_blades/super_iridium_alloy` — 超级铱合金扇叶
- `c:heat_vents/iridium` — 铱金散热器
- `c:heat_vents/iridium_overclocked` — 铱金超频散热器
- `c:plates/super_iridium` — 致密超级铱合金板(新建)

---

## 修复

### 转子渲染过暗修复
- **修复转子 3D 渲染全黑的问题**
  - 原因:使用 `getBrightness(LightLayer.BLOCK, pos)` 在客户端返回 0
  - 修复:改用 `LevelRenderer.getLightColor(level, pos.relative(facing))` 在转子实际位置采样光照
  - 影响文件:`mio_icif_RotorRender.java`、`mio_icif_WaterRotorRender.java`

---

## 技术改进

### 物品属性驱动设计
- 转子物品不再依赖字符串匹配判断类型,而是通过构造函数参数直接携带所有属性
- 新增转子类型无需修改发电机或渲染器代码,只需注册新物品并传入属性
- 与 IC2 1.12.2 的 `IKineticRotor` 接口设计理念一致

### 渲染器代码精简
- 移除硬编码的 `TEXTURE_WOOD/IRON/...` 纹理常量
- 移除硬编码的 `PIXEL_HEIGHT_*` 像素高度常量
- 改为从转子物品的 `getRenderTexture()` 和 `getDiameter()` 动态读取
- `getTexturePixelHeight(diameter)` 按直径映射(5→37, 7→46, 9→58, 11→91)

## 新增内容

### METS 富集作物移植
从 More Electric Tools (METS) 模组移植了 6 种富集作物:

- **富铁作物** — 产出铁粒(原版 `minecraft:iron_nugget`)
- **富铜作物** — 产出铜粒(`mio_icif:resource/item_copper_nugget`)
- **富锡作物** — 产出锡粒(`mio_icif:resource/item_tin_nugget`)
- **富钛作物** — 产出钛粒(`mio_icif:resource/item_titanium_nugget`)
- **富铅作物** — 产出铅粒(`mio_icif:resource/item_lead_nugget`)
- **富铀作物** — 产出铀238粒(`mio_icif:resource/item_uran_238_small`),不支持骨粉催熟

所有作物支持两种种植方式:
1. **原版耕地** → 放置富集作物方块(8个生长阶段)
2. **IC2作物架** → 使用IC2植物系统

### 种子物品
- 6 种富集种子已添加到创造模式物品栏
- 种子已加入 `minecraft:villager_plantable_seeds` 标签(农民村民可拾取)
- 种子已加入 `c:seeds` 标签(NeoForge 通用种子标签)

### 战利品表
每种作物成熟时掉落:
- 1 个种子(必掉)
- 1~3 个作物产物(成熟时掉落)
- 铀作物额外有概率掉落铀235粒(39%)和钚粒(19%)

---

## 修复

### 作物方块黑紫块修复
- **修复富集作物方块和种子显示黑紫块的问题**
  - 原因:物品模型和方块状态文件路径与注册名不匹配
  - 修复:将模型文件移入正确的子目录
  - 物品模型:`models/item/crop/*_rich_seed.json`
  - 方块状态:`blockstates/crop/*_rich_crop.json`
  - 战利品表:`loot_tables/blocks/crop/*_rich_crop.json`

### 作物方块透明渲染修复
- **修复富集作物方块不透明的问题**
  - 原因:模型文件缺少 `render_type` 属性
  - 修复:为所有 48 个作物方块模型添加 `"render_type": "cutout"`

### 作物掉落物修复
- **修复破坏作物方块不掉落物品的问题**
  - 原因1:`UniformCropTemplate` 继承自 `BushBlock`,缺少掉落物逻辑
  - 原因2:使用 `ofFullCopy(Blocks.WHEAT)` 复制了小麦的战利品表,导致自定义战利品表不生效
  - 修复:
    - 将基类改为 `CropBlock`(原版作物基类)
    - 使用基本属性而非复制小麦属性
    - 移除手动重写的 `useItemOn` 方法,让 `CropBlock` 原版机制处理骨粉

### 骨粉催熟修复
- **修复使用骨粉催熟时作物被破坏、耕地变泥土的问题**
  - 原因:手动重写的 `useItemOn` 方法与 `CropBlock` 原版骨粉处理机制冲突
  - 修复:移除 `useItemOn` 重写,使用 `CropBlock` 的原版骨粉处理

### 编译错误修复
- **修复 `MapCodec.unit()` 导致的 intrusive holder 未注册崩溃**
  - 原因:`MapCodec.unit(new XxxRichCrop())` 创建了未注册的块实例
  - 修复:改用 `simpleCodec(XxxRichCrop::new)`,与项目其他方块一致

---

## 代码重构

### 去除 METS 字样
- **重命名 Java 包路径**
  - `Blocks/Crop/METS/` → `Blocks/Crop/Enriched/`
  - `Items/Crop/METS/` → `Items/Crop/Enriched/`
- **更新所有引用文件**
  - `mio_icif_blocks.java` — 6 个 import
  - `mio_icif_normal.java` — import + 注释
  - `CropRegistryEvent.java` — 注释
  - `RichSeedItem.java` — package + import + 注释
- **更新纹理路径**
  - `textures/block/mets_crop/` → `textures/block/enriched_crop/`
  - 所有模型 JSON 中的纹理引用同步更新

### 作物类结构优化
- **`UniformCropTemplate` 重构**
  - 基类从 `BushBlock` 改为 `CropBlock`
  - 移除手动重写的 `useItemOn`、`mayPlaceOn` 方法
  - 保留 `getBaseSeedId()` 重写以返回正确的种子
  - 修复 `ItemLike` import 路径(`net.minecraft.world.level.ItemLike`)
- **子类构造函数模式**
  - 添加 `Properties` 构造器用于 codec
  - 保留无参构造器用于注册
  - `codec()` 方法改为 `public` 返回 `MapCodec<? extends CropBlock>`

---

## 新增内容

### METS 电力装备移植
从 More Electric Tools (METS) 模组移植了 4 种电力装备:

- **潜水面具** — 100,000 EU 容量,128 EU/t 充电速率,Tier 2。水下时消耗 15 EU/t 自动恢复 1 点氧气值
- **进阶电力超频喷气背包** — 1,000,000 EU 容量,512 EU/t 充电速率,Tier 3。支持喷气/悬停双飞行模式,无护甲值
- **重型量子胸甲** — 10,000,000 EU 容量,4,096 EU/t 充电速率,Tier 4。9点护甲值,2.0韧性,低血量自动治疗(20%阈值),+1.0击退抗性,防火
- **进阶量子胸甲** — 100,000,000 EU 容量,8,192 EU/t 充电速率,Tier 5。9点护甲值,2.0韧性,喷气/悬停飞行,自动治疗,+0.5击退抗性,防火

所有电力护甲继承项目自有的 `mio_icif_armor_elc` 基类,使用耐久度系统存储能量,不消耗传统耐久度。

### 自定义盔甲材料
新增 `MioIcifArmorMaterials` 类,为重型和进阶量子胸甲提供独立盔甲材料:
- 胸甲防御 9 点(高于下界合金胸甲的 8 点)
- 盔甲韧性 2.0
- 修理材料为下界合金锭
- 穿戴音效为下界合金装备音效

### 合成配方
- **潜水面具**: 玻璃板 + 青铜板 + 基础电路 + 橡胶
- **进阶电力超频喷气背包**: 碳板 + 碳纤维板 + 基础电路 + 电动马达
- **重型量子胸甲**: 高级电路 + 铱板 + 下界合金锭 + 量子胸甲
- **进阶量子胸甲**: 高级电路 + 活体电路 + 超级电容 + 重型量子胸甲

### 护甲模型纹理
新增 4 个护甲纹理文件:
- `textures/armor/diving_mask_1.png`
- `textures/armor/advanced_jetpack_1.png`
- `textures/armor/heavy_quantum_1.png`
- `textures/armor/advanced_quantum_1.png`

---

## 修复

### 能源转换器EU->FE转换修复
- **修复能源转换器EU转FE模式无法输出FE的问题**
  - 原因:`FEEnergyStorage.receiveEnergy()` 检查 `canReceive` 标志,EU->FE模式下该标志为false,导致内部转换产生的FE也无法存入
  - 修复:添加 `receiveEnergyInternal()` 方法,允许内部转换绕过 `canReceive` 检查直接存入FE
  - 影响文件:`mio_icif_energy_converter_entity.java`
- **删除冗余的昂贵合成配方**
  - 删除了使用高级机器外壳和HV-EV变压器的昂贵配方
  - 保留使用基础机器外壳和MV-HV变压器的配方

---

## 新增内容

### METS 电力工具移植
从 More Electric Tools (METS) 模组移植了 4 种电力工具:

- **电力营养供应器** — 10,000 EU 容量,32 EU/t 传输速率,Tier 1,每次消耗 100 EU 自动补充饥饿值
- **电力生命维护仪** — 1,000,000 EU 容量,2048 EU/t 传输速率,Tier 3,每次消耗 1000 EU 自动恢复生命值
- **电力伤害吸收仪** — 1,000,000 EU 容量,512 EU/t 传输速率,Tier 2,每次消耗 5000 EU 提供 10 点吸收值(30秒)
- **电动鱼竿** — 自动钓鱼工具,修复了 `canPerformAction` 返回正确的钓鱼动作集合
- **电力光源产生器** — 200,000 EU 容量,128 EU/t 传输速率,每次消耗 500 EU 放置电力光源方块

所有仪表均实现 `ToggleableElectricTool` 接口,使用 **G 键** 切换开关状态,手持时 `inventoryTick` 自动生效。

### 电力光源方块
- **新增 `block_electric_light` 方块** — 由电力光源产生器放置
  - 光照等级 15(最大亮度)
  - 无碰撞箱、瞬间破坏
  - 选中框为 0.3~0.7 的小立方体(与 METS 原版对齐)
  - 不在创造模式标签页中显示(仅由工具放置)
  - 使用末地烛(END_ROD)粒子效果作为视觉反馈
  - 无模型纹理渲染(`RenderShape.INVISIBLE`)

---

## 修复

### 电力光源产生器重构
- **将放置目标从原版火把改为自定义电力光源方块**
  - 原因:原版火把需要固体支撑面,限制了放置位置
  - 修复:新增 `mio_icif_block_electric_light` 方块,无支撑要求,可放置在任意位置
  - 对齐 METS 原版 `LighterBlock` 的无碰撞、小选中框特性
  - 影响文件:`mio_icif_electric_lighter.java`、`mio_icif_block_electric_light.java`、`mio_icif_blocks.java`

### 电动鱼竿修复
- **修复钓鱼钩被立即丢弃的问题**
  - 原因:`canPerformAction` 未返回 `DEFAULT_FISHING_ROD_ACTIONS`
  - 修复:添加正确的 `canPerformAction` 实现
  - 影响文件:`mio_icif_electric_fishing_rod.java`

### 编译错误修复
- **修复 `DEFAULT_PLACEMENT_ACTIONS` 不存在的问题**
  - 原因:当前 NeoForge 版本中不存在该字段
  - 修复:改为 `return true` 允许放置操作
  - 影响文件:`mio_icif_electric_lighter.java`

---

## 技术改进

### 方块对齐 METS 原版
- **`mio_icif_block_electric_light` 对齐 METS `LighterBlock`**
  - 选中框:`0.3~0.7` 小立方体(与 METS `AxisAlignedBB(0.3, 0.3, 0.3, 0.7, 0.7, 0.7)` 一致)
  - 注册方式:`registerBlockNoItem`(不自动生成 BlockItem,与 METS `setCreativeTab(null)` 对齐)
  - 渲染方式:`RenderShape.INVISIBLE` + END_ROD 粒子(替代 METS 的 TESR 彩色 billboard 渲染)

---

## 新增内容

### METS 武器移植
从 More Electric Tools (METS) 模组移植了 8 种武器:

- **量子剑** — 1,000,000 EU 容量,4,096 EU/t 充电速率,Tier 4。8点攻击伤害,+3攻击范围,右键发射能量弹
- **电力激光镭射步枪** — 100,000 EU 容量,512 EU/t 充电速率,Tier 2。6点攻击伤害,每次射击消耗 500 EU
- **进阶电力激光镭射步枪** — 1,000,000 EU 容量,2,048 EU/t 充电速率,Tier 3。8点攻击伤害,每次射击消耗 1000 EU
- **铱制刺刀战术激光镭射步枪** — 10,000,000 EU 容量,4,096 EU/t 充电速率,Tier 4。10点攻击伤害,每次射击消耗 2000 EU
- **等离子空气炮** — 500,000 EU 容量,1,024 EU/t 充电速率,Tier 3。发射等离子弹,AOE爆炸伤害
- **电力等离子电浆发射器** — 2,000,000 EU 容量,2,048 EU/t 充电速率,Tier 4。发射高能等离子弹,大范围AOE
- **钢制防爆盾** — 50,000 EU 容量,128 EU/t 充电速率,Tier 1。6点护甲值,格挡时消耗能量
- **纳米复合弓** — 500,000 EU 容量,512 EU/t 充电速率,Tier 3。使用箭矢,每次射击消耗 300 EU

### 弹药系统
- **能量弹** — `mio_icif_energy_bullet`,基础弹道实体,支持AOE和爆炸
- **等离子弹** — `mio_icif_plasma_bullet`,高能弹道实体,大范围AOE爆炸
- **激光弹** — `mio_icif_laser_bullet`,高速弹道实体,穿透效果

---

## 修复

### 能量弹破坏方块修复
- **修复能量弹命中方块时破坏方块的问题**
  - 原因:`onBlockHit()` 中调用了 `destroyBlock()`,METS 原版子弹不会破坏方块
  - 修复:移除 `destroyBlock()` 调用,仅保留 AOE 伤害和爆炸效果
  - 影响文件:`mio_icif_energy_bullet.java`

### 盾牌黑色纹理修复
- **修复钢制防爆盾显示黑色纹理的问题**
  - 原因1:纹理路径错误(`entity/item_tool_electric_shield` vs `item/item_tool_steel_shield`)
  - 原因2:渲染类型不支持透明
  - 修复:复制 METS 原版纹理到正确路径,使用 `entityCutout` 渲染类型,创建 `builtin/entity` 模型
  - 影响文件:`mio_icif_steel_shield.java`、`mio_icif_ShieldRenderer.java`

### 纳米弓耐久bug修复
- **修复纳米弓能量消耗导致耐久异常的问题**
  - 原因:`consumeEnergy()` 使用剩余能量值设置 damageValue
  - 修复:改为用 `currentDamage + amount` 递增
  - 影响文件:`mio_icif_nano_bow.java`

### 纳米弓不发射箭矢修复
- **修复纳米弓拉满弓后不发射箭矢的问题**
  - 原因:`releaseUsing()` 未在 `!level.isClientSide` 中创建箭矢实体
  - 修复:添加服务端检查,确保箭矢在服务端生成
  - 影响文件:`mio_icif_nano_bow.java`

### 等离子枪无效果修复
- **修复等离子枪射击无AOE/爆炸效果的问题**
  - 原因:`onHitBlock()` 为空,不触发任何效果
  - 修复:重写 `tick()` 手动检测碰撞,添加 `onBlockHit()` 处理 AOE 和爆炸
  - 影响文件:`mio_icif_plasma_air_cannon.java`、`mio_icif_plasma_bullet.java`

### 合成配方错误修复
- **修复多个武器配方引用不存在物品ID的问题**
  - `item_adcircuit` → `item_advcircuit`(高级电路)
  - `item_mets_super_circuit` → `item_super_circuit`(超级电路)
  - `item_mets_living_circuit` → `item_living_circuit`(活体电路)
  - 影响文件:所有武器合成配方 JSON

---

## 技术改进

### 弹道实体系统
- **统一弹道实体基类**:所有弹药继承自 `ThrowableProjectile`
- **手动碰撞检测**:通过 `level().clip()` 进行精确的方块/实体碰撞检测
- **穿透机制**:支持 `remainingPierces` 属性,允许多次穿透实体
- **AOE 伤害**:支持范围伤害和爆炸效果

### 武器能量系统
- 所有武器使用项目自有的能量管理接口
- `consumeEnergy()` 和 `hasEnoughEnergy()` 方法统一能量消耗逻辑
- 能量存储使用耐久度系统,与项目其他电力工具一致

### 盾牌渲染
- 使用 `builtin/entity` 模型类型支持 3D 盾牌渲染
- 自定义 `ShieldRenderer` 处理盾牌模型和纹理
- 支持透明纹理和 `entityCutout` 渲染类型

---

## 新增内容

### METS 饰品移植(Curios 集成)
从 More Electric Tools (METS) 模组移植了 5 种 Curios 饰品:

- **电力防火项链** — 100,000 EU 容量,128 EU/t 传输速率,Tier 2。着火或站在岩浆中时消耗 200 EU/t 施加 3 级防火效果
- **能量水晶腰带** — 2,000,000 EU 容量,512 EU/t 传输速率,Tier 3。每 10 tick 为物品栏主手物品充电,传输上限 512 EU/t
- **兰波顿水晶腰带** — 20,000,000 EU 容量,2048 EU/t 传输速率,Tier 4。每 10 tick 为物品栏主手物品充电,传输上限 2048 EU/t
- **终极维生指环** — 10,000,000 EU 容量,2048 EU/t 传输速率,Tier 4。自动恢复生命值/饥饿值/吸收之心(上限 20),装备时施加隐藏吸收buff使黄心可见
- **电力飞行指环** — 10,000,000 EU 容量,2048 EU/t 传输速率,Tier 4。消耗 EU 提供飞行能力,支持悬停/前进/加速模式

所有饰品均通过 Curios API 注册到护符/腰带/戒指槽位,使用与喷气背包/量子甲相同的 `JetpackKeyHandler` 按键系统。

### 合成配方
- **电力防火项链**:钛壳 × 3 + 锂电池 + 精英电路 + 烈焰棒
- **能量水晶腰带**:碳板 + 精英电路 + 钛板 + 能量水晶(中心)
- **兰波顿水晶腰带**:铌钛板 × 4 + 精英电路 × 4 + 能量水晶腰带 + 兰波顿水晶(中心)
- **终极维生指环**:致密超级铱合金板 × 4 + 电力伤害吸收仪 + 电力生命维护仪 + 电力营养供应器 + 兰波顿水晶腰带 + 超级兰波顿水晶
- **电力飞行指环**:铌钛板 × 4 + 精英电路 × 4 + 兰波顿水晶 + 能量水晶 + 高级喷气背包

### 物品标签
- `curios:necklace` — 电力防火项链
- `curios:belt` — 能量水晶腰带、兰波顿水晶腰带
- `curios:ring` — 终极维生指环、电力飞行指环

### 创造模式物品栏
在 `mio_icif:tools` 物品栏新增 **METS 移植饰品** 分组,包含全部 5 个饰品。

---

## 修复

### 防火项链能量消耗修复
- **修复防火项链一直消耗能量的问题**
  - 原因:原实现每 tick 无条件施加防火效果并消耗能量
  - 修复:改为仅在玩家着火或站在岩浆中时才消耗能量并施加防火
  - 影响文件:`ElectricFireProofNecklace.java`

### 维持生命指环吸收之心修复
- **修复吸收之心无法显示的问题**
  - 原因:1.21.1 中 `LivingEntity.setAbsorptionAmount()` 会将值 clamping 到 `getMaxAbsorption()`,而基础值为 0
  - 修复:装备时施加隐藏的 `ABSORPTION` 药水效果(amplifier 4 → 最大吸收 20),使 `setAbsorptionAmount()` 不再被 clamped 到 0
  - 影响文件:`ElectricLifeSupportRing.java`

### 飞行指环飞行控制修复
- **修复飞行指环无法飞行的问题**
  - 原因:原实现依赖 `abilities.mayfly` 字段,在 NeoForge 1.21.1 中该字段已弃用,客户端侧无法正确同步飞行状态
  - 修复:完全重写飞行逻辑,改为直接控制玩家运动(`setDeltaMovement`),与喷气背包/量子甲相同架构
    - 使用 `JetpackKeyHandler` 做服务端按键检测(空格上升、Shift 下降、W 前进、左Ctrl 加速)
    - 在空中自动悬停,停止按键时保持滞空
    - 每 tick 重置 `fallDistance` 免疫摔落伤害
    - 电量低于 5% 时推力逐渐衰减,耗尽后正常落体
  - 影响文件:`ElectricFlightRing.java`

---

## 技术改进

### Curios 饰品基类设计
- 新建 `mio_icif_trinket_elc.java` 基类,继承 `mio_icif_tool_elc` + 实现 `ICurioItem`
- 统一处理装备/卸下时的能量状态管理
- 提供 `consumeEnergy()`、`hasEnoughEnergy()`、`getEnergy()`、`getMaxEnergy()` 等快捷方法

### Curios 槽位配置
- 新增 `data/mio_icif/curios/entities/player.json`,分配 necklace/belt/ring 槽位
- 重建 `necklace.json`、`belt.json`、`ring.json` 物品标签

### 飞行指环按键系统
- 采用项目已有的 `JetpackKeyHandler` 服务端按键检测管线
- 与 `mio_icif_chestplate_jetpack_elc`、`mio_icif_boots_quantum` 使用相同的按键映射
- Boost 键默认绑定左 Ctrl,可在按键设置中自定义

---

## 新增内容

### 高级采矿机超频升级支持
对齐 IC2 1.12.2 原版高级采矿机的超频升级机制:

- **工作周期**:固定 20 ticks/周期(不再随超频缩短周期)
- **超频效果**:每增加 1 个超频升级,每周期多挖掘 5 个方块
- **每周期挖掘数**:`5 × (overclockerCount + 1)`
  - 0 超频 → 5 方块/周期(平均 4 ticks/方块)
  - 1 超频 → 10 方块/周期(平均 2 ticks/方块)
  - 2 超频 → 15 方块/周期(平均 1.33 ticks/方块)
  - 3 超频 → 20 方块/周期(平均 1 tick/方块)
- **能量消耗**:每挖掘 1 个方块消耗 512 EU(机器)+ 64 EU(扫描器),不受超频倍率影响

影响文件:`mio_icif_advanced_miner_elc.java`

---

## 新增内容

### 超频升级配方扩展
对齐 IC2 1.12.2 原版,新增使用高级冷却单元合成超频升级的配方:

- **10k冷却单元** → 产出 **2个** 超频升级
  - 配方:`C C C / W E W`
  - C = 10k冷却单元,W = 锡导线,E = 基础电路

- **30k冷却单元** → 产出 **6个** 超频升级
  - 配方:`C C C / W E W`
  - C = 30k冷却单元,W = 锡导线,E = 基础电路

- **60k冷却单元** → 产出 **12个** 超频升级
  - 配方:`C C C / W E W`
  - C = 60k冷却单元,W = 锡导线,E = 基础电路

影响文件:`shaped_167_overclocker_upgrade.json`、`shaped_overclocker_upgrade_30k.json`、`shaped_overclocker_upgrade_60k.json`

---

## 修复

### 高级采矿机黑白名单过滤槽持久化修复
- **修复关闭GUI后黑白名单虚物品丢失的问题**
  - 原因:`MenuType` 使用简单工厂 `AdvancedMinerElcMenu::new`,客户端创建菜单时无法获取 blockEntity,PhantomSlot 的 `getItem()`/`set()` 捕获了创建时的 null 引用,导致过滤数据无法读写
  - 修复:
    - 将 `MenuType` 工厂改为 `IContainerFactory`,服务端通过 `NetworkHooks.openScreen` 发送方块坐标
    - 客户端菜单通过坐标查找 blockEntity,动态调用 `getMinerBlockEntity()`
    - `PhantomSlot` 的 `getItem()`/`set()` 改为动态调用,不再捕获 null 引用
  - 影响文件:`mio_icif_block_advanced_miner_elc.java`、`AdvancedMinerElcMenu.java`、`mio_icif_menus.java`

### 高级采矿机Screen升级槽tooltip移除
- **移除升级槽区域的悬浮提示信息**
  - 原因:升级槽上悬浮显示各升级数量的tooltip与游戏风格不符
  - 修复:删除 `render()` 方法中的升级信息提示块及未使用的 `ArrayList` import
  - 影响文件:`mio_icif_gui_advanced_miner_elc.java`

### 电池槽红石消耗逻辑统一
- **统一所有机器的电池槽红石消耗逻辑,与储能方块保持一致**
  - 原因:`mio_icif_producer`(机器)和 `mio_icif_Energy_Container`(储能方块)对红石的处理逻辑不一致
  - 修复:移除机器端多余的 `isWorking` 检查,红石消耗逻辑与储能方块完全一致——只要储能未满就消耗红石充能(1红石=800EU)
  - 影响文件:`mio_icif_producer.java`

### 红石消耗对齐IC2原版行为
- **修复红石在储能空缺不足800EU时无法被消耗的问题,对齐IC2原版行为**
  - 原因:之前要求储能空缺 ≥ 800EU 才消耗红石,但IC2原版只要储能有任何空间(>0)即消耗红石
  - 修复:移除 `spaceAvailable >= 800` 的前置检查,改为有任何空间即消耗红石(实际添加量以 `Math.min(800, spaceAvailable)` 为上限,防止溢出)
  - 影响文件:`mio_icif_producer.java`、`mio_icif_Energy_Container.java`

### 管道战利品表补充
- **修复所有4种管道方块破坏后不掉落物品的问题**
  - 原因:数据生成器中缺少 `dropSelf(PIPE_WATER_EXTRACT)`,且未手写战利品表JSON文件
  - 修复:
    - 在数据生成器中添加 `dropSelf(PIPE_WATER_EXTRACT)`
    - 手写4个管道战利品表JSON文件:
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_water.json`
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_water_extract.json`
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_item_input.json`
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_item.json`
  - 影响文件:`mio_icif_BlockLootTable_Generator.java`、4个新战利品表JSON

---

## 技术改进

### 菜单坐标传输
- 高级采矿机方块使用 `player.openMenu(menuProvider, buf -> buf.writeBlockPos(pos))` 打开GUI
- 与电动分拣机(`mio_icif_block_sorter_elc`)使用相同的坐标传输模式
- 客户端菜单通过 `RegistryFriendlyByteBuf` 接收坐标并查找 blockEntity

---

## 技术改进

### 电网 FE 兼容集成
- **电网原生支持 FE 能源能力机器**
  - 新增 `ILocatableTile` 接口,支持非 BlockEntity 的 IEnergyTile 注册到电网
  - 新增 `FECompatTile` 类,作为 FE 机器的电网代理,实现 `IEnergySink` 接口
  - 电线和储能容器每 tick 扫描相邻方块,自动管理 FE 代理 tile 的注册/注销
  - 能量转换比例:**1 EU = 4 FE**,与 EnergyBridge 保持一致
  - FE 机器的 Sink Tier 根据其最大储能量自动计算(≥8192×4=EV tier 4,≥2048×4=HV tier 3,≥512×4=MV tier 2,否则 LV tier 1)
  - 电线方块连接检测新增 NeoForge FE 能力检查,确保模型连接线正确显示
  - 影响文件:`ILocatableTile.java`、`FECompatTile.java`、`EnergyNetGlobal.java`、`mio_icif_wire.java`、`mio_icif_Energy_Container.java`、`mio_icif_block_wire.java`

### 电网电压过载配置开关
- **新增 `EnergyNet.enableVoltageOverload` 配置项(默认 true)**
  - 设置为 `false` 时,禁用所有因电压等级不匹配导致的过载效果:
    - 电线不再因超压而熔毁(`removeConductor`)
    - 电线不再因超压而剥离绝缘层(`removeInsulation`)
    - 机器不再因注入超压能量包而爆炸
    - 生物不再因靠近过载电线而受到闪电伤害
  - 能量仍正常传输和分配,仅移除破坏性后果
  - 影响文件:`Singularity_Iteration_Config.java`、`EnergyCalculator.java`

### 流体接触效果对齐IC2原版
- **新增自定义流体方块类 `mio_icif_block_fluid_effect`,实现玩家接触流体时的药水效果**
  - 对齐 IC2 1.12.2 原版 `BlockIC2Fluid` 的行为:
    - **建筑泡沫** → 饥饿 III(15秒)
    - **UU物质** → 生命恢复 II(5秒)
    - **蒸汽/过热蒸汽** → 夜视(15秒)
    - **热水**(玩家着火时)→ 防火(5秒);(玩家未着火时)→ 生命恢复 I~II(5秒)
    - **绳状熔岩** → 点燃10秒
    - **热冷却液** → 点燃30秒
  - 效果不重复施加:已有该效果时跳过,与 IC2 原版一致
  - 影响文件:`mio_icif_block_fluid_effect.java`、`mio_icif_fluids.java`

### 原油与柴油流体通用标签
- **新增 `c:crude_oil` 和 `c:diesel` 流体标签**
  - 包含静止和流动两种状态
  - 影响文件:`data/c/tags/fluid/crude_oil.json`、`data/c/tags/fluid/diesel.json`

---

## 修复

### 高级太阳能发电机电池槽修复
- **修复高级太阳能发电机(4个)的电池槽无法放入/取出电池的问题**
  - 原因1:高级太阳能发电机Menu使用 `addBatterySlot` 方法,但该方法是为单个电池槽设计的,不支持多个电池槽
  - 原因2:`SlotItemHandler` 的 `mayPickup` 方法默认行为可能限制物品取出
  - 修复:
    - 将4个高级太阳能发电机(高级太阳能板、混合太阳能板、终极混合太阳能板、量子太阳能板)的槽位从 `addBatterySlot` 改为自定义的 `addChargingSlot` 方法
    - 在 `addChargingSlot` 中重写 `mayPickup` 方法返回 `true`,允许玩家取出电池
    - 重写 `mayPlace` 方法,仅允许电池类物品放入
    - 重写 `getMaxStackSize` 方法,红石可堆叠64,其他物品堆叠1
  - 槽位配置:4个电池槽,位置分别为 (52,26)、(70,26)、(88,26)、(106,26)
  - 方块实体:使用 `SlotLayout.builder().extra(4).build()` 配置4个额外槽位
  - 充电逻辑:重写 `chargeItems()` 方法,遍历所有4个槽位并给每个电池充电
  - 影响文件:
    - `AdvancedSolarPanelMenu.java`、`HybridSolarPanelMenu.java`、`UltimateHybridSolarPanelMenu.java`、`QuantumSolarPanelMenu.java`
    - `mio_icif_AdvancedSolarPanel.java`、`mio_icif_HybridSolarPanel.java`、`mio_icif_UltimateHybridSolarPanel.java`、`mio_icif_QuantumSolarPanel.java`
    - `mio_icif_AdvancedSolarGenerator.java`

### 太阳能发电机电池槽修复
- **修复普通太阳能发电机电池槽无法放入电池的问题**
  - 原因:`SolarGeneratorMenu` 未重写 `isBattery()` 方法,基类默认返回 `false`
  - 修复:添加 `isBattery()` 方法重写,检查物品是否为 `mio_icif_bat` 电池
  - 影响文件:`SolarGeneratorMenu.java`

### 基类电池槽取出修复
- **修复基类 `addBatterySlot` 方法创建的槽位无法取出物品的问题**
  - 原因:`SlotItemHandler` 未重写 `mayPickup` 方法
  - 修复:在 `addBatterySlot` 中添加 `mayPickup` 方法返回 `true`
  - 影响文件:`mio_icif_generator_menu.java`

# Changelog v0.1.7.1

**Release Date**: TBD

---

## New Content

### METS Ported Batteries
Ported 5 advanced batteries from the More Electric Tools (METS) mod:

- **Super Lapotron Crystal** — 100,000,000 EU capacity, 8192 EU/t transfer rate, Tier 5
- **Charging Super Lapotron Crystal** — 400,000,000 EU capacity, 8192 EU/t transfer rate, Tier 5
- **Lithium Battery** — 50,000 EU capacity, 128 EU/t transfer rate, Tier 2, stackable to 16
- **Advanced Lithium Battery** — 200,000 EU capacity, 128 EU/t transfer rate, Tier 2, stackable to 16
- **Thorium Battery** — Near-infinite capacity (Integer.MAX_VALUE), 9 EU/t transfer rate, auto-charging

All batteries support 5-level charge animation textures (lev0-lev4) and are available in both empty and full states in the creative tab.

### Crafting Recipes
Added crafting recipes for all 5 new batteries:
- Lithium Battery: Insulated Tin Cable + Tin Plate + Lithium Dust + Redstone
- Advanced Lithium Battery: Lithium Dust + Advanced Circuit + Lithium Battery
- Super Lapotron Crystal: Iridium Plate + Super Circuit + Lapotron Crystal
- Charging Super Lapotron Crystal: Field Generator + Super Lapotron Crystal + Living Circuit
- Thorium Battery: Thorium Dust + Iridium Plate + RTG Pellet

---

## Fixes

### Upgrade Slot Automation Fix
- **Fixed Ender IO pipes and other mods being able to extract upgrade plugins from upgrade slots**
  - Cause: Machine's `getSlotsForDirection()` returned upgrade slots, allowing pipes/hoppers to access them
  - Fix:
    - Removed upgrade slots from all machines' `getSlotsForDirection()` return arrays
    - Modified `canInsertItem()` method to return `false` for upgrade slots, preventing hopper/pipe insertion
    - Aligned with IC2 vanilla 1.12.2: `InvSlotUpgrade` uses `Access.NONE`, upgrade slots do not participate in any automation interaction
  - Affected files:
    - Base class: `mio_icif_producer.java`
    - Producers: `mio_icif_recycler_elc.java`, `mio_icif_block_cutter.java`, `mio_icif_compressor_elc.java`, `mio_icif_extrator_elc.java`, `mio_icif_powder_elc.java`, `mio_icif_furnace_elc.java`, `mio_icif_induction_elc.java`, `mio_icif_condenser.java`, `mio_icif_metal_former.java`, `mio_icif_harvest_elc.java`, `mio_icif_miner_elc.java`, `mio_icif_pump_elc.java`, `mio_icif_matter_elc.java`, `mio_icif_replicator_elc.java`
  - Effect: Upgrade slots can only be operated manually by players; pipe mods and hoppers cannot transfer upgrade plugins

### Empty Cell Fluid Pickup Fix
- **Fixed empty cells unable to collect custom fluids (distilled water, biogas, etc.)**
  - Cause 1: `getFilledCell()` in `mio_icif_cell.java` checked for cell items instead of bucket items
  - `pickupBlock()` returns a bucket item (e.g., `DISTILLEDWATER_BUCKET`), but code checked `pickupResult.is(mio_icif_cells.CELL_DISTILLEDWATER.get())`, which is always false
  - Fix: Changed all checks from `CELL_X` to corresponding `X_BUCKET`
  - Cause 2: For unsupported fluids (e.g., crude oil, diesel), `pickupBlock()` would remove the fluid but the returned bucket item couldn't be converted, causing the fluid to be swallowed
  - Fix: Added `isSupportedFluid()` method to check fluid type before calling `pickupBlock()`, skipping unsupported fluids
  - Affected file: `mio_icif_cell.java`
  - Effect:
    - Empty cells can now correctly collect all custom fluids including distilled water, biogas, hot water, biomass, construction foam, coolant, hot coolant, pahoehoe lava, steam, superheated steam, UU-matter
    - For unsupported fluids (e.g., crude oil, diesel), empty cells will not interact with them, preventing fluid from being swallowed

### Fluid Cell Crafting Remainder Fix
- **Fixed fluid cells not returning empty cells when used in crafting**
  - Cause: Fluid cells were registered without `craftRemainder` property
  - Fix: Added `.craftRemainder(mio_icif_cells.CELL_EMPTY.get())` to all fluid cells (water, lava, biogas, hot water, biomass, construction foam, coolant, distilled water, hot coolant, pahoehoe lava, steam, superheated steam, UU-matter, compressed air)
  - Affected file: `mio_icif_cells.java`
  - Effect: When fluid cells are used in crafting recipes, the result correctly returns an empty cell, matching vanilla bucket behavior of returning empty buckets

### Curios Mod Compatibility Fix
- **Fixed game crash when Curios mod is not installed**
  - Cause: Jetpack chestplate classes (`mio_icif_chestplate_jetpack_elc`, `mio_icif_chestplate_advanced_jetpack`) directly implemented Curios API's `ICurioItem` interface, causing `ClassNotFoundException` during class loading
  - Fix:
    - Removed `ICurioItem` interface implementation from jetpack chestplate classes, keeping normal item functionality
    - Deleted old trinket classes under Trinket directory (migrated to `integration/curios` package)
    - All Curios-related code isolated in `integration/curios` package, only loaded via reflection when Curios is installed
  - Affected files: `mio_icif_chestplate_jetpack_elc.java`, `mio_icif_chestplate_advanced_jetpack.java`, `CuriosIntegration.java`

### Superconducting Cable Voltage Tier Fix
- **Fixed superconducting cable exploding due to too-low voltage tolerance**
  - Cause: `mio_icif_wire.java` and `mio_icif_wire_isolation.java` were missing LuV tier handling branches
  - `getConductorBreakdownEnergy()` fell back to default value 33, causing wires to explode when exceeding 33 EU/t
  - `getInsulationEnergyAbsorption()` fell back to default value 8/32, extremely low insulation threshold
  - `getConductionLoss()` fell back to default value 0.002/0.0015, unnecessary conduction loss
  - Fix: Added correct values for LuV tier:
    - `getConductorBreakdownEnergy()` → 32769
    - `getInsulationEnergyAbsorption()` → 32768
    - `getConductionLoss()` → 0.0 (matching superconducting property, zero loss)
  - Affected files: `mio_icif_wire.java`, `mio_icif_wire_isolation.java`

### Model File Fixes
- **Fixed new batteries showing purple-black missing texture in empty state**
  - Cause: lev0 sub-model files referenced by main model JSON overrides did not exist
  - Fix: Added missing lev0 model files for all 5 new batteries
  - Affected files: `item_super_lapotron_crystal_lev0.json`, `item_charging_super_lapotron_crystal_lev0.json`, `item_lithium_battery_lev0.json`, `item_adv_lithium_battery_lev0.json`, `item_thorium_battery_lev0.json`

---

## Known Issues

### Curios API Trinket Effect Persistence
- After removing the Curios API, the flight ability from the "Electric Flight Ring" trinket is not cleared; players can still fly in survival mode. The ability disappears after the player dies.

## Technical Improvements

### Recipe Tag Standardization
- All metal resources in new battery recipes now use `c:` generic tags:
  - `c:plates/tin`, `c:plates/iridium`
  - `c:dusts/lithium`, `c:dusts/thorium`
- Improved compatibility with other mods

### Wire System Refactoring
- **Unified wire parameter management**: All wire electrical parameters (conductor breakdown energy, insulation breakdown energy, insulation energy absorption, conduction loss, electric damage) are now centralized in the `CableTier` class
  - Modifying wire parameters only requires changing the instance definition in `CableTier.java`
  - All parameters for each voltage tier are presented in one place
- **Removed redundant wire classes**:
  - Removed `mio_icif_wire_isolation.java` (insulated wire entity class)
  - Removed `mio_icif_block_wire_isolation.java` (insulated wire block class)
  - Removed `mio_icif_block_wire_superconducting.java` (superconducting cable block class)
  - All wires now use `mio_icif_block_wire` and `mio_icif_wire`, distinguished by the `insulated` parameter
- **Insulated wire design**: Insulated wires are essentially wires without electric shock damage; when `insulated=true`, electric damage is automatically 0

### Cable Overload Burnout Stability Fix
- **Fixed inconsistent burnout behavior when low-tier wires connect to high-tier grids**
  - Cause: Energy distribution uses random path ordering, causing different results on different ticks for the same physical setup
  - Fix: Added source voltage tier-based overload check; if a source can provide voltage exceeding the weakest cable's tolerance in a path, burnout is guaranteed
  - Effect: IV grid + EV wire → always burns out; IV grid + IV wire → never burns out
  - Affected file: `EnergyCalculator.java`

### Machine Charging After Cable Meltdown Fix
- **Fixed machines in newly split grids unable to charge after a cable melts due to overload**
  - Cause: When a conductor cable melts, `Grid.remove()` splits the original grid into multiple sub-grids. However, newly created sub-grid objects were not marked as dirty, causing `GridUpdater.notifyCalculator()` to skip them. The path cache (`GridData`) was not updated, so energy distribution calculations skipped these new grids
  - Fix: Call `grid.invalidate()` after creating a new grid in `Grid.remove()`, ensuring new grids are marked as dirty and path caches are recalculated on the next tick
  - Effect: After an EV cable melts, machines in the remaining grid immediately resume normal charging without requiring manual block break-and-replace to trigger a grid update
  - Affected file: `src/main/java/com/singularity_iteration/mio_icif/energy/grid/Grid.java`

### World Load Initial Period Overload Detection Fix
- **Fixed cable overload detection not working for ~1 minute after entering a world**
  - Cause: During world load, tiles register progressively, keeping `hasPendingChanges` continuously true, which prevented `startTransferCalc()` (energy distribution + overload detection) from ever executing
  - Fix: Always call `startTransferCalc()` in `onTickEnd()`, ensuring energy distribution and overload detection run even when there are pending topology changes
  - Effect: Cable overload detection works immediately upon entering a world, without waiting for all tiles to finish loading
  - Affected file: `EnergyNetLocal.java`

### METS Superconducting Cable Compatibility
- Confirmed METS superconducting cable corresponds to LuV tier (32768 EU/t)
- Fully compatible with existing `CableTier.LuV`, no new voltage tier needed

---

## New Content

### METS Rotor System Port
Ported 4 rotor components from the More Electric Tools (METS) mod:

- **Titanium-Iron Alloy Rotor** — 192,800 durability, diameter 9, 91% efficiency, min wind 12, max wind 100
- **Super Iridium Alloy Rotor** — MAX_INT durability (indestructible), diameter 11, 100% efficiency, min wind 18, max wind 155
- **Titanium-Iron Alloy Rotor Blade** — crafting material for rotors
- **Super Iridium Alloy Rotor Blade** — crafting material for rotors

All rotors work in both wind and water kinetic generators, with full 3D rendering, durability display, and enchantable/mending support.

### Iridium Heat Vent System
Ported 2 advanced nuclear reactor heat vents from METS:

- **Iridium Heat Vent** — 4,000 heat storage, self-vents 36/s, does not absorb from reactor
- **Iridium Overclocked Heat Vent** — 4,000 heat storage, self-vents 56/s, absorbs 72/s from reactor

---

## System Refactoring

### Rotor System IC2-Compatible Refactoring
Refactored the rotor system from hardcoded `RotorType` enum to IC2-style item-borne properties:

- **`mio_icif_rotor.java`** — Added `diameter`, `efficiency`, `minWindStrength`, `maxWindStrength`, `renderTexture`, `waterCompatible` properties
- **`mio_icif_Wind_Kinetic_Generator.java`** — Removed `RotorType` enum and string matching; reads properties from rotor items; output formula aligned with IC2: `KU = windStrength × efficiency × 10`; added overload damage (4× damage when wind > maxWindStrength)
- **`mio_icif_Water_Kinetic_Generator.java`** — Removed `RotorType` enum; water eligibility now uses `rotor.isWaterCompatible()`; amplitude derived from rotor diameter

### Rotor Renderer Lighting Fix
Fixed rotor 3D rendering appearing too dark:

- Cause: `getBrightness(LightLayer.BLOCK)` returns 0 during client-side rendering
- Fix: Changed to `LevelRenderer.getLightColor(level, pos.relative(facing))`, sampling light at the rotor's actual position
- Aligned with IC2 1.12.2's `world.getCombinedLight(pos.offset(facing), 0)` behavior
- Affected files: `mio_icif_RotorRender.java`, `mio_icif_WaterRotorRender.java`

---

## New Content

### Crafting Recipes
- **Titanium-Iron Alloy Rotor Blade**: `c:plates/titanium` × 3 + `c:ingots/titanium` × 3 (3×3 PSP arrangement)
- **Super Iridium Alloy Rotor Blade**: `c:plates/super_iridium` × 3 + `c:ingots/super_iridium` × 3 (3×3 PSP arrangement)
- **Titanium-Iron Alloy Rotor**: Titanium-Iron Alloy Rotor Blade × 4 + `c:shafts/titanium` (classic cross shape)
- **Super Iridium Alloy Rotor**: Super Iridium Alloy Rotor Blade × 4 + `c:shafts/titanium` (classic cross shape)
- **Iridium Heat Vent**: `c:casings/titanium` × 4 + `c:plates/niobium_titanium` × 2 + Advanced Heat Vent × 2 + `c:ingots/iridium`
- **Iridium Overclocked Heat Vent**: Electric Motor × 4 + `c:plates/niobium_titanium` × 2 + Overclocked Heat Vent × 2 + `c:ingots/iridium`

### Item Tags
- `c:rotors/titanium_iron_alloy` — Titanium-Iron Alloy Rotor
- `c:rotors/super_iridium_alloy` — Super Iridium Alloy Rotor
- `c:rotor_blades/titanium_iron_alloy` — Titanium-Iron Alloy Rotor Blade
- `c:rotor_blades/super_iridium_alloy` — Super Iridium Alloy Rotor Blade
- `c:heat_vents/iridium` — Iridium Heat Vent
- `c:heat_vents/iridium_overclocked` — Iridium Overclocked Heat Vent
- `c:plates/super_iridium` — Super Iridium Compress Plate (new)

---

## Fixes

### Rotor Rendering Darkness Fix
- **Fixed rotors rendering completely black in 3D**
  - Cause: `getBrightness(LightLayer.BLOCK, pos)` returned 0 on the client side
  - Fix: Changed to `LevelRenderer.getLightColor(level, pos.relative(facing))` to sample light at the rotor's actual position
  - Affected files: `mio_icif_RotorRender.java`, `mio_icif_WaterRotorRender.java`

---

## Technical Improvements

### Item Property-Driven Design
- Rotor items no longer rely on string matching to determine type; all properties are carried via constructor parameters
- Adding new rotor types no longer requires modifying generator or renderer code; just register a new item with the desired properties
- Consistent with IC2 1.12.2's `IKineticRotor` interface design philosophy

### Renderer Code Simplification
- Removed hardcoded `TEXTURE_WOOD/IRON/...` texture constants
- Removed hardcoded `PIXEL_HEIGHT_*` pixel height constants
- Now reads dynamically from rotor item's `getRenderTexture()` and `getDiameter()`
- `getTexturePixelHeight(diameter)` maps by diameter (5→37, 7→46, 9→58, 11→91)

## New Content

### METS Enriched Crops Port
Ported 6 enriched crops from the More Electric Tools (METS) mod:

- **Iron Rich Crop** — drops iron nuggets (vanilla `minecraft:iron_nugget`)
- **Copper Rich Crop** — drops copper nuggets (`mio_icif:resource/item_copper_nugget`)
- **Tin Rich Crop** — drops tin nuggets (`mio_icif:resource/item_tin_nugget`)
- **Titanium Rich Crop** — drops titanium nuggets (`mio_icif:resource/item_titanium_nugget`)
- **Lead Rich Crop** — drops lead nuggets (`mio_icif:resource/item_lead_nugget`)
- **Uranium Rich Crop** — drops uranium-238 nuggets (`mio_icif:resource/item_uran_238_small`), does not support bone meal

All crops support two planting methods:
1. **Vanilla farmland** → places enriched crop block (8 growth stages)
2. **IC2 crop stick** → uses IC2 plant system

### Seed Items
- 6 enriched seeds added to creative tab
- Seeds added to `minecraft:villager_plantable_seeds` tag (farmer villagers can pick up)
- Seeds added to `c:seeds` tag (NeoForge generic seed tag)

### Loot Tables
Each mature crop drops:
- 1 seed (always)
- 1~3 crop products (when mature)
- Uranium crop additionally has chance to drop uranium-235 (39%) and plutonium (19%)

---

## Fixes

### Crop Block Purple-Black Texture Fix
- **Fixed enriched crop blocks and seeds showing purple-black missing texture**
  - Cause: Item model and blockstate file paths did not match registration names
  - Fix: Moved model files to correct subdirectories
  - Item models: `models/item/crop/*_rich_seed.json`
  - Blockstates: `blockstates/crop/*_rich_crop.json`
  - Loot tables: `loot_tables/blocks/crop/*_rich_crop.json`

### Crop Block Transparency Fix
- **Fixed enriched crop blocks rendering as opaque**
  - Cause: Model files missing `render_type` property
  - Fix: Added `"render_type": "cutout"` to all 48 crop block models

### Crop Drop Fix
- **Fixed crop blocks not dropping items when broken**
  - Cause 1: `UniformCropTemplate` extended `BushBlock`, which lacks drop logic
  - Cause 2: Using `ofFullCopy(Blocks.WHEAT)` copied wheat's loot table, overriding custom loot tables
  - Fix:
    - Changed base class to `CropBlock` (vanilla crop base class)
    - Used basic properties instead of copying wheat properties
    - Removed manually overridden `useItemOn` method, letting `CropBlock` handle bone meal natively

### Bone Meal Growth Fix
- **Fixed crop being destroyed and farmland turning to dirt when using bone meal**
  - Cause: Manually overridden `useItemOn` method conflicted with `CropBlock`'s native bone meal handling
  - Fix: Removed `useItemOn` override, using `CropBlock`'s built-in bone meal processing

### Compilation Error Fix
- **Fixed intrusive holder not registered crash from `MapCodec.unit()`**
  - Cause: `MapCodec.unit(new XxxRichCrop())` created an unregistered block instance
  - Fix: Changed to `simpleCodec(XxxRichCrop::new)`, consistent with other blocks in the project

---

## Code Refactoring

### METS Naming Removal
- **Renamed Java package paths**
  - `Blocks/Crop/METS/` → `Blocks/Crop/Enriched/`
  - `Items/Crop/METS/` → `Items/Crop/Enriched/`
- **Updated all referencing files**
  - `mio_icif_blocks.java` — 6 imports
  - `mio_icif_normal.java` — import + comment
  - `CropRegistryEvent.java` — comment
  - `RichSeedItem.java` — package + import + comments
- **Updated texture paths**
  - `textures/block/mets_crop/` → `textures/block/enriched_crop/`
  - Updated texture references in all model JSON files

### Crop Class Structure Optimization
- **`UniformCropTemplate` refactoring**
  - Base class changed from `BushBlock` to `CropBlock`
  - Removed manually overridden `useItemOn` and `mayPlaceOn` methods
  - Kept `getBaseSeedId()` override to return correct seeds
  - Fixed `ItemLike` import path (`net.minecraft.world.level.ItemLike`)
- **Subclass constructor pattern**
  - Added `Properties` constructor for codec
  - Kept no-arg constructor for registration
  - Changed `codec()` method to `public` returning `MapCodec<? extends CropBlock>`

---

## New Content

### METS Electric Equipment Port
Ported 4 electric equipment items from the More Electric Tools (METS) mod:

- **Diving Mask** — 100,000 EU capacity, 128 EU/t charge rate, Tier 2. Consumes 15 EU/t underwater to auto-restore 1 oxygen point
- **Advanced Electric Jetpack** — 1,000,000 EU capacity, 512 EU/t charge rate, Tier 3. Supports jetpack/hover dual flight modes, no armor value
- **Heavy Quantum Chestplate** — 10,000,000 EU capacity, 4,096 EU/t charge rate, Tier 4. 9 armor points, 2.0 toughness, auto-healing at low health (20% threshold), +1.0 knockback resistance, fire resistance
- **Advanced Quantum Chestplate** — 100,000,000 EU capacity, 8,192 EU/t charge rate, Tier 5. 9 armor points, 2.0 toughness, jetpack/hover flight, auto-healing, +0.5 knockback resistance, fire resistance

All electric armor extends the project's own `mio_icif_armor_elc` base class, using durability system to store energy, without consuming traditional durability.

### Custom Armor Materials
Added `MioIcifArmorMaterials` class, providing independent armor materials for heavy and advanced quantum chestplates:
- Chestplate defense 9 points (higher than netherite chestplate's 8 points)
- Armor toughness 2.0
- Repair ingredient is netherite ingot
- Equip sound is netherite armor sound

### Crafting Recipes
- **Diving Mask**: Glass Pane + Bronze Plate + Basic Circuit + Rubber
- **Advanced Electric Jetpack**: Carbon Plate + Carbon Fiber Plate + Basic Circuit + Electric Motor
- **Heavy Quantum Chestplate**: Advanced Circuit + Iridium Plate + Netherite Ingot + Quantum Chestplate
- **Advanced Quantum Chestplate**: Advanced Circuit + Living Circuit + Super Capacitor + Heavy Quantum Chestplate

### Armor Model Textures
Added 4 armor texture files:
- `textures/armor/diving_mask_1.png`
- `textures/armor/advanced_jetpack_1.png`
- `textures/armor/heavy_quantum_1.png`
- `textures/armor/advanced_quantum_1.png`

---

## Fixes

### Energy Converter EU->FE Conversion Fix
- **Fixed energy converter unable to output FE in EU->FE mode**
  - Cause: `FEEnergyStorage.receiveEnergy()` checks `canReceive` flag, which is false in EU->FE mode, preventing internally converted FE from being stored
  - Fix: Added `receiveEnergyInternal()` method to allow internal conversion to bypass `canReceive` check
  - Affected file: `mio_icif_energy_converter_entity.java`
- **Removed redundant expensive crafting recipe**
  - Removed recipe using advanced machine hull and HV-EV transformer
  - Kept recipe using basic machine hull and MV-HV transformer

---

## New Content

### METS Electric Tools Port
Ported 4 electric tools from the More Electric Tools (METS) mod:

- **Electric Nutrition Supply** — 10,000 EU capacity, 32 EU/t transfer rate, Tier 1, consumes 100 EU to auto-replenish hunger
- **Electric First Aid Life Support** — 1,000,000 EU capacity, 2048 EU/t transfer rate, Tier 3, consumes 1000 EU to auto-heal health
- **Electric Force Field Generator** — 1,000,000 EU capacity, 512 EU/t transfer rate, Tier 2, consumes 5000 EU to provide 10 absorption hearts (30 seconds)
- **Electric Fishing Rod** — Auto-fishing tool, fixed `canPerformAction` to return correct fishing action set
- **Electric Lighter** — 200,000 EU capacity, 128 EU/t transfer rate, consumes 500 EU to place electric light block

All meters implement `ToggleableElectricTool` interface, use **G key** to toggle on/off state, and auto-activate via `inventoryTick` when held in hand.

### Electric Light Block
- **Added `block_electric_light` block** — placed by electric lighter
  - Light level 15 (maximum brightness)
  - No collision box, instant break
  - Selection box is 0.3~0.7 small cube (aligned with METS original)
  - Not shown in creative mode tab (placed only by tool)
  - Uses End Rod (END_ROD) particle effects for visual feedback
  - No model texture rendering (`RenderShape.INVISIBLE`)

---

## Fixes

### Electric Lighter Refactoring
- **Changed placement target from vanilla torch to custom electric light block**
  - Cause: Vanilla torch requires solid support surface, limiting placement positions
  - Fix: Added `mio_icif_block_electric_light` block with no support requirements, can be placed anywhere
  - Aligned with METS original `LighterBlock` no-collision, small selection box behavior
  - Affected files: `mio_icif_electric_lighter.java`, `mio_icif_block_electric_light.java`, `mio_icif_blocks.java`

### Electric Fishing Rod Fix
- **Fixed fishing hook being immediately discarded**
  - Cause: `canPerformAction` did not return `DEFAULT_FISHING_ROD_ACTIONS`
  - Fix: Added correct `canPerformAction` implementation
  - Affected file: `mio_icif_electric_fishing_rod.java`

### Compilation Error Fix
- **Fixed missing `DEFAULT_PLACEMENT_ACTIONS` field**
  - Cause: Field does not exist in current NeoForge version
  - Fix: Changed to `return true` to allow placement actions
  - Affected file: `mio_icif_electric_lighter.java`

---

## Technical Improvements

### Block Alignment with METS Original
- **`mio_icif_block_electric_light` aligned with METS `LighterBlock`**
  - Selection box: `0.3~0.7` small cube (matching METS `AxisAlignedBB(0.3, 0.3, 0.3, 0.7, 0.7, 0.7)`)
  - Registration: `registerBlockNoItem` (no auto-generated BlockItem, matching METS `setCreativeTab(null)`)
  - Rendering: `RenderShape.INVISIBLE` + END_ROD particles (replacing METS TESR colored billboard rendering)

---

## New Content

### METS Weapons Port
Ported 8 weapons from the More Electric Tools (METS) mod:

- **Quantum Sword** — 1,000,000 EU capacity, 4,096 EU/t charge rate, Tier 4. 8 attack damage, +3 attack range, right-click to fire energy bolt
- **Electric Rifle** — 100,000 EU capacity, 512 EU/t charge rate, Tier 2. 6 attack damage, consumes 500 EU per shot
- **Advanced Electric Rifle** — 1,000,000 EU capacity, 2,048 EU/t charge rate, Tier 3. 8 attack damage, consumes 1000 EU per shot
- **Tactical Laser Rifle** — 10,000,000 EU capacity, 4,096 EU/t charge rate, Tier 4. 10 attack damage, consumes 2000 EU per shot
- **Plasma Air Cannon** — 500,000 EU capacity, 1,024 EU/t charge rate, Tier 3. Fires plasma bolts with AOE explosion
- **Electric Plasma Gun** — 2,000,000 EU capacity, 2,048 EU/t charge rate, Tier 4. Fires high-energy plasma bolts with large AOE
- **Steel Shield** — 50,000 EU capacity, 128 EU/t charge rate, Tier 1. 6 armor points, consumes energy when blocking
- **Nano Bow** — 500,000 EU capacity, 512 EU/t charge rate, Tier 3. Uses arrows, consumes 300 EU per shot

### Ammunition System
- **Energy Bullet** — `mio_icif_energy_bullet`, basic projectile entity with AOE and explosion support
- **Plasma Bullet** — `mio_icif_plasma_bullet`, high-energy projectile with large AOE explosion
- **Laser Bullet** — `mio_icif_laser_bullet`, high-speed projectile with piercing effect

---

## Fixes

### Energy Bullet Block Destruction Fix
- **Fixed energy bullet destroying blocks on impact**
  - Cause: `onBlockHit()` called `destroyBlock()`, METS original bullets do not destroy blocks
  - Fix: Removed `destroyBlock()` call, keeping only AOE damage and explosion effects
  - Affected file: `mio_icif_energy_bullet.java`

### Shield Black Texture Fix
- **Fixed steel shield showing black texture**
  - Cause 1: Incorrect texture path (`entity/item_tool_electric_shield` vs `item/item_tool_steel_shield`)
  - Cause 2: Render type did not support transparency
  - Fix: Copied METS original texture to correct path, used `entityCutout` render type, created `builtin/entity` model
  - Affected files: `mio_icif_steel_shield.java`, `mio_icif_ShieldRenderer.java`

### Nano Bow Durability Bug Fix
- **Fixed nano bow energy consumption causing abnormal durability**
  - Cause: `consumeEnergy()` used remaining energy value to set damageValue
  - Fix: Changed to increment using `currentDamage + amount`
  - Affected file: `mio_icif_nano_bow.java`

### Nano Bow Not Shooting Arrow Fix
- **Fixed nano bow not firing arrows when fully drawn**
  - Cause: `releaseUsing()` did not create arrow entity in `!level.isClientSide`
  - Fix: Added server-side check to ensure arrow is spawned on server
  - Affected file: `mio_icif_nano_bow.java`

### Plasma Gun No Effect Fix
- **Fixed plasma gun shots having no AOE/explosion effect**
  - Cause: `onHitBlock()` was empty, triggering no effects
  - Fix: Rewrote `tick()` for manual collision detection, added `onBlockHit()` for AOE and explosion
  - Affected files: `mio_icif_plasma_air_cannon.java`, `mio_icif_plasma_bullet.java`

### Crafting Recipe Error Fix
- **Fixed multiple weapon recipes referencing non-existent item IDs**
  - `item_adcircuit` → `item_advcircuit` (advanced circuit)
  - `item_mets_super_circuit` → `item_super_circuit` (super circuit)
  - `item_mets_living_circuit` → `item_living_circuit` (living circuit)
  - Affected files: All weapon crafting recipe JSONs

---

## Technical Improvements

### Projectile Entity System
- **Unified projectile base class**: All ammunition extends `ThrowableProjectile`
- **Manual collision detection**: Precise block/entity collision via `level().clip()`
- **Piercing mechanism**: Supports `remainingPierces` property for multiple entity hits
- **AOE damage**: Supports area damage and explosion effects

### Weapon Energy System
- All weapons use the project's own energy management interface
- `consumeEnergy()` and `hasEnoughEnergy()` methods unify energy consumption logic
- Energy storage uses durability system, consistent with other electric tools in the project

### Shield Rendering
- Uses `builtin/entity` model type for 3D shield rendering
- Custom `ShieldRenderer` handles shield model and texture
- Supports transparent textures and `entityCutout` render type

---

## New Content

### METS Trinkets Port (Curios Integration)
Ported 5 trinkets from the More Electric Tools (METS) mod via Curios API:

- **Electric Fireproof Necklace** — 100,000 EU capacity, 128 EU/t transfer rate, Tier 2. Consumes 200 EU/t to apply Fire Resistance III when player is on fire or in lava
- **Energy Crystal Belt** — 2,000,000 EU capacity, 512 EU/t transfer rate, Tier 3. Charges mainhand item every 10 ticks, transfer limit 512 EU/t
- **Lapotron Crystal Belt** — 20,000,000 EU capacity, 2048 EU/t transfer rate, Tier 4. Charges mainhand item every 10 ticks, transfer limit 2048 EU/t
- **Electric Life Support Ring** — 10,000,000 EU capacity, 2048 EU/t transfer rate, Tier 4. Auto-heals health/hunger/absorption (max 20), applies hidden Absorption buff on equip so yellow hearts display correctly
- **Electric Flight Ring** — 10,000,000 EU capacity, 2048 EU/t transfer rate, Tier 4. Provides flight capability consuming EU, supports hover/forward/boost modes

All trinkets are registered to Curios necklace/belt/ring slots, using the same `JetpackKeyHandler` key system as jetpacks/quantum boots.

### Crafting Recipes
- **Electric Fireproof Necklace**: Titanium Casing × 3 + Lithium Battery + Elite Circuit + Blaze Rod
- **Energy Crystal Belt**: Carbon Plate + Elite Circuit + Titanium Plate + Energy Crystal (center)
- **Lapotron Crystal Belt**: Niobium Titanium Plate × 4 + Elite Circuit × 4 + Energy Crystal Belt + Lapotron Crystal (center)
- **Electric Life Support Ring**: Super Iridium Compress Plate × 4 + Electric Force Field Generator + Electric First Aid Life Support + Electric Nutrition Supply + Lapotron Crystal Belt + Super Lapotron Crystal
- **Electric Flight Ring**: Niobium Titanium Plate × 4 + Elite Circuit × 4 + Lapotron Crystal + Energy Crystal + Advanced Jetpack

### Curios Slot Tags
- `curios:necklace` — Electric Fireproof Necklace
- `curios:belt` — Energy Crystal Belt, Lapotron Crystal Belt
- `curios:ring` — Electric Life Support Ring, Electric Flight Ring

### Creative Tab
Added **METS Trinkets** section to `mio_icif:tools` creative tab, containing all 5 trinkets.

---

## Fixes

### Fireproof Necklace Energy Fix
- **Fixed necklace constantly draining energy**
  - Cause: Original implementation applied fire resistance and consumed energy every tick unconditionally
  - Fix: Now only consumes energy when player is on fire or in lava
  - Affected file: `ElectricFireProofNecklace.java`

### Life Support Ring Absorption Fix
- **Fixed absorption hearts not displaying**
  - Cause: In 1.21.1, `LivingEntity.setAbsorptionAmount()` clamps value to `getMaxAbsorption()`, which base value is 0
  - Fix: Apply hidden `ABSORPTION` potion effect on equip (amplifier 4 → max absorption 20), so `setAbsorptionAmount()` is no longer clamped to 0
  - Affected file: `ElectricLifeSupportRing.java`

### Flight Ring Flight Control Fix
- **Fixed flight ring not allowing player to fly**
  - Cause: Original implementation relied on `abilities.mayfly` field, which is deprecated in NeoForge 1.21.1 and does not sync correctly to client
  - Fix: Completely rewrote flight logic to directly control player motion via `setDeltaMovement()`, same architecture as jetpack/quantum boots
    - Uses `JetpackKeyHandler` for server-side key detection (Space=ascend, Shift=descend, W=forward, Left Ctrl=boost)
    - Auto-hovers in air, maintains position when no keys pressed
    - Resets `fallDistance` each tick to prevent fall damage
    - Thrust degrades when energy below 5%, stops completely when depleted
  - Affected file: `ElectricFlightRing.java`

---

## Technical Improvements

### Curios Base Class
- Added `mio_icif_trinket_elc.java` base class extending `mio_icif_tool_elc` + implementing `ICurioItem`
- Unified energy state management on equip/unequip
- Provides convenience methods: `consumeEnergy()`, `hasEnoughEnergy()`, `getEnergy()`, `getMaxEnergy()`

### Curios Slot Configuration
- Added `data/mio_icif/curios/entities/player.json` assigning necklace/belt/ring slots
- Rebuilt item tag JSONs: `necklace.json`, `belt.json`, `ring.json`

### Flight Ring Key System
- Adopts project's existing `JetpackKeyHandler` server-side key detection pipeline
- Same key mapping as `mio_icif_chestplate_jetpack_elc` and `mio_icif_boots_quantum`
- Boost key defaults to Left Ctrl, customizable in controls settings

---

## New Content

### Advanced Miner Overclocker Support
Aligned with IC2 1.12.2 original advanced miner overclocker mechanism:

- **Work cycle**: Fixed 20 ticks/cycle (no longer shortens with overclockers)
- **Overclocker effect**: Each overclocker adds 5 more blocks mined per cycle
- **Blocks per cycle**: `5 × (overclockerCount + 1)`
  - 0 overclockers → 5 blocks/cycle (avg 4 ticks/block)
  - 1 overclocker → 10 blocks/cycle (avg 2 ticks/block)
  - 2 overclockers → 15 blocks/cycle (avg 1.33 ticks/block)
  - 3 overclockers → 20 blocks/cycle (avg 1 tick/block)
- **Energy consumption**: 512 EU (machine) + 64 EU (scanner) per block, unaffected by overclocker multiplier

Affected file: `mio_icif_advanced_miner_elc.java`

---

## New Content

### Overclocker Upgrade Recipe Expansion
Aligned with IC2 1.12.2 original, added overclocker upgrade recipes using advanced cooling cells:

- **10k Cooling Cell** → yields **2** Overclocker Upgrades
  - Recipe: `C C C / W E W`
  - C = 10k Cooling Cell, W = Tin Cable, E = Basic Circuit

- **30k Cooling Cell** → yields **6** Overclocker Upgrades
  - Recipe: `C C C / W E W`
  - C = 30k Cooling Cell, W = Tin Cable, E = Basic Circuit

- **60k Cooling Cell** → yields **12** Overclocker Upgrades
  - Recipe: `C C C / W E W`
  - C = 60k Cooling Cell, W = Tin Cable, E = Basic Circuit

Affected files: `shaped_167_overclocker_upgrade.json`, `shaped_overclocker_upgrade_30k.json`, `shaped_overclocker_upgrade_60k.json`

---

## Fixes

### Advanced Miner Filter Slot Persistence Fix
- **Fixed filter items disappearing after closing GUI**
  - Cause: `MenuType` used simple factory `AdvancedMinerElcMenu::new`, client couldn't access blockEntity when creating menu, PhantomSlot's `getItem()`/`set()` captured null reference at creation time
  - Fix:
    - Changed `MenuType` factory to `IContainerFactory`, server sends block coordinates via `NetworkHooks.openScreen`
    - Client menu looks up blockEntity by coordinates, dynamically calls `getMinerBlockEntity()`
    - `PhantomSlot`'s `getItem()`/`set()` now dynamically called instead of capturing null reference
  - Affected files: `mio_icif_block_advanced_miner_elc.java`, `AdvancedMinerElcMenu.java`, `mio_icif_menus.java`

### Advanced Miner Screen Upgrade Slot Tooltip Removal
- **Removed hover tooltip from upgrade slot area**
  - Cause: Tooltip showing upgrade counts on upgrade slots didn't match game style
  - Fix: Removed upgrade info tooltip block and unused `ArrayList` import from `render()` method
  - Affected file: `mio_icif_gui_advanced_miner_elc.java`

### Battery Slot Redstone Logic Unification
- **Unified redstone consumption logic across all machines, aligned with energy container**
  - Cause: `mio_icif_producer` (machine) and `mio_icif_Energy_Container` (energy storage) had inconsistent redstone handling
  - Fix: Removed redundant `isWorking` check from machine side; redstone consumption now matches energy container — consumes redstone whenever storage is not full (1 redstone = 800 EU)
  - Affected file: `mio_icif_producer.java`

### Redstone Consumption Aligned with IC2 Original
- **Fixed redstone not being consumed when storage had less than 800 EU space, aligned with IC2 original behavior**
  - Cause: Previously required storage space >= 800 EU to consume redstone, but IC2 original consumes redstone whenever there's any space (>0)
  - Fix: Removed `spaceAvailable >= 800` precondition check; redstone is now consumed whenever there's any space (actual amount added capped at `Math.min(800, spaceAvailable)` to prevent overflow)
  - Affected files: `mio_icif_producer.java`, `mio_icif_Energy_Container.java`

### Pipe Loot Table Fix
- **Fixed all 4 pipe blocks not dropping items when broken**
  - Cause: Data generator was missing `dropSelf(PIPE_WATER_EXTRACT)`, and no loot table JSON files were hand-written
  - Fix:
    - Added `dropSelf(PIPE_WATER_EXTRACT)` to data generator
    - Hand-wrote 4 pipe loot table JSON files:
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_water.json`
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_water_extract.json`
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_item_input.json`
      - `data/mio_icif/loot_tables/blocks/pipe/block_pipe_item.json`
  - Affected files: `mio_icif_BlockLootTable_Generator.java`, 4 new loot table JSONs

---

## Technical Improvements

### Menu Coordinate Transfer
- Advanced miner block uses `player.openMenu(menuProvider, buf -> buf.writeBlockPos(pos))` to open GUI
- Same coordinate transfer pattern as electric sorter (`mio_icif_block_sorter_elc`)
- Client menu receives coordinates via `RegistryFriendlyByteBuf` and looks up blockEntity

---

## Technical Improvements

### Grid FE Compatibility Integration
- **Native FE energy capability machine support in the energy grid**
  - Added `ILocatableTile` interface to support non-BlockEntity IEnergyTile registration
  - Added `FECompatTile` class as FE machine grid proxy, implementing `IEnergySink`
  - Wires and energy containers scan adjacent blocks every tick, auto-managing FE proxy tile registration/unregistration
  - Energy conversion ratio: **1 EU = 4 FE**, consistent with EnergyBridge
  - FE machine Sink Tier auto-calculated based on max energy storage (≥8192×4=EV tier 4, ≥2048×4=HV tier 3, ≥512×4=MV tier 2, else LV tier 1)
  - Wire block connection detection now checks NeoForge FE capability, ensuring model connection lines display correctly
  - Affected files: `ILocatableTile.java`, `FECompatTile.java`, `EnergyNetGlobal.java`, `mio_icif_wire.java`, `mio_icif_Energy_Container.java`, `mio_icif_block_wire.java`

### Energy Grid Voltage Overload Config Toggle
- **Added `EnergyNet.enableVoltageOverload` config option (default: true)**
  - When set to `false`, disables all overload effects caused by voltage tier mismatch:
    - Wires no longer melt/break from overvoltage (`removeConductor`)
    - Wires no longer lose insulation from overvoltage (`removeInsulation`)
    - Machines no longer explode from receiving overvoltage energy packets
    - Living entities no longer take lightning damage near overloaded wires
  - Energy still distributes and transfers normally; only destructive consequences are removed
  - Affected files: `Singularity_Iteration_Config.java`, `EnergyCalculator.java`

### Fluid Contact Effects Aligned with IC2 Original
- **Added custom fluid block class `mio_icif_block_fluid_effect` implementing potion effects when players contact fluids**
  - Aligned with IC2 1.12.2 original `BlockIC2Fluid` behavior:
    - **Construction Foam** → Hunger III (15 seconds)
    - **UU-Matter** → Regeneration II (5 seconds)
    - **Steam/Superheated Steam** → Night Vision (15 seconds)
    - **Hot Water** (player on fire) → Fire Resistance (5 seconds); (player not on fire) → Regeneration I~II (5 seconds)
    - **Pahoehoe Lava** → Set on fire for 10 seconds
    - **Hot Coolant** → Set on fire for 30 seconds
  - Effects are not re-applied if already active, consistent with IC2 original
  - Affected files: `mio_icif_block_fluid_effect.java`, `mio_icif_fluids.java`

### Crude Oil and Diesel Fluid Tags
- **Added `c:crude_oil` and `c:diesel` fluid tags**
  - Includes both still and flowing states
  - Affected files: `data/c/tags/fluid/crude_oil.json`, `data/c/tags/fluid/diesel.json`

---

## Fixes

### Advanced Solar Generator Battery Slot Fix
- **Fixed battery slots in advanced solar generators (4 types) unable to insert/remove batteries**
  - Cause 1: Advanced solar generator Menus used `addBatterySlot` method, which was designed for single battery slot and doesn't support multiple battery slots
  - Cause 2: `SlotItemHandler`'s default `mayPickup` behavior may restrict item removal
  - Fix:
    - Changed all 4 advanced solar generators (Advanced Solar Panel, Hybrid Solar Panel, Ultimate Hybrid Solar Panel, Quantum Solar Panel) from `addBatterySlot` to custom `addChargingSlot` method
    - Overrode `mayPickup` method in `addChargingSlot` to return `true`, allowing players to remove batteries
    - Overrode `mayPlace` method to only allow battery items to be placed
    - Overrode `getMaxStackSize` method, redstone stacks to 64, other items stack to 1
  - Slot configuration: 4 battery slots at positions (52,26), (70,26), (88,26), (106,26)
  - Block entity: Uses `SlotLayout.builder().extra(4).build()` to configure 4 extra slots
  - Charging logic: Overrode `chargeItems()` method to iterate through all 4 slots and charge each battery
  - Affected files:
    - `AdvancedSolarPanelMenu.java`, `HybridSolarPanelMenu.java`, `UltimateHybridSolarPanelMenu.java`, `QuantumSolarPanelMenu.java`
    - `mio_icif_AdvancedSolarPanel.java`, `mio_icif_HybridSolarPanel.java`, `mio_icif_UltimateHybridSolarPanel.java`, `mio_icif_QuantumSolarPanel.java`
    - `mio_icif_AdvancedSolarGenerator.java`

### Solar Generator Battery Slot Fix
- **Fixed normal solar generator battery slot unable to insert batteries**
  - Cause: `SolarGeneratorMenu` did not override `isBattery()` method, base class defaults to returning `false`
  - Fix: Added `isBattery()` method override to check if item is `mio_icif_bat` battery
  - Affected file: `SolarGeneratorMenu.java`

### Base Class Battery Slot Removal Fix
- **Fixed items unable to be removed from slots created by base class `addBatterySlot` method**
  - Cause: `SlotItemHandler` did not override `mayPickup` method
  - Fix: Added `mayPickup` method in `addBatterySlot` returning `true`
  - Affected file: `mio_icif_generator_menu.java`

This mod has no additional files