Tag

配置

Mirai设置设备信息

本教程对应的是V2的设备信息,若你在 device.json 中看到 "deviceInfoVersion": 2 ,那么你用的就是V2的设备信息

下面是一份默认的"随机"生成的设备信息,可以很明显的看出,这是一个野生的机器人

{
  "deviceInfoVersion": 2,
  "data": {
    "display": "MIRAI.524848.001",
    "product": "mirai",
    "device": "mirai",
    "board": "mirai",
    "brand": "mamoe",
    "model": "mirai",
    "bootloader": "unknown",
    "fingerprint": "mamoe/mirai/mirai:10/MIRAI.200122.001/7868854:user/release-keys",
    "bootId": "16FD34B2-AD5D-469D-8535-C6C6859DB3DB",
    "procVersion": "Linux version 3.0.31-7nHaGuio ([email protected])",
    "baseBand": "",
    "version": {
      "incremental": "5891938",
      "release": "10",
      "codename": "REL"
    },
    "simInfo": "T-Mobile",
    "osType": "android",
    "macAddress": "02:00:00:00:00:00",
    "wifiBSSID": "02:00:00:00:00:00",
    "wifiSSID": "<unknown ssid>",
    "imsiMd5": "947794dd7c61f984994e89de00b2ba75",
    "imei": "950450581801049",
    "apn": "wifi"
  }
}

如果不知道对应的参数表示什么,编也编不出来。所以我直接不编,拿个旧手机用旧手机的设备信息

设置adb环境

首先需要adb,下载地址:https://dl.google.com/android/repository/platform-tools-latest-windows.zip

下载之后解压,完成之后应该是如图的样式

然后打开cmd

  1. 在adb的文件夹中(这个文件夹中必须包含adb.exe)按住shift然后右键空白处(不要点文件)
  2. 点击 在此处打开 powershell 窗口
  3. 在窗口中输入cmd

连接设备(手机平板均可)

这里我用旧平板做演示

启用开发者选项和USB调试

连接并开启USB调试

使用adb获取设备信息

此时我们已经成功将设备连接至pc

下面的表格是每个信息的获取指令,使用方式如图

因为设备制造厂商不同,以下内容可能会有不同的,可以使用 adb shell getprop 获取所有属性,然后自行寻找对应的属性

信息

对应指令

display

adb shell getprop ro.build.id

product

adb shell getprop ro.build.product

device

adb shell getprop ro.vendor.product.device

board

adb shell getprop ro.product.board

brand

adb shell getprop ro.product.brand

model

adb shell getprop ro.product.model

fingerprint

adb shell getprop ro.vendor.build.fingerprint

procVersion

adb shell getprop cat /proc/version

除了表格中的内容,还有一些内容可以自己编的

macAddress:按照原有个格式,将里面的数字和字母替换(可用字符 0123456789abcdef)

wifiBSSID:同上,乱写就可以

wifiSSID:写WIFI名字,也可以乱写一个

到此设备信息就编好了

win10部署MySql5.7并修改密码

下载

https://downloads.mysql.com/archives/community/

下载完成后解压到自己想安装到的文件夹

这里我使用的是 D:\app\MySql

配置

在此文件夹下新建 my.ini 文件

这里贴出我的配置文件

[mysqld]
port=3306
basedir=D:/app/MySql
datadir=D:/appData/MySql
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
default-character-set=utf8

详细解释见中文文档 https://www.mysqlzh.com/doc/13/78.html

设置Path

  1. 此电脑右键 属性
  2. 点击 高级系统设置
  3. 点击 环境变量
  4. 在系统变量中找到Path
  5. 点击编辑
  6. 点击右侧的新建
  7. 输入 D:\app\MySql\bin (这里写自己的安装位置\bin)
  8. 一路确定退出

初始化

  1. win + R 打开运行
  2. 在运行中输入 cmd 并回车
  3. 在cmd中进入mysql文件夹
# 进入mysql文件夹的bin目录
d:
cd app\MySql\bin

# 安装
mysqld install

# 初始化数据文件夹
mysqld --initialize --console
# 执行完成后会给出初始密码(看起来像乱码的那串字符串), 记下来, 后面登录需要用

# 启动
net start mysql

进入MySql

在cmd中输入 mysql -u root -p

根据提示输入密码(上面初始化的时候给你的密码)

输入密码 输入密码 登录完成 登录完成

修改密码

-- 选择数据库
use mysql;
-- 更新密码
update user set authentication_string=password('新密码') where user='root' and Host='localhost';
-- 刷新权限
flush privileges;

use mysql; 失败报错则使用

-- 修改密码
alter user user() identified by '密码';
-- 退出重进
exit

Linux环境变量设置完没有改变

我自己的服务器用的是Centos7, 最近设置环境变量的时候发现设置完source之后PATH居然没有变化

# 修改环境变量(我是写在文件最前面的)
vim /etc/profile

