强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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.propertiesallow-nether=true,且下界维度文件夹 DIM-1 存在。


4.8 本章小结

要点说明
使用 Multiverse 管理多世界比手动操作更安全可靠
定期备份世界至少每 6 小时一次,保留 7 天
区块修剪可控制世界大小操作前必须备份
游戏规则影响世界行为根据玩法需求调整
日志是排查世界问题的关键检查 latest.log 和崩溃日志

扩展阅读