最近简单研究了一下 Minecraft 服务端的实用插件,这些插件能在各个方面提高 MC 服务器的安全性和游玩体验。服务端的插件选择,以实用功能和服务安全为主。
我这里的服务端选择的是 Mohist
版本 1.20.2,可以结合 Forge
和 Bukkit/Spigot/Sponge
等不同的 Mod 和插件生态系统。插件主要通过 Bukkit/Spigot/Paper
插件的形式在服务端部署。部署方法也很方便,一般过程是寻找合适的插件 JAR 包,然后将其下载拷贝到服务端的 plugins
目录下,重启服务器后即可加载插件。
关于版本,插件版本尽量选择与服务端对应的版本。
一般第一次加载插件后,插件会在 plugins
目录下生成相关的配置和数据库文件,控制台也会有相应的日志提示。如果有错误,可以根据提示逐个排查,可能会需要补全一些配置或者数据库文件,这里就不一一赘述了。
这里主要记录一下配置文件的基本设置过程和一些插件的指令方法。
AuthMe
功能介绍:AuthMe
是 Minecraft 服务器端的一个插件,用于管理玩家认证和身份验证。该插件通常用于提供额外的玩家账户安全性,特别是在多人服务器环境中。
下载地址:https://github.com/AuthMe/AuthMeReloaded/releases/tag/5.6.0-beta2
编辑 AuthMe
的 config.yml
设置文件。
1cd ./plugins/AuthMe
2vim config.yml
编辑以下字段文件,在 vim 中可以用 /
加关键词定位查询:
1# 设置信息语言,改为中文
2 # Message language, available languages:
3 # https://github.com/AuthMe/AuthMeReloaded/blob/master/docs/translations.md
4 messagesLanguage: zhcn
5
6# 设置服务器名称
7 # The name of the server, used in some placeholders.
8 serverName: 木须柄
9
10# 设置昵称的最大最小长度,默认 3-16
11 # Minimum allowed username length
12 minNicknameLength: 3
13 # Maximum allowed username length
14 maxNicknameLength: 16
15
16# 设置登陆限制时间,默认 30 秒
17 # After how many seconds should players who fail to login or register
18 # be kicked? Set to 0 to disable.
19 timeout: 30
20
21# 设置昵称合法字符范围,加上中文字符
22 # Regex pattern of allowed characters in the player name.
23 allowedNicknameCharacters: '[a-zA-Z0-9\u4E00-\u9FA5_]*'
24
25# 关闭“您拥有多个账户”的提示
26 displayOtherAccounts: false
编辑 AuthMe
的 config.yml
设置文件,将其中的 displayOtherAccounts
设置为 false
即可。
第一次登陆服务器后,需要注册,输出账号密码。
1/register <password> <password>
之后登陆需要输入密码
1/login <password>
IpacWhitelist
功能介绍:带有许多功能的白名单插件. 标签: [白名单, 参观账户, Ban, AuthMe 集成, SQLite, 离线, 正版, Geyser]
下载地址:https://modrinth.com/plugin/ipacwhitelist
1# 数据库
2sql:
3 # 使 Name 大小写不敏感, 同时影响白名单和指令. 仅可在建表时修改
4 Name_COLLATE_NOCASE: true
5
6# 连接到其他插件, 修改此处需要重启服务器
7hook:
8 AuthMe: true
9
10# 白名单功能
11whitelist:
12 # 简易的 ip 黑名单. 在这里添加正则表达式, 匹配的ip不允许加入服务器 (也不允许使用参观账户
13 # 使用 /wl reload 重载配置即可应用
14 ip-blacklist: []
15# - '^192\.168\.100\..+$'
16# - '^fe80:🔢.+$' # ipv6没有方括号
17
18 # 限定玩家可以使用的用户名正则
19 name-rule: '^\.?[a-zA-Z0-9_]+$' # 白名单中的玩家
20 name-rule-visit: '^\.?[a-zA-Z0-9_]+$' # 参观账户
21
22 # 自动检查并处理出错的记录
23 # 比如添加玩家 UUID 后又添加了 NAME (此时产生两条记录), 当玩家登录时自动删除其中一条记录
24 autoClean:
25 enable: true
26 # 如果两条记录中的关键数据不一致, 比如记录1是白名单, 而记录2中是黑名单, 则将记录2中的数据迁移到记录1
27 dataByWeight: true
28
29 # 如果玩家在指定秒数内没上线过, 则视为不在白名单中. -1 = 禁用
30 # 参观账户不受此限制
31 timeout: -1 # 10368000 = 4个月
32
33 # 服务器启动完成后等待多少毫秒才能允许玩家加入
34 late-join-time: 4000 # 4秒
35
36 # 玩家因任何原因断开连接后需要等待多长时间才能再次加入 (毫秒
37 # 用于防止玩家在短时间内重复加入退出
38 playerDisconnectToReconnectMinTime: 2000
39
40
41# 参观账户
42# 参观账户允许不在白名单中的玩家加入服务器, 可以限制其功能
43visit:
44 # 如果开启, 不在白名单和移出白名单的玩家将会以参观账户的形式加入服务器. 白名单过期和封禁中的账户依然不可加入服务器
45 # 关闭可重载配置, 但开启它需要重启服务器
46 enable: false
47 # 最多允许同时加入多少参观账户
48 max-visit-player: 10
49
50 # 限定参观账户只能使用以下域名加入服务器, 否则提示不在白名单
51 limit-hostname:
52 enable: false
53 list:
54 - 'visit.your-mc-server.com:25565'
55 - 'visit2.your-mc-server.com:25565'
56
57 # 需要启用 hook.AuthMe
58 # 自动注册和登录都在运行完事件程序后运行
59 AuthMe:
60 autoRegisterPassword: 'your_password' # 需要在这里填写一个复杂的密码
61 autoRegister: true # 为参观账户自动注册, 相当于 `authme register <playerName> <password>`, 但不会踢出玩家
62 autoLogin: true # 为参观账户自动登录, 相当于 `/authme forcelogin <playerName>`
63
64# 玩家加入消息广播
65
66# 玩家加入
67 playerJoin:
68
69 # IpacWL 参观账户登录服务器
70 onVisitPlayerJoin:
71 message: '§6IpacEL §f> §a%player% §b使用参观账户加入游戏'
72
73 # AuthMe 玩家登录或注册成功
74 onAuthMeLoginEvent: # 需要启用 hook.AuthMe
75 message: '§6IpacEL §f> §a%player% §b加入游戏'
76
77 # 玩家加入事件. 如果使用 AuthMe, 同时这里留空, 就能在玩家登录后显示加入游戏
78 onPlayerJoinEvent:
79 message: '§6IpacEL §f> §a%player% §b加入游戏'
80
81 # 玩家退出
82 playerQuit:
83
84 # AuthMe 登录密码错误
85 onAuthMeFailedLoginEvent: # 需要启用 hook.AuthMe
86 message: '§6IpacEL §f> §a%player% §b断开连接: §7密码错误'
87
88 # AuthMe 玩家注销事件 (/logout)
89 onLogoutEvent:
90 message: ''
91
92 # 玩家退出事件
93 onPlayerQuitEvent:
94 message: '§6IpacEL §f> §a%player% §b 离开游戏'
95
1/wl - 主命令
2/wl reload - 重载配置, 同时重新连接数据库
3/wl add <playerName|playerUUID> - 添加到白名单, uuid为空时自动获取
4/wl del <playerName|playerUUID> - 取消玩家的白名单
5/wl ban <playerName|playerUUID> - 封禁玩家
6/wl unban <playerName|playerUUID> - 解封玩家
7/wl info <playerName|playerUUID> - 查看玩家数据
8/wl list <NOT|VISIT|WHITE|BLACK|VISIT_CONVERT|VISIT_BLACK|*> <num|ALL> - 列出玩家数据
9/wl clean <VISIT|NOT> - 清理一个类型下所有玩家的数据, 详见配置
10/wl clean PLAYER <playerName|playerUUID> - 清理一个玩家的所有数据, 详见配置
CoreProtect
功能介绍:CoreProtect
- 快速,高效的方块记录,回滚和恢复
CoreProtect
是一种快速,高效的数据记录和防止恶意破坏的工具。可以回滚和恢复破坏。为大型服务器设计,CoreProtect
将记录和管理数据,而不会影响服务器性能。
下载地址:https://www.spigotmc.org/resources/coreprotect.8631/updates
1/co help 显示命令列表
2/co inspect 开启查询模式
3/co rollback <params> 回档方块数据
4/co restore <params> 取消回档操作
5/co lookup <params> 方块记录翻页
6/co purge <params> 删除旧有数据
7/co reload 重载配置文件
8/co version 查看当前插件版本信息
9简短命令 /co near 查看半径五格内的方块记录
10/co undo 撤销回档/恢复操作,即进行相反的动作(下面列出详细的命令信息.)
11/co help 在游戏中列出所有命令.
12/co inspect 开启查询模式.再次输入则关闭查询模式.缩写"/co i".
1# 查看玩家的日志记录
2/co lookup u:<user> t: r:<radius> a:<action> b:<blocks> e:<exclude>
3 # 简短命令: "/co l".
4
5# 示例
6# 查看 player 一小时内 破坏的方块
7/co lookup player t:1h a:-block
8
9# 查看 player 一天内 拿出箱子内的物品
10/co lookup player t:1h a:container
11
12# 查看 player 30分钟内 杀死的怪物/动物
13/co lookup player t:30m a:kill
查询结果,可以用来查看玩家的操作记录
1u:<user> - 指定一名用户进行回档操作.
2# 例子: u:Notch
3
4t: - 指定回档的时间变量.你可以指定周、天、小时、分钟、秒数.
5# 例子 t:2w,5d,7h,2m,10s
6# 你可以指定更具体的时间变量.
7# 例子: t:5d2h
8# 你也可以使用小数
9# 例子: t:2.50h (两个半小时)
10
11r:<radius> - 指定作用的半径范围.
12# 你可以利用这个变量只恢复你附近的方块.
13# 你可以直接指定一个数字(例如 r:5),一个世界(例如 r:#world_the_end), 全局回档(r:#global), 或是一个WorldEdit的选区(r:#worldedit 或者 r:#we)
14# 举个例子来说,下面这个变量意味着只恢复你周围半径为十格的方块【注:此处是半径抑或就是方块数?】: r:10
15
16a:<action> - 限定操作的动作范围
17# 举个例子来说,如果你只想恢复放置的方块,输入 a:+block
18# 以下是所有动作的变量代码:
19a:block (方块放置/破坏)
20a:+block (方块放置)
21a:-block (方块破坏)
22a:click (玩家交互)
23a:container (物品拿出或放入箱子等容器.)
24a:+container (物品放入箱子等容器.)
25a:-container (物品拿出箱子等容器.)
26a:kill (被杀死的怪物/动物)
27a:chat (聊天栏中的信息)
28a:command (用过的命令)
29a:session (玩家登入/登出)
30a:+session (玩家登入)
31a:-session (玩家登出)
参考文档:https://mineplugin.org/CoreProtect
WorldGuard
功能介绍:WorldGuard
是 Minecraft 服务器端的一个插件,用于管理和保护世界(World)中的区域。该插件允许服务器管理员对不同的地区(区域)设置特定的规则、权限和保护措施。
下载地址:https://dev.bukkit.org/projects/worldguard
输入指令 //wand,使用得道的木棍左键一个区域的第一个点,用木棍右键一个区域的第二个点。
此两点为对角线,系统认为这两个点的中间范围是你所选中的范围
(所以有一个点可能需要搭楼梯到高处)
输入指令 /rg claim 领地名
例: /rg claim myhome 则是定义一个叫 myhome
的地盘, 这个地盘的所有者默认包含创建者,这片区域则只有你能进行建造破坏等行动(TNT,苦力怕也能破坏)
在某个领地的区域范围内输入指令 /rg info。默认无主区域的领地标识为 __global
__
添加领地用户:输入指令 /rg addmember 领地名 用户名
删除领地用户:输入指令 /rg removemember 领地名 用户名
以下指令为可选
输入指令/rg flag 领地名 tnt deny
这片区域禁止tnt破坏
输入指令/rg flag 领地名 creeper-explosion deny
这片区域禁止苦力怕爆炸破坏
输入指令/rg flag 领地名 enderman-grief deny
这片区域禁止 Enderman
搬运
输入指令/rg flag 领地名 greeting welcome %name%!
当有人进入这片区域会提示 ”welcome (某某某)! ”
输入指令/rg flag 领地名 farewell thank you %name% see you next time!
当有人离开这片区域会提示 ”thank you (某某某) see you next time!”
欢迎辞和欢送辞使用中日文可以, 但是服务器重启后会变成乱码
输入指令/rg flag 领地名 chest-access allow
当有人进入这片区域可以打开你没上锁的箱子,但是箱子必须是公有的 (/cremove状态)
输入指令/rg flag 领地名 use allow
强制设置这片区域别人可以使用触发器例如踏板开关之类的.(默认为开,但有时会BUG造成无法使用)
输入指令 /rg del 领地名
拥有者可以修改自己区域的拥有者,使用者,以及flag参数.
使用者则只能在此区域做正常的建设&拆除,但无法更改这个地区的设置.
无权限者无法在此区域做任何建设&拆除.
使用指令 /rg list .me
Multiverse-Core
功能介绍:Multiverse-Core 是 Minecraft 服务器端的一个插件,旨在为服务器管理员提供多世界管理功能。该插件允许在同一个服务器上创建和管理多个游戏世界,每个世界可以具有独立的设置、规则和特性。
下载地址:https://www.spigotmc.org/resources/multiverse-core.390/
可以将旧地图导入进服务器,地图文件夹默认为 world
,在导入前为了不和现有地图冲突,建议重命名,比如 world_old
1# 将旧地图复制到新服务端
2# 假设旧地图在 Old_mc_dir 中,新服务端目录为 new_mc_dir
3cp -R old_mc_dir/world new_mc_dir/world_old
然后在 MC 控制台输入导入世界的命令,其中世界名和地图文件夹需要一致。
1# 导入普通世界 world_old
2/mv import world_old normal
导入成功后就可以通过命令自由切换世界了。
1# 将自己传送至 world_old
2/mv tp world_old
3
4# 将 player 传送至 world_old
5/mv tp player world_old
1/mv help - 查看本插件帮助
2
3/mv spawn [世界名] - 回到这一个世界的出生点
4
5/mv create [世界名] [世界类型] [世界种子] - 创造一个新世界
6
7/mv create 世界名 normal 普通
8
9/mv create 世界名 normal -t flat 超平坦
10
11/mv create 世界名 normal -t largebiomes大型生物群落
12
13/mv create 世界名 nether 创建地狱输入
14
15/mv create 世界名 end 创建末地输入
16
17/mv delete [世界名] - 删除一个世界
18
19/mv save - 保存插件信息
20
21/mv reload - 重载插件
22
23/mv list - 查看已有世界列表
24
25/mv listgens - 查看可选择的世界类型
26
27/mv move [玩家名] [世界名] - 将某玩家传送到某的世界
28
29/mv spawn [某世界] - 回到出生点
30
31/mv setspawn - 设置本世界出生点
32
33/mv debug - 进入调试模式
34
35/mv info [世界名] - 查看该世界的信息
36
37/mv unload [世界名] - 重新加载一个世界
38
39/mv link [目标地狱] [世界名] - 连接[目标世界]地狱和[世界名]
40
41/mv link-end [目标末界] [世界] - 连接[目标世界]末界和[世界]
42
43/mv flags - 显示全部标志列表
44
45/mv setflag [世界名] [标志名] [值] - 改变标志值
46
47/mv getflag [世界名] [标志名] - 查看标志值。输入"*"可以查看该世界全部标志状态
48
49/mv load [世界名] 打开某个被关闭的世界
Multiverse-Portals
功能介绍:Multiverse-Portals
是 Minecraft 服务器端的一个插件,是 Multiverse-Core
插件的一个附属模块,用于在多世界管理中创建和管理传送门。这个插件提供了创建传送门的工具,允许玩家通过特定的门或区域快速移动到其他世界或特定位置。
下载地址:https://dev.bukkit.org/projects/multiverse-portals
可以利用Multiverse-Portals
插件构造传送门,使普通玩家不需要利用mv tp <世界名>
命令即可在不同世界间穿越,效果类似于原版的地狱传送门;
插件依赖:Essentials, EssentialsGeoIP, Multiverse-Core, Multiverse-Portals
安装好插件,工作正常后,进入客户端设置:
1# 查阅当前插件安装情况
2/plugins
3[20:46:26 INFO]: Plugins (19): LuckPerms, CMILib, OnePlayerSleep, Vault, Votifier, Multiverse-Core, WorldEdit, Essentials, EssentialsGeoIP, AuthMe, Economy, Multiverse-Portals, IpacWhitelist, WorldGuard, CoreProtect, LockettePro, Jobs, ChestShop, Mohist
4
5# 设置一个选择器
6/mvp wand
7或
8//wand
指令执行完毕后,背包内会多出一只木斧子,也就是选择器
装备木斧,根据提示,对着框体结构的一角单击左键,再在对角单击右键;
成功的话,会有紫色文字坐标提示;
此时就设置好了这个传送门的框体范围,接下来要创建传送点,并设置这个传送点的名字
1/mvp create world_1
这里我就简单起名为world_1
同理,可以在另一处位置的框体范围,按照同样的方法,创建另一个传送点。
1# 选择框体
2//wand
3
4# 创建第二个世界传送点,名称 world_2
5/mvp create world_2
两个世界的传送点构建完成后,需要建立连接。
此时我们选中的是最后创建的传送点 world_2
,需要将其目标连接到 world_1
,所以传送门连接设置成这样。
1# 构建 world_2 到 world_1 的连接
2/mvp modify dest p:world_1
这条命令将 world_2
传送门的目标连接到了 world_1
。
同理,我们再选中编辑 world_1
,再建立到 world_2
的连接。
1# 选中 world_1
2/mvp select world_1
3
4# 构建 world_1 到 world_2 的连接
5/mvp modify dest p:world_2
至此,这个双向传送门就构建完毕!
最后还需要设置一下玩家权限,否则只有管理员才能通过。
编辑 Multiverse-Portals
的配置文件 config.yml
:
1cd ./plugins/Multiverse-Portals
2vim config.yml
在传送门的配置文件中找到 enforceportalaccess
值改成 false
就可以让所以玩家通过所有存在的传送门了。另外之前在游戏中设置的传送门信息就存储在 protals.yml
中,不要轻易修改或删除。
LockettePro
功能介绍:LockettePro
是 Minecraft 服务器端的一个插件,用于提供箱子、门、陷阱门和其他方块的保护功能。该插件允许玩家保护特定的容器或方块,以防止其他玩家访问或交互。
下载地址:https://www.spigotmc.org/resources/lockettepro-for-1-14-to-1-19.74354/
编辑 LockettePro
的 config.yml
设置文件。
1block-interfere-placement: true
2 # 可以防止玩家在锁着的容器附近放漏斗等可以偷出物品的方块。
3
4block-item-transfer-in: false
5 # 防止物品放进容器,关闭
6
7block-item-transfer-out: true
8 # 防止物品拿出容器,关闭
9
10block-hopper-minecart: true
11 # 可以防止漏斗矿车从锁着的箱子里拿出物品,如果设置为remove的话,漏斗矿车将被直接移除。
12
13lockables:
14 # 代表可上锁的物品
15 # 如果在lockables中添加'*'(此时需带单引号),则代表添加所有物品。如果物品前附带了一个减号如'-STONE'(此时需带单引号),则代表将本物品例外。
16
17cache-time-seconds: 0
18 # 为缓存时间,默认关闭,单位为秒,如果你的服务器漏斗很多很多的话,建议使用本功能,推荐数值填10秒。
1# 所有/lock指令均可使/lockettepro,/lockette 或 /lockit 替换
2
3/lock 行号 玩家名
4# 修改牌子的用户,玩家默认有这个权限
5# 玩家需要先右键选中一个牌子才可以使用。
6
7/lock reload
8# 重载插件,权限:lockettepro.reload
9# 管理员撬锁权限:lockettepro.admin.break
10# 管理员绕过检测使用方块(例如开箱子)权限:lockettepro.admin.use
11# 管理员绕过检测在锁着的方块附近放东西权限:lockettepro.admin.interfere
12# 管理员修改任何人的牌子权限:lockettepro.admin.edit
示例:假设 player_1
需要保护自己的箱子或者门,并只允许自己和 player_2
才能打开。
放置保护标志: 首先,装备告示牌(Sign),将其放置在一个你要保护的方块旁边(例如箱子或门)。 LockettePro
会默认添加你打得所有权,一般格式是:
1[Private]
2player_1
在告示牌上的第一行写上 [Private] 或者 [Lockette
] 以指示这是一个 LockettePro
的保护标志。
设置权限: 在告示牌上设置权限,确保只有 player_1
和 player_2
能够打开这个箱子或门。在控制台输入命令
12 代表第2行
2/lock 2 player_2
此时告示牌上的信息会变更为:
1[Private]
2player_1
3player_2
上述命令的作用是将第一行视为标志行,将 player_1
和 player_2
加入到这个方块的权限列表中。这样只有这两个玩家才能访问这个箱子或门。
如果所有人很多,还可以贴上新的告示牌来增加玩家。
激活保护: 操作完成后,右击告示牌来激活和保存设置。成功保存后,这个方块将会受到 LockettePro
的保护,只有在权限列表中的玩家才能访问或操作它。这样一来,只有 player_1
和 player_2
能够打开和访问这个被保护的箱子或门,其他玩家则无法进行操作。
注: LockettePro
的保护权限对管理员无效。
OnePlayerSleep
功能介绍:OnePlayerSleep
是 Minecraft 服务器插件,旨在改变游戏中的睡眠系统。传统上,Minecraft 中所有玩家都需要进入床并达成一致,才能将夜晚转变为白天。这个插件的目的是让单个玩家就能够让夜晚转为白天。
下载地址:https://www.spigotmc.org/resources/oneplayersleep.76534/
SkinsRestorer
功能介绍:SkinsRestorer
是一个 Minecraft 服务器插件,它允许玩家在服务器上使用自定义皮肤。该插件允许玩家更改其角色的外观,包括皮肤、披风和帽子等。
Luckperms 权限速查:
查看所有用户组:
lp listgroups
将用户添加到用户组 member:
/lp user <player> parent add member
查看 member 用户组的所有用户:
lp group member listmembers
查看 member 用户组的所有权限:
lp group member permission info
使用
find /path/to/directory -type f -size +10M
查看,可以看到plugins/CoreProtect/database.db
的大小在迅速增长,这是由于CoreProtect
的日志数据记录较大。需要定期清理。解决方法:设置 crontab 定时脚本,定期给服务器发送
co purge
命令清理任务:55 7 * * * screen -S mc -X stuff "co purge t:7d^M"
其中,
co purge t:7d
表示仅保留 7 天内的日志数据