刷新环境变量

source /etc/profile

然后在profile里面设置完环境变量的地方echo了一下, 发现输出的PATH是正确的

经过排查之后发现

/etc/profile.d 里面有一个 mysql.sh

PATH=/usr/local/src/openJDK/bin:/usr/local/src/node/bin:/home/mysql/mysql/bin:/usr/local/src/ffmpeg:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/mysql/mysql/bin

怪不得PATH总是改完没反应

这里将它重命名为 mysql.sh.bak , 再source刷新之后, PATH就正确了

Gradle设置阿里云镜像源

Gradle设置

首先找到Gradle的用户目录,默认情况下在 C:\Users\你的用户名\.gradle

如果设置了 GRADLE_HOME 环境变量的话就是你设置的目录

找到家目录中的 init.gradle 文件,如果没有就新建一个

在其中添加如下代码

buildscript {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repositories/jcenter'
        }
    }
}

allprojects {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repositories/jcenter'
        }
    }
}

仓库名

简介

实际地址

使用地址

jcenter

JFrog公司提供的仓库

http://jcenter.bintray.com

https://maven.aliyun.com/repository/jcenter
https://maven.aliyun.com/nexus/content/repositories/jcenter

mavenLocal

本台电脑上的仓库

{USER_HOME}/.m2/repository

C:/Users/{USER_NAME}/.m2/repository (Windows)
/home/{USER_NAME}/.m2/repository (Linux)

mavenCentral

Sonatype公司提供的中央库

http://central.maven.org/maven2

https://maven.aliyun.com/repository/central
https://maven.aliyun.com/nexus/content/repositories/central

google

Google公司提供的仓库

https://maven.google.com

https://maven.aliyun.com/repository/google
https://maven.aliyun.com/nexus/content/repositories/google
https://dl.google.com/dl/android/maven2

jitpack

JitPack提供的仓库

https://jitpack.io

https://jitpack.io

public

jcenter和mavenCentral的聚合仓库

https://maven.aliyun.com/repository/public
https://maven.aliyun.com/nexus/content/groups/public

gradle-plugin

Gradle插件仓库

https://plugins.gradle.org/m2

https://maven.aliyun.com/repository/gradle-plugin
https://maven.aliyun.com/nexus/content/repositories/gradle-plugin

paper.yml按世界单独配置

paper.yml中的设置很丰富,可设置的项目非常多,但是有一点可能很少有人知道,那就是这些功能可以按世界单独设置。paper.ymlworld-settings下的所有的选项都可以按世界单独设置(但是一些项目只在特定的世界有效,比如末影龙相关的设置只在末地有效)

默认在world-settings下有default项,这一项的意思是默认配置,如果没有其他的配置覆盖他,那么paper将会以default下的配置项进行运作

只有 world-settings.default 下的项目才可以按世界单独配置,不在其中的项目是不可以单独设置的

默认配置为

world-settings:
  default:
    grass-spread-tick-rate: 1
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...

多世界的配置为

world-settings:
  # 默认配置
  default:
    grass-spread-tick-rate: 1
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...
  # 下界的单独设置,在下界会覆盖default的设置
  # 没有在此处设置的会沿用default
  world_nether:
    grass-spread-tick-rate: 2
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...
  # 末地的单独设置,在下界会覆盖default的设置
  # 没有在此处设置的会沿用default
  world_the_end:
    grass-spread-tick-rate: 3
    seed-based-feature-search: true
    seed-based-feature-search-loads-chunks: true
    ...: ...
    ....: ...

Paper反矿透anti-xray的开启 & 配置

官方文档

paper自带一个反透视的功能,相比较插件的反矿透,优化做的较好

此功能只有paper和基于paper的服务端核心才有(如果服务端没有paper.yml配置文件那就是不支持,bukkit,spigot,forge,fabric是没有的)

高版本paper核心的配置文件在 服务端文件夹/config 文件夹下

原理大概是通过给客户端发送虚假的数据包,使得平常不可见的方块在客户端上的数据并不是真实的数据,使用一些“工具”的客户端看到的这些方块也就不是真实的方块了

以下的解释参考自paper官方文档:https://paper.readthedocs.io/en/latest/server/configuration.html

以及:https://gist.github.com/stonar96/ba18568bd91e5afd590e8038d14e245e

启用

打开 服务端文件夹/paper.yml 找到 anti-xray 设置项

默认的配置如下

低版本的配置文件有所不同是正常情况

