@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()); }
@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."); } } }