package me.artix001.miceenchantments.enchantments.magnetism;
import me.artix001.miceenchantments.manager.NBTManager;
import me.artix001.miceenchantments.utils.DropUtil;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public class MagnetismListener implements Listener {
private final MagnetismEnchantment magnetismEnchantment;
private final NBTManager nbtManager;
public MagnetismListener(MagnetismEnchantment magnetismEnchantment, NBTManager nbtManager) {
this.magnetismEnchantment = magnetismEnchantment;
this.nbtManager = nbtManager;
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
ItemStack tool = player.getInventory().getItemInMainHand();
int magnetismLevel = nbtManager.getEnchantmentLevel(tool, magnetismEnchantment);
if (magnetismLevel <= 0) return;
Block block = event.getBlock();
event.setDropItems(false);
List<ItemStack> drops = DropUtil.collectBlockDrops(block, tool, player, magnetismEnchantment, nbtManager);
for (ItemStack drop : drops) {
if (player.getInventory().firstEmpty() != -1) {
player.getInventory().addItem(drop);
} else {
player.getWorld().dropItemNaturally(player.getLocation(), drop);
}
}
}
}
package me.artix001.miceenchantments.utils;
import me.artix001.miceenchantments.enchantments.magnetism.MagnetismEnchantment;
import me.artix001.miceenchantments.manager.NBTManager;
import org.bukkit.block.Block;
import org.bukkit.block.Container;
import org.bukkit.block.DoubleChest;
import org.bukkit.block.ShulkerBox;
import org.bukkit.entity.Player;
import org.bukkit.inventory.DoubleChestInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
public class DropUtil {
public static List<ItemStack> getContainerDrops(Block block) {
List<ItemStack> drops = new ArrayList<>();
if (!(block.getState() instanceof Container container)) {
return drops;
}
if (container instanceof ShulkerBox) {
return drops;
}
Inventory inventory = container.getInventory();
if (inventory instanceof DoubleChestInventory doubleChestInv) {
DoubleChest doubleChest = doubleChestInv.getHolder();
if (doubleChest != null) {
Container left = (Container) doubleChest.getLeftSide();
boolean isLeftSide = block.equals(left.getBlock());
int startSlot = isLeftSide ? 0 : inventory.getSize() / 2;
int endSlot = startSlot + inventory.getSize() / 2;
for (int i = startSlot; i < endSlot; i++) {
ItemStack item = inventory.getItem(i);
if (item != null) {
drops.add(item.clone());
inventory.setItem(i, null);
}
}
}
} else {
for (ItemStack item : inventory.getContents()) {
if (item != null) {
drops.add(item.clone());
}
}
inventory.clear();
}
return drops;
}
public static List<ItemStack> collectBlockDrops(Block block, ItemStack tool, Player player, MagnetismEnchantment magnetismEnchantment, NBTManager nbtManager) {
List<ItemStack> drops = new ArrayList<>();
if (block.getState() instanceof ShulkerBox) {
drops.addAll(block.getDrops(tool));
} else {
drops.addAll(getContainerDrops(block));
drops.addAll(block.getDrops(tool));
}
int magnetismLevel = nbtManager.getEnchantmentLevel(tool, magnetismEnchantment);
if (magnetismLevel > 0) {
for (ItemStack drop : drops) {
if (player.getInventory().firstEmpty() != -1) {
player.getInventory().addItem(drop);
} else {
player.getWorld().dropItemNaturally(player.getLocation(), drop);
}
}
return new ArrayList<>();
}
return drops;
}
}