# 这里以1.17版本的配置文件为示例解释每个配置项的含义
# 如果不同版本有差异属于正常情况
anti-xray:
  # 是否启用 true -> 启用
  enabled: false
  # 引擎模式
  # 1是用石头替换下面列表里面的方块
  # 2是用随机方块替换所有方块
  # 这里的方块指的是玩家看不到的,没有裸露在外的方块
  engine-mode: 1
  # 设置隐藏矿石的最大高度
  # 需要填写16的倍数,其他值将向下舍入为16的倍数
  # 在此高度以下的方块将会按对应的模式进行反矿透
  max-block-height: 64
  # 方块更新的半径, 当一个方块被更新时, 客户端的方块也会随之更新
  # 有效值:0, 1, 2
  # 大于2的默认为2, 小于0的默认为0
  # 不要使用0, 这只是一种测试模式
  update-radius: 2
  # 是否混淆接触熔岩的方块
  lava-obscures: false
  # 是否允许有paper.antixray.bypass权限的玩家绕过反矿透
  use-permission: false
  # 在引擎模式1中要隐藏的方块列表
  # 一些方块可能需要手动添加
  # 注意: 此列表使用的是原版方块名称而不是bukkit方块名称。
  hidden-blocks:
    - copper_ore
    - deepslate_copper_ore
    - gold_ore
    - deepslate_gold_ore
    - iron_ore
    - deepslate_iron_ore
    - coal_ore
    - deepslate_coal_ore
    - lapis_ore
    - deepslate_lapis_ore
    - mossy_cobblestone
    - obsidian
    - chest
    - diamond_ore
    - deepslate_diamond_ore
    - redstone_ore
    - deepslate_redstone_ore
    - clay
    - emerald_ore
    - deepslate_emerald_ore
    - ender_chest
  # 在引擎模式2中应该替换的方块列表
  # 一些方块可能需要手动添加
  # 注意: 此列表使用的是原版方块名称而不是bukkit方块名称。
  replacement-blocks:
    - stone
    - oak_planks

这里将 enable: false 改成 enable: true 以启用反矿透

配置详细解释

enabled

解释:是否启用

允许的值:true / false

engine-mode

解释:反矿透的运作方式

模式1:根据世界类型用石头、地狱岩或末地石替换指定的矿石(通过发送经过修改的数据包,性能消耗较模式2相比较小)

模式2:在向客户端发送块数据包时随机放置指定的假矿(性能消耗较模式1相比较大)

允许的值:1 / 2

抗 X 射线模式 图片来源于 https://gist.github.com/stonar96/ba18568bd91e5afd590e8038d14e245e

模式1计算量较小,但模式2可以更好地反矿透。在模式1中,只有完全被不透明方块覆盖的矿石才能被隐藏。这意味着暴露在空气中的矿石仍然可见。在模式2中,假矿石中会遮挡这些矿石,并且添加假空气

max-block-height

解释:反矿透的运作范围,可以写128

允许的值:16的倍数,其他值将向下舍入为 16 的倍数

注:低版本的配置与上述不同,填写的是max-chunk-section-index,规则是 (填写的数值 + 1) * 16。大于 15 的 max-chunk-section-index 默认为 15。小于 0 的 max-chunk-section-index 没有意义。

update-radius

解释:方块更新的半径, 当一个方块被更新时, 客户端的方块也会随之更新

允许的值:0 / 1 / 2 (大于2的默认为2, 小于0的默认为0)

注:不要使用0, 0是一种测试模式,如没有需要请不要修改

lava-obscures

解释:是否混淆接触熔岩的方块,可以写true

允许的值:true / false

use-permission

解释:是否允许有paper.antixray.bypass权限的玩家绕过反矿透,可以写false

允许的值:true / false

hidden-blocks

解释:在引擎模式1中要隐藏的方块列表, 一些方块可能需要手动添加(例如下界的矿石)

注:此列表使用的是原版方块名称而不是bukkit方块名称。

replacement-blocks

解释:在引擎模式2中应该替换的方块列表, 一些方块可能需要手动添加

注:此列表使用的是原版方块名称而不是bukkit方块名称。

ps

按世界单独配置

Paper Watchdog 报错

问题特征

使用paper及其分支核心,服务端长时间无响应时会由Watchdog打印线程转储信息

特征是有很长的一串报错,开头如下

[Paper Watchdog Thread/ERROR]: --- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - git-Paper-xxx (MC: 1.1x.x) ---
[Paper Watchdog Thread/ERROR]: The server has not responded for 10 seconds! Creating thread dump

中间会出现多个类似以下结构的报错

[Paper Watchdog Thread/ERROR]: ------------------------------
[Paper Watchdog Thread/ERROR]: Current Thread: Timer hack thread
[Paper Watchdog Thread/ERROR]: 	PID: x | Suspended: false | Native: false | State: TIMED_WAITING
[Paper Watchdog Thread/ERROR]: 	Stack:
[Paper Watchdog Thread/ERROR]: 		xxxx.xxxx.xxxxxx.xxxxx(xxxx xxxx)
[Paper Watchdog Thread/ERROR]: ------------------------------

最后会进行插件和存档的保存消息,并且不会退出服务端的进程(会导致自动重启脚本失效)

