ThaumicTinkerer

[!INFO] Git Commit: e4c8acd | Updated: 2026-10-02

ThaumicTinkerer(Thaumic Tinkerer)是 Thaumcraft 4 的附属模组,由 nekosune、Pixlepix、Vazkii、mitchej123 等人维护,是 Elemental Tinkerer 的精神续作。源码头部与 mcmod.info 都自述为 “An addon to Thaumcraft 4, implementing new content”,并注明「本模组的研究在魔导书中以 [TT] 前缀标记」(src/main/resources/mcmod.info)。它为魔法世界补充了浮空运输、KAMI 维度体系、注水火焰、位移方块组、14 个自定义附魔,以及 ComputerCraft / OpenComputers 两套外设集成。

身份标识

本模组有 6 个身份字符串,其中 4 个与分类名不同,引用配置或调试时必须区分:

项目 值 与分类名 thaumictinkerer 是否相同
modid ThaumicTinkerer 否(驼峰)
FML 容器 modid(coremod) ThaumicTinkerer-preloader 否
资源域 ttinkerer 否
分类名 thaumictinkerer —
目录名 ThaumicTinkerer 否(驼峰)
jar 名 ThaumicTinkerer 否(驼峰)
  • modid:thaumic.tinkerer.common.lib.LibMisc.MOD_ID = "ThaumicTinkerer"(LibMisc.java:18),用于 @Mod(modid = LibMisc.MOD_ID, …)(ThaumicTinkerer.java:45)。gradle.properties 的 modId 同为 ThaumicTinkerer。
  • coremod:thaumic.tinkerer.preloader.ThaumicTLoaderContainer 实现 IFMLLoadingPlugin + GTNHLib 的 IEarlyMixinLoader,getModId() 返回 ThaumicTinkerer-preloader(ThaumicTLoaderContainer.java:41-43),getName() 返回 Thaumic Tinkerer Core,getVersion() 硬编码 "0.1"(:53)。由 gradle.properties 的 coreModClass = preloader.ThaumicTLoaderContainer 声明。它不注入任何 ASM 转换器 —— getASMTransformerClass() 返回 null(:72-74),只负责提前注入 2 个 Mixin。
  • 资源域:assets/ttinkerer/(textures、lang、model 均在此目录下)。
  • jar 名:gradle.properties 的 customArchiveBaseName 处于注释状态,因此沿用默认的 modId = ThaumicTinkerer。
  • 显示名:LibMisc.MOD_NAME = "Thaumic Tinkerer"(LibMisc.java:19,含空格)。注意 relation.md 中登记的显示名为 ThaumicTinkerer(无空格),与源码内的 MOD_NAME 及 gradle.properties 的 modName 不同。

生命周期

