/**
* @param EntityDamageEvent $event
* @priority HIGH
* @ignoreCancelled true
*/
public function onDamage(EntityDamageEvent $event)
{
$damaged = $event->getEntity();
if ($damaged instanceof Player) {
$area = $this->main->getDatabase()->searchAreaByPosition($damaged);
if ($area instanceof Area) {
$cause = $event->getCause();
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED, false, false)) {
$event->setCancelled();
} elseif ($cause === EntityDamageEvent::CAUSE_BLOCK_EXPLOSION) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_EXPLOSION, false)) {
$event->setCancelled();
}
} elseif ($cause === EntityDamageEvent::CAUSE_VOID) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_VOID, false)) {
$event->setCancelled();
}
} elseif ($cause === EntityDamageEvent::CAUSE_SUFFOCATION) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_SUFFOCATE, false)) {
$event->setCancelled();
}
} elseif ($cause === EntityDamageEvent::CAUSE_DROWNING) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_DROWN, false)) {
$event->setCancelled();
}
} elseif ($cause === EntityDamageEvent::CAUSE_FALL) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_FALL, false)) {
$event->setCancelled();
}
} elseif ($cause === EntityDamageEvent::CAUSE_FIRE or $cause === EntityDamageEvent::CAUSE_FIRE_TICK or $cause === EntityDamageEvent::CAUSE_LAVA) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_FIRE, false)) {
$event->setCancelled();
}
} elseif ($event instanceof EntityDamageByEntityEvent) {
$damager = $event->getDamager();
if ($damager instanceof Player) {
if ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_PLAYER, false)) {
$event->setCancelled();
}
} elseif ($this->areaHasFlag($damaged, Area::FLAG_DAMAGED_BY_ENTITY, false)) {
$event->setCancelled();
}
}
}
}
if (!$event->setCancelled() and $event instanceof EntityDamageByEntityEvent) {
$damager = $event->getDamager();
if ($damager instanceof Player) {
if ($damaged instanceof Player) {
if (!$this->areaHasFlag($damager, Area::FLAG_DAMAGE_PLAYER, true)) {
$event->setCancelled();
}
} elseif (!$this->areaHasFlag($damager, Area::FLAG_DAMAGE_MOB, true)) {
$event->setCancelled();
}
}
}
}