API para Desenvolvedores NexusPrism¶
Última atualização: 2026-03-22
Este guia mostra como integrar com o NexusPrism a partir de um plugin Bukkit/Paper externo ou de um addon nativo. Você compila apenas contra nexusprism-api — nunca contra os JARs concretos dos módulos.
Passo 1 — Adicionar a dependência¶
O NexusPrism é publicado via JitPack. Adicione o repositório e o artefato da API ao seu pom.xml:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.O-Tiger.NexusPrismModularizado</groupId>
<artifactId>nexusprism-api</artifactId>
<version>master-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
O escopo
providedé obrigatório. O NexusPrism inclui a API em tempo de execução — não a inclua (shade) no seu JAR.
Para Gradle (Kotlin DSL):
repositories {
maven("https://jitpack.io")
}
dependencies {
compileOnly("com.github.O-Tiger.NexusPrismModularizado:nexusprism-api:master-SNAPSHOT")
}
Passo 2 — Declarar a dependência no plugin.yml¶
Como o NexusPrism é opcional para a maioria das integrações, use softdepend. Use depend somente se o seu plugin não funcionar de forma alguma sem ele.
name: MeuPlugin
version: 1.0.0
main: com.exemplo.MeuPlugin
api-version: "1.21"
softdepend:
- NexusPrism
Passo 3 — Obter a instância da API¶
Sempre obtenha a API dentro do onEnable(), após o servidor estar completamente iniciado. Nunca a chame de um inicializador estático ou construtor.
import io.github.otiger.nexusprism.api.NexusPrismAPI;
public class MeuPlugin extends JavaPlugin {
private NexusPrismAPI nexus;
@Override
public void onEnable() {
nexus = NexusPrismAPI.get();
if (nexus == null) {
getLogger().warning("NexusPrism não encontrado — integração desativada.");
return;
}
if (!nexus.isReady()) {
getLogger().warning("NexusPrism ainda está inicializando.");
return;
}
getLogger().info("Conectado ao NexusPrism " + nexus.getVersion());
}
}
Passo 4 — Provedores de módulos¶
Cada módulo opcional do NexusPrism expõe um provedor tipado através de um registro estático. Todos os provedores retornam Optional — se o módulo estiver desativado ou não instalado, o Optional estará vazio. Sempre use ifPresent ou orElse para lidar com isso com segurança.
Economia¶
UUID uuid = player.getUniqueId();
// Ler saldo
double saldo = NexusPrismAPI.economy()
.map(eco -> eco.getBalance(uuid))
.orElse(0.0);
// Adicionar dinheiro
NexusPrismAPI.economy().ifPresent(eco -> eco.addMoney(uuid, 500.0));
// Cobrar jogador (retorna false se saldo insuficiente)
boolean sucesso = NexusPrismAPI.economy()
.map(eco -> eco.withdrawMoney(uuid, 100.0))
.orElse(false);
// Top saldos
NexusPrismAPI.economy().ifPresent(eco ->
eco.getTopBalances(10).forEach(entry ->
System.out.println(entry.uuid() + " → " + entry.balance())));
Autenticação / Segurança¶
// Verificar se o jogador está logado (padrão true quando módulo ausente)
boolean logado = NexusPrismAPI.auth()
.map(auth -> auth.isAuthenticated(uuid))
.orElse(true);
Clãs¶
// Obter tag do clã do jogador
String tag = NexusPrismAPI.clans()
.flatMap(c -> c.getClanTag(uuid))
.orElse("");
// Verificar se está em um clã
boolean temCla = NexusPrismAPI.clans()
.map(c -> c.isInClan(uuid))
.orElse(false);
Essentials¶
// Teleportar jogador para a home "base"
NexusPrismAPI.essentials().ifPresent(ess ->
ess.teleportHome(player, "base"));
// Verificar status AFK
boolean estaAfk = NexusPrismAPI.essentials()
.map(ess -> ess.isAfk(uuid))
.orElse(false);
Votos¶
// Total de votos do jogador
int votos = NexusPrismAPI.votes()
.map(v -> v.getTotalVotes(uuid))
.orElse(0);
// Sequência atual de votos
int sequencia = NexusPrismAPI.votes()
.map(v -> v.getStreak(uuid))
.orElse(0);
Encantamentos Personalizados¶
// Verificar se um item tem um encantamento personalizado
boolean temEnchant = NexusPrismAPI.enchants()
.map(e -> e.hasEnchant(item, "SOUL_MENDER"))
.orElse(false);
// Obter o nível de um encantamento
int nivel = NexusPrismAPI.enchants()
.map(e -> e.getLevel(item, "SOUL_MENDER"))
.orElse(0);
Caixas (Crates)¶
// Dar uma chave de caixa ao jogador
NexusPrismAPI.crates().ifPresent(c ->
c.giveKey(player, "VOTE_CRATE", 1));
MMO¶
import io.github.otiger.nexusprism.api.mmo.MmoRegistry;
UUID uuid = player.getUniqueId();
MmoRegistry.get().ifPresent(mmo -> {
int nivel = mmo.getLevel(uuid);
int mana = mmo.getCurrentMana(uuid);
int maxMana = mmo.getMaxMana(uuid);
// Consome mana (retorna false se insuficiente)
if (mmo.hasMana(uuid, 20) && mmo.consumeMana(uuid, 20)) {
// habilidade ativada
}
// Adiciona XP a uma árvore de habilidades
mmo.addSkillXp(player, "warrior", 100L);
// Adiciona XP a uma profissão
mmo.addProfessionXp(player, "mining", 50L);
int forca = mmo.getStat(uuid, "STRENGTH");
List<String> habilidades = mmo.getUnlockedAbilityIds(uuid);
});
Chat¶
import io.github.otiger.nexusprism.api.chat.ChatRegistry;
ChatRegistry.get().ifPresent(chat -> {
boolean silenciado = chat.isMuted(uuid);
chat.mute(uuid, 10 * 60 * 1000L, "Spam", "Console");
chat.broadcastToChannel("global", "[MeuAddon] Anúncio do servidor!");
String canalAtivo = chat.getActiveChannel(uuid);
});
Proteções¶
import io.github.otiger.nexusprism.api.protections.ProtectionsRegistry;
ProtectionsRegistry.get().ifPresent(prot -> {
boolean pvp = prot.isPvpAllowed(location);
boolean emDuelo = prot.isInDuel(uuid);
prot.getDuelOpponent(uuid).ifPresent(oponente -> { /* ... */ });
List<String> regioes = prot.getRegionNamesAt(location);
int reivindicadas = prot.getRegionCount(uuid);
});
Eventos (Lua de Sangue, Arco do Sacrifício, Chefe Isekai)¶
import io.github.otiger.nexusprism.api.events.EventsRegistry;
EventsRegistry.get().ifPresent(events -> {
boolean luaAtiva = events.isBloodMoonActive();
int sequencia = events.getSacrificeStreak(uuid);
boolean emSacrificio = events.isInSacrifice(uuid);
boolean temChefe = events.hasActiveBossFight(uuid);
});
Hologramas¶
import io.github.otiger.nexusprism.api.holograms.HologramRegistry;
HologramRegistry.get().ifPresent(holo -> {
holo.create("meu_holo", location);
holo.addLine("meu_holo", "§aOlá do meu addon!");
holo.setLine("meu_holo", 0, "§eLinha atualizada");
holo.showToPlayer("meu_holo", player);
holo.delete("meu_holo");
});
Mochilas¶
import io.github.otiger.nexusprism.api.backpack.BackpackRegistry;
BackpackRegistry.get().ifPresent(bp -> {
int quantidade = bp.getBackpackCount(uuid);
bp.openFirstBackpack(player);
bp.openBackpack(player, ids.get(0));
});
Traits (Cartas de Tarô)¶
import io.github.otiger.nexusprism.api.traits.TraitsRegistry;
TraitsRegistry.get().ifPresent(traits -> {
List<String> cartas = traits.getCards(uuid);
boolean temCarta = traits.hasCard(uuid, "The Tower");
int nivelPesquisa = traits.getResearchLevel(uuid);
});
Discord¶
import io.github.otiger.nexusprism.api.discord.DiscordRegistry;
DiscordRegistry.get().ifPresent(discord -> {
boolean vinculado = discord.isLinked(uuid);
discord.sendMessage("server-log", "[MeuAddon] Algo aconteceu!");
discord.sendWebhook("server-log", "Bot MeuAddon", null, "Jogador fez algo.");
});
Empregos¶
import io.github.otiger.nexusprism.api.economy.JobRegistry;
JobRegistry.get().ifPresent(empregos -> {
Optional<String> empregoId = empregos.getActiveJob(uuid);
boolean temEmprego = empregos.hasJob(uuid);
if (temEmprego) {
int nivel = empregos.getLevel(uuid, empregoId.get());
}
empregos.joinJob(uuid, "miner");
empregos.leaveJob(uuid);
});
Redes de Energia¶
import io.github.otiger.nexusprism.api.energy.EnergyRegistry;
EnergyRegistry.get().ifPresent(energia -> {
energia.getNetworkAt(location).ifPresent(rede -> {
long armazenado = rede.getTotalStoredEnergy();
long cap = rede.getTotalCapacity();
int fluxo = rede.getNetFlow();
});
energia.registerComponent(meuComponente);
energia.unregisterComponent(meuComponente);
});
Passo 10 — Carregamento de Conteúdo de Addons¶
Addons nativos podem registrar itens, máquinas, receitas de crafting e receitas de infinity diretamente de arquivos YAML empacotados no JAR.
ContentLoadResult result = content()
.items("items.yml")
.machines("machines.yml")
.recipes("recipes.yml")
.infinityRecipes("infinity_recipes")
.register();
result.logTo(getLogger());
Receitas de Processamento de Máquinas (programático)¶
import io.github.otiger.nexusprism.api.machines.recipe.MachineProcessingRecipe;
import io.github.otiger.nexusprism.api.machines.recipe.MachineProcessingRegistry;
MachineProcessingRegistry.register(
MachineProcessingRecipe.builder("minha_receita", "EXAMPLE_FURNACE")
.input("DIAMOND", 1)
.output("EXAMPLE_INGOT", 3)
.time(120)
.source(getId())
.build()
);
// Em onDisable — sempre limpe:
MachineProcessingRegistry.unregisterBySource(getId());
Passo 5 — Itens personalizados¶
Use NexusItemBuilder para inspecionar qualquer ItemStack e verificar se é um item personalizado do NexusPrism.
import io.github.otiger.nexusprism.api.items.builder.NexusItemBuilder;
ItemStack item = player.getInventory().getItemInMainHand();
// Obter o ID interno do item (ex: "COPPER_DUST", "CELESTIAL_SWORD")
String id = NexusItemBuilder.getItemId(item); // null se não for item NexusPrism
if ("CELESTIAL_SWORD".equals(id)) {
player.sendMessage("Você está segurando a Espada Celestial!");
}
Para criar um item do registro:
import io.github.otiger.nexusprism.api.registry.ItemRegistry;
ItemRegistry registro = nexus.getService(ItemRegistry.class);
if (registro != null) {
registro.getItem("COPPER_DUST").ifPresent(nexusItem -> {
ItemStack stack = nexusItem.buildStack(1);
player.getInventory().addItem(stack);
});
}
Passo 6 — API de Território¶
Se você estiver construindo um sistema de reivindicação de terrenos e quiser que ele se integre às verificações de proteção do NexusPrism, implemente TerritoryProvider e registre-o.
import io.github.otiger.nexusprism.api.territory.TerritoryProvider;
import io.github.otiger.nexusprism.api.territory.TerritoryRegistry;
public class MeuProvedorRegiao implements TerritoryProvider {
@Override
public boolean isClaimed(Location location) {
return MeuGerenciadorRegiao.isClaimed(location);
}
@Override
public boolean canBuild(Player player, Location location) {
return MeuGerenciadorRegiao.canBuild(player, location);
}
@Override
public boolean canInteract(Player player, Location location) {
return MeuGerenciadorRegiao.canInteract(player, location);
}
@Override
public Optional<String> getClaimName(Location location) {
return MeuGerenciadorRegiao.getRegionName(location);
}
}
private final MeuProvedorRegiao provedor = new MeuProvedorRegiao();
@Override
public void onEnable() {
TerritoryRegistry.register(provedor);
}
@Override
public void onDisable() {
TerritoryRegistry.unregister(provedor);
}
O NexusPrism usa agregação deny-wins: se qualquer provedor negar
canBuild, a ação é bloqueada.
Passo 7 — Flags de eventos¶
EventFlags expõe flags de estado em tempo real do módulo de eventos.
import io.github.otiger.nexusprism.api.events.EventFlags;
// A Lua de Sangue está ativa?
if (EventFlags.bloodMoonActive) {
// Aplique efeitos especiais...
}
// Multiplicador de recompensa por kill (1.0 = normal, 1.5 = +50% na Lua de Sangue)
double multiplicador = EventFlags.killPayMultiplier;
double recompensa = baseRecompensa * multiplicador;
Passo 8 — Injeção de loot em estruturas¶
Registre um StructureProvider para injetar loot personalizado em estruturas vanilla durante a geração.
import io.github.otiger.nexusprism.api.structures.StructureProvider;
import io.github.otiger.nexusprism.api.structures.StructureRegistry;
public class MeuLootProvider implements StructureProvider {
@Override
public NamespacedKey structure() {
return NamespacedKey.minecraft("village/plains/houses/plains_small_house_1");
}
@Override
public List<ItemStack> loot() {
return List.of(new ItemStack(Material.DIAMOND, 1));
}
}
// Registrar no onEnable:
StructureRegistry.register(new MeuLootProvider());
Passo 9 — Escrevendo um addon nativo¶
Addons nativos são JARs colocados em plugins/NexusPrism/addons/. Eles são carregados diretamente pelo NexusPrism e não precisam de plugin.yml próprio.
1. Criar a classe do addon¶
import io.github.otiger.nexusprism.api.addon.AbstractNexusAddon;
public class MeuAddon extends AbstractNexusAddon {
@Override
public void onEnable() {
saveDefaultConfig();
String msg = getConfig().getString("mensagem-boas-vindas", "Olá!");
getLogger().info(msg);
getLogger().info("Conectado — NexusPrism " + getAPI().getVersion());
}
@Override
public void onDisable() {
getLogger().info(getName() + " desativado.");
}
}
2. Criar addon.yml dentro do JAR¶
id: meu-addon
name: Meu Addon
version: 1.0.0
description: Demonstra a API de addon do NexusPrism.
authors:
- SeuNome
main: com.exemplo.MeuAddon
min-nexus-version: 1.0.0
dependencies: []
soft-dependencies: []
3. Compilar e instalar¶
Passo 11 — Provedores de integração (permissões, placeholders, idioma)¶
Estas três interfaces ficam em nexusprism-api e são usadas pelo NexusPrism internamente. Addons podem lê-las via getService() ou implementá-las para substituir/estender o comportamento padrão.
PermissionProvider¶
Abstrai o sistema de permissões subjacente (LuckPerms, Vault, etc.). Obtenha o provedor ativo para consultar grupos, prefix/suffix e metadados sem dependência em tempo de compilação do LuckPerms.
import io.github.otiger.nexusprism.api.integration.PermissionProvider;
PermissionProvider perms = NexusPrismAPI.get().getService(PermissionProvider.class);
if (perms == null || !perms.isAvailable()) return;
boolean isAdmin = perms.hasPermission(player, "nexusprism.admin");
String grupo = perms.getPrimaryGroup(player).orElse("default");
String prefix = perms.getPrefix(player).orElse("");
int tier = perms.getNexusTierLevel(player); // 1–5, 0 se nenhum
PlaceholderProvider¶
SPI que o NexusPrism expõe para a ponte PAPI. Implemente e registre para adicionar novos identificadores %nexusprism_*% a partir do seu addon.
import io.github.otiger.nexusprism.api.integration.PlaceholderProvider;
public class MeusPlaceholders implements PlaceholderProvider {
@Override public String getIdentifier() { return "meuaddon"; }
@Override
public String onPlaceholderRequest(Player player, String params) {
if ("pontos".equals(params)) return String.valueOf(MeuAddon.getPontos(player));
return null;
}
}
LangProvider¶
Implementado pelo LanguageManager do core. Obtenha-o para buscar mensagens traduzidas e coloridas para um jogador específico (respeitando o idioma escolhido).
import io.github.otiger.nexusprism.api.lang.LangProvider;
LangProvider lang = NexusPrismAPI.get().getService(LangProvider.class);
if (lang == null) return;
String msg = lang.getMsg(player.getUniqueId(), "chat.channel-switched", "channel", "Global");
player.sendMessage(msg);
lang.setPlayerLanguage(player.getUniqueId(), "pt_BR");
List<String> disponiveis = lang.getAvailableLanguages(); // ["en_US", "pt_BR", ...]
Exemplo completo de integração¶
Plugin que recompensa jogadores com dinheiro ao matar, respeitando o multiplicador da Lua de Sangue:
package com.exemplo;
import io.github.otiger.nexusprism.api.NexusPrismAPI;
import io.github.otiger.nexusprism.api.events.EventFlags;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class RecompensaKillPlugin extends JavaPlugin implements Listener {
@Override
public void onEnable() {
if (NexusPrismAPI.get() == null) {
getLogger().warning("NexusPrism não encontrado — recompensas desativadas.");
return;
}
getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onMorteJogador(PlayerDeathEvent event) {
if (!(event.getEntity().getKiller() instanceof Player killer)) return;
double base = 25.0;
double recompensa = base * EventFlags.killPayMultiplier;
NexusPrismAPI.economy().ifPresent(eco -> {
eco.addMoney(killer.getUniqueId(), recompensa);
killer.sendMessage("§a+$" + String.format("%.0f", recompensa) + " §7pela kill!");
});
}
}
Referência Rápida¶
| Superfície da API | Classe / método |
|---|---|
| Obter instância da API | NexusPrismAPI.get() |
| Provedores principais | |
| Economia | NexusPrismAPI.economy() → EconomyProvider |
| Auth | NexusPrismAPI.auth() → AuthProvider |
| Clãs | NexusPrismAPI.clans() → ClanProvider |
| Essentials | NexusPrismAPI.essentials() → EssentialsProvider |
| Votos | NexusPrismAPI.votes() → VoteProvider |
| Encantamentos | NexusPrismAPI.enchants() → CustomEnchantProvider |
| Caixas | NexusPrismAPI.crates() → CrateProvider |
| Provedores de módulos | |
| MMO (nível, stats, mana, skills, profissões) | MmoRegistry.get() → MmoProvider |
| Chat (silêncio, canais, broadcast) | ChatRegistry.get() → ChatProvider |
| Proteções (PvP, regiões, duelos) | ProtectionsRegistry.get() → ProtectionsProvider |
| Eventos (Lua de Sangue, Sacrifício, Isekai) | EventsRegistry.get() → EventsProvider |
| Hologramas (criar, atualizar, mostrar/ocultar) | HologramRegistry.get() → HologramProvider |
| Mochilas (quantidade, abrir GUI) | BackpackRegistry.get() → BackpackProvider |
| Traits / Cartas de Tarô | TraitsRegistry.get() → TraitsProvider |
| Discord (vincular, enviar mensagem/webhook) | DiscordRegistry.get() → DiscordProvider |
| Empregos (emprego ativo, nível, XP) | JobRegistry.get() → JobProvider |
| Redes de energia | EnergyRegistry.get() → EnergyProvider |
| Provedores de integração | |
| Backend de permissões (grupos, prefix, meta) | nexus.getService(PermissionProvider.class) |
| Expansão de placeholders (ponte PAPI) | nexus.getService(PlaceholderProvider.class) |
| Idioma / tradução | nexus.getService(LangProvider.class) |
| Conteúdo e extensibilidade | |
| Carregamento de conteúdo de addon | content().items().machines().recipes().register() |
| Receitas de processamento de máquinas | MachineProcessingRegistry.register(MachineProcessingRecipe) |
| ID de item | NexusItemBuilder.getItemId(ItemStack) |
| Registro de itens | nexus.getService(ItemRegistry.class) |
| Território | TerritoryRegistry.register(TerritoryProvider) |
| Estado de eventos | EventFlags.bloodMoonActive, EventFlags.killPayMultiplier |
| Estruturas | StructureRegistry.register(StructureProvider) |
| Base de addon nativo | AbstractNexusAddon + addon.yml |
| Template inicial | O-Tiger/NexusPrism-Addon-Example |
Boas práticas¶
- Sempre verifique null em
NexusPrismAPI.get()antes de usar qualquer provedor. - Use
softdependa menos que seu plugin seja literalmente um JAR de addon. - Nunca faça shade de
nexusprism-api— use escopoprovided/compileOnly. - Cancele o registro de provedores no
onDisable()para evitar listeners fantasma após reload. - Use cadeias de
Optional(ifPresent,orElse) — nunca chame.get()em um Optional vazio. - Verifique
isReady()se você chamar a API imediatamente no enable.