Package org.mctourney.autoreferee.listeners

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

package org.mctourney.autoreferee.listeners;

import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.EntityType;
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.*;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.mctourney.autoreferee.AutoRefMatch;
import org.mctourney.autoreferee.AutoRefPlayer;
import org.mctourney.autoreferee.AutoRefTeam;
import org.mctourney.autoreferee.AutoReferee;
import org.mctourney.autoreferee.AutoRefMatch.RespawnMode;
import org.mctourney.autoreferee.goals.CoreGoal;
import org.mctourney.autoreferee.util.AchievementPoints;
import org.mctourney.autoreferee.util.BlockData;

public class ObjectiveTracker implements Listener
{
  AutoReferee plugin = null;

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

  // Note: Wool on VM has been moved to ObjectiveTracer

  /* TRACKING OBJECTIVES/BED */

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void bedBreak(BlockBreakEvent event)
  {
    Player pl = event.getPlayer();
    Block block = event.getBlock();

    AutoRefMatch match = plugin.getMatch(block.getWorld());
    AutoRefPlayer apl = match == null ? null : match.getPlayer(pl);

    if (match != null && apl != null && match.getCurrentState().inProgress()
      && match.getRespawnMode() == RespawnMode.BEDS_ONLY && block.getType() == Material.BED_BLOCK)
        match.new BedUpdateTask(apl).runTask(plugin);
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void bedExplode(EntityExplodeEvent event)
  {
    Entity ent = event.getEntity();
    AutoRefMatch match = plugin.getMatch(ent.getWorld());
    boolean bedBroke = false;

    for (Block b : event.blockList())
      if (b.getType() == Material.BED_BLOCK) bedBroke = true;

    if (match != null && match.getCurrentState().inProgress()
      && match.getRespawnMode() == RespawnMode.BEDS_ONLY && bedBroke)
        match.new BedUpdateTask(ent).runTask(plugin);
  }

  // ----------------- START WINCONDITION -----------------------

  private void _checkWinConditions(BlockEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getBlock().getWorld());
    if (match != null) match.checkWinConditions();
  }

