Pular para o conteúdo principal

Começando

Cotani é distribuído como um conjunto de módulos independentes. Adicione apenas as capacidades utilizadas pelo plugin e mantenha as versões alinhadas com o BOM.

Pré-requisitos

  • Java 25 para a linha atual do projeto;
  • Paper ou Folia compatível com a versão publicada;
  • Gradle ou Maven;
  • conhecimento básico de plugins Bukkit/Paper;
  • Docker apenas para executar as suítes de integração locais.

Dependência Gradle

Use o BOM para evitar combinações incompatíveis entre os módulos:

repositories {
mavenCentral()
maven("https://jitpack.io")
}

dependencies {
implementation(platform("com.github.HanielCota.Cotani:cotani-bom:v1.1.2"))
implementation("com.github.HanielCota.Cotani:cotani-task")
}

Substitua as linhas de exemplo pelos módulos reais que o plugin utiliza. O README principal contém a tabela de módulos e as coordenadas atuais.

As releases também são publicadas no GitHub Packages sob o grupo com.cotani. Esse registry exige autenticação com um token clássico read:packages, mesmo para pacotes públicos; consulte a seção GitHub Packages do README principal.

Bootstrap mínimo

O plugin principal deve cuidar apenas do lifecycle e da composição das dependências. Serviços, repositórios e listeners ficam em classes próprias.

public final class ExamplePlugin extends JavaPlugin {
private Cotani lifecycle;

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

@Override
public void onDisable() {
if (lifecycle != null) {
lifecycle.closeAsync();
}
}
}

O exemplo acima é intencionalmente reduzido. Para um plugin real, registre os módulos em uma composição única e guarde as referências dos serviços que pertencem ao plugin.

Regras essenciais

  • prefira CompletionStage<T> nas APIs públicas;
  • nunca use join(), get() ou Thread.sleep() no código da aplicação;
  • capture UUID e dados imutáveis antes de iniciar trabalho assíncrono;
  • retorne à thread global, de região ou de entidade antes de acessar objetos Paper;
  • feche recursos criados pelo plugin durante o shutdown;
  • use o índice de módulos para localizar a API correta.