/**
   * Applies an experience gain
   *
   * @param skillType Skill being used
   * @param xp Experience amount to add
   */
  public void applyXpGain(SkillType skillType, float xp, XPGainReason xpGainReason) {
    if (!skillType.getPermissions(player)) {
      return;
    }

    if (skillType.isChildSkill()) {
      Set<SkillType> parentSkills = FamilyTree.getParents(skillType);

      for (SkillType parentSkill : parentSkills) {
        applyXpGain(parentSkill, xp / parentSkills.size(), xpGainReason);
      }

      return;
    }

    if (!EventUtils.handleXpGainEvent(player, skillType, xp, xpGainReason)) {
      return;
    }

    isUsingUnarmed = (skillType == SkillType.UNARMED);
    checkXp(skillType, xpGainReason);
  }