예제 #1
0
  public synchronized boolean joinTable(
      UUID userId,
      String name,
      String playerType,
      int skill,
      DeckCardLists deckList,
      String password)
      throws MageException {
    User user = UserManager.getInstance().getUser(userId);
    if (user == null) {
      return false;
    }
    if (userPlayerMap.containsKey(userId) && playerType.equals("Human")) {
      user.showUserMessage(
          "Join Table", new StringBuilder("You can join a table only one time.").toString());
      return false;
    }
    if (table.getState() != TableState.WAITING) {
      user.showUserMessage("Join Table", "No available seats.");
      return false;
    }
    // check password
    if (!table.getMatch().getOptions().getPassword().isEmpty() && playerType.equals("Human")) {
      if (!table.getMatch().getOptions().getPassword().equals(password)) {
        user.showUserMessage("Join Table", "Wrong password.");
        return false;
      }
    }
    Seat seat = table.getNextAvailableSeat(playerType);
    if (seat == null) {
      user.showUserMessage("Join Table", "No available seats.");
      return false;
    }
    Deck deck = Deck.load(deckList, false, false);

    if (!Main.isTestMode() && !table.getValidator().validate(deck)) {
      StringBuilder sb =
          new StringBuilder("You (")
              .append(name)
              .append(") have an invalid deck for the selected ")
              .append(table.getValidator().getName())
              .append(" Format. \n\n");
      for (Map.Entry<String, String> entry : table.getValidator().getInvalid().entrySet()) {
        sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
      }
      sb.append("\n\nSelect a deck that is appropriate for the selected format and try again!");
      user.showUserMessage("Join Table", sb.toString());
      if (isOwner(userId)) {
        logger.debug(
            "New table removed because owner submitted invalid deck tableId " + table.getId());
        TableManager.getInstance().removeTable(table.getId());
      }
      return false;
    }
    // Check quit ratio.
    int quitRatio = table.getMatch().getOptions().getQuitRatio();
    if (quitRatio < user.getMatchQuitRatio()) {
      String message =
          new StringBuilder("Your quit ratio ")
              .append(user.getMatchQuitRatio())
              .append("% is higher than the table requirement ")
              .append(quitRatio)
              .append("%")
              .toString();
      user.showUserMessage("Join Table", message);
      return false;
    }

    // Check power level for table (currently only used for EDH/Commander table)
    int edhPowerLevel = table.getMatch().getOptions().getEdhPowerLevel();
    if (edhPowerLevel > 0 && table.getValidator().getName().toLowerCase().equals("commander")) {
      int deckEdhPowerLevel = table.getValidator().getEdhPowerLevel(deck);
      if (deckEdhPowerLevel > edhPowerLevel) {
        String message =
            new StringBuilder(
                    "Your deck appears to be too powerful for this table.\n\nReduce the number of extra turn cards, infect, counters, fogs, reconsider your commander. ")
                .append("\nThe table requirement has a maximum power level of ")
                .append(edhPowerLevel)
                .append(" whilst your deck has a calculated power level of ")
                .append(deckEdhPowerLevel)
                .toString();
        user.showUserMessage("Join Table", message);
        return false;
      }
    }

    Player player = createPlayer(name, seat.getPlayerType(), skill);
    if (player == null) {
      String message =
          new StringBuilder("Could not create player ")
              .append(name)
              .append(" of type ")
              .append(seat.getPlayerType())
              .toString();
      logger.warn(
          new StringBuilder("User: "******" => ")
              .append(message)
              .toString());
      user.showUserMessage("Join Table", message);
      return false;
    }
    logger.debug(
        "DECK validated: "
            + table.getValidator().getName()
            + " "
            + player.getName()
            + " "
            + deck.getName());
    if (!player.canJoinTable(table)) {
      user.showUserMessage(
          "Join Table",
          new StringBuilder("A ")
              .append(seat.getPlayerType())
              .append(" player can't join this table.")
              .toString());
      return false;
    }
    match.addPlayer(player, deck);
    table.joinTable(player, seat);
    logger.trace(player.getName() + " joined tableId: " + table.getId());
    // only inform human players and add them to sessionPlayerMap
    if (seat.getPlayer().isHuman()) {
      seat.getPlayer().setUserData(user.getUserData());
      if (!table.isTournamentSubTable()) {
        user.addTable(player.getId(), table);
      }
      user.ccJoinedTable(table.getRoomId(), table.getId(), false);
      userPlayerMap.put(userId, player.getId());
    }
    return true;
  }