Convert movement, actions (lift/use), combat, and spells to use Core.TickCount and avoid DateTime caveats (performance, system time dependency, etc) Refactor DateTime.Now to DateTime.UtcNow Add LOS check for Iron Maiden addon
226 lines
No EOL
7.1 KiB
C#
226 lines
No EOL
7.1 KiB
C#
using System;
|
|
using Server.Misc;
|
|
using Server.Network;
|
|
using System.Collections.Generic;
|
|
using Server.Mobiles;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public class DeceitBrazier : Item
|
|
{
|
|
private static Type[] m_Creatures = new Type[]
|
|
{
|
|
#region Animals
|
|
typeof( FireSteed ), //Set the tents up people!
|
|
#endregion
|
|
|
|
#region Undead
|
|
typeof( Skeleton ), typeof( SkeletalKnight ), typeof( SkeletalMage ), typeof( Mummy ),
|
|
typeof( BoneKnight ), typeof( Lich ), typeof( LichLord ), typeof( BoneMagi ),
|
|
typeof( Wraith ), typeof( Shade ), typeof( Spectre ), typeof( Zombie ),
|
|
typeof( RottingCorpse ), typeof( Ghoul ),
|
|
#endregion
|
|
|
|
#region Demons
|
|
typeof( Balron ), typeof( Daemon ), typeof( Imp ), typeof( GreaterMongbat ),
|
|
typeof( Mongbat ), typeof( IceFiend ), typeof( Gargoyle ), typeof( StoneGargoyle ),
|
|
typeof( FireGargoyle ), typeof( HordeMinion ),
|
|
#endregion
|
|
|
|
#region Gazers
|
|
typeof( Gazer ), typeof( ElderGazer ), typeof( GazerLarva ),
|
|
#endregion
|
|
|
|
#region Uncategorized
|
|
typeof( Harpy ), typeof( StoneHarpy ), typeof( HeadlessOne ), typeof( HellHound ),
|
|
typeof( HellCat ), typeof( Phoenix ), typeof( LavaLizard ), typeof( SandVortex ),
|
|
typeof( ShadowWisp ), typeof( SwampTentacle ), typeof( PredatorHellCat ), typeof( Wisp ),
|
|
#endregion
|
|
|
|
#region Arachnid
|
|
typeof( GiantSpider ), typeof( DreadSpider ), typeof( FrostSpider ), typeof( Scorpion ),
|
|
#endregion
|
|
|
|
#region Repond
|
|
typeof( ArcticOgreLord ), typeof( Cyclops ), typeof( Ettin ), typeof( EvilMage ),
|
|
typeof( FrostTroll ), typeof( Ogre ), typeof( OgreLord ), typeof( Orc ),
|
|
typeof( OrcishLord ), typeof( OrcishMage ), typeof( OrcBrute ), typeof( Ratman ),
|
|
typeof( RatmanMage ), typeof( OrcCaptain ), typeof( Troll ), typeof( Titan ),
|
|
typeof( EvilMageLord ), typeof( OrcBomber ), typeof( RatmanArcher ),
|
|
#endregion
|
|
|
|
#region Reptilian
|
|
typeof( Dragon ), typeof( Drake ), typeof( Snake ), typeof( GreaterDragon ),
|
|
typeof( IceSerpent ), typeof( GiantSerpent ), typeof( IceSnake ), typeof( LavaSerpent ),
|
|
typeof( Lizardman ), typeof( Wyvern ), typeof( WhiteWyrm ),
|
|
typeof( ShadowWyrm ), typeof( SilverSerpent ), typeof( LavaSnake ),
|
|
#endregion
|
|
|
|
#region Elementals
|
|
typeof( EarthElemental ), typeof( PoisonElemental ), typeof( FireElemental ), typeof( SnowElemental ),
|
|
typeof( IceElemental ), typeof( AcidElemental ), typeof( WaterElemental ), typeof( Efreet ),
|
|
typeof( AirElemental ), typeof( Golem ),
|
|
#endregion
|
|
|
|
#region Random Critters
|
|
typeof( Sewerrat ), typeof( GiantRat ), typeof( DireWolf ), typeof( TimberWolf ),
|
|
typeof( Cougar ), typeof( Alligator )
|
|
#endregion
|
|
};
|
|
|
|
public static Type[] Creatures { get { return m_Creatures; } }
|
|
|
|
private Timer m_Timer;
|
|
private DateTime m_NextSpawn;
|
|
private int m_SpawnRange;
|
|
private TimeSpan m_NextSpawnDelay;
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public DateTime NextSpawn { get { return m_NextSpawn; } }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public int SpawnRange { get { return m_SpawnRange; } set { m_SpawnRange = value; } }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public TimeSpan NextSpawnDelay { get { return m_NextSpawnDelay; } set { m_NextSpawnDelay = value; } }
|
|
|
|
public override int LabelNumber { get { return 1023633; } } // Brazier
|
|
|
|
[Constructable]
|
|
public DeceitBrazier() : base( 0xE31 )
|
|
{
|
|
Movable = false;
|
|
Light = LightType.Circle225;
|
|
m_NextSpawn = DateTime.UtcNow;
|
|
m_NextSpawnDelay = TimeSpan.FromMinutes( 15.0 );
|
|
m_SpawnRange = 5;
|
|
}
|
|
|
|
public DeceitBrazier( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.Write( (int)0 ); // version
|
|
|
|
writer.Write( (int)m_SpawnRange );
|
|
writer.Write( m_NextSpawnDelay );
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
if( version >= 0 )
|
|
{
|
|
m_SpawnRange = reader.ReadInt();
|
|
m_NextSpawnDelay = reader.ReadTimeSpan();
|
|
}
|
|
|
|
m_NextSpawn = DateTime.UtcNow;
|
|
}
|
|
|
|
public virtual void HeedWarning()
|
|
{
|
|
PublicOverheadMessage( MessageType.Regular, 0x3B2, 500761 );// Heed this warning well, and use this brazier at your own peril.
|
|
}
|
|
|
|
public override bool HandlesOnMovement { get { return true; } }
|
|
|
|
public override void OnMovement( Mobile m, Point3D oldLocation )
|
|
{
|
|
if( m_NextSpawn < DateTime.UtcNow ) // means we haven't spawned anything if the next spawn is below
|
|
{
|
|
if( Utility.InRange( m.Location, Location, 1 ) && !Utility.InRange( oldLocation, Location, 1 ) && m.Player && !(m.AccessLevel > AccessLevel.Player || m.Hidden) )
|
|
{
|
|
if( m_Timer == null || !m_Timer.Running )
|
|
m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 2 ), new TimerCallback( HeedWarning ) );
|
|
}
|
|
}
|
|
|
|
base.OnMovement( m, oldLocation );
|
|
}
|
|
|
|
public Point3D GetSpawnPosition()
|
|
{
|
|
Map map = Map;
|
|
|
|
if( map == null )
|
|
return Location;
|
|
|
|
// Try 10 times to find a Spawnable location.
|
|
for( int i = 0; i < 10; i++ )
|
|
{
|
|
int x = Location.X + (Utility.Random( (m_SpawnRange * 2) + 1 ) - m_SpawnRange);
|
|
int y = Location.Y + (Utility.Random( (m_SpawnRange * 2) + 1 ) - m_SpawnRange);
|
|
int z = Map.GetAverageZ( x, y );
|
|
|
|
if( Map.CanSpawnMobile( new Point2D( x, y ), this.Z ) )
|
|
return new Point3D( x, y, this.Z );
|
|
else if( Map.CanSpawnMobile( new Point2D( x, y ), z ) )
|
|
return new Point3D( x, y, z );
|
|
}
|
|
|
|
return this.Location;
|
|
}
|
|
|
|
public virtual void DoEffect( Point3D loc, Map map )
|
|
{
|
|
Effects.SendLocationParticles( EffectItem.Create( loc, map, EffectItem.DefaultDuration ), 0x3709, 10, 30, 5052 );
|
|
Effects.PlaySound( loc, map, 0x225 );
|
|
}
|
|
|
|
public override void OnDoubleClick( Mobile from )
|
|
{
|
|
if( Utility.InRange( from.Location, Location, 2 ) )
|
|
{
|
|
try
|
|
{
|
|
if( m_NextSpawn < DateTime.UtcNow )
|
|
{
|
|
Map map = this.Map;
|
|
BaseCreature bc = (BaseCreature)Activator.CreateInstance( m_Creatures[Utility.Random( m_Creatures.Length )] );
|
|
|
|
if( bc != null )
|
|
{
|
|
Point3D spawnLoc = GetSpawnPosition();
|
|
|
|
DoEffect( spawnLoc, map );
|
|
|
|
Timer.DelayCall( TimeSpan.FromSeconds( 1 ), delegate()
|
|
{
|
|
bc.Home = Location;
|
|
bc.RangeHome = m_SpawnRange;
|
|
bc.FightMode = FightMode.Closest;
|
|
|
|
bc.MoveToWorld( spawnLoc, map );
|
|
|
|
DoEffect( spawnLoc, map );
|
|
|
|
bc.ForceReacquire();
|
|
} );
|
|
|
|
m_NextSpawn = DateTime.UtcNow + m_NextSpawnDelay;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PublicOverheadMessage( MessageType.Regular, 0x3B2, 500760 ); // The brazier fizzes and pops, but nothing seems to happen.
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage( 500446 ); // That is too far away.
|
|
}
|
|
}
|
|
}
|
|
} |