Пример #1
0
 @Override
 public TableView createTournamentTable(UUID userId, TournamentOptions options) {
   Table table =
       TableManager.getInstance().createTournamentTable(this.getRoomId(), userId, options);
   tables.put(table.getId(), table);
   return new TableView(table);
 }
Пример #2
0
 public synchronized void startTournament(UUID userId) {
   try {
     if (userId.equals(this.userId) && table.getState().equals(TableState.STARTING)) {
       tournament.setStartTime();
       TournamentManager.getInstance()
           .createTournamentSession(tournament, userPlayerMap, table.getId());
       for (Entry<UUID, UUID> entry : userPlayerMap.entrySet()) {
         User user = UserManager.getInstance().getUser(entry.getKey());
         if (user != null) {
           logger.info(
               new StringBuilder("User ")
                   .append(user.getName())
                   .append(" tournament started: ")
                   .append(tournament.getId())
                   .append(" userId: ")
                   .append(user.getId()));
           user.ccTournamentStarted(tournament.getId(), entry.getValue());
         }
       }
       ServerMessagesUtil.getInstance().incTournamentsStarted();
     }
   } catch (Exception ex) {
     logger.fatal("Error starting tournament", ex);
     TableManager.getInstance().removeTable(table.getId());
     TournamentManager.getInstance().quit(tournament.getId(), userId);
   }
 }
Пример #3
0
 @Override
 public boolean joinTournamentTable(
     UUID userId,
     UUID tableId,
     String name,
     String playerType,
     int skill,
     DeckCardLists deckList,
     String password)
     throws GameException {
   if (tables.containsKey(tableId)) {
     return TableManager.getInstance()
         .joinTournament(userId, tableId, name, playerType, skill, deckList, password);
   } else {
     return false;
   }
 }
Пример #4
0
  private void startGame(UUID choosingPlayerId) throws GameException {
    try {
      match.startGame();
      table.initGame();
      GameOptions gameOptions = new GameOptions();
      gameOptions.rollbackTurnsAllowed = match.getOptions().isRollbackTurnsAllowed();
      match.getGame().setGameOptions(gameOptions);
      GameManager.getInstance()
          .createGameSession(
              match.getGame(), userPlayerMap, table.getId(), choosingPlayerId, gameOptions);
      String creator = null;
      StringBuilder opponent = new StringBuilder();
      for (Entry<UUID, UUID> entry : userPlayerMap.entrySet()) { // no AI players
        if (match.getPlayer(entry.getValue()) != null
            && !match.getPlayer(entry.getValue()).hasQuit()) {
          User user = UserManager.getInstance().getUser(entry.getKey());
          if (user != null) {
            user.ccGameStarted(match.getGame().getId(), entry.getValue());

            if (creator == null) {
              creator = user.getName();
            } else {
              if (opponent.length() > 0) {
                opponent.append(" - ");
              }
              opponent.append(user.getName());
            }
          } else {
            logger.error(
                "Unable to find user: "******"  playerId: " + entry.getValue());
            MatchPlayer matchPlayer = match.getPlayer(entry.getValue());
            if (matchPlayer != null && !matchPlayer.hasQuit()) {
              matchPlayer.setQuit(true);
            }
          }
        }
      }
      // Append AI opponents to the log file
      for (MatchPlayer mPlayer : match.getPlayers()) {
        if (!mPlayer.getPlayer().isHuman()) {
          if (opponent.length() > 0) {
            opponent.append(" - ");
          }
          opponent.append(mPlayer.getName());
        }
      }
      ServerMessagesUtil.getInstance().incGamesStarted();

      // log about game started
      logger.info(
          "GAME started "
              + (match.getGame() != null ? match.getGame().getId() : "no Game")
              + " ["
              + match.getName()
              + "] "
              + creator
              + " - "
              + opponent.toString());
      logger.debug("- matchId: " + match.getId() + " [" + match.getName() + "]");
      if (match.getGame() != null) {
        logger.debug("- chatId:  " + GameManager.getInstance().getChatId(match.getGame().getId()));
      }
    } catch (Exception ex) {
      logger.fatal("Error starting game table: " + table.getId(), ex);
      if (table != null) {
        TableManager.getInstance().removeTable(table.getId());
      }
      if (match != null) {
        Game game = match.getGame();
        if (game != null) {
          GameManager.getInstance().removeGame(game.getId());
        }
      }
    }
  }
