@Override
 public ConfigurationSection getDefaultConfig() {
   ConfigurationSection node = super.getDefaultConfig();
   node.set(SkillSetting.DAMAGE.node(), 30);
   node.set(SkillSetting.DAMAGE_INCREASE.node(), 0);
   node.set(SkillSetting.RADIUS.node(), 10);
   node.set(SkillSetting.RADIUS_INCREASE.node(), 0);
   return node;
 }
 @Override
 public ConfigurationSection getDefaultConfig() {
   ConfigurationSection localConfigurationSection = super.getDefaultConfig();
   localConfigurationSection.set("stun-duration", 5000);
   localConfigurationSection.set("slow-duration", 0);
   localConfigurationSection.set("root-duration", 0);
   localConfigurationSection.set("silence-duration", 0);
   localConfigurationSection.set("invuln-duration", 0);
   localConfigurationSection.set("duration-increase", 0);
   localConfigurationSection.set(SkillSetting.DAMAGE.node(), 0);
   localConfigurationSection.set("damage-increase", 0);
   localConfigurationSection.set(SkillSetting.RADIUS.node(), 2);
   localConfigurationSection.set(SkillSetting.RADIUS_INCREASE.node(), 0);
   localConfigurationSection.set(SkillSetting.MAX_DISTANCE.node(), 15);
   localConfigurationSection.set(SkillSetting.MAX_DISTANCE_INCREASE.node(), 0);
   localConfigurationSection.set(SkillSetting.USE_TEXT.node(), "%hero% used %skill%!");
   localConfigurationSection.set("damage-per-block-traveled", 0.1);
   localConfigurationSection.set("mana-per-block-traveled", 0.5);
   return localConfigurationSection;
 }
  @Override
  public String getDescription(Hero hero) {
    long stunDuration =
        (long) SkillConfigManager.getUseSetting(hero, this, "stun-duration", 10000, false);
    if (stunDuration > 0) {
      stunDuration =
          (long)
                  (stunDuration
                      + (SkillConfigManager.getUseSetting(
                              hero, this, "duration-increase", 0.0, false)
                          * hero.getSkillLevel(this)))
              / 1000;
      stunDuration = stunDuration > 0 ? stunDuration : 0;
    }
    long slowDuration =
        (long) SkillConfigManager.getUseSetting(hero, this, "slow-duration", 0, false);
    if (slowDuration > 0) {
      slowDuration =
          (long)
                  (slowDuration
                      + (SkillConfigManager.getUseSetting(
                              hero, this, "duration-increase", 0.0, false)
                          * hero.getSkillLevel(this)))
              / 1000;
      slowDuration = slowDuration > 0 ? slowDuration : 0;
    }
    long rootDuration =
        (long) SkillConfigManager.getUseSetting(hero, this, "root-duration", 0, false);
    if (rootDuration > 0) {
      rootDuration =
          (long)
                  (rootDuration
                      + (SkillConfigManager.getUseSetting(
                              hero, this, "duration-increase", 0.0, false)
                          * hero.getSkillLevel(this)))
              / 1000;
      rootDuration = rootDuration > 0 ? rootDuration : 0;
    }
    long silenceDuration =
        (long) SkillConfigManager.getUseSetting(hero, this, "silence-duration", 0, false);
    if (silenceDuration > 0) {
      silenceDuration =
          (long)
                  (silenceDuration
                      + (SkillConfigManager.getUseSetting(
                              hero, this, "duration-increase", 0.0, false)
                          * hero.getSkillLevel(this)))
              / 1000;
      silenceDuration = silenceDuration > 0 ? silenceDuration : 0;
    }
    long invulnDuration =
        (long) SkillConfigManager.getUseSetting(hero, this, "invuln-duration", 0, false);
    if (invulnDuration > 0) {
      invulnDuration =
          (long)
                  (invulnDuration
                      + (SkillConfigManager.getUseSetting(
                              hero, this, "duration-increase", 0.0, false)
                          * hero.getSkillLevel(this)))
              / 1000;
      invulnDuration = invulnDuration > 0 ? invulnDuration : 0;
    }
    int damage =
        (int)
            (SkillConfigManager.getUseSetting(hero, this, SkillSetting.DAMAGE.node(), 0, false)
                + (SkillConfigManager.getUseSetting(hero, this, "damage-increase", 0.0, false)
                    * hero.getSkillLevel(this)));
    damage = damage > 0 ? damage : 0;
    int radius =
        (int)
            (SkillConfigManager.getUseSetting(hero, this, SkillSetting.RADIUS.node(), 2, false)
                + (SkillConfigManager.getUseSetting(
                        hero, this, SkillSetting.RADIUS_INCREASE.node(), 0.0, false)
                    * hero.getSkillLevel(this)));
    radius = radius > 0 ? radius : 0;
    int distance =
        (int)
            (SkillConfigManager.getUseSetting(
                    hero, this, SkillSetting.MAX_DISTANCE.node(), 15, false)
                + (SkillConfigManager.getUseSetting(
                        hero, this, SkillSetting.MAX_DISTANCE_INCREASE.node(), 0.0, false)
                    * hero.getSkillLevel(this)));
    distance = distance > 0 ? distance : 0;
    String description =
        getDescription()
            .replace("$1", damage + "")
            .replace("$2", radius + "")
            .replace("$3", distance + "");
    if (stunDuration > 0) {
      description += " Stun:" + stunDuration + "s";
    }
    if (slowDuration > 0) {
      description += " Slow:" + slowDuration + "s";
    }
    if (rootDuration > 0) {
      description += " Root:" + rootDuration + "s";
    }
    if (silenceDuration > 0) {
      description += " Silence:" + silenceDuration + "s";
    }
    if (invulnDuration > 0) {
      description += " Invuln:" + invulnDuration + "s";
    }

    // COOLDOWN
    int cooldown =
        (SkillConfigManager.getUseSetting(hero, this, SkillSetting.COOLDOWN.node(), 0, false)
                - SkillConfigManager.getUseSetting(
                        hero, this, SkillSetting.COOLDOWN_REDUCE.node(), 0, false)
                    * hero.getSkillLevel(this))
            / 1000;
    if (cooldown > 0) {
      description += " CD:" + cooldown + "s";
    }

    // MANA
    int mana =
        SkillConfigManager.getUseSetting(hero, this, SkillSetting.MANA.node(), 10, false)
            - (SkillConfigManager.getUseSetting(
                    hero, this, SkillSetting.MANA_REDUCE.node(), 0, false)
                * hero.getSkillLevel(this));
    if (mana > 0) {
      description += " M:" + mana;
    }

    // HEALTH_COST
    int healthCost =
        SkillConfigManager.getUseSetting(hero, this, SkillSetting.HEALTH_COST, 0, false)
            - (SkillConfigManager.getUseSetting(
                    hero, this, SkillSetting.HEALTH_COST_REDUCE, mana, true)
                * hero.getSkillLevel(this));
    if (healthCost > 0) {
      description += " HP:" + healthCost;
    }

    // STAMINA
    int staminaCost =
        SkillConfigManager.getUseSetting(hero, this, SkillSetting.STAMINA.node(), 0, false)
            - (SkillConfigManager.getUseSetting(
                    hero, this, SkillSetting.STAMINA_REDUCE.node(), 0, false)
                * hero.getSkillLevel(this));
    if (staminaCost > 0) {
      description += " FP:" + staminaCost;
    }

    // DELAY
    int delay =
        SkillConfigManager.getUseSetting(hero, this, SkillSetting.DELAY.node(), 0, false) / 1000;
    if (delay > 0) {
      description += " W:" + delay + "s";
    }

    // EXP
    int exp = SkillConfigManager.getUseSetting(hero, this, SkillSetting.EXP.node(), 0, false);
    if (exp > 0) {
      description += " XP:" + exp;
    }
    return description;
  }
 @EventHandler
 public void onEntityDamage(EntityDamageEvent paramEntityDamageEvent) {
   Heroes.debug.startTask("HeroesSkillListener");
   if ((!paramEntityDamageEvent.getCause().equals(EntityDamageEvent.DamageCause.FALL))
       || (!(paramEntityDamageEvent.getEntity() instanceof Player))
       || (!chargingPlayers.containsKey((Player) paramEntityDamageEvent.getEntity()))) {
     Heroes.debug.stopTask("HeroesSkillListener");
     return;
   }
   Player localPlayer1 = (Player) paramEntityDamageEvent.getEntity();
   Hero localHero1 = plugin.getCharacterManager().getHero(localPlayer1);
   double distance = localPlayer1.getLocation().distance(chargingPlayers.get(localPlayer1));
   double damageMod =
       SkillConfigManager.getUseSetting(
           localHero1, skill, "damage-per-block-traveled", 0.1, false);
   double manaMod =
       SkillConfigManager.getUseSetting(
           localHero1, skill, "mana-per-block-traveled", 0.5, false);
   int currentMana = localHero1.getMana();
   if (currentMana < distance * manaMod) {
     localHero1.setMana(0);
   } else {
     localHero1.setMana(currentMana - (int) (distance * manaMod));
   }
   chargingPlayers.remove(localPlayer1);
   paramEntityDamageEvent.setDamage(0);
   paramEntityDamageEvent.setCancelled(true);
   int i =
       (int)
           (SkillConfigManager.getUseSetting(
                   localHero1, this.skill, SkillSetting.RADIUS.node(), 2, false)
               + (SkillConfigManager.getUseSetting(
                       localHero1, this.skill, SkillSetting.RADIUS_INCREASE.node(), 0.0, false)
                   * localHero1.getSkillLevel(skill)));
   i = i > 0 ? i : 0;
   long l1 =
       (long)
           SkillConfigManager.getUseSetting(
               localHero1, this.skill, "stun-duration", 10000, false);
   if (l1 > 0) {
     l1 =
         (long)
             (l1
                 + (SkillConfigManager.getUseSetting(
                         localHero1, this.skill, "duration-increase", 0.0, false)
                     * localHero1.getSkillLevel(skill)));
     l1 = l1 > 0 ? l1 : 0;
   }
   long l2 =
       (long)
           SkillConfigManager.getUseSetting(localHero1, this.skill, "slow-duration", 0, false);
   if (l2 > 0) {
     l2 =
         (long)
             (l2
                 + (SkillConfigManager.getUseSetting(
                         localHero1, this.skill, "duration-increase", 0.0, false)
                     * localHero1.getSkillLevel(skill)));
     l2 = l2 > 0 ? l2 : 0;
   }
   long l3 =
       (long)
           SkillConfigManager.getUseSetting(localHero1, this.skill, "root-duration", 0, false);
   if (l3 > 0) {
     l3 =
         (long)
             (l3
                 + (SkillConfigManager.getUseSetting(
                         localHero1, this.skill, "duration-increase", 0.0, false)
                     * localHero1.getSkillLevel(skill)));
     l3 = l3 > 0 ? l3 : 0;
   }
   long l4 =
       (long)
           SkillConfigManager.getUseSetting(
               localHero1, this.skill, "silence-duration", 0, false);
   if (l4 > 0) {
     l4 =
         (long)
             (l4
                 + (SkillConfigManager.getUseSetting(
                         localHero1, this.skill, "duration-increase", 0.0, false)
                     * localHero1.getSkillLevel(skill)));
     l4 = l4 > 0 ? l4 : 0;
   }
   int j =
       (int)
           (SkillConfigManager.getUseSetting(
                   localHero1, this.skill, SkillSetting.DAMAGE.node(), 0, false)
               + (SkillConfigManager.getUseSetting(
                       localHero1, this.skill, "damage-increase", 0.0, false)
                   * localHero1.getSkillLevel(skill)));
   j += damageMod * distance;
   j = j > 0 ? j : 0;
   long l5 =
       (long)
           SkillConfigManager.getUseSetting(localHero1, this.skill, "invuln-duration", 0, false);
   if (l5 > 0) {
     l5 =
         (long)
             (l5
                 + (SkillConfigManager.getUseSetting(
                         localHero1, this.skill, "duration-increase", 0.0, false)
                     * localHero1.getSkillLevel(skill)));
     l5 = l5 > 0 ? l5 : 0;
     if (l5 > 0) {
       localHero1.addEffect(new InvulnerabilityEffect(this.skill, l5));
     }
   }
   Iterator localIterator = localPlayer1.getNearbyEntities(i, i, i).iterator();
   while (localIterator.hasNext()) {
     Entity localEntity = (Entity) localIterator.next();
     if (!(localEntity instanceof LivingEntity)) continue;
     LivingEntity localLivingEntity = (LivingEntity) localEntity;
     if (!damageCheck(localPlayer1, localLivingEntity)) continue;
     if ((localEntity instanceof Player)) {
       Player localPlayer2 = (Player) localEntity;
       Hero localHero2 = plugin.getCharacterManager().getHero(localPlayer2);
       if (l1 > 0L) localHero2.addEffect(new StunEffect(this.skill, l1));
       if (l2 > 0L)
         localHero2.addEffect(
             new SlowEffect(
                 this.skill,
                 l2,
                 2,
                 true,
                 localPlayer2.getDisplayName()
                     + " has been slowed by "
                     + localPlayer1.getDisplayName(),
                 localPlayer2.getDisplayName()
                     + " is no longer slowed by "
                     + localPlayer1.getDisplayName(),
                 localHero1));
       if (l3 > 0L) localHero2.addEffect(new RootEffect(this.skill, l3));
       if (l4 > 0L) localHero2.addEffect(new SilenceEffect(this.skill, l4));
       if (j > 0)
         this.skill.damageEntity(
             localLivingEntity, localPlayer1, j, EntityDamageEvent.DamageCause.MAGIC);
     }
     if (j > 0)
       this.skill.damageEntity(
           localLivingEntity, localPlayer1, j, EntityDamageEvent.DamageCause.MAGIC);
   }
   Heroes.debug.stopTask("HeroesSkillListener");
 }