MC服务器最吸引人的就是插件,通过插件,可以改变游戏的玩法,配合MC本身是沙盒游戏的本质,可以创造出无限的可能性. 本文就来简单地介绍一下插件制作的总体概念.
注: 此教程的服务端采用spigot
,另外,本文上说到的接口并非指java接口.
在MC服务器新手教程里说到过几种服务端:
一. 原版服
这个服务端基本上没有插件,因此基本上没人会去直接使用这个端开服
可能出于商业上的考虑,原版服对代码做了混淆(天哪,看着混淆的代码,我怎么知道有哪些功能?怎么做插件?)
服务端包(通常叫server.jar
)结构上,主要包含:
- 第三方lib库
- 服务端本身的代码,都在包
net.minecraft.server
内(有人称这个为’底层’)
二. 水桶服(bukkit)
这是曾经最盛行
的插件服务端,它在原版服的基础上构建,对原版服做了完整的封装
.
(可惜后来因为协议的问题停止开发了)
因为做了完整的封装,所以对于服务端所有的功能,我们都不需要去接触原版服的代码,这是很重要的一点,它避免了我们直接接触混淆的代码,大大降低了开发的难度.
水桶服的架构主要分为两大模块,一个是Bukkit
,一个是CraftBukkit
,前者是接口,后者是实现.
这样架构有什么好处呢? 这样更方便插件开发,因为接口主要是给插件开发者引用的,作为插件的开发者,不需要去关心具体的实现是怎样的,只需要知道服务端提供给你使用的接口是怎样的.
那么开发插件引入的jar包应该是接口的jar包还是实现的jar包呢? 一般引入的都是接口的jar包,因为随着版本更新,接口一般变动比较小,而实现变动比较大. 针对接口开发的插件意味着跨版本使用的可能性更大.
接口包(通常叫Bukkit.jar
)结构上,主要包含:
- 服务端本身的代码,都在
org.bukkit
包内
实现包(通常叫CraftBukkit.jar
)结构上,主要包含:
- 第三方lib库
- 服务端接口的代码
- 服务端实现的代码,都在
org.bukkit.craftbukkit
包内
三. 水龙头服(spigot)
这是目前最流行
的插件服务端,它在水桶服的基础上构建,基本上可以看做水桶服的继承与扩展.(或者可以看做水桶服的延续?)
架构也与水桶服类似,扩展Bukkit接口成Spigot-Api
,扩展CraftBukkit实现成Spigot
接口包(通常叫Spigot-Api.jar
)结构上,主要包含:
- Bukkit服务端接口的代码
- Spigot服务端额外接口的代码,都在
org.spigotmc
包内(实际上很少)
实现包(通常叫Spigot.jar
)结构上,主要包含:
- Bukkit服务端实现的代码
- spigot服务端额外实现的代码,都在
org.spigotmc
包内(实际上很少)
四. 总结
从与水桶服的关系可以看出来, 针对水桶服制作的插件,一般都能在水龙头服上使用; 但反过来针对水龙头服制作的插件,不一定能在水桶服上使用.
总体来说,一般针对接口编程而不针对实现编程,极少会去调用混淆过的原版服务端代码.
即使制作spigot服务端插件,大部分情况下仍然是调用bukkit服务端的接口,因为spigot提供的额外接口很少.
少数情况下某些功能可能服务端提供的接口满足不了,就会针对实现编程,调用服务端实现的某些代码,但这种方式制作出来的插件通常版本兼容性较差,服务端更换版本插件可能就需要调整调用的方法(即升级插件).