我正在开发一个bukkit插件,我需要向用户发送一个URL,我需要用户点击该链接,以便可以在用户的浏览器中打开它。
我尝试使用HTML和其他类型的标签,但没有任何效果。 我还搜索了Bukkit Java库,除了着色文本输出之外没有找到任何其他内容。
答案 0 :(得分:2)
要向客户端发送可点击链接,您需要向他发送原始json消息,有不同的方法可以执行此操作:
使用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 + "\"}}");
}
我们可以调用一些不安全的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 + "\"}}");
}
以前有很多人遇到过这个问题并且写了一个图书馆来解决麻烦。
可以通过简单的Google搜索bukkit send json message找到这些内容。
上述方法假设您的代码在调用方法的控制下,如果传递给方法的代码/数据由不可信的源提供,它们可以从json字符串中转义并添加您没有的json标记期望。您应该验证或转义传入的不受信任的数据。
Minecraftforums:1.8 - Raw JSON Text Examples (for /tellraw, /title, books, signs)
答案 1 :(得分:0)
您还可以使用http://minecraftjson.com/获取json文本,只复制{}及其内部并将其复制并粘贴到此处
PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
PacketPlayOutChat packet = new PacketPlayOutChat(ChatSerializer("HERE"));
and then
connection.sendPacket
现在已经完成了
以这种方式更加安全,因为来自控制台的消息中存在一些安全漏洞,因为他们无法得到它我私下留言他们可能会很快修复它的插口团队