  private void _checkWinConditions(EntityEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getEntity().getWorld());
    if (match != null) match.checkWinConditions();
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockBreakEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockBurnEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockFadeEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockFromToEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getBlock().getWorld());
    if (match != null) for (AutoRefTeam team : match.getTeams())
      for (CoreGoal goal : team.getTeamGoals(CoreGoal.class))
        goal.checkSatisfied(event);

    // typical win condition check as well
    _checkWinConditions(event);
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockGrowEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockIgniteEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockPhysicsEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockPistonExtendEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockPistonRetractEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(BlockRedstoneEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(LeavesDecayEvent event)
  { _checkWinConditions(event); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void checkWinConditions(PlayerDeathEvent event)
  { _checkWinConditions(event); }

  // ------------------ END WINCONDITION ------------------------

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void blockBreak(BlockBreakEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getBlock().getWorld());
    if (match != null) match.checkWinConditions();
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void blockInteract(PlayerInteractEvent event)
  {
    if (event.hasBlock())
    {
      AutoRefMatch match = plugin.getMatch(event.getClickedBlock().getWorld());
      if (match != null) match.checkWinConditions();
    }
  }

  /* TRACKING WOOL CARRYING */

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void inventoryClick(InventoryClickEvent event)
  { inventoryChange(event.getWhoClicked()); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void itemDrop(PlayerDropItemEvent event)
  { inventoryChange(event.getPlayer()); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void itemPickup(PlayerPickupItemEvent event)
  { inventoryChange(event.getPlayer()); }

  @EventHandler(priority=EventPriority.MONITOR)
  public void blockPlaceInventory(BlockPlaceEvent event)
  { inventoryChange(event.getPlayer()); }

  class InventoryChangeTask implements Runnable
  {
    AutoRefPlayer apl = null;

    public InventoryChangeTask(AutoRefPlayer apl)
    { this.apl = apl; }

    public void run()
    { if (apl != null) apl.updateCarrying(); }
  }

  public void inventoryChange(HumanEntity entity)
  {
    AutoRefMatch match = plugin.getMatch(entity.getWorld());
    if (match == null) return;

    if (match.getCurrentState().inProgress() &&
      entity.getType() == EntityType.PLAYER)
    {
      AutoRefPlayer apl = match.getPlayer((Player) entity);
      if (apl != null) plugin.getServer().getScheduler()
        .runTask(plugin, new InventoryChangeTask(apl));
    }
  }

  /* TRACKING PLAYER HEALTH, HUNGER, AND ARMOR */

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void playerHealthDown(EntityDamageEvent event)
  { healthArmorChange(event.getEntity()); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void playerHealthUp(EntityRegainHealthEvent event)
  { healthArmorChange(event.getEntity()); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void playerFoodChange(FoodLevelChangeEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getEntity().getWorld());
    if (match != null && event.getEntity().getType() == EntityType.PLAYER)
    {
      Player player = (Player) event.getEntity();
      match.messageReferees("player", player.getName(),
        "hunger", Integer.toString(event.getFoodLevel()));
    }
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void playerArmorChange(InventoryClickEvent event)
  { healthArmorChange(event.getWhoClicked()); }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void playerArmorDrop(PlayerDropItemEvent event)
  { healthArmorChange(event.getPlayer()); }

  class HealthArmorChangeTask implements Runnable
  {
    AutoRefPlayer apl = null;

    public HealthArmorChangeTask(AutoRefPlayer apl)
    { this.apl = apl; }

    public void run()
    { if (apl != null) apl.updateHealthArmor(); }
  }

  public void healthArmorChange(Entity entity)
  {
    AutoRefMatch match = plugin.getMatch(entity.getWorld());
    if (match != null && entity.getType() == EntityType.PLAYER)
    {
      AutoRefPlayer apl = match.getPlayer((Player) entity);
      if (apl != null) plugin.getServer().getScheduler()
        .runTask(plugin, new HealthArmorChangeTask(apl));
    }
  }

  /* MISC */

  @EventHandler(priority=EventPriority.MONITOR)
  public void playerRespawn(PlayerRespawnEvent event)
  {
    Player player = event.getPlayer();
    inventoryChange(player);
    healthArmorChange(player);

    AutoRefMatch match = plugin.getMatch(event.getRespawnLocation().getWorld());
    if (match != null && match.getRespawnMode() == RespawnMode.BEDS_ONLY)
      if (player.getBedSpawnLocation() == null)
      {
        match.eliminatePlayer(player);
        event.setRespawnLocation(match.getSpectatorSpawn());
      }
  }

  private class CraftCountTask extends BukkitRunnable
  {
    private HumanEntity player;
    private int count;
    private Material type;
    private MaterialData data;
    private int size;

    public CraftCountTask(ItemStack item, HumanEntity p)
    {
      this.player = p;
      this.type = item.getType();
      this.data = item.getData();
      this.count = countItemInInventory();
      this.size = item.getAmount();
    }

    private int countItemInInventory()
    {
      int c = 0;
      if (player.getItemOnCursor() != null)
      {
        ItemStack item = player.getItemOnCursor();
        if (item.getType().equals(this.type) && item.getData().equals(this.data))
          c += item.getAmount();
      }
      for (ItemStack item : player.getInventory().getContents())
        if (item != null && item.getType().equals(this.type) && item.getData().equals(this.data))
          c += item.getAmount();
      return c;
    }

    @Override
    public void run()
    {
      int crafted = countItemInInventory() - this.count;
      AutoRefMatch match = plugin.getMatch(player.getWorld());
      if (match == null || !match.getCurrentState().inProgress()) return;

      AutoRefPlayer apl = match.getPlayer((Player) player);
      AchievementPoints ach = AchievementPoints.getEquipmentCraft(type);
      if (apl != null) apl.addPoints(ach, crafted / this.size);
    }
  }

  @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
  public void itemCraft(CraftItemEvent event)
  {
    AutoRefMatch match = plugin.getMatch(event.getWhoClicked().getWorld());
    if (match == null) return;

    if (!(event.getWhoClicked() instanceof Player)) return;
    AutoRefTeam team = plugin.getTeam((Player) event.getWhoClicked());

    BlockData recipeTarget = BlockData.fromItemStack(event.getRecipe().getResult());
    if (team != null && !team.canCraft(recipeTarget)) event.setCancelled(true);

    // if this is on the blacklist, cancel
    if (!match.canCraft(recipeTarget)) event.setCancelled(true);
  }

  @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
  public void itemCraftMonitor(CraftItemEvent event)
  {
    new CraftCountTask(event.getRecipe().getResult(), event.getWhoClicked()).runTask(plugin);
  }
}
TOP

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

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.