public static (bool success, string description) ImproveSkill(Hero hero, int amount, SkillsEnum skills, bool auto) { var skill = GetSkill(hero, skills, auto, so => BLTAdoptAHeroModule.CommonConfig.UseRawXP && hero.GetSkillValue(so) < BLTAdoptAHeroModule.CommonConfig.RawXPSkillCap || hero.HeroDeveloper.GetFocusFactor(so) > 0); if (skill == null) { return(false, $"Couldn't find a skill to improve"); } float prevSkill = hero.HeroDeveloper.GetPropertyValue(skill); int prevLevel = hero.GetSkillValue(skill); hero.HeroDeveloper.AddSkillXp(skill, amount, isAffectedByFocusFactor: !BLTAdoptAHeroModule.CommonConfig.UseRawXP); // Force this immediately instead of waiting for the daily campaign tick #if e159 || e1510 CharacterDevelopmentCampaignBehaivor.DevelopCharacterStats(hero); #else Campaign.Current?.GetCampaignBehavior <CharacterDevelopmentCampaignBehavior>()?.DevelopCharacterStats(hero); #endif float newXp = hero.HeroDeveloper.GetPropertyValue(skill); float realGainedXp = newXp - prevSkill; int newLevel = hero.GetSkillValue(skill); int gainedLevels = newLevel - prevLevel; return(realGainedXp < 1f ? (false, $"{skill.Name} capped, get more focus points") : gainedLevels > 0 ? (true, $"{Naming.Inc}{gainedLevels} lvl {GetShortSkillName(skill)}{Naming.To}{newLevel}") : (true, $"{Naming.Inc}{realGainedXp:0} xp {GetShortSkillName(skill)}{Naming.To}{newXp}")); }
static bool Prefix(Hero hero) { if ((hero.HeroDeveloper.UnspentFocusPoints > 0 && hero.HeroDeveloper.NumberOfOpenedPerks > 0 || hero.HeroDeveloper.UnspentAttributePoints > 0) && hero.Clan != Clan.PlayerClan && hero.IsNoble && !hero.IsChild) { CharacterDevelopmentCampaignBehaivor.DevelopCharacterStats(hero); } return(false); }