Cancel various actions for dead players. Config pending.

This commit is contained in:
asofold 2014-06-04 23:36:28 +02:00
parent a75e32b2d3
commit 56bab0a3ae
6 changed files with 39 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.Event.Result;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.inventory.ItemStack;
@ -12,6 +13,7 @@ import fr.neatmonster.nocheatplus.actions.ParameterName;
import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.compat.BridgeHealth;
import fr.neatmonster.nocheatplus.config.ConfPaths;
import fr.neatmonster.nocheatplus.config.ConfigManager;
import fr.neatmonster.nocheatplus.logging.LogUtil;
@ -44,7 +46,14 @@ public class FastConsume extends Check implements Listener{
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onItemConsume(final PlayerItemConsumeEvent event){
final Player player = event.getPlayer();
if (!isEnabled(player)) return;
if (player.isDead() && BridgeHealth.getHealth(player) <= 0.0) {
// Eat after death.
event.setCancelled(true);
return;
}
if (!isEnabled(player)) {
return;
}
final InventoryData data = InventoryData.getData(player);
if (check(player, event.getItem(), data)){
event.setCancelled(true);

View File

@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack;
import fr.neatmonster.nocheatplus.checks.CheckListener;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.combined.CombinedConfig;
import fr.neatmonster.nocheatplus.compat.BridgeHealth;
import fr.neatmonster.nocheatplus.utilities.BlockProperties;
/**
@ -52,6 +53,15 @@ public class BlockInteractListener extends CheckListener {
@EventHandler(
ignoreCancelled = false, priority = EventPriority.LOWEST)
protected void onPlayerInteract(final PlayerInteractEvent event) {
final Player player = event.getPlayer();
// Cancel interact events for dead players.
if (player.isDead() && BridgeHealth.getHealth(player) <= 0.0) {
// Auto-soup after death.
event.setUseInteractedBlock(Result.DENY);
event.setUseItemInHand(Result.DENY);
event.setCancelled(true);
return;
}
// TODO: Re-arrange for interact spam, possibly move ender pearl stuff to a method.
final Action action = event.getAction();
@ -60,7 +70,7 @@ public class BlockInteractListener extends CheckListener {
if (block == null){
return;
}
final Player player = event.getPlayer();
final BlockInteractData data = BlockInteractData.getData(player);
data.setLastBlock(block, action);
switch(action){

View File

@ -533,6 +533,11 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
final Entity entity = event.getEntity();
if (!(entity instanceof Player)) return;
final Player player = (Player) entity;
if (player.isDead() && BridgeHealth.getHealth(player) <= 0.0) {
// Heal after death.
event.setCancelled(true);
return;
}
if (event.getRegainReason() != RegainReason.SATIATED) {
return;
}

View File

@ -173,7 +173,7 @@ public class GodMode extends Check {
public void death(final Player player) {
// TODO: Is this still relevant ?
// First check if the player is really dead (e.g. another plugin could have just fired an artificial event).
if (BridgeHealth.getHealth(player) <= 0.0 && player.isDead()){
if (BridgeHealth.getHealth(player) <= 0.0 && player.isDead()) {
try {
// Schedule a task to be executed in roughly 1.5 seconds.
// TODO: Get plugin otherwise !?

View File

@ -29,6 +29,7 @@ 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.compat.BridgeHealth;
import fr.neatmonster.nocheatplus.components.JoinLeaveListener;
import fr.neatmonster.nocheatplus.utilities.InventoryUtil;
@ -111,6 +112,10 @@ public class InventoryListener extends CheckListener implements JoinLeaveListen
if (instantEat.isEnabled(player) && instantEat.check(player, event.getFoodLevel())){
event.setCancelled(true);
}
else if (player.isDead() && BridgeHealth.getHealth(player) <= 0.0) {
// Eat after death.
event.setCancelled(true);
}
}
}
@ -253,6 +258,11 @@ public class InventoryListener extends CheckListener implements JoinLeaveListen
public final void onPlayerInteractEntity(final PlayerInteractEntityEvent event) {
final Player player = event.getPlayer();
if (player.getGameMode() == GameMode.CREATIVE) return;
if (player.isDead() && BridgeHealth.getHealth(player) <= 0.0) {
// No zombies.
event.setCancelled(true);
return;
}
final ItemStack stack = player.getItemInHand();
if (stack != null && stack.getTypeId() == Material.MONSTER_EGG.getId() && items.isEnabled(player)){
event.setCancelled(true);

View File

@ -13,6 +13,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import fr.neatmonster.nocheatplus.command.BaseCommand;
import fr.neatmonster.nocheatplus.compat.BridgeHealth;
import fr.neatmonster.nocheatplus.permissions.Permissions;
import fr.neatmonster.nocheatplus.players.DataManager;
@ -53,7 +54,7 @@ public class InspectCommand extends BaseCommand {
builder.append(" (" + (player.isOnline() ? "online" : "offline") + (player.isDead() ? ",dead" : "") + (player.isValid() ? "" : ",invalid") + (player.isInsideVehicle() ? (",vehicle=" + player.getVehicle().getType() + "@" + locString(player.getVehicle().getLocation())) : "")+ "):");
// TODO: isValid, isDead, isInsideVehicle ...
// Health.
builder.append(" health=" + f1.format(player.getHealth()) + "/" + f1.format(player.getMaxHealth()));
builder.append(" health=" + f1.format(BridgeHealth.getHealth(player)) + "/" + f1.format(BridgeHealth.getMaxHealth(player)));
// Food.
builder.append(" food=" + player.getFoodLevel());
// Exp.