package me.illusion.custommobabilities.listener.mob; import me.illusion.custommobabilities.MobAbilityPlugin; import me.illusion.utilities.schedulerutil.builders.ScheduleBuilder; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.ItemMergeEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; public class VillagerTradeListener implements Listener { @EventHandler private void onClick(InventoryClickEvent event) { Inventory top = event.getView().getTopInventory(); if(top.getHolder() instanceof Villager villager) { explode(villager); villager.damage(100); event.setCancelled(true); } } private final MobAbilityPlugin main; private final Set noMerging = new HashSet<>(); public VillagerTradeListener(MobAbilityPlugin main) { this.main = main; } private void explode(Entity entity) { spawnExplodingItems(entity.getLocation(), 7, new ItemStack(Material.EMERALD)); spawnExplodingItems(entity.getLocation(), 7, new ItemStack(Material.DIAMOND)); spawnBlood(entity.getLocation()); entity.getWorld().createExplosion(entity.getLocation(), 4.0f, true); } private void spawnBlood(Location location) { Random random = ThreadLocalRandom.current(); int bloodCount = 17; World world = location.getWorld(); for(int index = 0; index < bloodCount; index++) { Vector randomVel = new Vector(random.nextDouble() - 0.5, random.nextDouble() - 0.3, random.nextDouble() - 0.5); Vector relative = randomVel.clone().normalize().multiply(1.2); world.spawnParticle( Particle.BLOCK_CRACK, location.clone().add(randomVel), 15, relative.getX(), relative.getY(), relative.getZ(), Material.REDSTONE_BLOCK.createBlockData()); } } private void spawnExplodingItems(Location location, int itemCount, ItemStack itemStack) { Random random = ThreadLocalRandom.current(); Set noMerging = new HashSet<>(); for (int index = 0; index < itemCount; index++) { Vector randomVel = new Vector(random.nextDouble() - 0.5, random.nextDouble() - 0.3, random.nextDouble() - 0.5); randomVel = randomVel.normalize().multiply(0.8); Item item = location.getWorld().dropItem(location, itemStack); item.setVelocity(randomVel); noMerging.add(item.getUniqueId()); } new ScheduleBuilder(main) .in(3).seconds() .run(() -> this.noMerging.removeAll(noMerging)) .sync() .start(); this.noMerging.addAll(noMerging); } @EventHandler private void onMerge(ItemMergeEvent event) { if (noMerging.contains(event.getEntity().getUniqueId())) event.setCancelled(true); } }