diff options
Diffstat (limited to 'EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/inventory/InventoryCheckListener.java')
-rw-r--r-- | EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/inventory/InventoryCheckListener.java | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/inventory/InventoryCheckListener.java b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/inventory/InventoryCheckListener.java new file mode 100644 index 000000000..f42a37185 --- /dev/null +++ b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/checks/inventory/InventoryCheckListener.java @@ -0,0 +1,196 @@ +package com.earth2me.essentials.anticheat.checks.inventory; + +import com.earth2me.essentials.anticheat.EventManager; +import com.earth2me.essentials.anticheat.NoCheat; +import com.earth2me.essentials.anticheat.NoCheatPlayer; +import com.earth2me.essentials.anticheat.checks.CheckUtil; +import com.earth2me.essentials.anticheat.config.ConfigurationCacheStore; +import com.earth2me.essentials.anticheat.config.Permissions; +import java.util.LinkedList; +import java.util.List; +import org.bukkit.Material; +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.Action; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; + + +/** + * Central location to listen to events that are relevant for the inventory checks + * + */ +public class InventoryCheckListener implements Listener, EventManager +{ + private final DropCheck dropCheck; + private final InstantBowCheck instantBowCheck; + private final InstantEatCheck instantEatCheck; + private final NoCheat plugin; + + public InventoryCheckListener(NoCheat plugin) + { + + this.dropCheck = new DropCheck(plugin); + this.instantBowCheck = new InstantBowCheck(plugin); + this.instantEatCheck = new InstantEatCheck(plugin); + + this.plugin = plugin; + } + + /** + * We listen to DropItem Event for the dropCheck + * + * @param event The PlayerDropItem Event + */ + @EventHandler(priority = EventPriority.LOWEST) + protected void handlePlayerDropItemEvent(final PlayerDropItemEvent event) + { + + if (event.isCancelled() || event.getPlayer().isDead()) + { + return; + } + + boolean cancelled = false; + + final NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); + final InventoryConfig cc = InventoryCheck.getConfig(player); + final InventoryData data = InventoryCheck.getData(player); + + // If it should be executed, do it + if (cc.dropCheck && !player.hasPermission(Permissions.INVENTORY_DROP)) + { + cancelled = dropCheck.check(player, data, cc); + } + + if (cancelled) + { + // Cancelling drop events is not save (in certain circumstances + // items will disappear completely). So don't do it and kick + // players instead by default + // event.setCancelled(true); + } + } + + /** + * We listen to PlayerInteractEvent for the instantEat and instantBow checks + * + * @param event The PlayerInteractEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void interact(final PlayerInteractEvent event) + { + + // Only interested in right-clicks while holding an item + if (!event.hasItem() || !(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) + { + return; + } + + NoCheatPlayer player = plugin.getPlayer(event.getPlayer()); + final InventoryData data = InventoryCheck.getData(player); + + if (event.getItem().getType() == Material.BOW) + { + // It was a bow, the player starts to pull the string + // Remember this time + data.lastBowInteractTime = System.currentTimeMillis(); + } + else if (CheckUtil.isFood(event.getItem())) + { + // It was food, the player starts to eat some food + // Remember this time and the type of food + data.foodMaterial = event.getItem().getType(); + data.lastEatInteractTime = System.currentTimeMillis(); + } + else + { + // Nothing that we are interested in, reset data + data.lastBowInteractTime = 0; + data.lastEatInteractTime = 0; + data.foodMaterial = null; + } + } + + /** + * We listen to FoodLevelChange Event because Bukkit doesn't provide a PlayerFoodEating Event (or whatever it would + * be called). + * + * @param event The FoodLevelChangeEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void foodchanged(final FoodLevelChangeEvent event) + { + // Only if a player ate food + if (!event.isCancelled() && event.getEntity() instanceof Player) + { + final NoCheatPlayer player = plugin.getPlayer((Player)event.getEntity()); + final InventoryConfig cc = InventoryCheck.getConfig(player); + final InventoryData data = InventoryCheck.getData(player); + + // Only if he should get checked + if (cc.eatCheck && !player.hasPermission(Permissions.INVENTORY_INSTANTEAT)) + { + + boolean cancelled = instantEatCheck.check(player, event, data, cc); + + // The check requested the foodlevelchange to get cancelled + event.setCancelled(cancelled); + } + + // Forget the food material, as the info is no longer needed + data.foodMaterial = null; + } + + } + + /** + * We listen to EntityShootBowEvent for the instantbow check + * + * @param event The EntityShootBowEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void bowfired(final EntityShootBowEvent event) + { + // Only if a player shot the arrow + if (!event.isCancelled() && event.getEntity() instanceof Player) + { + final NoCheatPlayer player = plugin.getPlayer((Player)event.getEntity()); + final InventoryConfig cc = InventoryCheck.getConfig(player); + + // Only if he should get checked + if (cc.bowCheck && !player.hasPermission(Permissions.INVENTORY_INSTANTBOW)) + { + final InventoryData data = InventoryCheck.getData(player); + boolean cancelled = instantBowCheck.check(player, event, data, cc); + + // The check requested the bowshooting to get cancelled + event.setCancelled(cancelled); + } + } + } + + public List<String> getActiveChecks(ConfigurationCacheStore cc) + { + LinkedList<String> s = new LinkedList<String>(); + + InventoryConfig i = InventoryCheck.getConfig(cc); + if (i.dropCheck) + { + s.add("inventory.dropCheck"); + } + if (i.bowCheck) + { + s.add("inventory.instantbow"); + } + if (i.eatCheck) + { + s.add("inventory.instanteat"); + } + return s; + } +} |