/**
   * Creates a new mcMMO replacer. This also validates if all variables are available and can be
   * used in the runtime.
   */
  public McmmoVariables() {
    final ImmutableSet.Builder<String> builder = ImmutableSet.builder();
    // goes through all available skill types
    for (SkillType type : SkillType.values()) {
      final String skillName = type.name().toLowerCase(Locale.ENGLISH);
      builder.add('%' + skillName + '%');
    }

    skillTypes = builder.build();
  }
  public McMMOPlayer(Player player, PlayerProfile profile) {
    String playerName = player.getName();
    UUID uuid = player.getUniqueId();

    this.player = player;
    playerMetadata = new FixedMetadataValue(mcMMO.p, playerName);
    this.profile = profile;

    if (profile.getUniqueId() == null) {
      profile.setUniqueId(uuid);
    }

    /*
     * I'm using this method because it makes code shorter and safer (we don't have to add all SkillTypes manually),
     * but I actually have no idea about the performance impact, if there is any.
     * If in the future someone wants to remove this, don't forget to also remove what is in the SkillType enum. - bm01
     */
    try {
      for (SkillType skillType : SkillType.values()) {
        skillManagers.put(
            skillType,
            skillType.getManagerClass().getConstructor(McMMOPlayer.class).newInstance(this));
      }
    } catch (Exception e) {
      e.printStackTrace();
      mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p);
    }

    for (AbilityType abilityType : AbilityType.values()) {
      abilityMode.put(abilityType, false);
      abilityInformed.put(abilityType, true); // This is intended
    }

    for (ToolType toolType : ToolType.values()) {
      toolMode.put(toolType, false);
    }
  }