122 lines
2.8 KiB
C#
122 lines
2.8 KiB
C#
using System;
|
|
|
|
namespace Server.Items
|
|
{
|
|
[PropertyObject]
|
|
public class TalismanAttribute
|
|
{
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public Type Type { get; set; }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public TextDefinition Name { get; set; }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public int Amount { get; set; }
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public bool IsEmpty => Type == null;
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public bool IsItem => Type != null && Type.Namespace.Equals( "Server.Items" );
|
|
|
|
public TalismanAttribute() : this( null, 0, 0 )
|
|
{
|
|
}
|
|
|
|
public TalismanAttribute( TalismanAttribute copy )
|
|
{
|
|
if ( copy != null )
|
|
{
|
|
Type = copy.Type;
|
|
Name = copy.Name;
|
|
Amount = copy.Amount;
|
|
}
|
|
}
|
|
|
|
public TalismanAttribute( Type type, TextDefinition name ) : this( type, name, 0 )
|
|
{
|
|
}
|
|
|
|
public TalismanAttribute( Type type, TextDefinition name, int amount )
|
|
{
|
|
Type = type;
|
|
Name = name;
|
|
Amount = amount;
|
|
}
|
|
|
|
public TalismanAttribute( GenericReader reader )
|
|
{
|
|
int version = reader.ReadInt();
|
|
|
|
SaveFlag flags = (SaveFlag) reader.ReadEncodedInt();
|
|
|
|
if ( GetSaveFlag( flags, SaveFlag.Type ) )
|
|
Type = ScriptCompiler.FindTypeByFullName( reader.ReadString(), false );
|
|
|
|
if ( GetSaveFlag( flags, SaveFlag.Name ) )
|
|
Name = TextDefinition.Deserialize( reader );
|
|
|
|
if ( GetSaveFlag( flags, SaveFlag.Amount ) )
|
|
Amount = reader.ReadEncodedInt();
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
if ( Type != null )
|
|
return Type.Name;
|
|
|
|
return "None";
|
|
}
|
|
|
|
private static void SetSaveFlag( ref SaveFlag flags, SaveFlag toSet, bool setIf )
|
|
{
|
|
if ( setIf )
|
|
flags |= toSet;
|
|
}
|
|
|
|
private static bool GetSaveFlag( SaveFlag flags, SaveFlag toGet )
|
|
{
|
|
return ( (flags & toGet) != 0 );
|
|
}
|
|
|
|
[Flags]
|
|
private enum SaveFlag
|
|
{
|
|
None = 0x00000000,
|
|
Type = 0x00000001,
|
|
Name = 0x00000002,
|
|
Amount = 0x00000004,
|
|
}
|
|
|
|
public virtual void Serialize( GenericWriter writer )
|
|
{
|
|
writer.Write( (int) 0 ); // version
|
|
|
|
SaveFlag flags = SaveFlag.None;
|
|
|
|
SetSaveFlag( ref flags, SaveFlag.Type, Type != null );
|
|
SetSaveFlag( ref flags, SaveFlag.Name, Name != null );
|
|
SetSaveFlag( ref flags, SaveFlag.Amount, Amount != 0 );
|
|
|
|
writer.WriteEncodedInt( (int) flags );
|
|
|
|
if ( GetSaveFlag( flags, SaveFlag.Type ) )
|
|
writer.Write( Type.FullName );
|
|
|
|
if ( GetSaveFlag( flags, SaveFlag.Name ) )
|
|
TextDefinition.Serialize( writer, Name );
|
|
|
|
if ( GetSaveFlag( flags, SaveFlag.Amount ) )
|
|
writer.WriteEncodedInt( Amount );
|
|
}
|
|
|
|
public int DamageBonus( Mobile to )
|
|
{
|
|
if ( to != null && to.GetType() == Type ) // Verified: only works on the exact type
|
|
return Amount;
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
}
|