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.6.6-beta.jar

File name[SI] SingularityIteration-0.1.6.6-beta.jar
Uploader
MioPhaSideMioPhaSide
Uploaded
Aug 3, 2026
Downloads
33
Size
5.9 MB
Mod Loaders
NeoForge
File ID
8567793
Type
B
Beta
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

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

Learn more about Curse Maven

What's new

# 更新日志 v0.1.6.6

**发布日期**: 待定

---

## 新增

### EMI 兼容支持
- 新增 EMI 配方浏览器兼容支持
- 所有生产机器(打粉机、提取机、电炉、压缩机、回收机、洗矿机、离心机、金属成型机等)的配方现在可以在 EMI 中查看
- 支持显示配方的输入、输出、能量消耗和处理时间

### REI 兼容支持
- 新增 REI (Roughly Enough Items) 配方浏览器兼容支持
- 所有生产机器配方现在可以在 REI 中查看
- 实现方式:
  - 新增 `REIPlugin` 插件类,实现 `REIClientPlugin` 接口
  - 为每种机器注册配方类别 (Category) 和显示 (Display)
  - 通过 `META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin` 注册插件
- 支持的机器类别:
  - 打粉机、洗矿机、热能离心机、提取机、压缩机、方块切割机
  - 金属成型机(辊压、剪切、挤压三种模式)
  - 装罐机(装罐、混合、从储罐填充、排空到储罐四种模式)
  - 高炉、分子重组仪
- 依赖配置:
  - REI: `curse.maven:roughly-enough-items-310111:6199140`
  - Architectury API: `dev.architectury:architectury-neoforge:13.0.8`

### UU 物质记录系统(参考 IC2 1.12.2 原版实现)
- 新增基于配方逆向推导的 UU 物质价值计算系统
- 实现原理:
  - 扫描游戏内所有合成配方(工作台、熔炉、IC2 机器等)
  - 构建 UU 配方转换图(UU Graph),通过逆向推导计算每个物品的 UU 价值
  - 基于 IC2 1.12.2 原版 `UuIndex` / `UuGraph` 算法实现
- 新增 `uu_scan_values.ini` 配置文件
  - 位于 `config/mio_icif/uu_scan_values.ini`
  - 包含基础世界扫描值(圆石、泥土、沙子等基础方块的 UU 价值)
  - 支持用户自定义覆盖物品的 UU 价值
- 新增配置文件支持
  - `balance/uu-values/predefined`: 预定义 UU 价值(覆盖自动计算)
  - `balance/uu-values/world scan`: 世界扫描基础值

### 模式扫描机逻辑重写
- 扫描机现在使用 UU 物质记录系统计算扫描结果
- 扫描流程(对齐 IC2 原版):
  1. 放置要扫描的物品到扫描槽
  2. 扫描机通过 UU Graph 查找该物品的 UU 价值
  3. 如果物品无法通过配方推导(价值为无穷大),扫描失败
  4. 扫描完成后,物品被消耗,结果可保存到记忆水晶
- 扫描状态机(对齐 IC2 原版 `TileEntityScanner.State`):
  - `IDLE`: 待机
  - `SCANNING`: 正在扫描
  - `COMPLETED`: 扫描完成
  - `FAILED`: 扫描失败(物品无 UU 价值)
  - `NO_STORAGE`: 无记忆水晶
  - `NO_ENERGY`: 能量不足
  - `TRANSFER_ERROR`: 保存失败
  - `ALREADY_RECORDED`: 该物品已被记录
- 扫描消耗:
  - 能量:256 EU/t,总计约 900,000 EU
  - 时间:约 3515 ticks(~175 秒)
  - UU 物质成本:基于 UU Graph 计算结果(单位:mB)

---

## 改动

### 扫描机 UU/EU 成本计算方式
- **旧方式**: 基于物品稀有度、合成复杂度、物品类型的简单公式计算
- **新方式**: 基于完整的配方逆向推导系统(UU Graph)计算
- 移除旧的 `calculateUUMatterCost()` / `calculateEnergyCost()` 复杂逻辑
- 移除 `getRarityMultiplier()` / `getCraftingComplexity()` / `getItemTypeMultiplier()` 等辅助方法
- 扫描结果现在与 IC2 原版的 UU 指数一致

---

## 修复(v0.1.6.6 开发途中)

