- 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.
This commit is contained in:
eos 2012-03-04 05:01:41 +00:00
parent a1b906f921
commit 287bacac0e
46 changed files with 2154 additions and 53 deletions

View file

@ -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<string> SpawnNames
{
get { return m_SpawnNames; }
@ -55,7 +55,7 @@ namespace Server.Mobiles
s.m_SpawnNames = new List<string>( m_SpawnNames );
s.m_Spawned = new List<ISpawnable>();
}
[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<ISpawnable>();
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<string, int> counts = new Dictionary<string, int>();
foreach ( ISpawnable spawned in m_Spawned )
{
string name = spawned.GetType().Name;
if ( counts.ContainsKey( name ) )
++counts[name];
else
counts[name] = 1;
}
List<string> names = new List<string>( counts.Keys );
names.Sort();
StringBuilder result = new StringBuilder();
for ( int i = 0; i < names.Count; ++i )
result.AppendFormat( "{0}{1}: {2}", ( i == 0 ) ? "" : "<BR>", 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<string>( size );

View file

@ -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;
}

View file

@ -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 ) ),

View file

@ -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 );

View file

@ -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
{

View file

@ -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 )
{

View file

@ -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[]

View file

@ -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 )
{

View file

@ -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<Mobile> list = new List<Mobile>();
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()

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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 );

View file

@ -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 )

View file

@ -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<Mobile> list = new List<Mobile>();
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 )

View file

@ -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()
{

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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 );

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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<Changeling> m_ToRevert;
public static void Configure()
{
m_ToRevert = new List<Changeling>();
}
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();
}
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}
}
}

View file

@ -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;

View file

@ -212,7 +212,7 @@ namespace Server.Mobiles
{
DrainLife( m_Mobile, m_From );
if ( ++m_Count == 5 )
if ( Running && ++m_Count == 5 )
EndLifeDrain( m_Mobile );
}
}

View file

@ -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;

View file

@ -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 );

View file

@ -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;

View file

@ -35,7 +35,7 @@ namespace Server.Spells.Chivalry
List<Mobile> targets = new List<Mobile>();
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 );

View file

@ -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;

View file

@ -43,9 +43,31 @@ namespace Server.Spells.Necromancy
{
List<Mobile> targets = new List<Mobile>();
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 );