RunUO/Scripts/Items/Traps/BaseTrap.cs

100 lines
2.7 KiB
C#

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