这是由于服务端的进程未响应的时长超出了设置的限制,导致Watchdog打印线程转储信息并自动保存关闭

可能的导致原因

  • 某些插件的代码有bug导致主线程进入死循环
  • 粘液科技之类的插件
  • 玩家做的红石机器造成了过大的卡顿
  • 服务器配置太差

解决办法

寻找卡服根源

可以安装spark插件(指令教程),查看占用分析

自行寻找(可以二分法删插件),多看看日志可能有所帮助

升级硬件

大部分时候是升级CPU,cpu选择优先考虑单核水平,可以百度cpu天梯图查看单核排名

和多分配内存(分配过多内存并没有作用,多分配内存只是为了减小gc压力,cpu速度不够的时候并不能靠多分内存弥补)

修改watchdog的限制

治标不治本,该卡还会卡,仅在某些特殊情况(如预加载地图)下使用

找到 服务端文件夹/paper.yml (高版本在 服务端文件夹/config/paper-global.yml ),打开并找到以下选项

watchdog: early-warning-every: 5000 early-warning-delay: 10000

  • early-warning-every: 服务器无响应时打印线程转储之间的间隔(以毫秒为单位)
  • early-warning-delay: 服务器无响应后距离watchdog线程开始打印线程转储的毫秒数

将两个值改成你要的数值即可,注意单位是毫秒

腾讯云域名添加子域名解析

进入DNSPod控制台,找到 我的域名

点击添加记录

比如这里我要设置我的域名e404.top的子域名www.e404.top

主机记录就写www,类型就是A,其他都默认即可

填写完成之后点击确认

崩溃&启动失败的日志/崩溃报告解析

日志

日志位于

  • 客户端:客户端文件夹/.minecraft/logs
  • 服务端:服务端文件夹/logs

文件夹中,最后一次启动的日志是 latest.log ,每当服务端启动时,旧的 latest.log 会被压缩到 年-月-日-次数.log.gz 文件中

如果你的启动脚本是带有自动重启的,并且你没有在它开始重启之前关闭它,那么 latest.log 就会被压缩到gz文件中

此时你需要找到对应的gz文件,使用解压缩软件查看其中的log文件

log文件可以直接用文本文档打开,通常有问题的日志应该从后往前看

崩溃报告

日志位于

  • 客户端:客户端文件夹/.minecraft/crash-reports
  • 服务端:服务端文件夹/crash-reports

文件夹中,崩溃报告的命名格式是 crash-年-月-日_时.分.秒-服务端/客户端.txt

崩溃报告中通常会带有

  • 崩溃原因的描述
  • 导致崩溃的报错
  • 崩溃时运算的实体
  • 服务器的存档信息
  • 服务器的版本
  • 服务器的JVM信息
  • 服务器的系统信息
  • MOD列表(mod服)

以下是一些常见的问题

mod前置未安装

Mod §eMOD名字§r requires §6前置名字§r §o前置版本 or above§r§7Currently, §6前置名字§r§7 is §o§nnot installed

解决办法:安装对应版本的前置

mod前置版本不合要求

Mod §e`MOD名字`§r requires §6`前置名字`§r §o需要的`前置版本` or above, and below `` 需要的`前置版本` ``§r§7Currently, §6`` `前置名字` ``xx§r§7 is §o当前`` 的`前置版本` ``

解决办法:安装对应版本的前置

DDNS教程

此教程需要花钱购买一个域名,腾讯云,阿里云等服务商均提供此服务且价格并不贵

购买域名的教程此处就不放了,以下的教程需要有域名

申请公网ip

首先移动用户可以关闭此教程了,移动的公网ip极难申请

联通和电信用户可以打电话给运营商要一个动态公网ip,如果问用来做什么的话可以说装监控

我就是电信用户,一个电话搞定

光猫改桥接

同样是打电话给运营商,让运营商把自己的光猫模式改成桥接

获取密钥

这里我是使用的腾讯云,就以腾讯云的控制台举例

首先进入腾讯云的控制台 https://console.dnspod.cn/

查看图片

进入DNSPod Token界面,如果没有密钥的新建一个

创建后拿到id和token

保存好id和token,不要泄露给不信任的人

使用DDNS程序动态解析ip到域名

这里我使用的是DDNS-GO https://github.com/jeessy2/ddns-go

 GitHub

jeessy2/ddns-go

在release界面中选择最新的适合你操作系统的构建并下载 https://github.com/jeessy2/ddns-go/releases

按照README.md中的使用教程启动之后,通过浏览器进入其设置界面

在此处填入之前保存的id和token 在此处填入之前保存的id和token 在IPV4下设置你要解析的域名 在IPV4下设置你要解析的域名

