AvatarsConquest/Scripts/Items/Misc/Teleporter.cs

517 lines
No EOL
12 KiB
C#

using System;
using Server;
using Server.Network;
using Server.Spells;
namespace Server.Items
{
public class Teleporter : Item
{
private bool m_Active, m_Creatures, m_CombatCheck;
private Point3D m_PointDest;
private Map m_MapDest;
private bool m_SourceEffect;
private bool m_DestEffect;
private int m_SoundID;
private TimeSpan m_Delay;
[CommandProperty( AccessLevel.GameMaster )]
public bool SourceEffect
{
get{ return m_SourceEffect; }
set{ m_SourceEffect = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool DestEffect
{
get{ return m_DestEffect; }
set{ m_DestEffect = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int SoundID
{
get{ return m_SoundID; }
set{ m_SoundID = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public TimeSpan Delay
{
get{ return m_Delay; }
set{ m_Delay = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Active
{
get { return m_Active; }
set { m_Active = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public Point3D PointDest
{
get { return m_PointDest; }
set { m_PointDest = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public Map MapDest
{
get { return m_MapDest; }
set { m_MapDest = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool Creatures
{
get { return m_Creatures; }
set { m_Creatures = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public bool CombatCheck
{
get { return m_CombatCheck; }
set { m_CombatCheck = value; InvalidateProperties(); }
}
public override int LabelNumber{ get{ return 1026095; } } // teleporter
[Constructable]
public Teleporter() : this( new Point3D( 0, 0, 0 ), null, false )
{
}
[Constructable]
public Teleporter( Point3D pointDest, Map mapDest ) : this( pointDest, mapDest, false )
{
}
[Constructable]
public Teleporter( Point3D pointDest, Map mapDest, bool creatures ) : base( 0x1BC3 )
{
Movable = false;
Visible = false;
m_Active = true;
m_PointDest = pointDest;
m_MapDest = mapDest;
m_Creatures = creatures;
m_CombatCheck = false;
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_Active )
list.Add( 1060742 ); // active
else
list.Add( 1060743 ); // inactive
if ( m_MapDest != null )
list.Add( 1060658, "Map\t{0}", m_MapDest );
if ( m_PointDest != Point3D.Zero )
list.Add( 1060659, "Coords\t{0}", m_PointDest );
list.Add( 1060660, "Creatures\t{0}", m_Creatures ? "Yes" : "No" );
}
public override void OnSingleClick( Mobile from )
{
base.OnSingleClick( from );
if ( m_Active )
{
if ( m_MapDest != null && m_PointDest != Point3D.Zero )
LabelTo( from, "{0} [{1}]", m_PointDest, m_MapDest );
else if ( m_MapDest != null )
LabelTo( from, "[{0}]", m_MapDest );
else if ( m_PointDest != Point3D.Zero )
LabelTo( from, m_PointDest.ToString() );
}
else
{
LabelTo( from, "(inactive)" );
}
}
public virtual void StartTeleport( Mobile m )
{
if ( m_Delay == TimeSpan.Zero )
DoTeleport( m );
else
Timer.DelayCall( m_Delay, new TimerStateCallback( DoTeleport_Callback ), m );
}
private void DoTeleport_Callback( object state )
{
DoTeleport( (Mobile) state );
}
public virtual void DoTeleport( Mobile m )
{
Map map = m_MapDest;
if ( map == null || map == Map.Internal )
map = m.Map;
Point3D p = m_PointDest;
if ( p == Point3D.Zero )
p = m.Location;
Server.Mobiles.BaseCreature.TeleportPets( m, p, map );
bool sendEffect = ( !m.Hidden || m.AccessLevel == AccessLevel.Player );
if ( m_SourceEffect && sendEffect )
Effects.SendLocationEffect( m.Location, m.Map, 0x3728, 10, 10 );
m.MoveToWorld( p, map );
if ( m_DestEffect && sendEffect )
Effects.SendLocationEffect( m.Location, m.Map, 0x3728, 10, 10 );
if ( m_SoundID > 0 && sendEffect )
Effects.PlaySound( m.Location, m.Map, m_SoundID );
}
public override bool OnMoveOver( Mobile m )
{
if ( m_Active )
{
if ( !m_Creatures && !m.Player )
return true;
else if ( m_CombatCheck && SpellHelper.CheckCombat( m ) )
{
m.SendLocalizedMessage( 1005564, "", 0x22 ); // Wouldst thou flee during the heat of battle??
return true;
}
StartTeleport( m );
return false;
}
return true;
}
public Teleporter( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 3 ); // version
writer.Write( (bool) m_CombatCheck );
writer.Write( (bool) m_SourceEffect );
writer.Write( (bool) m_DestEffect );
writer.Write( (TimeSpan) m_Delay );
writer.WriteEncodedInt( (int) m_SoundID );
writer.Write( m_Creatures );
writer.Write( m_Active );
writer.Write( m_PointDest );
writer.Write( m_MapDest );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 3:
{
m_CombatCheck = reader.ReadBool();
goto case 2;
}
case 2:
{
m_SourceEffect = reader.ReadBool();
m_DestEffect = reader.ReadBool();
m_Delay = reader.ReadTimeSpan();
m_SoundID = reader.ReadEncodedInt();
goto case 1;
}
case 1:
{
m_Creatures = reader.ReadBool();
goto case 0;
}
case 0:
{
m_Active = reader.ReadBool();
m_PointDest = reader.ReadPoint3D();
m_MapDest = reader.ReadMap();
break;
}
}
}
}
public class SkillTeleporter : Teleporter
{
private SkillName m_Skill;
private double m_Required;
private string m_MessageString;
private int m_MessageNumber;
[CommandProperty( AccessLevel.GameMaster )]
public SkillName Skill
{
get{ return m_Skill; }
set{ m_Skill = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public double Required
{
get{ return m_Required; }
set{ m_Required = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public string MessageString
{
get{ return m_MessageString; }
set{ m_MessageString = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int MessageNumber
{
get{ return m_MessageNumber; }
set{ m_MessageNumber = value; InvalidateProperties(); }
}
private void EndMessageLock( object state )
{
((Mobile)state).EndAction( this );
}
public override bool OnMoveOver( Mobile m )
{
if ( Active )
{
if ( !Creatures && !m.Player )
return true;
Skill sk = m.Skills[m_Skill];
if ( sk == null || sk.Base < m_Required )
{
if ( m.BeginAction( this ) )
{
if ( m_MessageString != null )
m.Send( new UnicodeMessage( Serial, ItemID, MessageType.Regular, 0x3B2, 3, "ENU", null, m_MessageString ) );
else if ( m_MessageNumber != 0 )
m.Send( new MessageLocalized( Serial, ItemID, MessageType.Regular, 0x3B2, 3, m_MessageNumber, null, "" ) );
Timer.DelayCall( TimeSpan.FromSeconds( 5.0 ), new TimerStateCallback( EndMessageLock ), m );
}
return false;
}
StartTeleport( m );
return false;
}
return true;
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
int skillIndex = (int)m_Skill;
string skillName;
if ( skillIndex >= 0 && skillIndex < SkillInfo.Table.Length )
skillName = SkillInfo.Table[skillIndex].Name;
else
skillName = "(Invalid)";
list.Add( 1060661, "{0}\t{1:F1}", skillName, m_Required );
if ( m_MessageString != null )
list.Add( 1060662, "Message\t{0}", m_MessageString );
else if ( m_MessageNumber != 0 )
list.Add( 1060662, "Message\t#{0}", m_MessageNumber );
}
[Constructable]
public SkillTeleporter()
{
}
public SkillTeleporter( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( (int) m_Skill );
writer.Write( (double) m_Required );
writer.Write( (string) m_MessageString );
writer.Write( (int) m_MessageNumber );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 0:
{
m_Skill = (SkillName)reader.ReadInt();
m_Required = reader.ReadDouble();
m_MessageString = reader.ReadString();
m_MessageNumber = reader.ReadInt();
break;
}
}
}
}
public class KeywordTeleporter : Teleporter
{
private string m_Substring;
private int m_Keyword;
private int m_Range;
[CommandProperty( AccessLevel.GameMaster )]
public string Substring
{
get{ return m_Substring; }
set{ m_Substring = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int Keyword
{
get{ return m_Keyword; }
set{ m_Keyword = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int Range
{
get{ return m_Range; }
set{ m_Range = value; InvalidateProperties(); }
}
public override bool HandlesOnSpeech{ get{ return true; } }
public override void OnSpeech( SpeechEventArgs e )
{
if ( !e.Handled && Active )
{
Mobile m = e.Mobile;
if ( !Creatures && !m.Player )
return;
if ( !m.InRange( GetWorldLocation(), m_Range ) )
return;
bool isMatch = false;
if ( m_Keyword >= 0 && e.HasKeyword( m_Keyword ) )
isMatch = true;
else if ( m_Substring != null && e.Speech.ToLower().IndexOf( m_Substring.ToLower() ) >= 0 )
isMatch = true;
if ( !isMatch )
return;
e.Handled = true;
StartTeleport( m );
}
}
public override bool OnMoveOver( Mobile m )
{
return true;
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
list.Add( 1060661, "Range\t{0}", m_Range );
if ( m_Keyword >= 0 )
list.Add( 1060662, "Keyword\t{0}", m_Keyword );
if ( m_Substring != null )
list.Add( 1060663, "Substring\t{0}", m_Substring );
}
[Constructable]
public KeywordTeleporter()
{
m_Keyword = -1;
m_Substring = null;
}
public KeywordTeleporter( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( m_Substring );
writer.Write( m_Keyword );
writer.Write( m_Range );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 0:
{
m_Substring = reader.ReadString();
m_Keyword = reader.ReadInt();
m_Range = reader.ReadInt();
break;
}
}
}
}
}