From 287bacac0ef4dd68db08553e7427d74be1c1155c Mon Sep 17 00:00:00 2001 From: eos Date: Sun, 4 Mar 2012 05:01:41 +0000 Subject: [PATCH] - Spawners now show all (instead of only 2) spawned objects, grouped by type, sorted alphabetically in their mouseover menu. (Displayed amounts fixed too.) - Talisman slayers fixed to account for inheritance. - Added repond slayer vulnerability to Troglodyte. - Added overload for AOS.Damage with chaos damage support. - Corrected order of ML artifact award messages. - MageAI corrected to not meditate when already meditating. - Changed MageAI necro/mage bias to something more sensible. - Changed speed of most named ML mobs. - Skeletal steeds are now bleed immune. - Damage cap of 200 (before resists) added to fire breath attacks. - Damaging aura effect added to BaseCreature. - Necromancy skill added to several undead mobs. - The succubus special drain effect message no longer shows. - Corrected Sir Patrick's drain effect to account for LOS. - Added healing skill to Troglodytes. - Added named ML mobs for the Labyrinth, Painted Caves, Palace of Paroxysmus, Sanctuary and Twisted Weald. - Added changelings. - Disabled auto unequiping of weapons when meditating for nonplayers. - Added cast animations for players in wraith form, lich form and horrific beast. - Fixed Holy Light to account for LOS. - Fixed Animate Dead to account for inheritance. - Fixed Wither friendly fire issue when cast by monsters. --- Scripts/Engines/Spawner/Spawner.cs | 76 +++-- Scripts/Items/Talismans/TalismanSlayer.cs | 2 +- Scripts/Items/Weapons/SlayerGroup.cs | 2 +- Scripts/Misc/AOS.cs | 5 + Scripts/Misc/MondainsLegacy.cs | 4 +- Scripts/Mobiles/AI/MageAI.cs | 11 +- Scripts/Mobiles/AI/SpeedInfo.cs | 19 +- .../Mobiles/Animals/Mounts/SkeletalMount.cs | 1 + Scripts/Mobiles/BaseCreature.cs | 60 ++++ .../Mobiles/Monsters/AOS/DarknightCreeper.cs | 2 + .../Monsters/Humanoid/Magic/AncientLich.cs | 2 + .../Monsters/Humanoid/Magic/BoneMagi.cs | 2 + .../Monsters/Humanoid/Magic/SkeletalMage.cs | 2 + .../Monsters/Humanoid/Magic/Succubus.cs | 2 +- .../Monsters/ML/Bedlam/MasterTheophilus.cs | 1 - .../Mobiles/Monsters/ML/Bedlam/SirPatrick.cs | 10 +- .../Monsters/ML/Humanoid/Melee/Troglodyte.cs | 5 +- .../Mobiles/Monsters/ML/Labyrinth/Miasma.cs | 113 +++++++ Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs | 83 +++++ Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs | 80 +++++ .../Monsters/ML/Misc/Melee/Reptalon.cs | 2 +- .../Monsters/ML/Painted Caves/Grobu.cs | 83 +++++ .../Mobiles/Monsters/ML/Painted Caves/Lurg.cs | 81 +++++ .../ML/Palace of Paroxysmus/Putrefier.cs | 90 ++++++ .../Monsters/ML/Sanctuary/Chiikkaha.cs | 62 ++++ .../Mobiles/Monsters/ML/Sanctuary/MougGuur.cs | 59 ++++ .../Mobiles/Monsters/ML/Sanctuary/Szavetra.cs | 63 ++++ .../Monsters/ML/Twisted Weald/Changeling.cs | 297 ++++++++++++++++++ .../Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs | 83 +++++ .../Monsters/ML/Twisted Weald/Guile.cs | 86 +++++ .../Mobiles/Monsters/ML/Twisted Weald/Irk.cs | 85 +++++ .../Monsters/ML/Twisted Weald/LadyLissith.cs | 93 ++++++ .../Monsters/ML/Twisted Weald/LadySabrix.cs | 98 ++++++ .../Monsters/ML/Twisted Weald/Malefic.cs | 83 +++++ .../Mobiles/Monsters/ML/Twisted Weald/Silk.cs | 77 +++++ .../Monsters/ML/Twisted Weald/Spite.cs | 71 +++++ .../Monsters/ML/Twisted Weald/Swoop.cs | 168 ++++++++++ .../Monsters/ML/Twisted Weald/Virulent.cs | 97 ++++++ .../Monsters/Reptile/Magic/SkeletalDragon.cs | 2 + Scripts/Mobiles/Monsters/SE/Kappa.cs | 2 +- Scripts/Mobiles/Monsters/SE/LadyOfTheSnow.cs | 2 + Scripts/Skills/Meditation.cs | 2 +- Scripts/Spells/Base/Spell.cs | 11 +- Scripts/Spells/Chivalry/HolyLight.cs | 2 +- Scripts/Spells/Necromancy/AnimateDeadSpell.cs | 2 +- Scripts/Spells/Necromancy/Wither.cs | 24 +- 46 files changed, 2154 insertions(+), 53 deletions(-) create mode 100644 Scripts/Mobiles/Monsters/ML/Labyrinth/Miasma.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Painted Caves/Grobu.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Painted Caves/Lurg.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Palace of Paroxysmus/Putrefier.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Sanctuary/Chiikkaha.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Sanctuary/MougGuur.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Sanctuary/Szavetra.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Changeling.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Guile.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Irk.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/LadyLissith.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/LadySabrix.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Malefic.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Silk.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Spite.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Swoop.cs create mode 100644 Scripts/Mobiles/Monsters/ML/Twisted Weald/Virulent.cs diff --git a/Scripts/Engines/Spawner/Spawner.cs b/Scripts/Engines/Spawner/Spawner.cs index d9285273e..bc7b7d4ac 100644 --- a/Scripts/Engines/Spawner/Spawner.cs +++ b/Scripts/Engines/Spawner/Spawner.cs @@ -29,7 +29,7 @@ namespace Server.Mobiles private WayPoint m_WayPoint; public bool IsFull{ get{ return ( m_Spawned != null && m_Spawned.Count >= m_Count ); } } - + public List SpawnNames { get { return m_SpawnNames; } @@ -55,7 +55,7 @@ namespace Server.Mobiles s.m_SpawnNames = new List( m_SpawnNames ); s.m_Spawned = new List(); } - + [CommandProperty( AccessLevel.GameMaster )] public int Count { @@ -98,12 +98,12 @@ namespace Server.Mobiles set { m_HomeRange = value; InvalidateProperties(); } } - [CommandProperty( AccessLevel.GameMaster )] - public int WalkingRange - { - get { return m_WalkingRange; } - set { m_WalkingRange = value; InvalidateProperties(); } - } + [CommandProperty( AccessLevel.GameMaster )] + public int WalkingRange + { + get { return m_WalkingRange; } + set { m_WalkingRange = value; InvalidateProperties(); } + } [CommandProperty( AccessLevel.GameMaster )] public int Team @@ -196,12 +196,12 @@ namespace Server.Mobiles m_Count = amount; m_Team = team; m_HomeRange = homeRange; - m_WalkingRange = -1; + m_WalkingRange = -1; m_SpawnNames = spawnNames; m_Spawned = new List(); DoTimer( TimeSpan.FromSeconds( 1 ) ); } - + public Spawner( Serial serial ) : base( serial ) { } @@ -225,14 +225,14 @@ namespace Server.Mobiles list.Add( 1060656, m_Count.ToString() ); // amount to make: ~1_val~ list.Add( 1061169, m_HomeRange.ToString() ); // range ~1_val~ - list.Add( 1060658, "walking range\t{0}", m_WalkingRange ); // ~1_val~: ~2_val~ + list.Add( 1060658, "walking range\t{0}", m_WalkingRange ); // ~1_val~: ~2_val~ list.Add( 1060659, "group\t{0}", m_Group ); // ~1_val~: ~2_val~ list.Add( 1060660, "team\t{0}", m_Team ); // ~1_val~: ~2_val~ list.Add( 1060661, "speed\t{0} to {1}", m_MinDelay, m_MaxDelay ); // ~1_val~: ~2_val~ - for ( int i = 0; i < 2 && i < m_SpawnNames.Count; ++i ) - list.Add( 1060662 + i, "{0}\t{1}", m_SpawnNames[i], CountCreatures( m_SpawnNames[i] ) ); + if ( m_Spawned.Count != 0 ) + list.Add( SpawnedStats() ); } else { @@ -355,7 +355,7 @@ namespace Server.Mobiles Spawn(); } } - + public void Respawn() { RemoveSpawned(); @@ -363,13 +363,13 @@ namespace Server.Mobiles for ( int i = 0; i < m_Count; i++ ) Spawn(); } - + public void Spawn() { if ( SpawnNamesCount > 0 ) Spawn( Utility.Random( SpawnNamesCount ) ); } - + public void Spawn( string creatureName ) { for ( int i = 0; i < m_SpawnNames.Count; i++ ) @@ -542,7 +542,7 @@ namespace Server.Mobiles if (spawned is BaseCreature) { BaseCreature bc = (BaseCreature)spawned; - + if( m_WalkingRange >= 0 ) bc.RangeHome = m_WalkingRange; else @@ -636,6 +636,33 @@ namespace Server.Mobiles } } + public string SpawnedStats() + { + Defrag(); + + Dictionary counts = new Dictionary(); + + foreach ( ISpawnable spawned in m_Spawned ) + { + string name = spawned.GetType().Name; + + if ( counts.ContainsKey( name ) ) + ++counts[name]; + else + counts[name] = 1; + } + + List names = new List( counts.Keys ); + names.Sort(); + + StringBuilder result = new StringBuilder(); + + for ( int i = 0; i < names.Count; ++i ) + result.AppendFormat( "{0}{1}: {2}", ( i == 0 ) ? "" : "
", names[i], counts[names[i]] ); + + return result.ToString(); + } + public int CountCreatures( string creatureName ) { Defrag(); @@ -658,12 +685,12 @@ namespace Server.Mobiles IEntity e = m_Spawned[i]; if ( Insensitive.Equals( creatureName, e.GetType().Name ) ) - e.Delete(); + e.Delete(); } InvalidateProperties(); } - + public void RemoveSpawned() { Defrag(); @@ -673,7 +700,7 @@ namespace Server.Mobiles InvalidateProperties(); } - + public void BringToHome() { Defrag(); @@ -683,7 +710,6 @@ namespace Server.Mobiles ISpawnable e = m_Spawned[i]; e.MoveToWorld( this.Location, this.Map ); - } } @@ -696,7 +722,7 @@ namespace Server.Mobiles if ( m_Timer != null ) m_Timer.Stop(); } - + public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); @@ -714,7 +740,7 @@ namespace Server.Mobiles writer.Write( m_Team ); writer.Write( m_HomeRange ); writer.Write( m_Running ); - + if ( m_Running ) writer.WriteDeltaTime( m_End ); @@ -765,7 +791,7 @@ namespace Server.Mobiles case 1: { m_Group = reader.ReadBool(); - + goto case 0; } @@ -782,7 +808,7 @@ namespace Server.Mobiles if ( m_Running ) ts = reader.ReadDeltaTime() - DateTime.Now; - + int size = reader.ReadInt(); m_SpawnNames = new List( size ); diff --git a/Scripts/Items/Talismans/TalismanSlayer.cs b/Scripts/Items/Talismans/TalismanSlayer.cs index 3ed125683..c5379d107 100644 --- a/Scripts/Items/Talismans/TalismanSlayer.cs +++ b/Scripts/Items/Talismans/TalismanSlayer.cs @@ -104,7 +104,7 @@ namespace Server.Items for ( int i = 0; i < types.Length; i++ ) { - if ( types[ i ] == type ) + if ( types[ i ].IsAssignableFrom( type ) ) return true; } diff --git a/Scripts/Items/Weapons/SlayerGroup.cs b/Scripts/Items/Weapons/SlayerGroup.cs index 258bfba5b..f5852188c 100644 --- a/Scripts/Items/Weapons/SlayerGroup.cs +++ b/Scripts/Items/Weapons/SlayerGroup.cs @@ -67,7 +67,7 @@ namespace Server.Items humanoid.Opposition = new SlayerGroup[]{ undead }; humanoid.FoundOn = new Type[]{ typeof( BoneKnight ), typeof( Lich ), typeof( LichLord ) }; - humanoid.Super = new SlayerEntry( SlayerName.Repond, typeof( ArcticOgreLord ), typeof( Cyclops ), typeof( Ettin ), typeof( EvilMage ), typeof( EvilMageLord ), typeof( FrostTroll ), typeof( MeerCaptain ), typeof( MeerEternal ), typeof( MeerMage ), typeof( MeerWarrior ), typeof( Ogre ), typeof( OgreLord ), typeof( Orc ), typeof( OrcBomber ), typeof( OrcBrute ), typeof( OrcCaptain ), /*typeof( OrcChopper ), typeof( OrcScout ),*/ typeof( OrcishLord ), typeof( OrcishMage ), typeof( Ratman ), typeof( RatmanArcher ), typeof( RatmanMage ), typeof( SavageRider ), typeof( SavageShaman ), typeof( Savage ), typeof( Titan ), typeof( Troll ) ); + humanoid.Super = new SlayerEntry( SlayerName.Repond, typeof( ArcticOgreLord ), typeof( Cyclops ), typeof( Ettin ), typeof( EvilMage ), typeof( EvilMageLord ), typeof( FrostTroll ), typeof( MeerCaptain ), typeof( MeerEternal ), typeof( MeerMage ), typeof( MeerWarrior ), typeof( Ogre ), typeof( OgreLord ), typeof( Orc ), typeof( OrcBomber ), typeof( OrcBrute ), typeof( OrcCaptain ), /*typeof( OrcChopper ), typeof( OrcScout ),*/ typeof( OrcishLord ), typeof( OrcishMage ), typeof( Ratman ), typeof( RatmanArcher ), typeof( RatmanMage ), typeof( SavageRider ), typeof( SavageShaman ), typeof( Savage ), typeof( Titan ), typeof( Troglodyte ), typeof( Troll ) ); humanoid.Entries = new SlayerEntry[] { new SlayerEntry( SlayerName.OgreTrashing, typeof( Ogre ), typeof( OgreLord ), typeof( ArcticOgreLord ) ), diff --git a/Scripts/Misc/AOS.cs b/Scripts/Misc/AOS.cs index 91457975d..f588918b9 100644 --- a/Scripts/Misc/AOS.cs +++ b/Scripts/Misc/AOS.cs @@ -43,6 +43,11 @@ namespace Server return Damage( m, from, damage, false, phys, fire, cold, pois, nrgy, 0, 0, false, false, false ); } + public static int Damage( Mobile m, Mobile from, int damage, int phys, int fire, int cold, int pois, int nrgy, int chaos ) + { + return Damage( m, from, damage, false, phys, fire, cold, pois, nrgy, chaos, 0, false, false, false ); + } + public static int Damage( Mobile m, Mobile from, int damage, bool ignoreArmor, int phys, int fire, int cold, int pois, int nrgy ) { return Damage( m, from, damage, ignoreArmor, phys, fire, cold, pois, nrgy, 0, 0, false, false, false ); diff --git a/Scripts/Misc/MondainsLegacy.cs b/Scripts/Misc/MondainsLegacy.cs index 8a08e7b2b..c805f731b 100644 --- a/Scripts/Misc/MondainsLegacy.cs +++ b/Scripts/Misc/MondainsLegacy.cs @@ -36,13 +36,13 @@ namespace Server if ( m.AddToBackpack( item ) ) { - m.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you. m.SendLocalizedMessage( 1072223 ); // An item has been placed in your backpack. + m.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you. } else if ( m.BankBox.TryDropItem( m, item, false ) ) { - m.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you. m.SendLocalizedMessage( 1072224 ); // An item has been placed in your bank box. + m.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you. } else { diff --git a/Scripts/Mobiles/AI/MageAI.cs b/Scripts/Mobiles/AI/MageAI.cs index 936f2db1a..c5325947a 100644 --- a/Scripts/Mobiles/AI/MageAI.cs +++ b/Scripts/Mobiles/AI/MageAI.cs @@ -36,7 +36,7 @@ namespace Server.Mobiles public virtual bool SmartAI { - get { return ( m_Mobile is BaseVendor || m_Mobile is BaseEscortable/* || m_Mobile is Changeling*/ ); } // TODO: Uncomment once added + get { return ( m_Mobile is BaseVendor || m_Mobile is BaseEscortable || m_Mobile is Changeling ); } } public virtual bool IsNecromancer @@ -63,7 +63,7 @@ namespace Server.Mobiles Action = ActionType.Combat; m_NextCastTime = DateTime.Now; } - else if( SmartAI && m_Mobile.Mana < m_Mobile.ManaMax ) + else if( SmartAI && m_Mobile.Mana < m_Mobile.ManaMax && !m_Mobile.Meditating ) { m_Mobile.DebugSay( "I am going to meditate" ); @@ -223,7 +223,7 @@ namespace Server.Mobiles public virtual bool UseNecromancy() { if ( IsNecromancer ) - return ( Utility.Random( m_Mobile.Skills[ SkillName.Necromancy ].BaseFixedPoint ) > Utility.Random( m_Mobile.Skills[ SkillName.Magery ].BaseFixedPoint ) ); + return ( Utility.Random( m_Mobile.Skills[ SkillName.Magery ].BaseFixedPoint + m_Mobile.Skills[ SkillName.Necromancy ].BaseFixedPoint ) >= m_Mobile.Skills[ SkillName.Magery ].BaseFixedPoint ); return false; } @@ -447,7 +447,7 @@ namespace Server.Mobiles { if( m_Mobile.Mana > 15 && m_Mobile.Mana < 40 ) { - if( c.Paralyzed && !c.Poisoned ) + if( c.Paralyzed && !c.Poisoned && !m_Mobile.Meditating ) { m_Mobile.DebugSay( "I am going to meditate" ); @@ -1028,9 +1028,6 @@ namespace Server.Mobiles else if( isReveal && m_RevealTarget != null ) { targ.Invoke( m_Mobile, m_RevealTarget ); - - if( SmartAI ) - m_Mobile.NextReacquireTime = DateTime.Now; } else if( isTeleport && toTarget != null ) { diff --git a/Scripts/Mobiles/AI/SpeedInfo.cs b/Scripts/Mobiles/AI/SpeedInfo.cs index 73be69274..9cdae0a0f 100644 --- a/Scripts/Mobiles/AI/SpeedInfo.cs +++ b/Scripts/Mobiles/AI/SpeedInfo.cs @@ -118,7 +118,8 @@ namespace Server typeof( SnowElemental ), typeof( WhiteWyrm ), typeof( Wisp ), typeof( DemonKnight ), typeof( GiantBlackWidow ), typeof( SummonedAirElemental ), typeof( LesserHiryu ), typeof( Hiryu ), typeof( LadyOfTheSnow ), - typeof( RaiJu ), typeof( Ronin ), typeof( RuneBeetle ) + typeof( RaiJu ), typeof( Ronin ), typeof( RuneBeetle ), + typeof( Changeling ) } ), /* Very Fast */ new SpeedInfo( 0.175, 0.350, new Type[] @@ -131,7 +132,21 @@ namespace Server typeof( FactionHenchman ), typeof( FactionMercenary ), typeof( FactionNecromancer ), typeof( FactionSorceress ), typeof( FactionWizard ), typeof( FactionBerserker ), typeof( FactionPaladin ), typeof( Leviathan ), typeof( FireBeetle ), - typeof( FanDancer ) + typeof( FanDancer ), + #region ML named mobs + typeof( LadyJennifyr ), typeof( LadyMarai ), typeof( MasterJonath ), + typeof( MasterMikael ), typeof( MasterTheophilus ), typeof( RedDeath ), + typeof( SirPatrick ), typeof( Miasma ), typeof( Rend ), + typeof( Grobu ), typeof( Gnaw ), typeof( Guile ), + typeof( Irk ), typeof( Spite ), typeof( LadyLissith ), + typeof( LadySabrix ), typeof( Malefic ), typeof( Silk ), + typeof( Virulent ) + /* + // These don't seem to be fast? + typeof( Lurg ), typeof( Putrefier ), typeof( Swoop), + typeof( Pyre ) + */ + #endregion } ), /* Medium */ new SpeedInfo( 0.25, 0.5, new Type[] diff --git a/Scripts/Mobiles/Animals/Mounts/SkeletalMount.cs b/Scripts/Mobiles/Animals/Mounts/SkeletalMount.cs index 95931d55e..e696516aa 100644 --- a/Scripts/Mobiles/Animals/Mounts/SkeletalMount.cs +++ b/Scripts/Mobiles/Animals/Mounts/SkeletalMount.cs @@ -39,6 +39,7 @@ namespace Server.Mobiles } public override Poison PoisonImmune{ get{ return Poison.Lethal; } } + public override bool BleedImmune{ get{ return true; } } public SkeletalMount( Serial serial ) : base( serial ) { diff --git a/Scripts/Mobiles/BaseCreature.cs b/Scripts/Mobiles/BaseCreature.cs index ec230a2c0..e047ee0a2 100644 --- a/Scripts/Mobiles/BaseCreature.cs +++ b/Scripts/Mobiles/BaseCreature.cs @@ -654,6 +654,9 @@ namespace Server.Mobiles if ( IsParagon ) damage = (int)(damage / Paragon.HitsBuff); + if ( damage > 200 ) + damage = 200; + return damage; } @@ -5007,7 +5010,58 @@ namespace Server.Mobiles { patient.PlaySound( HealSound ); } + #endregion + #region Damaging Aura + private DateTime m_NextAura; + + public virtual bool HasAura { get { return false; } } + public virtual TimeSpan AuraInterval { get { return TimeSpan.FromSeconds( 5 ); } } + public virtual int AuraRange { get { return 4; } } + + public virtual int AuraBaseDamage { get { return 5; } } + public virtual int AuraPhysicalDamage { get{ return 0; } } + public virtual int AuraFireDamage { get{ return 100; } } + public virtual int AuraColdDamage { get{ return 0; } } + public virtual int AuraPoisonDamage { get{ return 0; } } + public virtual int AuraEnergyDamage { get{ return 0; } } + public virtual int AuraChaosDamage { get { return 0; } } + + public virtual void AuraDamage() + { + if ( !Alive || IsDeadBondedPet ) + return; + + List list = new List(); + + foreach ( Mobile m in GetMobilesInRange( AuraRange ) ) + { + if ( m == this || !CanBeHarmful( m, false ) || ( Core.AOS && !InLOS( m ) ) ) + continue; + + if ( m is BaseCreature ) + { + BaseCreature bc = (BaseCreature)m; + + if ( bc.Controlled || bc.Summoned || bc.Team != Team ) + list.Add( m ); + } + else if ( m.Player ) + { + list.Add( m ); + } + } + + foreach ( Mobile m in list ) + { + AOS.Damage( m, this, AuraBaseDamage, AuraPhysicalDamage, AuraFireDamage, AuraColdDamage, AuraPoisonDamage, AuraEnergyDamage, AuraChaosDamage ); + AuraEffect( m ); + } + } + + public virtual void AuraEffect( Mobile m ) + { + } #endregion public virtual void OnThink() @@ -5063,6 +5117,12 @@ namespace Server.Mobiles m_NextHealTime = DateTime.Now + TimeSpan.FromSeconds( HealInterval ); } } + + if ( HasAura && DateTime.Now >= m_NextAura ) + { + AuraDamage(); + m_NextAura = DateTime.Now + AuraInterval; + } } public virtual bool Rummage() diff --git a/Scripts/Mobiles/Monsters/AOS/DarknightCreeper.cs b/Scripts/Mobiles/Monsters/AOS/DarknightCreeper.cs index 5c70f19c7..ac5c66ba0 100644 --- a/Scripts/Mobiles/Monsters/AOS/DarknightCreeper.cs +++ b/Scripts/Mobiles/Monsters/AOS/DarknightCreeper.cs @@ -41,6 +41,8 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 90.1, 90.9 ); SetSkill( SkillName.Tactics, 100.0 ); SetSkill( SkillName.Wrestling, 90.1, 90.9 ); + SetSkill( SkillName.Necromancy, 120.1, 130.0 ); + SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 ); Fame = 22000; Karma = -22000; diff --git a/Scripts/Mobiles/Monsters/Humanoid/Magic/AncientLich.cs b/Scripts/Mobiles/Monsters/Humanoid/Magic/AncientLich.cs index 3cd6b2b55..8895f36dd 100644 --- a/Scripts/Mobiles/Monsters/Humanoid/Magic/AncientLich.cs +++ b/Scripts/Mobiles/Monsters/Humanoid/Magic/AncientLich.cs @@ -39,6 +39,8 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 175.2, 200.0 ); SetSkill( SkillName.Tactics, 90.1, 100.0 ); SetSkill( SkillName.Wrestling, 75.1, 100.0 ); + SetSkill( SkillName.Necromancy, 120.1, 130.0 ); + SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 ); Fame = 23000; Karma = -23000; diff --git a/Scripts/Mobiles/Monsters/Humanoid/Magic/BoneMagi.cs b/Scripts/Mobiles/Monsters/Humanoid/Magic/BoneMagi.cs index 96c426aba..5aa794c00 100644 --- a/Scripts/Mobiles/Monsters/Humanoid/Magic/BoneMagi.cs +++ b/Scripts/Mobiles/Monsters/Humanoid/Magic/BoneMagi.cs @@ -35,6 +35,8 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 55.1, 70.0 ); SetSkill( SkillName.Tactics, 45.1, 60.0 ); SetSkill( SkillName.Wrestling, 45.1, 55.0 ); + SetSkill( SkillName.Necromancy, 89, 99.1 ); + SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 ); Fame = 3000; Karma = -3000; diff --git a/Scripts/Mobiles/Monsters/Humanoid/Magic/SkeletalMage.cs b/Scripts/Mobiles/Monsters/Humanoid/Magic/SkeletalMage.cs index 2ae41135b..400e1e7be 100644 --- a/Scripts/Mobiles/Monsters/Humanoid/Magic/SkeletalMage.cs +++ b/Scripts/Mobiles/Monsters/Humanoid/Magic/SkeletalMage.cs @@ -35,6 +35,8 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 55.1, 70.0 ); SetSkill( SkillName.Tactics, 45.1, 60.0 ); SetSkill( SkillName.Wrestling, 45.1, 55.0 ); + SetSkill( SkillName.Necromancy, 89, 99.1 ); + SetSkill( SkillName.SpiritSpeak, 90.0, 99.0 ); Fame = 3000; Karma = -3000; diff --git a/Scripts/Mobiles/Monsters/Humanoid/Magic/Succubus.cs b/Scripts/Mobiles/Monsters/Humanoid/Magic/Succubus.cs index 0a05f0424..005ba06b8 100644 --- a/Scripts/Mobiles/Monsters/Humanoid/Magic/Succubus.cs +++ b/Scripts/Mobiles/Monsters/Humanoid/Magic/Succubus.cs @@ -76,7 +76,7 @@ namespace Server.Mobiles m.FixedParticles( 0x374A, 10, 15, 5013, 0x496, 0, EffectLayer.Waist ); m.PlaySound( 0x231 ); - m.SendMessage( "You feel the life drain out of you!" ); + //m.SendMessage( "You feel the life drain out of you!" ); int toDrain = Utility.RandomMinMax( 10, 40 ); diff --git a/Scripts/Mobiles/Monsters/ML/Bedlam/MasterTheophilus.cs b/Scripts/Mobiles/Monsters/ML/Bedlam/MasterTheophilus.cs index 3a2e9f8f6..dc64a6190 100644 --- a/Scripts/Mobiles/Monsters/ML/Bedlam/MasterTheophilus.cs +++ b/Scripts/Mobiles/Monsters/ML/Bedlam/MasterTheophilus.cs @@ -79,7 +79,6 @@ namespace Server.Mobiles */ public override bool GivesMLMinorArtifact{ get{ return true; } } - public override bool AlwaysMurderer{ get{ return true; } } public override int TreasureMapLevel{ get{ return 5; } } public MasterTheophilus( Serial serial ) diff --git a/Scripts/Mobiles/Monsters/ML/Bedlam/SirPatrick.cs b/Scripts/Mobiles/Monsters/ML/Bedlam/SirPatrick.cs index dfe48cdd3..019ad9dc4 100644 --- a/Scripts/Mobiles/Monsters/ML/Bedlam/SirPatrick.cs +++ b/Scripts/Mobiles/Monsters/ML/Bedlam/SirPatrick.cs @@ -54,13 +54,21 @@ namespace Server.Mobiles DrainLife(); } + public override void OnGotMeleeAttack( Mobile attacker ) + { + base.OnGotMeleeAttack( attacker ); + + if ( Utility.RandomDouble() < 0.1 ) + DrainLife(); + } + public virtual void DrainLife() { List list = new List(); foreach ( Mobile m in GetMobilesInRange( 2 ) ) { - if ( m == this || !CanBeHarmful( m ) ) + if ( m == this || !CanBeHarmful( m, false ) || ( Core.AOS && !InLOS( m ) ) ) continue; if ( m is BaseCreature ) diff --git a/Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs b/Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs index 9363f095e..4f1928748 100644 --- a/Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs +++ b/Scripts/Mobiles/Monsters/ML/Humanoid/Melee/Troglodyte.cs @@ -9,7 +9,6 @@ namespace Server.Mobiles [CorpseName( "a troglodyte corpse" )] public class Troglodyte : BaseCreature { - [Constructable] public Troglodyte() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 ) // NEED TO CHECK { @@ -37,6 +36,7 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 51.8, 65.0 ); SetSkill( SkillName.Tactics, 80.4, 94.7 ); SetSkill( SkillName.Wrestling, 70.2, 93.5 ); + SetSkill( SkillName.Healing, 70.0, 95.0 ); Fame = 5000; Karma = -5000; @@ -45,10 +45,9 @@ namespace Server.Mobiles PackItem( new Bandage( 5 ) ); // How many? PackItem( new Ribs() ); - } - public override bool CanHeal { get { return true; } } + public override bool CanHeal { get { return true; } } public override void GenerateLoot() { diff --git a/Scripts/Mobiles/Monsters/ML/Labyrinth/Miasma.cs b/Scripts/Mobiles/Monsters/ML/Labyrinth/Miasma.cs new file mode 100644 index 000000000..ea14e3844 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Labyrinth/Miasma.cs @@ -0,0 +1,113 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Miasma corpse" )] + public class Miasma : Scorpion + { + [Constructable] + public Miasma() + { + Name = "Miasma"; + Hue = 0x8FD; + + SetStr( 255, 847 ); + SetDex( 145, 428 ); + SetInt( 26, 380 ); + + SetHits( 272, 2000 ); + SetMana( 5, 60 ); + + SetDamage( 20, 30 ); + + SetDamageType( ResistanceType.Physical, 60 ); + SetDamageType( ResistanceType.Poison, 40 ); + + SetResistance( ResistanceType.Physical, 50, 54 ); + SetResistance( ResistanceType.Fire, 40, 45 ); + SetResistance( ResistanceType.Cold, 50, 55 ); + SetResistance( ResistanceType.Poison, 70, 80 ); + SetResistance( ResistanceType.Energy, 40, 45 ); + + SetSkill( SkillName.Wrestling, 64.9, 73.3 ); + SetSkill( SkillName.Tactics, 98.4, 110.6 ); + SetSkill( SkillName.MagicResist, 74.4, 77.7 ); + SetSkill( SkillName.Poisoning, 128.5, 143.6 ); + + Fame = 21000; + Karma = -21000; + + Tamable = false; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.MortalStrike; + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.025 ) + { + switch ( Utility.Random( 16 ) ) + { + case 0: c.DropItem( new MyrmidonGloves() ); break; + case 1: c.DropItem( new MyrmidonGorget() ); break; + case 2: c.DropItem( new MyrmidonLegs() ); break; + case 3: c.DropItem( new MyrmidonArms() ); break; + case 4: c.DropItem( new PaladinArms() ); break; + case 5: c.DropItem( new PaladinGorget() ); break; + case 6: c.DropItem( new LeafweaveLegs() ); break; + case 7: c.DropItem( new DeathChest() ); break; + case 8: c.DropItem( new DeathGloves() ); break; + case 9: c.DropItem( new DeathLegs() ); break; + case 10: c.DropItem( new GreymistGloves() ); break; + case 11: c.DropItem( new GreymistArms() ); break; + case 12: c.DropItem( new AssassinChest() ); break; + case 13: c.DropItem( new AssassinArms() ); break; + case 14: c.DropItem( new HunterGloves() ); break; + case 15: c.DropItem( new HunterLegs() ); break; + } + } + + if ( Paragon.ChestChance > Utility.RandomDouble() ) + c.DropItem( new ParagonChest( Name, TreasureMapLevel ) ); + } + */ + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override int TreasureMapLevel{ get{ return 5; } } + public override Poison PoisonImmune{ get{ return Poison.Lethal; } } + public override Poison HitPoison{ get{ return Poison.Lethal; } } + + public Miasma( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs b/Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs new file mode 100644 index 000000000..2b27f7732 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Labyrinth/Pyre.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Server; +using Server.Items; +using Server.Spells; + +namespace Server.Mobiles +{ + [CorpseName( "a Pyre corpse" )] + public class Pyre : Phoenix + { + [Constructable] + public Pyre() + { + Name = "Pyre"; + Hue = 0x489; + + SetStr( 605, 611 ); + SetDex( 391, 519 ); + SetInt( 669, 818 ); + + SetHits( 1783, 1939 ); + + SetDamage( 30 ); + + SetDamageType( ResistanceType.Physical, 50 ); + SetDamageType( ResistanceType.Fire, 50 ); + + SetResistance( ResistanceType.Physical, 65 ); + SetResistance( ResistanceType.Fire, 72, 75 ); + SetResistance( ResistanceType.Poison, 36, 41 ); + SetResistance( ResistanceType.Energy, 50, 51 ); + + SetSkill( SkillName.Wrestling, 121.9, 130.6 ); + SetSkill( SkillName.Tactics, 114.4, 117.4 ); + SetSkill( SkillName.MagicResist, 147.7, 153.0 ); + SetSkill( SkillName.Poisoning, 122.8, 124.0 ); + SetSkill( SkillName.Magery, 121.8, 127.8 ); + SetSkill( SkillName.EvalInt, 103.6, 117.0 ); + SetSkill( SkillName.Meditation, 100.0, 110.0 ); + + Fame = 21000; + Karma = -21000; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 4 ); + } + + public override WeaponAbility GetWeaponAbility() + { + if ( Utility.RandomBool() ) + return WeaponAbility.ParalyzingBlow; + else + return WeaponAbility.BleedAttack; + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override int TreasureMapLevel{ get{ return 5; } } + public override bool HasAura{ get{ return true; } } + + public Pyre( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs b/Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs new file mode 100644 index 000000000..a7a4195ca --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Labyrinth/Rend.cs @@ -0,0 +1,80 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Rend corpse" )] + public class Rend : Reptalon + { + [Constructable] + public Rend() + { + Name = "Rend"; + Hue = 0x455; + + SetStr( 1261, 1284 ); + SetDex( 363, 384 ); + SetInt( 601, 642 ); + + SetHits( 5176, 6100 ); + + SetDamage( 26, 33 ); + + SetDamageType( ResistanceType.Physical, 100 ); + SetDamageType( ResistanceType.Poison, 0 ); + SetDamageType( ResistanceType.Energy, 0 ); + + SetResistance( ResistanceType.Physical, 75, 85 ); + SetResistance( ResistanceType.Fire, 81, 94 ); + SetResistance( ResistanceType.Cold, 46, 55 ); + SetResistance( ResistanceType.Poison, 35, 44 ); + SetResistance( ResistanceType.Energy, 45, 52 ); + + SetSkill( SkillName.Wrestling, 136.3, 150.3 ); + SetSkill( SkillName.Tactics, 133.4, 141.4 ); + SetSkill( SkillName.MagicResist, 90.9, 110.0 ); + SetSkill( SkillName.Anatomy, 66.6, 72.0 ); + + Tamable = false; + + /* + // TODO: Needs verification + if ( Paragon.ChestChance > Utility.RandomDouble() ) + PackItem( new ParagonChest( Name, TreasureMapLevel ) ); + */ + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 4 ); + } + + public override WeaponAbility GetWeaponAbility() + { + if ( Utility.RandomBool() ) + return WeaponAbility.ParalyzingBlow; + else + return WeaponAbility.BleedAttack; + } + + public Rend( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Misc/Melee/Reptalon.cs b/Scripts/Mobiles/Monsters/ML/Misc/Melee/Reptalon.cs index eb790b96c..c22fa4501 100644 --- a/Scripts/Mobiles/Monsters/ML/Misc/Melee/Reptalon.cs +++ b/Scripts/Mobiles/Monsters/ML/Misc/Melee/Reptalon.cs @@ -10,7 +10,7 @@ namespace Server.Mobiles [Constructable] public Reptalon() : base( "a reptalon", 0x114, 0x3E90, AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.35 ) { - BaseSoundID = 0x16A; // TODO check + BaseSoundID = 0x16A; SetStr( 1001, 1025 ); SetDex( 152, 164 ); diff --git a/Scripts/Mobiles/Monsters/ML/Painted Caves/Grobu.cs b/Scripts/Mobiles/Monsters/ML/Painted Caves/Grobu.cs new file mode 100644 index 000000000..407b44b51 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Painted Caves/Grobu.cs @@ -0,0 +1,83 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Grobu corpse" )] + public class Grobu : BlackBear + { + [Constructable] + public Grobu() + { + Name = "Grobu"; + Hue = 0x455; + + AI = AIType.AI_Melee; + FightMode = FightMode.Closest; + + SetStr( 192, 210 ); + SetDex( 132, 150 ); + SetInt( 50, 52 ); + + SetHits( 1235, 1299 ); + SetStam( 132, 150 ); + SetMana( 9 ); + + SetDamage( 15, 18 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 40, 45 ); + SetResistance( ResistanceType.Fire, 20, 40 ); + SetResistance( ResistanceType.Cold, 32, 35 ); + SetResistance( ResistanceType.Poison, 25, 30 ); + SetResistance( ResistanceType.Energy, 22, 34 ); + + SetSkill( SkillName.Wrestling, 96.4, 119.0 ); + SetSkill( SkillName.Tactics, 96.2, 116.5 ); + SetSkill( SkillName.MagicResist, 66.2, 83.7 ); + + Fame = 1000; + Karma = 1000; + + Tamable = false; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosFilthyRich, 3 ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + c.DropItem( new GrobusFur() ); + } + */ + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public Grobu( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Painted Caves/Lurg.cs b/Scripts/Mobiles/Monsters/ML/Painted Caves/Lurg.cs new file mode 100644 index 000000000..98b532b0b --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Painted Caves/Lurg.cs @@ -0,0 +1,81 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Lurg corpse" )] + public class Lurg : Troglodyte + { + [Constructable] + public Lurg() + { + Name = "Lurg"; + Hue = 0x455; + + SetStr( 584, 625 ); + SetDex( 163, 176 ); + SetInt( 90, 106 ); + + SetHits( 3034, 3189 ); + SetStam( 163, 176 ); + SetMana( 90, 106 ); + + SetDamage( 16, 19 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 50, 53 ); + SetResistance( ResistanceType.Fire, 45, 47 ); + SetResistance( ResistanceType.Cold, 56, 60 ); + SetResistance( ResistanceType.Poison, 50, 60 ); + SetResistance( ResistanceType.Energy, 41, 56 ); + + SetSkill( SkillName.Wrestling, 122.7, 130.5 ); + SetSkill( SkillName.Tactics, 109.3, 118.5 ); + SetSkill( SkillName.MagicResist, 72.9, 87.6 ); + SetSkill( SkillName.Anatomy, 110.5, 124.0 ); + SetSkill( SkillName.Healing, 84.1, 105.0 ); + + Fame = 10000; + Karma = -10000; + + /* + if ( Paragon.ChestChance > Utility.RandomDouble() ) // TODO: Needs verification + PackItem( new ParagonChest( Name, TreasureMapLevel ) ); + */ + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.CrushingBlow; + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override int TreasureMapLevel{ get{ return 4; } } + + public Lurg( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Palace of Paroxysmus/Putrefier.cs b/Scripts/Mobiles/Monsters/ML/Palace of Paroxysmus/Putrefier.cs new file mode 100644 index 000000000..745431acd --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Palace of Paroxysmus/Putrefier.cs @@ -0,0 +1,90 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Putrefier corpse" )] + public class Putrefier : Balron + { + [Constructable] + public Putrefier() + { + Name = "Putrefier"; + Hue = 63; + + SetStr( 1057, 1330 ); + SetDex( 232, 450 ); + SetInt( 201, 415 ); + + SetHits( 3010, 3778 ); + + SetDamageType( ResistanceType.Physical, 50 ); + SetDamageType( ResistanceType.Fire, 0 ); + SetDamageType( ResistanceType.Poison, 50 ); + SetDamageType( ResistanceType.Energy, 0 ); + + SetResistance( ResistanceType.Physical, 65, 80 ); + SetResistance( ResistanceType.Fire, 65, 80 ); + SetResistance( ResistanceType.Cold, 50, 60 ); + SetResistance( ResistanceType.Poison, 100 ); + SetResistance( ResistanceType.Energy, 40, 50 ); + + SetSkill( SkillName.Wrestling, 111.2, 128.0 ); + SetSkill( SkillName.Tactics, 115.6, 125.2 ); + SetSkill( SkillName.MagicResist, 143.4, 163.0 ); + SetSkill( SkillName.Anatomy, 44.6, 67.0 ); + SetSkill( SkillName.Magery, 117.6, 118.8 ); + SetSkill( SkillName.EvalInt, 113.0, 128.8 ); + SetSkill( SkillName.Meditation, 41.4, 80.5 ); + + PackScroll( 4, 7 ); + PackScroll( 4, 7 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 4 ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + c.DropItem( new SpleenOfThePutrefier() ); + + if ( Utility.RandomDouble() < 0.6 ) + c.DropItem( new ParrotItem() ); + + if ( Paragon.ChestChance > Utility.RandomDouble() ) + c.DropItem( new ParagonChest( Name, TreasureMapLevel ) ); + } + */ + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override Poison PoisonImmune{ get{ return Poison.Lethal; } } + public override Poison HitPoison{ get{ return Poison.Lethal; } } + public override int TreasureMapLevel{ get{ return 5; } } + + public Putrefier( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Sanctuary/Chiikkaha.cs b/Scripts/Mobiles/Monsters/ML/Sanctuary/Chiikkaha.cs new file mode 100644 index 000000000..5936d00db --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Sanctuary/Chiikkaha.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; +using Server.Misc; +using Server.Items; +using Server.Mobiles; + +namespace Server.Mobiles +{ + [CorpseName( "a Chiikkaha the Toothed corpse" )] + public class Chiikkaha : RatmanMage + { + [Constructable] + public Chiikkaha() + { + Name = "Chiikkaha the Toothed"; + + SetStr( 450, 476 ); + SetDex( 157, 179 ); + SetInt( 251, 275 ); + + SetHits( 400, 425 ); + + SetDamage( 10, 17 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 40, 45 ); + SetResistance( ResistanceType.Fire, 10, 20 ); + SetResistance( ResistanceType.Cold, 10, 20 ); + SetResistance( ResistanceType.Poison, 10, 20 ); + SetResistance( ResistanceType.Energy, 100 ); + + SetSkill( SkillName.EvalInt, 70.1, 80.0 ); + SetSkill( SkillName.Magery, 70.1, 90.0 ); + SetSkill( SkillName.MagicResist, 65.1, 96.0 ); + SetSkill( SkillName.Tactics, 50.1, 75.0 ); + SetSkill( SkillName.Wrestling, 50.1, 75.0 ); + + Fame = 7500; + Karma = -7500; + } + + public Chiikkaha( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Sanctuary/MougGuur.cs b/Scripts/Mobiles/Monsters/ML/Sanctuary/MougGuur.cs new file mode 100644 index 000000000..bed7ff4e7 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Sanctuary/MougGuur.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections; +using Server.Items; +using Server.Targeting; + +namespace Server.Mobiles +{ + [CorpseName( "a Moug-Guur corpse" )] + public class MougGuur : Ettin + { + [Constructable] + public MougGuur() + { + Name = "Moug-Guur"; + + SetStr( 556, 575 ); + SetDex( 84, 94 ); + SetInt( 59, 73 ); + + SetHits( 400, 415 ); + + SetDamage( 12, 20 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 61, 65 ); + SetResistance( ResistanceType.Fire, 16, 19 ); + SetResistance( ResistanceType.Cold, 41, 46 ); + SetResistance( ResistanceType.Poison, 21, 24 ); + SetResistance( ResistanceType.Energy, 19, 25 ); + + SetSkill( SkillName.MagicResist, 70.2, 75.0 ); + SetSkill( SkillName.Tactics, 80.8, 81.7 ); + SetSkill( SkillName.Wrestling, 93.9, 99.4 ); + + Fame = 3000; + Karma = -3000; + } + + public MougGuur( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Sanctuary/Szavetra.cs b/Scripts/Mobiles/Monsters/ML/Sanctuary/Szavetra.cs new file mode 100644 index 000000000..551489749 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Sanctuary/Szavetra.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Szavetra corpse" )] + public class Szavetra : Succubus + { + [Constructable] + public Szavetra() + { + Name = "Szavetra"; + + SetStr( 627, 655 ); + SetDex( 164, 193 ); + SetInt( 566, 595 ); + + SetHits( 312, 415 ); + + SetDamage( 20, 30 ); + + SetDamageType( ResistanceType.Physical, 75 ); + SetDamageType( ResistanceType.Energy, 25 ); + + SetResistance( ResistanceType.Physical, 83, 90 ); + SetResistance( ResistanceType.Fire, 72, 80 ); + SetResistance( ResistanceType.Cold, 40, 49 ); + SetResistance( ResistanceType.Poison, 51, 60 ); + SetResistance( ResistanceType.Energy, 50, 60 ); + + SetSkill( SkillName.EvalInt, 90.3, 99.8 ); + SetSkill( SkillName.Magery, 100.1, 100.6 ); // 10.1-10.6 on OSI, bug? + SetSkill( SkillName.Meditation, 90.1, 110.0 ); + SetSkill( SkillName.MagicResist, 112.2, 127.2 ); + SetSkill( SkillName.Tactics, 91.2, 92.8 ); + SetSkill( SkillName.Wrestling, 80.2, 86.4 ); + + Fame = 24000; + Karma = -24000; + } + + public Szavetra( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Changeling.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Changeling.cs new file mode 100644 index 000000000..aba898e42 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Changeling.cs @@ -0,0 +1,297 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Server; +using Server.Misc; +using Server.Spells; +using Server.Spells.Third; +using Server.Spells.Sixth; +using Server.Items; +using Server.Targeting; + +namespace Server.Mobiles +{ + [CorpseName( "a changeling corpse" )] + public class Changeling : BaseCreature + { + public virtual string DefaultName{ get{ return "a changeling"; } } + public virtual int DefaultHue{ get{ return 0; } } + + [Constructable] + public Changeling() + : base( AIType.AI_Mage, FightMode.Closest, 10, 1, 0.2, 0.4 ) + { + Name = DefaultName; + Body = 264; + Hue = DefaultHue; + BaseSoundID = 0x470; + + SetStr( 36, 105 ); + SetDex( 212, 262 ); + SetInt( 317, 399 ); + + SetHits( 201, 211 ); + SetStam( 212, 262 ); + SetMana( 317, 399 ); + + SetDamage( 9, 15 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 81, 90 ); + SetResistance( ResistanceType.Fire, 40, 50 ); + SetResistance( ResistanceType.Cold, 40, 49 ); + SetResistance( ResistanceType.Poison, 40, 50 ); + SetResistance( ResistanceType.Energy, 43, 50 ); + + SetSkill( SkillName.Wrestling, 10.4, 12.5 ); + SetSkill( SkillName.Tactics, 101.1, 108.3 ); + SetSkill( SkillName.MagicResist, 121.6, 132.2 ); + SetSkill( SkillName.Magery, 91.6, 99.5 ); + SetSkill( SkillName.EvalInt, 91.5, 98.8 ); + SetSkill( SkillName.Meditation, 91.7, 98.5 ); + + Fame = 15000; + Karma = -15000; + + PackScroll( 1, 7 ); + PackItem( new Arrow( 35 ) ); + PackItem( new Bolt( 25 ) ); + PackGem( 2 ); + + PackArcaneScroll( 0, 1 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosRich, 3 ); + } + + private Mobile m_MorphedInto; + private DateTime m_LastMorph; + private DateTime m_NextFireRing; + + [CommandProperty( AccessLevel.GameMaster )] + public Mobile MorphedInto + { + get { return m_MorphedInto; } + set + { + if ( m_MorphedInto != value ) + { + Revert(); + + if ( value == this ) + value = null; + + if ( value != null ) + { + Morph( value ); + m_LastMorph = DateTime.Now; + } + + m_MorphedInto = value; + } + } + } + + public override void OnThink() + { + base.OnThink(); + + if ( Combatant != null ) + { + if ( m_NextFireRing <= DateTime.Now && Utility.RandomDouble() < 0.02 ) + { + FireRing(); + m_NextFireRing = DateTime.Now + TimeSpan.FromMinutes( 2 ); + } + + if ( Combatant.Player && m_MorphedInto != Combatant && Utility.RandomDouble() < 0.05 ) + MorphedInto = Combatant; + } + } + + public override bool CheckIdle() + { + bool idle = base.CheckIdle(); + + if ( idle && m_MorphedInto != null && DateTime.Now - m_LastMorph > TimeSpan.FromSeconds( 30 ) ) + MorphedInto = null; + + return idle; + } + + private void FireEffects( int itemID, int[] offsets ) + { + for ( int i = 0; i < offsets.Length; i += 2 ) + { + Point3D p = Location; + + p.X += offsets[i]; + p.Y += offsets[i + 1]; + + if ( SpellHelper.AdjustField( ref p, Map, 12, false ) ) + Effects.SendLocationEffect( p, Map, itemID, 50 ); + } + } + + private static readonly int[] m_FireNorth = new int[] + { + -1, -1, + 1, -1, + -1, 2, + 1, 2 + }; + + private static readonly int[] m_FireEast = new int[] + { + -1, 0, + 2, 0 + }; + + protected virtual void FireRing() + { + FireEffects( 0x3E27, m_FireNorth ); + FireEffects( 0x3E31, m_FireEast ); + } + + protected virtual void Morph( Mobile m ) + { + Body = m.Body; + Hue = m.Hue; + Female = m.Female; + Name = m.Name; + NameHue = m.NameHue; + Title = m.Title; + Kills = m.Kills; + HairItemID = m.HairItemID; + HairHue = m.HairHue; + FacialHairItemID = m.FacialHairItemID; + FacialHairHue = m.FacialHairHue; + + // TODO: Skills? + + foreach ( Item item in m.Items ) + { + if ( item.Layer != Layer.Backpack && item.Layer != Layer.Mount && item.Layer != Layer.Bank ) + AddItem( new ClonedItem( item ) ); // TODO: Clone weapon/armor attributes + } + + PlaySound( 0x511 ); + FixedParticles( 0x376A, 1, 14, 5045, EffectLayer.Waist ); + } + + protected virtual void Revert() + { + Body = 264; + Hue = IsParagon ? Paragon.Hue : DefaultHue; + Female = false; + Name = DefaultName; + NameHue = -1; + Title = null; + Kills = 0; + HairItemID = 0; + HairHue = 0; + FacialHairItemID = 0; + FacialHairHue = 0; + + for ( int i = Items.Count - 1; i >= 0; --i ) + { + Item item = Items[i]; + + if ( item is ClonedItem ) + item.Delete(); + } + + if ( Backpack != null ) + { + for ( int i = Backpack.Items.Count - 1; i >= 0; --i ) + { + Item item = Backpack.Items[i]; + + if ( item is ClonedItem ) + item.Delete(); + } + } + + PlaySound( 0x511 ); + FixedParticles( 0x376A, 1, 14, 5045, EffectLayer.Waist ); + } + + public override void ClearHands() + { + } + + public Changeling( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + writer.Write( ( m_MorphedInto != null ) ); + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + + if ( reader.ReadBool() ) + m_ToRevert.Add( this ); + } + + private static List m_ToRevert; + + public static void Configure() + { + m_ToRevert = new List(); + } + + public static void Initialize() + { + foreach ( Changeling c in m_ToRevert ) + c.Revert(); + + m_ToRevert.Clear(); + m_ToRevert = null; + } + + private class ClonedItem : Item + { + public ClonedItem( Item item ) + : base( item.ItemID ) + { + Name = item.Name; + Weight = item.Weight; + Hue = item.Hue; + Layer = item.Layer; + Movable = false; + } + + public ClonedItem( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs new file mode 100644 index 000000000..794171c82 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Gnaw.cs @@ -0,0 +1,83 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Gnaw corpse" )] + public class Gnaw : DireWolf + { + [Constructable] + public Gnaw() + { + Name = "Gnaw"; + Hue = 0x130; + + SetStr( 151, 172 ); + SetDex( 124, 145 ); + SetInt( 60, 86 ); + + SetHits( 817, 857 ); + SetStam( 124, 145 ); + SetMana( 52, 86 ); + + SetDamage( 16, 22 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 64, 69 ); + SetResistance( ResistanceType.Fire, 53, 56 ); + SetResistance( ResistanceType.Cold, 22, 27 ); + SetResistance( ResistanceType.Poison, 27, 30 ); + SetResistance( ResistanceType.Energy, 21, 34 ); + + SetSkill( SkillName.Wrestling, 106.4, 116.5 ); + SetSkill( SkillName.Tactics, 84.1, 103.2 ); + SetSkill( SkillName.MagicResist, 96.8, 110.7 ); + + Fame = 17500; + Karma = -17500; + + Tamable = false; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosFilthyRich, 3 ); + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override int Hides{ get{ return 28; } } + public override int Meat{ get{ return 4; } } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.3 ) + c.DropItem( new GnawsFang() ); + } + */ + + public Gnaw( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Guile.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Guile.cs new file mode 100644 index 000000000..57033abec --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Guile.cs @@ -0,0 +1,86 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Guile corpse" )] + public class Guile : Changeling + { + public override string DefaultName{ get{ return "Guile"; } } + public override int DefaultHue{ get{ return 0x3F; } } + + [Constructable] + public Guile() + { + SetStr( 53, 214 ); + SetDex( 243, 367 ); + SetInt( 369, 586 ); + + SetHits( 1013, 1058 ); + SetStam( 243, 367 ); + SetMana( 369, 586 ); + + SetDamage( 14, 20 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 80, 90 ); + SetResistance( ResistanceType.Fire, 43, 46 ); + SetResistance( ResistanceType.Cold, 42, 44 ); + SetResistance( ResistanceType.Poison, 42, 50 ); + SetResistance( ResistanceType.Energy, 47, 50 ); + + SetSkill( SkillName.Wrestling, 12.8, 16.7 ); + SetSkill( SkillName.Tactics, 102.6, 131.0 ); + SetSkill( SkillName.MagicResist, 141.2, 161.6 ); + SetSkill( SkillName.Magery, 108.4, 120.0 ); + SetSkill( SkillName.EvalInt, 108.4, 120.0 ); + SetSkill( SkillName.Meditation, 109.2, 120.0 ); + + Fame = 21000; + Karma = -21000; + } + + public override void OnGaveMeleeAttack( Mobile defender ) + { + base.OnGaveMeleeAttack( defender ); + + if ( Utility.RandomBool() ) + { + if ( !Kappa.IsBeingDrained( defender ) && Mana > 14 ) + { + defender.SendLocalizedMessage( 1070848 ); // You feel your life force being stolen away. + Kappa.BeginLifeDrain( defender, this ); + Mana -= 15; + } + } + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public Guile( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Irk.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Irk.cs new file mode 100644 index 000000000..c854d4521 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Irk.cs @@ -0,0 +1,85 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "an Irk corpse" )] + public class Irk : Changeling + { + public override string DefaultName{ get{ return "Irk"; } } + public override int DefaultHue{ get{ return 0x489; } } + + [Constructable] + public Irk() + { + SetStr( 23, 183 ); + SetDex( 259, 360 ); + SetInt( 374, 600 ); + + SetHits( 1006, 1064 ); + SetStam( 259, 360 ); + SetMana( 374, 600 ); + + SetDamage( 14, 20 ); + + SetResistance( ResistanceType.Physical, 80, 90 ); + SetResistance( ResistanceType.Fire, 40, 50 ); + SetResistance( ResistanceType.Cold, 40, 50 ); + SetResistance( ResistanceType.Poison, 41, 50 ); + SetResistance( ResistanceType.Energy, 40, 49 ); + + SetSkill( SkillName.Wrestling, 120.3, 123.0 ); + SetSkill( SkillName.Tactics, 120.1, 131.8 ); + SetSkill( SkillName.MagicResist, 132.3, 165.8 ); + SetSkill( SkillName.Magery, 108.9, 119.7 ); + SetSkill( SkillName.EvalInt, 108.4, 120.0 ); + SetSkill( SkillName.Meditation, 108.9, 119.1 ); + + Fame = 21000; + Karma = -21000; + } + + // TODO: Angry fire + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.25 ) + c.DropItem( new IrksBrain() ); + + if ( Utility.RandomDouble() < 0.025 ) + c.DropItem( new PaladinGloves() ); + } + */ + + public Irk( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/LadyLissith.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/LadyLissith.cs new file mode 100644 index 000000000..97f8b8ee0 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/LadyLissith.cs @@ -0,0 +1,93 @@ +using System; +using Server.Items; +using Server.Targeting; +using System.Collections; + +namespace Server.Mobiles +{ + [CorpseName( "a Lady Lissith corpse" )] + public class LadyLissith : GiantBlackWidow + { + [Constructable] + public LadyLissith() + { + Name = "Lady Lissith"; + Hue = 0x452; + + SetStr( 81, 130 ); + SetDex( 116, 152 ); + SetInt( 44, 100 ); + + SetHits( 245, 375 ); + SetStam( 116, 152 ); + SetMana( 44, 100 ); + + SetDamage( 15, 22 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 40, 50 ); + SetResistance( ResistanceType.Fire, 31, 39 ); + SetResistance( ResistanceType.Cold, 30, 40 ); + SetResistance( ResistanceType.Poison, 71, 80 ); + SetResistance( ResistanceType.Energy, 30, 40 ); + + SetSkill( SkillName.Wrestling, 108.6, 123.0 ); + SetSkill( SkillName.Tactics, 102.7, 119.0 ); + SetSkill( SkillName.MagicResist, 78.8, 95.6 ); + SetSkill( SkillName.Anatomy, 68.6, 106.8 ); + SetSkill( SkillName.Poisoning, 96.6, 112.9 ); + + Fame = 18900; + Karma = -18900; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.BleedAttack; + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.025 ) + c.DropItem( new GreymistChest() ); + + if ( Utility.RandomDouble() < 0.45 ) + c.DropItem( new LissithsSilk() ); + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new ParrotItem() ); + } + */ + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public LadyLissith( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/LadySabrix.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/LadySabrix.cs new file mode 100644 index 000000000..3cc9a323c --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/LadySabrix.cs @@ -0,0 +1,98 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Lady Sabrix corpse" )] + public class LadySabrix : GiantBlackWidow + { + [Constructable] + public LadySabrix() + { + Name = "Lady Sabrix"; + Hue = 0x497; + + SetStr( 82, 130 ); + SetDex( 117, 146 ); + SetInt( 50, 98 ); + + SetHits( 233, 361 ); + SetStam( 117, 146 ); + SetMana( 50, 98 ); + + SetDamage( 15, 22 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 40, 50 ); + SetResistance( ResistanceType.Fire, 30, 40 ); + SetResistance( ResistanceType.Cold, 30, 39 ); + SetResistance( ResistanceType.Poison, 70, 80 ); + SetResistance( ResistanceType.Energy, 35, 44 ); + + SetSkill( SkillName.Wrestling, 109.8, 122.8 ); + SetSkill( SkillName.Tactics, 102.8, 120.0 ); + SetSkill( SkillName.MagicResist, 79.4, 95.1 ); + SetSkill( SkillName.Anatomy, 68.8, 105.1 ); + SetSkill( SkillName.Poisoning, 97.8, 116.7 ); + + Fame = 18900; + Karma = -18900; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.ArmorIgnore; + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.2 ) + c.DropItem( new SabrixsEye() ); + + if ( Utility.RandomDouble() < 0.25 ) + { + switch ( Utility.Random( 2 ) ) + { + case 0: AddToBackpack( new PaladinArms() ); break; + case 1: AddToBackpack( new HunterLegs() ); break; + } + } + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new ParrotItem() ); + } + */ + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public LadySabrix( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Malefic.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Malefic.cs new file mode 100644 index 000000000..02eefe8a9 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Malefic.cs @@ -0,0 +1,83 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Malefic corpse" )] + public class Malefic : DreadSpider + { + [Constructable] + public Malefic() + { + Name = "Malefic"; + Hue = 0x455; + + SetStr( 210, 284 ); + SetDex( 153, 197 ); + SetInt( 349, 390 ); + + SetHits( 600, 747 ); + SetStam( 153, 197 ); + SetMana( 349, 390 ); + + SetDamage( 15, 22 ); + + SetDamageType( ResistanceType.Physical, 20 ); + SetDamageType( ResistanceType.Poison, 80 ); + + SetResistance( ResistanceType.Physical, 60, 70 ); + SetResistance( ResistanceType.Fire, 40, 50 ); + SetResistance( ResistanceType.Cold, 40, 49 ); + SetResistance( ResistanceType.Poison, 100 ); + SetResistance( ResistanceType.Energy, 41, 48 ); + + SetSkill( SkillName.Wrestling, 96.9, 112.4 ); + SetSkill( SkillName.Tactics, 91.3, 105.4 ); + SetSkill( SkillName.MagicResist, 79.8, 95.1 ); + SetSkill( SkillName.Magery, 103.0, 118.6 ); + SetSkill( SkillName.EvalInt, 105.7, 119.6 ); + SetSkill( SkillName.Meditation, 0 ); + + Fame = 21000; + Karma = -21000; + + /* + // TODO: uncomment once added + if ( Utility.RandomDouble() < 0.1 ) + PackItem( new ParrotItem() ); + */ + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 4 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.Dismount; + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public Malefic( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Silk.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Silk.cs new file mode 100644 index 000000000..1cb805623 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Silk.cs @@ -0,0 +1,77 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Silk corpse" )] + public class Silk : GiantBlackWidow + { + [Constructable] + public Silk() + { + Name = "Silk"; + Hue = 0x47E; + + SetStr( 80, 131 ); + SetDex( 126, 156 ); + SetInt( 63, 102 ); + + SetHits( 279, 378 ); + SetStam( 126, 156 ); + SetMana( 63, 102 ); + + SetDamage( 15, 22 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 40, 50 ); + SetResistance( ResistanceType.Fire, 30, 39 ); + SetResistance( ResistanceType.Cold, 30, 40 ); + SetResistance( ResistanceType.Poison, 70, 76 ); + SetResistance( ResistanceType.Energy, 30, 40 ); + + SetSkill( SkillName.Wrestling, 114.1, 123.7 ); + SetSkill( SkillName.Tactics, 102.6, 118.3 ); + SetSkill( SkillName.MagicResist, 78.6, 94.8 ); + SetSkill( SkillName.Anatomy, 81.3, 105.7 ); + SetSkill( SkillName.Poisoning, 106.0, 119.2 ); + + Fame = 18900; + Karma = -18900; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.ParalyzingBlow; + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override Poison PoisonImmune{ get{ return Poison.Lethal; } } + public override Poison HitPoison{ get{ return Poison.Lethal; } } + + public Silk( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Spite.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Spite.cs new file mode 100644 index 000000000..beea7c3d0 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Spite.cs @@ -0,0 +1,71 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Spite corpse" )] + public class Spite : Changeling + { + public override string DefaultName{ get{ return "Spite"; } } + public override int DefaultHue{ get{ return 0x21; } } + + [Constructable] + public Spite() + { + SetStr( 53, 214 ); + SetDex( 243, 367 ); + SetInt( 369, 586 ); + + SetHits( 1013, 1052 ); + SetStam( 243, 367 ); + SetMana( 369, 586 ); + + SetDamage( 14, 20 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 85, 90 ); + SetResistance( ResistanceType.Fire, 41, 46 ); + SetResistance( ResistanceType.Cold, 40, 44 ); + SetResistance( ResistanceType.Poison, 42, 46 ); + SetResistance( ResistanceType.Energy, 45, 47 ); + + SetSkill( SkillName.Wrestling, 12.8, 16.7 ); + SetSkill( SkillName.Tactics, 102.6, 131.0 ); + SetSkill( SkillName.MagicResist, 141.2, 161.6 ); + SetSkill( SkillName.Magery, 108.4, 119.2 ); + SetSkill( SkillName.EvalInt, 108.4, 120.0 ); + SetSkill( SkillName.Meditation, 109.2, 120.0 ); + + Fame = 21000; + Karma = -21000; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 3 ); + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public Spite( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Swoop.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Swoop.cs new file mode 100644 index 000000000..b3f159834 --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Swoop.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections; +using Server.Items; +using Server.Mobiles; + +namespace Server.Mobiles +{ + [CorpseName( "a Swoop corpse" )] + public class Swoop : Eagle + { + [Constructable] + public Swoop() + { + Name = "Swoop"; + Hue = 0xE0; + + SetStr( 100, 150 ); + SetDex( 400, 500 ); + SetInt( 80, 90 ); + + SetHits( 1500, 2000 ); + + SetDamage( 20, 30 ); + + SetDamageType( ResistanceType.Physical, 100 ); + + SetResistance( ResistanceType.Physical, 75, 90 ); + SetResistance( ResistanceType.Fire, 60, 77 ); + SetResistance( ResistanceType.Cold, 70, 85 ); + SetResistance( ResistanceType.Poison, 55, 85 ); + SetResistance( ResistanceType.Energy, 50, 60 ); + + SetSkill( SkillName.Wrestling, 120.0, 140.0 ); + SetSkill( SkillName.Tactics, 120.0, 140.0 ); + SetSkill( SkillName.MagicResist, 95.0, 105.0 ); + + Fame = 18000; + Karma = -18000; + + Tamable = false; + + PackReg( 4 ); + PackArcaneScroll( 0, 1 ); + } + + public override void GenerateLoot() + { + AddLoot( LootPack.UltraRich, 3 ); + } + + // TODO: Put this attack shared with Hiryu and Lesser Hiryu in one place + public override void OnGaveMeleeAttack( Mobile defender ) + { + base.OnGaveMeleeAttack( defender ); + + if( 0.1 > Utility.RandomDouble() ) + { + ExpireTimer timer = (ExpireTimer)m_Table[defender]; + + if( timer != null ) + { + timer.DoExpire(); + defender.SendLocalizedMessage( 1070837 ); // The creature lands another blow in your weakened state. + } + else + defender.SendLocalizedMessage( 1070836 ); // The blow from the creature's claws has made you more susceptible to physical attacks. + + int effect = -(defender.PhysicalResistance * 15 / 100); + + ResistanceMod mod = new ResistanceMod( ResistanceType.Physical, effect ); + + defender.FixedEffect( 0x37B9, 10, 5 ); + defender.AddResistanceMod( mod ); + + timer = new ExpireTimer( defender, mod, TimeSpan.FromSeconds( 5.0 ) ); + timer.Start(); + m_Table[defender] = timer; + } + } + + private static Hashtable m_Table = new Hashtable(); + + private class ExpireTimer : Timer + { + private Mobile m_Mobile; + private ResistanceMod m_Mod; + + public ExpireTimer( Mobile m, ResistanceMod mod, TimeSpan delay ) + : base( delay ) + { + m_Mobile = m; + m_Mod = mod; + Priority = TimerPriority.TwoFiftyMS; + } + + public void DoExpire() + { + m_Mobile.RemoveResistanceMod( m_Mod ); + Stop(); + m_Table.Remove( m_Mobile ); + } + + protected override void OnTick() + { + m_Mobile.SendLocalizedMessage( 1070838 ); // Your resistance to physical attacks has returned. + DoExpire(); + } + } + + public override bool GivesMLMinorArtifact{ get{ return true; } } + public override int Feathers{ get{ return 72; } } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.025 ) + { + switch ( Utility.Random( 18 ) ) + { + case 0: c.DropItem( new AssassinChest() ); break; + case 1: c.DropItem( new AssassinArms() ); break; + case 2: c.DropItem( new DeathChest() ); break; + case 3: c.DropItem( new MyrmidonArms() ); break; + case 4: c.DropItem( new MyrmidonLegs() ); break; + case 5: c.DropItem( new MyrmidonGorget() ); break; + case 6: c.DropItem( new LeafweaveGloves() ); break; + case 7: c.DropItem( new LeafweaveLegs() ); break; + case 8: c.DropItem( new LeafweavePauldrons() ); break; + case 9: c.DropItem( new PaladinGloves() ); break; + case 10: c.DropItem( new PaladinGorget() ); break; + case 11: c.DropItem( new PaladinArms() ); break; + case 12: c.DropItem( new HunterArms() ); break; + case 13: c.DropItem( new HunterGloves() ); break; + case 14: c.DropItem( new HunterLegs() ); break; + case 15: c.DropItem( new HunterChest() ); break; + case 16: c.DropItem( new GreymistArms() ); break; + case 17: c.DropItem( new GreymistGloves() ); break; + } + } + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new ParrotItem() ); + } + */ + + public Swoop( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/ML/Twisted Weald/Virulent.cs b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Virulent.cs new file mode 100644 index 000000000..eae0d3f1c --- /dev/null +++ b/Scripts/Mobiles/Monsters/ML/Twisted Weald/Virulent.cs @@ -0,0 +1,97 @@ +using System; +using Server; +using Server.Items; + +namespace Server.Mobiles +{ + [CorpseName( "a Virulent corpse" )] + public class Virulent : DreadSpider + { + [Constructable] + public Virulent() + { + Name = "Virulent"; + Hue = 0x8FD; + + SetStr( 207, 252 ); + SetDex( 156, 194 ); + SetInt( 346, 398 ); + + SetHits( 616, 740 ); + SetStam( 156, 194 ); + SetMana( 346, 398 ); + + SetDamage( 15, 22 ); + + SetDamageType( ResistanceType.Physical, 20 ); + SetDamageType( ResistanceType.Poison, 80 ); + + SetResistance( ResistanceType.Physical, 60, 68 ); + SetResistance( ResistanceType.Fire, 40, 49 ); + SetResistance( ResistanceType.Cold, 41, 50 ); + SetResistance( ResistanceType.Poison, 100 ); + SetResistance( ResistanceType.Energy, 40, 49 ); + + SetSkill( SkillName.Wrestling, 92.8, 111.7 ); + SetSkill( SkillName.Tactics, 91.6, 107.4 ); + SetSkill( SkillName.MagicResist, 78.1, 93.3 ); + SetSkill( SkillName.Poisoning, 120.0 ); + SetSkill( SkillName.Magery, 104.2, 119.8 ); + SetSkill( SkillName.EvalInt, 102.8, 117.8 ); + + Fame = 21000; + Karma = -21000; + } + + public override void GenerateLoot() + { + AddLoot( LootPack.AosUltraRich, 4 ); + } + + public override WeaponAbility GetWeaponAbility() + { + return WeaponAbility.MortalStrike; + } + + /* + // TODO: uncomment once added + public override void OnDeath( Container c ) + { + base.OnDeath( c ); + + if ( Utility.RandomDouble() < 0.025 ) + { + switch ( Utility.Random( 2 ) ) + { + case 0: c.DropItem( new HunterLegs() ); break; + case 1: c.DropItem( new MalekisHonor() ); break; + } + } + + if ( Utility.RandomDouble() < 0.1 ) + c.DropItem( new ParrotItem() ); + } + */ + + public override bool GivesMLMinorArtifact{ get{ return true; } } + + public Virulent( Serial serial ) + : base( serial ) + { + } + + public override void Serialize( GenericWriter writer ) + { + base.Serialize( writer ); + + writer.Write( (int) 0 ); // version + } + + public override void Deserialize( GenericReader reader ) + { + base.Deserialize( reader ); + + int version = reader.ReadInt(); + } + } +} diff --git a/Scripts/Mobiles/Monsters/Reptile/Magic/SkeletalDragon.cs b/Scripts/Mobiles/Monsters/Reptile/Magic/SkeletalDragon.cs index 135e66554..c9d2b9381 100644 --- a/Scripts/Mobiles/Monsters/Reptile/Magic/SkeletalDragon.cs +++ b/Scripts/Mobiles/Monsters/Reptile/Magic/SkeletalDragon.cs @@ -36,6 +36,8 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 100.3, 130.0 ); SetSkill( SkillName.Tactics, 97.6, 100.0 ); SetSkill( SkillName.Wrestling, 97.6, 100.0 ); + SetSkill( SkillName.Necromancy, 120.1, 130.0 ); + SetSkill( SkillName.SpiritSpeak, 120.1, 130.0 ); Fame = 22500; Karma = -22500; diff --git a/Scripts/Mobiles/Monsters/SE/Kappa.cs b/Scripts/Mobiles/Monsters/SE/Kappa.cs index 0c00524d0..1e0e5d964 100644 --- a/Scripts/Mobiles/Monsters/SE/Kappa.cs +++ b/Scripts/Mobiles/Monsters/SE/Kappa.cs @@ -212,7 +212,7 @@ namespace Server.Mobiles { DrainLife( m_Mobile, m_From ); - if ( ++m_Count == 5 ) + if ( Running && ++m_Count == 5 ) EndLifeDrain( m_Mobile ); } } diff --git a/Scripts/Mobiles/Monsters/SE/LadyOfTheSnow.cs b/Scripts/Mobiles/Monsters/SE/LadyOfTheSnow.cs index 40d84d118..f2d9b8248 100644 --- a/Scripts/Mobiles/Monsters/SE/LadyOfTheSnow.cs +++ b/Scripts/Mobiles/Monsters/SE/LadyOfTheSnow.cs @@ -37,6 +37,8 @@ namespace Server.Mobiles SetSkill( SkillName.MagicResist, 90.1, 105.0 ); SetSkill( SkillName.Tactics, 80.1, 100.0 ); SetSkill( SkillName.Wrestling, 80.1, 100.0 ); + SetSkill( SkillName.Necromancy, 90, 110.0 ); + SetSkill( SkillName.SpiritSpeak, 90.0, 110.0 ); Fame = 15200; Karma = -15200; diff --git a/Scripts/Skills/Meditation.cs b/Scripts/Skills/Meditation.cs index 95ee6d3b1..6a39b0b68 100644 --- a/Scripts/Skills/Meditation.cs +++ b/Scripts/Skills/Meditation.cs @@ -60,7 +60,7 @@ namespace Server.SkillHandlers Item oneHanded = m.FindItemOnLayer( Layer.OneHanded ); Item twoHanded = m.FindItemOnLayer( Layer.TwoHanded ); - if ( Core.AOS ) + if ( Core.AOS && m.Player ) { if ( !CheckOkayHolding( oneHanded ) ) m.AddToBackpack( oneHanded ); diff --git a/Scripts/Spells/Base/Spell.cs b/Scripts/Spells/Base/Spell.cs index c9155be1e..a6d5166cc 100644 --- a/Scripts/Spells/Base/Spell.cs +++ b/Scripts/Spells/Base/Spell.cs @@ -522,7 +522,7 @@ namespace Server.Spells TimeSpan castDelay = this.GetCastDelay(); - if ( ShowHandMovement && m_Caster.Body.IsHuman ) + if ( ShowHandMovement && ( m_Caster.Body.IsHuman || ( m_Caster.Player && m_Caster.Body.IsMonster ) ) ) { int count = (int)Math.Ceiling( castDelay.TotalSeconds / AnimateDelay.TotalSeconds ); @@ -857,8 +857,13 @@ namespace Server.Spells return; } - if ( !m_Spell.Caster.Mounted && m_Spell.Caster.Body.IsHuman && m_Spell.m_Info.Action >= 0 ) - m_Spell.Caster.Animate( m_Spell.m_Info.Action, 7, 1, true, false, 0 ); + if ( !m_Spell.Caster.Mounted && m_Spell.m_Info.Action >= 0 ) + { + if ( m_Spell.Caster.Body.IsHuman ) + m_Spell.Caster.Animate( m_Spell.m_Info.Action, 7, 1, true, false, 0 ); + else if ( m_Spell.Caster.Player && m_Spell.Caster.Body.IsMonster ) + m_Spell.Caster.Animate( 12, 7, 1, true, false, 0 ); + } if ( !Running ) m_Spell.m_AnimTimer = null; diff --git a/Scripts/Spells/Chivalry/HolyLight.cs b/Scripts/Spells/Chivalry/HolyLight.cs index 070c67132..212ed0542 100644 --- a/Scripts/Spells/Chivalry/HolyLight.cs +++ b/Scripts/Spells/Chivalry/HolyLight.cs @@ -35,7 +35,7 @@ namespace Server.Spells.Chivalry List targets = new List(); foreach ( Mobile m in Caster.GetMobilesInRange( 3 ) ) - if ( Caster != m && SpellHelper.ValidIndirectTarget( Caster, m ) && Caster.CanBeHarmful( m, false ) ) + if ( Caster != m && SpellHelper.ValidIndirectTarget( Caster, m ) && Caster.CanBeHarmful( m, false ) && ( !Core.AOS || Caster.InLOS( m ) ) ) targets.Add( m ); Caster.PlaySound( 0x212 ); diff --git a/Scripts/Spells/Necromancy/AnimateDeadSpell.cs b/Scripts/Spells/Necromancy/AnimateDeadSpell.cs index f1b3a901a..c6c24ff39 100644 --- a/Scripts/Spells/Necromancy/AnimateDeadSpell.cs +++ b/Scripts/Spells/Necromancy/AnimateDeadSpell.cs @@ -68,7 +68,7 @@ namespace Server.Spells.Necromancy bool contains = ( types.Length == 0 ); for ( int j = 0; !contains && j < types.Length; ++j ) - contains = ( types[j] == type ); + contains = types[j].IsAssignableFrom( type ); if ( contains ) return group; diff --git a/Scripts/Spells/Necromancy/Wither.cs b/Scripts/Spells/Necromancy/Wither.cs index 7d16b8d00..210291f61 100644 --- a/Scripts/Spells/Necromancy/Wither.cs +++ b/Scripts/Spells/Necromancy/Wither.cs @@ -43,9 +43,31 @@ namespace Server.Spells.Necromancy { List targets = new List(); + BaseCreature cbc = Caster as BaseCreature; + bool isMonster = ( cbc != null && !cbc.Controlled && !cbc.Summoned ); + foreach( Mobile m in Caster.GetMobilesInRange( Core.ML ? 4 : 5 ) ) - if( Caster != m && Caster.InLOS( m ) && SpellHelper.ValidIndirectTarget( Caster, m ) && Caster.CanBeHarmful( m, false ) ) + { + if( Caster != m && Caster.InLOS( m ) && ( isMonster || SpellHelper.ValidIndirectTarget( Caster, m ) ) && Caster.CanBeHarmful( m, false ) ) + { + if ( isMonster ) + { + if ( m is BaseCreature ) + { + BaseCreature bc = (BaseCreature)m; + + if ( !bc.Controlled && !bc.Summoned && bc.Team == cbc.Team ) + continue; + } + else if ( !m.Player ) + { + continue; + } + } + targets.Add( m ); + } + } Effects.PlaySound( Caster.Location, map, 0x1FB ); Effects.PlaySound( Caster.Location, map, 0x10B );