예제 #1
0
  /**
   * In this entity-damage-listener we will cancel fall damage and suffocation damage for vampires.
   * We will also modify the damage dealt.
   */
  @EventHandler(priority = EventPriority.HIGH)
  public void onEntityDamageHigh(EntityDamageEvent event) {
    if (event.isCancelled()) return;

    // Define local fields
    Entity damagee;
    Player pDamagee;
    VPlayer vpDamagee;

    EntityDamageByEntityEvent edbeEvent;

    Entity damager;
    Player pDamager;
    VPlayer vpDamager;

    damagee = event.getEntity();

    // If the damagee is a player
    if (damagee instanceof Player) {
      pDamagee = (Player) damagee;
      vpDamagee = VPlayers.i.get(pDamagee);

      // Vampires can not drown or take fall damage or starve
      if (vpDamagee.isVampire() && Conf.vampiresCantTakeDamageFrom.contains(event.getCause())) {
        event.setCancelled(true);
        return;
      }
    }

    // For further interest this must be a close combat attack by another entity
    if (event.getCause() != DamageCause.ENTITY_ATTACK) return;
    if (!(event instanceof EntityDamageByEntityEvent)) return;

    edbeEvent = (EntityDamageByEntityEvent) event;
    damager = edbeEvent.getDamager();

    // For further interest that attacker must be a player.
    if (!(damager instanceof Player)) return;
    pDamager = (Player) damager;
    vpDamager = VPlayers.i.get(pDamager);

    // The damage will be modified under certain circumstances.
    float damage = event.getDamage();

    // Modify damage if damager is a vampire
    if (vpDamager.isVampire()) {
      damage *= vpDamager.getDamageDealtFactor();
    }

    // Modify damage if damagee is a vampire
    if (damagee instanceof Player) {
      pDamagee = (Player) damagee;
      vpDamagee = VPlayers.i.get(pDamagee);
      if (vpDamagee.isVampire()) {
        Material itemMaterial = pDamager.getItemInHand().getType();
        if (Conf.woodMaterials.contains(itemMaterial)) {
          damage = Conf.damageReceivedWood; // Just as much as a diamond sword.
          vpDamagee.msg(Lang.messageWoodCombatWarning, Txt.getMaterialName(itemMaterial));
        } else {
          damage *= vpDamagee.getDamageReceivedFactor();
        }
      }
    }

    event.setDamage(Math.round(damage));
  }