package me.desht.chesscraft;
import com.comphenix.protocol.Packets;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ConnectionSide;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import me.desht.chesscraft.chess.BoardViewManager;
import org.bukkit.Location;
public class ProtocolLibIntegration {
private static double entityVolume = 1.0;
public static void registerPacketHandler(ChessCraft plugin) {
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(plugin, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL, Packets.Server.NAMED_SOUND_EFFECT) {
@Override
public void onPacketSending(PacketEvent event) {
switch (event.getPacketID()) {
case Packets.Server.NAMED_SOUND_EFFECT: // 0x3E
if (entityVolume != 1.0) {
// modify volume of all mob noises if they're on a chess board
String soundName = event.getPacket().getStrings().read(0);
int x = event.getPacket().getIntegers().read(0) >> 3;
int y = event.getPacket().getIntegers().read(1) >> 3;
int z = event.getPacket().getIntegers().read(2) >> 3;
Location loc = new Location(event.getPlayer().getWorld(), x, y, z);
if (BoardViewManager.getManager().partOfChessBoard(loc) != null) {
if (soundName.startsWith("mob.") || soundName.equals("fire.fire")) {
// Debugger.getInstance().debug(2, "cancel sound " + soundName + " -> " + event.getPlayer().getName() + " @ " + loc);
if (entityVolume == 0.0) {
event.setCancelled(true);
} else {
event.getPacket().getFloat().write(0, (float) entityVolume);
}
}
}
}
break;
}
}
});
}
public static void setEntityVolume(double volume) {
entityVolume = Math.max(0.0, Math.min(volume, 4.0));
}
}