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