Exemple #1
0
    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);
    }