Ejemplo n.º 1
0
  @Override
  public void runImpl() throws Exception {
    if (Olympiad
        ._inCompPeriod) // Если бои еще не закончились, откладываем окончание олимпиады на минуту
    {
      ThreadPoolManager.getInstance().schedule(new OlympiadEndTask(), 60000);
      return;
    }

    Announcements.getInstance()
        .announceToAll(
            new SystemMessage(SystemMessage.OLYMPIAD_PERIOD_S1_HAS_ENDED)
                .addNumber(Olympiad._currentCycle));
    Announcements.getInstance().announceToAll("Olympiad Validation Period has began");

    Olympiad._isOlympiadEnd = true;
    if (Olympiad._scheduledManagerTask != null) Olympiad._scheduledManagerTask.cancel(false);
    if (Olympiad._scheduledWeeklyTask != null) Olympiad._scheduledWeeklyTask.cancel(false);

    Olympiad._validationEnd = Olympiad._olympiadEnd + Config.ALT_OLY_VPERIOD;

    OlympiadDatabase.saveNobleData();
    Olympiad._period = 1;
    Hero.getInstance().clearHeroes();

    try {
      OlympiadDatabase.save();
    } catch (Exception e) {
      _log.error("Olympiad System: Failed to save Olympiad configuration!", e);
    }

    _log.info(
        "Olympiad System: Starting Validation period. Time to end validation:"
            + Olympiad.getMillisToValidationEnd() / (60 * 1000));

    if (Olympiad._scheduledValdationTask != null) Olympiad._scheduledValdationTask.cancel(false);
    Olympiad._scheduledValdationTask =
        ThreadPoolManager.getInstance()
            .schedule(new ValidationTask(), Olympiad.getMillisToValidationEnd());
  }
Ejemplo n.º 2
0
  @Override
  public final void run() {
    if (Olympiad.getInstance().isOlympiadEnd()) {
      return;
    }

    if (Olympiad.getInstance().inCompPeriod()) {
      OlympiadGameTask task;
      AbstractOlympiadGame newGame;

      List<List<Integer>> readyClassed = OlympiadManager.getInstance().hasEnoughRegisteredClassed();
      boolean readyNonClassed = OlympiadManager.getInstance().hasEnoughRegisteredNonClassed();
      boolean readyTeams = OlympiadManager.getInstance().hasEnoughRegisteredTeams();

      if ((readyClassed != null) || readyNonClassed || readyTeams) {
        // set up the games queue
        for (int i = 0; i < _tasks.length; i++) {
          task = _tasks[i];
          synchronized (task) {
            if (!task.isRunning()) {
              // Fair arena distribution
              // 0,2,4,6,8.. arenas checked for classed or teams first
              if (((readyClassed != null) || readyTeams) && ((i % 2) == 0)) {
                // 0,4,8.. arenas checked for teams first
                if (readyTeams && ((i % 4) == 0)) {
                  newGame =
                      OlympiadGameTeams.createGame(
                          i, OlympiadManager.getInstance().getRegisteredTeamsBased());
                  if (newGame != null) {
                    task.attachGame(newGame);
                    continue;
                  }
                  readyTeams = false;
                }
                // if no ready teams found check for classed
                if (readyClassed != null) {
                  newGame = OlympiadGameClassed.createGame(i, readyClassed);
                  if (newGame != null) {
                    task.attachGame(newGame);
                    continue;
                  }
                  readyClassed = null;
                }
              }
              // 1,3,5,7,9.. arenas used for non-classed
              // also other arenas will be used for non-classed if no classed or teams available
              if (readyNonClassed) {
                newGame =
                    OlympiadGameNonClassed.createGame(
                        i, OlympiadManager.getInstance().getRegisteredNonClassBased());
                if (newGame != null) {
                  task.attachGame(newGame);
                  continue;
                }
                readyNonClassed = false;
              }
            }
          }

          // stop generating games if no more participants
          if ((readyClassed == null) && !readyNonClassed && !readyTeams) {
            break;
          }
        }
      }
    } else {
      // not in competition period
      if (isAllTasksFinished()) {
        OlympiadManager.getInstance().clearRegistered();
        _battleStarted = false;
        _log.log(Level.INFO, "Olympiad System: All current games finished.");
      }
    }
  }