### 扫描失败问题修复
- **修复 UU 系统初始化顺序错误**
  - 将 `loadFromConfig` 改为在 `graph.build()` 前调用,确保配置值先加载到 UU Graph 中
  - 防止因配置未加载导致 UU 价值返回无穷大(`Infinity`),从而触发扫描失败
- **新增铱系列物品的 UU 扫描值**
  - 铱碎片(`item_shard_iridium`):1333 µB(IC2 原版参考值)
  - 铱(`item_iridium`):11997 µB(9 碎片合成)
  - 铱锭(`item_iridium_ingot`):11997 µB
  - 强化铱板(`item_iridium_plate`):54000 µB
  - 这些物品为战利品箱子独占,无合成配方,需手动指定 UU 值

### 扫描机 GUI EU 显示单位修正
- **修复显示值 1000 倍偏差问题**
  - 扫描机 GUI 将原始 EU 值错误地当作"kEU"显示(如 280 EU 显示为 "280k EU")
  - 记忆水晶 tooltip 使用正确单位(280 EU),导致两者不一致
  - 修正后:`< 1000` 显示为 "XXX EU",`≥ 1000` 显示为 "XXX.XXk EU",`≥ 1000000` 显示为 "XXX.XXM EU"

### 单位换算修正
- 修复 `UuGraph.getInBuckets()` 的桶单位转换系数
  - 旧值:`1.0E-5D`(错误,导致 UU 值偏大)
  - 新值:`1.0E-6D`(对齐 1 µB = 1.0E-6 桶)
- 修正扫描机计算逻辑,将 UU 价值从桶单位正确转换为 mB 显示单位

### 工业工作台 JEI/EMI 配方转移修复
- **问题 1**:JEI 提示"不支持该工作方块",配方浏览器中点击 "+" 按钮无法将配方材料摆入工业工作台的 3x3 合成网格
  - **原因**:
    - 工业工作台未注册 `c:player_workstations/crafting_tables` 标签,JEI 无法识别其为有效的工作台
    - JEI 插件未注册 `IRecipeTransferHandler`,不知道工业工作台菜单支持 `minecraft.crafting` 配方转移
  - **修复**:
    - 新增 `data/c/tags/block/player_workstations/crafting_tables.json` 标签文件,将 `mio_icif:producer/block_industrial_workbench` 注册为工作台
    - 在 `JEIPlugin` 中实现 `registerRecipeTransferHandlers()`,注册工业工作台菜单的配方转移支持
- **问题 2**:配方材料摆入后被瞬间清空
  - **原因**:合成网格使用 `TransientCraftingContainer`(独立存储),但数据实际存储在 `ItemStackHandler` 中。JEI 通过 `Slot.container` 直接操作 `craftMatrix`,而 `slotsChanged()` 中的 `syncCraftMatrixFromHandler()` 会把 `itemHandler` 的旧数据覆盖回 `craftMatrix`
  - **修复**:
    - 新增 `HandlerCraftingContainer` 内部类,实现 `CraftingContainer` 接口,直接操作 `ItemStackHandler` 的指定槽位范围
    - 移除合成网格 `Slot` 对 `getItem()`/`set()`/`remove()` 的覆盖(不再需要桥接)
    - 简化 `slotsChanged()` 逻辑,消除双向同步
    - 确保 JEI/EMI 配方转移时数据一致性

### EMI 配方查询报错修复
- **修复 "Recipe ... not present in recipe manager" 错误**
  - 原因:EMI 配方 ID 缺少 `/` 前缀,无法识别为合成配方
  - 修复:在 `MioIcifEmiRecipe` 中为配方 ID 添加 `/emi/` 前缀
- **修复 "Untranslated recipe category" 错误**
  - 原因:缺少 `emi.category.mio_icif.*` 翻译键
  - 修复:在 `zh_cn.json` 和 `en_us.json` 中添加所有 EMI 配方分类的翻译
- **修复 "2 recipes loaded with the same id" 错误**
  - 原因:EMI 和 JEI 使用相同配方 ID 导致冲突
  - 修复:EMI 配方 ID 使用 `/emi/` 前缀,与 JEI 的 `jei:/` 前缀区分

### 高炉输入面扩展
- 参考 IC2 原版 `TileEntityBlastFurnace` 实现
- 顶面、侧面、后面均可输入原材料(铁锭等)
- 侧面还可输入压缩空气单元
- 任何非正面均可提取产物(钢锭、矿渣)和空单元
- 正面专用于 HU 热量输入,无物品交互

