Pular para o conteúdo principal

Quickstart de um plugin

Este guia mostra o fluxo recomendado: evento na thread proprietária, captura de valores imutáveis, operação assíncrona e retorno à thread da entidade antes de tocar em APIs Paper.

1. Declare o plugin

name: CotaniQuickStart
version: 1.0.0
main: com.example.cotaniquickstart.CotaniQuickStartPlugin
api-version: '1.21'

2. Crie o bootstrap

public final class CotaniQuickStartPlugin extends JavaPlugin {
private Cotani lifecycle;

@Override
public void onEnable() {
var scheduler = SchedulerFactory.create(this);
lifecycle = Cotani.forPlugin(this)
.withAsync(scheduler::closeAsync)
.build();
}
}

3. Faça a transição async → entity thread

public void showMessage(UUID playerId, PaperTaskScheduler scheduler) {
scheduler.entity("show-message", playerId, () -> {
var player = Bukkit.getPlayer(playerId);

if (player != null) {
player.sendMessage(Component.text("Cotani está executando na entity thread."));
}
});
}

Em código de produção, prefira um serviço de mensagens e não capture Player dentro de uma operação assíncrona. Capture o UUID, carregue os dados e re-resolva o jogador na transição para a entity thread.

4. Compile os exemplos

O repositório possui exemplos em docs-examples. Execute:

./gradlew :examples:compileJava

Para entender o fluxo completo, consulte o Cookbook.