最近梨子提起了一个叫“org.bukkit.conversations”的包是干啥用的,哇,这个包谁知道啊什么鬼?字面上的意思是对话,Bukkit的Javadoc说这个包是玩家与插件的信息交流用的,应该是获取玩家输入的消息然后由插件处理?那就探讨一下吧。
目前大多数开发者都不知道这个包,所以蠢蠢地写了各种处理玩家输入的框架,比如:

所以我决定编写这个教程
了解下此包的结构->https://hub.spigotmc.org/javadoc ... ackage-summary.html
1.Conversable接口
这个接口代表可以与插件交流的对象,目前ConsoleCommandSender和Player类实现了这个接口.
2.Prompt
这个是对话的核心,你需要编写一个Prompt类,需要实现此接口。不过Bukkit已经提供了一些常用的抽象类,比如ValidatingPrompt(可以验证玩家输入的Prompt),你要用直接继承就好。你想偷懒就直接用Bukkit给你的,不过自己实现完全没有问题。
更多的Prompt可以看看javadoc。
对话开始后,getPromptText方法的返回值将会显示给玩家,当作提示,玩家输入信息后,会调用acceptInput方法,这个方法就是处理玩家输入的信息的,根据玩家的输入,返回Prompt,可以是新的Prompt,可以是用来结束对话的Prompt(Prompt.END_OF_CONVERSATION)。
这里给一个ValidatingPrompt食用实例:
- private class MyPrompt extends ValidatingPrompt {
- @Override
- public String getPromptText(ConversationContext context) {
- return "Input something?"; //给玩家的提示消息
- }
- @Override
- protected boolean isInputValid(ConversationContext context, String input)
- {
- return true; //检查玩家的输入是否正确,这里直接返回true了,实际上就不是这样了
- }
- //处理玩家的输入
- @Override
- protected Prompt acceptValidatedInput(ConversationContext context, String input) {
- context.getForWhom().sendRawMessage("Conversation end, your input is:" + input); //输出玩家输入的信息(input)
- return Prompt.END_OF_CONVERSATION; //结束对话
- }
- }
3.构建Conversation对象
Conversation是一个普通的类,但是一般不是直接new的,需要用ConversationFactory进行构建。
创建ConversationFactory对象,然后对着javadoc里讲的方法附加些属性,最后就用buildConversation方法构建出Conversation对象。
这里就贴一个非常基础的实例吧,要设置更多的属性还是看javadoc。
- Conversation conversation = new ConversationFactory(this)
- .withFirstPrompt(new MyPrompt())
- .addConversationAbandonedListener(new ConversationAbandonedListener() {
- @Override
- public void conversationAbandoned(ConversationAbandonedEvent abandonedEvent) {
- if (abandonedEvent.gracefulExit()) {
- abandonedEvent.getContext().getForWhom().sendRawMessage("exit");
- }
- }
- })
- .buildConversation(player);
this为插件对象,player为玩家对象。当然ConsoleCommandSender也可以。withFirstPrompt就是设置对话的第一个Prompt,addConversationAbandonedListener就是增加对话放弃监听器,这里的行为是放弃会话时给玩家发送“exit”消息。
接着,开始对话。
- conversation.begin();
你只需要做好你的对话,然后剩下的事是Bukkit的了。
效果:
最后贴上我测试时写的代码,可以自己改一改,快速上手Conversation API:http://git.oschina.net/hcrgm/codes/6vi4juo1h8ag93nrbekqy
可惜GitHub Gist被墙...
剩下的仔细咀嚼javadoc并动手吧,如果有哪些不懂的可以提问,我会解答
