public void Target(Mobile m) { if (Caster == m) { Caster.SendLocalizedMessage(1061832); // You cannot exact vengeance on yourself. } else if (CheckHSequence(m)) { SpellHelper.Turn(Caster, m); /* Summons a Revenant which haunts the target until either the target or the Revenant is dead. * Revenants have the ability to track down their targets wherever they may travel. * A Revenant's strength is determined by the Necromancy and Spirit Speak skills of the Caster. * The effect lasts for ((Spirit Speak skill level * 80) / 120) + 10 seconds. */ TimeSpan duration = TimeSpan.FromSeconds(((GetDamageSkill(Caster) * 80) / 120) + 10); Revenant rev = new Revenant(Caster, m, duration); if (BaseCreature.Summon(rev, false, Caster, m.Location, 0x81, TimeSpan.FromSeconds(duration.TotalSeconds + 2.0))) { rev.FixedParticles(0x373A, 1, 15, 9909, EffectLayer.Waist); } } FinishSequence(); }
public static int Damage(Mobile m, Mobile from, int damage, int phys, int fire, int cold, int pois, int nrgy, bool keepAlive, int armorIgnore) { if (m == null || m.Deleted || !m.Alive || damage <= 0) return 0; if (phys == 0 && fire == 100 && cold == 0 && pois == 0 && nrgy == 0) Mobiles.MeerMage.StopEffect(m, true); if (!Core.AOS) { m.Damage(damage, from); return damage; } bool Stalker = false; TeiravonMobile TavMobile; double var = 1; if (from != null && from is TeiravonMobile) { TavMobile = from as TeiravonMobile; var = .9 - (TavMobile.PlayerLevel * .01); if (TavMobile.HasFeat(TeiravonMobile.Feats.StalkingPrey)) Stalker = true; } if (from != null && Spells.Third.BlessSpell.narindun.Contains(from)) { if (Utility.Random(1000) == 1000) { Revenant rev = new Revenant(from, m, TimeSpan.FromSeconds(15)); if (BaseCreature.Summon(rev, false, from, m.Location, 0x81, TimeSpan.FromSeconds(15 + 2.0))) rev.FixedParticles(0x373A, 1, 15, 9909, EffectLayer.Waist); } } if (from !=null && Spells.Third.BlessSpell.narindun.Contains(m)) { if (Utility.Random(1000) == 1000) { Revenant rev = new Revenant(m, from, TimeSpan.FromSeconds(15)); if (BaseCreature.Summon(rev, false, m, from.Location, 0x81, TimeSpan.FromSeconds(15 + 2.0))) rev.FixedParticles(0x373A, 1, 15, 9909, EffectLayer.Waist); } } Fix(ref phys); Fix(ref fire); Fix(ref cold); Fix(ref pois); Fix(ref nrgy); int resPhys = m.PhysicalResistance; int resFire = m.FireResistance; int resCold = m.ColdResistance; int resPois = m.PoisonResistance; int resNrgy = m.EnergyResistance; if (Spells.Third.BlessSpell.saerin.Contains(m)) resPhys = 95; if (armorIgnore > 0 ) { double f = (100 - armorIgnore) / 100.0; resPhys =(int)(resPhys * f); resFire = (int)(resFire * f); resCold = (int)(resCold * f); resPois = (int)(resPois * f); resNrgy = (int)(resNrgy * f); } if (from != null && IsTracking(from, m) && Stalker) { resPhys = (int)(resPhys * var); resFire = (int)(resFire * var); resCold = (int)(resCold * var); resPois = (int)(resPois * var); resNrgy = (int)(resNrgy * var); } if (m_ArmorIgnore) resPhys = resFire = resCold = resPois = resNrgy = 0; if (Spells.Third.BlessSpell.saerin.Contains(m) && resPhys < 50) resPhys = 50; int totalDamage; totalDamage = damage * phys * (100 - resPhys); totalDamage += damage * fire * (100 - resFire); totalDamage += damage * cold * (100 - resCold); totalDamage += damage * pois * (100 - resPois); totalDamage += damage * nrgy * (100 - resNrgy); totalDamage /= 10000; if (totalDamage < 1) totalDamage = 1; #region Dragon Barding if ((!Core.AOS || from == null || !from.Player) && m.Player && m.Mount is SwampDragon) { SwampDragon pet = m.Mount as SwampDragon; if (pet != null && pet.HasBarding) { int percent = (pet.BardingExceptional ? 20 : 10); int absorbed = Scale(totalDamage, percent); totalDamage -= absorbed; pet.BardingHP -= absorbed; if (pet.BardingHP < 0) { pet.HasBarding = false; pet.BardingHP = 0; m.SendLocalizedMessage(1053031); // Your dragon's barding has been destroyed! } } } #endregion if (keepAlive && totalDamage > m.Hits) totalDamage = m.Hits; if (from != null) { int reflectPhys = AosAttributes.GetValue(m, AosAttribute.ReflectPhysical); if (reflectPhys != 0) { if (from is ExodusMinion && ((ExodusMinion)from).FieldActive || from is ExodusOverseer && ((ExodusOverseer)from).FieldActive) { from.FixedParticles(0x376A, 20, 10, 0x2530, EffectLayer.Waist); from.PlaySound(0x2F4); m.SendAsciiMessage("Your weapon cannot penetrate the creature's magical barrier"); } else { from.Damage(Scale((damage * phys * (100 - resPhys)) / 10000, reflectPhys), m); } } } if (from != null && Spells.Third.BlessSpell.valar.Contains(m)) { ArrayList TargList = new ArrayList(); foreach (Mobile x in m.GetMobilesInRange(2)) { if (x != m && x.AccessLevel <= m.AccessLevel && !x.Blessed) TargList.Add(x); } if (TargList.Count > 0) { m.FixedParticles(0x376A, 9, 32, 5005, 2634, 2, EffectLayer.Waist); totalDamage = totalDamage / TargList.Count; for (int i = 0; i < TargList.Count; ++i) { Mobile dude = TargList[i] as Mobile; dude.Damage(totalDamage, from); } } } if (m is TeiravonMobile) { TeiravonMobile tav = m as TeiravonMobile; if (((tav.IsOrc() && tav.HasFeat(TeiravonMobile.Feats.Tuffness) || tav.HasFeat(TeiravonMobile.Feats.PhysicalResistance)) && from != null && from != tav)) { double reduce = (((double)(100 - Utility.RandomMinMax(0, 5)) - (double)(tav.PlayerLevel / 1.75)) / (double)100); int temp = totalDamage; totalDamage = (int)((double)totalDamage * (double)reduce); if (temp - totalDamage < 1) totalDamage -= 1; if (totalDamage < 0) totalDamage = 0; if (Utility.RandomMinMax(1, 20) > 19) { totalDamage = 0; tav.SendMessage("Your tough skin deflects the attack!"); from.SendMessage("{0} deflects the attack!", tav.Name); } } } if (Spells.Third.BlessSpell.kamalini.Contains(m) && (((DateTime)Spells.Third.BlessSpell.kamalini[m] + TimeSpan.FromSeconds(3)).CompareTo(DateTime.Now)) < 0) { IPooledEnumerable eable = m.GetMobilesInRange(2); ArrayList targets = new ArrayList(); int total = 0; foreach (Mobile t in eable) { if (t.AccessLevel > m.AccessLevel || t.Blessed || t == m) continue; targets.Add(t); } eable.Free(); for (int i = 0; i < targets.Count; ++i) { Mobile x = (Mobile)targets[i]; total += (int)(x.Hits * .03); } if (total > 2) { m.Heal(Utility.RandomMinMax((int)(total * .75), total)); m.FixedParticles(0x376A, 9, 32, 5005, EffectLayer.Waist); m.PlaySound(0x1F2); Spells.Third.BlessSpell.kamalini[m] = DateTime.Now; } } m.Damage(totalDamage, from); return totalDamage; }