Ejemplo n.º 1
0
  /**
   * Perform actions that were specified in the config file
   *
   * @param event
   * @param action
   * @return
   */
  private Location action(
      Player player,
      Location from,
      Location to,
      Action[] actions,
      int violations,
      MovingData data) {

    Location newToLocation = null;

    if (actions == null) return newToLocation;
    boolean cancelled = false;

    for (Action a : actions) {
      if (a.firstAfter <= violations) {
        if (a.firstAfter == violations || a.repeat) {
          if (a instanceof LogAction) {
            // prepare log message if necessary
            String log =
                String.format(
                    Locale.US,
                    logMessage,
                    player.getName(),
                    from.getWorld().getName(),
                    to.getWorld().getName(),
                    from.getX(),
                    from.getY(),
                    from.getZ(),
                    to.getX(),
                    to.getY(),
                    to.getZ(),
                    Math.abs(from.getX() - to.getX()),
                    to.getY() - from.getY(),
                    Math.abs(from.getZ() - to.getZ()));

            plugin.log(((LogAction) a).level, log);

            // Remember the highest log level we encountered to determine what level the summary log
            // message should have
            if (data.highestLogLevel == null) data.highestLogLevel = Level.ALL;
            if (data.highestLogLevel.intValue() < ((LogAction) a).level.intValue())
              data.highestLogLevel = ((LogAction) a).level;
          } else if (!cancelled && a instanceof CancelAction) {
            // Make a modified copy of the setBackPoint to prevent other plugins from accidentally
            // modifying it
            // and keep the current pitch and yaw (setbacks "feel" better that way). Plus try to
            // adapt the Y-coord
            // to place the player close to ground

            double y = data.setBackPoint.getY();

            // search for the first solid block up to 5 blocks below the setbackpoint and teleport
            // the player there
            int i = 0;
            for (; i < 20; i++) {
              if (playerIsOnGround(data.setBackPoint, -0.5 * i) != MovingData.NONSOLID) {
                break;
              }
            }
            y -= 0.5 * i;

            data.setBackPoint.setY(y);

            // Remember the location we send the player to, to identify teleports that were started
            // by us
            data.teleportInitializedByMe =
                new Location(
                    data.setBackPoint.getWorld(),
                    data.setBackPoint.getX(),
                    y,
                    data.setBackPoint.getZ(),
                    to.getYaw(),
                    to.getPitch());

            newToLocation = data.teleportInitializedByMe;

            cancelled =
                true; // just prevent us from treating more than one "cancel" action, which would
            // make no sense
          } else if (a instanceof CustomAction) plugin.handleCustomAction((CustomAction) a, player);
        }
      }
    }

    return newToLocation;
  }