跳到主要内容

MC 服务端介绍

如果你计划开设一个 Minecraft (MC) 服务器,你会发现有多种不同的服务端可供选择。由于 Minecraft 是一款由社区推动发展的游戏,各类玩家社区以惊人的速度开发和维护着各种服务端。那么,这些服务端究竟是什么?它们的本质如何?本节将按照时间顺序,为你讲述这一问题的来龙去脉。

🏛️ 官服 (Vanilla)

最初,Minecraft 只有 Java 版本。每次发布新版本(不考虑远古版本),开发商 Mojang 都会同时发布对应的 ServerJar 文件。通过这个文件,你可以启动一个 MC 服务器,这类服务器通常被称为“官服”。

官服启动后,会在根目录下生成一个server.properties文件,这是它的配置文件。

在配置文件中,你可以设置服务器的端口等内容。特别值得一提的是其中的一个设置项:online-mode。默认情况下,这项设置为true,这意味着要加入服务器的客户端必须通过正版登录方式进行认证。如果将其手动改为false,那么我们通常所说的“盗版玩家”也可以连接到服务器。Mojang 设计这一设置,是为了给无法连接互联网的服务器提供便利。如果一台电脑开启了官服,但无法联网,局域网内的其他设备仍然可以愉快地联机玩耍。如果没有这个设置选项,无法联网时就不能进行正版验证,从而导致多人联机在这种场合下无法进行。

由此可见,Mojang 允许盗版玩家的存在,实际上是为了给那些无法正常联网的玩家提供一种“离线模式”,而绝不是官方允许盗版玩家理所当然地正常游玩。官服在开发时并没有对盗版玩家做出任何“特殊照顾”。不过,一些社区开发者在开发其他服务端时,考虑到部分情况,对盗版玩家进行了特定的优化。

如果你是一名 MOD 开发者,不妨想象一下:在 MOD 开发过程中,调试工作通常是在“离线模式”下进行的。Mojang 的这一举措实际上极大地促进了 MC 游戏社区的发展,显然利大于弊。

🔧 Bukkit 服务端

官服存在一个显而易见的问题,那就是缺乏“插件系统”。
例如,如果你是一名盗版服务器的服主,你将无法对玩家进行“身份识别”,因为所有玩家都可以通过修改启动器中的玩家名来“冒充”其他玩家连接到服务器。如果你想禁止服务器内的 TNT 使用,或有其他特殊需求,如让玩家无法把手中的钻石丢到地上,官服根本无法实现这些功能。虽然 MC 的红石和命令方块功能日益完善,但仍无法满足社区玩家对服务器自定义的需求,因此,一个成熟的“插件系统”变得极为必要。

于是,Bukkit 服务端应运而生。

Bukkit 服务端启动后,会额外生成一个配置文件bukkit.yml,以及一个名为plugins的文件夹。
服主可以将插件 jar 文件放入plugins文件夹并重新加载服务器,使插件生效,安装过程极为方便。开发者可以利用 Bukkit 官方提供的 API 开发插件,丰富并拓展游戏玩法。

🚀 Spigot 服务端

SpigotMC 社区发布了 Spigot 服务端。最初,它是对 Bukkit 服务端进行的各种优化和扩展。

然而,由于 Bukkit 服务端直接使用了 Mojang 的代码,因法律原因,Bukkit 被 Mojang 起诉并败诉,最终停止开发。尽管如此,Bukkit 在社区内依然热度不减,且拥有大量插件。后来,SpigotMC 社区逐渐接管了 Bukkit 的开发工作,意味着他们承担了 BukkitAPI 的维护责任。

为了规避直接使用 Mojang 代码带来的法律问题,SpigotMC 社区在发布服务端时采用了BuildTool。其运作模式大致如下:如果服主想下载 Spigot 服务端,需先下载 BuildTool。正确使用 BuildTool 后,工具会先下载一个官服 Jar 文件,然后使用 SpigotMC 社区特制的 fernflower 反编译工具将官服 Jar 文件反编译为源代码,再下载 Spigot 服务端的源码(不包含 Mojang 的源代码)。准备工作完成后,BuildTool 会在用户的计算机上自动完成代码的植入和编译工作,生成最终的 Spigot 服务端 Jar 文件。
由于整个过程中,SpigotMC 社区没有直接提供官方源码的二次修改成品,因此规避了法律风险。

目前网上流传的大部分 Spigot 服务端现成 Jar 文件,都是基于 BuildTool 编译的成品 Jar 文件。实际上,SpigotMC 社区官方网站上并不提供这些成品 Jar 文件的下载。

🌐 其他服务端

后来,又有许多基于 Spigot 的服务端被修改,创造出各种不同的服务端。例如,Paper服务端,它是基于 Spigot 服务端的社区优化版本。
如果你运行了一个 Paper 服务端,你会发现服务端目录下有bukkit.ymlspigot.ymlpaper.yml这三个配置文件,这背后有着有趣的故事。

社区中还有一些独立开发的服务端。
例如,在 Bukkit 输掉官司后,一些开发者参与了一个几乎完全脱离官方服务端代码的项目,即Sponge服务端。

此外,最早还有MCPC+服务端。其开发者将 Spigot 与 Forge 整合在一起,使服务器既能装 MOD 又能装插件。后来,MCPC+改名为Cauldron,又衍生出KCauldron,但这三款服务端都停留在 1.7.10 版本并停止更新。
社区还出现了CatServerUraniumArclight等服务端,它们也可以实现插件和 MOD 服的功能。

注意

社区中部分服务端存在争议,并因此发生过一些影响深远的事件。
例如,在 2019 年,Spigot 被 Mojang 起诉,并败诉。这导致了 Spigot 社区的分裂,导致了一些服务端的出现,如CatServerUraniumArclight。这些服务端虽然都基于 Spigot,但却有着自己的特色。 以及近年来的新兴诸多 生电服务端 等,它们的出现也引发了一些争议。这些服务端的出现,也让我们看到了服务端的发展方向。 本教程仅作介绍,未包含某些常用服务端并不代表作者对这些服务端持有任何负面看法。服务端名称的排序无先后之分,不能认为某款服务端的名字排在前面就是作者对该服务端存在偏见或特殊理解。

📝 关于本教程

本教程,顾名思义,是 Bukkit 插件开发教程。
理论上,它支持 Bukkit 服务端、Spigot 服务端和各种衍生服务端。由于 Sponge 服务端使用的 API 体系与 Bukkit 完全不同,本教程不包含对 Sponge 服务端的支持。

BukkitAPI 由于发展原因经历了许多变动,本教程会尽量提及这些变化。这意味着本教程的内容无法完全支持所有版本的 BukkitAPI。然而,不必担心,尽管 API 发生了不少变化,思路仍然一致。如果你对 BukkitAPI 有足够的了解,应该能在你需要开发的版本中找到相应的 API 用法。