using System; namespace Server.Items { public abstract class BaseTrap : Item { public virtual bool PassivelyTriggered{ get{ return false; } } public virtual TimeSpan PassiveTriggerDelay{ get{ return TimeSpan.Zero; } } public virtual int PassiveTriggerRange{ get{ return -1; } } public virtual TimeSpan ResetDelay{ get{ return TimeSpan.Zero; } } private DateTime m_NextPassiveTrigger, m_NextActiveTrigger; public virtual void OnTrigger( Mobile from ) { } public override bool HandlesOnMovement{ get{ return true; } } public virtual int GetEffectHue() { int hue = this.Hue & 0x3FFF; if ( hue < 2 ) return 0; return hue - 1; } public bool CheckRange( Point3D loc, Point3D oldLoc, int range ) { return CheckRange( loc, range ) && !CheckRange( oldLoc, range ); } public bool CheckRange( Point3D loc, int range ) { return ( (this.Z + 8) >= loc.Z && (loc.Z + 16) > this.Z ) && Utility.InRange( GetWorldLocation(), loc, range ); } public override void OnMovement( Mobile m, Point3D oldLocation ) { base.OnMovement( m, oldLocation ); if ( m.Location == oldLocation ) return; bool activeTrigger = CheckRange( m.Location, oldLocation, 0 ) && DateTime.UtcNow >= m_NextActiveTrigger; bool passiveTrigger = !activeTrigger && PassivelyTriggered && CheckRange( m.Location, oldLocation, PassiveTriggerRange ) && DateTime.UtcNow >= m_NextPassiveTrigger; if ( activeTrigger || passiveTrigger ) { if ( m.Alive && m.AccessLevel == AccessLevel.Player ) { // m.CheckSkill parameters: (SkillName, Minimum Skill to attempt, Maximum Skill to gain) // This single line calculates their dodge chance AND tells the server to roll for a skill gain! if ( m.CheckSkill( SkillName.RemoveTrap, 0.0, 120.0 ) ) { m.SendMessage( 63, "You notice a hidden trap and carefully step around it." ); return; } } if ( activeTrigger ) { m_NextActiveTrigger = m_NextPassiveTrigger = DateTime.UtcNow + ResetDelay; OnTrigger( m ); } else if ( passiveTrigger ) { m_NextPassiveTrigger = DateTime.UtcNow + PassiveTriggerDelay; OnTrigger( m ); } } } public BaseTrap( int itemID ) : base( itemID ) { Movable = false; } public BaseTrap( 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(); } } }