package com.comphenix.example; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.plugin.java.JavaPlugin; import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.ConnectionSide; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; public class SoundlessTeethlessExplosion extends JavaPlugin implements Listener { private boolean suppressDamage; @Override public void onEnable() { getServer().getPluginManager().registerEvents(this, this); ProtocolLibrary.getProtocolManager().addPacketListener( new PacketAdapter(this, ConnectionSide.SERVER_SIDE, Packets.Server.NAMED_SOUND_EFFECT) { @Override public void onPacketSending(PacketEvent event) { String soundName = event.getPacket().getStrings().read(0); if ("random.explode".equals(soundName) && suppressDamage) { event.setCancelled(true); } } }); } @EventHandler public void onEntityDamage(EntityDamageByBlockEvent event) { if(event.getCause().equals(DamageCause.BLOCK_EXPLOSION)) { if (suppressDamage) { event.setCancelled(true); } } } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (sender instanceof Player) { Player player = (Player) sender; createSoundlessExplosion(player.getLocation()); } return true; } /** * Create a soundless explosion at a given location. *

* Does not do any damage. * @param loc - the location. */ private void createSoundlessExplosion(Location loc) { suppressDamage = true; loc.getWorld().createExplosion(loc, 10); suppressDamage = false; } }