[BLIND] Attempt to catch open inventories for portals and world changes.

This commit is contained in:
asofold 2013-06-30 00:07:54 +02:00
parent fa2d0360a6
commit 3880808d06
3 changed files with 70 additions and 0 deletions

View File

@ -3,20 +3,24 @@ package fr.neatmonster.nocheatplus.checks.inventory;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityPortalEnterEvent;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
@ -25,6 +29,8 @@ import fr.neatmonster.nocheatplus.checks.CheckListener;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.combined.Combined;
import fr.neatmonster.nocheatplus.checks.combined.Improbable;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigManager;
/*
* M""M dP
@ -318,4 +324,63 @@ public class InventoryListener extends CheckListener {
Items.checkIllegalEnchantments(player, inv.getItem(event.getNewSlot()));
Items.checkIllegalEnchantments(player, inv.getItem(event.getPreviousSlot()));
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerChangedWorld(final PlayerChangedWorldEvent event){
if (shouldEnsureCloseInventories()){
closePlayerInventoryRecursively(event.getPlayer());
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerPortal(final PlayerPortalEvent event){
if (shouldEnsureCloseInventories()){
closePlayerInventoryRecursively(event.getPlayer());
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onEntityPortal(final EntityPortalEnterEvent event){
if (shouldEnsureCloseInventories()){
closePlayerInventoryRecursively(event.getEntity());
}
}
/**
* Test if global config has set the flag.
* @return
*/
public static boolean shouldEnsureCloseInventories(){
return ConfigManager.getConfigFile().getBoolean(ConfPaths.INVENTORY_ENSURECLOSE, true);
}
/**
* Search for players / passengers.
* @param entity
*/
public static void closePlayerInventoryRecursively(Entity entity){
// Find a player.
while (entity != null){
if (entity instanceof Player){
closeInventory((Player) entity);
}
final Entity passenger = entity.getPassenger();
if (entity.equals(passenger)){
// Just in case :9.
break;
}
else{
entity = passenger;
}
}
}
/**
* Close one players inventory, if open.
* @param player
*/
public static void closeInventory(final Player player){
// TODO: Better check if any !?.
player.closeInventory();
}
}

View File

@ -529,6 +529,9 @@ public abstract class ConfPaths {
private static final String INVENTORY_ITEMS = INVENTORY + ".items";
public static final String INVENTORY_ITEMS_CHECK = INVENTORY_ITEMS + ".active";
@GlobalConfig
public static final String INVENTORY_ENSURECLOSE = INVENTORY + ".ensureclose";
/*
* e e ,e,
* d8b d8b e88 88e Y8b Y888P " 888 8e e88 888

View File

@ -391,6 +391,8 @@ public class DefaultConfig extends ConfigFile {
set(ConfPaths.INVENTORY_FASTCONSUME_ACTIONS, "log:fastconsume:2:5:if cancel");
set(ConfPaths.INVENTORY_ITEMS_CHECK, true);
set(ConfPaths.INVENTORY_ENSURECLOSE, true);
/*
* e e ,e,