protected override void OnTick() { if (m_Point is Item && (((Item)m_Point).Deleted || ((Item)m_Point).Map != m_Map)) { return; } else if (m_Point is Mobile && (((Mobile)m_Point).Deleted || ((Mobile)m_Point).Map != m_Map)) { return; } else if (m_Map == null) { return; } if (m_Point is Item) { m_Point = ((Item)m_Point).GetWorldLocation(); } if (InstantExplosion) { m_Potion.Explode(m_Mobile, true, new Point3D(m_Point), m_Map); } else { m_Potion.MoveToWorld(new Point3D(m_Point), m_Map); } }
protected override void OnTick() { if (m_Potion.Deleted) { Stop(); } else if (m_Index == 0) { if (m_Potion.Map == Map.Internal) { m_Potion.Explode(m_Mobile, true, m_Mobile.Location, m_Mobile.Map); } else { m_Potion.Explode(m_Mobile, true, m_Potion.Location, m_Potion.Map); } Stop(); if (m_Mobile.Target is InternalTarget) { Target.Cancel(m_Mobile); } } else { if (m_Potion.Map == Map.Internal) { m_Mobile.PublicOverheadMessage(MessageType.Regular, 0x22, false, m_Index.ToString()); } else { m_Potion.PublicOverheadMessage(MessageType.Regular, 0x22, false, m_Index.ToString()); } --m_Index; } }
public void Explode(Mobile from, bool direct, Point3D loc, Map map) { if (Deleted) { return; } Delete(); if (map == null) { return; } Effects.PlaySound(loc, map, 0x207); for (int i = 0; i < 20; i++) { Point3D temp1 = new Point3D(loc.X, loc.Y, (loc.Z + i)); Effects.SendLocationEffect(temp1, map, 0x3709, 60); } int alchemyBonus = direct ? (int)(from.Skills[SkillName.Alchemy].Value / 10) : 0; IPooledEnumerable eable = LeveledExplosion ? map.GetObjectsInRange(loc, ExplosionRange) : map.GetMobilesInRange(loc, ExplosionRange); ArrayList toExplode = new ArrayList(); foreach (object o in eable) { if (o is Mobile) { toExplode.Add(o); } else if (o is BaseAtomicBomb && o != this) { toExplode.Add(o); } } eable.Free(); for (int i = 0; i < toExplode.Count; ++i) { object o = toExplode[i]; if (o is Mobile) { Mobile m = (Mobile)o; if (from == null || (SpellHelper.ValidIndirectTarget(from, m) && from.CanBeHarmful(m, false))) { if (from != null) { from.DoHarmful(m); } int damage = Utility.RandomMinMax(MinDamage, MaxDamage); damage += alchemyBonus; if (damage > 40) { damage = 40; } AOS.Damage(from, damage, 0, 100, 0, 0, 0); } } else if (o is BaseAtomicBomb) { BaseAtomicBomb pot = (BaseAtomicBomb)o; pot.Explode(from, false, pot.GetWorldLocation(), pot.Map); } } if (map != null) { for (int x = -8; x <= 8; ++x) { for (int y = -8; y <= 8; ++y) { double dist = Math.Sqrt(x * x + y * y); if (dist <= 8) { Explotion(loc, map, X + x, Y + y); } } } } }