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