Exemplo n.º 1
0
        public static void Damage(Spell spell, Mobile target, double damage, int phys, int fire, int cold, int pois, int nrgy)
        {
            //Most (All) Damage spells start here
            if (spell.CheckResisted(target))
            {
                damage *= 0.75;

                target.SendLocalizedMessage(501783); // You feel yourself resisting magical energy.
            }


            //KENSAI AVOIDANCE
            bool KensaiAvoided   = false;
            bool KensaiAvoidable = true;

            Type[] m_NotAvoidable = new Type[]
            {
                //typeof( Fifth.MindBlastSpell ),
                typeof(Seventh.MeteorSwarmSpell),
                typeof(Eighth.EarthquakeSpell),
                typeof(Seventh.ChainLightningSpell),
                typeof(Fourth.FireFieldSpell)
            };

            for (int i = 0; i < m_NotAvoidable.Length; i++)
            {
                if (m_NotAvoidable[i] == spell.GetType())
                {
                    KensaiAvoidable = false;
                    break;
                }
            }

            if (target is TeiravonMobile)
            {
                TeiravonMobile m_Player = (TeiravonMobile)target;


                if (Spells.Third.BlessSpell.gruumsh.Contains(m_Player) || Spells.Third.BlessSpell.gruumsh.Contains(target))
                {
                    damage *= 1.30;
                }

                if (m_Player.GetActiveFeats(TeiravonMobile.Feats.DisruptingPresence) && m_Player.HasFeat(TeiravonMobile.Feats.DisruptingPresence))
                {
                    damage *= 0.75;
                    m_Player.SendMessage("Your disrupting presense dulls the potency of the spell");
                }

                if (m_Player.HasFeat(TeiravonMobile.Feats.MagicResistance))
                {
                    damage *= 0.75;
                    target.SendLocalizedMessage(501783);
                }

                int       cntmith   = 0;
                ArrayList mithitems = new ArrayList();
                BaseArmor tmpitem;

                tmpitem = m_Player.FindItemOnLayer(Layer.InnerTorso) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }
                tmpitem = m_Player.FindItemOnLayer(Layer.Pants) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }
                tmpitem = m_Player.FindItemOnLayer(Layer.Arms) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }
                tmpitem = m_Player.FindItemOnLayer(Layer.Gloves) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }
                tmpitem = m_Player.FindItemOnLayer(Layer.Helm) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }
                tmpitem = m_Player.FindItemOnLayer(Layer.Neck) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }
                tmpitem = m_Player.FindItemOnLayer(Layer.TwoHanded) as BaseArmor;
                if (tmpitem != null)
                {
                    if (tmpitem.Resource == CraftResource.Mithril)
                    {
                        mithitems.Add(tmpitem);
                        cntmith++;
                    }
                }

                if (target.VirtualArmorMod >= 1)
                {
                    if (Utility.Random(3) > 1)
                    {
                        double amount = damage - target.VirtualArmorMod;

                        target.VirtualArmorMod -= (int)damage;
                        if (amount < 0)
                        {
                            amount = 0;
                        }

                        damage = amount;

                        if (target.VirtualArmorMod < 1)
                        {
                            target.VirtualArmorMod = 0;
                            target.FixedParticles(14276, 10, 20, 14276, EffectLayer.Waist);
                            target.PlaySound(0x38F);
                        }
                        else
                        {
                            string shield = target.VirtualArmorMod.ToString();
                            target.LocalOverheadMessage(MessageType.Emote, 90, true, shield);
                            target.FixedParticles(14265, 10, 20, 14276, EffectLayer.Waist);
                            target.PlaySound(0x525);
                        }
                    }
                }

                if (Utility.RandomMinMax(1, 100) < cntmith)
                {
                    m_Player.SendMessage("Your mithril arbsorbs the spell damage!");
                    int armordam = (int)((damage / 2) / cntmith);
                    int tmphits;
                    damage = 0;

                    for (int i = 0; i < mithitems.Count; ++i)
                    {
                        BaseArmor tmparm = (BaseArmor)mithitems[i];
                        if (tmparm.HitPoints > armordam)
                        {
                            tmparm.HitPoints -= armordam;
                        }
                        else
                        {
                            tmphits             = tmparm.HitPoints;
                            tmparm.HitPoints    = 0;
                            tmparm.MaxHitPoints = tmparm.MaxHitPoints - (armordam - tmphits);
                            if (tmparm.MaxHitPoints < 1)
                            {
                                tmparm.Delete();
                                m_Player.SendMessage("Your mithril armor has been destroyed!");
                            }
                            else
                            {
                                m_Player.SendMessage("Your mithril armor has been severely damaged!");
                            }
                        }
                    }
                }
            }

            if (!KensaiAvoided)
            {
                damage = CloakOfDarknessCheck(spell, target, damage);
            }
            //

            TimeSpan ts = GetDamageDelayForSpell(spell);

            Damage(ts, target, spell.Caster, damage, phys, fire, cold, pois, nrgy);
        }