package in.twizmwaz.cardinal.module.modules.filter.type;
import in.twizmwaz.cardinal.module.modules.filter.FilterModule;
import in.twizmwaz.cardinal.module.modules.filter.FilterState;
import in.twizmwaz.cardinal.module.modules.filter.parsers.CauseFilterParser;
import org.bukkit.entity.Creature;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.world.WorldEvent;
import static in.twizmwaz.cardinal.module.modules.filter.FilterState.ABSTAIN;
import static in.twizmwaz.cardinal.module.modules.filter.FilterState.ALLOW;
import static in.twizmwaz.cardinal.module.modules.filter.FilterState.DENY;
public class CauseFilter extends FilterModule {
private final EventCause cause;
public CauseFilter(final CauseFilterParser parser) {
super(parser.getName(), parser.getParent());
this.cause = parser.getCause();
}
@Override
public FilterState evaluate(final Object... objects) {
for (Object object : objects) {
if (object instanceof Event) {
Boolean result = evaluate((Event) object);
if (result != null) return result ? ALLOW : DENY;
}
}
return (getParent() == null ? ABSTAIN : getParent().evaluate(objects));
}
private Boolean evaluate(Event event) {
if (!(event instanceof EntityDamageEvent)) {
switch (cause) {
case WORLD:
return event instanceof WorldEvent;
case LIVING:
return event instanceof EntityEvent && ((EntityEvent) event).getEntity() instanceof LivingEntity;
case MOB:
return event instanceof EntityEvent && ((EntityEvent) event).getEntity() instanceof Creature;
case PLAYER:
return event instanceof PlayerEvent || event instanceof BlockPlaceEvent || event instanceof BlockBreakEvent;
case PUNCH:
return event instanceof PlayerInteractEvent
&& ((PlayerInteractEvent) event).getAction().equals(Action.LEFT_CLICK_BLOCK);
case TRAMPLE:
return event instanceof PlayerMoveEvent;
case MINE:
return event instanceof BlockBreakEvent;
case EXPLOSION:
return event instanceof EntityExplodeEvent;
}
} else {
EntityDamageEvent.DamageCause damageCause = ((EntityDamageEvent) event).getCause();
switch (cause) {
case MELEE:
return damageCause.equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK);
case PROJECTILE:
return damageCause.equals(EntityDamageEvent.DamageCause.PROJECTILE);
case POTION:
return damageCause.equals(EntityDamageEvent.DamageCause.MAGIC)
|| damageCause.equals(EntityDamageEvent.DamageCause.POISON)
|| damageCause.equals(EntityDamageEvent.DamageCause.WITHER)
|| damageCause.equals(EntityDamageEvent.DamageCause.DRAGON_BREATH);
case EXPLOSION:
return damageCause.equals(EntityDamageEvent.DamageCause.BLOCK_EXPLOSION)
|| damageCause.equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION);
case COMBUSTION:
return damageCause.equals(EntityDamageEvent.DamageCause.FIRE)
|| damageCause.equals(EntityDamageEvent.DamageCause.FIRE_TICK)
|| damageCause.equals(EntityDamageEvent.DamageCause.MELTING)
|| damageCause.equals(EntityDamageEvent.DamageCause.LAVA)
|| damageCause.equals(EntityDamageEvent.DamageCause.HOT_FLOOR);
case FALL:
return damageCause.equals(EntityDamageEvent.DamageCause.FALL);
case GRAVITY:
return damageCause.equals(EntityDamageEvent.DamageCause.FALL)
|| damageCause.equals(EntityDamageEvent.DamageCause.VOID);
case VOID:
return damageCause.equals(EntityDamageEvent.DamageCause.VOID);
case SQUASH:
return damageCause.equals(EntityDamageEvent.DamageCause.FALLING_BLOCK);
case SUFFOCATION:
return damageCause.equals(EntityDamageEvent.DamageCause.SUFFOCATION);
case DROWNING:
return damageCause.equals(EntityDamageEvent.DamageCause.DROWNING);
case STARVATION:
return damageCause.equals(EntityDamageEvent.DamageCause.STARVATION);
case LIGHTNING:
return damageCause.equals(EntityDamageEvent.DamageCause.LIGHTNING);
case CACTUS:
return damageCause.equals(EntityDamageEvent.DamageCause.CONTACT);
case THORNS:
return damageCause.equals(EntityDamageEvent.DamageCause.THORNS);
}
}
return null;
}
public enum EventCause {
WORLD(),
LIVING(),
MOB(),
PLAYER(),
PUNCH(),
TRAMPLE(),
MINE(),
MELEE(),
PROJECTILE(),
POTION(),
EXPLOSION(),
COMBUSTION(),
FALL(),
GRAVITY(),
VOID(),
SQUASH(),
SUFFOCATION(),
DROWNING(),
STARVATION(),
LIGHTNING(),
CACTUS(),
THORNS();
public static EventCause getEventCause(String string) {
switch (string.toLowerCase().replaceAll(" ", "")) {
case "world":
return WORLD;
case "living":
return LIVING;
case "mob":
return MOB;
case "player":
return PLAYER;
case "punch":
return PUNCH;
case "trample":
return TRAMPLE;
case "mine":
return MINE;
case "melee":
return MELEE;
case "projectile":
return PROJECTILE;
case "potion":
return POTION;
case "tnt":
case "explosion":
return EXPLOSION;
case "combustion":
return COMBUSTION;
case "fall":
return FALL;
case "gravity":
return GRAVITY;
case "void":
return VOID;
case "squash":
return SQUASH;
case "suffocation":
return SUFFOCATION;
case "drowning":
return DROWNING;
case "starvation":
return STARVATION;
case "lightning":
return LIGHTNING;
case "cactus":
return CACTUS;
case "thorns":
return THORNS;
default:
return null;
}
}
}
}