ModernUO/Projects/Scripts/Items/Talismans/TalismanAttribute.cs
2020-02-21 20:07:11 -08:00

103 lines
2.6 KiB
C#

using System;
namespace Server.Items
{
[PropertyObject]
public class TalismanAttribute
{
public TalismanAttribute() : this(null, 0)
{
}
public TalismanAttribute(TalismanAttribute copy)
{
if (copy != null)
{
Type = copy.Type;
Name = copy.Name;
Amount = copy.Amount;
}
}
public TalismanAttribute(Type type, TextDefinition name, int amount = 0)
{
Type = type;
Name = name;
Amount = amount;
}
public TalismanAttribute(IGenericReader reader)
{
int version = reader.ReadInt();
SaveFlag flags = (SaveFlag)reader.ReadEncodedInt();
if (GetSaveFlag(flags, SaveFlag.Type))
Type = AssemblyHandler.FindFirstTypeForName(reader.ReadString(), false);
if (GetSaveFlag(flags, SaveFlag.Name))
Name = TextDefinition.Deserialize(reader);
if (GetSaveFlag(flags, SaveFlag.Amount))
Amount = reader.ReadEncodedInt();
}
[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?.Namespace.Equals("Server.Items") == true;
public override string ToString() => Type?.Name ?? "None";
private static void SetSaveFlag(ref SaveFlag flags, SaveFlag toSet, bool setIf)
{
if (setIf)
flags |= toSet;
}
private static bool GetSaveFlag(SaveFlag flags, SaveFlag toGet) => (flags & toGet) != 0;
public virtual void Serialize(IGenericWriter writer)
{
writer.Write(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) => to?.GetType() == Type ? Amount : 0;
[Flags]
private enum SaveFlag
{
None = 0x00000000,
Type = 0x00000001,
Name = 0x00000002,
Amount = 0x00000004
}
}
}