- [X] Fixes some issues with the type caching - [X] Changes type check default to ignore case - [X] Splits out type caching of insensitive and sensitive lists. This means less stuff to iterate through when checking a type against the string. - [X] Adds an ArrayEnumerator, mostly for reference purposes (copy/paste as needed)
117 lines
3.1 KiB
C#
117 lines
3.1 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)
|
|
{
|
|
var version = reader.ReadInt();
|
|
|
|
var flags = (SaveFlag)reader.ReadEncodedInt();
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Type))
|
|
{
|
|
Type = AssemblyHandler.FindTypeByFullName(reader.ReadString());
|
|
}
|
|
|
|
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 == "Server.Items";
|
|
|
|
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
|
|
|
|
var 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
|
|
}
|
|
}
|
|
}
|