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