@Mod 类只有 1 个:thaumic.tinkerer.common.ThaumicTinkerer(ThaumicTinkerer.java:45)。全部 334 个 .java 文件中 @Mod( 只出现这 1 次;@Mod 注解不重复统计 coremod(coremod 走 IFMLLoadingPlugin 而非 @Mod)。

注册经由 @SidedProxy 分发到 TTCommonProxy / TTClientProxy:

阶段 关键调用 位置
preInit 工具材质、配置加载、维度素材辅助类、registry.preInit()、CC 外设、KAMI 稀有度枚举 TTCommonProxy.java:123-144
init 附魔、药水、registry.init()、GUI handler、封包注册、事件订阅、OC 驱动、Multipart、NEI TTCommonProxy.java:147-186
postInit ResearchHelper.initResearch()、registry.postInit()、作物掉落表、聚焦黑名单 TTCommonProxy.java:190-195
serverStarting 3 个服务端命令 + 药水效果处理器 TTCommonProxy.java:197-207

依赖

宿主模组为 Thaumcraft,依据是 dependencies.gradle 中的 api('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev'),以及 mcmod.info 的 "dependencies": ["Thaumcraft"] 与 LibMisc.DEPENDENCIES 中的 required-after:Thaumcraft(LibMisc.java:24)。

Thaumcraft 本身不在 /Users/evlos/a/mirror/ 中(该目录只有 thaumcraft4、thaumcraft-api、thaumcraft-research-tweaks、ThaumcraftMobAspects 等)。因此本页对 Thaumcraft 侧的行为(要素语义、研究分类含义、Config.allowMirrors 的具体效果)不做断言,只记录本仓库的调用点与版本串。

类型 依赖 版本 / modid 依据
硬 Thaumcraft 1.7.10-4.2.3.5 dependencies.gradle api(...) + required-after:Thaumcraft
硬 Baubles Expanded 2.2.21-GTNH,modid Baubles|Expanded dependencies.gradle api(...)
硬 Applied Energistics 2 (Unofficial) rv3-beta-994-GTNH,modid appliedenergistics2 dependencies.gradle api(...)
硬 Thaumic Boots 1.5.12,modid thaumicboots dependencies.gradle api(...)
软 ComputerCraft curse.maven:computercraft-67504 compileOnly;另有 required-after 无版本约束
软 IC2 industrialcraft-2:2.2.828-experimental compileOnly;LibMisc.DEPENDENCIES 中为 after:IC2
软 Waila waila:1.19.30 compileOnly;after:Waila
软 ForgeMultipart ForgeMultipart:1.7.10 compileOnly;after:ForgeMultipart
软 Tinkers’ Construct TinkersConstruct:1.14.93-GTNH compileOnly
软 Botania Botania:1.13.25-GTNH compileOnly
软 Ender IO / Ender Storage / EnderCore 2.10.31 / 1.8.3 / 0.5.14 compileOnly
软 OpenComputers OpenComputers:1.12.47-GTNH compileOnly
软 GT5-Unofficial 5.09.54.01 compileOnly,并显式 exclude 自身的 ThaumicTinkerer 构件
软 CoFH Core cofh-core-69162 compileOnly
仅开发 AspectRecipeIndex 1.1.3 devOnlyNonPublishable
仅开发 Electro-Magic-Tools 1.7.24 runtimeOnlyNonPublishable,且被注释

LibMisc.DEPENDENCIES 完整串为:required-after:Forge@[10.12.1.1112,);required-after:Thaumcraft;before:advthaum;after:IC2;after:Waila;after:ForgeMultipart;after:ComputerCraft(LibMisc.java:24)。其中 before:advthaum 是唯一的负向依赖声明。Forge 的版本下界在此为 10.12.1.1112,低于 gradle.properties 中的构建版本 10.13.4.1614。

LoadedMods 另检测到 17 个软依赖运行时状态,完整清单见 软依赖与兼容层。

注册内容(仅计活的)

TTRegistry.preInit() 共 82 次注册调用(31 loadSimpleBlock + 3 loadMetaBlock + 46 loadSimpleItem + 2 loadMetaItem,TTRegistry.java:37-118)。每个类还要再过 shouldRegister() 判定:

类别 注册类数 无条件存活 条件存活 永不注册
方块 34 30 3(CC 2 + enableKami 1) 1(BlockRPlacer)
物品 48 26 22(enableKami) 0

按 loadMeta* 展开后的实际游戏对象数为 83 个方块实例 + 50 个物品实例(含 BlockTravelSlab/BlockWardSlab/BlockDarkQuartzSlab 各多 1 个全砖,ItemGas 多 1 个形态,ItemIchorclothArmor 多 3 个部位)。

其他注册:14 个附魔、41 行附魔要素定价、15 个直注册研究 + 59 个由物品/方块自带的研究、10 个网络 ID(9 个类)、17 个 CC 外设类型、6 个 OC 驱动、3 个服务端命令、1 个自定义维度、0 个自定义 Aspect(只消费 Thaumcraft 的 Aspect 常量)。

已确认的代码事实

以下 5 项均以 grep 证据核实,不作为缺陷断言 —— 仓库内没有测试、注释或提交信息表明它们是有意为之:

  1. BlockRPlacer 是死注册:TTRegistry.java:51 调用了 loadSimpleBlock(new BlockRPlacer()),但 BlockRPlacer.java:91-93 的 shouldRegister() 无条件 return false。连带后果是 KEY_REMOTE_PLACER 研究永不注册、PacketPlacerButton 没有可交互目标。
  2. 8 个附魔共用 Vampirism 的研究键:EnchantmentManager.java:218-274 为 Focused Strike、Dispersed Strikes、Valiance、Final Strike、Tunnel、Shatter、Shockwave、Pounce 全部传入 KEY_ENCHANT_VAMPIRISM;LibResearch 为它们各自定义的键只被 ResearchHelper 直注册,不作为解锁条件。
  3. ModEnchantments.dispersedStrikes 被注册两次:EnchantmentManager.java:225-231 与 :232-238 参数完全相同;因 registerData() 按 (effectId, level) 覆盖写入,结果不受影响。
  4. ModEnchantments 有 3 个声明后从未赋值的字段:filtration、imbued、resolute。
  5. BlockForcefield 的 TileEntity 未注册:createTileEntity() 与 hasTileEntity() 已实现(BlockForcefield.java:40-46),但未覆写 ITTinkererBlock.getTileEntity(),故 GameRegistry.registerTileEntity() 从未为 TileForcefield 执行。对 34 个方块交叉核对后,它是唯一有运行时 createTileEntity() 却无 getTileEntity() 的方块。

另有 2 个未被引用的兼容类(OCCompat、FumePeripheral)与 1 个被 git 跟踪的 .orig 残留文件,见 软依赖与兼容层。

异常处理

位置 写法 是否吞异常
ContainerIchorPouch.java:41-43 catch (Exception ignored) {} 是,空语句体,手持物非 ItemFocusPouch 时 stackList 保持未赋值
ReflectionHelper.java:65 catch (NoSuchMethodException ignored) {} catch (Exception e) 良性探测写法,第二个分支重抛
TTCommonProxy.java:174-179 catch (Throwable e) 否,log.error("Error registering multiparts", e)
TileAnimationTablet.java:180 catch (Throwable e) 部分,printStackTrace() 后走错误提示分支
EnumMobAspect.java:205-207 catch (Throwable e) 否,throw new RuntimeException(e)
TTClientProxy.java:197 catch (Throwable e) 见该处
compat/BloodMagic.java:14-16 catch (ClassNotFoundException e) 否,printStackTrace()

Mixin

mixins.ThaumicTinkerer.json 的 mixins / client / server 三个数组全为空,mixins.ThaumicTinkerer.early.json 完全没有数组字段。真正的 Mixin 列表在 coremod 中硬编码:

Mixin 生效端 源码
AccessorItemInWorldManager 客户端 + 服务端 ThaumicTLoaderContainer.java:100-104
renderer.MixinRenderBlocks 仅客户端 ThaumicTLoaderContainer.java:104

getMixins() 先判 FMLLaunchHandler.side().isClient():非客户端只返回 AccessorItemInWorldManager,客户端返回两个(ThaumicTLoaderContainer.java:100-105)。两个 Mixin 类位于 thaumic.tinkerer.mixins / …mixins.early.renderer,与 gradle.properties 的 mixinsPackage = mixins 一致。

附魔列表

  • 自定义附魔 - 14 个自定义附魔的 ID、等级上限、要素与研究门控
  • 附魔要素定价 - 26 个原版附魔的要素重定价表与逐级放大公式

物品列表

方块列表

研究列表

  • 研究总览 - 91 个研究键的可达性审计、13 个无构造点的键与 KAMI 自动前置机制

配置列表

网络列表

  • 网络封包 - 通道 ThaumicTinkerer|B 与 ID 142–151 的 10 次注册

集成列表

API 列表

版本证据

项目 值 证据
Minecraft 1.7.10 gradle.properties 的 minecraftVersion = 1.7.10;mcmod.info 的 "mcversion": "${minecraftVersion}";ThaumicTLoaderContainer 的 @MCVersion("1.7.10")
Forge 10.13.4.1614(构建)/ 10.12.1.1112(依赖下界) gradle.properties 的 forgeVersion;LibMisc.DEPENDENCIES 的 required-after:Forge@[10.12.1.1112,)
提交 e4c8acdd4fa95ba6b80e165d248a3bd3f5392762 git rev-parse HEAD,经 git cat-file -t 确认为 commit 对象
提交日期 2026-09-20 git log -1 --format=%cI

不使用 git describe 作为版本闸门:该仓库是深度为 1 的浅克隆(git rev-parse --is-shallow-repository 为 true,git log --oneline | wc -l 为 1),git describe --tags 返回 2.12.33 —— 这是本模组自身的版本号,既不含 MC 版本也不含分支标识,与树内容无对应关系。