Server.Mobiles.BaseCreature.CheckTeachSkills C# (CSharp) Méthode

CheckTeachSkills() public méthode

public CheckTeachSkills ( SkillName skill, Server.Mobile m, int maxPointsToLearn, int &pointsToLearn, bool doTeach ) : TeachResult
skill SkillName
m Server.Mobile
maxPointsToLearn int
pointsToLearn int
doTeach bool
Résultat TeachResult
        public virtual TeachResult CheckTeachSkills( SkillName skill, Mobile m, int maxPointsToLearn, ref int pointsToLearn, bool doTeach )
        {
            if ( !CheckTeach( skill, m ) || !m.CheckAlive() )
                return TeachResult.Failure;

            Skill ourSkill = Skills[skill];
            Skill theirSkill = m.Skills[skill];

            if ( ourSkill == null || theirSkill == null )
                return TeachResult.Failure;

            int baseToSet = ourSkill.BaseFixedPoint / 3;

            if ( baseToSet > 420 )
                baseToSet = 420;
            else if ( baseToSet < 200 )
                return TeachResult.Failure;

            if ( baseToSet > theirSkill.CapFixedPoint )
                baseToSet = theirSkill.CapFixedPoint;

            pointsToLearn = baseToSet - theirSkill.BaseFixedPoint;

            if ( maxPointsToLearn > 0 && pointsToLearn > maxPointsToLearn )
            {
                pointsToLearn = maxPointsToLearn;
                baseToSet = theirSkill.BaseFixedPoint + pointsToLearn;
            }

            if ( pointsToLearn < 0 )
                return TeachResult.KnowsMoreThanMe;

            if ( pointsToLearn == 0 )
                return TeachResult.KnowsWhatIKnow;

            if ( theirSkill.Lock != SkillLock.Up )
                return TeachResult.SkillNotRaisable;

            int freePoints = m.Skills.Cap - m.Skills.Total;
            int freeablePoints = 0;

            if ( freePoints < 0 )
                freePoints = 0;

            for ( int i = 0; (freePoints + freeablePoints) < pointsToLearn && i < m.Skills.Length; ++i )
            {
                Skill sk = m.Skills[i];

                if ( sk == theirSkill || sk.Lock != SkillLock.Down )
                    continue;

                freeablePoints += sk.BaseFixedPoint;
            }

            if ( (freePoints + freeablePoints) == 0 )
                return TeachResult.NotEnoughFreePoints;

            if ( (freePoints + freeablePoints) < pointsToLearn )
            {
                pointsToLearn = freePoints + freeablePoints;
                baseToSet = theirSkill.BaseFixedPoint + pointsToLearn;
            }

            if ( doTeach )
            {
                int need = pointsToLearn - freePoints;

                for ( int i = 0; need > 0 && i < m.Skills.Length; ++i )
                {
                    Skill sk = m.Skills[i];

                    if ( sk == theirSkill || sk.Lock != SkillLock.Down )
                        continue;

                    if ( sk.BaseFixedPoint < need )
                    {
                        need -= sk.BaseFixedPoint;
                        sk.BaseFixedPoint = 0;
                    }
                    else
                    {
                        sk.BaseFixedPoint -= need;
                        need = 0;
                    }
                }

                /* Sanity check */
                if ( baseToSet > theirSkill.CapFixedPoint || (m.Skills.Total - theirSkill.BaseFixedPoint + baseToSet) > m.Skills.Cap )
                    return TeachResult.NotEnoughFreePoints;

                theirSkill.BaseFixedPoint = baseToSet;
            }

            return TeachResult.Success;
        }
BaseCreature