# TC KubeJS Bridge (tckubejsbridge) > **中文** | [English](README_EN.md) 将 **神秘时代4(Thaumcraft 4 移植版)** 的配方与研究系统桥接到 **KubeJS**。 整合包作者可以通过 `kubejs/server_scripts/` 下的 KubeJS 脚本直接注册: - 注魔配方 - 坩埚炼金配方 - 奥术有序 / 无序合成配方 - 物品固有要素 - 自定义研究分类 / 研究节点 - 替换 TC 原有配方 作者:AlkSur | 许可证:GPL-3.0 --- ## 依赖 | Mod | 版本 | 关系 | |---|---|---| | NeoForge | 21.1.234 | 必需 | | Minecraft | 1.21.1 | 必需 | | Thaumcraft (TC4 移植版) | 0.2.2.34-port.1 | 必需 | | KubeJS (NeoForge) | 2101.7.x | 必需(插件依赖其 API) | > KubeJS 在 `neoforge.mods.toml` 中声明为 **optional**: > 未安装 KubeJS 时本 mod 不会加载插件部分,不影响游戏启动。 --- ## 构建与安装 工程位于 `modules/tc-kubejs-bridge`,属于多 module Gradle 工程。 ```bash # 在仓库根目录执行 gradle :tckubejsbridge:build ``` 构建产物: ```text modules/tc-kubejs-bridge/build/libs/KubeJS Thaumcraft-+.jar ``` 例如: ```text KubeJS Thaumcraft-1.0.0+21.1.234.jar ``` 把 jar 放入 `mods/` 文件夹即可。 --- ## 快速开始 1. 在 `kubejs/server_scripts/` 下新建一个 `.js` 文件。 2. 在脚本里使用 `ServerEvents.recipes(event => { ... })`。 3. 保存后执行 `/reload`,或重启游戏。 所有 `thaumcraft.xxx` 都是**顶层绑定**,不要写成 `event.thaumcraft.xxx`。 --- ## 配方注册 ### 1. 注魔配方 ```js ServerEvents.recipes(event => { event.recipes.thaumcraft.infusion( 'MY_INFUSION', // research 键(全局唯一) 'minecraft:diamond', // 输出 3, // 不稳定性 ['ignis 64', 'potentia 32'], // 所需源质 'minecraft:golden_apple', // 中心物品 'minecraft:blaze_rod', // 祭品 'minecraft:ender_pearl' ); }); ``` ### 2. 坩埚炼金配方 ```js ServerEvents.recipes(event => { event.recipes.thaumcraft.crucible( 'MY_CRUCIBLE', 'minecraft:diamond', 'minecraft:coal', // 催化剂 { aer: 16, ignis: 8 } // 对象写法 ); }); ``` ### 3. 奥术有序合成配方 ```js ServerEvents.recipes(event => { event.recipes.thaumcraft.arcane( 'MY_ARCANE', 'minecraft:diamond_sword', ['ignis 16', 'ordo 8'], [' I ', ' I ', ' S '], // pattern:最多 3 行 { I: 'minecraft:iron_ingot', S: 'minecraft:stick' } ); }); ``` ### 4. 奥术无序合成配方 > 注意:`arcane_shapeless` 的材料必须放在**一个数组**里。 ```js ServerEvents.recipes(event => { event.recipes.thaumcraft.arcane_shapeless( 'MY_SHAPELESS', 'minecraft:diamond_helmet', ['aer 8', 'aqua 8'], [ 'minecraft:leather_helmet', 'minecraft:diamond', 'minecraft:diamond', 'minecraft:diamond' ] ); }); ``` --- ## 物品固有要素 ```js ServerEvents.recipes(event => { // 添加 thaumcraft.addObjectTag('minecraft:stick', { aer: 1, ignis: 2 }); // 移除 thaumcraft.removeObjectTag('minecraft:stick'); }); ``` --- ## 替换已有配方 ```js ServerEvents.recipes(event => { // 先删 thaumcraft.removeInfusion('INFUSIONPROVIDER'); // 注魔 // thaumcraft.removeArcane('RESEARCH_KEY'); // 奥术 // thaumcraft.removeCrucible('RESEARCH_KEY'); // 坩埚 // 后注册,实现真正替换 event.recipes.thaumcraft.infusion( 'INFUSIONPROVIDER', 'thaumicenergistics:infusion_provider', 0, ['auram 10'], 'ae2:interface', 'minecraft:oak_planks' ); }); ``` --- ## 自定义研究分类 / 研究节点 ### 添加研究分类 ```js ServerEvents.recipes(event => { thaumcraft.addResearchCategory( 'MY_CATEGORY', 'textures/research/cat_icon.png', 'textures/research/cat_bg.png' ); }); ``` - 两个参数也可以:`addResearchCategory('MY_CATEGORY', 'textures/research/cat_icon.png')` - 不带命名空间的路径默认使用 `kubejs:` 命名空间。 ### 添加研究节点 ```js ServerEvents.recipes(event => { thaumcraft.addResearchNode({ key: 'MY_RESEARCH', category: 'MY_CATEGORY', icon: 'textures/research/my_research.png', parents: ['PARENT_KEY'], autoUnlock: true, // 默认解锁 virtual: false, // 显示在魔导手册中;true 会隐藏 hidden: false, col: 0, row: 0, complexity: 1, aspects: { aer: 1, ignis: 1 } }); }); ``` 支持字段: | 字段 | 说明 | |---|---| | `key` | 研究节点唯一 ID | | `category` | 所属研究分类,必须已存在 | | `icon` | 图标路径 | | `parents` / `parentsHidden` / `siblings` | 研究依赖关系 | | `autoUnlock` | 是否默认解锁 | | `virtual` | 是否虚拟节点(`true` 不会显示在魔导手册) | | `hidden` / `concealed` / `lost` | 可见性控制 | | `special` / `stub` / `secondary` / `round` | 研究类型标记 | | `col` / `row` / `complexity` | 研究树位置和复杂度 | | `aspects` | 研究关联要素 | ### 图标文件位置 脚本里写: ```js icon: 'textures/research/my_research.png' ``` 对应文件: ```text kubejs/assets/kubejs/textures/research/my_research.png ``` 也可以写完整路径: ```js icon: 'kubejs:textures/research/my_research.png' ``` ### 研究名称 / 描述 TC 的研究名称通过语言文件翻译。 在 `kubejs/assets/kubejs/lang/zh_cn.json` 中添加: ```json { "tc.research_category.MY_CATEGORY": "我的分类", "tc.research_name.MY_RESEARCH": "我的研究", "tc.research_text.MY_RESEARCH": "这是研究描述。" } ``` 英文则写在 `kubejs/assets/kubejs/lang/en_us.json`。 --- ## 要素 tag 参考(TC4 移植版实际值) **注意:移植版的要素 tag 是拉丁文原名,不是 TC4 汉化/英文名。** | 要素 | tag | 要素 | tag | |---|---|---|---| | 风 AIR | `aer` | 土 EARTH | `terra` | | 火 FIRE | `ignis` | 水 WATER | `aqua` | | 秩序 ORDER | `ordo` | 混沌 ENTROPY | `perditio` | | 虚空 VOID | `vacuos` | 光 LIGHT | `lux` | | 天气 WEATHER | `tempestas` | 运动 MOTION | `motus` | | 水晶 CRYSTAL | `vitreus` | 生命 LIFE | `victus` | | 能量 ENERGY | `potentia` | 交换 EXCHANGE | `permutatio` | | 死亡 DEATH | `mortuus` | 黑暗 DARKNESS | `tenebrae` | | 灵魂 SOUL | `spiritus` | 异域 ELDRITCH | `alienis` | | 魔法 MAGIC | `praecantatio` | 灵气 AURA | `auram` | | 粘液 SLIME | `limus` | 植物 PLANT | `herba` | | 树 TREE | `arbor` | 野兽 BEAST | `bestia` | | 肉体 FLESH | `corpus` | 亡灵 UNDEAD | `exanimis` | | 心智 MIND | `cognitio` | 感知 SENSES | `sensus` | | 人类 MAN | `humanus` | 工具 TOOL | `instrumentum` | | 贪婪 GREED | `lucrum` | 工艺 CRAFT | `fabrico` | | 布料 CLOTH | `pannus` | 机制 MECHANISM | `machina` | ## 热重载说明 | 内容 | `/reload` | 说明 | |---|---|---| | 注魔 / 坩埚 / 奥术配方 | ✅ | 可以热重载 | | 物品固有要素 | ✅ | 可以热重载 | | 研究分类 / 研究节点 | ❌ | TC 研究系统缓存较多,需要重启游戏 | ### research 键说明 - 如果 `research` 不是 TC 已有研究,桥接会自动注册一个**默认解锁的虚拟研究节点**,并按“无研究要求”处理。 - 如果 `research` 是 TC 已有研究,则仍然要求玩家完成对应研究。 - `research` 键全局唯一,重复键会被跳过。 ## 排障 | 现象 | 原因 | |---|---| | `Constructor for thaumcraft:arcane_shapeless with N arguments not found` | 材料没有放在数组里 | | `Unknown aspect 'xxx'` | 要素 tag 写错 | | `Item with ID xxx does not exist` | 物品 id 错误 | | 研究分类名字显示为 `tc.research_category.XXX` | 缺少语言文件 | | 研究图标 / 背景紫黑色 | 贴图不存在、路径不对、不是 PNG,或 KubeJS assets 未被加载 | | `event.thaumcraft is undefined` | 顶层绑定是 `thaumcraft.xxx`,不是 `event.thaumcraft.xxx` | ## 项目结构 ```text src/main/java/tckubejsbridge/ ├── TCKubeJSBridge.java // @Mod 主类 └── kubejs/ ├── TCKubeJSPlugin.java // KubeJS 插件:schema + bindings ├── TCRecipeKJS.java // 自定义 KubeRecipe 基类 ├── TCRecipeBridge.java // TC API 调用 / 去重 / 移除 / 研究注册 ├── AspectListComponent.java // 源质列表组件 ├── InfusionRecipeKJS.java // 注魔配方 ├── CrucibleRecipeKJS.java // 坩埚配方 ├── ShapedArcaneRecipeKJS.java // 奥术有序配方 └── ShapelessArcaneRecipeKJS.java // 奥术无序配方 src/main/resources/ ├── kubejs.plugins.txt // 插件发现文件 └── META-INF/neoforge.mods.toml example/infusion_example.js // 示例脚本 ```