API
A API fornece uma interface pública para desenvolvedores integrarem seus plugins ao sistema de economias múltiplas do yEconomias, permitindo gerenciar várias moedas e saldos de jogadores.
Obtendo a instância da API
A API é exposta através de um BukkitService assim como feito comumente no Vault.
Exemplo:
EconomiasAPIHolder economiasAPI;
try {
RegisteredServiceProvider<EconomiasAPIHolder> rsp = Bukkit.getServer().getServicesManager().getRegistration(EconomiasAPIHolder.class);
return rsp == null ? null : (EconomiasAPIHolder)rsp.getProvider();
} catch (Throwable t) {
return null;
}
Métodos disponíveis
hasAccount(String playerName)
Verifica se uma conta de economia existe para um jogador (assíncrono).
economiasAPI.hasAccount("Steve").thenAccept(exists -> {
if (exists) {
System.out.println("Conta encontrada!");
}
});Parâmetros:
playerName- Nome do jogador
Retorno:
CompletableFuture<Boolean>- Future que contém true se a conta existe, false caso contrário
Observações:
- Operação assíncrona para não bloquear a thread principal
- Implementa CompletableFuture para melhor tratamento
- Case-insensitive (converte para minúsculas automaticamente)
- Use
.thenAccept()ou.join()para obter o resultado
getAccount(String playerName)
Recupera a conta de economia de um jogador (assíncrono).
economiasAPI.getAccount("Steve").thenAccept(user -> {
if (user != null) {
double balance = user.getCurrencies().get("coins");
}
});Parâmetros:
playerName- Nome do jogador
Retorno:
CompletableFuture<UserHolder>- Future contendo dados do usuário ou null
Observações:
- Operação assíncrono para não bloquear a thread principal
- Retorna null se o jogador não existir
- Case-insensitive (converte para minúsculas automaticamente)
- Use
.join()para obter resultado síncrono (se necessário)
getBalance(UserHolder user, String currency)
Obtém o saldo de uma moeda específica do jogador.
double balance = economiasAPI.getBalance(user, "coins");Parâmetros:
user- Objeto UserHolder do jogadorcurrency- Nome da moeda
Retorno:
- Valor double do saldo (0.0 se a moeda não existir)
Observações:
- Operação síncrona
- Retorna 0.0 se a moeda não for encontrada
- Seguro contra null (usa getOrDefault)
setBalance(UserHolder user, String currency, double amount)
Define o saldo de uma moeda do jogador.
economiasAPI.setBalance(user, "coins", 1000.0);Parâmetros:
user- Objeto UserHolder do jogadorcurrency- Nome da moedaamount- Novo saldo
Observações:
- Sobrescreve o saldo anterior
- Cria a moeda se ela não existir
- Salva automaticamente no banco de dados
- Use com cuidado (prefira addBalance ou removeBalance)
addBalance(UserHolder user, String currency, double amount)
Adiciona uma quantia ao saldo de uma moeda.
economiasAPI.addBalance(user, "coins", 500.0);Parâmetros:
user- Objeto UserHolder do jogadorcurrency- Nome da moedaamount- Quantia a adicionar
Observações:
- Método seguro para recompensas
- Cria a moeda com o valor se ela não existir
- Salva automaticamente no banco de dados
- Ideal para receber recompensas e bônus
removeBalance(UserHolder user, String currency, double amount)
Remove uma quantia do saldo de uma moeda.
economiasAPI.removeBalance(user, "coins", 100.0);Parâmetros:
user- Objeto UserHolder do jogadorcurrency- Nome da moedaamount- Quantia a remover
Observações:
- Método seguro para cobranças
- Pode resultar em saldo negativo se não validado
- Salva automaticamente no banco de dados
- Ideal para pagamentos e gastos
Estrutura de dados
UserHolder
Representa uma conta de economia de um jogador.
Propriedades principais:
- Nome do jogador
- Mapa de moedas (currencies)
- Cada moeda pode ter um saldo independente
- Métodos de persistência (save)
Boas práticas
- Sempre use operações assíncronas (
CompletableFuture) para hasAccount e getAccount - Valide saldos antes de remover (evite negativos)
- Use
addBalance()para recompensas eremoveBalance()para cobranças - Evite
setBalance()exceto em migrações ou ajustes administrativos - Sempre salve dados após modificações
- Use nomes de moedas consistentes em toda a aplicação
- Considere usar
join()com cuidado (pode bloquear a thread)
Exemplos de uso
Verificar existência de conta (assíncrono)
economiasAPI.hasAccount("Steve").thenAccept(exists -> {
if (exists) {
System.out.println("Conta existe");
} else {
System.out.println("Conta não existe");
}
}).exceptionally(throwable -> {
throwable.printStackTrace();
return null;
});Obter saldo de um jogador (assíncrono)
economiasAPI.getAccount("Steve").thenAccept(user -> {
if (user != null) {
double coinsBalance = economiasAPI.getBalance(user, "coins");
double diamondsBalance = economiasAPI.getBalance(user, "diamonds");
System.out.println("Coins: " + coinsBalance);
System.out.println("Diamonds: " + diamondsBalance);
}
}).exceptionally(throwable -> {
throwable.printStackTrace();
return null;
});Dar recompensa de evento
@EventHandler
public void onPlayerVictory(PlayerVictoryEvent event) {
Player player = event.getPlayer();
economiasAPI.getAccount(player.getName()).thenAccept(user -> {
if (user != null) {
double reward = 1000;
economiasAPI.addBalance(user, "coins", reward);
player.sendMessage("Você ganhou " + reward + " coins!");
}
});
}Sistema de pagamento
public boolean payPlayer(String payer, String receiver, double amount, String currency) {
CompletableFuture<Boolean> payerCheck = economiasAPI.hasAccount(payer);
CompletableFuture<Boolean> receiverCheck = economiasAPI.hasAccount(receiver);
CompletableFuture<Boolean> result = payerCheck.thenCombine(receiverCheck, (payerExists, receiverExists) -> {
if (!payerExists || !receiverExists) {
return false;
}
try {
UserHolder payerUser = economiasAPI.getAccount(payer).join();
UserHolder receiverUser = economiasAPI.getAccount(receiver).join();
double payerBalance = economiasAPI.getBalance(payerUser, currency);
if (payerBalance < amount) {
return false;
}
economiasAPI.removeBalance(payerUser, currency, amount);
economiasAPI.addBalance(receiverUser, currency, amount);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
});
return result.join();
}Verificar se pode fazer compra
public boolean canAfford(String playerName, String currency, double price) {
try {
UserHolder user = economiasAPI.getAccount(playerName).join();
if (user == null) return false;
double balance = economiasAPI.getBalance(user, currency);
return balance >= price;
} catch (Exception e) {
return false;
}
}Processar compra
@EventHandler
public void onShopPurchase(ShopPurchaseEvent event) {
String playerName = event.getPlayer().getName();
double price = event.getPrice();
String currency = "coins";
if (canAfford(playerName, currency, price)) {
economiasAPI.getAccount(playerName).thenAccept(user -> {
economiasAPI.removeBalance(user, currency, price);
event.getPlayer().sendMessage("Compra realizada!");
});
} else {
event.getPlayer().sendMessage("Saldo insuficiente!");
}
}Sincronizar múltiplas moedas
public void syncMultipleCurrencies(String playerName, Map<String, Double> balances) {
economiasAPI.getAccount(playerName).thenAccept(user -> {
if (user != null) {
for (Map.Entry<String, Double> entry : balances.entrySet()) {
economiasAPI.setBalance(user, entry.getKey(), entry.getValue());
}
System.out.println("Saldos sincronizados para " + playerName);
}
});
}Dashboard de saldos
public void showBalanceBoard(Player player) {
economiasAPI.getAccount(player.getName()).thenAccept(user -> {
if (user != null) {
player.sendMessage("═══════════════════════════");
player.sendMessage("SALDO DE ECONOMIAS");
player.sendMessage("═══════════════════════════");
user.getCurrencies().forEach((currency, balance) -> {
player.sendMessage(currency + ": " + balance);
});
player.sendMessage("═══════════════════════════");
}
});
}Sistema de multa/penalidade
public void applyPenalty(String playerName, String currency, double amount) {
economiasAPI.getAccount(playerName).thenAccept(user -> {
if (user != null) {
double currentBalance = economiasAPI.getBalance(user, currency);
double newBalance = Math.max(0, currentBalance - amount); // Não permite negativos
economiasAPI.setBalance(user, currency, newBalance);
Bukkit.getPlayer(playerName).sendMessage("Você recebeu uma multa de " + amount + " " + currency);
}
});
}