示例#1
0
  /**
   * Downgrades a skill owned by the player. The player must own the skill and it must not currently
   * be level 0 for the player to downgrade the skill. This will refund the skill point cost when
   * downgrading the skill.
   *
   * @param skill skill to downgrade
   * @return true if successfully downgraded, false otherwise
   */
  public boolean downgradeSkill(Skill skill) {
    // Cannot be null
    if (skill == null) {
      return false;
    }

    // Must be a valid available skill
    PlayerSkill data = skills.get(skill.getName().toLowerCase());
    if (data == null) {
      return false;
    }

    // Must not be a free skill
    if (data.getCost() == 0) {
      return false;
    }

    // Must not be required by another skill
    for (PlayerSkill s : skills.values()) {
      if (s.getData().getSkillReq() != null
          && s.getData().getSkillReq().equalsIgnoreCase(skill.getName())
          && data.getLevel() <= s.getData().getSkillReqLevel()) {
        return false;
      }
    }

    int cost = skill.getCost(data.getLevel() - 1);
    if (data.getLevel() > 0) {
      // Upgrade event
      PlayerSkillDowngradeEvent event = new PlayerSkillDowngradeEvent(this, data, cost);
      Bukkit.getPluginManager().callEvent(event);
      if (event.isCancelled()) {
        return false;
      }

      // Apply upgrade
      data.getPlayerClass().givePoints(cost, PointSource.REFUND);
      data.addLevels(-1);

      // Passive calls
      Player player = getPlayer();
      if (player != null && skill instanceof PassiveSkill) {
        if (data.getLevel() == 0) {
          ((PassiveSkill) skill).stopEffects(player, 1);
        } else {
          ((PassiveSkill) skill).update(player, data.getLevel() + 1, data.getLevel());
        }
      }

      // Clear bindings
      if (data.getLevel() == 0) {
        clearBinds(skill);
      }

      return true;
    } else {
      return false;
    }
  }