搭建MineCraft服务器简明教程

作者:czp 分类: Minecraft 发布于:2016-12-23 0:51 ė2239次浏览 61条评论

环境: CentOS 7.2 | openjdk 1.8.0


其实这个教程拖了很久没写,大概拖了1年多,自己挖的坑终归是要填的。


Minecraft 服务端简要说明

我想点击这篇博文的用户大概应该很了解 MineCraft 是什么了,否则也不会点击进来,所以先假设你已经非常了解 MineCraft 这个游戏本身。


MineCraft 服务端,最早出现的是由 Mojang 发布的官方服务端,是一个由 java 编写的 jar 程序。简单的运行它,就可以监听一个端口并允许其他玩家连接进来,在同一张地图上玩耍 MineCraft。官方服务端甚至包含一个简单的配置文件和简单的图形界面,用于显示 jvm 内部内存使用情况和cpu利用率等( headless 情况下默认不显示, x11 环境下可以通过参数指定其不显示)。

官方服务端并不支持现在大家习以为常的插件和mod,也就是说,所有玩家就像是在玩没有安装 forge 的 mc 一样。在当时,mc 可以实现联机已经是一件让普罗大众倍感兴奋的事情。而有一些人并不满足于现状,毕竟这种联机太过简陋,没有任何可以自由加强服务端的方法。


于是有一群人开发了 bukkit 这个服务端,这是首次出现的,支持插件的 mc 服务端。他通过对 mc官方服务端 的逆向工程,在官方服务端中加入自己的控制代码,使其暴露出 api ,再把这些 api 封装成可以简单使用的形式,交给插件开发者。这样,插件开发者就可以比较简单的通过自编写插件来任意增强服务端功能。这一第三方服务端的推出,立即吸引了大量的开发者来开发 bukkit 插件,越来越多的插件使得 mc 可玩性极大的增强。同时插件这一单机没有的机制也使得 mc 联机成为热潮。


但是依然有人不满足现状。我们知道,forge 项目很早就已经有了,甚至远在 mc 联机流行之前。这是一个对 mc 客户端代码进行逆向工程并暴露出 api ,用于 mod 开发的工程。他使得玩家可以使用 mod 来扩展游戏的内容,极大的增加了游戏的生命周期,甚至有人认为 mod 的存在是 mc 经久不衰的重要原因。于是一个显而易见的问题就摆在眼前,我们如何在联机中使用 mod 。这个问题问的非常好,我们已经有了可以支持插件的服务端,为什么不能再集成 forge 代码到服务端中,使得服务端支持mod,这样不就可以在联机中使用 mod 了么。对,是的,就是这个样子,最早出现的 mcpc+ 做的就是这件事。

mcpc+ 对 bukkit 代码进行修改,插入 forge 代码,使得其在支持插件的基础上又可以支持 mod 。这样玩家就可以通过在服务端安装 mod,并保证所有接入的玩家都有此 mod 的情况下,在联机中玩耍这个 mod。mcpc+ 这个名字实在太搓了,因此在 1.7.2 之后就彻底改名叫 cauldron (大意可能是 MineCraft 中的炼药锅)。


后来发生了一件令人震惊的事情,由于 bukkit 是对 MineCraft官方服务端 进行逆向工程的基础上开发的,因此实际上侵犯了 Mojang 的相关合法权益,在 mc 风生水起的一年被起诉。具体详情据称是 bukkit 的主要开发者之一由于闹矛盾,对 bukkit 开发组进行背刺,跳槽到 Mojang,顺带把 bukkit 瓦解以泄愤。我们暂且不关注这些阴谋论的事情,我们知道的是,bukkit 已经在 1.7.10 版本停止开发。bukkit 在 1.7.10 之后的版本其实也有,但是实际上是 spigot 开发组在接手(待会讲)。


随着 bukkit 的土崩瓦解,第一个受灾的就是 cauldron ,由于 cauldron 依赖来自 bukkit 的上游代码,因此 cauldron 在 1.7.10 版本也停止更新。后来有另一拨人接手此项目,但是由于依赖 bukkit api ,因此也没法升级游戏版本,只能更新一下 forge 版本,并更名 kcauldron。后来的 thermos 也是做这么一件事情。

因此 mcpc+ 的历史名称是这样的 mcpc+ -> cauldron -> kcauldron -> thermos 

(以下简称 cauldron 系列)


MineCraft 游戏版本依旧在不停的被更新,玩家对于新版本的联机需求极其庞大,而 bukkit 停止开发后,这似乎变成了不可能。于是有一个人,叫做 md-5 ,他主导开发了一个不依赖 MineCraft官方服务端 代码的,也就是不对其进行逆向工程,重新编写的,支持插件的 MineCraft 服务端。它不仅规避了法律因素,同时还实现了 bukkit 的所有 api,且 api 行为和 bukkit 保持一致。这个服务端叫做 Spigot 。在此基础上,还加入了 spigot 特有的新 api ,用以方便开发者。

