Skip to content

从 Bukkit / Spigot / Paper 迁移至 Pumpkin ​

本指南涵盖将服务器从 Bukkit、Spigot 或 Paper 迁移至 Pumpkin 时的架构与配置差异。


1. 架构差异 ​

方面Bukkit / Spigot / PaperPumpkin
运行时环境Java 虚拟机(需要 Java 17/21+)原生可执行文件(Rust 编译,无需 Java)
启动命令java [flags] -jar server.jar./pumpkin
Tick 循环带有异步工作分配的单线程 Tick 循环跨 CPU 核心的多线程 Tick 执行
插件格式面向 Bukkit API 的 Java 字节码(.jar)WebAssembly(.wasm),或通过 PatchBukkit 支持 .jar
插件开发语言Java、Kotlin、ScalaRust、Python、Kotlin、C#、Go、C
配置文件server.properties、paper.yml、spigot.ymlpumpkin.toml(TOML 格式)
内存管理JVM 垃圾回收(Garbage Collection)原生操作系统内存分配

2. 插件与扩展 ​

WebAssembly 插件 ​

Pumpkin 的主要插件格式为 WebAssembly(.wasm):

  • 隔离性:插件在沙箱化的 WebAssembly 运行时中运行。
  • 语言支持:开发者可以使用 Rust、Python、Go、C#、C 或 Kotlin 将插件编译为 WASM。
  • 移植插件:关于将自定义 Bukkit 插件移植到 Pumpkin,请参见开发者迁移指南。

Bukkit 插件兼容性:PatchBukkit ​

对于依赖现有 Bukkit/Spigot .jar 插件的服务器,PatchBukkit 项目提供了兼容层:

  • 架构:PatchBukkit 在 Pumpkin 内部嵌入了一个 JVM 并重新实现了部分 Bukkit API,通过 JNI 和 FFI 与 Pumpkin 桥接。
  • 插件目录:兼容的 .jar 插件放置在 patchbukkit/patchbukkit-plugins/ 目录中。
  • 现状与限制:PatchBukkit 仍在积极开发中。标准 Bukkit API 调用受支持;严重依赖 NMS(net.minecraft.server)内部类、CraftBukkit 反射或字节码操作的插件可能无法正常工作。
  • Java 依赖:使用 PatchBukkit 需要在宿主系统上安装 Java 运行时(JRE/JDK)以运行内嵌的 JVM。

3. 配置与属性 ​

Pumpkin 使用 TOML 配置文件替代 server.properties 和 YAML:

Paper / Spigot(server.properties)Pumpkin(pumpkin.toml)
server-port=25565server_address = "0.0.0.0:25565"
motd=...motd = "A Pumpkin Server"
max-players=20max_players = 20
online-mode=trueonline_mode = true
view-distance=10view_distance = 10
simulation-distance=8simulation_distance = 8

4. 世界与数据存储 ​

  • 格式兼容性:Pumpkin 支持标准的 Anvil 区块格式(.mca 文件)。
  • 目录结构:从现有的 Paper/Spigot 复制世界时,请确保维度目录(world、world_nether、world_the_end)与 Pumpkin 的目录布局相符。
  • 需要最新的世界与数据包格式:至少在目前阶段,Pumpkin 仅支持对应目标 Minecraft 版本的最新世界格式和数据包格式。运行时不会自动转换旧版世界格式或旧版数据包。
    • 在客户端中升级世界:如果要迁移较旧的世界,请在导入 Pumpkin 前先进行升级。您可以直接在官方 Minecraft 客户端中更新世界:使用匹配的最新版本打开客户端,进入单人游戏,选择该世界,点击编辑并选择优化世界。或者,您也可以在匹配最新版本的原版/Paper 服务器中启动并保存一次该世界。
    • 数据包:确保 world/datapacks 中的所有自定义数据包均已更新到目标版本所要求的格式版本。

5. 启动与 JVM 标志 ​

无需安装 Java ​

纯净的 Pumpkin 是一个独立的自包含原生可执行文件。运行该服务器不需要在系统或容器中安装 Java 运行时(JRE/JDK)。

启动命令对比 ​

Paper 和 Spigot 服务器通常使用带有堆内存分配和垃圾回收参数的 JVM 启动脚本(如 Aikar's Flags):

bash
# 带有 Aikar's Flags 的典型 Paper 启动命令:
java -Xms10G -Xmx10G \
  -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 paper.jar --nogui
bash
# Linux / macOS:
./pumpkin

# Windows:
./pumpkin.exe

# Docker:
docker run -p 25565:25565 -v ./data:/data pumpkinmc/pumpkin:latest

内存机制差异 ​

  • 无垃圾回收器:Pumpkin 由 Rust 编写,在编译期使用确定性的内存管理(RAII)。不存在运行时的垃圾回收器,因此无需调优 GC 停顿。
  • 无需固定堆内存:原生程序中不存在 -Xms 和 -Xmx 标志。内存根据区块和实体的加载动态向操作系统申请,卸载后立即释放。
  • JVM 标志不适用:用于调优垃圾回收策略、分代大小或 JVM 内部机制的参数均不适用,且无法传递给程序。

管理员检查清单 ​

基于 MIT 许可发布。