LogoyStore

API

Documentação completa da API do plugin yStackDrops, incluindo manipulação de eventos para mecânicas de empilhamento de itens e pickup de jogador.

Obtendo Listeners de Eventos

Para ouvir eventos do yStackDrops, registre uma classe Listener no seu plugin:

import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import br.com.ystoreplugins.product.ystackdrops.event.ItemStackedEvent;
import br.com.ystoreplugins.product.ystackdrops.event.PlayerPickupStackEvent;

public class MyPlugin extends JavaPlugin {
    
    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(new StackDropsListener(), this);
    }
}

Eventos

ItemStackedEvent

Disparado quando múltiplos drops de itens são empilhados juntos em uma única entidade. Este evento é cancelável.

Métodos Disponíveis:

  • getEntity() - Retorna a Entity que foi empilhada
  • getLastAmount() - Retorna a quantidade antes de empilhar (BigInteger)
  • getAmount() - Retorna a nova quantidade empilhada (BigInteger)
  • setAmount(BigInteger) - Modifica a quantidade empilhada
  • getCustomName() - Retorna o nome customizado do item empilhado
  • setCustomName(String) - Modifica o nome customizado
  • isCancelled() - Verifica se o evento está cancelado
  • setCancelled(boolean) - Cancela o empilhamento

Observações:

  • Dispara quando itens se combinam em uma pilha maior
  • Usa BigInteger para lidar com quantidades muito grandes
  • O nome customizado é exibido acima do item
  • Cancelar previne que os itens sejam empilhados
  • LastAmount mostra a contagem anterior antes desta operação de empilhamento

Exemplo:

@EventHandler
public void onItemStacked(ItemStackedEvent event) {
    if (event.isCancelled()) return;
    
    Entity entity = event.getEntity();
    BigInteger lastAmount = event.getLastAmount();
    BigInteger newAmount = event.getAmount();
    
    System.out.println("Itens empilhados de " + lastAmount + " para " + newAmount);
}

PlayerPickupStackEvent

Disparado quando um jogador pega um item drop empilhado. Este evento é cancelável.

Métodos Disponíveis:

  • getPlayer() - Retorna o Player que pegou o item
  • getItem() - Retorna a entidade Item (drop empilhado)
  • getAmount() - Retorna a quantidade de pickup (BigInteger)
  • setAmount(BigInteger) - Modifica a quantidade de pickup
  • isCancelled() - Verifica se o evento está cancelado
  • setCancelled(boolean) - Cancela o pickup

Observações:

  • Dispara quando jogador coleta itens empilhados
  • A quantidade pode ser muito grande (usa BigInteger)
  • Cancelar previne que o jogador receba os itens
  • Útil para aplicar condições de pickup ou modificar quantidades
  • Evento estende PlayerEvent para acesso fácil aos dados do jogador

Exemplo:

@EventHandler
public void onPlayerPickupStack(PlayerPickupStackEvent event) {
    if (event.isCancelled()) return;
    
    Player player = event.getPlayer();
    Item item = event.getItem();
    BigInteger amount = event.getAmount();
    
    System.out.println(player.getName() + " pegou " + amount + " itens");
}

Estruturas de Dados

Campos do ItemStackedEvent

  • lastAmount - Contagem anterior de pilha (BigInteger, imutável)
  • amount - Contagem atual de pilha (BigInteger, mutável)
  • customName - Nome de exibição para o item empilhado (String, mutável)
  • cancelled - Se o empilhamento está cancelado (boolean)

Campos do PlayerPickupStackEvent

  • item - A entidade Item sendo pegada (Item, imutável)
  • amount - Quantidade sendo pegada (BigInteger, mutável)
  • cancelled - Se o pickup está cancelado (boolean)

Boas Práticas

  1. Manipule BigInteger adequadamente para quantidades muito grandes
  2. Cancele eventos responsavelmente para evitar quebrar mecânicas de item
  3. Valide quantidades antes de modificar em eventos
  4. Use nomes customizados para identificação clara de pilha
  5. Registre eventos de pilha para debug e estatísticas
  6. Manipule operações assincronamente cuidadosamente em manipuladores de evento
  7. Verifique espaço de inventário antes de permitir modificações de pickup

Exemplos de Uso

Exemplo 1: Rastreamento Básico de Empilhamento de Item

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import br.com.ystoreplugins.product.ystackdrops.event.ItemStackedEvent;

public class ItemStackingTracker implements Listener {
    
    @EventHandler
    public void onItemStacked(ItemStackedEvent event) {
        Entity entity = event.getEntity();
        BigInteger amount = event.getAmount();
        
        System.out.println("[EMPILHADO] Itens agora: " + amount);
    }
}

Exemplo 2: Rastreamento de Pickups de Jogador

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import br.com.ystoreplugins.product.ystackdrops.event.PlayerPickupStackEvent;

public class PickupTracker implements Listener {
    
    @EventHandler
    public void onPlayerPickupStack(PlayerPickupStackEvent event) {
        Player player = event.getPlayer();
        BigInteger amount = event.getAmount();
        
        System.out.println("[PICKUP] " + player.getName() + 
            " pegou " + amount + " itens");
    }
}

Exemplo 3: Prevenção de Sobre-empilhamento

