Tag

Paper

paper.yml按世界单独配置

Minecraft

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

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

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

默认配置为

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

多世界的配置为

yaml
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的开启 & 配置

Minecraft

官方文档

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 设置项

默认的配置如下

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

bash
# 这里以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 报错

Minecraft

问题特征

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

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

log
[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线程开始打印线程转储的毫秒数

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