由于 spigot 实现了所有 bukkit api,因此 bukkit 插件可以直接运行在 spigot 上,除非由于游戏版本不同导致插件内部逻辑错误。spigot 因此吸纳了全部的 bukkit 开发者并继承其生态圈,成为使用人数最多的第三方 MineCraft 服务端。


由于 spigot 只实现了 bukkit api,也就是只支持插件,因此有些人对 1.8.0 版本及以上的 mc 联机中使用 mod 有需求。于是出现了 spnoge 项目,这个项目企图完全重新开发一个服务端,同时支持 mod 和插件。他的开发速度非常缓慢,整个 1.8 游戏版本生命周期被跳过,这段时间内一直是开发状态。这款服务端我之前使用过,其运行效率非常低下,几乎空载情况下也会出现 lag ,游戏体验极其糟糕。 spnoge 由于是完全重新开发,因此其插件接口与 spigot 或者说 bukkit 不同,也就是插件不兼容,开发者甚至要为其单独开发插件,因此其生态圈也极其糟糕。我本人实际上不推荐使用他。


除了以上服务端之外,还有 PaperSpigot、GlowStone等服务端,这些服务端是 bukkit/spigot 的优化和轻量级版本,适用范围较小,对此不做赘述。


获取服务端程序

首先,我们需要有一个服务端程序,我们这里用使用人数最多的 spigot 作为接下来的演示对象。实际上所有服务端的配置和目录结构都参照官方服务端,几乎是一样的,因此不必担心其他服务端操作不同的问题。

spigot 的官网在这里 https://www.spigotmc.org/

但是我们从这里获取服务端速度挺慢的,而且其他服务端的官网,速度也挺慢的。因此我们需要一个比较快速的镜像站,此类站点比较多,例如常用的一个 https://yivesmirror.com/

我们访问这个镜像站,依次点击

Downloads -> Vanilla ->Spigot

在下方的列表中,列出了各种版本的 spigot ,我们不要去下载带有 api 字样的文件,那是只有接口的包,用于插件开发时的依赖补全。

我们需要的包名字大致是这样的 spigot-1.11-R0.1-SNAPSHOT-latest.jar 

或者我们直接选择 spigot-latest.jar 这是当前最新版本的 spigot

点击右侧的下载,我们就获得了一个 spigot 服务端程序。


运行 Spigot

我们注意到,spigot 是一个 jar 文件,因为他也是使用java编写的。所以我们要首先安装 jre,我们在服务器上使用命令行

yum install java

(debian系列的需要使用 apt install openjdk-8-jre)

(之所以使用 java8 ,是因为在游戏版本 1.7.x 时代,可以使用 java7 或 java8 来运行 spigot。而游戏版本 1.8.x 之后,spigot 代码中使用了java8 特有的语法,因此必须使用 java8 来运行它)

检查安装

java -version

如果有回显信息表示安装正常。

由于 spigot 会将配置文件、地图文件和存放其他内容的文件夹均生成并读取在 spigot 所在目录,因此我们首先要创建一个目录,让 spigot 在这个目录中运行以免污染文件系统中的其他目录。

假设我们要把服务端的文件放在 /root/spigot

cd /root

mkdir spigot

cd spigot
我们首先把 spigot 上传到此目录

