跳到正文

Tinker’s Construct Crafting Station Fix

作者:Saereth

修复 TConstruct 合成站的问题:Shift 点击时 ItemCraftedEvent 收到空 ItemStack(#5599),以及 KubeJS 的 modifyResult() 回调在非原版合成容器中通过 ForgeHooks 回退时无法获取合成玩家。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

CurseForge 描述

合成站修复

一款轻量级的 mixin 模组,修复了 TConstruct 合成站中与 Forge 事件和 KubeJS 配方交互相关的两个漏洞。

漏洞 1:Shift-Click 时 ItemStack 为空(TConstruct#5599)

在合成站的结果槽位上按住 Shift 单击时,ItemCraftedEvent 触发时携带的是空的 ItemStack,而不是实际合成出的物品。这会导致任何监听该事件的模组或脚本无法正常工作。

根本原因:quickMoveStack() 在将合成结果传递给 takeResult()(该方法会触发事件)之前,先通过物品栏移动操作传递该物品堆,而这些操作会直接将其清空。

修复方案:通过 @Redirect mixin 在事件触发前直接从配方中重新获取合成结果。

漏洞 2:KubeJS 的 modifyResult() 在合成站中失效

使用 modifyResult() 的 KubeJS 配方如果依赖合成玩家(例如检查维度或玩家专属 NBT),在合成站中合成时会产生错误结果。回调接收到的玩家参数为 null。

根本原因:KubeJS 只会通过检查原版的 CraftingMenu 或 InventoryMenu 实例来获取玩家。TConstruct 使用自己的 CraftingStationContainerMenu,并配有一个没有菜单引用的 CraftingContainerWrapper。TConstruct 会在配方组装前正确调用 ForgeHooks.setCraftingPlayer(),但 KubeJS 从未检查这个备用来源。

修复方案:在 ModifyRecipeCraftingGrid.getPlayer() 上添加 @Inject mixin,增加 ForgeHooks.getCraftingPlayer() 备用获取方式。这适用于任何正确设置了 ForgeHooks 上下文的模组化合成容器。

运行要求

  • Minecraft 1.20.1
  • Forge 47+
  • Tinkers’ Construct 3.8+
  • KubeJS 2001.6+

技术详情

此模组包含两个 mixin,除此之外没有其他运行时代码。

常见问题

Tinker’s Construct Crafting Station Fix 支持哪些 Minecraft 版本?

Tinker’s Construct Crafting Station Fix 支持 Minecraft Java 版 1.20.1,可用的加载器:Forge。下载时注意选择和你游戏版本一致的文件。

Tinker’s Construct Crafting Station Fix 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Forge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

Saereth 的其他作品

查看全部 →