Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 2261|回复: 5

[插件开发教程] Bukkit Conversation API 简单介绍 —— 处理玩家输入 So Easy!

[复制链接]
hcrgm1 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
3187
钻石
性别
保密
注册时间
2014-10-17
查看详细资料
发表于 2016-8-12 14:48:11 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 hcrgm1 于 2016-8-12 15:32 编辑

最近梨子提起了一个叫“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食用实例:
  1. private class MyPrompt extends ValidatingPrompt {
  2.     @Override
  3.     public String getPromptText(ConversationContext context) {
  4.         return "Input something?"; //给玩家的提示消息
  5.     }

  6.     @Override
  7.     protected boolean isInputValid(ConversationContext context, String input)
  8.     {
  9.         return true; //检查玩家的输入是否正确,这里直接返回true了,实际上就不是这样了
  10.     }

  11.     //处理玩家的输入
  12.     @Override
  13.     protected Prompt acceptValidatedInput(ConversationContext context, String input) {
  14.         context.getForWhom().sendRawMessage("Conversation end, your input is:" + input); //输出玩家输入的信息(input)
  15.         return Prompt.END_OF_CONVERSATION; //结束对话
  16.     }
  17. }
复制代码

3.构建Conversation对象
Conversation是一个普通的类,但是一般不是直接new的,需要用ConversationFactory进行构建。
创建ConversationFactory对象,然后对着javadoc里讲的方法附加些属性,最后就用buildConversation方法构建出Conversation对象。
这里就贴一个非常基础的实例吧,要设置更多的属性还是看javadoc。
  1. Conversation conversation = new ConversationFactory(this)
  2.                     .withFirstPrompt(new MyPrompt())
  3.                     .addConversationAbandonedListener(new ConversationAbandonedListener() {
  4.                         @Override
  5.                         public void conversationAbandoned(ConversationAbandonedEvent abandonedEvent) {
  6.                             if (abandonedEvent.gracefulExit()) {
  7.                                 abandonedEvent.getContext().getForWhom().sendRawMessage("exit");
  8.                             }
  9.                         }
  10.                     })
  11.                     .buildConversation(player);
复制代码

this为插件对象,player为玩家对象。当然ConsoleCommandSender也可以。withFirstPrompt就是设置对话的第一个Prompt,addConversationAbandonedListener就是增加对话放弃监听器,这里的行为是放弃会话时给玩家发送“exit”消息。
接着,开始对话。
  1. conversation.begin();
复制代码

你只需要做好你的对话,然后剩下的事是Bukkit的了。
效果:[spoiler][/spoiler]
最后贴上我测试时写的代码,可以自己改一改,快速上手Conversation API:http://git.oschina.net/hcrgm/codes/6vi4juo1h8ag93nrbekqy
可惜GitHub Gist被墙...

本教程讲的有点多,排版超渣,做工略显粗糙,而且还有很多疏漏,剩下的仔细咀嚼javadoc并动手吧,如果有哪些不懂的可以提问,我会解答

评分

参与人数 5人气 +9 金粒 +60 收起 理由
1582952890 + 2 MCBBS有你更精彩~
q549365815 + 1 很棒的作品!
914554688wyt + 2 + 35 可以用来搞确认什么的
星燚 + 2 + 15 很棒的作品!
splt + 2 + 10 新技能Get√

查看全部评分

凋灵兔子 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
4601
钻石
性别
保密
注册时间
2015-7-18
查看详细资料
发表于 2016-9-23 17:47:16 | 显示全部楼层
这句最重要...
ConsoleCommandSender和Player类实现了这个接口
,一看就明白了。
给楼主点个赞,这才是开发者应该干的事情。
回复

使用道具 举报

Gaint 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
398
钻石
性别
保密
注册时间
2016-9-25
查看详细资料
发表于 2016-10-9 17:29:05 | 显示全部楼层
            这个很好,
回复

使用道具 举报

ByZYM 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
849
钻石
性别
保密
注册时间
2013-10-7
查看详细资料
发表于 2017-1-9 18:23:06 | 显示全部楼层
有个没看懂的是,怎么开始下一个prompt
回复

使用道具 举报

ByZYM 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
849
钻石
性别
保密
注册时间
2013-10-7
查看详细资料
发表于 2017-1-9 18:25:58 | 显示全部楼层
意思是每一句对话都要写一个prompt来操作么
回复

使用道具 举报

Jonjs_Dada 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
2264
钻石
性别
保密
注册时间
2015-11-6
查看详细资料
发表于 2017-8-30 13:43:42 | 显示全部楼层
dalao的世界,萌新路过,没人看见我吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2019-8-21 08:54 , Processed in 0.034093 second(s), Total 13, Slave 12 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2019 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表