196 lines
No EOL
4.3 KiB
C#
196 lines
No EOL
4.3 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Regions;
|
|
using Server.Targeting;
|
|
|
|
namespace Server.Multis
|
|
{
|
|
public abstract class BaseDockedBoat : Item
|
|
{
|
|
private int m_MultiID;
|
|
private Point3D m_Offset;
|
|
private string m_ShipName;
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public int MultiID{ get{ return m_MultiID; } set{ m_MultiID = value; } }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public Point3D Offset{ get{ return m_Offset; } set{ m_Offset = value; } }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public string ShipName{ get{ return m_ShipName; } set{ m_ShipName = value; InvalidateProperties(); } }
|
|
|
|
public BaseDockedBoat( int id, Point3D offset, BaseBoat boat ) : base( 0x14F4 )
|
|
{
|
|
Weight = 1.0;
|
|
|
|
m_MultiID = id;
|
|
m_Offset = offset;
|
|
|
|
m_ShipName = boat.ShipName;
|
|
}
|
|
|
|
public BaseDockedBoat( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.Write( (int) 1 ); // version
|
|
|
|
writer.Write( m_MultiID );
|
|
writer.Write( m_Offset );
|
|
writer.Write( m_ShipName );
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
switch ( version )
|
|
{
|
|
case 1:
|
|
case 0:
|
|
{
|
|
m_MultiID = reader.ReadInt();
|
|
m_Offset = reader.ReadPoint3D();
|
|
m_ShipName = reader.ReadString();
|
|
|
|
if ( version == 0 )
|
|
reader.ReadUInt();
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( Weight == 0.0 )
|
|
Weight = 1.0;
|
|
}
|
|
|
|
public override void OnDoubleClick( Mobile from )
|
|
{
|
|
if ( !IsChildOf( from.Backpack ) )
|
|
{
|
|
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
|
|
}
|
|
else if ( !BaseBoat.NearDock( from ) )
|
|
{
|
|
from.SendMessage( "You cannot launch a ship here" );
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage( 502482 ); // Where do you wish to place the ship?
|
|
|
|
from.Target = new InternalTarget( this );
|
|
}
|
|
}
|
|
|
|
public abstract BaseBoat Boat{ get; }
|
|
|
|
public override void AddNameProperty( ObjectPropertyList list )
|
|
{
|
|
if ( m_ShipName != null )
|
|
list.Add( m_ShipName );
|
|
else
|
|
base.AddNameProperty( list );
|
|
}
|
|
|
|
public override void OnSingleClick( Mobile from )
|
|
{
|
|
if ( m_ShipName != null )
|
|
LabelTo( from, m_ShipName );
|
|
else
|
|
base.OnSingleClick( from );
|
|
}
|
|
|
|
public void OnPlacement( Mobile from, Point3D p )
|
|
{
|
|
if ( Deleted )
|
|
{
|
|
return;
|
|
}
|
|
else if ( !IsChildOf( from.Backpack ) )
|
|
{
|
|
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
|
|
}
|
|
else if ( !BaseBoat.NearDock( from ) )
|
|
{
|
|
from.SendMessage( "You cannot launch a ship here" );
|
|
}
|
|
else
|
|
{
|
|
Map map = from.Map;
|
|
|
|
if ( map == null )
|
|
return;
|
|
|
|
BaseBoat boat = Boat;
|
|
|
|
if ( boat == null )
|
|
return;
|
|
|
|
p = new Point3D( p.X - m_Offset.X, p.Y - m_Offset.Y, p.Z - m_Offset.Z );
|
|
|
|
if ( BaseBoat.IsValidLocation( p, map ) && boat.CanFit( p, map, boat.ItemID ) && map != Map.Underworld )
|
|
{
|
|
Delete();
|
|
|
|
boat.Owner = from;
|
|
boat.Anchored = true;
|
|
boat.ShipName = m_ShipName;
|
|
|
|
uint keyValue = boat.CreateKeys( from );
|
|
|
|
if ( boat.PPlank != null )
|
|
boat.PPlank.KeyValue = keyValue;
|
|
|
|
if ( boat.SPlank != null )
|
|
boat.SPlank.KeyValue = keyValue;
|
|
|
|
boat.MoveToWorld( p, map );
|
|
|
|
Effects.PlaySound( from.Location, from.Map, 0x026 );
|
|
}
|
|
else
|
|
{
|
|
boat.Delete();
|
|
from.SendLocalizedMessage( 1043284 ); // A ship can not be created here.
|
|
}
|
|
}
|
|
}
|
|
|
|
private class InternalTarget : MultiTarget
|
|
{
|
|
private BaseDockedBoat m_Model;
|
|
|
|
public InternalTarget( BaseDockedBoat model ) : base( model.MultiID, model.Offset )
|
|
{
|
|
m_Model = model;
|
|
}
|
|
|
|
protected override void OnTarget( Mobile from, object o )
|
|
{
|
|
IPoint3D ip = o as IPoint3D;
|
|
|
|
if ( ip != null )
|
|
{
|
|
if ( ip is Item )
|
|
ip = ((Item)ip).GetWorldTop();
|
|
|
|
Point3D p = new Point3D( ip );
|
|
|
|
Region region = Region.Find( p, from.Map );
|
|
|
|
if ( region.IsPartOf( typeof( DungeonRegion ) ) )
|
|
from.SendLocalizedMessage( 502488 ); // You can not place a ship inside a dungeon.
|
|
else
|
|
m_Model.OnPlacement( from, p );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |