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

时间:2016-01-06 14:15:26

标签: java minecraft bukkit

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

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

2 个答案:

答案 0 :(得分:2)

要向客户端发送可点击链接,您需要向他发送原始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 + "\"}}");
}

使用libk for bukkit

以前有很多人遇到过这个问题并且写了一个图书馆来解决麻烦。

可以通过简单的Google搜索bukkit send json message找到这些内容。

安全风险

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

更多tellraw示例:

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

现在已经完成了

以这种方式更加安全,因为来自控制台的消息中存在一些安全漏洞,因为他们无法得到它我私下留言他们可能会很快修复它的插口团队