Пример #5
0
 public synchronized void leaveTable(UUID userId) {
   if (table == null) {
     logger.error("No table object - userId: " + userId);
     return;
   }
   if (table.isTournament() && tournament == null) {
     logger.error("No tournament object - userId: " + userId + "  table: " + table.getId());
     return;
   }
   if (table != null
       && this.userId != null
       && this.userId.equals(userId) // tourn. sub tables have no creator user
       && (table.getState().equals(TableState.WAITING)
           || table.getState().equals(TableState.READY_TO_START))) {
     // table not started yet and user is the owner, remove the table
     TableManager.getInstance().removeTable(table.getId());
   } else {
     UUID playerId = userPlayerMap.get(userId);
     if (playerId != null) {
       if (table.getState() == TableState.WAITING
           || table.getState() == TableState.READY_TO_START) {
         table.leaveNotStartedTable(playerId);
         if (table.isTournament()) {
           tournament.removePlayer(playerId);
         } else {
           match.quitMatch(playerId);
         }
         User user = UserManager.getInstance().getUser(userId);
         if (user != null) {
           ChatManager.getInstance()
               .broadcast(
                   chatId,
                   user.getName(),
                   "has left the table",
                   ChatMessage.MessageColor.BLUE,
                   true,
                   ChatMessage.MessageType.STATUS,
                   ChatMessage.SoundToPlay.PlayerLeft);
           if (!table.isTournamentSubTable()) {
             user.removeTable(playerId);
           }
         } else {
           logger.debug("User not found - userId: " + userId + " tableId:" + table.getId());
         }
         userPlayerMap.remove(userId);
       } else if (!table.getState().equals(TableState.FINISHED)) {
         if (table.isTournament()) {
           logger.debug("Quit tournament sub tables for userId: " + userId);
           TableManager.getInstance().userQuitTournamentSubTables(tournament.getId(), userId);
           logger.debug(
               "Quit tournament  Id: "
                   + table.getTournament().getId()
                   + "("
                   + table.getTournament().getTournamentState()
                   + ")");
           TournamentManager.getInstance().quit(tournament.getId(), userId);
         } else {
           MatchPlayer matchPlayer = match.getPlayer(playerId);
           if (matchPlayer != null && !match.hasEnded() && !matchPlayer.hasQuit()) {
             Game game = match.getGame();
             if (game != null && !game.hasEnded()) {
               Player player = match.getPlayer(playerId).getPlayer();
               if (player != null && player.isInGame()) {
                 GameManager.getInstance().quitMatch(game.getId(), userId);
               }
               match.quitMatch(playerId);
             } else {
               if (table.getState().equals(TableState.SIDEBOARDING)) {
                 if (!matchPlayer.isDoneSideboarding()) {
                   // submit deck to finish sideboarding and trigger match start / end
                   matchPlayer.submitDeck(matchPlayer.getDeck());
                 }
               }
               match.quitMatch(playerId);
             }
           }
         }
       }
     } else {
       logger.error("No playerId found for userId: " + userId);
     }
   }
 }
Пример #6
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;
  }
Пример #7
0
  public synchronized boolean joinTournament(
      UUID userId,
      String name,
      String playerType,
      int skill,
      DeckCardLists deckList,
      String password)
      throws GameException {
    if (table.getState() != TableState.WAITING) {
      return false;
    }

    Seat seat = table.getNextAvailableSeat(playerType);
    if (seat == null) {
      throw new GameException("No available seats.");
    }
    User user = UserManager.getInstance().getUser(userId);
    if (user == null) {
      logger.fatal(
          new StringBuilder("couldn't get user ")
              .append(name)
              .append(" for join tournament userId = ")
              .append(userId)
              .toString());
      return false;
    }
    // check password
    if (!table.getTournament().getOptions().getPassword().isEmpty() && playerType.equals("Human")) {
      if (!table.getTournament().getOptions().getPassword().equals(password)) {
        user.showUserMessage("Join Table", "Wrong password.");
        return false;
      }
    }
    if (userPlayerMap.containsKey(userId) && playerType.equals("Human")) {
      user.showUserMessage("Join Table", "You can join a table only one time.");
      return false;
    }
    Deck deck = null;
    if (!table.getTournament().getTournamentType().isLimited()) {
      if (deckList != null) {
        deck = Deck.load(deckList, false, false);
      } else {
        user.showUserMessage("Join Table", "No valid deck selected!");
        return 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.getTournament().getOptions().getQuitRatio();
    if (quitRatio < user.getTourneyQuitRatio()) {
      String message =
          new StringBuilder("Your quit ratio ")
              .append(user.getTourneyQuitRatio())
              .append("% is higher than the table requirement ")
              .append(quitRatio)
              .append("%")
              .toString();
      user.showUserMessage("Join Table", message);
      return false;
    }

    Player player = createPlayer(name, seat.getPlayerType(), skill);
    if (player != null) {
      if (!player.canJoinTable(table)) {
        user.showUserMessage(
            "Join Table",
            new StringBuilder("A ")
                .append(seat.getPlayerType())
                .append(" player can't join this table.")
                .toString());
        return false;
      }
      tournament.addPlayer(player, seat.getPlayerType());
      TournamentPlayer tournamentPlayer = tournament.getPlayer(player.getId());
      if (deck != null && tournamentPlayer != null) {
        tournamentPlayer.submitDeck(deck);
      }
      table.joinTable(player, seat);
      logger.debug(
          "Player "
              + player.getName()
              + " id: "
              + player.getId()
              + " joined tableId: "
              + table.getId());
      // only inform human players and add them to sessionPlayerMap
      if (seat.getPlayer().isHuman()) {
        seat.getPlayer().setUserData(user.getUserData());
        user.addTable(player.getId(), table);
        user.ccJoinedTable(table.getRoomId(), table.getId(), true);
        userPlayerMap.put(userId, player.getId());
      }

      return true;
    } else {
      throw new GameException("Playertype " + seat.getPlayerType() + " could not be created.");
    }
  }
Пример #8
0
 @Override
 public boolean watchTable(UUID userId, UUID tableId) throws MageException {
   return TableManager.getInstance().watchTable(userId, tableId);
 }
Пример #9
0
 @Override
 public void leaveTable(UUID userId, UUID tableId) {
   TableManager.getInstance().leaveTable(userId, tableId);
 }