API
A API fornece uma interface pública para desenvolvedores integrarem seus plugins ao sistema de combat log do yCombatLog, permitindo gerenciar status de combate de jogadores.
Obtendo a instância da API
A API é exposta através de um BukkitService assim como feito comumente no Vault.
Exemplo:
CombatAPIHolder combatAPI;
try {
RegisteredServiceProvider<CombatAPIHolder> rsp = Bukkit.getServer().getServicesManager().getRegistration(CombatAPIHolder.class);
return rsp == null ? null : (CombatAPIHolder)rsp.getProvider();
} catch (Throwable t) {
return null;
}
Métodos disponíveis
isInCombat(String playerName)
Verifica se um jogador está em combate.
boolean inCombat = combatAPI.isInCombat("Steve");Parâmetros:
playerName- Nome do jogador a verificar
Retorno:
truese o jogador está em combate,falsecaso contrário
Observações:
- Verifica no DAO (Data Access Object) do sistema
- Um jogador em combate não pode sair do servidor sem penalidade
- O status de combate é temporal e expira automaticamente
addCombat(String playerName)
Adiciona um jogador ao status de combate.
combatAPI.addCombat("Steve");Parâmetros:
playerName- Nome do jogador a adicionar em combate
Observações:
- Cria uma nova instância de Combat com duração padrão (configurável)
- Se o jogador já está em combate, atualiza o tempo
- A duração é definida em
config.tempoCombate - Útil para integrar eventos de combate personalizados
removeCombat(String playerName)
Remove um jogador do status de combate.
combatAPI.removeCombat("Steve");Parâmetros:
playerName- Nome do jogador a remover do combate
Observações:
- Remove o jogador imediatamente do mapa de combate
- O jogador poderá sair do servidor sem penalidade após isso
- Útil para casos especiais ou quando combate deve ser encerrado manualmente
Configuração
A duração do combate é configurada em:
tempoCombate: 30 # Tempo em segundosBoas práticas
- Use
isInCombat()antes de permitir ações sensíveis (logout, PvP, etc) - Adicione combate quando houver interação hostil entre jogadores
- Evite remover combate manualmente sem motivo válido
- Considere a duração do combate ao integrar sistemas personalizados
- Armazene o resultado de
isInCombat()para evitar chamadas frequentes
Exemplos de uso
Verificar antes de logout
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
CombatAPIHolder combatAPI = getCombatAPI();
if (combatAPI.isInCombat(player.getName())) {
// Aplicar penalidade de logout em combate
applyLogoutPenalty(player);
}
}Adicionar combate em eventos de dano
@EventHandler
public void onEntityDamage(EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) {
Player victim = (Player) event.getEntity();
Player attacker = (Player) event.getDamager();
combatAPI.addCombat(victim.getName());
combatAPI.addCombat(attacker.getName());
}
}Sistema de proteção em combate
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
CombatAPIHolder combatAPI = getCombatAPI();
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (combatAPI.isInCombat(player.getName())) {
event.setCancelled(true);
player.sendMessage("Você não pode interagir enquanto está em combate!");
}
}
}Notificação de status de combate
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
CombatAPIHolder combatAPI = getCombatAPI();
if (combatAPI.isInCombat(player.getName())) {
player.sendMessage("Você ainda está em combate! Aguarde o tempo expirar.");
}
}Sistema de arena com combate obrigatório
public void startArenaMatch(Player player1, Player player2) {
CombatAPIHolder combatAPI = getCombatAPI();
combatAPI.addCombat(player1.getName());
combatAPI.addCombat(player2.getName());
player1.sendMessage("Arena iniciada!");
player2.sendMessage("Arena iniciada!");
}Integração com sistema de economia
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
CombatAPIHolder combatAPI = getCombatAPI();
if (combatAPI.isInCombat(player.getName())) {
double penalty = 1000; // Moedas perdidas
removeBalance(player.getName(), penalty);
// Remover combate após penalidade
combatAPI.removeCombat(player.getName());
}
}Verificação periódica de combate
public void checkPlayersInCombat() {
CombatAPIHolder combatAPI = getCombatAPI();
for (Player player : Bukkit.getOnlinePlayers()) {
if (combatAPI.isInCombat(player.getName())) {
player.addPotionEffect(new PotionEffect(
PotionEffectType.WEAKNESS,
40,
0,
false,
false
));
}
}
}Dashboard de combate
public void showCombatStatus(Player player) {
CombatAPIHolder combatAPI = getCombatAPI();
player.sendMessage("═══════════════════════════");
player.sendMessage("STATUS DE COMBATE");
player.sendMessage("═══════════════════════════");
if (combatAPI.isInCombat(player.getName())) {
player.sendMessage("Status: EM COMBATE");
player.sendMessage("⚠ Você não pode sair do servidor!");
} else {
player.sendMessage("Status: SEGURO");
player.sendMessage("✓ Você pode sair do servidor");
}
player.sendMessage("═══════════════════════════");
}