我的世界Bukkit服务器插件开发教程(一)第一个插件
一、第一个插件
这一章节,我们会开发第一个属于自己的插件
在这之前,我们还需了解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.class
、ChatMessage.class
、EntityBee.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服务器插件开发教程(二)命令
帕斯卡命名法 ↩︎
我的世界Bukkit服务器插件开发教程(一)第一个插件相关推荐
- 我的世界Bukkit服务器插件开发教程(十一)粒子、药水效果与音效
十一.粒子.药水效果与音效 太简单了吧! 1.粒子效果 1.1.基本操作 播放粒子,首先需要确定粒子需要播放的位置.需要注意,我们一次只能播放一个粒子,如果需要播放多个粒子的话--也不麻烦. 播放粒子 ...
- 我的世界Bukkit服务器插件开发教程(七)计分板
七.计分板 写在前面 对于计分板,相信大部分人会认为这是一个计分的玩意.但不然,它的用处远远不止计分那样简单,计分板在服务器中起着重要的作用,在大部分插件中都有着它的身影. 另注:本章节有大量干货,请 ...
- 我的世界Bukkit服务器插件开发教程(五)方块Blocks
五.方块Blocks 我怕不更新会被骂,所以更了. 坐标系 小伙纸,求一下∑i=0∞i2\sum_{i=0}^\infty i^2∑i=0∞i2(bushi 是的,你没猜错,我们要涉及到史上最NB超 ...
- 我的世界Bukkit服务器插件开发教程(十五)世界生成器
十五.世界生成器 如果你仔细观察,会发现有个叫saves的文件夹,这个文件夹是用来存放存档的,即我们平常说的世界. 显然,服务器承担了创建世界.加载世界的任务.Bukkit 中也有专门生成世界的生成器 ...
- 我的世界Bukkit服务器插件开发教程(八)进度条与自定义合成表
八.进度条与自定义合成表 写在前面 本来我想将进度放入本章节当中,但无奈进度牵扯到json文件,估计我又要叽叽喳喳讲一堆json,出于人最基本的性格,这章节暂且不讲. 进度条 说起进度条,打个最简单的 ...
- 我的世界Bukkit服务器插件开发教程(十三)资源包与玩家资料
十三.资源包与玩家资料 1.资源包(Resource Pack) 早期的 Minecraft 并没有资源包一说,而是被叫做材质包.有些服务器为了让玩家拥有更好的游戏体验,一般会在自己特制的客户端中存放 ...
- 我的世界bukkit服务器开发教程第一章——开发环境
提示:如果图片看不见或者文字有乱码,请到我的网站:www.xiaoguaimao.cn 前言: 本教程共分为两个部分: 1.服务器插件开发 2.服务器专属启动器开发 如果你学过编程,那你会很轻松,如果 ...
- 我的世界虚拟服务器架设,我的世界Minecraft服务器架设教程_服务器怎么建立
[导读]我的世界Minecraft服务器架设教程. 下面给大家带来<我的世界>Minecraft服务器的架设教程,让大家对我的世界服务器建立有一个不错的认识,从怎么建立,到怎么维护做一个系 ...
- 伤害世界怎么自建服务器,伤害世界Hurtworld服务器架设教程
<伤害世界(Hurtworld)>虽然支持国内直连,不过还是会出现不稳定的情况,自建服务器的好处在于可以有一个稳定的游戏环境,那么本作该如何架设服务器呢,下面带来Hurtworld服务器架 ...
最新文章
- 通过gps给定的两个经纬度坐标,计算两点之间的距离
- 让Dreamweaver支持phtml
- 安装默认报表服务器虚拟目录,本机模式安装默认配置 (Reporting Services)
- java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...
- 【华为云技术分享】MongoDB经典故障系列二:如何限制最大连接数?
- c语言 程序统计注释比例,C语言统计单词数量程序 超详解
- android系统下多媒体播放
- MongoDB数据库(二):增删查改
- C#中文件与文件夹相关的操作
- python参数检查类型_Python类型检查
- GPIO的8种工作模式
- 马原复习思维导图-前三章
- docer 设置 拉取http协议的私有仓库
- Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法
- TCP BBR之Startup gain的另一种推导法以及最新进展
- python太阳花代码_python太阳花绘制代码教程
- 对php的感受100字_团建活动后的感想50字-100字《5篇》
- 逻辑地址、虚拟地址、线性地址、物理地址
- 如何恢复录音删除的录音文件_电脑录音软件如何定时自动录音
- 地球坐标,火星坐标,百度坐标转换
热门文章
- 职称评审还要考职称英语和职称计算机吗,广州中级经济师职称评审,需要考职称英语和职称计算机吗?是否还要发表论文?...
- html5黑板源码,支持移动端的HTML5 Canvas逼真黑板特效
- 志良电子关于LED控制卡显示内容上下行有虚点的问题研究(一)
- 汉语字典数据表 mysql_mysql数据库字典表
- 【转】LINUX内核编译步骤详细介绍
- SystemUI导航键显示隐藏某个按钮(Recent Home Back)
- 「转」备受质疑北师大大四女生上任副总裁
- 工业机器人码垛教学实施_ABB工业机器人码垛教学编程案例分析
- 【新手入门】全网最全Leap Motion技术总结
- 再谈:被遗忘的艺术—图思维方式