Minecraft 1.8.9客户端模组仅单人可用,多人模式失效求助
问题分析与修复方案
问题根源
- 命令注册错误:你使用
event.registerServerCommand()注册的是服务器端命令,多人模式下客户端发送的命令会被远程服务器验证,服务器没有该命令就会提示“未知命令”。需要注册客户端本地命令,让命令在客户端直接处理,不发送到服务器。 - 事件注册时机错误:
FMLServerStartingEvent是服务器启动时触发的事件,客户端连接远程服务器时不会触发该事件,正常启动客户端直接进入多人模式的话,SoupCheck事件处理器不会被注册(你测试时从单人切到多人能正常工作,是因为之前单人模式已经触发过该事件完成了注册)。
修复代码
修改SoupCheckMod.java
import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; @Mod(modid = "nodropsoup", name = "No Drop Soup", version = "7.29.2023 - naogostodeprogramar") public class SoupCheckMod { @Mod.EventHandler public void init(FMLInitializationEvent event) { // 客户端初始化时注册事件处理器,单人/多人客户端都会执行 MinecraftForge.EVENT_BUS.register(new SoupCheck()); // 注册客户端本地命令 ClientCommandHandler.instance.registerCommand(new CommandBase() { @Override public String getCommandName() { return "nodropsoup"; } @Override public String getCommandUsage(ICommandSender sender) { return "/nodropsoup"; } // 客户端命令需要重写此方法,返回true表示允许客户端使用 @Override public boolean canCommandSenderUseCommand(ICommandSender sender) { return true; } @Override public void processCommand(ICommandSender sender, String[] args) { if (SoupCheck.modEnabled) { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Mod已关闭! - by naogostodeprogramar")); } else { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Mod已开启! - by naogostodeprogramar")); } SoupCheck.modEnabled = !SoupCheck.modEnabled; } }); } }
关键修改点
- 将事件处理器的注册移到
FMLInitializationEvent的init方法中,确保客户端启动时就完成注册,无论单人还是多人模式都能生效。 - 使用
ClientCommandHandler.instance.registerCommand()注册客户端命令,替代服务器命令注册方式,命令会在客户端本地执行,不会发送到远程服务器,解决“未知命令”的问题。 - 新增
canCommandSenderUseCommand方法的重写,返回true确保客户端玩家可以使用该命令。
额外优化建议
不要直接通过物品的非本地化名称(getUnlocalizedName())判断物品,建议直接对比物品实例,稳定性更高:
// 替换SoupCheck.java中的物品判断逻辑 if (Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem().getItem() == Items.mushroom_stew) { isSoup = true; } else if (Minecraft.getMinecraft().thePlayer.inventory.getCurrentItem().getItem() == Items.bowl) { isSoup = false; } else { isSoup = false; }
内容的提问来源于stack exchange,提问作者Kkjajalall
相关产品推荐
相关产品推荐