### 机器输入槽配方验证
- **问题**:部分机器输入槽接受任何物品(如橡胶放入金属成型机),即使无法加工
- **修复**:为以下机器添加配方验证,只接受能被加工的物品:
  - **金属成型机** (`isValidMetalFormerInput`):检查物品是否能被辊压/剪切/挤压加工
  - **提取机** (`isExtractable`):检查物品是否有提取配方
  - **方块切割机** (`isCuttable`):检查物品是否有切割配方
- **原本已正确验证的机器**:
  - 打粉机、压缩机、洗矿机、热能离心机、熔炉、感应炉、分子重组仪、装罐机、高炉
- **特殊机器**(不需要配方验证):
  - 回收机(接受任何物品)、扫描机(扫描任何物品)、磁力机、物质生成机、复制机、发酵机

### 电动木龙头交互距离
- **问题**: 电动木龙头 (`mio_icif_treetap_elc`) 的交互距离与空手/普通木龙头相同,没有体现电动工具的优势
- **修复**: 使用 Minecraft 属性系统 (`BLOCK_INTERACTION_RANGE`) 扩展交互距离
  - 手持电动木龙头时: 交互距离从 4.5 格增加到 6.5 格 (+2 格)
  - 切换物品后自动恢复默认距离
  - 实现方式: 在 `inventoryTick()` 中添加/移除属性修饰符

### 电力工具电量消耗问题(对齐 IC2 原版)
- **问题**: 使用钻头、电锯快速挖掘时,短时间内大量消耗电量
- **原因**: `mineBlock()` 方法在 Minecraft 挖掘机制中可能被多次调用,旧实现使用 `if (!consumeEnergy()) return false;` 试图阻止挖掘,但导致异常行为
- **修复**: 对齐 IC2 原版 `onBlockDestroyed` 逻辑
  - 只在方块实际被破坏后消耗能量
  - 只在方块硬度不为 0 时消耗能量
  - 能量不足时不阻止挖掘,而是通过 `getDestroySpeed()` 返回 1.0F(手挖速度)限制挖掘速度
  - **影响工具**: 铁钻头、钻石钻头、铱钻头、电锯

### 电动扳手能量消耗问题
- **问题**: 使用电动扳手时消耗大量电量,甚至全部能量被消耗
- **原因**: `PlayerInteractEvent.RightClickBlock` 事件在主手和副手都会触发,导致能量消耗翻倍
- **修复**: 在事件处理开头添加主手检查
  ```java
  if (event.getHand() != InteractionHand.MAIN_HAND) return;
  ```

### Tooltip 能量显示恢复
- **问题**: 电池、电力工具、电力装甲的 tooltip 不显示能量信息
- **原因**: 之前误删了 `mio_icif_bat.java` 和 `mio_icif_armor_elc.java` 的 `appendHoverText()` 方法
- **修复**: 恢复两个基类的 `appendHoverText()` 方法
  - 电池基类: 显示 `当前电量 / 最大电量`
  - 电力装甲基类: 显示 `当前电量 / 最大电量`
  - **影响物品**: 所有电池、电力工具、电力装甲

### 发电机/机器 GUI 能量显示错误(显示为预期值的 4 倍)
- **问题**: 发电机和机器 GUI 中显示的能量值是实际 EU 值的 4 倍
- **原因**: `ILongEnergyStorage` 接口的 `getEnergyStored()` 和 `getMaxEnergyStored()` 方法会将 EU 值乘以 `FE_PER_EU`(即 4)转换为 FE 值。所有 Menu 的 `broadcastChanges()` 方法使用了这些方法来同步能量数据到客户端,导致 GUI 显示的能量值是 EU 值的 4 倍
- **修复**: 将所有 Menu 的 `broadcastChanges()` 中的 `getEnergyStored()` 改为 `getAmount()`,`getMaxEnergyStored()` 改为 `getCapacity()`,直接获取原始 EU 值
  - **影响文件**: 18 个 Menu 文件(发电机、机器、存储等)

### 手持电力工具时物品栏上方电能提示移除
- **问题**: 手持电池/电力工具时,物品栏上方(ActionBar)持续显示电能信息,干扰游戏体验
- **修复**: 移除电池基类 `mio_icif_bat.java` 的 `inventoryTick()` 方法中的 `displayClientMessage()` 调用
  - 能量信息仍可通过鼠标悬停查看 tooltip

