--- front: hard: 入门 time: 15分钟 --- # 最简单的插件 # Bukkit插件的本质 插件本质是一个基于BukkitAPI的Java应用. 一个插件必须要有 主类 和 `plugin.yml`文件. 例如下面是一个常见插件, 让我们找一下它的主类和`plugin.yml`文件. ![](../images/0_2.jpg) # 简单的插件 在编写自己想做的插件之前, 不妨做一个简单的插件来了解一下Bukkit插件如何编写. 新建一个Java工程, 导入开服用的服务端jar文件到工程的Libraries中. 创建`tdiant.helloworld.HelloWorld`类作为插件的主类, 并继承`JavaPlugin`类. 在主类里覆写`onEnable`方法和`onDisable`方法. 完成后, 代码应该类似这样: ```java package tdiant.helloworld; import org.bukkit.plugin.java.JavaPlugin; public class HelloWorld extends JavaPlugin { @Override public void onEnable() { System.out.println("Hello World"); } @Override public void onDisable() { } } ``` Bukkit服务端会在插件被启用时调用`onEnable`方法, 被停用时调用`onDisable`方法. 但这还不够,我们还需要告诉Bukkit,插件的一些信息才能让他更好的识别. 创建`plugin.yml`文件. 打开plugin.yml文件并在其中输入如下信息: ```yml name: HelloWorld main: tdiant.helloworld.HelloWorld version: 1 author: MinecraftDev ``` > **特别注意: 如果你的插件是基于新版本API(1.13以及以上版本)编写的, 应当在plugin.yml中额外增加`api-version: 1.13`键值对.例如这样:** > ```yml > name: HelloWorld > main: tdiant.helloworld.HelloWorld > api-version: 1.13 > version: 1 > author: MinecraftDev > ``` > **这会告诉Bukkit, 这个插件是基于新版API编写的.** > 若要兼容1.13及以上版本的同时兼容旧版本, 应特别注意各版本之间的 API 变化(譬如1.12进度系统取代了成就系统, 1.13的 Material 枚举发生了巨大变化). *注意: 主类的名称并不是固定的, 但是`plugin.yml`文件的名称是固定的.* 上面的plugin.yml文件逐行分析如下: | 键 | 意义 | 备注 | | :-: | :-: | :- | | name | 插件名 | 不允许带有中文和空格, 推荐只含有下划线、英文. | | main | 插件的完整主类名 | 例如我这里插件主类为tdiant.helloworld.HelloWorld, 此处则需填写tdiant.helloworld.HelloWorld. | | version | 插件版本 | 您可以填写一个合理的String内容, 而不一定必须为数字, 例如可填写v1.0.0 | | author | 作者 | - | 可以发现, 当插件Jar被正常加载后, 会在控制台输出`Hello World`字符串, 这标志着我们的HelloWorld插件正常工作. ![](../images/0_3.png) # BukkitAPI中的Logger ## Logger *这里只是简要提及, 不详细介绍, 只需要知道有这件事即可.* BukkitAPI“修改”了我们常用的sout (即`System.out.println`), 将其“引入”了BukkitAPI提供的Logger. 只有通过Logger输出的文本信息才能记录在服务端生成的log文件中. 在BukkitAPI插件开发时, 我们通常不用sout输出想往后台输出给服主看的文本信息, 而应用Logger. 主类有`getLogger()`方法, 可以利用这个方法获得Logger. 例如这样: ```java public class HelloWorld extends JavaPlugin { @Override public void onEnable(){ this.getLogger().info("Hello World"); } @Override public void onDisable(){} } ``` 这样输出信息的方式与sout相比最主要的区别是, 如果你的插件`plugin.yml`里的名称为`Test`那么: ```java this.getLogger().info("测试"); System.out.println("测试"); ``` 输出的结果是 ``` [23:33:33] [Server thread/INFO]: [Test] 测试 [23:33:33] [Server thread/INFO]: 测试 ``` ## ChatColor 在所有能发彩色文字的地方, 你可以直接使用双s (即`§`符号, Windows系统下按住键盘Alt键, 在数字键盘区域依次按下0167后松开Alt键即可输入该字符) + 对应颜色代码(可以在Minecraft Wiki上查到)代表颜色. 颜色是可以混用的: `§4比§c如§6这§2样`. 在开发中, 你不必这样, `ChatColor`可以替代. ```java p.sendMessage(ChatColor.RED+"你" + ChatColor.GREEN+"好"+ ChatColor.YELLOW + "!"); ``` 这样就可以发送一个 红色的“你”, 绿色的“好”, 黄色的感叹号 给玩家. 后面了解配置文件的操作后, 一些插件允许服主在设定一些提示语时用`&`符号代替`§`, 插件处理这样的文本信息时, 可以这样处理成带颜色的字符串: ```java String str = "&4哈&c哈&6哈....."; //待处理字符串 p.sendMessage(str); //发给玩家的还是: &4哈&c哈&6哈..... String str_finish = ChatColor.translateAlternateColorCodes('&',str); //处理好的字符串 p.sendMessage(str_finish); //发给玩家就是彩色的 ``` > 提示:你可以使用 > ```java > import static org.bukkit.ChatColor.*; > ``` > 来导入`ChatColor`中的所有枚举。接下来你就可以更方便地写颜色代码: > ```java > String str = RED + "/test help" + GREY + " - " + WHITE + "显示帮助菜单。"; > ```