Minecraft (bukkit) 插件,向用户发送可点击的 link
Minecraft (bukkit) plugins, send user a clickable link
我正在开发一个 bukkit 插件,我需要向用户发送一个 URL,我需要让用户可以点击 link,这样它就可以在用户的浏览器中打开。
我尝试使用 HTML 和其他类型的标签,但没有任何效果。 我还搜索了 Bukkit Java 库,除了为文本输出着色之外没有找到任何东西。
要向客户发送可点击的 link,您需要向他发送原始 json 消息,有不同的方法可以做到这一点:
使用 /tellraw 命令
使用Server.dispatchCommand(<your sender>,<Your command String>);
可以让控制台执行命令,我们要执行命令/tellraw <user> {text:"Click.",clickEvent:{action:open_url,value:"
。这可以在代码中完成,如下所示:
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 使用库
以前有很多人遇到过这个问题,写了一个库来解决这个问题。
这些可以通过简单的 google 搜索 bukkit send json message.
找到安全风险
以上方法假定您的代码在方法调用的控制之下,如果传递给方法的 code/data 是由不受信任的来源提供的,它们可以逃出 json 字符串并添加 json 你没想到的标签。您应该验证或转义传入的不受信任的数据。
更多tellraw示例:
Minecraft 论坛:1.8 - Raw JSON Text Examples (for /tellraw, /title, books, signs)
您也可以使用 http://minecraftjson.com/ 获取 json 文本,只复制 {} 及其内部,然后将其复制并粘贴到此处
PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer("HERE"));
and then
connection.sendPacket
大功告成
这样做更安全,因为来自控制台的消息中存在一些安全漏洞,因为他们无法获取它,我已经私信给 spigot 团队,他们可能会尽快修复它