【问题标题】:How to make a clickable link that executes a command with bukkit如何使用 bukkit 创建执行命令的可点击链接
【发布时间】:2014-03-24 13:55:22
【问题描述】:

我正在尝试制作一个bukkit 插件,我似乎找不到任何关于此的文档,但我已经看到它完成了,我如何将命令输入到用户可以点击的聊天消息中以 URL 等可点击链接的形式在服务器上执行命令,例如“/motd”

if (commandLabel.equalsIgnoreCase("cmd") {
    player.sendMessage("Pick a command: " + </motd> + ", " + </mail> );
}

替换 "" 和 "" 以输出如下内容:

选择一个命令:MOTD,Mail

点击它们会像它们一样向服务器执行命令。我该怎么做?

【问题讨论】:

    标签: minecraft bukkit


    【解决方案1】:

    你可以这样做:

    IChatBaseComponent comp = ChatSerializer
                .a("{\"text\":\"" + "Choose one: " + "\",\"extra\":[{\"text\":\"" + "MOTD" + "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + "/motd" + "\"}}]}");
        
    PacketPlayOutChat packet = new PacketPlayOutChat(comp, true);
    ((CraftPlayer) <player>).getHandle().playerConnection.sendPacket(packet);
    

    这将向他们发送一条消息,显示:

    Choose one: MOTD
    

    当用户点击MOTD时,它会以玩家身份运行命令/motd。以下是我们实际在做的一些细目:

        IChatBaseComponent comp = ChatSerializer
                .a("{\"text\":\"" + "<Ignored Message> " + 
                "\",\"extra\":[{\"text\":\"" + "<Message that will be clicked>" + 
                "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + 
                "<Command to be run when message is clicked>" + "\"}}]}");
        
    PacketPlayOutChat packet = new PacketPlayOutChat(comp, true);
    ((CraftPlayer) <player>).getHandle().playerConnection.sendPacket(packet);
    

    以上代码将发送给播放器:

    <Ignored Message> <Message that will be clicked>
    

    当玩家点击&lt;Message that will be clicked&gt;时

    他们会运行命令&lt;Command to be run when a message is clicked&gt;,因为它不以命令前缀/开头,所以会强制他们聊天&lt;Command to be run when a message is clicked&gt;。

    不幸的是,据我所知,每条消息只能放置一个点击事件,因此您必须执行以下操作:

    选择一个:

    MOTD
    邮件

    所以你必须这样做,变量player 是播放器:

    player.sendMessage("Choose one:");
    
    IChatBaseComponent comp = ChatSerializer
                .a("{\"text\":\"" + 
                "\",\"extra\":[{\"text\":\"" + "MOTD" + 
                "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + 
                "/motd" + "\"}}]}");    
    PacketPlayOutChat packet = new PacketPlayOutChat(comp, true);
    ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
    
    IChatBaseComponent comp2 = ChatSerializer
                .a("{\"text\":\"" + 
                "\",\"extra\":[{\"text\":\"" + "Mail" + 
                "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + 
                "/mail" + "\"}}]}");    
    PacketPlayOutChat packet2 = new PacketPlayOutChat(comp2, true);
    ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet2);
    

    当MOTD被点击时,/motd会被玩家运行,当Mail被点击时,/mail会被运行。

    顺便说一句,您需要在构建路径中包含 craftbukkit 以及 bukkit 才能执行此操作

    【讨论】:

    • 这很好用,每行都令人沮丧,但它确实适用于我在您的帖子中编辑的微小修改。用“comp”
    【解决方案2】:

    或者你可以简单地这样做(我自己做了,你可以编辑它)

    /execute @a ~ ~ ~ tellraw @p ["",{"text":"Click this to die","color":"dark_red","bold":true,"clickEvent":{"action":"run_command","value":"/kill @p"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"Kills you!"}]}}}]
    

    run_command 也可以替换为 Open URL。

    您也可以用任何颜色替换深红色。如果需要,您可以将 true 替换为 false 以表示粗体,/kill @p 可以替换为命令(或者 https:// 链接,如果您打开 URL,show_text 可以替换为 Show Item、Show entity 或 Show Achivement . Text & Kills 你可以用不同的东西代替(例如,显示实体)(实体代替文字)

    如果您卡住了,我找到了一个网站!美好的一天:) http://minecraftjson.com/

    【讨论】:

    • 使用命令块或自己在世界中输入它会很好,但我使用的是 bukkit api,所以在这种情况下这不会很有帮助。
    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2014-03-04
    • 2020-06-28
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多