Pumpkin-Docs/docs/zh_cn/admin/migrating-from-bukkit.md
Alexander Medvedev 5c23b676ed feat: d binding
2026-09-17 09:23:24 +02:00

127 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 从 Bukkit / Spigot / Paper 迁移至 Pumpkin
本指南涵盖将服务器从 Bukkit、Spigot 或 Paper 迁移至 Pumpkin 时的架构与配置差异。
---
## 1. 架构差异
| 方面 | Bukkit / Spigot / Paper | Pumpkin |
| :--- | :--- | :--- |
| **运行时环境** | 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、Scala | Rust、Python、Kotlin、C#、Go、C |
| **配置文件** | `server.properties`、`paper.yml`、`spigot.yml` | `pumpkin.toml`(TOML 格式) |
| **内存管理** | JVM 垃圾回收(Garbage Collection) | 原生操作系统内存分配 |
---
## 2. 插件与扩展
### WebAssembly 插件
Pumpkin 的主要插件格式为 WebAssembly(`.wasm`):
- **隔离性**:插件在沙箱化的 WebAssembly 运行时中运行。
- **语言支持**:开发者可以使用 Rust、Python、Go、C#、C 或 Kotlin 将插件编译为 WASM。
- **移植插件**:关于将自定义 Bukkit 插件移植到 Pumpkin,请参见[开发者迁移指南](../plugin-dev/migrating-from-bukkit/index)。
### 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=25565` | `server_address = "0.0.0.0:25565"` |
| `motd=...` | `motd = "A Pumpkin Server"` |
| `max-players=20` | `max_players = 20` |
| `online-mode=true` | `online_mode = true` |
| `view-distance=10` | `view_distance = 10` |
| `simulation-distance=8` | `simulation_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):
:::code-group
```bash [Paper (JVM)]
# 带有 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 [Pumpkin (原生)]
# 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 内部机制的参数均不适用,且无法传递给程序。
---
## 管理员检查清单
1. [ ] 备份现有服务器数据和世界文件,并确保世界与数据包已升级到最新格式(例如通过客户端的“优化世界”)。
2. [ ] 将 `server.properties` 中的设置映射至 `pumpkin.toml`。
3. [ ] 确定所需插件并寻找 WebAssembly(`.wasm`)替代,或使用 [PatchBukkit](#bukkit-插件兼容性patchbukkit) 进行测试。
4. [ ] 若使用代理网络,在 `pumpkin.toml` 中配置代理设置(`Velocity` / `BungeeCord`)。
5. [ ] 更新启动脚本以直接运行 `./pumpkin`,无需传入 JVM 参数。
6. [ ] 启动服务器并检查连接和日志。