一、第一个插件

这一章节,我们会开发第一个属于自己的插件
在这之前,我们还需了解plugin.yml和config.yml,并大概了解插件的原理

plugin.yml

这个文件必须存在,否则读不出来。

右键项目,新建文件,文件名:plugin.yml

先不要往里面写什么,因为你还不知道我们该写些什么(废话)。

Bukkit对yml文件的要求十分严格,打错一个字就整个都不读


config.yml

这个文件可以存在,也可以不存在。

右键项目,新建文件,文件名:config.yml

这个是配置文件,在之后的教程中会用到,有很大的用处。一些优秀的插件往往都离不开它。


原理

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

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

还记得插件是什么吗?我们调用Bukkit的API,就是在用Bukkit提供给我们的接口。如果插件脱离了Bukkit就无法正常运行,因为没有BukkitAPI。

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


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


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

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

当然,不止这些。


NMS(net.minecraft.server)

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

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

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

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

确实,NMS是不得已的情况下再使用为好,非必要请使用BukkitAPI。NMS的兼容性较差,各版本之间无法很好的相互兼容,并且方法、字段名已被混淆

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

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

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


编写教程

请自己手打代码,复制粘贴你永远也学不会
请自己手打代码,复制粘贴你永远也学不会
请自己手打代码,复制粘贴你永远也学不会
在你建好的包包下新建一个Java文件,类名请遵循帕斯卡命名法1

之后继承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: XXX
# 插件的介绍
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的安全性很高)而重新修改又会花掉大量时间(包括编译、打包、重启服务端)所以在编写插件时错是可以的,同一个错一犯再犯是不容许的。


上一篇:我的世界Bukkit服务器插件开发教程(零)环境搭建
下一篇:我的世界Bukkit服务器插件开发教程(二)命令


  1. 帕斯卡命名法 ↩︎

我的世界Bukkit服务器插件开发教程(一)第一个插件相关推荐

  1. 我的世界Bukkit服务器插件开发教程(十一)粒子、药水效果与音效

    十一.粒子.药水效果与音效 太简单了吧! 1.粒子效果 1.1.基本操作 播放粒子,首先需要确定粒子需要播放的位置.需要注意,我们一次只能播放一个粒子,如果需要播放多个粒子的话--也不麻烦. 播放粒子 ...

  2. 我的世界Bukkit服务器插件开发教程(七)计分板

    七.计分板 写在前面 对于计分板,相信大部分人会认为这是一个计分的玩意.但不然,它的用处远远不止计分那样简单,计分板在服务器中起着重要的作用,在大部分插件中都有着它的身影. 另注:本章节有大量干货,请 ...

  3. 我的世界Bukkit服务器插件开发教程(五)方块Blocks

    五.方块Blocks 我怕不更新会被骂,所以更了. 坐标系 小伙纸,求一下∑i=0∞i2\sum_{i=0}^\infty i^2∑i=0∞​i2(bushi 是的,你没猜错,我们要涉及到史上最NB超 ...

  4. 我的世界Bukkit服务器插件开发教程(十五)世界生成器

    十五.世界生成器 如果你仔细观察,会发现有个叫saves的文件夹,这个文件夹是用来存放存档的,即我们平常说的世界. 显然,服务器承担了创建世界.加载世界的任务.Bukkit 中也有专门生成世界的生成器 ...

  5. 我的世界Bukkit服务器插件开发教程(八)进度条与自定义合成表

    八.进度条与自定义合成表 写在前面 本来我想将进度放入本章节当中,但无奈进度牵扯到json文件,估计我又要叽叽喳喳讲一堆json,出于人最基本的性格,这章节暂且不讲. 进度条 说起进度条,打个最简单的 ...

  6. 我的世界Bukkit服务器插件开发教程(十三)资源包与玩家资料

    十三.资源包与玩家资料 1.资源包(Resource Pack) 早期的 Minecraft 并没有资源包一说,而是被叫做材质包.有些服务器为了让玩家拥有更好的游戏体验,一般会在自己特制的客户端中存放 ...

  7. 我的世界bukkit服务器开发教程第一章——开发环境

    提示:如果图片看不见或者文字有乱码,请到我的网站:www.xiaoguaimao.cn 前言: 本教程共分为两个部分: 1.服务器插件开发 2.服务器专属启动器开发 如果你学过编程,那你会很轻松,如果 ...

  8. 我的世界虚拟服务器架设,我的世界Minecraft服务器架设教程_服务器怎么建立

    [导读]我的世界Minecraft服务器架设教程. 下面给大家带来<我的世界>Minecraft服务器的架设教程,让大家对我的世界服务器建立有一个不错的认识,从怎么建立,到怎么维护做一个系 ...

  9. 伤害世界怎么自建服务器,伤害世界Hurtworld服务器架设教程

    <伤害世界(Hurtworld)>虽然支持国内直连,不过还是会出现不稳定的情况,自建服务器的好处在于可以有一个稳定的游戏环境,那么本作该如何架设服务器呢,下面带来Hurtworld服务器架 ...

最新文章

  1. 通过gps给定的两个经纬度坐标,计算两点之间的距离
  2. 让Dreamweaver支持phtml
  3. 安装默认报表服务器虚拟目录,本机模式安装默认配置 (Reporting Services)
  4. java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. 【华为云技术分享】MongoDB经典故障系列二:如何限制最大连接数?
  6. c语言 程序统计注释比例,C语言统计单词数量程序 超详解
  7. android系统下多媒体播放
  8. MongoDB数据库(二):增删查改
  9. C#中文件与文件夹相关的操作
  10. python参数检查类型_Python类型检查
  11. GPIO的8种工作模式
  12. 马原复习思维导图-前三章
  13. docer 设置 拉取http协议的私有仓库
  14. Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法
  15. TCP BBR之Startup gain的另一种推导法以及最新进展
  16. python太阳花代码_python太阳花绘制代码教程
  17. 对php的感受100字_团建活动后的感想50字-100字《5篇》
  18. 逻辑地址、虚拟地址、线性地址、物理地址
  19. 如何恢复录音删除的录音文件_电脑录音软件如何定时自动录音
  20. 地球坐标,火星坐标,百度坐标转换

热门文章

  1. 职称评审还要考职称英语和职称计算机吗,广州中级经济师职称评审,需要考职称英语和职称计算机吗?是否还要发表论文?...
  2. html5黑板源码,支持移动端的HTML5 Canvas逼真黑板特效
  3. 志良电子关于LED控制卡显示内容上下行有虚点的问题研究(一)
  4. 汉语字典数据表 mysql_mysql数据库字典表
  5. 【转】LINUX内核编译步骤详细介绍
  6. SystemUI导航键显示隐藏某个按钮(Recent Home Back)
  7. 「转」备受质疑北师大大四女生上任副总裁
  8. 工业机器人码垛教学实施_ABB工业机器人码垛教学编程案例分析
  9. 【新手入门】全网最全Leap Motion技术总结
  10. 再谈:被遗忘的艺术—图思维方式