@EventHandler(priority = EventPriority.HIGHEST)
  public void onPlayerTeleport(PlayerTeleportEvent event) {
    final Player player = event.getPlayer();
    final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player);
    // Check absolute value to account for negatives
    if (Math.abs(event.getTo().getX()) >= MAX_XY_COORD
        || Math.abs(event.getTo().getZ()) >= MAX_XY_COORD) {
      event.setCancelled(true); // illegal position, cancel it
    }

    if (!TFM_AdminList.isSuperAdmin(player) && playerdata.isFrozen()) {
      TFM_Util.setFlying(player, true);
      event.setTo(playerdata.getFreezeLocation());
      return; // Don't process adminworld validation
    }

    TFM_AdminWorld.getInstance().validateMovement(event);
  }
  @EventHandler(priority = EventPriority.NORMAL)
  public void onPlayerMove(PlayerMoveEvent event) {
    final Location from = event.getFrom();
    final Location to = event.getTo();
    try {
      if (from.getWorld() == to.getWorld() && from.distanceSquared(to) < (0.0001 * 0.0001)) {
        // If player just rotated, but didn't move, don't process this event.
        return;
      }
    } catch (IllegalArgumentException ex) {
    }

    if (!TFM_AdminWorld.getInstance().validateMovement(event)) {
      return;
    }

    final Player player = event.getPlayer();
    final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player);

    for (Entry<Player, Double> fuckoff : TotalFreedomMod.fuckoffEnabledFor.entrySet()) {
      Player fuckoffPlayer = fuckoff.getKey();

      if (fuckoffPlayer.equals(player) || !fuckoffPlayer.isOnline()) {
        continue;
      }

      double fuckoffRange = fuckoff.getValue();

      Location playerLocation = player.getLocation();
      Location fuckoffLocation = fuckoffPlayer.getLocation();

      double distanceSquared;
      try {
        distanceSquared = playerLocation.distanceSquared(fuckoffLocation);
      } catch (IllegalArgumentException ex) {
        continue;
      }

      if (distanceSquared < (fuckoffRange * fuckoffRange)) {
        event.setTo(
            fuckoffLocation
                .clone()
                .add(
                    playerLocation
                        .subtract(fuckoffLocation)
                        .toVector()
                        .normalize()
                        .multiply(fuckoffRange * 1.1)));
        break;
      }
    }

    // Freeze
    if (!TFM_AdminList.isSuperAdmin(player) && playerdata.isFrozen()) {
      TFM_Util.setFlying(player, true);
      event.setTo(playerdata.getFreezeLocation());
    }

    if (playerdata.isCaged()) {
      Location targetPos = player.getLocation().add(0, 1, 0);

      boolean outOfCage;
      if (!targetPos.getWorld().equals(playerdata.getCagePos().getWorld())) {
        outOfCage = true;
      } else {
        outOfCage = targetPos.distanceSquared(playerdata.getCagePos()) > (2.5 * 2.5);
      }

      if (outOfCage) {
        playerdata.setCaged(
            true,
            targetPos,
            playerdata.getCageMaterial(TFM_PlayerData.CageLayer.OUTER),
            playerdata.getCageMaterial(TFM_PlayerData.CageLayer.INNER));
        playerdata.regenerateHistory();
        playerdata.clearHistory();
        TFM_Util.buildHistory(targetPos, 2, playerdata);
        TFM_Util.generateHollowCube(
            targetPos, 2, playerdata.getCageMaterial(TFM_PlayerData.CageLayer.OUTER));
        TFM_Util.generateCube(
            targetPos, 1, playerdata.getCageMaterial(TFM_PlayerData.CageLayer.INNER));
      }
    }

    if (playerdata.isOrbiting()) {
      if (player.getVelocity().length() < playerdata.orbitStrength() * (2.0 / 3.0)) {
        player.setVelocity(new Vector(0, playerdata.orbitStrength(), 0));
      }
    }

    if (TFM_Jumppads.getMode().isOn()) {
      TFM_Jumppads.PlayerMoveEvent(event);
    }

    if (!(TFM_ConfigEntry.LANDMINES_ENABLED.getBoolean()
        && TFM_ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())) {
      return;
    }

    final Iterator<Command_landmine.TFM_LandmineData> landmines =
        Command_landmine.TFM_LandmineData.landmines.iterator();
    while (landmines.hasNext()) {
      final Command_landmine.TFM_LandmineData landmine = landmines.next();

      final Location location = landmine.location;
      if (location.getBlock().getType() != Material.TNT) {
        landmines.remove();
        continue;
      }

      if (landmine.player.equals(player)) {
        break;
      }

      if (!player.getWorld().equals(location.getWorld())) {
        continue;
      }

      if (!(player.getLocation().distanceSquared(location)
          <= (landmine.radius * landmine.radius))) {
        break;
      }

      landmine.location.getBlock().setType(Material.AIR);

      final TNTPrimed tnt1 = location.getWorld().spawn(location, TNTPrimed.class);
      tnt1.setFuseTicks(40);
      tnt1.setPassenger(player);
      tnt1.setVelocity(new Vector(0.0, 2.0, 0.0));

      final TNTPrimed tnt2 = location.getWorld().spawn(player.getLocation(), TNTPrimed.class);
      tnt2.setFuseTicks(1);

      player.setGameMode(GameMode.SURVIVAL);
      landmines.remove();
    }
  }
 @EventHandler(priority = EventPriority.HIGHEST)
 public void onPlayerTeleport(PlayerTeleportEvent event) {
   TFM_AdminWorld.getInstance().validateMovement(event);
 }
  @Override
  public boolean run(
      CommandSender sender,
      Player sender_p,
      Command cmd,
      String commandLabel,
      String[] args,
      boolean senderIsConsole) {
    if (!TFM_ConfigEntry.ENABLE_ADMINWORLD.getBoolean() && !TFM_Util.isHighRank(sender)) {
      TFM_Util.playerMsg(sender, "Admin World is currently disabled!", ChatColor.RED);
      return true;
    }

    CommandMode commandMode = null;

    if (args.length == 0) {
      commandMode = CommandMode.TELEPORT;
    } else if (args.length >= 2) {
      if ("guest".equalsIgnoreCase(args[0])) {
        commandMode = CommandMode.GUEST;
      } else if ("time".equalsIgnoreCase(args[0])) {
        commandMode = CommandMode.TIME;
      } else if ("weather".equalsIgnoreCase(args[0])) {
        commandMode = CommandMode.WEATHER;
      }
    }

    if (commandMode == null) {
      return false;
    }

    try {
      switch (commandMode) {
        case TELEPORT:
          {
            if (!(sender instanceof Player) || sender_p == null) {
              return true;
            }

            World adminWorld = null;
            try {
              adminWorld = TFM_AdminWorld.getInstance().getWorld();
            } catch (Exception ex) {
            }

            if (adminWorld == null || sender_p.getWorld() == adminWorld) {
              playerMsg("Going to the main world.");
              sender_p.teleport(server.getWorlds().get(0).getSpawnLocation());
            } else {
              if (TFM_AdminWorld.getInstance().canAccessWorld(sender_p)) {
                playerMsg("Going to the AdminWorld.");
                TFM_AdminWorld.getInstance().sendToWorld(sender_p);
              } else {
                playerMsg("You don't have permission to access the AdminWorld.");
              }
            }

            break;
          }
        case GUEST:
          {
            if (args.length == 2) {
              if ("list".equalsIgnoreCase(args[1])) {
                playerMsg(
                    "AdminWorld guest list: " + TFM_AdminWorld.getInstance().guestListToString());
              } else if ("purge".equalsIgnoreCase(args[1])) {
                assertCommandPerms(sender, sender_p);
                TFM_AdminWorld.getInstance().purgeGuestList();
                TFM_Util.adminAction(sender.getName(), "AdminWorld guest list purged.", false);
              } else {
                return false;
              }
            } else if (args.length == 3) {
              assertCommandPerms(sender, sender_p);

              if ("add".equalsIgnoreCase(args[1])) {
                final Player player = getPlayer(args[2]);

                if (player == null) {
                  sender.sendMessage(TotalFreedomMod.PLAYER_NOT_FOUND);
                  return true;
                }

                if (TFM_AdminWorld.getInstance().addGuest(player, sender_p)) {
                  TFM_Util.adminAction(
                      sender.getName(), "AdminWorld guest added: " + player.getName(), false);
                } else {
                  playerMsg("Could not add player to guest list.");
                }
              } else if ("remove".equals(args[1])) {
                final Player player = TFM_AdminWorld.getInstance().removeGuest(args[2]);
                if (player != null) {
                  TFM_Util.adminAction(
                      sender.getName(), "AdminWorld guest removed: " + player.getName(), false);
                } else {
                  playerMsg("Can't find guest entry for: " + args[2]);
                }
              } else {
                return false;
              }
            }

            break;
          }
        case TIME:
          {
            assertCommandPerms(sender, sender_p);

            if (args.length == 2) {
              TFM_AdminWorld.TimeOfDay timeOfDay = TFM_AdminWorld.TimeOfDay.getByAlias(args[1]);
              if (timeOfDay != null) {
                TFM_AdminWorld.getInstance().setTimeOfDay(timeOfDay);
                playerMsg("AdminWorld time set to: " + timeOfDay.name());
              } else {
                playerMsg("Invalid time of day. Can be: sunrise, noon, sunset, midnight");
              }
            } else {
              return false;
            }

            break;
          }
        case WEATHER:
          {
            assertCommandPerms(sender, sender_p);

            if (args.length == 2) {
              TFM_AdminWorld.WeatherMode weatherMode =
                  TFM_AdminWorld.WeatherMode.getByAlias(args[1]);
              if (weatherMode != null) {
                TFM_AdminWorld.getInstance().setWeatherMode(weatherMode);
                playerMsg("AdminWorld weather set to: " + weatherMode.name());
              } else {
                playerMsg("Invalid weather mode. Can be: off, rain, storm");
              }
            } else {
              return false;
            }

            break;
          }
        default:
          {
            return false;
          }
      }
    } catch (PermissionDeniedException ex) {
      sender.sendMessage(ex.getMessage());
    }

    return true;
  }