Minecraft(我的世界)中文论坛

标题: █某(并不)正经的BungeeCord插件开发教程█ 1 - 指令

作者: berry64    时间: 2018-8-14 22:01
标题: █某(并不)正经的BungeeCord插件开发教程█ 1 - 指令
本帖最后由 berry64 于 2018-8-26 00:40 编辑

进入目录



Chapter 1
BC指令101


BC指令的一些注意事项
什么是指令?

根据上一章节里本灵魂画师绘制的bc流程图,不难推理出玩家在客户端用/打出的指令会先经过BC,再由BC发送给玩家所在的服务器,而这时候就出现了很神奇的东西:BC可以对玩家指令数据包作出更改,比如如果玩家使用的指令BC认识,那么就直接在BC处理掉而不要发送任何数据到服务器,这样可以做到在不同服务器使用同一个指令(因为你连到的是同一个BC)

当然,如果你在单独的服务端后台使用这些指令时无法正常使用的(因为你的服务端压根就没有这个指令,而这个指令时注册在BC的)

虽然听起来好像非常高大上,可是实际使用却非常有限,因为大部分玩家玩的时服务端里的内容而不是BC (我还真见过只玩BC的玩家)
所以BC指令无法直接干涉比如:
  • 玩家位置
  • 世界方块
  • 世界里的生物
这类的东西,但是BC因为对数据包进行了操作所以可以做到但不限于:
  • 向玩家发送标题(title)
  • 向玩家发送tab列表
  • 向玩家发送排行榜(右边的那个)
  • 以玩家名义/向玩家发送消息
  • 强制玩家更换服务器


还有一点需要注意的就是BC并没有Player类,而取代它的是net.md_5.bungee.api.connection.ProxiedPlayer (代理玩家)


BC指令的正确食用方法
不像bukkit插件需要在plugin.yml里写上commands: BungeeCord创建指令并不需要修改bungee.yml, 但是你仍然需要注册一个指令:
在主类的onEnable()方法下添加以下代码:
  1. this.getProxy().getPluginManager().registerCommand(this, 指令处理器实例);
复制代码

到这里你可能会问了,就这样注册指令的我怎么知道什么指令呢? 别急,往后看
指令处理器是一个继承了net.md_5.bungee.api.plugin.Command的类,并且有一个构造器使用了父类的(String)构造器:
为了方便理解我们这里写一个栗子:
  1. import net.md_5.bungee.api.plugin.Command;

  2. public class CommandExecutor extends Command{
  3.     public class CommandExecutor(){
  4.         super("myCommand");
  5.     }
  6. }
复制代码
从代码可以大概猜出这里super的字符串就指定了什么指令


至此,你的IDE肯定会疯狂给你报错告诉你少了点什么,而我们缺少的就是实际处理指令的地方所以我们添加一个方法:
  1. @Override
  2. public void execute(CommandSender s, String[] args) {
  3. }
复制代码
这里应该非常显而易见了,虽然没有bukkit的指令那么多数据,但是已经基本看得懂在这个方法里就是指令被运行时的代码了。
args代表了指令后空格的参数,而s则代表了使用这个指令的人(后台or玩家)

写道这里,BC指令创建完成,剩下的就是在execute方法内添加自己希望指令做的事情了

你可能注意到了BC的指令返回值是VOID, 这是(大概)因为md_5发现在写bukkit指令中返回的boolean非常麻烦而且还没有多少人使用,所以移除掉了


举个栗子
这个BC插件检测玩家的/bcisosm指令并且如果是玩家的话向玩家发送一个标题

  1. import net.md_5.bungee.BungeeCord;
  2. import net.md_5.bungee.api.chat.TextComponent;
  3. import net.md_5.bungee.api.connection.ProxiedPlayer;
  4. import net.md_5.bungee.api.plugin.Plugin;

  5. public class MyAwesomeBungeePlugin extends Plugin{
  6.         @Override
  7.         public void onEnable(){
  8.                 getProxy().getPluginManager().registerCommand(this, new CmdExe());          //注册
  9.         }
  10. }
  11. class CmdExe extends Command{                      //这里写到了同一个源文件
  12.         public CmdExe(){
  13.                 super("bcisosm");                             //指令bcisosm注册
  14.         }

  15.         
  16.         @Override
  17.         public void execute(CommandSender s, String[] args) {
  18.                 if(s instanceof ProxiedPlayer){                                  //和bukkit同理检测是否是玩家
  19.                         Title t = ProxyServer.getInstance().createTitle()                      //这里使用BungeeCordAPI创建一个标题
  20.                                 .title(TextComponent.fromLegacyText("§aYAY"))             //绿色的YAY
  21.                                 .fadeIn(3)                                                     //淡入
  22.                                 .fadeOut(5);                                                  //淡出
  23.                         ((ProxiedPlayer) s).sendTitle(t);                         //发送
  24.                 } else {
  25.                         s.sendMessage("§4你必须要是玩家!");              //并不是玩家
  26.                 }
  27.         }
  28. }
复制代码


如果本教程有帮到你请考虑给个好评评价/回复一下本帖,P.S. 给人气不会损失金币的哦



进入目录

作者: lliiooll    时间: 2018-8-18 06:28
很有用,谢谢哦
作者: RainIFunS    时间: 2018-8-27 01:32
这用的是某(我不习惯的)链式吗QAQ