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 empilhadagetLastAmount()- Retorna a quantidade antes de empilhar (BigInteger)getAmount()- Retorna a nova quantidade empilhada (BigInteger)setAmount(BigInteger)- Modifica a quantidade empilhadagetCustomName()- Retorna o nome customizado do item empilhadosetCustomName(String)- Modifica o nome customizadoisCancelled()- Verifica se o evento está canceladosetCancelled(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 itemgetItem()- Retorna a entidade Item (drop empilhado)getAmount()- Retorna a quantidade de pickup (BigInteger)setAmount(BigInteger)- Modifica a quantidade de pickupisCancelled()- Verifica se o evento está canceladosetCancelled(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
- Manipule BigInteger adequadamente para quantidades muito grandes
- Cancele eventos responsavelmente para evitar quebrar mecânicas de item
- Valide quantidades antes de modificar em eventos
- Use nomes customizados para identificação clara de pilha
- Registre eventos de pilha para debug e estatísticas
- Manipule operações assincronamente cuidadosamente em manipuladores de evento
- 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);
}
}
}