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()ouThread.sleep()no código da aplicação; - capture
UUIDe 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.