// skillIds are reused across races and class, so we need a RaceGenderClass to disambiguate them public Skill Get(UserEntity user, EachSkillResultServerMessage message) { var skillId = message.SkillId; //check if we have an override first var overrideCollection = message.IsHeal ? _healSkillIdOverrides : _damageSkillIdOverrides; if (overrideCollection.ContainsKey(user.RaceGenderClass.Class)) { //check class specific overrides var skill = overrideCollection[user.RaceGenderClass.Class].FirstOrDefault(s => s.Id == skillId); //check common overrides if (skill == null && overrideCollection.ContainsKey(PlayerClass.Common)) { skill = overrideCollection[PlayerClass.Common].FirstOrDefault(s => s.Id == skillId); } if (skill != null) return skill; } var raceGenderClass = user.RaceGenderClass; var comparer = new Helpers.ProjectingEqualityComparer<Skill, int>(x => x.Id); foreach (var rgc2 in raceGenderClass.Fallbacks()) { if (!_userSkilldata.ContainsKey(rgc2)) continue; var searchSkill = new UserSkill(skillId, raceGenderClass, null); var index = _userSkilldata[rgc2].BinarySearch(searchSkill, comparer); if (index < 0) index = ~index - 1; if (index < 0) continue; var item = _userSkilldata[rgc2][index]; return item; } return null; }
// skillIds are reused across races and class, so we need a RaceGenderClass to disambiguate them public UserSkill Get(UserEntity user, int skillId) { var raceGenderClass = user.RaceGenderClass; var comparer = new Helpers.ProjectingEqualityComparer<Skill, int>(x => x.Id); foreach (var rgc2 in raceGenderClass.Fallbacks()) { if (!_userSkilldata.ContainsKey(rgc2)) continue; var searchSkill = new UserSkill(skillId, raceGenderClass, null); var index = _userSkilldata[rgc2].BinarySearch(searchSkill, comparer); if (index < 0) index = ~index - 1; if (index < 0) continue; var item = _userSkilldata[rgc2][index]; return item; } return null; }