### 电力装备模式切换消息改为聊天栏显示
- **问题**: 喷气背包、采矿镭射枪等装备切换模式时,消息显示在物品栏上方(ActionBar),短暂显示后消失,不方便查看
- **修复**: 将所有模式切换消息从 `displayClientMessage()` 改为 `sendSystemMessage()`,发送到服务器聊天栏
  - **电力喷气背包**: 悬停模式开启/关闭、落地自动关闭悬停
  - **量子装甲**: 悬停模式开启/关闭、落地自动关闭悬停
  - **采矿镭射枪**: 超高能爆破模式被禁用时的提示
  - **铱钻头**: 时运/精准采集模式切换提示
  - **等离子发射器**: 激活/未激活状态提示
  - **纳米剑**: 激活/未激活状态提示

### 其他修复
- **电动分拣机 GUI**:移除物品栏标题显示
- **亚麻翻译**:添加 `mio_icif.plant.flax` 的中文(亚麻)和英文(Flax)翻译

---

## 技术细节

### 新增文件
- `com.singularity_iteration.mio_icif.uu.UuIndex` - UU 索引管理器(单例)
- `com.singularity_iteration.mio_icif.uu.UuGraph` - UU 配方图计算引擎
- `com.singularity_iteration.mio_icif.uu.UuScanValues` - UU 扫描值配置加载
- `com.singularity_iteration.mio_icif.uu.LeanItemStack` - 轻量级物品堆栈(用于 UU Graph)
- `com.singularity_iteration.mio_icif.uu.RecipeTransformation` - 配方转换数据类
- `com.singularity_iteration.mio_icif.uu.IRecipeResolver` / `ILateRecipeResolver` - 配方解析器接口
- `com.singularity_iteration.mio_icif.uu.VanillaRecipeResolver` - 原版工作台配方解析器
- `com.singularity_iteration.mio_icif.uu.SmeltingRecipeResolver` - 熔炉配方解析器
- `assets/mio_icif/config/uu_scan_values.ini` - 默认 UU 扫描基础值
- `com.singularity_iteration.mio_icif.integration.rei.REIPlugin` - REI 插件主类
- `com.singularity_iteration.mio_icif.integration.rei.category.*` - REI 配方类别(15 个机器类别)
- `com.singularity_iteration.mio_icif.integration.rei.display.*` - REI 配方显示(15 个机器显示)
- `META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin` - REI 插件注册文件

### 修改文件
- `mio_icif_scanner_elc.java` - 重写扫描逻辑,集成 UU Graph
- `Singularity_Iteration.java` - 添加 UU 系统初始化
- `Singularity_Iteration_Config.java` - 添加 UU 扫描配置支持
- `build.gradle` - 添加 REI 和 Architectury API 依赖
- `mio_icif_treetap_elc.java` - 添加交互距离扩展逻辑
- `BlockRubberWood.java` - 电动木龙头交互返回 `PASS_TO_DEFAULT_BLOCK_INTERACTION`
- `mio_icif_iron_driller.java` - 对齐 IC2 原版 `mineBlock()` 能量消耗逻辑
- `mio_icif_diamond_driller.java` - 对齐 IC2 原版 `mineBlock()` 能量消耗逻辑
- `mio_icif_iridium_driller.java` - 对齐 IC2 原版 `mineBlock()` 能量消耗逻辑
- `mio_icif_iron_chainsaw.java` - 对齐 IC2 原版 `mineBlock()` 能量消耗逻辑
- `mio_icif_wrench_elc.java` - 添加主手事件检查,防止重复消耗能量
- `mio_icif_bat.java` - 恢复 `appendHoverText()` 能量显示,移除 ActionBar 电量提示
- `mio_icif_armor_elc.java` - 恢复 `appendHoverText()` 能量显示
- `GeoGeneratorMenu.java` - 修复能量同步:`getEnergyStored()` → `getAmount()`,`getMaxEnergyStored()` → `getCapacity()`
- `StirlingGeneratorMenu.java` - 同上
- `SemifluidGeneratorMenu.java` - 同上
- `NuclearReactorGeneratorMenu.java` - 同上
- `SolarGeneratorMenu.java` - 同上
- `AdvancedSolarPanelMenu.java` - 同上
- `HybridSolarPanelMenu.java` - 同上
- `UltimateHybridSolarPanelMenu.java` - 同上
- `QuantumSolarPanelMenu.java` - 同上
- `QuantumGeneratorMenu.java` - 同上
- `ThermalGeneratorMenu.java` - 同上
- `HeatGeneratorElcMenu.java` - 同上
- `FurnaceElcMenu.java` - 同上
- `CompressorElcMenu.java` - 同上
- `ExtractorElcMenu.java` - 同上
- `PowderElcMenu.java` - 同上
- `WasherElcMenu.java` - 同上
- `MagnetizerMenu.java` - 同上

