protected static boolean processStationCommand(MinecartManiaMinecart minecart, String str) {
    boolean valid = false;

    if (!str.toLowerCase().contains("st-")) {
      return false;
    }
    String[] val =
        str.toLowerCase()
            .split(
                ":"); // Will doing a toLowerCase here mess up regular expressions?  Probably not
                      // since we lower case the station name anyway.
    String[] keys =
        val[0].split(
            "-| ?: ?",
            2); // Split the st- from the station name. the ",2" limits it to the first "-" followed
                // by zero or one non-capturing spaces.
    // The ",2" is needed because regular expressions can have a "-" in them. example "st-[g-z].*"
    // Without the limit, we would have the following array in keys: "st", "[g", "z].*" and then
    // only work with the "[g" portion which is wrong.
    String st = keys[1]; // Get the station name/simple pattern/regular expression
    String station =
        MinecartManiaWorld.getMinecartManiaPlayer(minecart.getPlayerPassenger())
            .getLastStation()
            .toLowerCase();
    int parseSetting =
        (Integer) MinecartManiaWorld.getConfigurationValue("StationSignParsingMethod");
    MinecartManiaLogger.getInstance()
        .debug("Given Sign Line: " + str + " Given Station setting: " + station);
    switch (parseSetting) {
      case 0: // default with no pattern matching
        valid = station.equalsIgnoreCase(st);
        break;
      case 1: // simple pattern matching
        st =
            st.replace("\\", "\\\\") // escapes backslashes in case people use them in station names
                .replace(".", "\\.") // escapes period
                .replace("*", ".*") // converts *
                .replace("?", ".") // converts ?
                .replace("#", "\\d") // converts #
                .replace(
                    "@",
                    "[a-zA-Z]"); // converts @  NOTE:[A-Z] is probably not needed here since
                                 // everything is lower case anyway, but left for completeness.
      case 2: // full regex //note the lack of break before this, case 1 comes down here after
              // converting
        valid = station.matches(st);
        break;
    }
    if (valid
        && MinecartManiaWorld.getMinecartManiaPlayer(minecart.getPlayerPassenger())
                .getDataValue("Reset Station Data")
            == null) {
      if (!StationUtil.isStationCommandNeverResets()) {
        MinecartManiaWorld.getMinecartManiaPlayer(minecart.getPlayerPassenger()).setLastStation("");
      }
    }
    return valid;
  }
  public static boolean doMinecartCollection(final MinecartManiaMinecart minecart) {
    if (minecart.getBlockTypeAhead() != null) {
      if (minecart.getBlockTypeAhead().getType().getId() == Material.CHEST.getId()) {
        final MinecartManiaChest chest =
            MinecartManiaWorld.getMinecartManiaChest(
                (Chest) minecart.getBlockTypeAhead().getState());

        if (SignCommands.isNoCollection(chest)) return false;

        if (minecart instanceof MinecartManiaStorageCart) {
          final MinecartManiaStorageCart storageCart = (MinecartManiaStorageCart) minecart;
          boolean failed = false;
          for (final ItemStack item : storageCart.getInventory().getContents()) {
            if (!chest.addItem(item)) {
              failed = true;
              break;
            }
          }
          if (!failed) {
            storageCart.getInventory().clear();
          }
        }
        if (chest.addItem(minecart.getType().getId())) {

          minecart.kill(false);
          return true;
        }
      }
    }
    return false;
  }
 public static boolean doCollectParallel(final MinecartManiaMinecart minecart) {
   final ArrayList<Block> blockList = minecart.getParallelBlocks();
   for (final Block block : blockList) {
     if (block.getState() instanceof Chest) {
       final MinecartManiaChest chest =
           MinecartManiaWorld.getMinecartManiaChest((Chest) block.getState());
       final ArrayList<Sign> signList =
           SignUtils.getAdjacentMinecartManiaSignList(chest.getLocation(), 1);
       for (final Sign sign : signList) {
         for (int i = 0; i < sign.getNumLines(); i++) {
           if (sign.getLine(i).toLowerCase().contains("parallel")) {
             sign.setLine(i, "[Parallel]");
             if (!minecart.isMovingAway(block.getLocation())) {
               if (chest.addItem(minecart.getType().getId())) {
                 minecart.kill(false);
                 return true;
               }
             }
           }
         }
       }
     }
   }
   return false;
 }
 public void onMinecartMeetConditionEvent(MinecartMeetsConditionEvent event) {
   if (event.isMeetCondition()) {
     return;
   }
   Sign sign = event.getSign();
   MinecartManiaMinecart minecart = event.getMinecart();
   MinecartManiaPlayer player = null;
   Object old = null;
   if (minecart.hasPlayerPassenger()) {
     player = MinecartManiaWorld.getMinecartManiaPlayer(minecart.getPlayerPassenger());
     old = player.getDataValue("Reset Station Data");
     player.setDataValue("Reset Station Data", true);
   }
   loop:
   for (int i = 0; i < sign.getNumLines(); i++) {
     String line = StringUtils.removeBrackets(sign.getLine(i).trim());
     for (StationCondition e : StationCondition.values()) {
       if (e.result(minecart, line)) {
         event.setMeetCondition(true);
         break loop;
       }
     }
   }
   if (player != null) {
     player.setDataValue("Reset Station Data", old);
   }
 }
 public static MinecartManiaInventory getMinecartManiaInventory(Block block) {
   MinecartManiaInventory inventory = null;
   if (block.getState() instanceof Chest) {
     inventory = MinecartManiaWorld.getMinecartManiaChest((Chest) block.getState());
     // check for double chest
     if (inventory != null && ((MinecartManiaChest) inventory).getNeighborChest() != null) {
       inventory =
           new MinecartManiaDoubleChest(
               (MinecartManiaChest) inventory,
               ((MinecartManiaChest) inventory).getNeighborChest());
     }
   } else if (block.getState() instanceof Dispenser) {
     inventory = MinecartManiaWorld.getMinecartManiaDispenser((Dispenser) block.getState());
   } else if (block.getState() instanceof Furnace) {
     inventory = MinecartManiaWorld.getMinecartManiaFurnace((Furnace) block.getState());
   }
   return inventory;
 }
  public void onMinecartIntersectionEvent(MinecartIntersectionEvent event) {
    MinecartManiaMinecart minecart = event.getMinecart();

    if (event.isActionTaken()) {
      return;
    }

    if (ControlBlockList.isValidStationBlock(minecart)) {
      SignCommands.processStation(event);
    }

    if (event.isActionTaken()) {
      return;
    }

    if (StationUtil.shouldPromptUser(minecart)) {

      minecart.setDataValue("preintersection velocity", minecart.minecart.getVelocity().clone());
      minecart.stopCart();
      Player passenger = minecart.getPlayerPassenger();
      // set the track straight
      int data =
          DirectionUtils.getMinetrackRailDataForDirection(
              minecart.getDirection(), minecart.getDirection());
      Block oldBlock =
          MinecartManiaWorld.getBlockAt(
              minecart.minecart.getWorld(), minecart.getX(), minecart.getY(), minecart.getZ());
      ArrayList<Integer> blockData = new ArrayList<Integer>();
      blockData.add(new Integer(oldBlock.getX()));
      blockData.add(new Integer(oldBlock.getY()));
      blockData.add(new Integer(oldBlock.getZ()));
      blockData.add(new Integer(oldBlock.getData()));
      minecart.setDataValue("old rail data", blockData);
      if (data != -1) {
        MinecartManiaWorld.setBlockData(
            minecart.minecart.getWorld(), minecart.getX(), minecart.getY(), minecart.getZ(), data);
      }
      passenger.sendMessage(LocaleParser.getTextKey("StationsTapInDirection"));
    }
  }
  public void onMinecartActionEvent(MinecartActionEvent event) {
    MinecartManiaMinecart minecart = event.getMinecart();

    if (!minecart.isAtIntersection()) {
      if (minecart.getDataValue("old rail data") != null) {
        @SuppressWarnings("unchecked")
        ArrayList<Integer> blockData = (ArrayList<Integer>) minecart.getDataValue("old rail data");
        MinecartManiaWorld.setBlockData(
            minecart.minecart.getWorld(),
            blockData.get(0),
            blockData.get(1),
            blockData.get(2),
            blockData.get(3));
        minecart.setDataValue("old rail data", null);
      }
    }

    // stop moving, there is a queue ahead of us
    // TODO Fix this
    /*MinecartManiaMinecart minecartAhead = minecart.getMinecartAhead();
    while (true) {
    	if (minecartAhead == null) {
    		break;
    	}
    	if (minecartAhead.minecart.getEntityId() == minecart.minecart.getEntityId()) {
    		break;
    	}
    	if (minecartAhead.getMinecartAhead() == null) {
    		break;
    	}
    	if (minecartAhead.isMoving()) {
    		break;
    	}
    	minecartAhead = minecartAhead.getMinecartAhead();
    }
    if (minecartAhead != null) {
    	if (minecartAhead.isAtIntersection()) {
    		if (!minecartAhead.isMoving()) {
    			minecart.setDataValue("queued velocity", minecart.minecart.getVelocity().clone());
    			minecart.stopCart();
    			if (minecart.hasPlayerPassenger())
    				ChatUtils.sendMultilineMessage(minecart.getPlayerPassenger(), "You've entered a queue. Please be patient.", ChatColor.YELLOW.toString());
    		}
    	}
    }*/
  }
 @Override
 public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
   Player player = (Player) sender;
   if (args.length < 1) {
     return false;
   }
   MinecartManiaPlayer mmp = MinecartManiaWorld.getMinecartManiaPlayer(player);
   String station = args[0];
   mmp.setLastStation(station);
   if (args.length > 1) {
     if (args[1].contains("s")) {
       mmp.setDataValue("Reset Station Data", Boolean.TRUE);
     }
   } else {
     mmp.setDataValue("Reset Station Data", null);
   }
   mmp.sendMessage(LocaleParser.getTextKey("AdminControlsStation", station));
   return true;
 }
  public void onMinecartClickedEvent(MinecartClickedEvent event) {
    if (event.isActionTaken()) {
      return;
    }
    MinecartManiaMinecart minecart = event.getMinecart();
    if (StationUtil.isInQueue(minecart)) {
      event.setActionTaken(true);
      return;
    }
    CompassDirection facingDir =
        DirectionUtils.getDirectionFromMinecartRotation(
            (minecart.minecart.getPassenger().getLocation().getYaw() - 90.0F) % 360.0F);

    Vector velocity = (Vector) minecart.getDataValue("preintersection velocity");
    if (velocity == null) {
      return;
    }

    velocity = StationUtil.alterMotionFromDirection(facingDir, velocity);

    // responding to chat direction prompt
    if (minecart.isAtIntersection() && minecart.hasPlayerPassenger()) {
      if (StationUtil.isValidDirection(facingDir, minecart)) {
        int data =
            DirectionUtils.getMinetrackRailDataForDirection(facingDir, minecart.getDirection());
        if (data != -1) {
          MinecartManiaWorld.setBlockData(
              minecart.minecart.getWorld(),
              minecart.getX(),
              minecart.getY(),
              minecart.getZ(),
              data);
        }
        minecart.minecart.setVelocity(velocity);
        minecart.setDataValue("preintersection velocity", null);
      }
      event.setActionTaken(true);
    }
  }
 public static boolean useOldDirections() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("UseOldDirections");
 }
 public static int getMinecartMaximumRange() {
   return (Integer) MinecartManiaWorld.getConfigurationValue("MaximumRange");
 }
 public static boolean isKeepMinecartsLoaded() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("KeepMinecartsLoaded");
 }
 public static boolean isReturnMinecartToOwner() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("MinecartsReturnToOwner");
 }
 public static boolean isMinecartsKillMobs() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("MinecartsKillMobs");
 }
  public static void processStation(MinecartEvent event) {
    MinecartManiaMinecart minecart = event.getMinecart();

    ArrayList<Sign> signList = SignUtils.getAdjacentSignList(minecart, 2);
    for (Sign sign : signList) {
      convertCraftBookSorter(sign);
      for (int k = 0; k < 4; k++) {
        // Setup initial data
        String str = sign.getLine(k);
        String newLine = str;
        String val[] = str.split(":");
        if (val.length != 2) {
          continue;
        }
        // Strip header and ending characters
        val[0] = StringUtils.removeBrackets(val[0]);
        val[1] = StringUtils.removeBrackets(val[1]);
        // Strip whitespace
        val[0] = val[0].trim();
        val[1] = val[1].trim();
        boolean valid = false;
        // end of data setup

        for (StationCondition e : StationCondition.values()) {
          if (e.result(minecart, val[0])) {
            valid = true;
            break;
          }
        }

        if (valid) {
          CompassDirection direction = CompassDirection.NO_DIRECTION;

          for (StationDirection e : StationDirection.values()) {
            direction = e.direction(minecart, val[1]);
            if (direction != CompassDirection.NO_DIRECTION) {
              break;
            }
          }

          // Special case - if we are at a launcher, set the launch speed as well
          // mze 2012-08-29: Remove it because it makes more problems than it solves...
          /*if (event instanceof MinecartLaunchedEvent && direction != null && direction != CompassDirection.NO_DIRECTION) {
          	minecart.setMotion(direction, 0.6D);
          	((MinecartLaunchedEvent)event).setLaunchSpeed(minecart.minecart.getVelocity());
          }*/

          // setup sign formatting
          newLine = StringUtils.removeBrackets(newLine);
          char[] ch = {' ', ':'};
          newLine = WordUtils.capitalize(newLine, ch);
          newLine = StringUtils.addBrackets(newLine);

          boolean handled = false;
          // Handle minecart destruction
          if (direction == null) {
            // vanish sign, minecart is just gone ;)
            if (val[1].equals("V") || val[1].toLowerCase().contains("vanish")) {
              minecart.kill(false);
            }

            minecart.kill();
            handled = true;
          } else if (MinecartUtils.validMinecartTrack(
              minecart.minecart.getWorld(),
              minecart.getX(),
              minecart.getY(),
              minecart.getZ(),
              2,
              direction)) {
            int data =
                DirectionUtils.getMinetrackRailDataForDirection(direction, minecart.getDirection());
            if (data != -1) {
              handled = true;

              // Force the game to remember the old data of the rail we are on, and reset it once we
              // are done
              Block oldBlock =
                  MinecartManiaWorld.getBlockAt(
                      minecart.minecart.getWorld(),
                      minecart.getX(),
                      minecart.getY(),
                      minecart.getZ());
              ArrayList<Integer> blockData = new ArrayList<Integer>();
              blockData.add(new Integer(oldBlock.getX()));
              blockData.add(new Integer(oldBlock.getY()));
              blockData.add(new Integer(oldBlock.getZ()));
              blockData.add(new Integer(oldBlock.getData()));
              minecart.setDataValue("old rail data", blockData);

              // change the track dirtion
              MinecartManiaWorld.setBlockData(
                  minecart.minecart.getWorld(),
                  minecart.getX(),
                  minecart.getY(),
                  minecart.getZ(),
                  data);
            } else if (DirectionUtils.getOppositeDirection(direction)
                .equals(minecart.getDirection())) {
              // format the sign
              minecart.reverse();
              handled = true;
            }
          }

          if (handled) {
            event.setActionTaken(true);
            // format the sign
            sign.setLine(k, newLine);
            sign.update(true);
            return;
          }
        }
      }
    }
  }
 public static boolean isStackAllItems() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("StackAllItems");
 }
 public static int getMinecartRangeY() {
   return (Integer) MinecartManiaWorld.getConfigurationValue("RangeY");
 }
 public static boolean isLimitedSignRange() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("LimitedSignRange");
 }
 public static boolean isDisappearOnDisconnect() {
   return (Boolean) MinecartManiaWorld.getConfigurationValue("DisappearOnDisconnect");
 }
 public static int getMaximumMinecartSpeedPercent() {
   return (Integer) MinecartManiaWorld.getConfigurationValue("MaximumMinecartSpeedPercent");
 }
 public static int getMinecartsClearRailsSetting() {
   return (Integer) MinecartManiaWorld.getConfigurationValue("MinecartsClearRails");
 }