158 lines
3.6 KiB
C#
158 lines
3.6 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Items;
|
|
|
|
namespace Solaris.BoardGames
|
|
{
|
|
//a gamepiece behaves much like an addon component
|
|
public class GamePiece : Item
|
|
{
|
|
//offset from the boardgame control item
|
|
public Point3D Offset;
|
|
|
|
//reference to the LOSBlocker used to block line of sight thru this gamepiece
|
|
public LOSBlocker _Blocker;
|
|
|
|
//reference to the boardgame control item that this piece belongs to
|
|
public BoardGameControlItem BoardGameControlItem;
|
|
|
|
//randomize itemid constructor
|
|
public GamePiece( int itemidmin, int itemidmax, string name ) : this( Utility.RandomMinMax( itemidmin, itemidmax ), name )
|
|
{
|
|
}
|
|
|
|
//randomize itemid constructor
|
|
public GamePiece( int itemidmin, int itemidmax, string name, bool blocklos ) : this( Utility.RandomMinMax( itemidmin, itemidmax ), name, blocklos )
|
|
{
|
|
}
|
|
|
|
//default no block los constructor
|
|
public GamePiece( int itemid, string name ) : this( itemid, name, false )
|
|
{
|
|
}
|
|
|
|
//master constructor
|
|
public GamePiece( int itemid, string name, bool blocklos ) : base( itemid )
|
|
{
|
|
Movable = false;
|
|
Name = name;
|
|
|
|
if( blocklos )
|
|
{
|
|
_Blocker = new LOSBlocker();
|
|
}
|
|
}
|
|
|
|
//deserialize constructor
|
|
public GamePiece( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public void RegisterToBoardGameControlItem( BoardGameControlItem boardgamecontrolitem, Point3D offset )
|
|
{
|
|
BoardGameControlItem = boardgamecontrolitem;
|
|
Offset = offset;
|
|
|
|
UpdatePosition();
|
|
}
|
|
|
|
|
|
//move the item based on its position with respect to the boardgame control item
|
|
public void UpdatePosition()
|
|
{
|
|
if( BoardGameControlItem != null )
|
|
{
|
|
MoveToWorld( new Point3D( BoardGameControlItem.X + BoardGameControlItem.BoardOffset.X + Offset.X, BoardGameControlItem.Y + BoardGameControlItem.BoardOffset.Y + Offset.Y, BoardGameControlItem.Z + BoardGameControlItem.BoardOffset.Z + Offset.Z ), BoardGameControlItem.BoardMap );
|
|
}
|
|
else
|
|
{
|
|
Delete();
|
|
}
|
|
}
|
|
|
|
public override void OnLocationChange( Point3D old )
|
|
{
|
|
if( BoardGameControlItem != null )
|
|
{
|
|
BoardGameControlItem.Location = new Point3D( X - BoardGameControlItem.BoardOffset.X - Offset.X, Y - BoardGameControlItem.BoardOffset.Y - Offset.Y, Z - BoardGameControlItem.BoardOffset.Z - Offset.Z );
|
|
}
|
|
|
|
if( _Blocker != null )
|
|
{
|
|
_Blocker.MoveToWorld( Location, Map );
|
|
}
|
|
}
|
|
|
|
public override void OnMapChange()
|
|
{
|
|
if( BoardGameControlItem != null && BoardGameControlItem.BoardMap != Map )
|
|
{
|
|
BoardGameControlItem.BoardMap = Map;
|
|
}
|
|
|
|
if( _Blocker != null )
|
|
{
|
|
_Blocker.MoveToWorld( Location, Map );
|
|
}
|
|
}
|
|
|
|
public override void OnAfterDelete()
|
|
{
|
|
base.OnAfterDelete();
|
|
|
|
if( BoardGameControlItem != null )
|
|
{
|
|
BoardGameControlItem.Delete();
|
|
}
|
|
|
|
if( _Blocker != null )
|
|
{
|
|
_Blocker.Delete();
|
|
}
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.Write( 1 );
|
|
|
|
writer.Write( (Item)_Blocker );
|
|
|
|
writer.Write( (Item)BoardGameControlItem );
|
|
|
|
writer.Write( Offset.X );
|
|
writer.Write( Offset.Y );
|
|
writer.Write( Offset.Z );
|
|
|
|
}
|
|
|
|
public override void Deserialize( GenericReader reader )
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadInt();
|
|
|
|
switch( version )
|
|
{
|
|
default:
|
|
case 1:
|
|
{
|
|
_Blocker = (LOSBlocker)reader.ReadItem();
|
|
goto case 0;
|
|
}
|
|
case 0:
|
|
{
|
|
|
|
|
|
BoardGameControlItem = (BoardGameControlItem)reader.ReadItem();
|
|
|
|
Offset.X = reader.ReadInt();
|
|
Offset.Y = reader.ReadInt();
|
|
Offset.Z = reader.ReadInt();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |