private Team pickRandomWinner(MatchResult r, Collection<Team> randos) {
   Team victor;
   List<Team> ls = new ArrayList<Team>(randos);
   if (ls.isEmpty()) {
     Log.err("[BattleArena] Tournament found a match with no players, cancelling tournament");
     this.cancelEvent();
     return null;
   }
   victor = ls.get(rand.nextInt(ls.size()));
   victor.sendMessage("&2You drew your match but have been randomly selected as the winner!");
   r.setVictor(victor);
   Set<Team> losers = new HashSet<Team>(ls);
   losers.remove(victor);
   r.addLosers(losers);
   for (Team l : losers) {
     l.sendMessage(
         "&cYou drew your match but someone else has been randomly selected as the winner!");
   }
   return victor;
 }
  public static void teleportOut(
      PlayerHolder am,
      ArenaTeam team,
      ArenaPlayer player,
      TransitionOptions mo,
      int teamIndex,
      boolean insideArena,
      boolean onlyInMatch,
      boolean wipeInventory) {
    MatchParams mp = am.getParams();
    Location loc = null;
    ArenaLocation src = player.getCurLocation();
    final LocationType type;
    if (mo.hasOption(TransitionOption.TELEPORTTO)) {
      loc = mo.getTeleportToLoc();
      type = LocationType.CUSTOM;
    } else {
      type = LocationType.HOME;
      loc = player.getOldLocation();
      /// TODO
      /// This is a bit of a kludge, sometimes we are "teleporting them out"
      /// when they are already out... so need to rethink how this can happen and should it
      if (loc == null && src.getType() == LocationType.HOME) {
        loc = src.getLocation();
      }
    }
    player.clearOldLocation();
    if (loc == null) {
      Log.err(
          BattleArena.getNameAndVersion()
              + " Teleporting to a null location!  teleportTo="
              + mo.hasOption(TransitionOption.TELEPORTTO));
    }

    ArenaLocation dest = new ArenaLocation(AbstractAreaContainer.HOMECONTAINER, loc, type);
    ArenaPlayerTeleportEvent apte =
        new ArenaPlayerTeleportEvent(
            am.getParams().getType(), player, team, src, dest, TeleportDirection.OUT);
    movePlayer(player, apte, mp);
  }
Example #3
0
  @EventHandler
  public void matchCompleted(MatchCompletedEvent event) {
    if (!isRunning()) return;
    Match am = event.getMatch();
    Team victor = am.getVictor();
    Matchup m;
    if (victor == null) m = getMatchup(am.getResult().getLosers().iterator().next(), round);
    else m = getMatchup(victor, round);
    //		System.out.println("victor ===" + victor + "  am= " +am + " losers=" + am.getLosers() +"   m
    // = " + m +"   am.result="+am.getResult());
    if (m == null) { // / This match wasnt in our tournament
      return;
    }
    if (am.getState() == MatchState.ONCANCEL) {
      endEvent();
      return;
    }
    MatchResult r = am.getResult();
    if (victor == null) { // / match was a draw, pick a random lucky winner
      List<Team> ls = new ArrayList<Team>(am.getResult().getLosers());
      if (ls.isEmpty()) {
        Log.err("[BattleArena] Tournament found a match with no players, cancelling tournament");
        this.cancelEvent();
        return;
      }
      victor = ls.get(rand.nextInt(ls.size()));
      victor.sendMessage("&2You drew your match but have been randomly selected as the winner!");
      r.setVictor(victor);
      Set<Team> losers = new HashSet<Team>(ls);
      losers.remove(victor);
      r.setLosers(losers);
      for (Team l : losers) {
        l.sendMessage(
            "&cYou drew your match but someone else has been randomly selected as the winner!");
      }
    }
    m.setResult(r);
    for (Team t : r.getLosers()) {
      super.removeTeam(t);
    }
    aliveTeams.removeAll(r.getLosers());

    if (roundFinished()) {
      TimeUtil.testClock();
      if (Defaults.DEBUG) System.out.println("ROUND FINISHED !!!!!   " + aliveTeams);

      if (round + 1 == nrounds || isFinished()) {
        Server server = Bukkit.getServer();
        Team t = aliveTeams.get(0);
        server.broadcastMessage(
            Log.colorChat(
                eventParams.getPrefix()
                    + "&e Congratulations to &6"
                    + t.getDisplayName()
                    + "&e for winning!"));
        HashSet<Team> losers = new HashSet<Team>(competingTeams);
        losers.remove(victor);
        eventVictory(victor, losers);
        PerformTransition.transition(am, MatchState.FIRSTPLACE, t, false);
        PerformTransition.transition(am, MatchState.PARTICIPANTS, losers, false);
        eventCompleted();
      } else {
        makeNextRound();
        startRound();
      }
    }
  }
  private static void movePlayer(
      ArenaPlayer player, ArenaPlayerTeleportEvent apte, MatchParams mp) {
    PlayerHolder src = apte.getSrcLocation().getPlayerHolder();
    PlayerHolder dest = apte.getDestLocation().getPlayerHolder();
    TeleportDirection td = apte.getDirection();
    if (Defaults.DEBUG_TRACE)
      Log.info(" ###########  " + player.getCurLocation() + "  -->  " + dest.getLocationType());
    if (Defaults.DEBUG_TRACE)
      Log.info(
          " ---- << -- " + player.getName() + "   src=" + src + "   dest=" + dest + "    td=" + td);

    switch (td) {
      case RESPAWN:
        break;
      case FIRSTIN:
        mp.getGameManager().onPreJoin(player, apte);
        dest.onPreJoin(player, apte);
      case IN:
        src.onPreLeave(player, apte);
        dest.onPreEnter(player, apte);
        break;
      case OUT:
        mp.getGameManager().onPreQuit(player, apte);
        src.onPreQuit(player, apte);
        dest.onPreJoin(player, apte);
        break;
      default:
        break;
    }
    dest.callEvent(apte);
    if (!TeleportController.teleport(player.getPlayer(), apte.getDestLocation().getLocation(), true)
        && player.isOnline()
        && !player.isDead()) {
      Log.err(
          "[BA Warning] couldn't teleport "
              + player.getName()
              + " srcLoc="
              + apte.getSrcLocation()
              + " destLoc="
              + apte.getDestLocation());
    }
    player.setCurLocation(apte.getDestLocation());
    switch (td) {
      case RESPAWN:
        break;
      case FIRSTIN:
        mp.getGameManager().onPostJoin(player, apte);
        dest.onPostJoin(player, apte);
      case IN:
        src.onPostLeave(player, apte);
        dest.onPostEnter(player, apte);
        break;
      case OUT:
        mp.getGameManager().onPostQuit(player, apte);
        src.onPostQuit(player, apte);
        dest.onPostJoin(player, apte);
        break;
      default:
        break;
    }
  }