---

# Changelog v0.1.6.6

**Release Date**: TBD

---

## New Features

### EMI Compatibility Support
- Added EMI recipe browser compatibility support
- All producer machine recipes (Macerator, Extractor, Electric Furnace, Compressor, Recycler, Ore Washer, Thermal Centrifuge, Metal Former, etc.) can now be viewed in EMI
- Supports displaying recipe inputs, outputs, energy consumption, and processing time

### REI Compatibility Support
- Added REI (Roughly Enough Items) recipe browser compatibility support
- All producer machine recipes can now be viewed in REI
- Implementation:
  - Added `REIPlugin` class implementing `REIClientPlugin` interface
  - Registered recipe categories and displays for each machine type
  - Plugin registered via `META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin`
- Supported machine categories:
  - Macerator, Ore Washer, Thermal Centrifuge, Extractor, Compressor, Block Cutter
  - Metal Former (Rolling, Cutting, Extruding modes)
  - Canner (Canning, Mixing, Filling from Tank, Emptying to Tank modes)
  - Blast Furnace, Molecular Transformer
- Dependencies:
  - REI: `curse.maven:roughly-enough-items-310111:6199140`
  - Architectury API: `dev.architectury:architectury-neoforge:13.0.8`

### UU Matter Index System (Based on IC2 1.12.2 Original Implementation)
- Added UU matter value calculation system based on recipe reverse derivation
- Implementation principle:
  - Scans all crafting recipes in the game (crafting table, furnace, IC2 machines, etc.)
  - Builds UU Recipe Graph (UU Graph) to calculate UU value of each item through reverse derivation
  - Based on IC2 1.12.2 original `UuIndex` / `UuGraph` algorithm
- Added `uu_scan_values.ini` configuration file
  - Located at `config/mio_icif/uu_scan_values.ini`
  - Contains base world scan values (UU values for basic blocks like cobblestone, dirt, sand)
  - Supports user-defined overrides for item UU values
- Added configuration file support
  - `balance/uu-values/predefined`: Predefined UU values (override auto-calculation)
  - `balance/uu-values/world scan`: World scan base values

### Pattern Scanner Logic Rewrite
- Scanner now uses the UU matter index system to calculate scan results
- Scanning process (aligned with IC2 original):
  1. Place the item to scan in the scan slot
  2. Scanner looks up the item's UU value through UU Graph
  3. If the item cannot be derived from recipes (value is infinity), scan fails
  4. After scanning completes, the item is consumed and results can be saved to a Crystal Memory
- Scan state machine (aligned with IC2 original `TileEntityScanner.State`):
  - `IDLE`: Standby
  - `SCANNING`: Scanning in progress
  - `COMPLETED`: Scan completed
  - `FAILED`: Scan failed (item has no UU value)
  - `NO_STORAGE`: No Crystal Memory
  - `NO_ENERGY`: Insufficient energy
  - `TRANSFER_ERROR`: Save failed
  - `ALREADY_RECORDED`: Item already recorded
- Scan consumption:
  - Energy: 256 EU/t, total ~900,000 EU
  - Time: ~3515 ticks (~175 seconds)
  - UU matter cost: Based on UU Graph calculation result (unit: mB)

---

## Changes

### Scanner UU/EU Cost Calculation Method
- **Old method**: Simple formula based on item rarity, crafting complexity, and item type
- **New method**: Based on complete recipe reverse derivation system (UU Graph)
- Removed old `calculateUUMatterCost()` / `calculateEnergyCost()` complex logic
- Removed `getRarityMultiplier()` / `getCraftingComplexity()` / `getItemTypeMultiplier()` and other helper methods
- Scan results now consistent with IC2 original UU index

---

## Fixes (During v0.1.6.6 Development)

### Scan Failure Fix
- **Fixed UU system initialization order error**
  - Changed `loadFromConfig` to be called before `graph.build()`, ensuring config values are loaded into UU Graph first
  - Prevents UU values from returning infinity due to config not being loaded, which triggers scan failure
