Attention:This mod cannot completely fix the SlashBlade action issue on the YSM model unless YSM officially releases the relevant code or provides a patch
注意:此模组无法完全修复YSM的拔刀剑动作,除非YSM官方开源相关代码
Client-side only | Minecraft 1.21.1 | NeoForge | MIT
Restores the SlashBlade: Resharped behaviour that Yes Steve Model (YSM) lost on 1.21.1, matching how it already behaves on 1.20.1.
With YSM + SlashBlade on 1.21.1 you may see:
The same YSM version (2.6.5) behaves correctly on 1.20.1 — so this is a 1.21.1 build problem, not "SlashBlade 2.x changed something".
LayerMainBlade). YSM takes over entity rendering, the vanilla renderer never runs, and the layer dies with it. This mod recreates the transform environment that layer needs.isSlashBlade always returns false). This mod supplies the two missing return values, matching the 1.20.1 animation-name rules exactly.slashblade:idle and friends, falling back to the original name when the model pack does not declare them.compat/slashblade package is missing from the 1.21.1 release jar. All three lost pieces are restored verbatim: the hand render branch, the back-slot render branch, and the swing() override that gives a maid a slash arc and a blade that leaves its sheath when she attacks.All optional — a missing mod simply disables its part, it will never crash.
| Mod | Version |
|---|---|
| Yes Steve Model | 2.6.x |
| SlashBlade: Resharped | 2.x |
| Touhou Little Maid | 1.5.x |
Required: Minecraft 1.21.1 + NeoForge (21.1.x). Client only.
EntityRenderDispatcher that YSM hijacks — only third-person and the paperdoll do — so it is handed back to SlashBlade's original behaviour, i.e. the 1.20.1 look. Set firstPersonMode=model if you would rather have this mod draw a 3D held blade instead.slashblade:* animations" itself, independent of how the animation name is computed. The same issue reproduces identically on 1.20.1 (YSM 2.6.5-forge + the same model pack + SlashBlade 1.9.65), so this is a behaviour inherent to YSM itself rather than a 1.21.1 regression. See README §6.6.This mod only restores; it never replaces.
LayerMainBlade) — this mod only restores the call that YSM skipped. That means the blade's hook points come from the vanilla player model, so during the full attack sequence the player's blade does not line up with YSM's animation (see "Known limitations" above). Binding the blade to YSM's model bones would require a separate renderer, which this mod deliberately does not do: YSM's internal classes are obfuscated, so bone binding means binding obfuscated names — it breaks on every upstream update, and when it breaks it crashes rather than quietly doing nothing.This is a temporary patch, not a replacement — it retires once upstream fixes it. The author contacted the upstream authors about both sides, explained what this mod does, and apologised for the fact that parts of the code were decompiled while locating the root cause.
slashblade. This mod simply restores them; the maid part retires once upstream ships it.Authorisation: this mod's injection into YSM only supplies return values — it does not copy or redistribute any of YSM's implementation. It has been approved by the YSM author, who was also informed that parts of the code were decompiled while diagnosing the issue. The jar contains no third-party code or assets.
Retirement commitment:
| Trigger | What this mod does |
|---|---|
| YSM implements its own SlashBlade integration | declares ②③ obsolete; removes or disables the corresponding switches |
Touhou Little Maid restores compat/slashblade (rendering + logic) |
declares ④ obsolete; removes the maid mixins |
| Both are fixed | this mod loses its reason to exist ⇒ pulled from CurseForge (archived rather than deleted, per community practice — deleting would break modpacks that pin the file ID + hash) |
Every targeted injection is version-gated and failure-soft: when upstream changes a target, that feature skips itself — it goes inactive, it does not crash — so retirement has no urgent deadline. Conversely: if upstream is fixed and this mod has not retired yet, users may not be able to tell who fixed it — which is why this section exists.
MIT licensed. Full third-party attribution in NOTICE.
The code is supervised by DeepSeek.
YES-SB —— 让 YSM 的拔刀剑回到 1.20.1 的样子
纯客户端模组 | Minecraft 1.21.1 | NeoForge | MIT 开源
把 Yes Steve Model(YSM) 在 1.21.1 上丢掉的 拔刀剑:重锋 表现,还回 1.20.1 的样子。
在 1.21.1 上同时装了 YSM 和拔刀剑:重锋,可能会发现:
同一个 YSM 版本号(2.6.5),在 1.20.1 上这些 全都是正常的。 所以问题出在 1.21.1 的构建,而不是"拔刀剑 2.x 改了什么"。
本模组把这几件事补回来。
拔刀剑的"刀 + 鞘"在第三人称下不是手持物,而是挂在实体渲染器上的一个渲染层(LayerMainBlade), 按 MMD 的刀挂点绘制:平时刀插在腰间的鞘里,连招时按动作把刀拔出来挥砍。
YSM 在 EntityRenderDispatcher 里接管了实体的渲染,原版渲染器不再执行, 挂在它上面的渲染层就一起停摆了 —— 腰上的刀因此消失。
本模组在"原版渲染器被跳过"的确切时机补回渲染层所需的变换环境,让拔刀剑自己那一层重新跑起来。
YSM 的持握/挥动解析器会按连招状态取一个动画名再播放,它的 1.21.1 构建里这套 API 的调用方是完好的, 但拔刀剑兼容模块是空实现(isSlashBlade 恒为 false),整段逻辑是死代码。
本模组补回 两个缺失的返回值:isSlashBlade(stack) 与 getAnimationName(ctx)。 动画名规则完全对齐 1.20.1 的实现(含 combo_a4_ex → combo_a4ex 的改名、居合斩的空中变体)。
如果算出的动画名不在模型包里,本模组会返回空串 —— 因为 YSM 拿到"非空但模型没有"的名字时会跳过后续 普通挥动逻辑,模型会卡在上一帧姿态出不来。这是一个踩过的坑。
手持拔刀剑时,待机 / 走 / 跑 / 跳 / 潜行 / 飞行这些主动画会先问 slashblade:idle 之类; 模型包里有就播专属动作,没有就 退回原名。这是 1.20.1 那份兼容模块的另一半,同样被掏空了。
车万女仆自己实现了女仆的拔刀剑渲染与挥刀,在 1.20 与 1.21 分支源码里都还在, 但 1.21.1 的发布版 jar 里 compat/slashblade 整个包都不存在(源码在、发布 jar 里没有,可确证)。 丢掉的是 三处:
| 丢掉的 | 后果 |
|---|---|
| 手部渲染 | 女仆手里的刀掉进普通物品渲染路径,而拔刀剑的 BEWLR 对第三方称上下文什么都不画 ⇒ 手里空着 |
| 背槽渲染 | 装饰槽里的刀掉进 FIXED 上下文,被画成一张 平面图标 |
| 挥刀 | 连 EntityMaid 里那个 swing() 覆写本身都不存在了 ⇒ 女仆攻击正常、伤害正常,但没有刀光,刀也不出鞘 |
本模组按 TLM 源码 原样补回 这三处,变换数值一个没改。
挥刀那一处补起来比较特别,值得单独说明:它的两个副作用分属两侧 —— 刀光由服务端生成(斩击特效实体,再由原版实体同步发给所有客户端), 出鞘动作则靠客户端自己那份物品上的时间戳驱动。 而
swing()恰好是两侧都会跑到的方法,上游正是利用这一点。 本模组沿用同一思路,并且不注入车万女仆 —— 因为那个覆写已经不存在了,我们改挂原版LivingEntity#swing,再自行判定"是不是女仆"。 也就是说这一处没有修改车万女仆的任何字节码。 另外还带一道"让路闸":上游哪天自己把覆写加回来,本项会自动失效,不会变成两道刀光。
以下均为 可选:没装的模组对应功能自动失效,不会崩溃。
| 模组 | 版本 | 为什么需要 |
|---|---|---|
| Yes Steve Model | 2.6.x | 补偿渲染只在它存在时才有意义 |
| 拔刀剑:重锋 | 2.x | 渲染还原依赖它公开的 LayerMainBlade |
| 车万女仆 | 1.5.x | 补回它丢失的女仆拔刀剑渲染与挥刀分支 |
必需前置:Minecraft 1.21.1 + NeoForge(21.1.x)。
YES_SB-1.0.8.jar 放进 .minecraft/mods/(版本隔离时是 versions/<版本名>/mods/);只需要装在客户端。 服务器不需要,也不会因为服务器没装而出问题。
⚠️ 升级时只保留一个 jar。 同一个 modId 的两个 jar 放在一起会冲突 —— 换新版时请把旧的那份从
mods/里移走。
启动后日志里搜索 [YES-SB] 可以确认状态,例如:
[YES-SB] 已就绪:YSM 2.6.5-neoforge+mc1.21.1,拔刀剑 已安装,车万女仆 已安装。第三人称腰刀补偿=开,剑技动画=开,主动画变体=开,女仆拔刀剑=开,女仆挥刀=开,靶向注入版本白名单=命中
[YES-SB] 注入女仆渲染层:com.github.tartaricacid.touhoulittlemaid.client.renderer.entity.geckolayer.GeckoLayerMaidHeld
[YES-SB] 注入女仆渲染层:net.minecraft.world.entity.LivingEntity
没装 YSM 时会输出 [YES-SB] 未检测到 YSM:原版渲染本就正常,无需补偿。 并保持惰性。
升级到新版本后首次进入已有存档,NeoForge 可能会打印
The following mods have version differences that were not resolved: yes_sb (…)—— 那是它拿存档里记录的模组版本与当前版本做对比的常规提示。 本模组不在存档里存任何数据,可以忽略。
首次启动生成 config/yes_sb.properties。 所有键都支持热重载 —— 改完存盘约 2 秒生效,不需要重启游戏。
总开关:
| 键 | 默认 | 作用 |
|---|---|---|
enabled |
true |
总开关;false 时完全惰性(等价于卸掉本模组) |
debugLog |
false |
排查开关(关闭时开销为零)。报问题时请开一次,把日志里所有 [YES-SB] 开头的行附上 —— 本模组做的多是"看不见就等于没干活"的补漏,没有这些行很难定位 |
按功能分组的常用键:
| 键 | 默认 | 作用 |
|---|---|---|
restoreThirdPerson |
true |
① 还原第三人称腰挂刀与连招出鞘 |
thirdPersonScale |
0.7 |
补偿缩放,对齐 YSM 模型的整体缩小比例 |
waistOffsetX / Y / Z |
0 |
腰挂刀的额外位移(方块,正数 = 向上 / 向前) |
slashbladeComboAnimations |
true |
② 剑技动画触发 |
slashbladeMainStateAnimations |
true |
③ 主动画的拔刀剑变体 |
maidSlashBlade |
true |
④ 车万女仆的拔刀剑渲染(手部 + 背槽) |
maidSlashBladeAttack |
true |
④ 车万女仆的挥刀(刀光 + 出鞘);与上一项分开,便于对照排查 |
firstPersonMode |
auto |
第一人称:auto 交回拔刀剑原生(= 1.20.1 的样子)/ model 画 3D 刀身 / icon 画平面图标 / off 永远不干预 |
完整键表(共 51 项)见 README。
上面这条链接不要带
#锚点—— CurseForge 的描述编辑器会把带中文锚点的 URL 清成空 (实测贴上去会变成href="",点了只跳回本页)。
本模组把 1.21.1 上 丢失的渲染与动画触发 补了回来,但下面几条 尚未 达到 1.20.1 的效果, 列出来以免误导:
玩家的刀跟不上 YSM 的动画(未解决)。 玩家这条路走的是拔刀剑自己的渲染层,它的刀挂点是从 原版玩家模型 的各部位算出来的; 而屏幕上显示的角色是 YSM 的模型在播 YSM 的动画。两套动画,刀自然对不上。 目前的表现是:手持非攻击姿态时刀在手上,整套攻击流程中刀与模型动作不同步。
女仆的剑技动画不在本模组范围内(已定案)。 本模组补回的是 "刀光 + 出鞘";无其他模组时,女仆的拔刀剑攻击默认就是普通挥动 —— 这是 1.20.1 参照版本本来就有的行为,不是缺陷。 想让女仆真的打出连招,请使用专门做这件事的模组(如 车万女仆:真正的力量)。
第一人称默认不接管(已定案)。 第一人称不经过 YSM 接管的 EntityRenderDispatcher,YSM 从来没掐过它 —— 1.20.1 的第一人称就是拔刀剑自己那套 BladeFirstPersonRender(一整把刀斜跨画面), 1.21.1 上本来也是好的。所以默认 auto:原版画得出来就放手,画不出来才兜底。 想改用本模组画的 3D 手持刀身就设 firstPersonMode=model, 并按日志里的"刀原点(相机空间)"用 firstPersonOffsetX/Y/Z 收敛。
靶向注入对第三方版本敏感。 本模组依赖 YSM / 车万女仆的内部结构。上游模组更新后这些靶点可能失效, 届时对应功能会自动跳过 —— 表现为 功能不生效,不会崩溃。
空中连招第二段收招后,模型会停在滞空姿势,落地也不切回地面动画(非本模组造成)。 需要按一次鼠标左/右键才能恢复;移动、疾跑、跳跃都无法解除。 排查结论:本模组的两条动画注入全部关闭时不复现(但那样也没有任何拔刀剑专属动画), 只开任意一条都复现 —— 触发条件是"让 YSM 去播模型包的 slashblade:* 动画"这件事本身, 与动画名怎么算无关。在 1.20.1 上现象完全一致, 故这是 YSM 本身的固有行为,不是 1.21.1 的回归。 详见 README §6.6。
ysm.json 里声明 slashblade 动画文件; 官方文档写明:不声明就沿用普通剑动画。这不是本模组能替你解决的。本模组只做「补回」,不做替换。
LayerMainBlade)画的 —— 本模组只是把 YSM 掐掉的那一次调用补回去。因此刀的挂点来自原版玩家模型, 整套攻击流程中玩家的刀与 YSM 模型的动画不同步(见上面「已知限制」第一条)。 要让刀真正绑在 YSM 模型的骨骼上,需要另外写一套渲染器 —— 本模组刻意没有这么做: YSM 的内部类经过混淆,绑骨骼等于绑混淆名,上游一升级就断, 而且出错是崩溃,不是"没效果"。本模组的定位是 临时补丁,不是替代品 —— 上游修复后即退役。 本模组作者已就两侧的问题主动联系上游作者,说明来意并致歉(第一次做修复补丁,缺乏经验)。
关于运行时注入的授权:本模组对 YSM 的注入是"只补返回值、不搬运实现", 已获其作者同意;作者亦已知悉"为定位根因做过局部的字节码层面分析"一事。 成品 jar 不含任何第三方代码或资源。
退役承诺(对上游与用户都成立):
| 触发条件 | 本模组要做的事 |
|---|---|
| YSM 正式实现拔刀剑联动 | 声明 ②③ 失效、移除或标注对应开关 |
车万女仆正式补回 compat/slashblade(渲染 + 挥刀) |
声明 ④ 失效、移除女仆相关混入 |
| 两侧都修完 | 本模组整体失去存在意义 ⇒ 从 CurseForge 撤下(按社区惯例归档而非删除,避免破坏锁定 file ID + 哈希的整合包) |
所有靶向注入都带 版本白名单 + 失败即静默:上游一改靶点,对应功能自动跳过 (表现为不生效,不会崩溃)⇒ 退役不存在紧急时间窗。 反过来也要注意:上游修好、本模组却还没退役时,用户可能分不清"是谁修好的" —— 所以这里把话说清楚。
本项目以 MIT 协议开源,第三方归属的完整声明见 NOTICE。
| 项目 | 协议 | 本项目的关系 |
|---|---|---|
| 拔刀剑:重锋 | 代码 MIT / 美术 ARR | 不含、不复刻其代码;仅运行时调用其公开类 |
| 车万女仆 | MIT(仅 code part) | 复刻了其 SlashBladeRender 的变换逻辑与 SlashBladeCompat#swingSlashBlade 的行为语义(数值原样对齐,代码自行编写),按 MIT 保留版权声明;挥刀那一处不注入车万女仆(挂的是原版 LivingEntity#swing) |
| Yes Steve Model | All Rights Reserved | 不复制、不内嵌、不再分发其任何代码或资源 |
本模组不包含、不再分发上述任何项目的代码或美术资源。
致谢 拔刀剑:重锋、车万女仆、YSM 三位作者 —— 没有它们干净的可读实现, "把丢失的那一层还回去"不可能做到。
代码由 DeepSeek 监修。