# 最简单的插件

# Bukkit插件的本质

插件本质是一个基于BukkitAPI的Java应用. 一个插件必须要有 主类 和 plugin.yml文件.

例如下面是一个常见插件, 让我们找一下它的主类和plugin.yml文件.

# 简单的插件

在编写自己想做的插件之前, 不妨做一个简单的插件来了解一下Bukkit插件如何编写.

新建一个Java工程, 导入开服用的服务端jar文件到工程的Libraries中. 创建tdiant.helloworld.HelloWorld类作为插件的主类, 并继承JavaPlugin类.
在主类里覆写onEnable方法和onDisable方法. 完成后, 代码应该类似这样:

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文件并在其中输入如下信息:

name: HelloWorld
main: tdiant.helloworld.HelloWorld
version: 1
author: MinecraftDev

特别注意: 如果你的插件是基于新版本API(1.13以及以上版本)编写的, 应当在plugin.yml中额外增加api-version: 1.13键值对.例如这样:

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插件正常工作.

# BukkitAPI中的Logger

# Logger

这里只是简要提及, 不详细介绍, 只需要知道有这件事即可.

BukkitAPI“修改”了我们常用的sout (即System.out.println), 将其“引入”了BukkitAPI提供的Logger.
只有通过Logger输出的文本信息才能记录在服务端生成的log文件中.

在BukkitAPI插件开发时, 我们通常不用sout输出想往后台输出给服主看的文本信息, 而应用Logger.
主类有getLogger()方法, 可以利用这个方法获得Logger.
例如这样:

public class HelloWorld extends JavaPlugin {
    @Override  
    public void onEnable(){  
        this.getLogger().info("Hello World");
    }  
  
    @Override      
    public void onDisable(){}  
}  

这样输出信息的方式与sout相比最主要的区别是, 如果你的插件plugin.yml里的名称为Test那么:

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可以替代.

p.sendMessage(ChatColor.RED+"你" + ChatColor.GREEN+"好"+ ChatColor.YELLOW + "!");

这样就可以发送一个 红色的“你”, 绿色的“好”, 黄色的感叹号 给玩家.

后面了解配置文件的操作后, 一些插件允许服主在设定一些提示语时用&符号代替§, 插件处理这样的文本信息时, 可以这样处理成带颜色的字符串:

String str = "&4哈&c哈&6哈....."; //待处理字符串
p.sendMessage(str); //发给玩家的还是: &4哈&c哈&6哈.....
String str_finish = ChatColor.translateAlternateColorCodes('&',str); //处理好的字符串
p.sendMessage(str_finish); //发给玩家就是彩色的

提示:你可以使用

import static org.bukkit.ChatColor.*;

来导入ChatColor中的所有枚举。接下来你就可以更方便地写颜色代码:

String str = RED + "/test help" + GREY + "    -    " + WHITE + "显示帮助菜单。";

入门

15分钟

Logger

ChatColor