MineCraft 服务器插件开发教程系列之二:第一个插件

前言

在上一章节中,我们已经配置好了我们的基础开发环境。而本章,我们将会从一个例子插件开始,逐步发掘MineCraft插件开发的真相。

在这之前,我们还需了解plugin.yml和config.yml,并大概了解插件的原理。

plugin.yml

  • 这个文件必须存在,否则读不出来。
  • 右键项目,新建文件,文件名:plugin.yml。
  • 先不要往里面写什么,因为你还不知道我们该写些什么(废话)。
  • Bukkit对yml文件的要求十分严格,打错一个字就整个都不读

config.yml

  • 这个文件可以存在,也可以不存在。
  • 右键项目,新建文件,文件名:config.yml。
  • 这个是配置文件,在之后的教程中会用到,有很大的用处。一些优秀的插件往往都离不开它。

运行原理

一个插件在服务器加载时会发生什么?

如上图所示:首先,服务器会先加载整个服务端,然后开启端口,此时我们的插件才会去加载,然后加载整个世界,最后插件加载完成,服务器才会真正完成加载。

因此,插件本质上就是在调用 官方/第三方 开放出来的API,从而实现我们想要的功能。我们调用Bukkit的API,就是在用Bukkit提供给我们的接口。如果插件脱离了Bukkit就无法正常运行,那就是因为没有BukkitAPI。

启动服务端时,有一个线程,名叫PluginLoader,它是专门用来加载服务器插件的。


我们的插件依赖服务器的核心文件,我们调用服务器的API来去完成自己的工作,从而服务玩家。

可以看到,服务器核心文件下的有诸多api:

文件夹描述
block方块
command命令
entity实体
event事件监听
inventory容器
material存放所有物品
generator创建巨人实体等操作
scoreboard计分板

当然,可用的API接口远不止这些。你在开发插件时可用通过查询对应的API接口文档,从而了解你使用的核心哪些接口被放弃了,又新增了哪些接口。

磨刀不误砍柴工——及时了解接口的可用状态,可以避免在开发中遇到的一些玄学bug。


NMS(net.minecraft.server)

在核心文件中的net.minecraft.server下有许多类,共3680个(截止1.16.5版本),如BlockAir.classChatMessage.classEntityBee.class等。

看这些类名会发现:空气方块、聊天信息、蜜蜂实体……这些每一个类都对应游戏中的每一个方块、服务器中的每一条信息、每一个实体。

NMS(net.minecraft.server),它就是bukkit服务端下的底层实现

我们已经有了BukkitAPI,已经能够帮助我们解决很多问题了,为什么需要接触底层(到底层锻炼锻炼)?

确实,NMS是不得已的情况下再使用为好(比如我需要的功能接口在BukkitAPI中没有被实现,这时候我们就可以尝试去用NMS从底层构建一个),非必要请使用BukkitAPI。NMS的兼容性较差,各版本之间无法很好的相互兼容,并且方法、字段名已被混淆

不过,Bukkit已经反混淆过了。运用Java的反射机制,使得类也是一个对象。这使得我们的插件可以兼容绝大多数版本。

NMS在net.minecraft.server.v版_本_R下,也就是我们刚刚看到的net.minecraft.server.v1_16_R3下。

此章节暂不做详细讲解,再后面的章节实体Entity中我们自定义实体会首次接触到它,到时候我会专门讲解一下NMS和Java反射机制。

实战开发

听我啰嗦了这么久的基础知识应该已经累了吧?无所谓,我要介绍的内容已经说完了,下面我将结合实际的代码,来让你开发出第一个属于你自己的插件。

友情提示:
请自己手打代码,复制粘贴你永远也学不会
请自己手打代码,复制粘贴你永远也学不会
请自己手打代码,复制粘贴你永远也学不会

首先,打开你的开发环境,在你建好的包包下新建一个Java文件,类名请遵循 帕斯卡命名法 之后继承JavaPlugin

public class MyPlugin extends JavaPlugin {

}

重载加载卸载两个方法

@Override
public void onEnable() {
	//加载
}

@Override
public void onDisable() {
	//卸载
}

这两个方法是干嘛的呢,其实很有用
让插件看起来更有特色
我强烈推荐大家创建一个方法say用来输出日志

public void say(String s) {
	CommandSender sender = Bukkit.getConsoleSender();
	sender.sendMessage(s);
}

要输出日志的时候只需say("");即可
只要你创建了这个方法,那么只需往加载和重载方法中写入

@Override
public void onEnable() {
	say("插件已加载!");
}

@Override
public void onDisable() {
	say("插件已卸载!");
}

代码整合

package com.qq.lesson;

import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public class Example extends JavaPlugin {
    public void onEnable() {
        say("插件已加载");
    }

    public void onDisable() {
        say("插件已卸载");
    }

    public void say(String s) {
        CommandSender sender = Bukkit.getConsoleSender();
        sender.sendMessage(s);
    }
}

等等,还没结束!前面我们提到plugin.yml一定要加上去,现在来看看到底要写什么。

属性必需描述
main主类
version插件版本
name插件名字
description不是介绍这个插件
author不是插件作者
authors不是多个插件作者
commands不是命令
permissions不是权限
depend不是依赖,比如这个插件依赖另外的插件
database不是数据库

必需那一列是是的必填。而由于我们才刚刚开发插件,其他的可以不写。

格式如下:

# 插件的名字
name: MyFirstPlugin
# 插件的版本
version: 1.0.0
# 插件的主类
main: com.qq.lesson.MyPlugin
# 插件的作者
author: Exist
# 插件的介绍
description: My First Plugin

注意事项:

  • 每个冒号的后面必须打上一个空格,不然读不出来
  • 如果需要分层,请在开头打上两个空格,不然读不出来
  • 之后打包放进plugin文件夹里就可以了

导出插件

当我们写完一个插件以后我们要将其导出,这样才能方便用户直接使用。

右键我们的项目,点击“打开模块设置”,如图所示:

打开后,选择“工件”:

点击右边的加号,选择JAR,选择Empty(空):

双击右边的编译输出

plugin.yml是我们插件的命根子,所以我们也要将其收入囊中:

选择我们的plugin.yml,然后点击确定就OK了。

回到主页面,选择上方的构建,点击构建工件,等待构建完成之后,我们会发现项目中会多出一个out文件夹,而out文件夹下的artifacts文件夹中的jar文件就是我们的插件。

将jar文件丢进服务器的plugins文件夹,重启服务器,我们就会发现插件正常启动了。至此,你已经完成了你的第一个插件。从一个什么都不会的新手,变成了一个能写简单插件的学习者,是不是很有成就感呢?

一些小知识

如果觉得输出很没有特色,试试彩色字?下面是我从网上找的文字颜色代码对照表,用于参考:

想要使用的话,只需要在你想要打彩色字的前面加上去就可以了
例如,我想打出黄色字你好就可以这么写:

say("§6你好");

当你拥有了足够的开发能力之后,你也可以尝试开发一个 在游戏里可以打彩色字的插件。

闲谈

Bukkit中的线程PluginLoader加载插件,对于每一个插件(也就是jar文件)先找到并读取plugin.yml,如果这个文件有误或根本不存在就报错。然后开始尝试加载,如果加载失败(比如没找到变量或方法)就报错,一些写插件的新手写错了会在服务器控制台中突然看到一大串英文,那就是报错(Java的安全性很高)而重新修改又会花掉大量时间(包括编译、打包、重启服务端)所以在编写插件时错是可以的,同一个错一犯再犯是不容许的。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