punchy-fix

punchy-fix

兼容kubejs6和java

KubeJS

Punchy Fix

一个 Forge 1.20.1 端的纯客户端附加模组。当基于 Java 的模组或 KubeJS 6 脚本调用玩家手臂挥动方法(LivingEntity.swing(),包括 KubeJS 的 player.swing())时,此模组会使闭源的 Punchy 模组播放其正常的物品使用 interact 动画,而不是什么都不做或触发攻击动画。

机制

  • KubeJS 6 的 player.swing() 最终会调用 LivingEntity.swing(hand, true)。
  • Punchy 本身会混入此方法;普通挥动会被 Punchy 记录为一次攻击。
  • 此模组通过更高优先级的 Mixin(优先级 1500)事先拦截 swing()。如果它确认该挥动不是攻击、挖掘动作或已追踪的物品使用动作,它会向 Punchy 的 UseActionTracker 写入一个 USE_ITEM 触发器。一旦 Punchy 的 UseItemStateMachine 接收到此触发器,它就会播放正常的物品使用动画。Punchy 自身的与挥动相关的 Mixin 在检测到已有使用触发器时,将不再将此挥动标记为攻击。
  • 防护条件:客户端攻击请求或挖掘请求发生后 1 秒内发生的挥动回显将不会被桥接,以防止真实的攻击/挖掘动作被误识别为物品使用动作。物品使用事件不会受到抑制:每次到达客户端的 swing() 调用都会触发使用动画,快速重复点击将被 Punchy 的原生动画逻辑中断并重新开始。

KubeJS 用法

ItemEvents.rightClick(event=>{
  let player = event.player;
  player.swing();  // 手臂挥动动画将成功播放
})

任何 Java 模组对 player.swing(hand) 的调用也会自动被桥接,无需额外依赖此模组的 API。