@EventHandler
public void onItemStacked(ItemStackedEvent event) {
    BigInteger maxAmount = new BigInteger("1000000");
    
    if (event.getAmount().compareTo(maxAmount) > 0) {
        event.setCancelled(true);
        System.out.println("Pilha prevenida: excede quantidade máxima");
    }
}

Exemplo 4: Verificação de Espaço de Inventário

@EventHandler
public void onPlayerPickupStack(PlayerPickupStackEvent event) {
    Player player = event.getPlayer();
    BigInteger amount = event.getAmount();
    
    // Verifica se o jogador tem espaço no inventário
    if (player.getInventory().firstEmpty() == -1) {
        event.setCancelled(true);
        player.sendMessage("§cSeu inventário está cheio!");
    }
}

Exemplo 5: Nomeação Customizada de Pilha

@EventHandler
public void onItemStacked(ItemStackedEvent event) {
    BigInteger amount = event.getAmount();
    
    // Aplicar nomenclatura baseada em nível
    if (amount.compareTo(new BigInteger("100000")) > 0) {
        event.setCustomName("§6Pilha Massiva: " + amount);
    } else if (amount.compareTo(new BigInteger("10000")) > 0) {
        event.setCustomName("§bPilha Grande: " + amount);
    } else {
        event.setCustomName("§aPilha: " + amount);
    }
}

Exemplo 6: Modificação de Quantidade BigInteger

@EventHandler
public void onPlayerPickupStack(PlayerPickupStackEvent event) {
    Player player = event.getPlayer();
    BigInteger originalAmount = event.getAmount();
    
    // Aplicar bônus VIP (1.5x pickup)
    if (player.hasPermission("stackdrops.vip")) {
        BigInteger bonusAmount = originalAmount.multiply(new BigInteger("3"))
            .divide(new BigInteger("2"));
        event.setAmount(bonusAmount);
        player.sendMessage("§6Bônus VIP: ×1.5 itens!");
    }
}

Exemplo 7: Limites de Pilha Por Tipo de Item

@EventHandler
public void onItemStacked(ItemStackedEvent event) {
    Entity entity = event.getEntity();
    BigInteger amount = event.getAmount();
    
    // Limitar pilhas baseado no tipo de item
    BigInteger maxAmount = new BigInteger("999999");
    
    if (amount.compareTo(maxAmount) > 0) {
        event.setAmount(maxAmount);
        event.setCustomName("§cPILHA MÁXIMA: " + maxAmount);
    }
}

Exemplo 8: Rastreador Abrangente de Estatísticas de Drop

public class DropStatisticsTracker implements Listener {
    
    private final JavaPlugin plugin;
    private BigInteger totalItemsStacked = BigInteger.ZERO;
    private BigInteger totalItemsPickedUp = BigInteger.ZERO;
    
    public DropStatisticsTracker(JavaPlugin plugin) {
        this.plugin = plugin;
    }
    
    @EventHandler
    public void onItemStacked(ItemStackedEvent event) {
        totalItemsStacked = totalItemsStacked.add(event.getAmount());
    }
    
    @EventHandler
    public void onPlayerPickupStack(PlayerPickupStackEvent event) {
        totalItemsPickedUp = totalItemsPickedUp.add(event.getAmount());
    }
    
    public void printStatistics() {
        plugin.getLogger().info("=== Estatísticas de Stack Drops ===");
        plugin.getLogger().info("Total Empilhado: " + totalItemsStacked);
        plugin.getLogger().info("Total Pegado: " + totalItemsPickedUp);
    }
}

Exemplo 9: Prevenção de Pickup Anti-Spam

public class AntiSpamPickup implements Listener {
    
    private final Map<Player, Long> lastPickup = new HashMap<>();
    private static final long COOLDOWN_MS = 100;
    
    @EventHandler
    public void onPlayerPickupStack(PlayerPickupStackEvent event) {
        Player player = event.getPlayer();
        long now = System.currentTimeMillis();
        
        if (lastPickup.containsKey(player)) {
            long last = lastPickup.get(player);
            if (now - last < COOLDOWN_MS) {
                event.setCancelled(true);
                return;
            }
        }
        
        lastPickup.put(player, now);
    }
}

Exemplo 10: Sistema Dinâmico de Notificação de Pilha

public class StackNotificationSystem implements Listener {
    
    @EventHandler
    public void onItemStacked(ItemStackedEvent event) {
        BigInteger amount = event.getAmount();
        
        // Notificar jogadores próximos de pilhas grandes
        if (amount.compareTo(new BigInteger("10000")) > 0) {
            Entity entity = event.getEntity();
            event.getEntity().getWorld().getNearbyEntities(
                entity.getLocation(), 20, 20, 20
            ).stream()
            .filter(e -> e instanceof Player)
            .forEach(e -> {
                Player player = (Player) e;
                player.sendMessage("§a§l⚡ MEGA PILHA: " + amount + " itens!");
            });
        }
    }
    
    @EventHandler
    public void onPlayerPickupStack(PlayerPickupStackEvent event) {
        Player player = event.getPlayer();
        BigInteger amount = event.getAmount();
        
        // Notificar de pickups grandes
        if (amount.compareTo(new BigInteger("50000")) > 0) {
            player.sendMessage("§6§l✦ PICKUP ÉPICO: " + amount + " itens!");
            player.playSound(player.getLocation(), 
                org.bukkit.Sound.UI_TOAST_CHALLENGE_COMPLETE, 1.0f, 1.0f);
        }
    }
}

Nesta página