public override void Ignite() { base.Ignite(); if (Parent is Mobile && Burning) { MeerMage.StopEffect((Mobile)Parent, true); } }
public override void OnAdded(object parent) { base.OnAdded(parent); if (parent is Mobile && Burning) { MeerMage.StopEffect((Mobile)parent, true); } }
public override void OnAdded(IEntity parent) { base.OnAdded(parent); if (parent is Mobile mobile && Burning) { MeerMage.StopEffect(mobile, true); } }
public static int Damage(Mobile m, Mobile from, int damage, bool ignoreArmor, int phys, int fire, int cold, int pois, int nrgy, int chaos = 0, int direct = 0, bool keepAlive = false, bool archer = false, bool deathStrike = false) { if (m?.Deleted != false || !m.Alive || damage <= 0) { return(0); } if (phys == 0 && fire == 100 && cold == 0 && pois == 0 && nrgy == 0) { MeerMage.StopEffect(m, true); } if (!Core.AOS) { m.Damage(damage, from); return(damage); } Fix(ref phys); Fix(ref fire); Fix(ref cold); Fix(ref pois); Fix(ref nrgy); Fix(ref chaos); Fix(ref direct); if (Core.ML && chaos > 0) { switch (Utility.Random(5)) { case 0: phys += chaos; break; case 1: fire += chaos; break; case 2: cold += chaos; break; case 3: pois += chaos; break; case 4: nrgy += chaos; break; } } BaseQuiver quiver = null; if (archer && from != null) { quiver = from.FindItemOnLayer(Layer.Cloak) as BaseQuiver; } int totalDamage; if (!ignoreArmor) { // Armor Ignore on OSI ignores all defenses, not just physical. int resPhys = m.PhysicalResistance; int resFire = m.FireResistance; int resCold = m.ColdResistance; int resPois = m.PoisonResistance; int resNrgy = m.EnergyResistance; 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 (Core.ML) { totalDamage += damage * direct / 100; if (quiver != null) { totalDamage += totalDamage * quiver.DamageIncrease / 100; } } if (totalDamage < 1) { totalDamage = 1; } } else if (Core.ML && m is PlayerMobile && from is PlayerMobile) { if (quiver != null) { damage += damage * quiver.DamageIncrease / 100; } if (!deathStrike) { totalDamage = Math.Min(damage, 35); // Direct Damage cap of 35 } else { totalDamage = Math.Min(damage, 70); // Direct Damage cap of 70 } } else { totalDamage = damage; if (Core.ML && quiver != null) { totalDamage += totalDamage * quiver.DamageIncrease / 100; } } #region Dragon Barding if (from?.Player != true && m.Player && m.Mount is SwampDragon pet) { if (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?.Deleted == false && from.Alive) { int reflectPhys = AosAttributes.GetValue(m, AosAttribute.ReflectPhysical); if (reflectPhys != 0) { if ((from as ExodusMinion)?.FieldActive == true || (from as ExodusOverseer)?.FieldActive == true) { 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 - (ignoreArmor ? 0 : m.PhysicalResistance)) / 10000, reflectPhys), m); } } } m.Damage(totalDamage, from); return(totalDamage); }
public static void NegateEffects(Mobile target, bool curses, bool buffs, bool damage, bool morph) { if (target == null) { return; } if (damage) { if (target.Poisoned) { var p = target.Poison; target.Poison = null; target.OnCured(target, p); } target.Frozen = false; target.Paralyzed = false; target.SetPropertyValue("Asleep", false); BuffInfo.RemoveBuff(target, BuffIcon.Paralyze); BuffInfo.RemoveBuff(target, BuffIcon.Sleep); } if (buffs) { ReactiveArmorSpell.EndArmor(target); MagicReflectSpell.EndReflect(target); } if (curses) { #region Pain Spike IDictionary table; if (typeof(PainSpikeSpell).GetFieldValue("m_Table", out table) && table.Contains(target)) { var t = table[target] as Timer; if (t != null) { t.Stop(); } table.Remove(target); BuffInfo.RemoveBuff(target, BuffIcon.PainSpike); } #endregion CurseSpell.RemoveEffect(target); EvilOmenSpell.TryEndEffect(target); StrangleSpell.RemoveCurse(target); CorpseSkinSpell.RemoveCurse(target); BloodOathSpell.RemoveCurse(target); MindRotSpell.ClearMindRotScalar(target); } if (damage) { MortalStrike.EndWound(target); BleedAttack.EndBleed(target, target.Alive); MeerMage.StopEffect(target, target.Alive); } if (morph) { AnimalForm.RemoveContext(target, true); PolymorphSpell.StopTimer(target); IncognitoSpell.StopTimer(target); target.Send(SpeedControl.Disable); target.EndAction(typeof(PolymorphSpell)); target.EndAction(typeof(IncognitoSpell)); BuffInfo.RemoveBuff(target, BuffIcon.AnimalForm); BuffInfo.RemoveBuff(target, BuffIcon.Polymorph); BuffInfo.RemoveBuff(target, BuffIcon.Incognito); } if (buffs) { RemoveStatBonus(target, StatType.All); } if (curses) { RemoveStatCurse(target, StatType.All); } }
public virtual void Negate(Mobile m) { if (m == null || m.Deleted) { return; } if (m.Frozen) { m.Frozen = false; } if (m.Paralyzed) { m.Paralyzed = false; } if (m.Poisoned) { m.CurePoison(m); } if (BleedAttack.IsBleeding(m)) { BleedAttack.EndBleed(m, true); } if (MortalStrike.IsWounded(m)) { MortalStrike.EndWound(m); } PolymorphSpell.StopTimer(m); IncognitoSpell.StopTimer(m); DisguiseTimers.RemoveTimer(m); m.EndAction(typeof(PolymorphSpell)); m.EndAction(typeof(IncognitoSpell)); MeerMage.StopEffect(m, false); if (DebugMode || m.AccessLevel <= AccessLevel.Counselor) { m.RevealingAction(); m.DisruptiveAction(); } if (m.Target != null) { m.Target.Cancel(m, TargetCancelType.Overriden); } m.Spell = null; if (m.Combatant != null) { #if ServUO var c = m.Combatant as Mobile; #else var c = m.Combatant; #endif if (c != null && c.Combatant == m) { c.Combatant = null; c.Warmode = false; } m.Combatant = null; } if (m.Aggressed != null) { m.Aggressed.Clear(); } if (m.Aggressors != null) { m.Aggressors.Clear(); } m.Warmode = false; m.Criminal = false; m.Delta(MobileDelta.Noto); }