Using ProtocolLib, I have found a way to fix the problem of Spectator Mode bypassing /tptoggle. It isn't clean, but it works. Because I don't exactly know where it should go, I'm dumping it here.
Java
Essentials essentials = (Essentials) server.getPlugin("Essentials");
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.SPECTATE)
{
@Override
public void onPacketReceiving(PacketEvent event)
{
if (event.getPacketType() == PacketType.Play.Client.SPECTATE)
{
if (event.getPacket().getUUIDs().readSafely(0) == null)
{
return;
}
User target = essentials.getUser(event.getPacket().getUUIDs().readSafely(0));
if (user == null)
{
return;
}
if (!user.isTeleportEnabled())
{
String message = I18n.tl("teleportDisabled", target.getDisplayName());
event.getPlayer().sendMessage(I18n.tl("errorWithMessage", message));
//--
event.setCancelled(true);
}
}
}
});
Display More