You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:12:20