本帖最后由 berry64 于 2018-8-26 00:40 编辑
|
什么是指令?
根据上一章节里本灵魂画师绘制的bc流程图,不难推理出玩家在客户端用/打出的指令会先经过BC,再由BC发送给玩家所在的服务器,而这时候就出现了很神奇的东西:BC可以对玩家指令数据包作出更改,比如如果玩家使用的指令BC认识,那么就直接在BC处理掉而不要发送任何数据到服务器,这样可以做到在不同服务器使用同一个指令(因为你连到的是同一个BC)
当然,如果你在单独的服务端后台使用这些指令时无法正常使用的(因为你的服务端压根就没有这个指令,而这个指令时注册在BC的)
虽然听起来好像非常高大上,可是实际使用却非常有限,因为大部分玩家玩的时服务端里的内容而不是BC (我还真见过只玩BC的玩家)
所以BC指令无法直接干涉比如: 这类的东西,但是BC因为对数据包进行了操作所以可以做到但不限于:- 向玩家发送标题(title)
- 向玩家发送tab列表
- 向玩家发送排行榜(右边的那个)
- 以玩家名义/向玩家发送消息
- 强制玩家更换服务器
还有一点需要注意的就是BC并没有Player类,而取代它的是net.md_5.bungee.api.connection.ProxiedPlayer (代理玩家)
|
|
不像bukkit插件需要在plugin.yml里写上commands: BungeeCord创建指令并不需要修改bungee.yml, 但是你仍然需要注册一个指令:
在主类的onEnable()方法下添加以下代码:
- this.getProxy().getPluginManager().registerCommand(this, 指令处理器实例);
复制代码
到这里你可能会问了,就这样注册指令的我怎么知道什么指令呢? 别急,往后看
指令处理器是一个继承了net.md_5.bungee.api.plugin.Command的类,并且有一个构造器使用了父类的(String)构造器:
为了方便理解我们这里写一个栗子:
- import net.md_5.bungee.api.plugin.Command;
- public class CommandExecutor extends Command{
- public class CommandExecutor(){
- super("myCommand");
- }
- }
复制代码 从代码可以大概猜出这里super的字符串就指定了什么指令
至此,你的IDE肯定会疯狂给你报错告诉你少了点什么,而我们缺少的就是实际处理指令的地方所以我们添加一个方法:
- @Override
- public void execute(CommandSender s, String[] args) {
- }
复制代码 这里应该非常显而易见了,虽然没有bukkit的指令那么多数据,但是已经基本看得懂在这个方法里就是指令被运行时的代码了。
args代表了指令后空格的参数,而s则代表了使用这个指令的人(后台or玩家)
写道这里,BC指令创建完成,剩下的就是在execute方法内添加自己希望指令做的事情了
你可能注意到了BC的指令返回值是VOID, 这是(大概)因为md_5发现在写bukkit指令中返回的boolean非常麻烦而且还没有多少人使用,所以移除掉了
|
|
这个BC插件检测玩家的/bcisosm指令并且如果是玩家的话向玩家发送一个标题
- import net.md_5.bungee.BungeeCord;
- import net.md_5.bungee.api.chat.TextComponent;
- import net.md_5.bungee.api.connection.ProxiedPlayer;
- import net.md_5.bungee.api.plugin.Plugin;
- public class MyAwesomeBungeePlugin extends Plugin{
- @Override
- public void onEnable(){
- getProxy().getPluginManager().registerCommand(this, new CmdExe()); //注册
- }
- }
- class CmdExe extends Command{ //这里写到了同一个源文件
- public CmdExe(){
- super("bcisosm"); //指令bcisosm注册
- }
-
- @Override
- public void execute(CommandSender s, String[] args) {
- if(s instanceof ProxiedPlayer){ //和bukkit同理检测是否是玩家
- Title t = ProxyServer.getInstance().createTitle() //这里使用BungeeCordAPI创建一个标题
- .title(TextComponent.fromLegacyText("§aYAY")) //绿色的YAY
- .fadeIn(3) //淡入
- .fadeOut(5); //淡出
- ((ProxiedPlayer) s).sendTitle(t); //发送
- } else {
- s.sendMessage("§4你必须要是玩家!"); //并不是玩家
- }
- }
- }
复制代码 |
如果本教程有帮到你请考虑给个好评评价/回复一下本帖,P.S. 给人气不会损失金币的哦