LogoyStore

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:

  • true se o jogador está em combate, false caso 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 segundos

Boas 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("═══════════════════════════");
}

Nesta página