Fabric MC 1.20.4:玩家死亡及击杀来源检测Mixin未生效求助
检查Mixin注册配置
Fabric模组必须在fabric.mod.json的mixins字段声明Mixin类,否则加载器不会处理。示例配置:{ "mixins": [ "pvpoverhaul.mixins.json" ] }同时在
resources目录创建对应pvpoverhaul.mixins.json,确保包含你的GearKeeper类:{ "required": true, "package": "net.spamta.pvpoverhaul.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ "GearKeeper" ], "client": [], "injectors": { "defaultRequire": 1 } }注意
package要和Mixin类所在包完全一致。验证方法签名匹配度
确认onDeath方法签名和原版代码完全匹配。Minecraft 1.19+中PlayerEntity.onDeath继承自LivingEntity,签名为public void onDeath(DamageSource source),你当前的Mixin注入参数DamageSource damageSource, CallbackInfo info是正确的,但要确保@Inject的method参数拼写无误(你当前写的method="onDeath"没问题)。确保Mixin在服务器端生效
玩家死亡逻辑由服务器端处理,若Mixin被标记为仅客户端加载则不会触发。检查mixins.json,不要将GearKeeper放入client数组,确保它在mixins数组中(默认服务端、客户端均加载)。排查日志初始化问题
确认PvPOverhaul.LOGGER正确初始化,比如使用SLF4J标准方式:import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PvPOverhaul { public static final Logger LOGGER = LoggerFactory.getLogger("pvpoverhaul"); }日志对象未正确创建的话,即使Mixin运行也看不到输出。
修正击杀来源获取逻辑
你当前用damageSource.getName()只能拿到伤害源类型(如player、mob),要获取具体击杀实体需用damageSource.getAttacker(),示例:if (damageSource.getAttacker() instanceof LivingEntity attacker) { PvPOverhaul.LOGGER.info("{} 被 {} 击杀", player.getName().getString(), attacker.getName().getString()); } else { PvPOverhaul.LOGGER.info("{} 死于 {}", player.getName().getString(), damageSource.getName()); }
内容的提问来源于stack exchange,提问作者Spamta Clause

