【问题标题】:Minecraft (bukkit) plugins, send user a clickable linkMinecraft (bukkit) 插件,向用户发送可点击的链接
【发布时间】:2016-01-06 14:15:25
【问题描述】:

我正在开发一个 bukkit 插件,我需要向用户发送一个 URL,我需要让用户可以点击链接,以便它可以在用户的​​浏览器中打开。

我尝试使用 HTML 和其他类型的标签,但没有任何效果。 我还搜索了 Bukkit Java 库,除了为文本输出着色之外,没有发现任何其他内容。

【问题讨论】:

    标签: java minecraft bukkit


    【解决方案1】:

    要向客户端发送可点击链接,您需要向他发送原始 json 消息,有不同的方法可以做到这一点:

    使用 /tellraw 命令

    使用Server.dispatchCommand(<your sender>,<Your command String>);可以让控制台执行命令,我们要执行命令/tellraw <user> {text:"Click.",clickEvent:{action:open_url,value:"http://stackoverflow.com/q/34635271"}}。这可以在代码中完成,如下所示:

    public void sendMessage(Player player, String message, String url) {
        Bukkit.getServer().dispatchCommand(
            Bukkit.getConsoleSender(),
            "/tellraw " + player.getName() + 
            " {text:\"" + message + "\",clickEvent:{action:open_url,value:\"" +
            url + "\"}}");
    }
    

    使用原生 craftbukkit 方法

    我们可以调用 Bukkit 的一些不安全的方法直接发送消息,为此,我们首先需要将我们的播放器强制转换为 CraftPlayer,然后获取一个 EntityPlayer,最后在播放器的 playerConnection 上调用 sendPacket。

    基于:Gamecube762's JsonMessages.java

    public static PacketPlayOutChat createPacketPlayOutChat(String s){return new PacketPlayOutChat(ChatSerializer.a(s));}
    
    public static void SendJsonMessage(Player p, String s){( (CraftPlayer)p ).getHandle().playerConnection.sendPacket( createPacketPlayOutChat(s) );}
    
    public void sendMessage(Player player, String message, String url) {
        SendJsonMessage(player,
            "{text:\"" + message + "\",clickEvent:{action:open_url,value:\"" +
            url + "\"}}");
    }
    

    为 bukkit 使用库

    以前有很多人遇到过这个问题,写了一个库来解决这个麻烦。

    这些可以通过简单的谷歌搜索bukkit send json message找到。

    安全风险

    上述方法假设您的代码在方法调用的控制之下,如果传递给方法的代码/数据是由不受信任的来源提供的,它们可以从 json 字符串中转义并添加您没有的 json 标签预计。您应该验证或转义传入的不受信任的数据。

    更多tellraw示例:

    Minecraft 论坛:1.8 - Raw JSON Text Examples (for /tellraw, /title, books, signs)

    【讨论】:

      【解决方案2】:

      您也可以使用http://minecraftjson.com/ 获取 json 文本,只复制 {} 及其内部,然后将其复制并粘贴到 HERE

      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection; PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer("HERE")); and then connection.sendPacket

      现在你完成了

      而且这样做更安全,因为来自控制台的消息中存在一些安全漏洞,因为他们无法得到它我已经私信了 spigot 团队,他们可能很快就会修复它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多