public static T ValidateCharacterData <T>(this T character) where T : IPlayerCharacterData { GameInstance gameInstance = GameInstance.Singleton; PlayerCharacter database; if (!GameInstance.PlayerCharacters.TryGetValue(character.DataId, out database)) { return(character); } // Validating character attributes short returningStatPoint = 0; HashSet <int> validAttributeIds = new HashSet <int>(); IList <CharacterAttribute> characterAttributes = character.Attributes; for (int i = characterAttributes.Count - 1; i >= 0; --i) { CharacterAttribute characterAttribute = characterAttributes[i]; int attributeDataId = characterAttribute.dataId; // If attribute is invalid if (characterAttribute.GetAttribute() == null || validAttributeIds.Contains(attributeDataId)) { returningStatPoint += characterAttribute.amount; character.Attributes.RemoveAt(i); } else { validAttributeIds.Add(attributeDataId); } } character.StatPoint += returningStatPoint; // Add character's attributes foreach (Attribute attribute in GameInstance.Attributes.Values) { // This attribute is valid, so not have to add it if (validAttributeIds.Contains(attribute.DataId)) { continue; } CharacterAttribute characterAttribute = new CharacterAttribute(); characterAttribute.dataId = attribute.DataId; characterAttribute.amount = 0; character.Attributes.Add(characterAttribute); } // Validating character skills short returningSkillPoint = 0; HashSet <int> validSkillIds = new HashSet <int>(); IList <CharacterSkill> characterSkills = character.Skills; for (int i = characterSkills.Count - 1; i >= 0; --i) { CharacterSkill characterSkill = characterSkills[i]; Skill skill = characterSkill.GetSkill(); // If skill is invalid or this character database does not have skill if (characterSkill.GetSkill() == null || !database.CacheSkillLevels.ContainsKey(skill) || validSkillIds.Contains(skill.DataId)) { returningSkillPoint += characterSkill.level; character.Skills.RemoveAt(i); } else { validSkillIds.Add(skill.DataId); } } character.SkillPoint += returningSkillPoint; // Add character's skills Dictionary <Skill, short> skillLevels = database.CacheSkillLevels; foreach (KeyValuePair <Skill, short> skillLevel in skillLevels) { Skill skill = skillLevel.Key; // This skill is valid, so not have to add it if (validSkillIds.Contains(skill.DataId)) { continue; } CharacterSkill characterSkill = new CharacterSkill(); characterSkill.dataId = skill.DataId; characterSkill.level = skillLevel.Value; character.Skills.Add(characterSkill); } // Validating character equip weapons List <CharacterItem> returningItems = new List <CharacterItem>(); EquipWeapons equipWeapons = character.EquipWeapons; CharacterItem rightHand = equipWeapons.rightHand; CharacterItem leftHand = equipWeapons.leftHand; if (rightHand.GetEquipmentItem() == null) { if (rightHand.NotEmptySlot()) { returningItems.Add(rightHand); } equipWeapons.rightHand = CharacterItem.Empty; } if (leftHand.GetEquipmentItem() == null) { if (leftHand.NotEmptySlot()) { returningItems.Add(leftHand); } equipWeapons.leftHand = CharacterItem.Empty; } // Validating character equip items IList <CharacterItem> equipItems = character.EquipItems; for (int i = equipItems.Count - 1; i >= 0; --i) { CharacterItem equipItem = equipItems[i]; // If equipment is invalid if (equipItem.GetEquipmentItem() == null) { if (equipItem.NotEmptySlot()) { returningItems.Add(equipItem); } character.EquipItems.RemoveAt(i); } } // Return items to non equip items foreach (CharacterItem returningItem in returningItems) { character.NonEquipItems.Add(returningItem); } character.FillEmptySlots(); DevExtUtils.InvokeStaticDevExtMethods(ClassType, "ValidateCharacterData", character); return(character); }