简介
欢迎来到《我的世界服务器搭建指南》(MinecraftServerHostGuide)。
本教程面向第一次搭建我的世界Java版服务器的小白服主。
学习完本教程后,你将会掌握基础的我的世界服务器搭建技能。
由于论坛格式限制,无法完美展示效果,我们十分建议您前往 Gitbook 阅读:国内 国外
同时我们也向您提供可离线随时阅读的 PDF 版本: 前往下载 (提取码: 7tb9)
关于
本教程由“《我的世界服务器搭建指南》编写委员会”(下称“本教程编委会”)编写。
本教程主要发布于Github。
本作品采用知识共享 署名-相同方式共享 4.0 国际许可协议进行许可。
本教程中出现的代码均以Apache 2.0 许可协议进行许可。
部分图片资源来自互联网,仅学习交流使用。
部分代码和文献资料若涉及转载或引用, 将会在相关内容处标记,请依照其自身的协议使用。
鸣谢
在本教程编写的过程中得到了一些有关人士的帮助,在此对他们表示最诚挚的感谢!
以下为鸣谢名单(排名不分先后):
ID | 介绍 |
银狼 | 给予一定建议 |
LocusAzzurro | 给予一定建议 |
贺兰星辰 | 给予一定建议 |
XJue_DaDa | 授权参考翻译 |
编写委员会
由衷地感谢本教程编委会各位成员在本教程编写过程中所作出的贡献!
以下为本教程编写委员会成员名单(排名依照其参与贡献的章节顺序排列):
ID | 介绍 |
梦彗業 | 主要编写者 |
Drenal | 主要编写者 |
冰冷 | 主要编写者 |
asougi85 | 主要编写者 |
MIdCoard | 主要编写者 |
弱鸡绿毛怪 | 参与编写 |
tdiant | 参与编写 |
蛋黄酱 | 参与编写 |
Hmm1313133 | 参与编写 |
andylizi | 审阅 |
zzzz | 审阅 |
酷车手BB弹 | 审阅 |
叁只小羽 | 审阅 |
叁只仓鼠 | 审阅 |
耗子 | 审阅 |
星空 | 审阅 |
c7w | 审阅 |
Smokey_Days | 审阅 |
几何 | 主要编写者 |
火雨 | 参与编写 |
Auange_M夜幕 | 参与编写 |
筒子 | 审阅 |
历程
2020.2.8 《我的世界服务器搭建指南》立项。
2020.2.9 建立 Github 库。
提交7个章节,累计已完成7个章节。
2020.2.11 提交3个章节,累计已完成10个章节。
2020.2.12 教程结构大改,删减整合部分章节。
提交2个章节,累计已完成12个章节。
2020.2.13 提交2个章节,累计已完成14个章节。
2020.2.15 提交4个章节,累计已完成18个章节。
2020.2.17 提交2个章节,已完成全部章节。
发布 Alpha 版本,进入第一阶段审阅修订。
2020.2.25 第一阶段审阅修订完成。
发布 Beta 版本,进入第二阶段审阅修订。
2020.3.8 第二阶段审阅修订完成。
发布 1.0.0 版本。
建立 Gitbook 自动构建网页版,同时在 MCBBS 发布。
2020.4.11 第二单元第一节:认识启动脚本 发现严重编写漏洞,回炉重制并提交。
提交历史修复,发布 1.0.1 版本。
2020.7.20 提交历史修复,发布 1.0.2 版本。
2020.8.23 提供了可离线随时查看的 PDF 版教程。
优化 MCBBS 排版布局,统计了教程相关数据。
统计
准备工作
搭建我的世界服务器是一项非常复杂的过程,在正式开始搭建我的世界服务器之前,我们需要做一些准备工作。
自身条件
- 掌握一定程度的汉语,这对阅读本教程极为重要。
- 拥有较强的理解能力,这对阅读本教程极为重要。
- 拥有较强的独立思考能力,这对阅读本教程极为重要。
- 学习什么是搜索引擎,掌握搜索引擎的使用方法。
- 学习什么是提问的智慧。
外部条件
- 一台能够访问互联网的计算机。
- SpigotMC 账号,利于查阅一手资料、购买正版付费插件和获取外网社区帮助。
- MCBBS我的世界中文论坛 账号,利于查阅经本地化后的资料和获取中文社区帮助。
- 一台Windows系统的VPS服务器。
如何购买一台合适的服务器
本教程建议通过可信度较高的第三方交易平台购买我的世界VPS服务器。
如何选择服务器配置
搭建我的世界服务器对VPS服务器的CPU性能、内存大小、硬盘速度和网络质量均有较高的要求。
在这里,我们仅对搭建我的世界服务器需要着重关注的硬件参数作讲解,以下内容中的结论均以此为预设情景。
CPU
CPU(Central Processing Unit),即中央处理器,是一台计算机的核心部件。
选择的 CPU 质量的高低对服务器的性能有着至关重要的影响。
一般的,我们对 CPU 性能的概括有着这样一个简单结论: CPU 单核性能 = IPC * 频率
什么是 IPC ?
IPC(Instruction Per Clock),指 CPU 每一时钟周期内所执行指令的多少。
IPC 代表了一代处理器架构的设计性能,一旦该处理器架构设计完成之后,IPC 值就不会再改变了。
什么是 频率 ?
CPU 的时钟频率,简单说是CPU运算时的工作的频率(1 秒内发生的同步脉冲数)的简称,单位是Hz。
简单的讲,IPC 是 CPU 在每一时钟周期内能够运算的量的大小;频率是 CPU 工作时 1 秒内的时钟周期数。
让我们举个例子:Intel Xeon X5690 与 Intel Core i9-9900k 同样工作于 3.6Ghz 的频率时,很显然地,Intel Core i9-9900k 的运算效果更好。
因此我们可以发现:在这里,IPC 值的高低起到了决定性的作用,而频率似乎不再高于一切。
所以,当选择服务器的 CPU 时不应该单单执着于高频率。
什么是 核心 ?
在这里,CPU 核心一般指线程。
线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
由于主流的我的世界服务端仅能利用单个线程工作,或对多线程利用的效果不够理想, 所以单个核心的频率在一定程度上决定了我的世界服务器的最大负载量。
我们可以简单的将线程理解为流水线,你的VPS服务器有多少核心(线程)就有多少条流水线。一些软件可以同时在多条流水线同时运行,每条流水线只进行总体的一部分运算,对单条流水线的压力较小。而我的世界服务端仅能在一条流水线上运行,即使你有再多的流水线,其他的流水线也只能干看着唯一一条工作的流水线无能为力。所以单条流水线性能高低便决定了我的世界服务端的性能。
一般的,当你搭建是纯净的、不含模组的服务器时,对单核性能的要求较低;当你搭建是含模组的服务器时,对单核性能的要求较高。
同时,无论纯净与模组服务器,单个核心的负载能力都是有限的,如果你的玩家人数较多,我们建议你采用跨服的方式,让玩家分别进入多个子服务端,这样可以令多个线程同时工作,以实现负载均衡。
内存
内存(Memory)是计算机中重要的部件之一,它是外存储器与CPU进行沟通的桥梁。
在这里,我们需要关注服务器所采用的内存的三个参数。
规格
常见的 DDR4 即代表了目前内存的第4代规格。
一般的,内存规格代数越大,性能越好。
频率
内存主频和CPU主频一样,用来表示内存的速度,它代表着该内存所能达到的最高工作频率。内存主频是以MHz为单位来计量的。
常见的 2400 Mhz 即是 DDR4 规格下的一种标准内存频率。
一般的,同等内存规格代数情况下,内存频率越高,性能越好。
容量
内存容量是内存条的关键性参数。内存的容量一般都是2的整次方倍,比如64MB、128MB、256MB等。
一般的,内存容量越大越能同时运行更多的程序、越有利于系统的运行。
硬盘
硬盘是计算机的外存储设备。
一般的,我们使用 IOPS 作为衡量硬盘性能的量测方式。
通常来讲,固态硬盘的 IOPS 比机械硬盘更高,但同容量下,固态硬盘的价格更贵。
在我的世界当中,地图包含了大量的以4KB为规格存储的数据,对于这种数据,固态硬盘的读写速度可以达到机械硬盘的百倍以上。所以我们推荐尽可能选择 IOPS 高的固态硬盘来搭建我的世界服务器。
网络
众所周知,我国有三大基础电信业务运营商:中国电信、中国移动和中国联通。 但实际生活中,存在的宽带运营商不止三家。每家运营商所经营的宽带线路质量有所不同。
一般情况下,我们认为我国有四大网络线路:电信、联通、移动和教育网。
通常情况下,只有Google、Amazon和阿里云等大型企业提供的公有云产品所采用的线路质量较高。
对于搭建我的世界服务器来讲,只需接入三线(电信、联通和移动)即可满足绝大部分的需求。
但同时接入三条网络线路即意味着需要同时向三家务运营商购买其运营的网络线路。
一般的,在同等质量、速率的情况下,接入的线路条数越多,价格越高。
BGP
BGP 即边界网关协议,是运行于 TCP 上的一种自治系统的路由协议。
当我们同时接入三条运营商的网络线路时,我们会分别得到三家务运营商的网络地址。当购买了一个运营商宽带的玩家访问了另一个运营商的网络地址时,则需要通过该玩家的运营商出口到另一个运营商的网络拓扑当中,这个过程会增加网络延迟。例如,电信宽带的玩家通过联通的IP地址进入服务器,延迟就比通过电信的IP地址进入服务器要高。
因此,我们可以简单地将 BGP 理解为可以融合三家运营商线路的技术,购买了不同运营商宽带的玩家只需要通过同一个网络地址访问服务器,都可以获得最低的网络延迟。
一般的,在同等质量、速率的情况下,使用 BGP 技术的网络价格比不使用的更高。
连接到服务器远程桌面
在这里,我们假设你已经购买到了一台 Windows 系统的 VPS 服务器。
你将会从服务器提供商处获得一份大致相同的服务器连接信息,例如:
- ExampleCloud Ex云计算 后台信息
- 套餐:Ex 开通日期:1970.01.01
- ========================
- 【远程桌面连接地址】
- BGP多线:ex.example.com:61389
- =========================
- 【系统信息】
- 系统:WindowsServer 2012R2
- 用户名:Administrator
- 密码:Example!.
- 为了保障您后台的数据安全,减少被别有用心之人利用的可能性,我们建议您更高更高强度的系统密码,以免造成不必要的损失。
- =========================
- 【游戏连接地址】
- BGP多线:ex.example.com:端口
- 开放端口:61390-61398 九个端口内外对应
- =========================
- 请牢记您的VPS的编号:EX-01
- 若遇到无法解决的问题或是技术服务的话
- 请提供VPS编号,这样我们方便识别您的VPS信息
- ========================
- 感谢您选择我们,您的支持使我们继续发展下去的动力
Windows 系统
在键盘上找到 “Windows 键“ ,同时按下 “Windows 键” + “R 键”。
会弹出 “运行” 界面,在输入框中输入半角英文字符 “mstsc” ,即可弹出 “远程桌面连接” 界面。
在 “远程桌面连接” 界面当中的 “计算机:”后的输入框中输入刚刚得到的服务器连接信息中的 “远程桌面连接地址”。 点击连接,根据提示输入入刚刚得到的服务器连接信息中的 “用户名” 和 “密码” ,即可连接到服务器远程桌面。
MacOS 系统
在 Mac 应用商店安装 Microsoft Remote Desktop 8。
根据软件指引,连接服务器远程桌面。
注意:若按照上述顺序操作过程中,出现任何错误,请利用自身条件中第4条的能力排查错误原因,排除错误。 若仍然无法排除错误,请向你的服务器提供商求助。
安装运行环境
我们假设你已按照之前部分的说明成功进入了服务器远程桌面,那么你会看到一张熟悉的 Windows 系统桌面。
这时,我们需要在服务器上安装以下软件:
Java(推荐小白选择) 或 Java SE Development Kit 8 任选其一
VisualStudio Code 或 Sublime Text 或 EditPlus 任选其一
7Zip 或 BandiZip 任选其一
Chrome 或 FireFox 任选其一
注意:若安装上述软件出现问题,请查阅该软件的帮助文档,或通过该软件官方求助渠道取得帮助。
注意:如需将自己电脑上的东西上传到服务器上,只需要先连接上远程桌面,再在自己电脑上复制你需要的文件,最后在服务器上右键粘贴即可!
完成
此时,你便已经完成了搭建我的世界服务器所必要的全部准备。
第一节 第一次的开服
1.选择一个合适的服务端核心
目前的服务端核心大概有这样几种:
核心名称 | 描述 | 指路 |
官方服务端 | 无法添加插件,安装forge后可以添加mod | https://www.minecraft.net/ |
Bukkit/CraftBukkit | 似乎是笔者印象中最为原始的插件服务端,并不支持添加MOD,但可以添加Bukkit插件 | https://www.getbukkit.org/ |
Spigot | Spigot对Bukkit进行了优化,不支持添加mod,但支持添加Bukkit插件 | https://hub.spigotmc.org/jenkins/job/BuildTools/ |
Paper | Paper对Spigot进行了优化,不支持添加mod,但支持添加Bukkit插件 | https://papermc.io/ |
MCPC+/Cauldron | 可以安装Mod及Bukkit插件,但性能令人捉鸡。最高支持版本1.7.10 | https://sourceforge.net/projects/cauldron-unofficial/files/old_releases/version_1/ |
KCauldron | 可以安装Mod及Bukkit插件,但最高支持版本仅到1.7.10 | https://sourceforge.net/projects/kcauldron/ |
Thermos | KC的优化版本,最高支持版本1.7.10 | https://cyberdynecc.github.io/Thermos/install |
Uranium | KC的优化版本,最高支持版本1.7.10 | https://www.uraniummc.cc/ |
Catserver | 国人开发的1.12.2Mod+Bukkit插件服务端 | https://www.mcbbs.net/thread-840599-1-1.html |
Sponge Forge | 拥有自己的插件体系,在1.8及以上版本能做到Mod与Sponge插件的共同使用 | https://www.spongepowered.org/ |
Sponge Vanilla | 支持Sponge插件但不支持Mod的轻型核心 | https://www.spongepowered.org/ |
Glowstone | 一个完全开源的服务端,支持Bukkit插件。版本为1.12.2,中文介绍 https://www.mcbbs.net/thread-926208-1-1.html | https://www.glowstone.net/ |
您也可以通过以下网站快速便捷地找出您所需要的服务端核心
2.添加启动脚本并运行
- 这里我们选用 Paper 1.12.2 进行演示。
- 下载地址:https://papermc.io/
首先在我们的服务器上新建一个文件夹,建议纯英文路径。
将下载好的paper.jar扔进去。
在文件夹内创建一个 start.bat,使用 记事本 或 Notepad++ 打开。
输入最基本的启动脚本参数:
- @ECHO OFF
- java -Xmx1G -Xms1G -jar paper.jar
- pause
保存并运行。
找到文件夹中的 eula.txt 文件,将其中的 eula=false 改为 eula=true ;
重新启动 start.bat ;
我们发现服务器现在已经可以成功启动了。
在终端窗口中输入 stop 停止运行。
在根目录中找到server.properties文件。
我们可以根据情况修改几个重要内容。
3.对服务器进行一些配置
- 在高级安全 Windows 防火墙开放刚刚在server.properties中填写的端口(也可以选择直接关闭高级安全 Windows 防火墙,但有安全隐患,不推荐。)
打开服务器管理器。
找到工具->高级安全 Windows 防火墙->入站规则。
新建规则,选择端口。
下一步。
TCP,特定本地端口,输入你想要开放的端口。
下一步。
允许连接。
下一步怼到底。
至此,您应该能通过您服务器的 「IP地址:端口」 来连接您的服务器了。
P.S. 如果您使用的一些大型企业的公有云服务商(如阿里云)要求通过服务商自己的管理系统开放端口,那么仅仅是在入站规则中添加是不够的,这时您需要了解一下您服务商的具体情况。
4.一些建议
您当然可以选择通过他人整理好的整合包进行开服,但是笔者并不建议这种做法。因为自己从头到尾整合的服务端才是自己最了解的服务端,在自己整合的过程中看着自己的 plugins 和 mods 文件夹慢慢丰富起来,配置文件中的每一条配置自己都无比熟悉,没有什么比这感觉更好了(我自己是这样想的)。
第二节 服务端的结构
前言
- 根据上节的内容,您应该已经可以成功启动您的服务器了。本节内容将继续带您简单了解服务端的结构。
- 由于 Sponge 服务端不太适合新手使用,故不做介绍,如有需要请自行查看官方教程(含中文)。
服务端结构概览
- 以下是两种基于 Bukkit 核心的服务端。
我们先来简单看一眼 Paper 的文件夹结构:
- Paper
- ├─cache //缓存文件夹
- ├─logs //存放服务端日志的文件夹
- ├─plugins //存放插件的文件夹
- │ └─bStats //一些插件生成的文件夹,一般情况下存放着插件的配置文件
- ├─world //世界文件夹
- │ ├─data //世界数据文件夹
- │ │ ├─advancements
- │ │ └─functions
- │ ├─playerdata //存放了玩家数据
- │ └─region
- ├─world_nether //地狱世界文件夹
- │ ├─data
- │ │ └─functions
- │ ├─DIM-1
- │ │ └─region
- │ └─playerdata
- └─world_the_end //末地世界文件夹
- ├─data
- │ └─functions
- ├─DIM1
- │ └─region
- └─playerdata
以及 Catserver 的文件夹结构:
- Catserver
- ├─config //模组的一些设置
- ├─libraries //一些支持库
- ├─logs //存放服务端日志的文件夹
- ├─mods //存放模组的文件夹
- ├─plugins //存放插件的文件夹
- │ └─bStats //存放插件配置的一些文件夹
- └─world //世界文件夹
- ├─data //世界数据文件夹
- │ ├─advancements
- │ └─functions
- ├─DIM-1 //世界里的世界#滑稽
- │ ├─data
- │ │ └─functions
- │ ├─playerdata
- │ └─region
- ├─DIM1
- │ ├─data
- │ │ └─functions
- │ ├─playerdata
- │ └─region
- ├─playerdata //玩家数据文件夹
- └─region
根目录下的一些文件
- banned-ips.json
存放了被 ban IP 玩家的 UUID 及游戏名称等相关信息。
- banned-players.json
存放了被 ban ID 玩家的 UUID 及游戏名称等相关信息。
- bukkit.yml
由 Bukkit 派生得到的服务端都有的文件。保存着 Bukkit 所提供的最基本的设置选项。
- commands.yml
它提供了一种快速而简单的方法来强制服务器使用Mojang提供的命令(而不是Bukkit中内置的命令)而不产生冲突。
- eula.txt
在首次开服的时候,我们需要同意 EULA 协议。
- help.yml
一些插件的帮助信息会出现在这里面,一般不需要进行什么修改。
- ops.json
op们的游戏昵称 UUID 等信息会在这里出现。
- paper.jar
这个叫什么名字无所谓,重要的是他的本质工作就是安安稳稳地当一个服务端核心。
- paper.yml
这是 Paper 才有的配置文件,您一般不会在 Bukkit 或 Spigot 中看到它。
- permissions.yml
是默认的权限定义YAML文件,在启动时自动生成。它的主要功能是将权限节点组合到一个文件中,以便权限插件(以及使用权限的插件)可以在整个系统中使用它。
服务端的一些基本设置就在里面,如设置端口,设置游戏难度,设置游戏模式(生存、创造等)等。
- spigot.yml
这是 Spigot 才有的配置文件,您一般不会在 Bukkit 中看到它。因为 Paper 是由 Spigot 派生而来的服务端,所以在 Paper 的服务端中,它也会出现。
- usercache.json
储存着用户部分信息的缓存文件。
- version_history
一些 Minecraft 和服务端核心的版本信息。
- whitelist.json
白名单列表。(如果您在server.properties中开启了白名单,您就可以在该文件中添加和管理谁被允许或不被允许进入服务器。)
至此,大部分的以 Bukkit 为基础的服务器核心服务端的结构已经大致呈现在您眼前。
第三节 什么是插件?
插件(Plugin)是遵循 Bukkit 或 Sponge 接口规范编写的 Java 程序。
插件只能运行在支持 BukkitAPI 或SpongeAPI 的服务端下,一般无法独立运行。因为插件需要调用的服务端的函数和数据。
但也有例外,例如 MyPet 插件单独打开后是可视化宠物编辑器。
插件可以拓展服务端的功能,增强游戏性,给玩家更好的游戏体验。
选取优秀插件,形成完美配合,可以让服务器在众多对手中脱颖而出。
插件类型
插件没有原理上的隔阂,只有功能上的区别,可以根据用途大致分为以下几种类型:
类型 | 描述 | 样例 |
管理 | 提高服务器的可管理性和管理效率 | SkyPerms、LuckPerms |
安全 | 维护服务器稳定,阻绝外挂等非法行为 | NoCheatPlus |
聊天 | 提供多样化的聊天功能 | PrefixManager |
开发 | 作为开发库帮助其他开发者编写插件 | Vault、ProtocolLib |
经济 | 通过货币、市场机制,促进物品流通,玩家交流 | Vault、iConomy |
创世1 | 提供更高效的地图修改与维护功能 | WorldEdit |
创世2 | 修改世界生成机制,创造不同于原版的世界 | PlotSquard |
修复 | 修复服务端或者其他插件的一些特性 | chestfix |
娱乐 | 让玩家从插件中发现趣味 | Fart、Bed War |
综合 | 拥有不同层面多样化功能的插件 | Essential |
信息 | 可以收集服务器信息、帮助服主或玩家更好地获取信息的插件 | CoreProtect |
机制 | 增加游戏机制,改善玩家体验,改善游戏耐玩性 | Citizens |
网页 | 增加网页端内容 | WebBan |
RPG | 给Minecarft添加角色扮演类游戏要素 | DungeonsXL、MyHero |
传送 | 加入多样化的传送功能 | RandomTeleport |
其他 | 无法用以上要素概括的其他类型插件 | Trash |
插件的安装与卸载
安装插件前,请先确定您的服务端版本。一些服务端支持Bukkit插件,而另一些支持Sponge插件。关于服务端和支持插件的对应关系,我们已经在第一单元第一节进行过详细介绍。 在下载插件前,请留意插件所适用的服务器版本,以免安装不兼容的插件,引起报错。
Bukkit插件
安装
- 我们已经在第一单元第二节了解到,Bukkit插件安装在位于根目录的 plugins 文件夹中。
- ① 插件的后缀名为 .jar,如果后缀正确,请直接将插件放到 plugins 目录里,然后启动游戏。 ② 如遇到后缀不正确的插件,请先确认是否为压缩文件,然后用压缩软件将其解压到 plugins 文件夹里面。
- 运行服务器
卸载
- 保存地图后,关闭服务器
- 将 plugins 文件夹内的插件删除
- 如果想连同插件数据一起删除,请删除 /plugins/插件名 文件夹。
配置文件
Bukkit插件的配置文件被保存在 /plugins/插件名 文件夹中。
Sponge插件
安装
- 默认情况下,Sponge插件安装在位于根目录的 mods 文件夹中。但Sponge提供了其他更多的可选插件位置,详情可以阅读Sponge官方中文文档
- 请直接将插件放到 mods 目录里,然后启动游戏。
- 运行服务器
卸载
- 关闭服务器
- 将 mods 文件夹内的插件删除
配置文件
默认情况下,Sponge插件的配置文件被保存在根目录的 config 文件夹中,但实际情况有时并非如此。必要时请查阅对应插件的文档来获得帮助。
配置文件的编辑
配置文件没有固定的文件名,但是Bukkit插件配置文件一般为YAML格式的文本文档,后缀名为 .yml 。Sponge插件配置文件一般为HOCON或YAML格式的文本文档,后缀名为.conf
配置文件需要用准备工作中已经安装好的NotePad++进行修改,以免出现各种问题。
关于如何编辑YAML文件,我们将在第二单元第二节进行更细致的讲解。
关于如何编辑HOCON文件,请查阅Sponge官方中文文档中的Hocon简介。
第四节 什么是模组?
模组(Mod)是遵循 Forge、Fabric 或 LiteLoader 接口规范编写的java程序。
模组可以为您的服务器添加物品、方块、生物等新内容,改变原版 Minecraft 的游戏机制,也可以改善画面,优化性能。海量的模组资源极大地增加了 Minecraft 的生命力。
在服务器中安装模组可以提高服务器的可玩性,但模组本身会降低服务器性能,占用内存,请服主权衡利弊。
模组类型
模组可以大致分为以下几种性质,一个模组往往会同时拥有多种性质。
性质 | 描述 | 样例 |
创世 | 增加新的生态环境,生物,矿石,方块,建筑乃至新世界 | 星系 |
科技 | 增加近现代科技元素,如锅炉机器、交通、能源、农学、基因学等 | 工业2 |
魔法 | 增加玄学游戏元素 | 神秘时代4 |
仓储 | 增加新的储存容器,提高物品储存能力 | 储存抽屉 |
工匠 | 增加新的工具、盔甲、武器 | 更多武器 |
美食 | 增加食材与菜谱 | 丰收工艺 |
红石 | 改良红石电路,增加电路元件 | 红石力量2 |
前置 | 作为其他模组的前置库,简化模组开发难度 | ValkyrieLib |
RPG | 增加角色扮演或冒险类游戏元素 | 暮色森林 |
信息 | 增加玩家可以获取的信息,例如查询合成表,小地图,血条等 | Hwyla |
改良 | 它的目的就是提供更人性化的游戏体验!例如增加美观的家具和装饰物,死亡不掉落,信息获取,屏蔽弹窗,诸如此类都可以纳入其中 | 家具 |
优化 | 优化内存和帧数 | FoamFix |
模组的安装与卸载
本小节着重讲述 Forge 模组。关于 Fabric 与 LiteLoaer 模组的安装请查阅其他资料。
在阅读这一小节前,请仔细阅读第一单元第一节中有关服务器核心的内容,检查您的服务器是否支持 Mod 。
接着,请在MCBBS寻找模组时,特别关注简介部分的<u>与多人游戏兼容性</u>一项。
一般来说, SSP 模组不需要在服务端安装,而 SSP/SMP 模组需要在服务端和客户端一起安装。
最后,请留意模组所适用的 Minecraft 版本号,以免安装不兼容的模组。
安装
- 我们已经在第一单元第二节了解到,模组安装在位于根目录的 mods 文件夹中。
- 确认模组的后缀名为 .jar,然后直接将模组放到 mods 文件夹中
- 运行服务器
卸载
卸载会导致服务器中该模组所有的物品、方块、生物全部消失,请谨慎处理。
- 确保数据已经保存完毕的情况下,关闭服务器
- 将 mods 文件夹内的模组删除
- 启动服务器
- 服务器会输出一串错误,随后停顿。这时请输入 /fml confirm (请注意必须连斜杠/一起输入)
- 服务器正常运行
第五节 什么是世界?
服务端的世界文件都存储在了根目录的对应文件夹下。
Minecraft 原版目前有三个世界,分别是主世界world,地狱DIM-1,末地DIM1。这些世界的文件对应的保存在了服务端根目录的world、world_nether与world_the_end文件夹中。
每个世界的方块都按照X和Z每16*16为一个单位,被分成了一个一个的区块。服务器的世界是按照区块为单位储存并读取使用的。
在这里以主世界为例,说明世界是怎样保存的。 打开服务端根目录的world文件夹:
- advancements文件夹: 储存着玩家的成就数据,每个玩家对应一个文件,老版本中文件名是玩家名,新版本按照UUID储存。
- playerdata文件夹: 储存着玩家的数据信息,例如血量、经验值等数据。
- poi文件夹: 存储世界内与村民有关的数据。(1.14+)
- region文件夹: 储存区块信息。
- stats文件夹: 储存玩家在此世界游玩时的统计信息。
- level.dat文件: 储存该世界的全局的主干信息。
- data文件夹: 其中的villages.dat文件储存的是村民的数据信息, idcounts.dat和map_<XXX>.dat储存的是玩家合成的地图有关的数据.
其他世界的文件夹大同小异。
如何使用多世界插件
在这里我们以常见的 Multiverse-Core 插件为例:
指令
这里简单的列举几个常见指令:
命令 | 说明 |
/mv list | 列出服务器内所有的世界 |
/mv reload | 重新加载配置文件 |
/mv info [世界名] [页码] | 列出这个世界的所有信息 |
/mv create [世界名] [环境类型] | 创建世界 |
/mv clone [复制出的世界名] [被复制的世界名] | 克隆一个世界 |
/mv import [世界名] [环境类型] | 导入一个世界 |
/mv unload [世界名] | 卸载某一世界 * |
/mv load [世界名] | 加载某一世界 * |
/mv remove [世界名] | 移除某一世界 * |
/mv delete [世界名] | 彻底删除某一世界 |
/mv regen [世界名] | 重新生成某一世界(清空并重新生成) |
/mv setspawn | 设置出生点 |
/mv tp [玩家名] [世界名] | 将该玩家传送至某一世界 |
/mv who [世界名] | 查看某一世界都有哪些玩家 |
注: 卸载指的是不删除该世界的数据文件,仅仅把该世界从内存上移除。
注2: 如果加载的是服务器原来没有的世界,加载某一世界前需要导入该世界(import)。
注3: 移除指的是世界的数据文件保留,但是在多世界插件的配置信息中将会删除该世界。被移除的世界必须通过导入才能重新被服务器加载。
配置
关于如何编辑这类.yml格式的配置文件,我们将在第二单元第二节进行更细致的讲解。
config.yml MultiverseCore 插件全局配置
- multiverse-configuration:
- ==: com.onarandombox.MultiverseCore.MultiverseCoreConfiguration
- enforceaccess: true
- # 显示聊天世界前缀
- prefixchat: true
- # 设置聊天世界前缀 %world%代表世界名, %chat%代表玩家聊天内容
- prefixchatformat: '[%world%]%chat%'
- # 是否开启异步聊天(不建议修改)
- useasyncchat: true
- teleportintercept: true
- # 是否锁定出生世界
- firstspawnoverride: true
- displaypermerrors: true
- globaldebug: 0
- silentstart: true
- # 消息冷却时间
- messagecooldown: 5000
- # 这!个!不!要!改!
- version: 2.6
- # 默认的玩家出生世界
- firstspawnworld: world
- # 玩家传送的冷却时间(毫秒)
- teleportcooldown: 1000
- defaultportalsearch: false
- portalsearchradius: 128
worlds.yml 单一世界配置
- world:
- ==: MVWorld
- hidden: false
- # 该世界的前缀
- alias: ''
- # 前缀的颜色 (可以设置的值: AQUA, BLACK, BLUE, DARKAQUA, DARKBLUE, DARKGRAY, DARKGREEN,DARKPURPLE, DARKRED, GOLD, GRAY, GREEN, LIGHTPURPLE, RED, YELLOW, WHITE)
- color: WHITE
- # 样式 (可以设置的值: NORMAL 正常, BOLD 加粗, STRIKETHROUGH 删除线, UNDERLINE 下划线 , ITALIC 斜体)
- style: NORMAL
- # 是否允许PVP
- pvp: false
- scale: 1.0
- # 在该世界死亡后指定复活世界(会复活在这个世界的出生点, 留空代表在本世界出生点复活)
- respawnWorld: ''
- # 是否允许天气变化
- allowWeather: true
- # 地图难度 (可以设置的值: PEACEFUL 和平, EASY 简单, NORMAL 中等, HARD 难)
- difficulty: PEACEFUL
- spawning:
- ==: MVSpawnSettings
- animals:
- ==: MVSpawnSubSettings
- # 是否允许生成动物
- spawn: true
- # 生成动物的速率
- spawnrate: -1
- exceptions: []
- #以下同理, 是设置怪物
- monsters:
- ==: MVSpawnSubSettings
- spawn: true
- spawnrate: -1
- exceptions: []
- entryfee:
- ==: MVEntryFee
- # 进入该世界需要支付的金额
- amount: 0.0
- # 货币种类(就是物品ID, -1代表从经济插件扣钱)
- currency: -1
- hunger: true
- autoHeal: true
- adjustSpawn: true
- portalForm: ALL
- # 玩家默认游戏模式
- gameMode: SURVIVAL
- keepSpawnInMemory: false
- spawnLocation:
- ==: MVSpawnLocation
- x: -221.0
- y: 63.0
- z: 219.0
- yaw: 0.0
- autoLoad: true
- bedRespawn: false
- worldBlacklist: []
- # 世界类型(可以设置的值: NETHER, END, NORMAL)
- environment: NORMAL
- # 种子
- seed: '4337274906620320171'
- generator: 'null'
- playerLimit: -1
- # 是否默认允许飞行
- allowFlight: false
权限
这里简单的列举几个 Multiverse-Core 插件常见的权限:
权限 | 解释 |
multiverse.help | 输入/mv获得帮助信息 |
multiverse.access.name | 玩家进入世界 |
multiverse.exempt.name | 玩家免费进入世界 |
mv.bypass.gamemode.name | 玩家的游戏模式不改变地进入世界 |
multiverse.teleport.self.name | 玩家传送自己到另一个世界 |
multiverse.teleport.other.name | 玩家带着其他玩家一起传送到另一个世界 |
multiverse.core.create | 玩家创建世界 |
multiverse.core.import | 玩家导入世界 |
multiverse.core.modify | 玩家修改世界 |
multiverse.core.modify.add | 玩家使用修改世界中添加功能 |
multiverse.core.modify.clear | 玩家使用修改世界中清除功能 |
multiverse.core.modify.modify | 玩家使用修改世界中修改功能 |
multiverse.core.modify.remove | 玩家使用修改世界中删除功能 |
multiverse.core.modify.set | 玩家使用修改世界中设置功能 |
multiverse.core.reload | 重新加载配置文件指令 |
multiverse.core.delete | 删除世界 |
multiverse.core.unload | 卸载世界 |
导入地图
先把地图文件夹放在服务器的根目录下,在后台输入
- /mv import [地图名(跟文件夹名相同)] normal
地图即导入完毕. OP可以输入指令进入该世界:
- /mv tp [地图名]
什么是日志?
服务器日志(server log)是一个或多个由服务器自动创建和维护的日志文件,其中包含其所执行活动的列表。
服务器日志的典型例子是网页服务器的日志,其中包含页面请求的历史记录。W3C维护有一个网页服务器日志文件的标准格式——通用日志格式,但亦有其他专有格式存在。近年来的日志文件通常将内容附加到文件的结尾。添加的信息有关请求,包括客户端IP地址、请求日期/时间、请求的网页、HTTP代码、提供的字节数、用户代理、引用地址等。这些数据可能写入在一个文件中,也可能分隔成不同的日志,如访问日志、错误日志、引荐者日志等。但是,服务器日志通常不会收集特定用户的信息。
———中文Wiki百科
志,記誌也。
———《说文解字》
日志,相当于服务器的日记,事无巨细地写下服务器的一切信息,并按照等级予以分类。
查看日志的方法
- 开服后,后台输出的全部信息,就是这一次开服的日志。你可以用滚轮上下翻阅。
- 时间太久的日志,在后台可能无法全部显示。这时请打开服务器下的logs文件夹,就可以看到以时间命名的 gz压缩文件 。用压缩软件解压对应时间的压缩文件即可进行阅读。
注意:服务器最新的日志被记录在logs/latest.log文件中,还没有被压缩。
日志的组成部分
两种不同形式的日志
第一种,最左侧为日志输出时间,斜杠左侧是输出该日志的线程,一般为服务器主线程,即 Server thread,右侧为该日志的级别,最右侧为日志具体内容。
当某条日志不是由主线程输出的时候,服务器很有可能出现了一些问题,请仔 细阅读这些日志。
- [16:36:38] [Server thread/INFO]: Starting Minecraft server on localhost:25565
- [16:36:38] [Server thread/INFO]: Using default channel type
- [16:36:40] [Server thread/ERROR]: Could not load 'plugins\VIP_1.0.0.jar' in folder 'plugins'
第二种,最左侧为时间,右侧为该日志的级别,分级如上,最右侧为日志具体内容。
- [17:36:48 INFO]: Starting Minecraft server on localhost:25565
- [17:36:48 ERROR]: Error occurred while enabling Citizens v2.0.16-SNAPSHOT (build 1267) (Is it up to date?)
输出时间
日志发出时的系统时间
日志级别
服务器的日志级别
级别 | 程度 | 具体内容 |
INFO | 一般信息 | 聊天内容/玩家状态/玩家指令/插件信息/…… |
WARN | 警告信息 | 对于一些潜在的风险进行警告,有可能发展为报错 |
ERROR | 报错信息 | 服务器出现错误后输出的信息 |
线程
正常情况下,日志信息都由服务器主线程输出。当其他线程输出信息的时候,一般有以下两种情况。
- 部分插件利用多线程优化自身,例如一些插件把更新模块放到独立的线程中。
- 主线程卡顿时间过长,检测线程关闭服务器并保存地图和玩家信息。
具体内容
- 一般信息 ( INFO )
- 聊天信息 : 包括普通聊天,/say , /me 以及私聊内容
- 玩家状态 : 玩家出入游戏、死亡以及其他状态的变化
- 玩家指令 : 玩家输入的每一个指令都会被记录
- 插件信息 : 许多插件都会在后台输出有一定意义的信息
- 服务器信息 : 初始化服务端、读取配置、载入世界、启用插件等操作
- 警告信息 ( WARN )
插件版本有不兼容风险、配置文件或数据出现问题,暂时可控,可能发展为报错,例如:
- [16:11:01] [Server thread/WARN]: [QuickShop] +=========================================
- [16:11:01] [Server thread/WARN]: [QuickShop] | 警告: 启动虚拟物品失败 使用原版悬浮物品...
- [16:11:01] [Server thread/WARN]: [QuickShop] +=========================================
- 报错信息 ( ERROR )
报错是服务器运行中所遇到的异常情况,它可以来源于服务端本身,也可以来自插件和模组等组件。
这些情况有可能破坏服务器的正常运行,导致玩家体验恶化,信息损坏,甚至服务器崩溃。
关于这类信息的解决方案,我们将在第二单元第六节进行更细致的讲解。
第一节 认识启动脚本
搭建我的世界服务器离不开Java启动脚本
注:本文所有启动参数经JDK-11.0.6 x64与JDK-1.8.0_241 x64测试。
启动脚本主要部分就是JAVA的参数设置
在开服的过程中必须使用64位的JDK或JRE,这里建议使用64位JDK
如果使用32位的JAVA会受到系统的限制,最大只能设置2GB内存
什么是参数
在这里我直接使用一张图片来说明什么是参数
图中的黄色标注的部分就是java的参数部分
启动参数
- @ECHO OFF
- java -jar spigot-1.8.8-R0.1-SNAPSHOT-latest.jar
- pause
这就是一段最基础的启动脚本,我们会以这个为基础进行修改与优化
启动参数主要分为3类:
- 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
- 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
- 非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
下面就从最基础和的几个参数入手,了解它们的作用与使用
参数 | 说明 |
-jar | 执行jar文件 |
-client | 设置jvm使用client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高 |
-server | 设置jvm使用server模式,特点是启动速度比较慢,但运行时性能和内存管理效率高,适用于生产环境。在64位的jdk环境下将默认启用该模式 |
例:上面的"-jar"就属于标准参数
众所周知,Minecraft Server的核心主要部分是一个Jar包,所以我们需要使用-jar来指定jar包来运行它,我们-jar参数应写在其他参数的后方
64位的JAVA默认都会使用Server模式启动,所以这个设置可以不用写
如果想查看其他的标准参数可以在CMD或者PowerShell中输入java来查看
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html
内存设置
参数 | 说明 |
-Xmx[size] | 设置最大内存大小,默认为物理内存的1/4或者1G,需大于2M,可以指定单位k(K),m(M),g(G) 下同 |
-Xms[size] | 设置初始化内存大小(可以理解为最小内存大小),默认为物理内存的1/64,需大于1M |
-Xincgc | 开启增量GC[垃圾收集(Garbage Collection)通常被称为 “GC”];这有助于减少长时间GC时应用程序出现的停顿。但可能会降低CPU对应用的处理能力。 |
这样我们的启动参数就变成了(请根据自己的实际情况进行修改)
- @ECHO OFF
- java -server -Xincgc -Xmx8g -Xms4g -Xincgc -jar spigot.jar
- pause
-server可写可不写
如果开的是Mod服(Bukkit+Forge 或 Sponge)建议将-Xms与-Xmx的大小设置相同
内存回收配置
我们这里使用的内存回收器为G1 (Garbage First),所以我们要在启动参数中加上-XX:+UseG1GC,这样我们就能使用该回收器了
光设置使用该回收器也不行,还要对他进行一些配置,下面就会对配置参数进行讲解,你并不需要完全了解下面参数的意义与说明,可以跟着我的推荐值进行设置
-XX:SurvivorRatio=6这个参数设置的是Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
原文:
Survivor Ratio Sizing
The SurvivorRatio parameter controls the size of the two survivor spaces. For example,-XX:SurvivorRatio=6sets the ratio between each survivor space and eden to be 1:6, each survivor space will be one eighth of the young generation. The default for Solaris is 32. If survivor spaces are too small, copying collection overflows directly into the old generation. If survivor spaces are too large, they will be empty. At each GC, the JVM determines the number of times an object can be copied before it is tenured, called the tenure threshold. This threshold is chosen to keep the survivor space half full.
Use the option -XX:+PrintTenuringDistribution to show the threshold and ages of the objects in the new generation. It is useful for observing the lifetime distribution of an application.
-XX:G1ReservePercent=15G1会预留一部分内存,制造一个假天花板,防止晋升失败(to-space)的情况,默认值是10
-XX:ParallelGCThreads=4表示JVM在进行并行GC的时候,用于GC的线程数
-XX:ConcGCThreads=1与Java应用一起执行的GC线程数量。默认是Java线程的1/4。减少这个参数的数值可能会提升并行回收的效率,不过如果这个数值过低,也会导致并行回收机制耗时加长
-XX:InitiatingHeapOccupancyPercent=40内存占用达到整个堆百分之多少的时候触发GC
下面是G1 GC的所有的开关选项的列表
选项和默认值 | 描述 |
-XX:+UseG1GC | 使用G1 GC |
-XX:MaxGCPauseMillis=n | 设置一个暂停时间期望目标,这是一个软目标,JVM会近可能的保证这个目标 |
-XX:InitiatingHeapOccupancyPercent=n | 内存占用达到整个堆百分之多少的时候开启一个GC周期,G1 GC会根据整个栈的占用,而不是某个代的占用情况去触发一个并发GC周期,0表示一直在GC,默认值是45 |
-XX:NewRatio=n | 年轻代和老年代大小的比例,默认是2 |
-XX:SurvivorRatio=n | eden和survivor区域空间大小的比例,默认是8 |
-XX:MaxTenuringThreshold=n | 晋升的阈值,默认是15(译者注:一个存活对象经历多少次GC周期之后晋升到老年代) |
-XX:ParallelGCThreads=n | GC在并行处理阶段试验多少个线程,默认值和平台有关。(译者注:和程序一起跑的时候,使用多少个线程) |
-XX:ConcGCThreads=n | 并发收集的时候使用多少个线程,默认值和平台有关。(译者注:stop-the-world的时候,并发处理的时候使用多少个线程) |
-XX:G1ReservePercent=n | 预留多少内存,防止晋升失败的情况,默认值是10 |
-XX:G1HeapRegionSize=n | G1 GC的堆内存会分割成均匀大小的区域,这个值设置每个划分区域的大小,这个值的默认值是根据堆的大小决定的。最小值是1Mb,最大值是32Mb |
行为参数
我们这里用到的有这两个参数
参数 | 说明 |
-XX:+AggressiveOpts | 加快编译 |
-XX:+UseFastAccessorMethods | 原始类型的快速优化 |
配置好的启动参数
不要忘记改最后的“核心名.jar! 不要忘记改最后的“核心名.jar! 不要忘记改最后的“核心名.jar!
重要的事情说三遍xd
纯净服 推荐脚本
- @ECHO OFF
- java -server -Xms4g -Xmx8g -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -jar 核心名.jar
- pause
MOD服 建议使用下面的脚本,将-Xms与-Xmx的大小设置相同
- @ECHO OFF
- java -server -Xms8g -Xmx8g -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -jar 核心名.jar
- pause
如何让你的服务器在stop之后自动开服呢?
- 只需要在脚本中在 java -server …… 的上一行加一个 :开头的标签例如:start
- 在java后加cls清屏(可加可不加)
- 最后goto 刚才设置的标签例如
最后脚本如下:
- @ECHO OFF
- :start
- java -server -Xms4g -Xmx8g -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:+UseG1GC -XX:SurvivorRatio=6 -XX:G1ReservePercent=15 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=40 -jar 核心名.jar
- cls
- goto start
第二节 认识YAML语法
本节部分内容引用自 tdiant 编写的 BukkitDevelopmentNote 。
在配置文件中,服主可以设置插件/模组的功能。
同时,插件/模组的开发者有时也会把数据存储在配置文件中。
本文以 Essentials 插件举例。
我如何找到配置文件?
通常,配置文件与插件生成在一起(部分小型插件没有配置文件)你可以在/plugins/插件名/中找到它们。 譬如 Essentials 的配置文件就在/plugins/Essentials/中。
什么是配置文件?
一些简单的插件不带有配置文件。当插件加载失败时(如版本不对),也不会生成配置文件。
譬如你打开文件夹/plugins/Essentials/后,看到了一堆文件。
这些文件中,只有结尾是.yml的文件,才是我们讨论的配置文件。
其他的不是由.yml结尾的文件,因插件而异,那些文件就不在今天讨论范围内了,如有需要请查阅插件官方文档。
我该如何打开 .yml 这样的配置文件?
我们在开始前所做的准备工作中,安装了 Notepad++ 软件。
现在让我们右键.yml文件,单击"Edit with Notepad++",就可以开始修改配置文件了!
对于配置文件来说,语法是很重要的,否则一定会导致插件报错。
语法一: 注释
譬如你打开 Essentials 后,开篇就有一堆注释:
- # 文本大部分引自 XXXXXX XX"
- # 文本前带有"#"的都是阐释说明的内容,不会对格式产生影响."
- # 如果你想要在该文件内添加非单字节内容,请保存为UTF-8格式,而不是ANSI,否则可能出现乱码
- # 如果加载插件时出现了问题(例如:ERROR:null),请注意:
- # - 没有tab这样的间隔:YAML文件仅支持普通的空格
- # - 正确的"缩书写"(译注:不懂的去百度一下Indent):YAML文件的层次结构完全依赖于首行缩排.
- # - 如果文中需要使用单引号 ' , 请同时使用两个单引号, 例如:''
- # - 带有符号的文本被用单引号或双引号隔绝开来.
- # - 如果一个冒号后面有文本,则冒号与文本间必须有一个空格.
- # - 有些设置只能设置"true"或"false"
- # - 你保存该文本为UTF-8格式,而不是其他default,ANSI等格式."
这些以 "#" 开头的就是注释了,注释是给插件用户看的,让用户获得更好的插件体验,但并非所有插件作者都会在配置文件中写注释。
如果你觉得注释碍眼可以把注释删了,不会对插件功能造成影响。
同时你也可以自己写注释,但注释不推荐与配置文件内容同行,如:
- heal-cooldown: 60 #我是与配置节点同行的注释
语法二:节点
你可以在配置文件中看到譬如:
- ABCABC: XXXXXXX
注意:这里的冒号是 英 文 半 角 状 态 下的冒号,是 : 而不是:,仔细看看区别,极其容易忽略。
注意:这里的冒号后面有一个空格,极其容易忽略。
其中ABCABC称为节点名,读作"节点ABCABC"
而XXXXXXX就是节点下的内容了
内容的语法
你可以填以下内容:
汉字
譬如:
- welcome: "欢迎来到服务器"
注意:汉字要用 英 文 半 角 状 态 下的引号扩起来,是 " 而不是 “,极其容易忽略。
数字
譬如:
- player-health: 20
注意:当此处只能填数字时,你填了非数字内容,插件就会报错,譬如:
此处 player-health 的意思是玩家的血量,插件作者本意让你填写一个数字,你却:
- player-health: 玩家血量
此时如果插件作者没有做防护措施,插件就会崩溃报错。
"true"或 "false"
"true"代表开启,"false"代表关闭,譬如:
- # 如果你想用其他的插件来设置玩家名字,将其改为"false"
- change-displayname: true
这里只能填写true或false,若填写了其他的内容,而插件作者未做防护措施,插件就会崩溃报错。
列
譬如:
- # 这些命令是当开启了/socialspy命令时可以看到的玩家私聊
- # 你可以添加一些来自其他插件的命令
- # 或者移除一些你不想看到的私聊命令
- socialspy-commands:
- - msg
- - w
- - r
- - mail
- - m
- - t
- - whisper
- - emsg
- - tell
- - er
- - reply
- - ereply
- - email
- - action
- - describe
- - eme
- - eaction
- - edescribe
- - etell
- - ewhisper
- - pm
这样以'-'引起的一些字符,可以写很多行
注意: '-' 前面 有 两 个 空 格, '-' 后面 有 一 个 空 格。
再一个节点
禁止套娃
譬如:
- # /kit快速工具命令,注意:所有物品后面必须写明数量!
- # 所有的kit物品最好容易获得, 在/costs中价格较低,权限要求较低.
- # 格式: - 物品ID[:数据值/耐久] 数量 [附魔:附魔等级]..[itemmeta:value]...
- # 查看更多信息,请访问 http://wiki.ess3.net/wiki/Item_Meta
- # 延迟时间(delay)以秒为单位.
- # 查看更多信息,请访问 http://wiki.ess3.net/wiki/Kits
- kits:
- tools:
- delay: 10
- items:
- - 272 1
- - 273 1
- - 274 1
- - 275 1
可见,在节点kits下,又写了一个tools节点,而tools节点下,又有一个delay与items节点
我们称它们为:子节点tools、子节点delay、子节点items
其中delay节点是只能写 数字,items节点是只能写 列,而且这个列在这个特定的插件里是有特定的格式要求的。
注意:每个子节点前面都要有两 个 空 格。
那问题就来了,为什么items前面没有两个空格呢?
这是因为delay与items都是tools的子节点,如果:
- kits:
- tools:
- delay: 10
- items:
- - 272 1
- - 273 1
- - 274 1
- - 275 1
这样子的意思就是tools是kits的子节点,delay是tools的子节点,items是delay的子节点,与原意完全不相符。
注意:以上几个语法只是插件配置文件中普遍存在的,而不同的插件对配置文件的要求也是不同的,但是大体都可以分为以上几点。
注意:一定要按照插件原作者的要求写配置文件!
最后,改完配置文件别忘了点击左上角的保存按钮,再在服务器中重载配置文件!
乱码
指的是由于文本编辑器打开配置文件时,使用了不相应字符集而造成部分或所有字符无法被阅读的一系列字符。
在 NotePad++ 界面上方的"编码"处,点击转为 ANSI 或 UTF-8无BOM 编码,然后再保存。
一般情况下,Windows 系统的编码为ANSI,而Linux系统为UTF-8无BOM,如果无法确定,不妨两个都试一下。
注意:1.9+的服务端统一使用UTF-8无BOM编码!
第三节 什么是权限?
权限的基本概念
在这之前我们需要了解几个概念
权限 - 在CraftBukkit服务端中,给予用户,可使玩家获得做某一动作的允许。
节点 - 权限的单元,一个节点就是一条权限,可以使用权限系统插件给予各个用户,例如essentials.tp就是一条权限节点。
父节点 - 权限节点构成的前半部分,一般是插件名称,例如essentials.god权限节点的essentials。
注册的权限/附属的命令 - 使用摘要权限(通配符*)时能获得的所有附属的权限。
继承 - Group Manager中,继承就是子用户组可以使用从父用户组继承的各种属性。
保护插件(AntiGrief) - 用于禁止爆炸,某些方块的建筑和破坏的插件,例如EssentialsProtect。
映射 - 世界镜像中,一个世界使用另一个世界的配置文件,称为映射那一个世界。
映射到 - 世界镜像中,一个世界映射到另一个世界表示那个世界使用这个世界的配置。
父世界 - 被映射的世界。
子世界 - 映射其它世界的世界。
手动 - 指直接使用文本编辑软件修改配置YAML文件,而不是在游戏中或控制台使用命令。
权限就是可以让服主和管理组能有效地管理用户的权限,能够准确地控制一个玩家能干什么、不能干什么,权限的配置并不是很困难
我的世界服务器 Bukkit 系主要的权限插件有几个:
- PermissionsEX
- PowerfulPerms
- bPermissions
- GroupManagerX
- zPermissions
- LuckPerms
服务器基本的权限主要分为以下几种,并且以下的几种权限组使用了组继承,从最上方的新人(Newbie)用户组开始,一直到最下方的服主(Owner)
组名 | 说明 |
Newbie(新人) | Newbie用户组包括最基础的权限节点,应该给予所有新加入玩家在注册时保证安全的权限 |
Player(玩家) | Player用户组包括了所有玩家可以使用的权限。一般包含经济、基础传送,和其他的基础指令 |
Moderator(协管员) | 接下来的两个用户组可以基于你的喜好合并或更深入地分开。典型地,最低级的协管员等级拥有踢出玩家、监禁玩家的权限,高级的协管员可以获得封禁玩家IP地址、隐身、生成创造模式物品的允许。 |
Admin(管理员) / Owner(服主) | 服主用户组一般允许使用所有权限/命令,且通常是唯一一个拥有控制插件、规定用户组、关闭/重启服务器命令的用户组。 |
当然你也可以自定义一个例如VIP的权限组,拥有比普通用户更多的权限。
玩家的权限:
更多详细建议查阅 Minecraft 插件百科
第三节 数据库的使用
作者环境:
AuthMe配置MySQL
Windows10 1809 64-bit
Minecraft服务器核心:spigot-1.8.8-R0.1-SNAPSHOT-latest
服务器插件:AuthMe-5.4.0
MySQL安装
Windows Server 2019 数据中心版 64位简体中文
什么是数据库
数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织 的、有共享的、统一管理的数据集合。
数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
用字面意思解释就是存放数据的库。
数据库的两种分类
早期比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库。而在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库和非关系型数据库。
关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
- 易于维护:都是使用表结构,格式一致;
- 使用方便:SQL语言通用,可用于复杂查询;
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
- 固定的表结构,灵活度稍欠
- 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
非关系型数据库
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型
- 速度快:nosql可以使用硬盘或内存作为载体,而关系型数据库只能使用硬盘
- 高扩展性
缺点:
- 不提供sql支持,学习和使用成本较高;
- 无事务处理;
- 数据结构相对复杂,复杂查询方面稍欠。
非关系型数据库的分类和比较:
- 文档型
- key-value型
- 列式数据库
- 图形数据库
这里我做了一张数据库分类的图
AuthMe配置MySQL
需要先运行一次服务器让AuthMe生成默认的配置文件,如果出现下面这样的字样说明AuthMe成功的加载了
在这之前请确认您的MySQL服务器是否开启,使用MySQL工具能否访问
1.使用MySQL客户端工具,或者直接使用MySQL控制台新建一个数据库(由于Minecraft的MySQL数据库基本是本地使用,所以无需建多个MySQL用户,这里我直接使用root用户来建库)
2.选择一款MySQL客户端工具,这里推荐两款PhpMyAdmin(需要有web环境)、Navicat Premium(Mysql)
因为看本教程的大部分都是萌新,所以我这里使用最简单的Navicat Premium(Mysql)
官方下载地址:
3.打开Navicat Premium(Mysql)点击连接-MySQL,填入自己的服务器信息
连接名自己可以随便填写,如果是使用其他服务器上的MySQL需要使你现在客户端IP拥有你数据库用户的访问权限,如果不会请看下面安装过程。如果是本地的MySQL服务器可以直接使用localhost或者127.0.0.1,默认端口3306
4.当你添加完连接后,双击左侧你的连接名就会连接你的MySQL数据库,就会列出现在连接的用户中拥有的数据库(我这里之前建过一些数据库)
5.右键你的连接名 - 新建数据库 - 随便输入一个数据库名
在这里字符集推荐使用utf8mb4,排列顺序使用utf8mb4_unicode_ci
点击确定之后我们就能在左侧看到我们新建立的数据库了
6.修改Minecraft服务器AuthMe插件配置文件“plugins/AuthMe/config.yml”文件
我们只用得到配置文件的前21行
- DataSource:
- # 你想使用哪种数据库来储存
- # 数据库类型: SQLITE MYSQL
- backend: 'SQLITE'
- # 是否启用数据库缓存系统,在BungeeCord群服中或者使用网站集成时应禁用。
- caching: true
- # 数据库地址
- mySQLHost: '127.0.0.1'
- # 数据库端口
- mySQLPort: '3306'
- # 是否使用SSL连接数据库
- mySQLUseSSL: true
- # 数据库用户名
- mySQLUsername: 'authme'
- # 数据库密码
- mySQLPassword: '12345'
- # 数据库名
- mySQLDatabase: 'authme'
- # 数据表名
- mySQLTablename: 'authme'
- 首先我们需要把backend的值改为MYSQL使用MySQL作为存储数据库
- 如果你想开一个群服或者和你的网站或者论坛对接数据请将caching改为false,如果没有以上两种需求可以不做调整
- 将mySQLHost修改为你MySQL数据库的地址,如果在本地搭建的不需要做调整
- 将mySQLPort设置为你MySQL的数据库端口,MySQL默认端口3306
- mySQLUseSSL建议使用true值,不做调整
- mySQLUsername修改为你刚才创建数据库的那个用户名,我这里是"root"
- mySQLPassword数据库密码,不做解释
- mySQLDatabase修改为刚才你创建的数据库名,根据我上面图片的设置,这里我应该设置成"minecraft_server_1",这里仅做为示例,请各位根据实际情况自行修改
- mySQLTablename存放数据的表名,可自定义修改,也可不做修改
示例:
复制代码- # 你想使用哪种数据库来储存
- # 数据库类型: SQLITE MYSQL
- backend: 'MYSQL'
- # 是否启用数据库缓存系统,在BungeeCord群服中或者使用网站集成时应禁用。
- caching: true
- # 数据库地址
- mySQLHost: '127.0.0.1'
- # 数据库端口
- mySQLPort: '3306'
- # 是否使用SSL连接数据库
- mySQLUseSSL: true
- # 数据库用户名
- mySQLUsername: 'root'
- # 数据库密码
- mySQLPassword: '123456'
- # 数据库名
- mySQLDatabase: 'minecraft_server_1'
- # 数据表名
- mySQLTablename: 'authme'
- # 你想使用哪种数据库来储存
7.启动Minecraft服务器,AuthMe将自动根据设置自动创建数据表
出现以下字样就说明AuthMe成功使用MySQL作为数据库了
这时使用客户端工具就能看到AuthMe创建的数据表了
至此,AuthMe使用MySQL作为数据库的配置就到此结束了
MySQL的安装
写在前面
安装版可以直接无脑Next,这里就不讲了,下面是讲解免安装版的安装方法
免安装版第一次配置好,一个文件夹放到哪个服务器或者电脑上都能直接用
当你成功配置一次免安装版后会发现免安装版配置如此简单
后面的MongoDB的安装也是重点讲解免安装版的使用
MySQL5.7的安装与配置
下载
MySQL5.7官方下载地址:
- Product Version 选择5.7.28
- Operating System 选择Microsoft Windows
- OS Version 选择Windows (x86, 64-bit)
- 点击ZIP Archive后的Download进行下载
温馨提示:如果使用浏览器下载可以使用IDM等下载工具,如果速度还是非常慢请使用VPN
华为云开源镜像站下载地址:
腾讯云开源镜像站下载地址:
MySQL5.7安装
- 将下载好的mysql-5.7.28-winx64.zip解压放在合适的位置(我这里放在了"C:\mysql\5.7.28")
- 配置环境变量
- "此电脑"右键 - "属性" - "高级系统设置" - "环境变量"
- 在下部的"系统变量"中找到Path选中,点击编辑
点击新增将MySQL根目录下的bin目录的位置复制进去(我这里是"C:\mysql\5.7.28\bin")
如果点击编辑后是下图这种窗口,请添加;bin目录(需要在前面加一个";",例:;C:\mysql\5.7.28\bin)
- "此电脑"右键 - "属性" - "高级系统设置" - "环境变量"
- 在MySQL根目录新建my.ini文件,内容如下,注意要修改自己的文件地址
复制代码- [mysqld]
- # 服务器端口,默认3306
- port = 3306
- # MySQL根目录(注意这里的都是`/`而不是`\`或者使用`\\`如果填错会刷错误)
- basedir=C:/mysql/5.7.28
- # 数据存储位置
- datadir=C:/mysql/5.7.28/data
- # 最大连接数
- max_connections=200
- # 服务器默认字符集,无需修改
- character-set-server=utf8
- # 创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- # SQL模式,无需修改
- sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- [mysql]
- default-character-set=utf8
- [mysqld]
- 使用管理员权限打开DOS窗口(cmd),也可以使用Powershell,但都需要以管理员权限运行
- 输入mysqld --initialize-insecure,会自动生成一个无密码的root用户(可能有人要问了,为什么没密码,不要慌,下面会设置)MySQL会自动在你设置的数据库存储位置生成文件夹及数据
如果出现下面这种错误不要慌
下载并安装Visual C ++ Redistributable Package 2013,官方下载地址: https://www.microsoft.com/zh-CN/download/details.aspx?id=40784 根据自己的系统版本下载对应版本的软件 - 再输入mysqld --install
- 然后再输入net start mysql,启动mysql服务;对应的关闭命令为net stop mysql
出现启动成功的字样就说明已经安装成功了,也意味着你马上就要成功了!
- 输入mysqld --initialize-insecure,会自动生成一个无密码的root用户(可能有人要问了,为什么没密码,不要慌,下面会设置)MySQL会自动在你设置的数据库存储位置生成文件夹及数据
- 启动成功后输入 mysqladmin -u root password 新密码 来修改密码
我这里使用了"123456"的弱密码,请各位不要效仿
- 输入mysql -uroot -p登录root用户,测试你是否成功修改密码,执行该命令后会提示你Enter password输入密码,就可以输入你的新密码登录MySQL了
出现下面字符就说明登录成功了
MySQL5.7的卸载
- 使用管理员权限打开DOS窗口(cmd),也可以使用Powershell
- 输入net stop mysql停止MySQL的运行
- 输入mysqld -remove或者sc delete mysql删除MySQL的服务器
如果卸载后你又想安装上怎么办
- 使用管理员权限打开DOS窗口(cmd),也可以使用Powershell
- 再输入mysqld --install安装成功即可
- net start mysql启动服务
所以开头我说免安装版以后会非常的方便,只需带着你以前的MySQL文件夹,转到目录中的bin文件夹下执行mysqld --install就能使用,但是前提需要此电脑上已安装Visual C ++ Redistributable Package 2013
MySQL5.7安装时常见错误总结及解决方法
问题一 :由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。
原因:缺少运行库
解决方法:上文已经写出了解决此问题的方法,下载并安装Visual C ++ Redistributable Package 2013,官方下载地址: https://www.microsoft.com/zh-CN/download/details.aspx?id=40784根据自己的系统版本下载对应版本的软件
问题二:mysqld: Can't create directory 'D:\mysql\5.7.28\bin\data' (Errcode: 2 - No such file or directory)
原因:my.ini文件中的basedir(设置mysql的安装目录)、datadir(设置mysql数据库的数据的存放目录)与MySQL解压后的路径不一致
解决方法:调整basedir为MySQL的根目录,设置有效的datadir位置
问题三:设置密码时可能出现错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
解决方法:
- 打开my.ini,在[mysqld]下添加一行skip-grant-tables来跳过密码验证
注意添加位置
- 重启MySQL
- 以管理员身份打开DOS窗口(cmd)或者PowerShell
- 输入依次输入net stop mysql和net start mysql
- 输入mysql -uroot -p按回车,如果提示输入密码,直接回车即可
- 输入use mysql;切换到名为mysql的数据库下,注意进入MySQL后每个命令后面要加上分号";"
- 输入update mysql.user set authentication_string=password('新密码') where user='root';修改密码,请自行将新密码替换为您想设置的root用户密码
- 输入 flush privileges;刷新保存
- exit;或quit;退出mysql
- 删除my.ini中刚刚添加的skip-grant-tables并保存
- 重复步骤2,重启mysql
- 之后就可以使用新密码登录root用户了
问题四:我服务器上MySQL已经成功安装并运行了,我在自己电脑上为什么连接不了MySQL数据库
当然我这里不建议外网可以访问root用户
原因1:首先你的服务器需要开放你设置的MySQL数据库端口
原因2:root用户未开放远程访问权限
解决方法:
- 打开DOS窗口(cmd)或者PowerShell
- 输入mysql -uroot -p按回车,输入密码,回车
- 输入use mysql;切换到名为mysql的数据库下
- 输入grant all privileges on *.* to 'root'@'%' identified by 'root用户的密码' with grant option; 注意替换命令中的root用户的密码为你真实的root密码
- 输入 flush privileges;刷新保存
- exit;或quit;退出mysql
注意红圈地方是root用户的密码,请根据自身实际情况修改
之后你就有权限访问你服务器里的数据库了
MySQL8.0的安装与配置
<span id="download8" />
下载
MySQL8.0官方下载地址:
- Select Operating System 选择Microsoft Windows
- 点击Windows (x86, 64-bit), ZIP Archive后的Download
温馨提示:如果使用浏览器下载可以使用IDM等下载工具,如果速度还是非常慢请使用VPN
华为云开源镜像站下载地址:
腾讯云开源镜像站下载地址:
MySQL8.0的安装
Mysql8.0的免安装版的配置前2步与5.7的配置方法相同所以在这里就不详细写了,直接从创建my.ini配置文件开始
- 在MySQL根目录新建my.ini文件,内容如下,注意要修改自己的文件地址
注意:在MySQL 8.0中,默认的身份验证插件已从mysql_native_password更改为 caching_sha2_password,并且'root'@'localhost'默认使用caching_sha2_password。
复制代码- [mysqld]
- # 服务器端口,默认3306
- port=3306
- # MySQL根目录(注意这里的都是`/`而不是`\`或者使用`\\`如果填错会刷错误)
- basedir=C:/mysql/5.7.28
- # 数据存储位置
- datadir=E:\\software\\mysql\\mysql-8.0.11-winx64\\Data
- # 允许最大连接数
- max_connections=200
- # 允许连接失败的次数
- max_connect_errors=10
- # 服务器默认字符集,无需修改
- character-set-server=utf8
- # 创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- # 默认使用“mysql_native_password”插件认证
- default_authentication_plugin=mysql_native_password
- [mysql]
- # 设置mysql客户端默认字符集
- default-character-set=utf8
- [client]
- # 设置mysql客户端连接服务端时默认使用的端口
- port=3306
- default-character-set=utf8
- [mysqld]
- 使用管理员权限打开DOS窗口(cmd),也可以使用Powershell,但都需要以管理员权限运行
- 输入mysqld --initialize --console初始化数据库,执行完后MySQL会生成一个随机的初始root密码
类似这样的一个信息(图中红圈圈的就是初始的随机密码):qGdy+.pl<7uj这个是我的随机密码,每个人的初始密码都不同(不含首位空格)在没有更改密码前,需要记住这个密码,后续登录需要用到。
如果你忘记了初始密码或者手贱直接关掉了,请删掉你在my.ini中datadir(数据存储位置)选项的目录重头进行步骤4!
参考:https://dev.mysql.com/doc/refman/8.0/zh-CN/data-directory-initialization.html
如果出现类似下面这些错误不要慌
下载并安装Visual C ++ Redistributable Package 2015,官方下载地址: https://www.microsoft.com/zh-CN/download/details.aspx?id=48145
根据自己的系统版本下载对应版本的软件并安装即可
- 再输入mysqld --install安装MySQL服务
- 然后再输入net start mysql,启动mysql服务;对应的关闭命令为net stop mysql
- 输入mysqld --initialize --console初始化数据库,执行完后MySQL会生成一个随机的初始root密码
MySQL8.0修改密码
- 打开一个DOS窗口(cmd)或者PowerShell
- 输入mysql -u root -p,回车后会提示你输入密码,密码就是上面初始化生成的,如果你忘记了初始密码或者手贱直接关掉了,请删掉你在my.ini中datadir(数据存储位置)选项的目录重头进行步骤4!
- 之后输入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';注意修改你的新密码要用单引号括起来
- 输入 flush privileges;刷新保存
- exit;或quit;退出mysql
注意图中红圈地方为新密码,请自行修改
至此密码就修改完成了
MySQL8.0修改root用户远程访问权限
注意8.0的开放方式与5.7的命令不同
如果你想在你自己电脑上连接你服务器上的MySQL数据库可能会无法连接
当然我这里不建议外网可以访问root用户
原因1:首先你的服务器需要开放你设置的MySQL数据库端口
原因2:root用户未开放远程访问权限
解决方法:
- 打开DOS窗口(cmd)或者PowerShell
- 输入mysql -uroot -p按回车,输入密码,回车
- 输入use mysql;切换到名为mysql的数据库下
- 输入update user set host = "%" where user = "root";
- 输入 flush privileges;刷新权限
- exit;或quit;退出mysql
之后你就有权限访问你服务器里的数据库了
MySQL8.0连接访问问题
远程访问数据库的可视化工具比较多如:Navicat、SQLyog、MySQL workbench 等,我这里使用 Navicat
输入MySQL服务器地址、用户名和密码,报2059错误,这是因为 MySql8.0 版本 和 5.x 的加密规则不一样,而现在仍有少部分可视化工具仍然只支持旧的加密方式,可能有插件连接时也会报2059的错误
我们在安装的时候,如果你使用了我上方贴出的my.ini作为模板修改就应该不会出现此问题,但也不排除仍有极少部分用户仍然无法连接,所以我们下方给出解决方法
这里我们可以直接修改加密规则
- 打开DOS窗口(cmd)或者PowerShell
- 输入mysql -uroot -p按回车,输入密码,回车
- 输入use mysql;切换到名为mysql的数据库下
- 输入ALTER USER 'root'@'localhost' IDENTIFIED BY '你当前的root用户密码' PASSWORD EXPIRE NEVER;
- 输入ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '输入新的root用户密码';当然也可以选择直接输入你原来的密码
- 输入 flush privileges;刷新权限
- exit;或quit;退出mysql
第四节 什么是报错?
报错是服务器运行中所遇到的异常情况,它可以来源于服务端本身,也可以来自插件和模组等组件,可能是你的锅也可能是开发者的锅,这两种情况下面会分别考虑。
- 插件报错往往导致该插件和它的附属插件无法正常运行,部分情况下,玩家的信息会流失,玩家也可能通过这些错误来破坏游戏平衡,极少部分情况下,服务器会崩溃。
- 模组报错是更为致命的,大多数情况下会让服务器直接崩溃,这可能会导致玩家数据和地图数据流失损坏。(某位不知名OP也深受其害... 可幸的是一些模组的报错出现在服务器启动完成之前,不会留下隐患。
很多服主在面对不影响正常体验的报错时采取放任的态度,大部分时候确实相安无事,但解决错误应该作为最优先的策略
当服务器运行出错的时候,会在后台打印出如下类似的ERROR信息。它的标志是信息前显眼的 ERROR。
这段报错来自装错版本的Citizens插件
- [17:36:48 ERROR]: [Citizens] Missing preferred location bundle.
- [17:36:48 ERROR]: Error occurred while enabling Citizens v2.0.16-SNAPSHOT (build 1267) (Is it up to date?)
这段报错来自残忍怪物模组
- [Server thread/ERROR]: Problem editing navigator: java.lang.NoSuchFieldException: navigator
这是Protocol插件的版本警告。WARN级别的警告信息有时候也需要服主留意。
- [14:11:28] [Server thread/WARN]: [ProtocolLib]
- Version (MC: 1.12.2) has not yet been tested! Proceed with caution.
大多数情况下,ERROR 级别的报错比 WARN 更严重。但是留 心 WARN 警告的好习惯可以让我们注意到潜在的问题。
Error日志会报告服务器运行过程中的异常情况,这些情况有可能破坏服务器的正常运行,导致玩家体验恶化,信息损坏,甚至服务器崩溃。
如何自己解决报错?
很多时候,一些常见的报错可以用常识、经验以及一定的英语能力(或借助翻译软件)来解决。
一. 找出问题关键信息
报错会产生海量的信息,然而绝大多数内容都无关紧要,去伪存真才能对症下药。这里再次用上文的 Cizitens 的版本报错为例,但会给出完整版,感兴趣的服主可以借此研究报错的结构,但这并不是必须的。
- [17:36:48 ERROR]: [Citizens] Missing preferred location bundle.
- [17:36:48 ERROR]: Error occurred while enabling Citizens v2.0.16-SNAPSHOT (build 1267) (Is it up to date?)
- java.lang.NoClassDefFoundError: org/bukkit/craftbukkit/v1_8_R3/CraftServer
- at net.citizensnpcs.util.Util.getMinecraftRevision(Util.java:78) ~[?:?]
- at net.citizensnpcs.Citizens.onEnable(Citizens.java:262) ~[?:?]
- at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:402) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:374) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:323) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.craftbukkit.v1_12_R1.CraftServer.reload(CraftServer.java:745) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.Bukkit.reload(Bukkit.java:525) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:641) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:627) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:444) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:407) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]Caused by: java.lang.ClassNotFoundException: org.bukkit.craftbukkit.v1_8_R3.CraftServer
- at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:91) ~[spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) ~[spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
- at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_231]
- at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_231]
- ... 18 more
我们可以看到报错的最后出现了一系列由at引导的语句。他们的作用是定位出错的代码位置。 当 at 语句结束,下面仍然有其他的 Error 报错时,说明出现了两个以上个不同的报错,请以最后一个 at 为分界线,把他们作为两个独立的报错分析,以此类推
at 的位置越靠后,他们和报错的关系就越疏远。所以我们需要设定一个分界线语句,删去分界线后的 at,以此简化信息。(请保留分界线所在的语句)
可以作为分界线的语句
① 以at java./sun./org.apache.等开头的语句,他们是 java 语言的内部包
② 以at org.bukkit.craftbukkit或 at net.minecraft.server 开头的语句,他们是服务器的内部包
通过以上的教程自己动手后,我们可以得到如下简化后的报错
- [17:36:48 ERROR]: [Citizens] Missing preferred location bundle.
- [17:36:48 ERROR]: Error occurred while enabling Citizens v2.0.16-SNAPSHOT (build 1267) (Is it up to date?)
- java.lang.NoClassDefFoundError: org/bukkit/craftbukkit/v1_8_R3/CraftServer
- at net.citizensnpcs.util.Util.getMinecraftRevision(Util.java:78) ~[?:?]
- at net.citizensnpcs.Citizens.onEnable(Citizens.java:262) ~[?:?]
- at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[spigot-1.12.1.jar:git-Spigot-edd0396-2a927e8]
这样的报错就可以用来分析了。请注意,以上使用插件报错作为样例,对于模组报错理论上有效,但可能会有形式上的变化。
美丽小贴士:精简报错的目的是方便自己分析,如果相信自己的水平,就不需要进行这个过程。
二. 问题来自哪个插件/模组?
对于
- [17:36:48 ERROR]: Error occurred while enabling Citizens
这样的报错,我们可以很轻松地看出问题发生在Citizens插件上。
而对于
- [13:39:13] [Server thread/ERROR]: Could not pass event EntityTeleportEvent to PlotSquared
Could not pass event <Event名称> to <插件名称>也是一种常见的报错形式。
在这种报错中,我们也可以定位到具体的插件。这里的Event名称可以保存下来,我们会在下面内容中谈到。
以下内容同时适用于插件和模组:
并非所有报错都有这样详细的形式。这时候,我们需要取出最上方的at语句,我们再次请出样例Citizens插件:
- at net.citizensnpcs.util.Util.getMinecraftRevision(Util.java:78)~[?~?]
这段报错对于寻找问题插件/模组,也是一目了然的。毕竟文本里已经出现了插件/模组名
如果这样的分析依然无法得知具体插件,建议将这个问题发送到mcbbs问答板块解决。
到了这个地步,服主仍然希望自己找到报错的插件/模组。我们就只好取出at后面的一小段内容,如net.citizensnpcs.util,将他改为net/ciizensnpcs/util,然后用压缩软件打开每个插件/模组(插件/模组的本质是压缩文件),寻找对应的文件夹。如果能寻找到对应的文件夹或文件,就说明问题出现在这个插件/模组里。
服主也可以通过安装某些服务器管理插件来帮助寻找,但是这里不作安利。
三. 分析问题的方法
1.插件提示法
一些插件会在报错信息中给出具体的提示,可以借助英语知识及翻译软件帮助以求解决。
例如:
- [14:48:03 ERROR]: [PlaceholderAPI] GameTime is currently using a deprecated method to hook into PlaceholderAPI.
- Placeholders for that plugin no longer work. Please consult [a, asougi85] and urge them to update it ASAP.
翻译: GameTime 插件正使用一种过时的方法与PAPI联动,现在该功能已经无法使用,请联系作者。
一目了然,看来这位不知名开发者有必要进行版本升级了。
2.Expcetion/Error法
在大多数报错中,我们都可以看到在 at 之前看到这样的语句
- [17:36:48 ERROR]: Error occurred while enabling Citizens v2.0.16-SNAPSHOT (build 1267) (Is it up to date?)
- java.lang.NoClassDefFoundError: org/bukkit/craftbukkit/v1_8_R3/CraftServer/...
- [14:48:02 ERROR]: Error occurred while enabling Multiverse-Core v2.5-b641 (Is it up to date?)
- java.lang.NoSuchMethodError: org/bukkit/configuration/file/...
- [15:24:04 ERROR]: Error occurred while enabling GGC v1.0.0 (Is it up to date?)
- java.lang.NullPointerException: null
而这些语句中的NoClassDefFoundError,NoSuchMethodError,NullPointerException,事实上揭示了这个报错的本质。我们可以根据这些错误,采取不同的解决方法。
插件类
- NoClassDefFoundException / ClassNotFoundException / NoSuchMethodError / NoSuchFieldError
原因: 内容缺失
解决方法: 尝试更换插件版本,一般这个错误都是误用高版本或者低版本插件导致的,也可能因为该插件不兼容你所用的服务端,例如一些调用NMS的插件会对模组服务端不兼容。也有可能来自开发者的疏忽。 - UnknownhostException / 以Http开头的Exception
原因: 往往是插件连不上自己的更新服务器导致的。对于不想升级插件,服务器行为正常的服主没有太大影响
解决方法: 如果对于这个报错感到厌烦,您可以考虑使用这个插件进行屏蔽 - NullPointerException
原因: 十分广泛,一般无法由服主自己解决。可能来自于开发者的疏忽。
解决方法: 如果报错插件运行正常,您可以考虑使用这个插件对报错进行屏蔽,如果运行出错,你可以参考下文,向开发者汇报这个问题!
警告:如果点击箱子面板/箱子类插件时出现这个报错,就算没有明显问题,也要谨慎屏蔽!这有可能导致玩家刷取物品!!!
- 其他 Error/Exception 部分问题可以通过提供的报错信息得以解决,例如:
- IllegalStateException: Cannot make FireworkEffect without any color
这个方法和插件提示法异曲同工,不另行描述。
模组类
- 安装了客户端模组
- [17:51:11] [main/WARN]: Error loading class:net/minecraft/client/Minecraft
任何和client有关的报错都有可能来自这个原因
- 重复安装了模组
- DuplicateModsFoundException
- 如果出现这种报错
- NullPointerException: Ticking block entity
请打开服务端 config 文件夹的 forge.cfg ,并将其中B:removeErroringEntities和B:removeErroringTileEntities两项改为true
如果以上方法无法让您解决问题,请向开发者汇报或在问答板块求助这个问题!不要拘束,这是双赢的。
四.如何合理地提问和汇报错误?
在汇报或提问的过程中,请详细地描述报错情景,提供服务端类型和版本号,提供插件和模组列表,并提供没有精简过的完整报错,甚至报错的一部分上下文(日志文件),或者完整的崩溃日志,大部分问题都可以得到解决。
附:扩展阅读
[教程] 自己动手排查报错,海螺螺著。
怎么看崩溃报告和Timings?,森林蝙蝠著。
第六节 配置文件优化
根据举报贴https://www.mcbbs.net/thread-1170443-1-1.html ,本节内容转载授权存在瑕疵。已删除本段内容,请楼主完善授权或原创内容后再补充本节内容。
第七节 什么是跨服?
跨服同时也是搭建我的世界服务器中的一项复杂的一门技术,在搭建多个服务器时,要做一些研究以及了解的工作。
自我思考
- 我是不是需要跨服?
- 我的服务器是否有那么多的玩家在游玩?
- 我的服务器是不是性能多余,核心老是满不起来?
- 想不想把服务器做大,游戏内容多样话,同时玩家在游玩的时候体验的非常舒适?
如果是的请继续往下
了解
跨服大致就是“分布式部署“我的世界的服务端从而提高服务器硬件的利用率的一种技术手段。
也就是代理服务器,他的作用就是代理玩家进入到服务器内部的一个个子服务端,作为内网与外网之间的桥梁。
从前到后、从后到前、跨服版本数量繁多
BungeeCord、Velocity、Lilypad、WaterFall、HexaCord、Travertine、Minecraft-Proxy
本次采用的是 BungeeCord
首先构思一下服务器的框架以及配置文件
学习 配置文件(Config.yml)详细介绍
- server_connect_timeout: 5000
- #服务器无响应,多少毫秒后BungeeCord会关闭这个连接
- remote_ping_cache: -1
- #远程Ping缓存
- forge_support: false
- #ForgeMOD支持,如果有MOD服务器,请打开这个选项
- player_limit: -1
- #玩家限制,它将限制整个服务器的玩家人数,-1为不限
- permissions:
- # BungeeCord服务器权限组 也就是指令权限
- default:
- - bungeecord.command.server
- #服务器
- - bungeecord.command.list
- #显示在线玩家
- admin:
- - bungeecord.command.alert
- #全服公告
- - bungeecord.command.end
- #关闭BungeeCord
- - bungeecord.command.ip
- #IP
- - bungeecord.command.reload
- #BungeeCord重载插件权限
- timeout: 30000
- #当玩家在BungeeCord中无响应多长时间,BungeeCord才会将他踢出去,
- log_commands: false
- #记录命令
- network_compression_threshold: 256
- #这个参数只有1.8的服务端才有,含义是网络封包压缩的阀值。当封包长度高于这个值时,封包会被压缩。(适当调整可提高性能)
- online_mode: true
- #正版验证,如果是盗版服请关闭
- disabled_commands:
- #服务器禁止的指令
- - disabledcommandhere
- servers:
- #子服务器列表
- lobby:
- #服务器名称
- motd: '&1Just another BungeeCord - Forced Host'
- #服务器MOTD 支持颜色字符
- address: localhost:25565
- #服务器的内网ip地址以及端口
- restricted: false
- listeners:
- - query_port: 25577
- #UDP查询端口
- motd: '&1Another Bungee server'
- #客户端列表看到的服务器介绍
- tab_list: GLOBAL_PING
- query_enabled: false
- #是否开启UDP监听查询
- proxy_protocol: false
- #代理协议
- forced_hosts:
- #可以用域名绑定通过域名直接进入指定服务器
- pvp.md-5.net: pvp
- ping_passthrough: false
- #是否穿透BungeeCord直接获取后端服务器ping信息,如motd等。
- priorities:
- #优先服务器列表,就是登录服务器或者大厅服务器
- - lobby
- bind_local_address: true
- #是否把BungeeCord端和你服务器通讯的IP地址设置为BungeeCord端监听的地址
- host: 0.0.0.0:25577
- #BungeeCord的IP地址,访问它就能进入BC服务器进入其他服务器。
- max_players: 1
- #服务器显示的最大人数 不是真实人数
- tab_size: 60
- #按Tab键的时候,显示的玩家列表总容量。60的时候是三列,80的时候是四列
- force_default_server: false
- #强制跳转到默认服务器
- ip_forward: false
- #是否启用真实IP与UUID转发功能
- remote_ping_timeout: 5000
- #远端服务器无响应,多少毫秒后BungeeCord会关闭这个连接
- prevent_proxy_connections: false
- #防止远端使用代理登入
- groups:
- #玩家组权限
- md_5:
- - admin
- connection_throttle: 4000
- #连接间隔,当玩家退出后多就能加入
- stats: b2bd44d7-c14e-4a4c-8s67-e5ecdf22d160
- #机器码,请不要修改,服务端会自己生成的
- log_pings: true
- # 记录ping值
BungeeCord 搭建
我们假设以三个服为准:登入服、生存服和创造服。
玩家可以通过指令、菜单和传送门到达各子服务端,同步玩家的背包以及状态、聊天以及公告。
在 BungeeCord目录下 config.yml 配置 servers:和host:
- host: 0.0.0.0:61390
- #定义为 0.0.0.0 指接受任意地址连接
- #端口需要设置为服务商提供的对外开放的端口,独立IP则自选。
- servers:
- 服务器名称(可以中文最好英文):
- motd: '子端标语(可以保留不变)'
- address: 子端地址:子端端口
- restricted: false
如下:
- server:
- 登入服:
- motd: '&1Just another BungeeCord - Forced Host'
- address: localhost:21000
- restricted: false
- 生存服:
- motd: '&1Just another BungeeCord - Forced Host'
- address: localhost:22000
- restricted: false
- 创造服:
- motd: '&1Just another BungeeCord - Forced Host'
- address: localhost:23000
- restricted: false
服务器目录框架
对应的修改每一个子服务端的server.properties
- 登入服
- server-ip=127.0.0.1
- server-port=21000
- 生存服
- server-ip=127.0.0.1
- server-port=22000
- 创造服
- server-ip=127.0.0.1
- server-port=23000
注意:设置server-ip=127.0.0.1 可以防止玩家不经过登陆服直接访问到子服务端,务必设置到内网地址!
注意:子服端口server-port= 不需要设置为服务商提供的对外开放的端口!
如果使用 Spigot 类型的端,一般目录下会有一个spigot.yml文件,在其中需要将bungeecord项修改为true来支持跨服的协议:
- bungeecord: true
如果使用 Paper 服务端,一般目录下会有一个paper.yml文件,若你搭建的是非正版服务器,则需要将其中的bungee-online-mode项修改为false:
- bungee-online-mode: false
安全起见,建议将 BungeeCord 的config.yml中的groups项进行如下修改:
- groups: {}
如此一来,我们便成功地搭建了一个有三个子端的Bungee群组服务器。
在后期也可以安装BungeeCord安装相关的插件来加强Bungee的功能。
第七节 系统运行维护
我们都知道,与普通家用电脑不同的是,服务器是一台24小时不关机的电脑。正因如此,我们就不能把使用家用电脑的习惯带到使用服务器上去。
杀毒软件
一般情况下,服务器只会运行一项业务,例如搭建我的世界服务器时,不推荐再搭建其他游戏。
这是因为,每种程序对服务器的配置和环境要求是不同的。我们购买到的VPS服务器虽然可以搭建其他游戏,但是服务商不会在硬件上对其他游戏进行优化,服务商的售后也无法提供其他游戏的支持。
所以,在服务器上切勿安装非搭建我的世界服务器必要的软件,尤其不能安装360安全卫士和腾讯电脑管家之类的家用电脑常见的安全软件。这类安全软件会更改系统设置,可能会影响到我的世界服务器的运行,甚至有可能使服务器无法连接网络。
我们也同样不建议安装杀毒软件的所谓服务器版或安全狗等服务器防黑安全软件,通常情况下,这类软件无法提供实质性的防御效果,反而可能会影响我的世界服务器的正常运行,同时也可能使服务器无法连接网络。
运行环境
搭建我的世界服务器需要的一些环境(如Java),可能会在第一次安装过后有所更新,但我们并不建议你时常对这些环境进行更新,尽管环境的开发团队会尽可能对新版本进行兼容性测试,但我们谁也无法保证新版本不存在任何兼容性问题。
如果你的服务器没有出现任何问题,就请不要再做任何操作,那样只会是画蛇添足!
内存维护
在系统和我的世界服务器的运行中,会不间断产生一些内存数据垃圾,这些数据垃圾无法被软件回收。长此以往,VPS服务器的内存将会充斥这些垃圾,而系统和我的世界服务器将无法正常运行。尽管这个过程可能会持续很长时间,但仍然是个不容小觑的问题,我们建议你在我的世界服务器没有玩家时,对VPS服务器进行重启,以此彻底清理内存垃圾,释放内存空间,保障系统和我的世界服务器的正常运行。
业务安全
在运营我的世界服务器时,可能存在不怀好意者恶意利用程序漏洞非法获取管理员(OP)权限的情况。
在面对此类危害较大的恶意行为时,我们可以登录服务器远程桌面,通过我的世界服务器控制台封禁恶意利用者的账号和IP地址,并在第一时间安装相关修复和管理员权限管理插件,通过多种途径断绝利用恶意漏洞的可能。
系统安全
数据无价,系统安全是重中之重。一般情况下,除阿里云等大型企业公有云外,我们购买的用于搭建我的世界服务器的VPS服务器,它的默认系统密码是固定的(如Example!.),你得到的服务器系统密码与他人的服务器系统密码是同一个。
同时,大多数我的世界服务器提供商为VPS服务器对外开放的端口是有规律的。因此,不法者便可以通过这种规律,从一台VPS服务器的后台信息推断出其他VPS服务器的后台信息,如果你没有修改默认的系统密码,那么不法者便可以直接进入你的VPS服务器后台,获取到完全控制权限,你的数据便落入他人手中。
所以,在拿到VPS服务器后台信息时,第一时间修改系统密码!
如果你发现使用远程桌面时,出现被强行踢出的情况,请首先确认是否将远程桌面密码分发给过第三人。在确认为恶意入侵时,应当第一时间联系服务器提供商,通过虚拟化平台关闭你的服务器并在路由中关闭对外的映射,随后开启服务器并利用内网登录修改密码以保证安全。
注:部分服务器提供商因自身网络拓扑原因,存在内网入侵的可能,发现恶意入侵请务必联系服务器提供商求助!
DDoS
在互联网中对一台服务器发起攻击的方式多种多样,DDoS 就是极为常见的一种。DDoS 原理是向目标服务器发送大量无意义数据包以消耗目标服务器的资源。
在运营我的世界服务器的过程中,很有可能会遇到 DDoS 攻击,当发现服务器被 DDoS 攻击时,请第一时间向服务器提供商反映。
必要时,我们可以报警求助。对于恶意的网络攻击,我国有明确的法律规定:
《中华人民共和国网络安全法》
第二十七条
任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助。
第六十三条
违反本法第二十七条规定,从事危害网络安全的活动,或者提供专门用于从事危害网络安全活动的程序、工具,或者为他人从事危害网络安全的活动提供技术支持、广告推广、支付结算等帮助,尚不构成犯罪的,由公安机关没收违法所得,处五日以下拘留,可以并处五万元以上五十万元以下罚款;情节较重的,处五日以上十五日以下拘留,可以并处十万元以上一百万元以下罚款。
《中华人民共和国刑法》
第二百八十五条 非法侵入计算机信息系统罪
违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。 违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。 提供专门用于侵入、非法控制计算机信息系统的程序、工具,或者明知他人实施侵入、非法控制计算机信息系统的违法犯罪行为而为其提供程序、工具,情节严重的,依照前款的规定处罚。 单位犯前三款罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,依照各该款的规定处罚。
第二百八十六条 破坏计算机信息系统罪
违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。 违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚。 故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的,依照第一款的规定处罚。 单位犯前三款罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员,依照第一款的规定处罚。
我们在遭受不法侵害时,应当运用法律维护自己的合法权益。
第一节 Redis 的安装与配置
简介
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- Redis 是完全开源免费的,遵守BSD协议,是一个高性能的 key-value 数据库。
- Redis 与其他 key-value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即 master-slave 模式的数据备份。优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
下载
Window 系统
下载地址:https://github.com/MSOpenTech/redis/releases
Linux 系统
下载地址:https://redis.io/download
注:Redis官方并无Windows支持,目前Redis主版本已到5.X,而Windows下的最高版本仍为3.2.100。
Msi安装模式
若想采用此模式则应在上方下载地址中选择下载Redis-x64-3.2.100.msi
- 通过此模式安装我们可以对Redis进行简易的安装配置
- 首先双击打开Redis-x64-3.2.100.msi,等待文件读取完成即可点击NEXT按钮
- 点击NEXT按钮后需要同意软件使用协议,选中I accept the terms in the Licenes Agreement复选框即可再次点击NEXT按钮
- 选择软件的安装目录,如不了解此选项的具体含义请直接点击NEXT按钮进入下一步
- 设置Redis服务的运行端口,默认为6379,如不了解此选项的具体含义请直接点击NEXT按钮进入下一步
- 设置Redis服务的运行内存限制,建议为服务器总内存的5%-10%,如不了解此选项的具体含义请直接点击NEXT按钮进入下一步
- 在这一步直接点击Install按钮即可进入Redis的安装过程
- 等待进度条完成后点击Finish按钮即可完成安装,此时Redis的系统服务也已自动启动,现在只需要在相关的插件配置文件中配置好Redis的链接信息即可使用,请注意,在您未更改Redis默认配置的情况下,Redis的默认链接信息为:
Host:127.0.0.1
Port:6379
Pass:默认为空
解压可用模式
若想采用此模式则应在上方下载地址中选择下载Redis-x64-3.2.100.zip
- 首先我们将下载的zip压缩文件解压至任意文件夹,进入文件夹
- 双击redis-server.exe文件启动Redis服务端
注:该模式下默认配置为:
Host:127.0.0.1
Port:6379
Pass:默认为空
Redis配置
一般来说Redis中我们经常用到的配置项有以下几项:
- port:6379指定访问redis服务端的端口。
- bind:127.0.0.1指定redis绑定的主机地址。
- timeout:指定客户端连接redis服务器时,当闲置的时间为多少(如300)时,关闭连接。
- loglevel:指定redis数据库的日志级别,常用的日志级别有debug、verbose、notice、warning,不进行修改的情况下默认的是notice。
- save:指定redis数据库多长时间内(s)有多少次(c)更新操作时就把缓存中的数据同步到本地库,比如:save 600 2,指的是10分钟内有2次更新操作,就同步到本地库。
- dir:指定redis本地数据文件存放的目录。
- requirepass:指定redis的访问密码。
注:如果您无法理解上面每一项的含义,那么请勿修改配置文件
RedisBungee插件配置
这里仅展示Redis相关部分:
- #Redis服务器IP,默认为127.0.0.1
- redis-server: 127.0.0.1
- #Redis端口,默认为6379
- redis-port: 6379
- #Redis密码,默认为空
- #如果你的Redis密码为 纯数字 请删除 ""
- redis-password: ""
- #Redis服务器最大连接数.
- #默认值为 8. 请不要改变这个值,除非你有大量插件或玩家.
- max-redis-connections: 8
插件详细配置请前往MCBBS查看RedisBungee的介绍。
第二节 MongoDB 的安装与配置
作者环境: Windows10 1809
建议使用免安装版
免安装版
- 先到官网:https://www.mongodb.com/download-center/community 或者可以直接点这个链接下载:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.3.zip
- 在有条件的情况下最好将MongoDB放在除系统分区外的其他分区 在这里我放在了“D:\MongoDB\4.2”
- 创建"/data" 和 "/log" 两个文件夹("/data"文件夹下,用于存放数据库数据;"/log"文件夹下,用于存放日志)
- 在data文件夹下创建"/db"空文件夹
- 在data文件夹下创建"/db"空文件夹
- ![](./images/mongodb/10.png)
- 2. 在log文件夹下创建"mongo.log"空文件
- ![](./images/mongodb/11.png)
data和log两个文件夹的位置可以随意,不必须放在MongoDB程序的目录下,后面将在配置文件内设置,我这里就为了方便就放在一起了
- 配置系统环境变量path(可选) 我的电脑->属性->高级系统设置->环境变量->系统变量->选择“Path”->编辑->在后面添加MongoDB的bin目录例如“;D:\MongoDB\4.2\bin”(注意:新版本的Windows 10 不需要加;)不明白请跳过步骤4
- 在MongoDB安装路径下创建配置文件“mongo.config” 安装路径例:D:\MongoDB\4.2
- 为“mongo.config”添加内容 下面的dbpath和logpath请根据自己的实际情况填写
复制代码- #数据库文件的存放位置
- dbpath=D:\MongoDB\4.2\data\db
- #日志文件存放的路径
- logpath=D:\MongoDB\4.2\log\mongo.log
- # 设置绑定ip
- bind_ip = 127.0.0.1
- # 设置端口
- port = 27017
- # 是否以安全认证方式运行,默认是不认证的非安全方式
- auth = true
- #数据库文件的存放位置
- 请以管理员身份运行cmd或者PowerShell 注意:如果跳过了步骤4,请使用cd命令转跳到MongoDB的bin目录下 (例:cd D:\MongoDB\4.2\bin 如果不在D:\磁盘符下还需输入D:转跳到D分区下)如果设置了步骤4可跳过 之后复制以下指令
复制代码- mongod --config "D:\MongoDB\4.2\mongo.config" --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
请将D:\MongoDB\4.2\mongo.config换成你mongo.config的位置 当你看到类似下图的信息是说明MongoDB就安装成功了 到这里不要急着关cmd - 同样需要有管理权限的cmd 输入下面指令来运行MongoDB
复制代码- net start MongoDB
看到“已经启动成功”就说明MongoDB已经正常启动了
如果你还不放心你可以打开浏览器输入127.0.0.1:27017这里的端口就是你上面设置的 看到这个页面你的MongoDB就成功运行了,可以使用客户端操作MongoDB了
Msi安装包安装
- 与免安装版相同到官网下载安装包:https://www.mongodb.com/download-center/community
连网站都懒得打开的童鞋们呢可以直接点击链接下载:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.3-signed.msi
下完应该是这么个图标的东西
- 双击运行“Next”到第二个界面
如果你想自定义安装软件或者MongoDB的安装目录请选择Custom如果不想调直接选择Complete(这里我建议调整MongoDB的安装目录到"D:\MongoDB\4.2")
- 调整数据库数据存储位置和Log存储位置
这里我分别放在了"D:\MongoDB\4.2\data"和“D:\MongoDB\4.2\log”(强烈建议修改默认位置,这个都懒得调不建议用数据库了)
- 这个界面会让你选择是否安装一个叫"Compass"的东西 Compass是4.x之后的一个新功能,就是GUI功能(可视化工具) 这里不建议勾选(没必要、加长安装时间、占空间)
- Next之后,MongoDB就开始安装了,等待安装成功即可
mongo.config详解
- # 数据库文件位置
- dbpath=/var/lib/mongodb
- #日志文件的路径
- logpath=/var/log/mongodb/mongodb.log
- # 是否追加方式写入日志,默认True
- logappend=true
- # 设置绑定ip
- bind_ip = 127.0.0.1
- # 设置端口
- port = 27017
- # 是否以守护进程方式运行,默认false
- fork = true
- # 启用日志文件,默认启用
- journal=true
- # 启用定期记录CPU利用率和 I/O 等待,默认false
- #cpu = true
- # 是否以安全认证方式运行,默认是不认证的非安全方式
- #noauth = true
- #auth = true
- # 详细记录输出,默认false
- #verbose = true
- #用于开发驱动程序时验证客户端请求
- #objcheck = true
- # # 启用数据库配额管理,默认false
- #quota = true
- # 设置oplog日志记录等级,默认0
- # 0=off (default)
- # 1=W
- # 2=R
- # 3=both
- # 7=W+some reads
- #oplog = 0
- # 是否打开动态调试项,默认false
- #nocursors = true
- # 忽略查询提示,默认false
- #nohints = true
- # 禁用http界面,默认为localhost:28017
- #nohttpinterface = true
- # 关闭服务器端脚本,这将极大的限制功能,默认false
- #noscripting = true
- # 关闭扫描表,任何查询将会是扫描失败
- #notablescan = true
- # 关闭数据文件预分配
- #noprealloc = true
- # 为新数据库指定.ns文件的大小,单位:MB
- # nssize = <size>
- # 用于Mongo监控服务器的Accout token。
- #mms-token = <token>
- # Mongo监控服务器的服务器名称。
- #mms-name = <server-name>
- # Mongo监控服务器的Ping间隔时间,即心跳
- #mms-interval = <seconds>
- # Replication Options
- # 设置主从复制参数
- #slave = true # 设置从节点
- #source = master.example.com # 指定从节点的主节点
- # Slave only: 指定要复制的单个数据库
- #only = master.example.com
- # or
- #master = true # 设置主节点
- #source = slave.example.com
- # 设置副本集的名字,所有的实例指定相同的名字属于一个副本集
- replSet = name
- #pairwith = <server:port>
- # 仲裁服务器地址
- #arbiter = <server:port>
- # 默认为false,用于从实例设置。是否自动重新同步
- #autoresync = true
- # 指定的复制操作日志(OPLOG)的最大大小
- #oplogSize = <MB>
- # 限制复制操作的内存使用
- #opIdMem = <bytes>
- # 设置ssl认证
- # Enable SSL on normal ports
- #sslOnNormalPorts = true
- # SSL Key file and password
- #sslPEMKeyFile = /etc/ssl/mongodb.pem
- #sslPEMKeyPassword = pass
第三节 认识资源包
资源包结构
以 1.11.2 版本为例。首先创建一个文件夹。打开 1.11.2.jar 核心文件,我们可以看到名为 assets 的文件夹。把 assets 复制到我们新建的文件夹里,assets 内包含了大部分可修改的游戏贴图,但并不完全。下面来介绍一下材质包的文件目录。
- \材质包
- pack.png
- \assets
- \minecraft
- \blockstates
- \models
- \textures
- \blocks 方块材质
- \entity 实体材质
- \environment 日月、雨雪材质
- \gui 用户界面材质
- \items 物品材质
- \map 地图界面材质
- \models 盔甲材质
- \painting 画材质
- \particle 粒子材质
- \......
- \......
- pack.mcmeta
assets/minecraft 目录下的文件都包含了原版游戏的大部分内容,例如 blockstates和 models 和模型有关,text 和游戏的文本有关。而游戏的贴图文件都存在 textures 文件夹中。
但同时我们发现,材质包目录下除了 assets 文 件夹,还有 pack.png 和 pack.mcmeta。pack.png 是材质包的图标。重点是 pack.mcmeta ,这个文件在游戏 jar 文件内找不到,你可以新建一个 txt 文档,将 新建文本文档.txt 改成 pack.mcmeta,再用可以处理文本文件的应用打开。这个文件内的基本内容是这样的。
{
"pack": {
"pack_format": 4,
"description": "123456ABC"
}
}
pack_format 后的数值代表这个资源包适用的版本。1.8.9及以前版本填1,1.9至1.10.2填2,1.11至1.12.2填3,1.13至1.14.4填4,1.15及以后填5。
description 后的引号内是资源包的介绍,介绍会在选择资源包时出现在资源包名称的下方。
如何修改原版音效
难点:1. 找到原版的音频文件 2. 根据 indexes 下各版本的 json 文件所写的内容修改资源包的音频文件
游戏能读取 .ogg 格式的音频,如果你做好了一个音效,但它是 mp3 或其它格式,你可以用格式工厂转码。
我们打开某个版本的jar文件,我们并不能找到任何音频文件。音频文件储存在游戏根目录 .minecraft\assets\object\下的各个文件夹里,但是 object 下的文件夹没有按一定的规律命名,且这里面保存的不仅仅有音频文件,许多游戏项目文件也包含其中。以1.12版本为例,我们想要找到打开箱子音效的音频文件,我们应该在游戏根目录 .minecraft\assets\indexes 下找到对应的版本的 json。打开1.12.json,利用查找箱子的英文名 chest 或者其它方法,我们可以查找到以下部分
- "minecraft/sounds/block/chest/close.ogg": {"hash": "a7d0d6f761c9a647cc0273bc016f2772b85f6d88", "size": 7590},
- "minecraft/sounds/block/chest/close2.ogg": {"hash": "eaa2cfc2ca71f219930cc496d5316853364d3623", "size": 7896},
- "minecraft/sounds/block/chest/close3.ogg": {"hash": "fda6f8d1f1daabad0fd78903cd3c4b366f77a8e5", "size": 7116},
- "minecraft/sounds/block/chest/open.ogg": {"hash": "f993dbcc8cdde669020b9f988f091d997006ce8b", "size": 8916},
最下面,我们可以看到 chest/open.ogg 字样。这时我们复制hash后面引号内的内容,也就是f99....8b,再进入到 assets/object 里查找,我们就可以找到这样的文件
这个文件没有后缀名。当我们加上 .ogg 后缀名后播放,我们就可以听到箱子打开的音效。
下面是一个利用资源包修改原版音效的实例。以1.12版本为例,我们现在已经有一个名为 1.ogg 的音频文件,打开后可以听到“叮咚”的声音,我们想用这个替换原版拾取经验球的声音。
回到 assets/indexes 文件夹里,打开 1.12.json,查找orb(经验球)(举一反三,如果你想修改僵尸的音效可以查找zombie),可以看到这一行
- "minecraft/sounds/random/orb.ogg": {"hash": "e9833a1512b57bcf88ac4fdcc8df4e5a7e9d701d", "size": 7139},
可以看到,如果想修改拾取经验球的音效,我们应该在我们材质包的 assets/minecraft 目录下,新建一个 sounds 文件夹,再在 sounds下新建一个 random 文件夹。把我们已准备好的 1.ogg 文件名改成 orb.ogg ,并复制到 random 里。
如何修改Mod的材质
相信这部分对许多Mod服的服主有帮助。
我们有时可以看到一些材质包,使用之后可以使 Mod 里的贴图变动。这里我们可以找个支持 Mod 材质的材质包研究一下,这里我找到了 Dandelion。
可以看到,像这种支持 Mod 的材质,assets 下的文件夹不仅仅只有 minecraft,还有像 appliedenergistics2(应用能源2),botania(植物魔法)等文件夹。对此,我们可以把 minecraft 也理解为一个 mod,而 assets 文件夹下就包含了所有 Mod 的材质贴图等,并且各个文件夹都代表了一个 Mod。
打个比方,如果我们想修改IC2(工业2)的部分材质,我会下载一个ic2模组,打开 jar 文件
再把jar文件内,assets 下的ic2文件夹整个复制到自己材质包的 assets 下,ic2的材质贴图都在 textures 下,所以 assets/ic2 下只需留一个 textures 就行了,其余删去。
材质的打包
材质基本都需要打包才可在互联网间互相传播分发。这作为一个点,并不是说这个很难,因为这很容易出错。
打包材质为 zip 压缩包文件,我们应该选 中assets 文件夹、pack.png 和 pack.mcmeta 后右键添加至压缩包,而非在上一级将材质的一个文件夹打包。
贴图处理
默认材质像素是 16x16,当然也有 32x32 64x64 128x128 256x256 512x512以 及更高像素的材质,高清像素需使用第三方 Mods 才可运行,最为常见的高清材质补丁为 Optifine HD。
材质是如何做出来的
材质的制作并非是一件容易的事情,首先材质包中众多材质对工作量也是一项挑战,需要你有足够多的耐心才能够完成,并有相关领域的研究,比如色彩,阴影,材质的衔接等。建议在原材质包的基础上替换更换自己制作的材质,以达到材质文件名的一致。
制作材质有很多种软件可以使用,最为大众所熟知的是 Photoshop,当然 paint.net 也很好用。但切记别用 Windows 的画图软件,它无法处理带透明度的图像。
推荐教程:https://www.mcbbs.net/thread-544987-1-1.html
Minecraft Wiki:https://wiki.biligame.com/mc/%E8%B5%84%E6%BA%90%E5%8C%85
第四节 什么是皮肤?
皮肤,具体指的是游戏中玩家或生物所显示的材质。
既然皮肤是一种材质,则需要在材质文件中加载
我们在认识资源包已经学习过,皮肤文件的大致位置为\.minecraft\versions\相应版本名称\assets\minecraft\textures\entity, 在该目录下我们找到一个steve.png文件:
同理我们可以获得一个alex.png皮肤文件(1.8以后版本), 两者都是 Minecraft 游戏中的默认玩家皮肤。
一.皮肤格式
皮肤文件均为.png格式。仔细观察两个皮肤,从直观上看两者有较为明显的大小区别
简单来说就是男性皮肤和女性皮肤的区别,可以看到相比男性皮肤,女性皮肤的手臂大小为3x4x8,同时手臂偏下。
由于1.8版本皮肤和之前版本有差异,并且还多了一个女性皮肤,所以在替换的时候要格外注意,否则进入游戏后皮肤会出错。
1.8版本以后的皮肤为64x64大小(即双层皮肤) 1.8版本之前的皮肤为64x32大小(即单层皮肤) 可以右键皮肤文件-属性-详细信息 查看
二.如何修改皮肤
1.单人世界
如果你只是玩单机游戏,用你所要使用的皮肤文件把\.minecraft\versions\相应版本名称\assets\minecraft\textures\entity中的steve.png替换即可 (如果默认皮肤是 Alex,相应替换即可)
原理就是单机游戏中只会加载一个玩家实体的材质,如果你在多人游戏中使用,则所有为默认皮肤的实体玩家都会加载为你的皮肤(仅你自己可见)
2.多人游戏
服务器可以借助一些插件或者皮肤站实现替换皮肤功能,插件和网站很多,这里就不一一举例了。
3.正版用户
进入官网 -> 选择 Profile-select a file 选择一个皮肤 -> upload 即可
三.如何绘制皮肤
打开皮肤文件,发现这是皮肤每个部分的展开图。由此我们就可以修改每个像素来绘制一个全新的皮肤
1.使用Photoshop
如图,用软件打开皮肤文件,就可以绘制皮肤了
2.MCSkin3D
推荐使用这款软件,相对ps来说更加方便
还有其他的软件和方法,在这里就不一一举例了
画皮肤也绝非是一件简单事,工作量可能比一个材质包小,但是难度却不亚于画材质包。比如色彩,阴影,各部分的衔接等都是非常重要的
推荐教程:https://www.mcbbs.net/thread-538676-1-1.html
第五节 什么是3D建模?
3D建模是MC在1.8及以后版本基本完善的一个功能, 能够让玩家任意更改游戏内方块, 物品的模型, 和更改游戏对应方块物品的指向模型, 更强大的, 还可以更改模型中某个部分的渲染属性。
对于服主来说,更改模型不仅可以显示自己服务器的逼格,体现服务器的特色,还可以实现某些特定功能,尤其是对RPG服务器的服主。制作许多诸如法杖,宝剑;亦或盘子,各种机器。增添服务器的色彩,优化玩家对服务器的第一印象。
MC目前只能修改物品和方块的模型,并不能修改实体,或穿在身上的盔甲的模型。
如何制作模型
制作模型的手段有很多,可以硬着头皮写 json 代码。但很显然,用软件制作会简单很多。这里推荐两个软件:Cubik Studio 和 Blockbench。前者是非常专业的制作软件,且需要购买;后者是简洁,轻量,适合新手但功能绝对够用的免费软件。Cubik Studio就像Photoshop,而Blockbench就像paint.net,制作模型就如处理图片,两者完全够用,但太多的功能可能会让人一时眼花缭乱,所以我推荐使用Blockbench。
? 推荐教程:
? Cubik Studio:https://www.mcbbs.net/thread-687670-1-1.html
? Blockbench:https://www.mcbbs.net/thread-833634-1-1.html
下面来详细介绍一下如何利用Blockbench制作一个模型
? 难以理解且易错的点: 1. 如何导入贴图 2. 如何将制作的模型应用到游戏内
软件的操作方法这里就不再赘述了,因为软件的操作并不是真正的难点。Blockbench易上手,自己摸索一下可能就懂了,实在不懂还可以看教程。
实例:制作一个蜡烛模型,替换MC原有的火把的模型
这是我想象中的样子:
现在我已经做好了模型的大致样子,和一张贴图,贴图的保存位置在桌面
下面我要导入这个贴图,那么问题来了,这个贴图是应该就放在桌面呢,还是应该移到资源包的目录 模型资源包/assets/minecraft/textures/block 下?注意,用Blockbench制作的模型文件是json文件,json文件并不会保存图像信息,所以贴图应该移至/textures下,最好是textures/block下。
如果导入非资源包目录下的文件,游戏在加载时会找不到这些文件,从而出现错误。对此Blockbench也有提示。
现在我们成功地导入了candle.png
通过拖动赋予材质,和右上角的调整UV,我们的模型有了颜色。
将这个模型保存为torch.json。随后,打开游戏目录下的.minecraft/version/对应版本/对应版本.jar。我这里用的是1.13.2版本,所以我打开的是1.13.2.jar。
在1.13.2.jar/assets/minecraft/blockstates内找到torch.json。把这个文件复制到模型资源包/assets/minecraft/blockstates下,也就是我们自己资源包的blockstates下。打开torch.json,我们可以看到。
{
"variants": {
"": { "model": "block/torch" }
}
}
variants可以理解为形式。我们可以看到,torch这个方块的模型(model),指向了block/torch。block/torch省略了很多东西,完整的形式是 资源包/assets/minecraft/model/block/torch.json。
上面说得也许太复杂了。这些代码有什么意义,这里我形象地给大家讲一下游戏程序,blockstate(方块状态),model之间的关系。
Minecraft.exe:Blockstate,听好了,我现在要读取火把的模型,
Blockstate:我找找,我这里的torch.json告诉火把的模型在models/block/torch.json
Minecraft.exe:彳亍
也就是说,游戏要读取火把的模型,它会最先找blockstates里的torch.json。这是早已写在游戏程序里的,无法改变。换句话说就是,要读取火把的模型,你不能让游戏去读取blockstates里的oak_log.json(橡木原木),而是torch.json。随后,游戏会根据blockstates/torch.json写的东西,进一步去读取/models下的模型文件。比如说,我们想让仙人掌的模型变成漏斗的模型,如最上面的那张图片所示,我就会把blockstates/cactus.json里指向block/cactus的一行改成block/hopper,让游戏读取hopper.json而非cactus.json。(cactus 仙人掌、hopper 漏斗)
回过头来,再看blockstates/torch.json里的代码 { "variants": { "": { "model": "block/torch" } } }。可见火把的模型指向的是models/block/torch.json,所以我们把做好的蜡烛模型复制到此。
我们成功了!
第一节 Java 编程基础
出于对教学质量和学习效率的考量,我们决定不直接提供 Java 编程基础的教学,取而代之的是我们推荐的高质量教材:
纸质书籍
《Java 核心技术》 上下共两卷。
Java 领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),
与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。
第10版根据Java SE 8全面更新,同时修正了第9版中的不足,
系统全面讲解了Java语言的核 心概念、语法、重要特性和开发方法,包含大量案例,实践性强。
—— 豆瓣读书
电子教程
Oracle 官方教程
易百教程 菜鸟教程 W3CSchool 教程
Google Java 编程风格指南
API 文档
官方英文文档
开源中国中文文档 (JDK7u4)
关于
本节内容转自耗子编写的《我的世界开发者中文指南》,有删改。
第二节 Bukkit插件开发
出于对教学质量和学习效率的考量,我们决定不直接提供 Bukkit 插件开发的教学,取而代之的是我们推荐的高质量教材:
官方教程
新版本(现Spigot)
旧版本(原Bukkit)
Spigot 官方论坛插件开发讨论版块
国内优秀教程
tdiant 编写的 BukkitDevelopmentNote
如何自定义你的实体
ItemMeta 使用教程
Forge 与 Bukkit / Sponge 之间的通信
ProtocolLib 教程
API 文档
官方英文文档
中文文档
关于
本节内容转自耗子编写的《我的世界开发者中文指南》,有删改。
第三节 Sponge 插件开发
出于对教学质量和学习效率的考量,我们决定不直接提供 Sponge 插件开发的教学,取而代之的是我们推荐的高质量教材:
Sponge 官方教程(含中文)
Sponge 官方 API 文档
Sponge 官方论坛 和 网站
关于
本节内容转自耗子编写的《我的世界开发者中文指南》,有删改。
第四节 Forge 模组开发
出于对教学质量和学习效率的考量,我们决定不直接提供 Bukkit 插件开发的教学,取而代之的是我们推荐的高质量教材:
国内优秀教程
[1.8.9] zzzz 模组开发教程
[1.12.2] 先驱者 Forge模组开发指南
[1.3.2-1.14.4] 原版 / FML CoreMod 开发教程 ( Github Gitbook Gitee )
[1.11.2] ChinaCraft2代码详解——大型模组开发笔记 (Github)
[1.8.9-1.7.2] 风之工坊(当风过时的博客)
zzzz 的博客
浅析1.13世界生成
雪崩式的灾难:严重滞后的世界生成
Minecraft 模组开发知乎专栏
国外优秀教程
[1.13.2-1.12.2] Suppergerrie2 模组开发教程
[1.12-1.9.4] McJty 模组开发教程
如何用 Kotlin 开发模组
Minecraft 官方论坛模组开发讨论版块
Forge 官方论坛模组开发讨论版块
Forge 官方论坛模组开发教程版块
API 文档
Forge 官方中文文档
Forge 官方英文文档
关于
本节内容转自耗子编写的《我的世界开发者中文指南》,有删改。