- **Added Iridium series item UU scan values**
  - Iridium Shard (`item_shard_iridium`): 1333 µB (IC2 original reference value)
  - Iridium (`item_iridium`): 11997 µB (9 shards crafted)
  - Iridium Ingot (`item_iridium_ingot`): 11997 µB
  - Iridium Reinforced Plate (`item_iridium_plate`): 54000 µB
  - These items are loot chest exclusive, have no crafting recipes, require manual UU value specification

### Scanner GUI EU Display Unit Fix
- **Fixed 1000x display deviation**
  - Scanner GUI incorrectly displayed raw EU values as "kEU" (e.g., 280 EU displayed as "280k EU")
  - Crystal Memory tooltip used correct units (280 EU), causing inconsistency
  - After fix: `< 1000` displays as "XXX EU", `≥ 1000` displays as "XXX.XXk EU", `≥ 1000000` displays as "XXX.XXM EU"

### Unit Conversion Fix
- Fixed `UuGraph.getInBuckets()` bucket unit conversion factor
  - Old value: `1.0E-5D` (incorrect, causing inflated UU values)
  - New value: `1.0E-6D` (aligned with 1 µB = 1.0E-6 buckets)
- Corrected scanner calculation logic to properly convert UU values from bucket units to mB display units

### Industrial Workbench JEI/EMI Recipe Transfer Fix
- **Issue 1**: JEI showed "Unsupported workstation", clicking "+" button in recipe browser couldn't place recipe materials into Industrial Workbench's 3x3 crafting grid
  - **Cause**:
    - Industrial Workbench was not registered with `c:player_workstations/crafting_tables` tag, JEI couldn't recognize it as a valid crafting table
    - JEI plugin didn't register `IRecipeTransferHandler`, didn't know Industrial Workbench menu supports `minecraft.crafting` recipe transfer
  - **Fix**:
    - Added `data/c/tags/block/player_workstations/crafting_tables.json` tag file, registering `mio_icif:producer/block_industrial_workbench` as a crafting table
    - Implemented `registerRecipeTransferHandlers()` in `JEIPlugin`, registering recipe transfer support for Industrial Workbench menu
- **Issue 2**: Recipe materials were instantly cleared after being placed
  - **Cause**: Crafting grid used `TransientCraftingContainer` (independent storage), but data was actually stored in `ItemStackHandler`. JEI operated `craftMatrix` directly through `Slot.container`, while `slotsChanged()`'s `syncCraftMatrixFromHandler()` would overwrite old data from `itemHandler` back to `craftMatrix`
  - **Fix**:
    - Added `HandlerCraftingContainer` inner class implementing `CraftingContainer` interface, directly operating specified slot range of `ItemStackHandler`
    - Removed `getItem()`/`set()`/`remove()` overrides from crafting grid `Slot` (no longer needed for bridging)
    - Simplified `slotsChanged()` logic, eliminated bidirectional synchronization
    - Ensured data consistency during JEI/EMI recipe transfer

### EMI Recipe Query Error Fixes
- **Fixed "Recipe ... not present in recipe manager" error**
  - Cause: EMI recipe ID missing `/` prefix, couldn't be recognized as crafting recipe
  - Fix: Added `/emi/` prefix to recipe ID in `MioIcifEmiRecipe`
- **Fixed "Untranslated recipe category" error**
  - Cause: Missing `emi.category.mio_icif.*` translation keys
  - Fix: Added all EMI recipe category translations in `zh_cn.json` and `en_us.json`
- **Fixed "2 recipes loaded with the same id" error**
  - Cause: EMI and JEI using same recipe ID caused conflicts
  - Fix: EMI recipe IDs use `/emi/` prefix, distinct from JEI's `jei:/` prefix

### Blast Furnace Input Face Expansion
- Referenced IC2 original `TileEntityBlastFurnace` implementation
- Top, side, and back faces can all input raw materials (iron ingots, etc.)
- Side faces can also input compressed air cells
- Any non-front face can extract products (steel ingots, slag) and empty cells
- Front face dedicated to HU heat input, no item interaction

