/// <inheritdoc /> public void ChangeJob(IPlayerEntity player, DefineJob.Job newJob) { if (!_gameResources.Jobs.TryGetValue(newJob, out JobData jobData)) { throw new KeyNotFoundException($"Cannot find job '{newJob}'."); } IEnumerable <SkillInfo> jobSkills = _skillSystem.GetSkillsByJob(newJob); var skillTree = new List <SkillInfo>(); foreach (SkillInfo skill in jobSkills) { SkillInfo playerSkill = player.SkillTree.GetSkill(skill.SkillId); if (playerSkill != null) { skillTree.Add(playerSkill); } else { skillTree.Add(new SkillInfo(skill.SkillId, player.PlayerData.Id, skill.Data)); } } player.PlayerData.JobData = jobData; player.SkillTree.Skills = skillTree.ToList(); _playerPacketFactory.SendPlayerJobUpdate(player); _specialEffectPacketFactory.SendSpecialEffect(player, DefineSpecialEffects.XI_GEN_LEVEL_UP01, false); }
public IEnumerable <SkillInfo> GetSkillsByJob(DefineJob.Job job) { var skillsList = new List <SkillInfo>(); if (_gameResources.Jobs.TryGetValue(job, out JobData jobData) && jobData.Parent != null) { skillsList.AddRange(GetSkillsByJob(jobData.Parent.Id)); } IEnumerable <SkillInfo> jobSkills = from x in _gameResources.Skills.Values where x.Job == jobData.Id && x.JobType != DefineJob.JobType.JTYPE_COMMON && x.JobType != DefineJob.JobType.JTYPE_TROUPE select new SkillInfo(x.Id, -1, x); skillsList.AddRange(jobSkills); return(skillsList); }