之后在服务器上继续执行(假设文件名为  spigot-latest.jar

java -jar spigot-latest.jar

(若有权限问题请按照实际情况自行处理)

随后我们会看到一些输出,在最后,我们会看到如下字样(例如,下同)

[02:00:41 WARN]: Failed to load eula.txt

[02:00:41 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

[02:00:41 INFO]: Stopping server

这并不是一个 bug ,也不是运行环境错误,而是需要手动同意其 EULA (最终用户协议)

我们编辑这个 EULA 文件

vim ./eula.txt

末尾的

eula=false

改为

eula=true

保存并退出,重新运行 spigot

java -jar spigot-latest.jar

当我们看到如下字样时表示服务端运行成功,并且可以允许玩家接入了

[02:04:20 INFO]: Done (17.394s)! For help, type "help" or "?"

此时我们在 MineCraft 客户端中连接此服务器(不需要填写端口号,因为此时处于默认配置),就可以进入并玩耍(如果你不熟悉 MineCraft 游戏本身,那么请首先自行了解 MineCraft 游戏操作步骤)


spigot 命令和配置

spigot 有一套继承与 bukkit 的命令系统。在服务端运行成功之后,会出现 > 这个符号,和 Linux 控制台一样,我们此时就可以输入命令了。

我们在游戏中查看命令需要打开聊天栏输入 /help ,而在服务端控制台,我们需要输入 ?

他会为我们打印所有可用的命令,包括插件命令。

命令右侧显示有这条命令的简要说明,如果要查看一条命令的详细使用语法,可以使用例如如下的命令

? tp

他会显示 /tp 这条命令的详细使用语法。

值得注意的是,在控制台使用命令,并不需要使用 / 符号。


服务端主配置文件为 spigot 工作目录下的 server.properties 文件。

实际上这份配置文件并不需要额外说明,其键名已经能够说明其含义。

这份文件继承于官方服务端,其他所有服务端也会有一样的这么一份文件。在其中定义了服务端监听端口,最大玩家人数等 MineCraft 最为核心的设置。

这份配置文件没有重载命令,必须重启服务器。

spigot 同时还包含一份继承于 bukkit 的配置文件 bukkit.yml 和 spigot 特有配置文件 spigot.yml ,他们指定了一些游戏细节,例如植物生长速度倍率,各种实体的加载距离等。这些设置可以通过 reload 命令重载。


spigot 自身的权限系统非常简单(可以通过插件扩展),玩家只分 OP 和非 OP 两种。OP 拥有对服务器的绝对管理权,可以使用任何 spigot 命令。使用控制台命令快速添加一个 op,例如我们添加 czp 这个玩家为 op (也可以通过修改配置文件来完成,在 ops.json )

op czp

取消 op

deop czp

同时可以禁封玩家

ban czp

以上是禁封对应的玩家 id ,还可以根据 ip 来禁封

ban-ip czp


输入 stop 可以安全关闭服务端。服务端默认五分钟保存一次地图文件,若强行关闭服务端,可能会丢失至多五分钟的地图修改。同时某些插件若被强行关闭,可能产生不可逆损害,因此在任何情况下都要使用 stop 命令来关闭服务端。


使用插件

使用插件非常简单,操作和 bukkit 一致,只需要将插件放入 spigot 工作目录下的 plugins 文件夹即可。

插件可以在 bukkit 开发者论坛获取到,例如我们需要 essential 插件,则访问 https://dev.bukkit.org/projects/essentials

我们还可以在 spigotmc 的网站上获取到开发者发布的插件,例如 https://hub.spigotmc.org/jenkins/job/Spigot-Essentials/

加入插件后重启服务端,就可以正常加载插件。

在服务端控制台中使用

plugins

可以查看当前加载的所有插件列表。

插件可能会自行创立文件夹并记录一些必要数据,通常,插件会在 plugins 文件夹下创立一个以插件名命名的文件夹用以存放自己的文件。插件可能会有自己的配置文件,也会存放在此。

某些插件支持或必须使用 Mysql 等外部程序,在正确配置 Mysql 的基础上,你需要仔细阅读插件的使用说明和插件配置文件中的注释来完成具体设置和对接调试工作。


值得注意的是,有些插件(s)可能会因为同时操作一个游戏中的对象或进行相反的操作等而产生冲突,spigot 会 catch 到所有插件 throw 出的错误并 printStackTrace 到标准输出上。因此出现插件冲突问题时,你将会在服务端控制台看到 java 错误信息。与之类似的,插件自身运行错误或由于错误的配置文件导致运行错误,随之产生的错误,也会被显示到服务端控制台。根据包名和 Exception 中携带的信息可以分析错误产生的原因并解决它。如果是由于插件自身代码缺陷导致的,可以对此插件提交 issue,大部分插件都开放源代码。


使用单机存档地图

MineCraft 服务端的地图存档格式和单机存档格式是一致的,因此可以简单的用单机存档地图文件替换服务端地图文件来使用单机存档的地图。

例如我们需要替换服务端的主世界地图(world),我们的单机存档位于 /home/czp/game/minecraft/.minecraft/saves/新的世界

我们首先清空服务端的 world 文件夹,在单机存档中拷贝以下这些文件夹和文件到服务端 world 文件夹

data/

playerdata/

region/

level.dat

level.dat_old

session.lock

之后我们开启服务端,我们的主世界就被变成了单机存档中的样子(为了防止一边运行服务端一边拷贝存档可能对地图文件产生的不可逆损害,对地图文件进行读写操作时请暂时关闭服务端)。

在单机存档中的 DIM-1 文件夹对应服务端的 world_nether 文件夹,将其中的全部内容拷贝即可替换服务端的地狱。DIM1 对应 world_the_end ,同理。



至此,对于 MineCraft 的基本开服过程你已经掌握了,接下去你需要了解更多的服务端详细配置和各种常用插件和外部程序的配置。在另一个角度上,你可以学习 spigot 插件开发来为你的服务器加入特有的高可玩性内容。

接下去,本系列教程将简单说明 spigot 插件的编写过程。

本文出自 czp的装逼站,转载时请注明出处及相应链接。

0

评论

  1. xuubin Google Chrome 46.0.2490.85 Android 2016-12-23 10:55 回复

    haha  不懂

发表评论

电子邮件地址不会被公开。必填项已用*标注


Ɣ回顶部