Package org.mctourney.autoreferee.listeners

Source Code of org.mctourney.autoreferee.listeners.WorldListener

package org.mctourney.autoreferee.listeners;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockGrowEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.ServerCommandEvent;
import org.bukkit.event.world.WorldEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldInitEvent;
import org.bukkit.event.world.WorldUnloadEvent;
import org.bukkit.plugin.Plugin;

import org.mctourney.autoreferee.AutoRefMatch;
import org.mctourney.autoreferee.AutoReferee;
import org.mctourney.autoreferee.util.PlayerUtil;

public class WorldListener implements Listener
{
  AutoReferee plugin = null;

  public WorldListener(Plugin p)
  {
    plugin = (AutoReferee) p;
  }

  @EventHandler
  public void worldInit(WorldInitEvent event)
  { checkLoadedWorld(event); }

  @EventHandler
  public void worldLoad(WorldLoadEvent event)
  { checkLoadedWorld(event); }

  private void checkLoadedWorld(WorldEvent event)
  {
    AutoRefMatch.setupWorld(event.getWorld(), false);
  }

  @EventHandler(priority=EventPriority.LOWEST)
  public void commandBlockCommandEvent(ServerCommandEvent event)
  {
    if (!(event.getSender() instanceof BlockCommandSender)) return;
    Block commandBlock = ((BlockCommandSender) event.getSender()).getBlock();

    AutoRefMatch match = plugin.getMatch(commandBlock.getWorld());
    if (match == null) return;

    if (event.getCommand().startsWith("say"))
    {
      match.broadcast(ChatColor.DARK_GRAY + "" + ChatColor.ITALIC + "[@] " +
        ChatColor.RESET + event.getCommand().substring(3).trim());
      event.setCommand(""); return;
    }
  }

  @EventHandler(priority=EventPriority.HIGH, ignoreCancelled=true)
  public void playerJoin(PlayerJoinEvent event)
  {
    Player player = event.getPlayer();

    // get the match for the world the player is logging into
    AutoRefMatch match = plugin.getMatch(player.getWorld());

    // if there is no match here, or they aren't meant to play in this world,
    // check if there is a world they are expected in
    if (match == null || !match.isPlayer(player))
      for (AutoRefMatch m : plugin.getMatches())
        if (m.isPlayerExpected(player)) match = m;

    if (match != null)
    {
      // if we are logging in to the wrong world, teleport to the correct world
      if (player.getWorld() != match.getWorld()) match.joinMatch(player);
      else match.checkTeamsReady();

      if (!match.getCurrentState().inProgress() || match.isPlayer(player))
        match.broadcast(match.colorMessage(event.getJoinMessage()));
      event.setJoinMessage(null);

      match.sendMatchInfo(player);
      match.setupSpectators(player);

      // only clear inventories and give books if before match or not a player
      if (match.getCurrentState().isBeforeMatch() || !match.isPlayer(player))
      {
        // give them a book with info about the match
        PlayerUtil.clearInventory(player);
        match.giveMatchInfoBook(player);
      }

      if (match.isReferee(player))
        match.updateReferee(player);

      if (!player.hasPlayedBefore())
        player.teleport(match.getPlayerSpawn(player));
    }
  }

  @EventHandler
  public void playerQuit(PlayerQuitEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getPlayer().getWorld());
    if (match != null)
    {
      if (!match.getCurrentState().inProgress() || match.isPlayer(event.getPlayer()))
        match.broadcast(match.colorMessage(event.getQuitMessage()));
      event.setQuitMessage(null);

      // set the player back to the main scoreboard
      event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
    }
  }

  @EventHandler
  public void worldJoin(PlayerChangedWorldEvent event)
  {
    // update team ready information for both worlds
    AutoRefMatch matchFm = plugin.getMatch(event.getFrom());
    if (matchFm != null) matchFm.checkTeamsReady();

    Player player = event.getPlayer();
    AutoRefMatch matchTo = plugin.getMatch(player.getWorld());

    if (matchTo != null)
    {
      matchTo.checkTeamsReady();
      matchTo.sendMatchInfo(player);
      matchTo.setupSpectators(player);

      if (matchTo.isReferee(player))
        matchTo.updateReferee(player);

      // give them a book with info about the match
      PlayerUtil.clearInventory(player);
      matchTo.giveMatchInfoBook(player);
    }

    // if this is leaving a match, leave its team
    if (matchFm != null)
      matchFm.leaveTeam(player, false);

    // if they are leaving AutoReferee-managed worlds
    if (matchFm != null && matchTo == null)
    {
      matchFm.setSpectatorMode(player, false);
      PlayerUtil.setGameMode(player, GameMode.SURVIVAL);

      // set the player back to the main scoreboard
      player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
    }
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void worldUnload(WorldUnloadEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getWorld());
    if (match == null) return;

    match.saveWorldConfiguration();
    plugin.clearMatch(match);
  }

  @EventHandler
  public void blockForm(BlockFormEvent event)
  {
    // we are really only interested in stopping ice from forming here
    AutoRefMatch match = plugin.getMatch(event.getBlock().getWorld());
    if (match != null && !match.getCurrentState().inProgress()
      && event.getNewState().getType() == Material.ICE)
    { event.setCancelled(true); return; }
  }

  @EventHandler
  public void blockGrow(BlockGrowEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getBlock().getWorld());
    if (match != null && !match.getCurrentState().inProgress())
    { event.setCancelled(true); return; }
  }
}
TOP

Related Classes of org.mctourney.autoreferee.listeners.WorldListener

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.