API 参考 / 打击特效样式(render 包)
HitEffectStyleProvider
想先跑起来?
这一页是签名与行为参考。宿主每次打击问你一次,返回样式或 null。直接做一遍:教程 · 自定义打击特效。
用途:打击特效样式的提供者。在 onPreInit 中注册到 ctx.registries().hitEffectStyles(),宿主每次触发打击特效时按注册顺序调用它的 getStyle。
完整签名
java
public interface HitEffectStyleProvider {
HitEffectStyle getStyle(HitEffectContext ctx);
}getStyle(HitEffectContext ctx)
签名:
java
HitEffectStyle getStyle(HitEffectContext ctx);行为:返回本次打击要使用的样式;返回 null 表示本 provider 不参与这一次打击(其它 provider 仍照常生效)。
组合语义:同一打击点上,所有返回非 null 样式的 provider 同时生效,按注册顺序依次绘制。一个模组加粒子、另一个模组加拖尾,可以叠加显示,不会互相顶掉。全部 provider 都返回 null(或没有 provider 注册)时使用游戏默认的打击文字特效。
异常隔离:provider 抛出的异常由宿主捕获并以限流方式记日志,该 provider 在本次打击中被跳过;判定流程与其它模组都不受影响。由于本方法在每次打击时同步调用,实现要保持轻量、不要做阻塞 IO。
线程:在游戏线程的判定流程中调用。
示例:叠加两个特效而不互相顶掉
java
// 模组 A:给所有 PERFECT 加一个文字
ctx.registries().hitEffectStyles().register(
RegistryKey.of("moda", "text", HitEffectStyleProvider.class),
c -> "PERFECT".equals(c.grade().displayName())
? HitEffectStyles.text("PERFECT", 300L)
: null);
// 模组 B:独立再叠加一圈图片序列(两个模组的特效会同时显示)
ctx.registries().hitEffectStyles().register(
RegistryKey.of("modb", "spark", HitEffectStyleProvider.class),
c -> HitEffectStyles.imageSequenceByDuration(myFrames, 400L));