Here's my current method of freezing players, however if you have a more efficient way of doing this feel free to drop a comment, of course this isn't the best as it uses PlayerMoveEvent but after testing with potion effects, there was always client bypasses.
Code:
@EventHandler
private void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
User user = this.core.getDataHandler().getUser(player.getUniqueId());
if (!user.getUserOptions().isFrozen())
return;
if (event.getFrom().distanceSquared(event.getTo()) <= 0)
return;
if (event.getFrom().getY() != event.getTo().getY() && event.getFrom().getX() == event.getTo().getX() && event.getFrom().getZ() == event.getTo().getZ())
return;
player.teleport(event.getFrom());
}
