NotEnoughIds

[!INFO] Git Commit: e10989e | Updated: 2026-09-29

GTNH 维护的 Minecraft 1.7.10 方块 ID / Metadata 上限突破库(Coremod)。通过 Mixin 与 ASM transformer 重写原版 ExtendedBlockStorage / World / AnvilChunkLoader / 各种网络包 / 数据监视器等关键类,把 12 位 (4096) / 4 位 (16) 的硬编码限制分别扩展为 15 位 (32767) / 16 位 (65535),并通过 ClientBlockTransformerRegistry 暴露 API 让其他 mod 在客户端渲染前修改方块。

NotEnoughIds 不注册任何方块/物品/实体/成就/世界/维度,它是一个透明的"运行期补丁 + 客户端方块转换钩子"基础库。

源码: /home/evlos/a/mirror/NotEnoughIds/ 原作者: fewizz(MIT 协议),GTNH 修改: Cleptomania / GTNH Team(LGPL v3.0+)。

运行期架构

NEID 同时是一个 FML LoadingPlugin 与 EarlyMixinLoader:

  • core/NEIDCore.java — 实现 IFMLLoadingPlugin + IEarlyMixinLoader,注册 ASM transformer NEIDTransformer、指定 mixin 配置 mixins.neid.early.json,用 @IFMLLoadingPlugin.MCVersion("1.7.10") 锁定版本,并把整个 com.gtnewhorizons.neid.asm 包从 ASM transformer 自身扫描中排除。
  • asm/NEIDTransformer.java — LaunchWrapper 入口,对每个加载的类查询 ClassNodeTransformers 枚举决定是否改写;改写后可选地把字节码 dump 到 minecraftHome/ASM_NEID/(-Dneid.dumpClass=true)。
  • ru/fewizz/idextender/IEPlugin.java — 唯一作用:类路径里必须存在 ru.fewizz.idextender.IEPlugin,FastCraft 才认 NEID 存在并切换到兼容路径;所有方法均空实现。

维度总览(按维度入口列出)

NotEnoughIds 没有任何 Block / Item / Entity / Enchantment / Potion / Biome / Dimension / KeyBinding / Structure / Achievement / ItemEffect 可注册,本页只覆盖它作为"系统库"涉及的运行期概念。

设置与配置

  • NEIDConfig - 4 项运行期开关(CatchUnregisteredBlocks / RemoveInvalidBlocks / PostNeidWorldsSupport / ExtendDataWatcher),通过 GTNHLib 注册
  • Constants - 15 位 (32767) 方块 ID 与 16 位 (65535) Metadata 的全部硬编码常量;EBS / Chunk 字节尺寸;DataWatcher 127 ID 上限
  • Hooks - ASM transformer 反向调用的静态桥接方法,按 y<<8 | z<<4 | x 平铺索引从 16 位 short 数组读方块 ID

客户端方块转换钩子系统

  • ClientBlockTransformerRegistry - 客户端发送方块前批量/单点转换注册表,遍历注册的 ClientBlockTransformer,让其他 mod 在 S22/S23/S26 等网络包写入前改写方块/Metadata
  • ClientBlockTransformer 接口 - 单点 + 批量(带 BlockIdCache 缓存)的客户端方块变形 API

Mixin 子系统(早期 mixin 阶段)

ASM Transformer(外部 mod 兼容补丁)

  • NEIDTransformer - LaunchWrapper IClassTransformer 总入口
  • ClassNodeTransformers - 6 个 transformer 的注册表枚举
  • FmlRegistry ASM - 改写 cpw.mods.fml.common.registry.GameData / FMLControlledNamespacedRegistry 的 MAX_BLOCK_ID 与 4095 上限
  • CofhBlockHelper ASM - CoFH BlockHelper.<clinit> 中的 4096 / 1024 数组长度升到 32768
  • MFQM ASM - MoreFunQuicksandMod MFQM.preInit 中的 DataWatcher 上限 31 → 127
  • UndergroundBiomesBiomeUndergroundDecorator ASM - Underground Biomes 群系装饰器替换原 getBlockLSBArray 为 Hooks.getBlockId 16-bit 调用
  • UndergroundBiomesOreUBifier ASM - Underground Biomes OreUBifier.renewBlockReplacers 中 4096 → 32768 数组长度
  • WorldEditBaseBlock ASM - WorldEdit BaseBlock.internalSetId 中的 4095 整数上限与错误消息字符串字面量同步替换

接口 / 辅助类型

  • IExtendedBlockStorageMixin - Mixin 注入 ExtendedBlockStorage 后暴露的 short/block/meta 双向访问接口

跨条目引用说明

NEID 不存在方块/物品/实体等传统维度条目,所有"条目"均为上述运行期子系统。