2014-03-24 99 views
1

我试图做一个bukkit插件,我似乎无法找到任何文档,但我已经看到它完成了,如何将命令输入,用户可以点击像在这样一个URL如何使用bukkit执行命令的可点击链接

if (commandLabel.equalsIgnoreCase("cmd") { 
    player.sendMessage("Pick a command: " + </motd> + ", " + </mail>); 
} 

更换“”和“”输出这样的一个可点击的链接“的形式/ MOTD”在服务器上执行的命令的聊天消息:

选择一个命令:MOTDMail

并点击它们将执行命令到服务器。我将如何做到这一点?

回答

4

你可以做这样的:

IChatBaseComponent comp = ChatSerializer 
      .a("{\"text\":\"" + "Choose one: " + "\",\"extra\":[{\"text\":\"" + "MOTD" + "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + "/motd" + "\"}}]}"); 

PacketPlayOutChat packet = new PacketPlayOutChat(comp, true); 
((CraftPlayer) <player>).getHandle().playerConnection.sendPacket(packet); 

这将会给他们呈现出消息:

Choose one: MOTD 

,当用户点击MOTD,它会运行命令/motd作为玩家。下面是什么,我们实际上正在做一个小故障:

IChatBaseComponent comp = ChatSerializer 
      .a("{\"text\":\"" + "<Ignored Message> " + 
      "\",\"extra\":[{\"text\":\"" + "<Message that will be clicked>" + 
      "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + 
      "<Command to be run when message is clicked>" + "\"}}]}"); 

PacketPlayOutChat packet = new PacketPlayOutChat(comp, true); 
((CraftPlayer) <player>).getHandle().playerConnection.sendPacket(packet); 

上面的代码将发送玩家:当玩家点击<Message that will be clicked>

他们将运行命令

<Ignored Message> <Message that will be clicked> 

<Command to be run when a message is clicked> ,并且因为它不以命令前缀开始,/,它将强制他们聊天<Command to be run when a message is clicked>

不幸的是,据我所知,你只能把点击事件每封邮件,所以你会做这样的事情:

选择一个:

MOTD
邮件

所以,你必须做的,其中变量player是玩家:

player.sendMessage("Choose one:"); 

IChatBaseComponent comp = ChatSerializer 
      .a("{\"text\":\"" + 
      "\",\"extra\":[{\"text\":\"" + "MOTD" + 
      "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + 
      "/motd" + "\"}}]}");  
PacketPlayOutChat packet = new PacketPlayOutChat(comp, true); 
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); 

IChatBaseComponent comp2 = ChatSerializer 
      .a("{\"text\":\"" + 
      "\",\"extra\":[{\"text\":\"" + "Mail" + 
      "\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"" + 
      "/mail" + "\"}}]}");  
PacketPlayOutChat packet2 = new PacketPlayOutChat(comp2, true); 
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet2); 

MOTD被点击时,/motd将由玩家运行,当点击Mail时,/mail将会运行。

正如一个侧面说明,你将需要包括craftbukkit在构建路径,随着bukkit做到这一点

+0

这个伟大的工程,真可惜有关每行,但它确实与我在你的文章上编辑过的微小修改一起工作。与“comp” – zfb

0

或者你可以只是简单地做到这一点(我做了我自己的,你可以对它进行编辑)

/execute @a ~ ~ ~ tellraw @p ["",{"text":"Click this to die","color":"dark_red","bold":true,"clickEvent":{"action":"run_command","value":"/kill @p"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"Kills you!"}]}}}] 

run_command也可以用Open URL替换。

您也可以用任何颜色替换深红色。如果你愿意,你可以将true替换为false,否则/ kill @p可以替换为一个命令(或者,如果你打开URL,则可以使用https://链接,show_text可以替换为Show Item,Show entity或Show Achivement 。文本&杀死你可以用不同的东西所取代(例如,显示实体)(实体替换文本)

我发现了一个网站,如果你的卡!美好的一天:) http://minecraftjson.com/

+0

使用命令块或在世界上自己输入它会很好,但我使用的是bukkit api,所以这在这种情况下不会很有帮助。 – zfb