MC Forge 1.18.2玩家进世界发送可点击消息执行命令实现方法
问题根因
你的可点击消息点击无响应和API版本变更无关,核心是四个代码逻辑错误:
- 1.17及以上版本中
Style类的所有withXxx方法(包括withClickEvent、withHoverEvent)不会修改原有Style实例,会返回一个携带新配置的新Style对象。你写的tC.getStyle().withClickEvent(...)仅生成了带点击事件的Style,但没有将其设置回文本组件,组件本身的Style仍为空,自然不会响应点击。 - 你用静态整型变量
messageAlreadyReceived做消息已发送标记的逻辑完全失效:EntityJoinWorldEvent会分别在服务端、客户端逻辑线程各触发一次,玩家切换维度(主世界/下界/末地往返)也会重复触发该事件,静态变量是全局共享的,多玩家场景下会串数据,计数逻辑乱跳后会出现消息重复发送、或者根本发不出去的问题。 - 你写的不带开头斜杠的
kill @a命令不符合RUN_COMMAND事件的格式要求,该类型点击事件要求命令字符串必须以/开头,否则客户端会直接忽略点击动作无任何响应。 - 额外问题:
EntityJoinWorldEvent触发时玩家的网络连接可能还未完全就绪,此时发送的聊天消息会被直接丢弃,客户端收不到。
修正实现方案
不要用EntityJoinWorldEvent做进服消息触发逻辑,Forge 1.18.2提供了专门的PlayerEvent.PlayerLoggedInEvent,该事件仅在玩家完成全部进服加载、网络连接就绪后在服务端触发一次,不会随维度切换重复触发。
修正后的代码如下:
@SubscribeEvent public static void onPlayerJoinServer(PlayerEvent.PlayerLoggedInEvent event) { Player player = event.getEntity(); // 双重校验,仅在服务端逻辑侧执行,避免客户端侧重复触发 if (player.level.isClientSide) return; // 用玩家自身的持久化标签存储消息发送标记,不要用静态变量,避免多玩家数据串扰 CompoundTag playerData = player.getPersistentData(); final String WELCOME_TAG = "你的模组id:welcome_msg_sent"; // 已经发过消息就直接返回,避免重复发送 if (playerData.getBoolean(WELCOME_TAG)) return; playerData.putBoolean(WELCOME_TAG, true); // 构造跳转URL的可点击消息 TextComponent urlComponent = new TextComponent("点我跳转反馈页"); Style urlStyle = Style.EMPTY .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://你的反馈页地址")) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent("点击打开反馈提交页面"))); urlComponent.setStyle(urlStyle); // 构造执行命令的可点击消息,命令必须带开头的/ TextComponent cmdComponent = new TextComponent("点我执行测试命令"); Style cmdStyle = Style.EMPTY .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/kill @a")); cmdComponent.setStyle(cmdStyle); // 发送消息,第二个参数传入玩家UUID即可,不会显示为玩家发言 player.sendMessage(urlComponent, player.getUUID()); player.sendMessage(cmdComponent, player.getUUID()); }
注意事项
- 记得将包含该监听方法的类注册到Forge事件总线,否则事件不会生效,注册代码放在模组主类构造函数中即可:
MinecraftForge.EVENT_BUS.register(存放监听方法的类名.class); - 你之前测试用的tellraw命令语法本身没有问题,点击无响应一般是测试时填写的地址无法访问,游戏会直接静默吞掉跳转动作,没有错误提示。
- 不要在客户端侧给玩家发需要执行服务端命令的点击消息,这类消息必须由服务端发送,否则会出现权限不足、命令不生效的问题。
内容的提问来源于stack exchange,提问作者AGMPenguin
相关产品推荐
相关产品推荐

