java - Minecraft (bukkit) 插件,向用户发送可点击的链接

标签 java minecraft bukkit

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

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

最佳答案

要向客户端发送可点击的链接,您需要向他发送原始 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 标签预计。您应该验证或转义传入的不受信任的数据。

更多示例:

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

关于java - Minecraft (bukkit) 插件,向用户发送可点击的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635271/

相关文章:

java - Spring Boot 3使用Mock JWT身份验证 token WithMockUser进行安全测试

java - Minecraft Bukkit 插件抛出语法错误

java - HashMap在某些情况下显示为空

java - For 循环检查玩家位置

java - 学习JAVA需要帮助理解getLogger().info()(Method Chaining)的概念

Java SpringBoot 方法@Scheduled 下还是错了@Profile?

java - 在 Spring 3 中,我可以实例化一个具有建议抽象方法的抽象类 bean 吗?

java - 在 Bukkit/Spigot 中生成世界时删除某些生物群落

java - Eclipse PDE 日志记录

java - 如何在 Minecraft 1.11 forge 上注册区 block