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
相关产品推荐
相关产品推荐