### Machine Input Slot Recipe Validation
- **Issue**: Some machine input slots accepted any item (e.g., rubber in Metal Former), even if not processable
- **Fix**: Added recipe validation to the following machines, only accepting items that can be processed:
  - **Metal Former** (`isValidMetalFormerInput`): Checks if item can be processed by rolling/cutting/extruding
  - **Extractor** (`isExtractable`): Checks if item has an extraction recipe
  - **Block Cutter** (`isCuttable`): Checks if item has a cutting recipe
- **Machines already correctly validated**:
  - Macerator, Compressor, Ore Washer, Thermal Centrifuge, Furnace, Induction Furnace, Molecular Transformer, Canner, Blast Furnace
- **Special machines** (no recipe validation needed):
  - Recycler (accepts any item), Scanner (scans any item), Magnetizer, Mass Fabricator, Replicator, Fermenter

### Electric Treetap Interaction Range
- **Issue**: Electric Treetap (`mio_icif_treetap_elc`) had same interaction range as empty hand/normal treetap, not reflecting electric tool advantage
- **Fix**: Used Minecraft attribute system (`BLOCK_INTERACTION_RANGE`) to extend interaction range
  - Holding electric treetap: interaction range increased from 4.5 to 6.5 blocks (+2 blocks)
  - Automatically restores default range when switching items
  - Implementation: add/remove attribute modifiers in `inventoryTick()`

### Electric Tool Energy Consumption Fix (Aligned with IC2 Original)
- **Issue**: Using drill/chainsaw for fast mining consumed large amounts of energy in short time
- **Cause**: `mineBlock()` method may be called multiple times in Minecraft mining mechanism. Old implementation used `if (!consumeEnergy()) return false;` trying to prevent mining, but caused abnormal behavior
- **Fix**: Aligned with IC2 original `onBlockDestroyed` logic
  - Only consume energy after block is actually destroyed
  - Only consume energy when block hardness is not 0
  - When energy is insufficient, don't prevent mining, but limit mining speed by returning 1.0F (hand mining speed) in `getDestroySpeed()`
  - **Affected tools**: Iron Drill, Diamond Drill, Iridium Drill, Chainsaw

### Electric Wrench Energy Consumption Fix
- **Issue**: Using electric wrench consumed large amounts of energy, even all energy was consumed
- **Cause**: `PlayerInteractEvent.RightClickBlock` event triggers for both main hand and off hand, causing double energy consumption
- **Fix**: Added main hand check at beginning of event handler
  ```java
  if (event.getHand() != InteractionHand.MAIN_HAND) return;
  ```

### Tooltip Energy Display Restoration
- **Issue**: Batteries, electric tools, and electric armor tooltips didn't display energy information
- **Cause**: Previously accidentally deleted `appendHoverText()` methods in `mio_icif_bat.java` and `mio_icif_armor_elc.java`
- **Fix**: Restored `appendHoverText()` methods in both base classes
  - Battery base class: displays `current energy / max energy`
  - Electric armor base class: displays `current energy / max energy`
  - **Affected items**: All batteries, electric tools, electric armor

### Generator/Machine GUI Energy Display Error (Displayed 4x Expected Value)
- **Issue**: Energy values displayed in generator and machine GUIs were 4x actual EU values
- **Cause**: `ILongEnergyStorage` interface's `getEnergyStored()` and `getMaxEnergyStored()` methods multiply EU values by `FE_PER_EU` (which is 4) to convert to FE values. All Menu's `broadcastChanges()` methods used these methods to sync energy data to client, causing GUI to display 4x EU values
- **Fix**: Changed all Menu's `broadcastChanges()` from `getEnergyStored()` to `getAmount()`, `getMaxEnergyStored()` to `getCapacity()`, directly getting raw EU values
  - **Affected files**: 18 Menu files (generators, machines, storage, etc.)

### Removed ActionBar Energy Display When Holding Electric Tools
- **Issue**: When holding batteries/electric tools, energy info was continuously displayed above hotbar (ActionBar), interfering with gameplay
- **Fix**: Removed `displayClientMessage()` call in battery base class `mio_icif_bat.java`'s `inventoryTick()` method
  - Energy info can still be viewed via tooltip on mouse hover

