Migrando do Bukkit / Spigot / Paper para o Pumpkin
Este guia aborda as diferenças arquiteturais e de configuração ao transicionar um servidor do Bukkit, Spigot ou Paper para o Pumpkin.
1. Diferenças Arquiteturais
| Aspecto | Bukkit / Spigot / Paper | Pumpkin |
|---|---|---|
| Ambiente de Execução | Java Virtual Machine (requer Java 17/21+) | Executável nativo (Rust compilado, sem necessidade de Java) |
| Comando de Inicialização | java [flags] -jar server.jar | ./pumpkin |
| Loop de Ticks | Loop de ticks single-threaded com tarefas assíncronas | Execução de ticks multithread entre núcleos de CPU |
| Formato de Plugins | Bytecode Java (.jar) direcionado à API Bukkit | WebAssembly (.wasm), ou .jar via PatchBukkit |
| Linguagens de Plugins | Java, Kotlin, Scala | Rust, Python, Kotlin, C#, Go, C |
| Configuração | server.properties, paper.yml, spigot.yml | pumpkin.toml (formato TOML) |
| Gerenciamento de Memória | JVM Garbage Collection | Alocação nativa de memória pelo SO |
2. Plugins e Extensões
Plugins em WebAssembly
O formato primário de plugins do Pumpkin é o WebAssembly (.wasm):
- Isolamento: Os plugins são executados em um runtime WebAssembly em sandbox.
- Suporte a Linguagens: Os plugins podem ser compilados para WASM a partir de Rust, Python, Go, C#, C ou Kotlin.
- Plugins Personalizados: Para portar plugins Bukkit próprios para o Pumpkin, consulte o Guia de Migração para Desenvolvedores.
Compatibilidade com Plugins Bukkit: PatchBukkit
Para servidores que dependem de plugins Bukkit/Spigot .jar existentes, o projeto PatchBukkit fornece uma camada de compatibilidade:
- Arquitetura: O PatchBukkit incorpora uma JVM dentro do Pumpkin e reimplementa partes da API Bukkit, fazendo a ponte com o Pumpkin via JNI e FFI.
- Localização dos Plugins: Plugins
.jarcompatíveis são colocados empatchbukkit/patchbukkit-plugins/. - Status e Limitações: O PatchBukkit está em desenvolvimento ativo. Chamadas padrão da API Bukkit são suportadas; plugins com forte dependência de classes internas do NMS (
net.minecraft.server), reflexão do CraftBukkit ou manipulação de bytecode podem não funcionar corretamente. - Requisito de Java: A execução do PatchBukkit requer um runtime Java (JRE/JDK) instalado no sistema host para rodar a JVM incorporada.
3. Configuração e Propriedades
O Pumpkin utiliza arquivos de configuração TOML em vez de server.properties e 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. Armazenamento de Mundos e Dados
- Compatibilidade de Formato: O Pumpkin lê o formato padrão de chunks Anvil (arquivos
.mca). - Estrutura de Diretórios: Certifique-se de que os diretórios de dimensões (
world,world_nether,world_the_end) correspondam à estrutura esperada do Pumpkin ao copiar mundos de instalações existentes do Paper/Spigot. - Formato Mais Recente de Mundo e Datapack Necessário: Ao menos por enquanto, o Pumpkin suporta apenas o formato de mundo e o formato de datapack mais recentes da versão suportada do Minecraft. Formatos antigos de mundo ou versões legadas de datapack não são convertidos automaticamente em tempo de execução.
- Atualizando Mundos no Cliente: Se estiver migrando um mundo antigo, atualize-o antes de carregá-lo no Pumpkin. Você pode atualizar um mundo existente diretamente no cliente oficial do Minecraft: abra o jogo na versão mais recente compatível, vá em Um Jogador, selecione o mundo, clique em Editar e escolha Otimizar Mundo. Como alternativa, carregue e salve o mundo uma vez em um servidor vanilla na versão mais recente.
- Datapacks: Certifique-se de que todos os datapacks em
world/datapacksestejam atualizados para o formato esperado pela versão de destino.
5. Inicialização e Flags da JVM
Nenhuma Instalação de Java Necessária
O Pumpkin puro é um executável nativo autocontido. Não é necessário ter um runtime Java (JRE/JDK) instalado no sistema ou no contêiner para executar o servidor.
Comandos de Inicialização
Servidores Paper e Spigot frequentemente utilizam scripts de inicialização JVM com flags de alocação de heap e garbage collection (como as Aikar's Flags):
bash
# Comando típico de inicialização do Paper com Aikar's Flags:
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 --noguibash
# Linux / macOS:
./pumpkin
# Windows:
./pumpkin.exe
# Docker:
docker run -p 25565:25565 -v ./data:/data pumpkinmc/pumpkin:latestDiferenças de Memória
- Sem Coletor de Lixo: O Pumpkin é escrito em Rust e utiliza gerenciamento determinístico de memória em tempo de compilação (RAII). Não há coletor de lixo em execução nem necessidade de ajustar pausas de GC.
- Sem Alocação Fixa de Heap: Flags como
-Xmse-Xmxnão existem em binários nativos. A memória é alocada dinamicamente pelo sistema operacional conforme chunks e entidades são carregados, e liberada no descarregamento. - Flags da JVM Não Se Aplicam: Parâmetros de ajuste de estratégias de GC, tamanhos de gerações ou detalhes internos da JVM não são necessários nem suportados.