Minecraft(我的世界)中文论坛

标题: [BungeeCord] 插件编写研究 - 为你的云服编写插件吧 (BC-1.9+) [~几千字]

作者: DarcJC    时间: 2016-3-18 23:55
标题: [BungeeCord] 插件编写研究 - 为你的云服编写插件吧 (BC-1.9+) [~几千字]
本帖最后由 z25096708 于 2016-3-19 15:05 编辑

BungeeCord Plugin Development - BC插件开发
让我们来开发BC[sup]1[/sup]插件吧!


大家好,这里是Mcdarc。最近翻了一下本站,发现似乎全是forge、spigot的开发教程,而且似乎中国这边开发过BC插件的人十分稀少。于是我打算就在这里写了一个开发教程。


目录


关于目录。。。因为一改他就要审核,懒得改了。所以点击只看楼主就好了。





注释:
1.BC为BungeeCord简称. 往后不再赘述.
2.工程指的是编程领域的专有名词.

[groupid=1151]Minecraft插件百科[/groupid]
作者: DarcJC    时间: 2016-3-18 23:55
本帖最后由 z25096708 于 2016-3-19 01:06 编辑

I.工程创建


现在让我们来创建第一个BC工程吧!其实早已经有人写出了一个工程的生成网页。链接在这你可以轻松地利用这个东西创建一个idea的工程。
打开这个网站,Plugin name 填写你的插件名称,Plugin package 填写你的插件包,Plugin author 填写插件作者名称,Plugin version 填写插件的版本[sup]1[/sup]。然后单击Generate即可生成一个项目,并且该网站会将这个项目打包为.zip格式并自动下载。如果你没有勾选 Include a listener for me, please 选项,那么不出意外打开这个压缩包会有两个东西。一个是src文件夹,另外一个是pom.xml[sup]2[/sup]
如果你不想太过深究这些玩意的内容的话,那么你可以现在向下看了。但是如果你想深究,那么请自行翻阅DOC。


我个人是推荐使用NetBeans的。百度打开其官网下载,其他下载站下的总是怪怪的。
将刚刚得到的压缩文件解压到一个文件夹,打开NB。点击 文件→打开工程 。

如图所示,NB已经自动识别出了项目。选择并打开。然后就会是这样:

我们可以看到,这里的API是1.7的。我们需要把它更新到最新版。最新版在此下载。右键单击bungeecord-api-1.7-SNAPSHOT.jar,选择手动安装工件,然后选择你下载好的。然后他就会自动下载资源进行一次install。BUILD SUCCESS表示成功。BUILD FAILED则表示失败。
我们继续展开 其他源 。可以发现其下有一个src/main/resources的包,里面还有一个<默认包>。展开,我们会发现里面是plugin.yml。这个就如同spigot的plugin.yml一样,起到告诉BC这是一个插件的作用。里面就是我们填写的四个项目,无需修改。


修改依赖关系应该在项目文件中的pom.xml中修改。





第一章工程创建到这里结束。如有遗漏麻烦提醒。

注释:
1. 示例如图所示。
2.这个文件是maven项目附带的文件。 其内介绍了这个项目的基本特征。






作者: DarcJC    时间: 2016-3-19 00:41
本帖最后由 z25096708 于 2016-3-19 01:16 编辑

II.第一个BC插件


上一节我们已经创建好了一个项目!多么伟大啊!=A=。@tdiant stupidtdiant!!!
然后呢,这节我们就要开始做插件咯。
打开上节我们项目的源包,展开里面的包,会发现有一个 你的插件名.java 的文件。这就是你的插件的主类了。这个主类如果你要更改的话可以在plugin.yml中定义。
里面已经有了一个import并且已经将class写好了extends。所谓extends Plugin就是说明这里是我的插件主类了。