### Electric Equipment Mode Switch Messages Moved to Chat
- **Issue**: When jetpack, mining laser and other equipment switched modes, messages were displayed above hotbar (ActionBar), briefly shown then disappeared, inconvenient to read
- **Fix**: Changed all mode switch messages from `displayClientMessage()` to `sendSystemMessage()`, sending to server chat
  - **Electric Jetpack**: Hover mode on/off, auto-disable hover on landing
  - **Quantum Armor**: Hover mode on/off, auto-disable hover on landing
  - **Mining Laser**: Super-high-energy blast mode disabled hint
  - **Iridium Drill**: Fortune/Silk Touch mode switch hints
  - **Plasma Launcher**: Active/inactive status hints
  - **Nano Saber**: Active/inactive status hints

### Other Fixes
- **Electric Sorter GUI**: Removed inventory title display
- **Flax Translation**: Added Chinese (亚麻) and English (Flax) translation for `mio_icif.plant.flax`

---

## Technical Details

### New Files
- `com.singularity_iteration.mio_icif.uu.UuIndex` - UU index manager (singleton)
- `com.singularity_iteration.mio_icif.uu.UuGraph` - UU recipe graph calculation engine
- `com.singularity_iteration.mio_icif.uu.UuScanValues` - UU scan values configuration loader
- `com.singularity_iteration.mio_icif.uu.LeanItemStack` - Lightweight item stack (for UU Graph)
- `com.singularity_iteration.mio_icif.uu.RecipeTransformation` - Recipe transformation data class
- `com.singularity_iteration.mio_icif.uu.IRecipeResolver` / `ILateRecipeResolver` - Recipe resolver interfaces
- `com.singularity_iteration.mio_icif.uu.VanillaRecipeResolver` - Vanilla crafting table recipe resolver
- `com.singularity_iteration.mio_icif.uu.SmeltingRecipeResolver` - Furnace recipe resolver
- `assets/mio_icif/config/uu_scan_values.ini` - Default UU scan base values
- `com.singularity_iteration.mio_icif.integration.rei.REIPlugin` - REI plugin main class
- `com.singularity_iteration.mio_icif.integration.rei.category.*` - REI recipe categories (15 machine categories)
- `com.singularity_iteration.mio_icif.integration.rei.display.*` - REI recipe displays (15 machine displays)
- `META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin` - REI plugin registration file

### Modified Files
- `mio_icif_scanner_elc.java` - Rewrote scanning logic, integrated UU Graph
- `Singularity_Iteration.java` - Added UU system initialization
- `Singularity_Iteration_Config.java` - Added UU scan configuration support
- `build.gradle` - Added REI and Architectury API dependencies
- `mio_icif_treetap_elc.java` - Added interaction range extension logic
- `BlockRubberWood.java` - Electric treetap interaction returns `PASS_TO_DEFAULT_BLOCK_INTERACTION`
- `mio_icif_iron_driller.java` - Aligned with IC2 original `mineBlock()` energy consumption logic
- `mio_icif_diamond_driller.java` - Aligned with IC2 original `mineBlock()` energy consumption logic
- `mio_icif_iridium_driller.java` - Aligned with IC2 original `mineBlock()` energy consumption logic
- `mio_icif_iron_chainsaw.java` - Aligned with IC2 original `mineBlock()` energy consumption logic
- `mio_icif_wrench_elc.java` - Added main hand event check to prevent duplicate energy consumption
- `mio_icif_bat.java` - Restored `appendHoverText()` energy display, removed ActionBar energy hint
- `mio_icif_armor_elc.java` - Restored `appendHoverText()` energy display
- `GeoGeneratorMenu.java` - Fixed energy sync: `getEnergyStored()` → `getAmount()`, `getMaxEnergyStored()` → `getCapacity()`
- `StirlingGeneratorMenu.java` - Same as above
- `SemifluidGeneratorMenu.java` - Same as above
- `NuclearReactorGeneratorMenu.java` - Same as above
- `SolarGeneratorMenu.java` - Same as above
- `AdvancedSolarPanelMenu.java` - Same as above
- `HybridSolarPanelMenu.java` - Same as above
- `UltimateHybridSolarPanelMenu.java` - Same as above
- `QuantumSolarPanelMenu.java` - Same as above
- `QuantumGeneratorMenu.java` - Same as above
- `ThermalGeneratorMenu.java` - Same as above
- `HeatGeneratorElcMenu.java` - Same as above
- `FurnaceElcMenu.java` - Same as above
- `CompressorElcMenu.java` - Same as above
- `ExtractorElcMenu.java` - Same as above
- `PowderElcMenu.java` - Same as above
- `WasherElcMenu.java` - Same as above
- `MagnetizerMenu.java` - Same as above

This mod has no related projects