You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fabric客户端模组:玩家重生后自动恢复夜视效果的实现方法问询

解决Fabric客户端模组重生后自动启用夜视的方案

方案一:用Mixin注入正确的重生触发点

你之前选requestRespawn注入没成功,是因为这个方法只是发起重生请求,并非玩家实际完成重生的时机。可以换下面两个更靠谱的方法注入:

注入玩家初始化方法

创建Mixin类,在玩家初始化完成(包含重生场景)时触发逻辑:

import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ClientPlayerEntity.class)
public class ClientPlayerEntityMixin {
    @Inject(method = "init", at = @At("TAIL"))
    private void onPlayerInit(CallbackInfo ci) {
        ClientPlayerEntity player = (ClientPlayerEntity) (Object) this;
        if (ModConfigs.NV_STATUS && !player.hasStatusEffect(StatusEffects.NIGHT_VISION)) {
            player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, -1));
        }
    }
}

注入重生方法

如果想精准捕捉重生动作,直接注入respawn方法:

@Inject(method = "respawn", at = @At("TAIL"))
private void onPlayerRespawn(CallbackInfo ci) {
    ClientPlayerEntity player = (ClientPlayerEntity) (Object) this;
    if (ModConfigs.NV_STATUS && !player.hasStatusEffect(StatusEffects.NIGHT_VISION)) {
        player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, -1));
    }
}

注意:要在fabric.mod.json里正确注册Mixin,比如:

"mixins": [
    "你的模组ID.mixins.json"
]

然后在对应mixins.json文件中添加:

{
    "client": [
        "ClientPlayerEntityMixin"
    ]
}

方案二:用Fabric客户端事件监听

Fabric提供了现成的客户端事件,ClientPlayerEvents.JOIN_WORLD会在玩家加入世界(包括重生)时触发:

import net.fabricmc.fabric.api.client.player.ClientPlayerEvents;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;

public class NightVisionHandler {
    public static void register() {
        ClientPlayerEvents.JOIN_WORLD.register((player, joined) -> {
            // joined为true是首次进世界,false是重生,这里统一处理
            if (ModConfigs.NV_STATUS && !player.hasStatusEffect(StatusEffects.NIGHT_VISION)) {
                player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, -1));
            }
        });
    }
}

然后在模组主类的onInitializeClient方法里注册这个处理器:

@Override
public void onInitializeClient() {
    NightVisionHandler.register();
    // 其他客户端初始化逻辑
}

额外提示

  • 加个!player.hasStatusEffect(StatusEffects.NIGHT_VISION)判断,避免重复添加效果
  • 确保ModConfigs.NV_STATUS是客户端专属配置,别用服务端配置

内容的提问来源于stack exchange,提问作者MarioS271

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:43:17