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 transformerNEIDTransformer、指定 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 阶段)
- MixinExtendedBlockStorage - 用两个
short[4096](block + meta)完全替换原版byte[]+ NibbleArray 存储;提供IExtendedBlockStorageMixin接口 - MixinAnvilChunkLoader - 区块 NBT 序列化
Blocks16/Data16与 vanillaBlocks/Add/Data互转;由PostNeidWorldsSupport开关决定是否写回 vanilla 字段 - MixinS21PacketChunkData - 区块数据包体积/字节拷贝/客户端转换管线
- MixinS22PacketMultiBlockChange - 多方块变化包按方块 6 字节 (2 ID + 2 meta + 1 sky + 1 block) 重写
- MixinS23PacketBlockChange - 单方块变化包 Metadata 用 short 写/读
- MixinS24PacketBlockAction - 块事件包 ID 位掩码从 0xFFF 升到 0xFFFF
- MixinS26PacketMapChunkBulk - 批量区块包 EBS 字节尺寸常数从 8192 升到 18432
- MixinBlock - 把
Block.harvestTool[]/harvestLevel[]大小 16 的固定数组换成 HashMap,节省 16-bit metadata 下的 GB 级内存 - MixinBlockFire - 火方块
field_149849_a/field_149848_b数组大小从 4096 升到 32767 - MixinDataWatcher - 可选(
ExtendDataWatcher)扩展 DataWatcher ID 上限 31 → 127,配套 write/read byte→short - MixinItemInWorldManager -
tryHarvestBlock元数据位移常数 12 → 16 - MixinPlayerControllerMP -
onPlayerDestroyBlock元数据位移常数 12 → 16 - MixinNetHandlerPlayClient - 客户端多方块变化包按 short 读取方块 ID / Metadata
- MixinChunk - 客户端
fillChunk用 16-bit short 数组替换 byte / NibbleArray,并删除 MSB 循环 - MixinWorld -
World.breakBlock元数据位移常数 12 → 16 - MixinStatList -
StatList.<clinit>中方块数数组长度 4096 → 32767 - MixinS21PacketChunkDataThermosTainted - Thermos 服务端专用变体(同 MixinS21PacketChunkData,但走
NibbleArray.copyToByteArray路径)
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.getBlockId16-bit 调用 - UndergroundBiomesOreUBifier ASM - Underground Biomes
OreUBifier.renewBlockReplacers中 4096 → 32768 数组长度 - WorldEditBaseBlock ASM - WorldEdit
BaseBlock.internalSetId中的 4095 整数上限与错误消息字符串字面量同步替换
接口 / 辅助类型
- IExtendedBlockStorageMixin - Mixin 注入
ExtendedBlockStorage后暴露的 short/block/meta 双向访问接口
跨条目引用说明
NEID 不存在方块/物品/实体等传统维度条目,所有"条目"均为上述运行期子系统。