ModernUO/Scripts/Items/Addons/AddonContainerComponent.cs

154 lines
3.2 KiB
C#

using System.Collections.Generic;
using Server.ContextMenus;
namespace Server.Items
{
public class AddonContainerComponent : Item, IChopable
{
public virtual bool NeedsWall => false;
public virtual Point3D WallPosition => Point3D.Zero;
[CommandProperty( AccessLevel.GameMaster )]
public BaseAddonContainer Addon { get; set; }
[CommandProperty( AccessLevel.GameMaster )]
public Point3D Offset { get; set; }
[Hue, CommandProperty( AccessLevel.GameMaster )]
public override int Hue
{
get => base.Hue;
set
{
base.Hue = value;
if ( Addon != null && Addon.ShareHue )
Addon.Hue = value;
}
}
[Constructible]
public AddonContainerComponent( int itemID ) : base( itemID )
{
Movable = false;
AddonComponent.ApplyLightTo( this );
}
public AddonContainerComponent( Serial serial ) : base( serial )
{
}
public override bool OnDragDrop( Mobile from, Item dropped )
{
if ( Addon != null )
return Addon.OnDragDrop( from, dropped );
return false;
}
public override void OnDoubleClick( Mobile from )
{
Addon?.OnComponentUsed( this, from );
}
public override void OnLocationChange( Point3D old )
{
if ( Addon != null )
Addon.Location = new Point3D( X - Offset.X, Y - Offset.Y, Z - Offset.Z );
}
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
{
Addon?.GetContextMenuEntries( from, list );
}
public override void OnMapChange()
{
if ( Addon != null )
Addon.Map = Map;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
Addon?.Delete();
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( Addon );
writer.Write( Offset );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
Addon = reader.ReadItem() as BaseAddonContainer;
Offset = reader.ReadPoint3D();
Addon?.OnComponentLoaded( this );
AddonComponent.ApplyLightTo( this );
}
public virtual void OnChop( Mobile from )
{
if ( Addon != null && from.InRange( GetWorldLocation(), 3 ) )
Addon.OnChop( from );
else
from.SendLocalizedMessage( 500446 ); // That is too far away.
}
}
public class LocalizedContainerComponent : AddonContainerComponent
{
private int m_LabelNumber;
public override int LabelNumber
{
get
{
if ( m_LabelNumber > 0 )
return m_LabelNumber;
return base.LabelNumber;
}
}
public LocalizedContainerComponent( int itemID, int labelNumber ) : base( itemID )
{
m_LabelNumber = labelNumber;
}
public LocalizedContainerComponent( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( m_LabelNumber );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_LabelNumber = reader.ReadInt();
}
}
}