Package org.mctourney.autoreferee.listeners.lobby

Source Code of org.mctourney.autoreferee.listeners.lobby.AutoLobbyListener$PlayerJoinTask

package org.mctourney.autoreferee.listeners.lobby;

import org.bukkit.entity.Player;

import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.scheduler.BukkitRunnable;
import org.mctourney.autoreferee.AutoRefMap;
import org.mctourney.autoreferee.AutoRefMatch;
import org.mctourney.autoreferee.AutoRefTeam;
import org.mctourney.autoreferee.AutoReferee;
import org.mctourney.autoreferee.event.match.MatchStartEvent;
import org.mctourney.autoreferee.event.player.PlayerMatchJoinEvent;
import org.mctourney.autoreferee.event.player.PlayerTeamJoinEvent;

public class AutoLobbyListener extends LobbyListener
{
  public AutoLobbyListener(AutoReferee plugin)
  {
    super(plugin);
    AutoRefMatch.giveMatchInfoBooks = false;
  }

  @Override
  protected void lobbyLoadMap(Player player, AutoRefMap map)
  {
    AutoRefMatch match = findSuitableMatch(map);
    if (match != null) match.joinMatch(player);
    else _loadMap(player, map, null);
  }

  private AutoRefMatch findSuitableMatch(AutoRefMap map)
  {
    for (AutoRefMatch match : plugin.getMatches())
      if (match.getCurrentState().isBeforeMatch() && map.equals(match.getMap()))
        return match;
    return null;
  }

  protected class PlayerJoinTask extends BukkitRunnable
  {
    private AutoRefMatch match;
    private Player player;

    public PlayerJoinTask(AutoRefMatch match, Player player)
    { this.match = match; this.player = player; }

    @Override
    public void run()
    {
      if (match.getCurrentState().isBeforeMatch() && match.getPlayerTeam(player) == null
        && !player.hasPermission("autoreferee.referee"))
      {
        match.joinTeam(player, match.getArbitraryTeam(),
          PlayerTeamJoinEvent.Reason.AUTOMATIC, false);
      }
    }
  }

  @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
  public void matchJoin(PlayerMatchJoinEvent event)
  { new PlayerJoinTask(event.getMatch(), event.getPlayer()).runTask(plugin); }

  private class MatchStarterTask extends BukkitRunnable
  {
    private final AutoRefMatch match;

    public MatchStarterTask(AutoRefMatch match)
    { this.match = match; }

    @Override
    public void run()
    {
      // starting a match is based purely on teams being filled
      boolean ready = true;
      for (AutoRefTeam t : match.getTeams())
        ready &= t.getPlayers().size() >= t.getMaxSize();
      if (ready) match.startMatch(MatchStartEvent.Reason.AUTOMATIC);
    }
  }

  @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
  public void teamJoin(PlayerTeamJoinEvent event)
  {
    AutoRefTeam team = event.getTeam();
    if (team.getPlayers().size() >= team.getMaxSize())
      event.setCancelled(true);

    // schedule a check to see if we need to start the match
    if (team.getMatch().getCurrentState().isBeforeMatch())
      new MatchStarterTask(team.getMatch()).runTask(plugin);
  }

  @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
  public void matchStart(MatchStartEvent event)
  {
    // if the match is being manually started, let it happen(?)
    if (event.getReason() == MatchStartEvent.Reason.READY) return;

    boolean canStart = true;
    for (AutoRefTeam t : event.getMatch().getTeams())
      canStart &= t.getPlayers().size() >= t.getMinSize();
    if (!canStart) event.setCancelled(true);
  }
}
TOP

Related Classes of org.mctourney.autoreferee.listeners.lobby.AutoLobbyListener$PlayerJoinTask

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.