我们先写一个onEnable方法。
  1. public class First extends Plugin {
复制代码
内添加
  1. @Override
  2.     public void onEnable(){
  3.         getLogger().info("插件已加载.");
  4.     }
复制代码

@Override是为了重写api中的onenable方法。而getLogger().info()则可以给控制台发送一条信息。同样的,这样的方法还有两个,分别是onLoad和onDisble。其实onLoad与onEnable没有什么区别,只是onLoad的时间早于onEnable。你可以在onLoad输出插件正在加载,而在onEnable输出插件加载完成。


右键项目,使用依赖关系构建。然后去你解压文件夹的dlist中找到你的小插件=A=,然后把它丢到你的BC里。如果能成功显示那么恭喜你,你做对了。

这玩意真的是十分十分十分没有意义的。你也没有必要来抄,你完全可以自己写出来的。




作者: DarcJC    时间: 2016-3-19 01:16
本帖最后由 z25096708 于 2016-3-20 12:20 编辑

III.一个Listener!(监听器)


上一节我们做出了我们的第一个BC插件。这节我们将要讲到的就是监听器。某些人很熟悉对不对,因为spigot和BC都是md_5撸出来的不明液体



我们需要创建一个新的类,名为LoginListener。我们需要让他继承Listener类,成为一个Listener的子类。于是便将它的
  1. public class LoginListener {
复制代码
修改为
  1. public class LoginListener implements Listener {
复制代码
然后你的IDE肯定会提醒你导入。导入net.md_5开头的就行了。如果他不提示而且你用的不是NodePad++,那么你可能需要换一个IDE了。
然后,跟Spigot插件开发一样的,在事件方法前加@EventHandler。然后public void 方法名(PostLoginEvent event) {}即可。
我们需要在玩家进入服务器的时候给他发送一条消息,那么就这样子来:
  1.     @EventHandler
  2.     public void onLogin(PostLoginEvent event){
  3.         event.getPlayer().sendMessage("欢迎访问本服务器.");
  4.     }
复制代码

event.getPlayer()这个方法是获取一个Player类型,然后就可以直接使用它封装的方法sendMessage就可以了。当然,直接发送字符串的方式在目前版本是不被推荐的。新方法可以在JavaDoc上查看。
这些都是在BC的javadoc上看来的。如果你们真的想学会开发插件,那么一定要学会查看JavaDoc!
官方JavaDoc | 官方聊天系统JavaDoc | 官方API源码

当然不是就这样就可以了,我们还没有告诉BC我们这里是一个监听器呢。我们需要去注册一下。在主类onLoad方法内加入以下代码:
  1. this.getProxy().getPluginManager().registerListener(this, new LoginListener());
复制代码
这个方法的作用是注册你的监听器。

本节到此结束。








作者: DarcJC    时间: 2016-3-27 16:18
本帖最后由 z25096708 于 2016-4-9 20:14 编辑

番外篇.I
讲了那么多BungeeCord的知识,还是普及点其他玩意吧。
【其实是我想在这做个笔记

Forge开发环境无法配置的解决方法
其实可以在用户根目录【C:\Users\你的用户名】下找到一个隐藏文件夹【.gradle】
进入,在里面创建一个文件名为【gradle.properties】,然后里面的内容如下:
  1. <!-- lang: shell -->
  2. systemProp.http.proxyHost=127.0.0.1
  3. systemProp.http.proxyPort=1080
  4. systemProp.http.nonProxyHosts=localhost

  5. systemProp.https.proxyHost=127.0.0.1
  6. systemProp.https.proxyPort=1080
  7. systemProp.https.nonProxyHosts=localhost

  8. org.gradle.jvmargs=-Xmx1200m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
复制代码
这个方法可以解决代理问题,Gradle的内存无限制导致溢出的问题【OOM】。
其中<2-8>行为代理设置。分别为http代理地址、端口、不使用代理的地址,https代理地址,https代理端口,不使用代理端口
然后<10>行为JVM虚拟机参数,用于搞定gradle坑爹的内存分配。Xmx是运行允许使用的最大内存,MaxPermSize是编译时允许使用的最大内存。后面两个不用管。

作者: wodewode    时间: 2017-11-21 18:09
z25096708 发表于 2016-3-18 23:55
I.工程创建

创建工程的链接已挂!
作者: CarbonPaper99    时间: 2018-8-6 10:37
没有指令吗。。。。。难道和Spigot一样?
作者: 1458244469    时间: 2018-9-14 17:35
MCBBS有你更精彩~