Exemple #1
0
        public static void Recalculate(YiObj entity)
        {
            if (entity == null || entity.UniqueId == 0)
            {
                return;
            }
            var defense      = 0;
            var dodge        = 0;
            var magicDefense = 0;
            var magicAttack  = 0;
            var maximumHp    = 0;
            var maximumMp    = 0;
            var job          = entity.Class;

            if (job == 100)
            {
                job += 20;
            }

            if (Collections.Statpoints.ContainsKey(job / 10 * 100 + entity.Level) && !entity.Reborn)
            {
                var agility  = (ushort)Collections.Statpoints[job / 10 * 100 + entity.Level].Agility;
                var spirit   = (ushort)Collections.Statpoints[job / 10 * 100 + entity.Level].Spirit;
                var strength = (ushort)Collections.Statpoints[job / 10 * 100 + entity.Level].Strength;
                var vitality = (ushort)Collections.Statpoints[job / 10 * 100 + entity.Level].Vitality;
                entity.Agility  = agility;
                entity.Spirit   = spirit;
                entity.Vitality = vitality;
                entity.Strength = strength;
            }

            int minimumPhsyicalAttack = entity.Strength;
            int maximumPhsyicalAttack = entity.Strength;

            maximumHp += entity.Strength * 3;
            maximumHp += entity.Agility * 3;
            maximumHp += entity.Vitality * 24;
            maximumHp += entity.Spirit * 3;

            maximumMp += (ushort)(entity.Spirit * 5);
            if (entity.Class > 100 && entity.Class < 200)
            {
                maximumMp += (ushort)(maximumMp * (entity.Class % 10));
            }

            switch (entity.Class)
            {
            case 11:
                maximumHp = (int)(maximumHp * 1.05);
                break;

            case 12:
                maximumHp = (int)(maximumHp * 1.08);
                break;

            case 13:
                maximumHp = (int)(maximumHp * 1.10);
                break;

            case 14:
                maximumHp = (int)(maximumHp * 1.12);
                break;

            case 15:
                maximumHp = (int)(maximumHp * 1.15);
                break;

            case 41:
                entity.AttackSpeed = (int)(entity.AttackSpeed * 0.85);
                break;

            case 42:
                entity.AttackSpeed = (int)(entity.AttackSpeed * 0.75);
                break;

            case 43:
                entity.AttackSpeed = (int)(entity.AttackSpeed * 0.65);
                break;

            case 44:
                entity.AttackSpeed = (int)(entity.AttackSpeed * 0.55);
                break;

            case 45:
                entity.AttackSpeed = (int)(entity.AttackSpeed * 0.45);
                break;
            }

            foreach (var item in entity.Equipment)
            {
                minimumPhsyicalAttack += item.Value.MinimumPhsyicalAttack;
                maximumPhsyicalAttack += item.Value.MaximumPhsyicalAttack;
                defense            += item.Value.Defense;
                magicDefense       += item.Value.MagicDefense;
                magicAttack        += item.Value.MagicAttack;
                maximumHp          += item.Value.Enchant;
                maximumHp          += item.Value.PotAddHp;
                maximumMp          += item.Value.PotAddMp;
                entity.Bless       -= item.Value.Bless; //TODO Doublecheck. Tq is weird.
                dodge              += item.Value.Dodge;
                entity.AttackRange += item.Value.Range;
                if (item.Value.Frequency > 0)
                {
                    entity.AttackSpeed += 1000 - item.Value.Frequency;
                }
                if (item.Key == MsgItemPosition.RightWeapon || item.Key == MsgItemPosition.LeftWeapon)
                {
                    var subType = item.Value.ItemId / 1000;
                    var sum     = (from skill in entity.Skills where skill.Value.Info.WeaponSubType == subType where skill.Value.Level > 12 && skill.Value.Level <= 20 select(20.00f - skill.Value.Level) / 100).Sum();
                    minimumPhsyicalAttack += (int)sum;
                    maximumPhsyicalAttack += (int)sum;
                }
                switch ((ItemNames)item.Value.Gem1)
                {
                case ItemNames.ShortNormalPhoenixGem:
                    magicAttack = (int)(magicAttack * 0.05f);
                    break;

                case ItemNames.ShortRefPhoenixGem:
                    magicAttack = (int)(magicAttack * 0.1f);
                    break;

                case ItemNames.ShortSuperPhoenixGem:
                    magicAttack = (int)(magicAttack * 0.15f);
                    break;

                case ItemNames.ShortNormalDragonGem:
                    minimumPhsyicalAttack += (int)(minimumPhsyicalAttack * 0.05f);
                    break;

                case ItemNames.ShortRefDragonGem:
                    minimumPhsyicalAttack += (int)(minimumPhsyicalAttack * 0.1f);
                    break;

                case ItemNames.ShortSuperDragonGem:
                    minimumPhsyicalAttack += (int)(minimumPhsyicalAttack * 0.15f);
                    break;

                case ItemNames.ShortNormalFuryGem:
                    dodge += (int)(dodge * 0.05f);
                    break;

                case ItemNames.ShortRefFuryGem:
                    dodge += (int)(dodge * 0.1f);
                    break;

                case ItemNames.ShortSuperFuryGem:
                    dodge += (int)(dodge * 0.15f);
                    break;

                case ItemNames.ShortNormalRainbowGem:
                    entity.ExpBonus += 0.10f;
                    break;

                case ItemNames.ShortRefRainbowGem:
                    entity.ExpBonus += 0.15f;
                    break;

                case ItemNames.ShortSuperRainbowGem:
                    entity.ExpBonus += 0.25f;
                    break;

                case ItemNames.ShortNormalVioletGem:
                    entity.WeaponExpBonus += 0.30f;
                    break;

                case ItemNames.ShortRefVioletGem:
                    entity.WeaponExpBonus += 0.50f;
                    break;

                case ItemNames.ShortSuperVioletGem:
                    entity.WeaponExpBonus += 1.00f;
                    break;

                case ItemNames.ShortNormalMoonGem:
                    entity.MagicExpBonus += 0.30f;
                    break;

                case ItemNames.ShortRefMoonGem:
                    entity.MagicExpBonus += 0.50f;
                    break;

                case ItemNames.ShortSuperMoonGem:
                    entity.MagicExpBonus += 1.00f;
                    break;

                case ItemNames.ShortNormalTortoiseGem:
                    defense -= (int)(defense * 0.02f);
                    break;

                case ItemNames.ShortRefTortoiseGem:
                    defense -= (int)(defense * 0.04f);
                    break;

                case ItemNames.ShortSuperTortoiseGem:
                    defense -= (int)(defense * 0.06f);
                    break;
                }
                switch ((ItemNames)item.Value.Gem2)
                {
                case ItemNames.ShortNormalPhoenixGem:
                    magicAttack = (int)(magicAttack * 0.05f);
                    break;

                case ItemNames.ShortRefPhoenixGem:
                    magicAttack = (int)(magicAttack * 0.1f);
                    break;

                case ItemNames.ShortSuperPhoenixGem:
                    magicAttack = (int)(magicAttack * 0.15f);
                    break;

                case ItemNames.ShortNormalDragonGem:
                    minimumPhsyicalAttack += (int)(minimumPhsyicalAttack * 0.05f);
                    break;

                case ItemNames.ShortRefDragonGem:
                    minimumPhsyicalAttack += (int)(minimumPhsyicalAttack * 0.1f);
                    break;

                case ItemNames.ShortSuperDragonGem:
                    minimumPhsyicalAttack += (int)(minimumPhsyicalAttack * 0.15f);
                    break;

                case ItemNames.ShortNormalFuryGem:
                    dodge += (int)(dodge * 0.05f);
                    break;

                case ItemNames.ShortRefFuryGem:
                    dodge += (int)(dodge * 0.1f);
                    break;

                case ItemNames.ShortSuperFuryGem:
                    dodge += (int)(dodge * 0.15f);
                    break;

                case ItemNames.ShortNormalRainbowGem:
                    entity.ExpBonus += 0.10f;
                    break;

                case ItemNames.ShortRefRainbowGem:
                    entity.ExpBonus += 0.15f;
                    break;

                case ItemNames.ShortSuperRainbowGem:
                    entity.ExpBonus += 0.25f;
                    break;

                case ItemNames.ShortNormalVioletGem:
                    entity.WeaponExpBonus += 0.30f;
                    break;

                case ItemNames.ShortRefVioletGem:
                    entity.WeaponExpBonus += 0.50f;
                    break;

                case ItemNames.ShortSuperVioletGem:
                    entity.WeaponExpBonus += 1.00f;
                    break;

                case ItemNames.ShortNormalMoonGem:
                    entity.MagicExpBonus += 0.30f;
                    break;

                case ItemNames.ShortRefMoonGem:
                    entity.MagicExpBonus += 0.50f;
                    break;

                case ItemNames.ShortSuperMoonGem:
                    entity.MagicExpBonus += 1.00f;
                    break;

                case ItemNames.ShortNormalTortoiseGem:
                    defense -= (int)(defense * 0.02f);
                    break;

                case ItemNames.ShortRefTortoiseGem:
                    defense -= (int)(defense * 0.04f);
                    break;

                case ItemNames.ShortSuperTortoiseGem:
                    defense -= (int)(defense * 0.06f);
                    break;
                }
                if (!Collections.ItemBonus.ContainsKey(item.Value.BonusId))
                {
                    continue;
                }
                maximumHp             += Collections.ItemBonus[item.Value.BonusId].Life;
                defense               += Collections.ItemBonus[item.Value.BonusId].Defence;
                dodge                 += (ushort)Collections.ItemBonus[item.Value.BonusId].Dexterity;
                dodge                 += (ushort)Collections.ItemBonus[item.Value.BonusId].Dodge;
                magicAttack           += Collections.ItemBonus[item.Value.BonusId].MAtk;
                magicDefense          += Collections.ItemBonus[item.Value.BonusId].MDef;
                maximumPhsyicalAttack += Collections.ItemBonus[item.Value.BonusId].MaxAtk;
                minimumPhsyicalAttack += Collections.ItemBonus[item.Value.BonusId].MinAtk;
            }

            entity.MinimumPhsyicalAttack = minimumPhsyicalAttack;
            entity.MaximumPhsyicalAttack = maximumPhsyicalAttack;
            entity.Defense      = defense;
            entity.Dexterity    = entity.Dexterity;
            entity.MagicDefense = magicDefense;
            entity.MagicAttack  = magicAttack;
            entity.MaximumHp    = (ushort)maximumHp;
            entity.MaximumMp    = (ushort)maximumMp;

            var arrows = entity.GetEquip(MsgItemPosition.LeftWeapon);

            if (arrows != null)
            {
                if (arrows.ItemId / 10 == 105010)
                {
                    entity.MinimumPhsyicalAttack = (int)(entity.MinimumPhsyicalAttack * 0.85);
                    entity.MaximumPhsyicalAttack = (int)(entity.MaximumPhsyicalAttack * 0.85);
                }

                if (arrows.ItemId / 10 == 105020)
                {
                    entity.AttackSpeed           = 500;
                    entity.MinimumPhsyicalAttack = 0;
                    entity.MaximumPhsyicalAttack = 0;
                }

                if (arrows.ItemId / 10 == 105040)
                {
                    entity.MinimumPhsyicalAttack = (int)(entity.MinimumPhsyicalAttack * 1.15);
                    entity.MaximumPhsyicalAttack = (int)(entity.MaximumPhsyicalAttack * 1.15);
                }
            }

            if (entity.HasFlag(StatusEffect.MagicShield) || entity.HasFlag(StatusEffect.XpShield))
            {
                entity.Defense = entity.Defense;
            }
            if (entity.HasFlag(StatusEffect.StarOfAccuracy) || entity.HasFlag(StatusEffect.XpAccuracy))
            {
                entity.AttackSpeed = (int)(entity.AttackSpeed * Math.Max(1, entity.AttackSpeedBonus));
            }

            entity.AttackSpeed -= 250;
            if (entity.AttackSpeed < 500)
            {
                entity.AttackSpeed = 500;
            }

            if (entity.HasFlag(StatusEffect.Cyclone))
            {
                entity.AttackSpeed /= 2;
            }
            dodge            += entity.Agility + 25;
            entity.Dexterity += (ushort)dodge;
        }