编写Minecraft Forge模组时出现Cannot resolve symbol 'player'错误,如何解决?
解决Minecraft Forge模组中"Cannot resolve symbol 'player'"的问题
你遇到的错误是因为直接在Mod主类的类体中调用player.sendMessage时,既没有定义player对象,也没有合适的玩家上下文——Mod主类初始化阶段根本不存在玩家实例,编译器自然找不到这个符号。
下面给你两种简单的实现向聊天框发消息的方案,都是Forge模组开发的标准做法:
方案1:模组加载完成时给所有在线玩家发消息
修改你的主类,通过监听模组初始化事件,在服务器线程中获取所有在线玩家并发送消息:
package com.example.examplemod; import com.mojang.logging.LogUtils; import net.minecraft.network.chat.TextComponent; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.server.ServerLifecycleHooks; import org.slf4j.Logger; @Mod(ExampleMod.MODID) public class ExampleMod { public static final String MODID = "modid"; private static final Logger LOGGER = LogUtils.getLogger(); public ExampleMod() { // 注册事件监听器 FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onCommonSetup); } private void onCommonSetup(final FMLCommonSetupEvent event) { // 将任务放入服务器线程执行,避免线程安全问题 event.enqueueWork(() -> { // 获取当前服务器实例 if (ServerLifecycleHooks.getCurrentServer() != null) { // 遍历所有在线玩家并发送消息 for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) { // 第二个参数传入玩家UUID,表示消息仅该玩家可见 player.sendMessage(new TextComponent("模组加载完成!这是测试消息"), player.getUUID()); } } }); } }
方案2:玩家登录时发送欢迎消息
创建一个事件订阅类,监听玩家登录事件,给刚登录的玩家发消息:
package com.example.examplemod; import net.minecraft.network.chat.TextComponent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; // 订阅Forge事件总线,仅处理当前模组的事件 @Mod.EventBusSubscriber(modid = ExampleMod.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class PlayerLoginEvents { @SubscribeEvent public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { // 通过事件对象获取登录的玩家实例 event.getPlayer().sendMessage(new TextComponent("欢迎登录!这是模组给你的消息~"), event.getPlayer().getUUID()); } }
注意事项(针对新版本Forge)
如果你的Forge版本是1.19及以上,TextComponent已被弃用,需要改用Component类:
// 导入类 import net.minecraft.network.chat.Component; // 发送消息的代码改为 player.sendMessage(Component.literal("你的消息内容"), player.getUUID());
内容的提问来源于stack exchange,提问作者Nikolai Fedorov
相关产品推荐
相关产品推荐

