Minecraft Fabric 1.20.1模组开发求助:按键显示Biome报错
Minecraft Fabric 1.20.1模组开发:修复显示生物群系的按键功能报错
我正在开发Minecraft Fabric 1.20.1模组,需求是按下键时在聊天框显示当前所在的生物群系。运行代码时出现错误:error: package net.minecraft.Text does not exist import net.minecraft.Text.literal;`,原代码如下:
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.option.KeyBinding; import net.minecraft.Text.literal; import net.minecraft.util.Identifier; import org.lwjgl.glfw.GLFW; public class Biome implements ClientModInitializer { private static final KeyBinding KEY_BINDING = KeyBindingHelper.registerKeyBinding(new KeyBinding( "key.yourmod.showbiome", GLFW.GLFW_KEY_GRAVE_ACCENT, "category.yourmod" )); @Override public void onInitializeClient() { // Register the key press event listener KeyBindingHelper.registerKeyBinding(KEY_BINDING); } public static void onKeyPressed() { if (KEY_BINDING.wasPressed()) { MinecraftClient client = MinecraftClient.getInstance(); ClientPlayerEntity player = client.player; if (player != null && player.world != null) { String biomeName = player.world.getBiome(player.getBlockPos()).getTranslationKey(); player.sendMessage(new LiteralText("You are in the biome: " + biomeName), false); } } } }
错误原因及修复步骤
- 导入路径错误:
net.minecraft.Text.literal不是正确的包路径,Minecraft 1.20.1中文本相关类位于net.minecraft.text包下,LiteralText是具体实现类,需修正导入语句。 - 重复注册按键:初始化
KEY_BINDING时已通过KeyBindingHelper.registerKeyBinding完成注册,onInitializeClient中再次调用属于冗余操作,需删除。 - 缺少按键事件触发逻辑:原代码的
onKeyPressed方法未绑定任何事件,需通过Fabric的客户端Tick事件监听按键输入,确保逻辑被正确执行。
修正后的完整代码
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.option.KeyBinding; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; public class BiomeMod implements ClientModInitializer { private static final KeyBinding SHOW_BIOME_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( "key.yourmod.showbiome", GLFW.GLFW_KEY_GRAVE_ACCENT, "category.yourmod" )); @Override public void onInitializeClient() { // 注册客户端Tick事件监听按键输入 ClientTickEvents.END_CLIENT_TICK.register(client -> { while (SHOW_BIOME_KEY.wasPressed()) { ClientPlayerEntity player = client.player; if (player != null && player.world != null) { String biomeTranslationKey = player.world.getBiome(player.getBlockPos()).getTranslationKey(); // 使用Text.translatable获取本地化的生物群系名称 Text biomeName = Text.translatable(biomeTranslationKey); player.sendMessage(new LiteralText("当前所在生物群系: ").append(biomeName), false); } } }); } }
额外优化说明
- 将类名从
Biome改为BiomeMod,避免与Minecraft内置的Biome类重名,减少潜在冲突。 - 使用
Text.translatable替代直接拼接翻译键,会显示游戏内本地化的生物群系名称(如中文环境下显示“森林”而非“biome.minecraft.forest”),提升用户体验。 - 采用
ClientTickEvents.END_CLIENT_TICK事件处理按键,这是Fabric客户端处理按键输入的标准方式,确保逻辑稳定触发。
内容的提问来源于stack exchange,提问作者Noam Wolf
相关产品推荐
相关产品推荐