在IPV4下的Domains中填写你要解析的域名(如果是子域名需要自行添加域名解析,见/blog/腾讯云域名添加子域名解析/

IPV6按需设置,没有的不填

设置完成后点击最下方的SAVE

点击保存 点击保存

管理端口映射

此时我们已经可以通过域名访问我们的ip了,但是一般我们的网络和公网直接还隔了一个路由器

这里以华为的路由器为例

打开NAT服务 打开NAT服务

这里假设我的电脑上开了一个mc的服务端,使用25565端口,我要把它映射到公网ip的25565上

这里注意设备不要选错了,要选择对应的设备

设置映射 设置映射

保存之后就可以从外网连接了(如果连接不了的话请自行检查机器的防火墙)

注意

  1. ddns-go进程将会每隔一段时间检测一次ip变动,并在变动后更新域名对应的ip
  2. 根据解析端的dns不同,刷新时间会有出入,这里建议将dns设置为 119.29.29.29223.5.5.5
  3. 保持ddns-go的进程开启,不要关闭(linux可以使用screen)

MinecraftMOD服安装/配置MOD

找mod

mod一般发布在curseforge上 https://www.curseforge.com/minecraft/modpacks (此网站国内不墙,但是访问需要过人机验证)

国内找mod推荐mc百科 https://www.mcmod.cn/modlist.html mod搬运较多;相比mcbbs的mod板块多了搜索功能,搜索功能完善,筛选条件够多,并且介绍/物品/教程都较全,格式规范;但是更新会有延迟,下载并不是都有,一般是找到mod之后通过其中的连接跳转到cursegorge下载最新版

mcbbs的mod板块 https://www.mcbbs.net/forum-mod-1.html

安装mod

首先分清楚客户端mod和服务端mod(mc百科的介绍界面有标注)

客户端mod是只在客户端生效的mod,在服务端毫无作用还有极大几率在启动时出错导致崩溃

一般添加了汉化,特效,修改了渲染等的mod就是服务端mod

例如小地图,optifine高清修复,血条,jei等

服务端mod分为纯服务端使用的服务端mod和客户端和服务端都使用的服务端mod

一般添加了新物品,新生物,新游戏机制的就是服务端mod

例如暮色森林,匠魂,工业等

纯服务端mod一般是指在服务端生效,且不需要客户端安装的mod(客户端可装可不装)

纯服务端mod比较少见,除非mod发布页面写了只需要服务端安装,否则都按服务端mod处理

例如平坦基岩生成

将mod加入mods文件夹 服务端文件夹/mods 然后重启服务端

配置mod

更新mod

如果mod作者没有注明需要操作什么,一般就是将旧的mod的Jar删除后将新的mod的Jar放进mods文件夹

汉化mod

mod的jar文件使用压缩软件打开,找到 assets/mod名字/lang 文件夹,其中会有一个或多个json文件,如果缺少zh_cn.json的话这个mod就无法显示中文的内容

此操作需要在客户端/服务端关闭的情况下进行

此时可以到网上找找有没有mod的汉化,如果没有并且想要自己汉化mod的可以将en_us.json复制一份出来,将其中的 "xxxx.xxx.xx": "yyyyyyyyyyyy" 格式的一段中的yyyyyyyyyyyy内容替换成中文内容,注意不要有json语法错误

推荐使用vscode并且安装json插件进行编辑

替换完成后保存并关闭,将此文件命名为zh_cn.json,然后放进上面在mod的Jar文件中找到汉化文件的文件夹中

此方法也可用于汉化光影包

Minecraft服务端配置文件

server.properties

这个文件是所有服务端(上面列出的主流服务端)都会生成的一个配置文件,位于核心Jar文件同级目录中

一些基础的参数需要在此文件中设置,下面会列出一些常用参数的用法(以1.16的为参考)

  1. allow-flight=false 允许玩家在安装添加飞行功能的mod前提下在生存模式下飞行
  2. allow-nether=true 允许玩家进入下界
  3. difficulty=easy 定义服务器的游戏难度
  4. enable-command-block=false 是否启用命令方块
  5. level-seed= 种子
  6. level-type=default 地图所生成的类型 default:标准的世界 flat:超平坦 largebiomes:巨大生物群系
  7. max-players=20 最大玩家数量
  8. max-tick-time=60000 最大刻时长,单位毫秒,当一个游戏刻的时长超过此数值后游戏会强行停止并崩溃(paper会保存存档、插件数据),设置为-1以禁用
  9. motd=A Minecraft Server 多人游戏界面服务器的信息
  10. online-mode=true 在线模式,设置为false允许离线模式的玩家进入服务器
  11. pvp=true 玩家pvp
  12. server-ip= 服务器ip,如果你不是清楚地知道你在改什么,让它留空,不要动它
  13. server-port=25565 服务器端口,如果你要开两个服务端或者有其他程序占用了25565端口的话可以自行修改
  14. view-distance=10 服务端视距,如果卡顿的话可以减小该值,可以设置为6
  15. white-list=false 白名单,如果开启,没有添加过白名单的玩家将会无法进入服务器,如果是离线模式的服务器,添加白名单的玩家必须进入过服务器,否则即使添加了白名单,此玩家也无法进入服务器(离线服务器建议用插件或mod实现白名单)

未列出的内容见 https://minecraft.fandom.com/zh/wiki/Server.properties#Java.E7.89.88_3

bukkit.yml

基于bukkit的服务端会生成此文件,位于核心Jar文件同级目录中

配置参考wiki(英文) https://bukkit.gamepedia.com/Bukkit.yml

spigot.yml

基于spigot的服务端会生成此文件,位于核心Jar文件同级目录中

配置参考wiki(英文) https://www.spigotmc.org/wiki/spigot-configuration/

paper.yml

基于paper的服务端会生成此文件,位于核心Jar文件同级目录中

参考wiki(英文) https://paper.readthedocs.io/en/latest/server/configuration.html

中文参考

以上文件的部分内容汉化+优化参考 https://www.mcbbs.net/thread-478126-1-1.html

插件配置

插件的配置文件一般都会生成在plugins文件夹中的插件同名文件夹内

一般使用yml文件作为配置文件,具体配置方法看插件发布贴作者的说明

yml文件可以直接用文本文档打开,但是没有语法高亮,推荐使用vscode并添加yaml插件

yml语法 https://www.runoob.com/w3cnote/yaml-intro.html (推荐小白看一看,只要了解基础的语法即可)

如果reload时配置文件有语法错误,后台会报一长串错误,并且指令的返回消息可能不会正常显示

mod配置

mod的配置一般在config文件夹中的mod名开头的文件/文件夹中,1.12前文件格式为cfg,之后为toml

一般文件中会有英文注释,如果看不懂不要乱改(先去机翻

这两种文件都可以直接用文本文档打开,但是没有语法高亮,推荐使用vscode并添加对应插件

Minecraft服务端搭建与运行

安装Java

开服需要安装Java (64位机器装64位Java)

安装Java教程

获取核心

首先选择自己要使用的核心和游戏版本

新建一个文件夹,确保其路径没有中文

下载核心后移动到此文件夹

此处注意,forge和fabric的核心是需要通过安装获得的,其他核心大多是一个单独的Jar文件,会自动下载需要的lib文件

移动核心时

  • forge请连着 libraries 文件夹一起
  • fabric请连着 .fabric.fabric-installer 两个文件夹一起

启动

官服的jar文件可以双击打开,但是其他的核心据我所知均需要使用开服脚本,开服脚本教程

现在的文件夹中应该有核心和启动脚本两个文件

win双击start.bat启动服务器,linux在命令行中输入./start.sh (无法执行的看脚本教程中的添加权限)

启动之后如果是没有自动重启的脚本会一闪然后关闭,此时文件夹中会自动生成 eula.txt

打开 eula.txt ,将其中的 false 改成 true (注意不要打错单词),保存并关闭

此时再启动脚本,服务端会正常启动

Minecraft开服脚本

总是有人不看完就跑来问我,所以把常见问题及其解决办法放到最上面

常见问题

Unrecognized VM option 'xxx'

这里是你使用的开服脚本中的某个参数,不被你的Java接受

xxx可能是 +AggressiveOpts 也可能是 +UseCompressedOops 或者是你启动脚本中的其他不被接受的参数

解决办法:

将开服脚本中的包含xxx的那一段参数删除

Unrecognized VM option '+AggressiveOpts' 就删除 -XX:+AggressiveOpts

Unrecognized VM option ' +UseCompressedOops ' 就删除 -XX:+UseCompressedOops

Could not reserve enough space for object heap

设置了过大的内存

解决办法:

将开服脚本中的内存调小(注意,32位java的可用内存受限制,只能使用最大1.4G到1.6G的内存,解决办法是更换64位的Java)

将参数换成 -Xmx1G -Xms1G

内存分配一般是给系统所有可用内存大小的2/3(给系统和其他应用留出空间),如果你电脑的内存低于1G,就不要想着开服了

页面文件太小,无法完成操作

设置了过大的内存

解决办法:

将开服脚本中的内存调小(注意,32位java的可用内存受限制,只能使用最大1.4G到1.6G的内存,解决办法是更换64位的Java)

将参数换成 -Xmx1G -Xms1G

内存分配一般是给系统所有可用内存大小的2/3(给系统和其他应用留出空间),如果你电脑的内存低于1G,就不要想着开服了

1.17及以后版本使用了低于Java16的Java

Forge的报错 Forge的报错 Fabric的报错 Fabric的报错 Paper的报错 Paper的报错 Spigot的报错 Spigot的报错

只要出现了以上图片中类似的报错,就意味着你需要使用Java16

解决办法:(二选一)

  1. 在启动脚本中指定Java路径(推荐)(方法见上面指定Java的脚本)
  2. 卸载其他版本的Java,只留Java16(不推荐)

1.16及以前版本使用了高于(包括)Java16的Java

只要出现了以上图片中类似的报错,就意味着你需要使用Java16之前的版本(不包括Java16,Java8/11等LTS版本都是不错的选择)

解决办法:(二选一)

  1. 在启动脚本中指定Java路径(推荐)(方法见上面指定Java的脚本)
  2. 卸载其他版本的Java,只留Java8/11(不推荐)

注意

本教程中均以server.jar作为核心名字,实际使用时请手动改成你的服务端核心jar名字

开服需要安装Java (64位机器装64位Java)

安装Java教程

通用

开服所用的指令就一条,一般是java开头的那一条,其他部分都是起辅助作用的,比如设置cmd窗口标题、自动重启等

这里拿一个典型的开服指令举例 java -Xmx2G -Xms2G -jar server.jar nogui

这里的 server.jar 是示例,实际使用时请手动改成核心jar的名字

Java

橙色字 java 意为使用可执行文件java,一般java需要在path中(设置path linux win),如果需要指定使用的java的话需要修改path中的java或者使用绝对路径

脚本使用绝对路径指定使用的java(点击展开)

以下的红字为修改的内容
如果你已经有开服命令了,只需要单独替换开头的 java

windows
假设java路径位于 C:\Program Files\Java\jdk1.8.0_301\bin\java
一般的脚本 java -Xmx2G -Xms2G -jar server.jar nogui
需要改为 "C:\Program Files\Java\jdk1.8.0_301\bin\java" -Xmx2G -Xms2G -jar server.jar nogui
linux(不知道是啥的不需要看)
假设java路径位于 /usr/local/jdk1.8.0_301/bin/java
一般的脚本 java -Xmx2G -Xms2G -jar server.jar nogui
需要改为 /usr/local/jdk1.8.0_301/bin/java -Xmx2G -Xms2G -jar server.jar nogui

JVM参数

红色字 -Xmx2G -Xms2g -jar 是jvm参数

设置jvm参数是开服非常重要的一环,使用的最大内存,最小内存,优化参数等都是jvm参数

-Xmx2G 设置最大可用内存为2G,这里红字的2G可以替换成其他内存大小,单位除了G之外可以用M,例如 -Xmx256M

-Xms2G 设置初始内存为2G,这里红字的2G可以替换成其他内存大小,单位除了G之外可以用M,例如 -Xms256M

-jar 意为通过jar文件启动,后面需要接文件名字,如果后面接的jar文件名字错误或者jar文件损坏则会报错

其他优化参数见 https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

MC服务端参数

紫色字 nogui 意为不显示mc自带的ui界面,不管是否添加此参数,服务端始终会将日志输出至命令行

自带的UI界面效果如下(下图是paper的,和原版略有区别)

Windows

创建脚本

在服务端文件夹新建一个txt文件,将其改名为start.bat

若文件没有显示默认的txt扩展名

编辑脚本

右键bat文件,点击编辑

打开后输入下方的开服代码

如果是新建的脚本,文件>另存为 下方的编码选择ANSI,否则中文会乱码,保存

WIN脚本示例

@ECHO OFF
@REM 作者404E
set a=0
echo ------------------------------------------------------------------
echo --                                                              --
echo --                           正在启动                           --
echo --                                                              --
echo ------------------------------------------------------------------
:start
set b = %date:~0,4%.%date:~5,2%.%date:~8,2% %time:~0,2%:%time:~3,2%:%date:~8,2%
title 服务端 重启%a%次 上次重启于%b%
set date1=%date:~0,4%%date:~5,2%%date:~8,2%
set time1=%time:~0,2%%time:~3,2%%time:~6,2%
java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar server.jar nogui
set date2=%date:~0,4%%date:~5,2%%date:~8,2%
set /a c=%time:~0,2%%time:~3,2%%time:~6,2% - %time1%
if %c% LEQ 1 (
    if %date2% == %date1% (
        echo ------------------------------------------------------------------
        echo --                                                              --
        echo --                  :( 启动异常,请检查启动参数                  --
        echo --                  或者咨询其他人,按任意键退出                 --
        echo --                                                              --
        echo ------------------------------------------------------------------
        pause>null
        exit
    )
)
set /a a=%a%+1
echo ------------------------------------------------------------------
echo --                                                              --
echo --                       将在3秒后自动重启                      --
echo --                       按任意键跳过等待                       --
echo --                      或者直接关闭服务端                      --
echo --                                                              --
echo ------------------------------------------------------------------
timeout /T 3
goto start

以上是我用的脚本,优化参数 https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

Linux步骤

创建&编辑脚本

vi start.sh

按i或insert键进入编辑模式

输入下方示例的中的脚本代码

按esc,输入:wq保存

给予可执行权限

使用 sudo chmod +x start.sh 给脚本添加可执行权限(root用户可不加sudo,直接使用chmod)

脚本示例

#!/bin/bash
#作者404E
echo '------------------------------------------------------------------'
echo '-                                                                -'
echo '-                         开始启动服务端                         -'
echo '-                                                                -'
echo '------------------------------------------------------------------'
while true;
do
    java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar server.jar nogui
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                       服务器将在3秒后重启                      -'
    echo '-                     按 ctrl + c 停止服务端                     -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
    for i in $(seq 3 -1 1)
    do
        echo -n "·"
        sleep 1s
    done
    echo ''
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                         开始重启服务端                         -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
done

以上是我用的脚本,优化参数 https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

重启时自动备份的脚本

#!/bin/bash
#作者404E
echo '------------------------------------------------------------------'
echo '-                                                                -'
echo '-                         开始启动服务端                         -'
echo '-                                                                -'
echo '------------------------------------------------------------------'
while true;
do
    java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar server.jar nogui
    # 备份
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                     服务器将在3秒后开始备份                    -'
    echo '-                     按 ctrl + c 停止服务端                     -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
    for i in $(seq 3 -1 1)
    do
    echo -n "·"
    sleep 1s
    done
    # 备份保留个数
    c=5
    if [ ! -d "backup" ];then
    mkdir backup
    fi
    rm -rf backup/$c.tar.gz
    for((i=$c;i>0;i--));
    do if [ -f "backup/"$i".tar.gz" ];then
    mv backup/$i.tar.gz backup/`expr $i + 1`.tar.gz
    fi done
    # 创建备份指令,可自行添加文件夹(将#去掉)
    tar -zcf backup/1.tar.gz world #world_nether world_the_end
    # 备份结束
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                  备份完成  服务器将在3秒后重启                 -'
    echo '-                     按 ctrl + c 停止服务端                     -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
    for i in $(seq 3 -1 1)
    do
        echo -n "·"
        sleep 1s
    done
    echo ''
    echo '------------------------------------------------------------------'
    echo '-                                                                -'
    echo '-                         开始重启服务端                         -'
    echo '-                                                                -'
    echo '------------------------------------------------------------------'
done

基于sakura frp的内网穿透

首先你要知道的事情有

  1. sakura frp需要花一块钱实名才能使用
  2. 默认是有带宽限制的(人数不多的话没影响)
  3. 目前能白嫖的节点较少(好用的服务器都被白嫖的占满了)
  4. vip不是必须,但是vip节点和更高的速度确实很香
  5. frp只需要开服或者是对局域网开放的那一方才需要下载使用

注册/登录 账号

在Sakura frp的官网注册 https://www.natfrp.com/

下载frp客户端

进入管理面板 https://www.natfrp.com/user/

点击进入软件下载并选择适合自己操作系统的客户端下载

下载的exe打开并且完成安装

客户端登录

在网页上的管理面板点击进入用户信息

访问密钥默认不显示,鼠标左键点击一次后显示。选中并复制

打开安装好的客户端

创建隧道

此时你应该知道你内网穿透的端口和协议

点击左侧的隧道并且在最上方找到加号,点击创建新隧道

进入隧道创建界面后需要填写的有

  1. 本地ip (如没有特殊情况写 127.0.0.1
  2. 端口 (MC Java服务端默认 25565;Java版客户端每次对局域网开放的端口都是随机的,需要自行填写;基岩版服务端默认 19132
  3. 隧道类型 (MC Java服务端默认 TCP,基岩版服务端默认 UDP
  4. 穿透节点 (选择离自己和联机的朋友都相对较近的区域的节点,最好选择多线的服务器)

其他选项

  1. 隧道名称:留空/自己命名
  2. 备注:同上
  3. 远程端口:可以自己自定义,但是大部分端口已经有人使用,所以大概率要试好几次才能找到一个没人用的端口,故推荐留空让服务器分配

完成后点击创建,弹出的界面询问是否继续创建选择否

开启隧道 & 查看地址

此时隧道虽然创建完毕,但是需要手动开启

手动开启隧道后在左侧找到日志选项,在最下面找到隧道的映射地址,首先自己测试连接正常后即可将地址给别人,让他通过此地址进行连接

此时内网穿透已经完成

注意 & 常见问题

内网穿透的服务器数量少:除非花钱买vip,用vip节点,否则无解,满了的服务器怎么给你用?

客户端对局域网开放关闭重新开之后连接不了:每次对局域网开放的端口都是随机的,需要重新创建隧道(或者使用联机mod设置端口为固定端口)

vip流量:只是放宽了带宽限制,对于人数不是非常多的服务器来说并没有必要,在默认的带宽限制下也是可以正常游玩的

使用内网穿透进入服务器的玩家地址都是127.0.0.1,绝对不要banip,会导致所有通过内网穿透进入服务器的玩家都无法进入服务器