@ArenaEventHandler(suppressCastWarnings = true, priority = EventPriority.LOW)
  public void onEntityDamageEvent(EntityDamageEvent event) {
    if (!(event.getEntity() instanceof Player)) return;
    final TransitionOptions to = transitionOptions.getOptions(match.getMatchState());
    if (to == null) return;
    final PVPState pvp = to.getPVP();
    if (pvp == null) return;
    final ArenaPlayer target = BattleArena.toArenaPlayer((Player) event.getEntity());
    if (pvp == PVPState.INVINCIBLE) {
      /// all damage is cancelled
      target.setFireTicks(0);
      handler.setDamage(event, 0);
      event.setCancelled(true);
      return;
    }
    if (!(event instanceof EntityDamageByEntityEvent)) {
      return;
    }

    final Entity damagerEntity = ((EntityDamageByEntityEvent) event).getDamager();
    ArenaPlayer damager;
    switch (pvp) {
      case ON:
        ArenaTeam targetTeam = match.getTeam(target);
        if (targetTeam == null
            || !targetTeam.hasAliveMember(target)) // / We dont care about dead players
        return;
        damager = DmgDeathUtil.getPlayerCause(damagerEntity);
        if (damager == null) { // / damage from some source, its not pvp though. so we dont care
          return;
        }
        ArenaTeam t = match.getTeam(damager);
        if (t != null && t.hasMember(target)) { // / attacker is on the same team
          event.setCancelled(true);
        } else { /// different teams... lets make sure they can actually hit
          event.setCancelled(false);
        }
        break;
      case OFF:
        damager = DmgDeathUtil.getPlayerCause(damagerEntity);
        if (damager != null) { // / damage done from a player
          handler.setDamage(event, 0);
          event.setCancelled(true);
        }
        break;
      default:
        break;
    }
  }
  @ArenaEventHandler(
      suppressCastWarnings = true,
      bukkitPriority = org.bukkit.event.EventPriority.MONITOR)
  public void onPlayerDeath(PlayerDeathEvent event, final ArenaPlayer target) {
    if (Defaults.DEBUG_TRACE)
      MessageUtil.sendMessage(target, " -onPlayerDeath  t=" + target.getTeam());
    if (state == MatchState.ONCANCEL || state == MatchState.ONCOMPLETE) {
      return;
    }
    final ArenaTeam t = getTeam(target);
    if (t == null) return;

    ArenaPlayerDeathEvent apde = new ArenaPlayerDeathEvent(target, t);
    apde.setPlayerDeathEvent(event);
    callEvent(apde);
    ArenaPlayer killer = DmgDeathUtil.getPlayerCause(event);
    if (killer != null) {
      ArenaTeam killT = getTeam(killer);
      if (killT != null) { // / they must be in the same match for this to count
        killT.addKill(killer);
        callEvent(new ArenaPlayerKillEvent(killer, killT, target));
      }
    }
  }