Minecraft PaperMC 服务器部署指南 / 04 - 世界管理
04 - 世界管理
4.1 Minecraft 世界基础
4.1.1 世界的存储结构
Minecraft 使用区域文件(Region File)存储区块数据:
world/ # 主世界
├── level.dat # 世界属性(种子、游戏规则等)
├── level.dat_old # 上次备份
├── uid.dat # 唯一标识符
├── session.lock # 会话锁(防止多进程访问)
├── region/ # 区域文件 (.mca)
│ ├── r.0.0.mca
│ ├── r.0.-1.mca
│ └── ...
├── entities/ # 实体数据(1.17+ 分离存储)
│ ├── r.0.0.mca
│ └── ...
├── poi/ # 兴趣点(村民工作站等)
├── data/ # 地图数据、结构数据
│ ├── maps/
│ └── structures/
├── playerdata/ # 玩家数据(单世界模式)
│ └── <uuid>.dat
├── advancements/ # 进度数据
│ └── <uuid>.json
├── stats/ # 统计数据
│ └── <uuid>.json
└── DIM-1/ # 下界维度
├── region/
└── entities/
4.1.2 维度与世界的关系
| 维度 | 文件夹 | 说明 |
|---|---|---|
| 主世界 (Overworld) | world/ | 地表世界 |
| 下界 (Nether) | world/DIM-1/ | 狱岩世界 |
| 末地 (The End) | world/DIM1/ | 末地世界 |
4.1.3 区域文件格式
.mca(Anvil 格式,当前默认):
- 每个 .mca 文件覆盖 32×32 个 Chunk(512×512 方块)
- 每个 Chunk 包含 16×384×16 方块(1.18+ 纵向扩展到 384 格)
- 文件大小随探索范围增长
4.2 多世界管理
4.2.1 创建新世界
方式一:修改 server.properties(不推荐,仅限主世界)
# 修改 level-name 会切换主世界
level-name=world_new
方式二:使用 Multiverse-Core 插件(推荐)
# 安装 Multiverse-Core
# 下载地址:https://github.com/Multiverse/Multiverse-Core/releases
# 将 JAR 放入 plugins/ 目录后重启服务器
# 创建新平坦世界
/mv create flat_world normal -t flat
# 创建新的超平坦世界(指定种子)
/mv create flat_world normal -t flat -s 12345
# 创建自定义世界
/mv create adventure_world normal -g Terra:DEFAULT
# 列出所有世界
/mv list
# 查看世界信息
/mv info
方式三:手动复制(高级)
# 停止服务器
stop
# 复制世界文件夹
cp -r /opt/minecraft/paper/world /opt/minecraft/paper/world_backup
# 创建新世界的空结构
mkdir -p /opt/minecraft/paper/new_world/{region,entities,poi,data}
# 在 server.properties 中切换或通过 Multiverse 导入
4.2.2 世界管理命令(Multiverse)
| 命令 | 说明 |
|---|---|
/mv create <名称> <环境> | 创建世界(环境:normal/nether/end) |
/mv import <文件夹名> <环境> | 导入已有世界 |
/mv delete <名称> | 删除世界(不可逆!) |
/mv clone <源> <目标> | 克隆世界 |
/mv tp <世界名> | 传送到世界 |
/mv set spawn | 设置当前世界出生点 |
/mv modify set gamemode <模式> | 设置世界游戏模式 |
/mv modify set difficulty <难度> | 设置世界难度 |
/mv modify set pvp true/false | 设置世界 PvP |
4.2.3 世界间传送
# 传送到指定世界
/mv tp world_nether
# 使用 Multiverse-NetherPortals 自动连接下界门
# 插件会自动处理主世界-下界的门户连接
# 使用 EssentialsX 的传送命令
/warp <世界名>
# 使用传送门脚本(NPC 或命令方块)
/execute in the_nether run tp @p 0 64 0
4.3 世界生成器
4.3.1 内置世界类型
| 世界类型 | 说明 | 适用场景 |
|---|---|---|
minecraft\:normal | 标准世界 | 生存、冒险 |
minecraft\:flat | 超平坦 | 创造、小游戏 |
minecraft\:large_biomes | 大型生物群系 | 探索向 |
minecraft\:amplified | 放大地形 | 观景、挑战 |
minecraft\:single_biome | 单一生物群系 | 特殊玩法 |
4.3.2 自定义世界生成器
使用数据包自定义世界生成(1.19+ 推荐):
// data/<namespace>/worldgen/noise_settings/overworld.json
{
"sea_level": 63,
"disable_mob_generation": false,
"aquifers_enabled": true,
"ore_veins_enabled": true,
"legacy_random_source": false,
"default_block": {
"Name": "minecraft:stone"
},
"default_fluid": {
"Name": "minecraft:water",
"State": {
"level": "0"
}
},
"noise": {
"min_y": -64,
"height": 384,
"size_horizontal": 1,
"size_vertical": 2
},
"spawn_target": [],
"sea_level": 63
}
使用 Terra 世界生成插件:
# Terra 配置示例
# https://github.com/PolyhedralDev/Terra
# 安装后使用以下命令创建世界
/mv create terra_world normal -g Terra:DEFAULT
# 使用自定义配置包
/mv create custom_world normal -g Terra:CUSTOM_PACK
4.3.3 平坦世界自定义
# 使用命令方块或 Multiverse 创建自定义平坦世界
# 超平坦预设格式:方块层从下到上
# 示例:3 层基岩 + 5 层石头 + 1 层草地 + 生物群系
/mv create custom_flat normal -t flat -s "3*minecraft:bedrock,5*minecraft:stone,minecraft:grass_block;minecraft:plains"
# 更复杂的自定义(使用 datapack)
# 在 datapack 中定义 flat_world_generator.json
4.4 世界备份
4.4.1 手动备份
# 停止服务器或使用 save-off 命令
# 在控制台中执行:
save-off
save-all
# 等待保存完成(观察日志中的 "Saved the game" 消息)
sleep 5
# 备份世界文件
BACKUP_NAME="world_backup_$(date +%Y%m%d_%H%M%S)"
cp -r /opt/minecraft/paper/world "/opt/minecraft/paper/backups/${BACKUP_NAME}"
# 恢复自动保存
save-on
echo "备份完成: ${BACKUP_NAME}"
4.4.2 自动备份脚本
#!/bin/bash
# backup-world.sh - Minecraft 世界自动备份脚本
# ============ 配置 ============
SERVER_DIR="/opt/minecraft/paper"
BACKUP_DIR="/opt/minecraft/backups"
WORLD_NAME="world"
KEEP_DAYS=7 # 保留最近 N 天的备份
SCREEN_NAME="minecraft" # Screen 会话名
COMPRESSION="gzip" # gzip / zstd / none
# ============ 初始化 ============
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${WORLD_NAME}_${TIMESTAMP}"
mkdir -p "$BACKUP_DIR"
# ============ 执行备份 ============
echo "[$(date)] 开始备份世界: ${WORLD_NAME}"
# 通知服务器停止自动保存
screen -S "$SCREEN_NAME" -p 0 -X eval 'stuff "save-off\015"'
screen -S "$SCREEN_NAME" -p 0 -X eval 'stuff "save-all\015"'
sleep 3
# 复制世界文件
cp -r "${SERVER_DIR}/${WORLD_NAME}" "${BACKUP_FILE}"
# 恢复自动保存
screen -S "$SCREEN_NAME" -p 0 -X eval 'stuff "save-on\015"'
# 压缩
if [ "$COMPRESSION" = "gzip" ]; then
tar -czf "${BACKUP_FILE}.tar.gz" -C "$BACKUP_DIR" "$(basename $BACKUP_FILE)"
rm -rf "$BACKUP_FILE"
BACKUP_FILE="${BACKUP_FILE}.tar.gz"
elif [ "$COMPRESSION" = "zstd" ]; then
tar --zstd -cf "${BACKUP_FILE}.tar.zst" -C "$BACKUP_DIR" "$(basename $BACKUP_FILE)"
rm -rf "$BACKUP_FILE"
BACKUP_FILE="${BACKUP_FILE}.tar.zst"
fi
echo "[$(date)] 备份完成: ${BACKUP_FILE}"
echo "[$(date)] 备份大小: $(du -h "$BACKUP_FILE" | cut -f1)"
# ============ 清理旧备份 ============
echo "[$(date)] 清理 ${KEEP_DAYS} 天前的备份..."
find "$BACKUP_DIR" -name "${WORLD_NAME}_*" -mtime +$KEEP_DAYS -delete
# 显示当前备份列表
echo "[$(date)] 当前备份:"
ls -lh "$BACKUP_DIR"/${WORLD_NAME}_* 2>/dev/null | tail -10
4.4.3 设置定时备份(Crontab)
# 编辑 crontab
crontab -e
# 每 6 小时备份一次
0 */6 * * * /opt/minecraft/scripts/backup-world.sh >> /var/log/minecraft-backup.log 2>&1
# 每天凌晨 3 点备份
0 3 * * * /opt/minecraft/scripts/backup-world.sh >> /var/log/minecraft-backup.log 2>&1
# 每周日凌晨 4 点做完整备份
0 4 * * 0 /opt/minecraft/scripts/backup-world-full.sh >> /var/log/minecraft-backup.log 2>&1
4.4.4 从备份还原
# 停止服务器
# ...(通过控制台发送 stop 命令)
# 备份当前世界(以防万一)
mv /opt/minecraft/paper/world /opt/minecraft/paper/world_broken_$(date +%s)
# 解压备份
cd /opt/minecraft/backups
tar -xzf world_20260510_120000.tar.gz -C /opt/minecraft/paper/
# 确保文件权限正确
chown -R minecraft:minecraft /opt/minecraft/paper/world
# 启动服务器验证
4.5 世界管理最佳实践
4.5.1 世界大小控制
# 查看世界大小
du -sh /opt/minecraft/paper/world/
du -sh /opt/minecraft/paper/world/region/
# 查看区域文件数量
ls /opt/minecraft/paper/world/region/ | wc -l
# 使用 MCA Selector 修剪未使用的区块
# 下载: https://github.com/Toolbox4Minecraft/mcaselector
java -jar mcaselector.jar
4.5.2 区块修剪(Pruning)
当世界过大时,可以修剪玩家已探索但不再需要的区块:
# 使用 MCA Selector 命令行模式
# 删除距离出生点 10000 格以外的区块
java -jar mcaselector.jar \
--mode delete \
--world /opt/minecraft/paper/world \
--radius 10000 \
--center 0,0
警告:区块修剪不可逆!务必先完整备份再操作。
4.5.3 世界优化
# 在 PaperMC 控制台执行世界优化
# Paper 内置了区块压缩功能
# 查看未使用的区块
# 使用 Spark 插件分析内存占用
/spark profiler
4.5.4 世界设置调整
# 游戏规则(通过控制台或游戏内命令)
gamerule doDaylightCycle true # 日夜循环
gamerule doMobSpawning true # 怪物生成
gamerule doFireTick true # 火焰蔓延
gamerule mobGriefing true # 生物破坏方块
gamerule keepInventory false # 死亡保留物品
gamerule doWeatherCycle true # 天气循环
gamerule randomTickSpeed 3 # 随机 tick 速度
gamerule spawnRadius 10 # 出生点范围
gamerule playersSleepingPercentage 50 # 跳过夜晚所需睡 %
4.6 多世界管理插件推荐
| 插件 | 说明 | 链接 |
|---|---|---|
| Multiverse-Core | 多世界管理核心 | GitHub |
| Multiverse-NetherPortals | 多世界下界门户 | GitHub |
| Multiverse-Inventories | 多世界独立背包 | GitHub |
| MyWorlds | 轻量世界管理 | SpigotMC |
| EpicWorldGenerator | 高级世界生成器 | SpigotMC |
| Terra | 开源世界生成框架 | GitHub |
4.7 常见问题
Q1:世界文件损坏怎么恢复?
# 1. 首先尝试 Minecraft 内置修复
# 删除 region 中损坏的 .mca 文件(对应区块会重置)
# 2. 使用 MCA Selector 定位损坏区块
java -jar mcaselector.jar --mode analyze --world /opt/minecraft/paper/world
# 3. 从备份还原特定区域
Q2:玩家说某个区块消失了?
通常是区块加载失败或文件损坏。检查 latest.log 中是否有 Chunk file at ... is missing 错误。
Q3:下界传送门不工作?
确认 server.properties 中 allow-nether=true,且下界维度文件夹 DIM-1 存在。
4.8 本章小结
| 要点 | 说明 |
|---|---|
| 使用 Multiverse 管理多世界 | 比手动操作更安全可靠 |
| 定期备份世界 | 至少每 6 小时一次,保留 7 天 |
| 区块修剪可控制世界大小 | 操作前必须备份 |
| 游戏规则影响世界行为 | 根据玩法需求调整 |
| 日志是排查世界问题的关键 | 检查 latest.log 和崩溃日志 |