183 lines
4.8 KiB
C#
183 lines
4.8 KiB
C#
using System;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public interface ITalismanProtection
|
|
{
|
|
TalismanAttribute Protection { get; set; }
|
|
void SetProtection(Type type, TextDefinition name, int amount);
|
|
}
|
|
|
|
public interface ITalismanKiller
|
|
{
|
|
TalismanAttribute Killer { get; set; }
|
|
void SetKiller(Type type, TextDefinition name, int amount);
|
|
}
|
|
|
|
[PropertyObject]
|
|
public class TalismanAttribute
|
|
{
|
|
private Type m_Type;
|
|
private TextDefinition m_Name;
|
|
private int m_Amount;
|
|
public TalismanAttribute()
|
|
: this(null, 0, 0)
|
|
{
|
|
}
|
|
|
|
public TalismanAttribute(TalismanAttribute copy)
|
|
{
|
|
if (copy != null)
|
|
{
|
|
this.m_Type = copy.Type;
|
|
this.m_Name = copy.Name;
|
|
this.m_Amount = copy.Amount;
|
|
}
|
|
}
|
|
|
|
public TalismanAttribute(Type type, TextDefinition name)
|
|
: this(type, name, 0)
|
|
{
|
|
}
|
|
|
|
public TalismanAttribute(Type type, TextDefinition name, int amount)
|
|
{
|
|
this.m_Type = type;
|
|
this.m_Name = name;
|
|
this.m_Amount = amount;
|
|
}
|
|
|
|
public TalismanAttribute(GenericReader reader)
|
|
{
|
|
int version = reader.ReadInt();
|
|
|
|
SaveFlag flags = (SaveFlag)reader.ReadEncodedInt();
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Type))
|
|
this.m_Type = ScriptCompiler.FindTypeByFullName(reader.ReadString(), false);
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Name))
|
|
this.m_Name = TextDefinition.Deserialize(reader);
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Amount))
|
|
this.m_Amount = reader.ReadEncodedInt();
|
|
}
|
|
|
|
[Flags]
|
|
private enum SaveFlag
|
|
{
|
|
None = 0x00000000,
|
|
Type = 0x00000001,
|
|
Name = 0x00000002,
|
|
Amount = 0x00000004,
|
|
}
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public Type Type
|
|
{
|
|
get
|
|
{
|
|
return this.m_Type;
|
|
}
|
|
set
|
|
{
|
|
this.m_Type = value;
|
|
}
|
|
}
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public TextDefinition Name
|
|
{
|
|
get
|
|
{
|
|
return this.m_Name;
|
|
}
|
|
set
|
|
{
|
|
this.m_Name = value;
|
|
}
|
|
}
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int Amount
|
|
{
|
|
get
|
|
{
|
|
return this.m_Amount;
|
|
}
|
|
set
|
|
{
|
|
this.m_Amount = value;
|
|
}
|
|
}
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public bool IsEmpty
|
|
{
|
|
get
|
|
{
|
|
return this.m_Type == null;
|
|
}
|
|
}
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public bool IsItem
|
|
{
|
|
get
|
|
{
|
|
return this.m_Type != null && this.m_Type.Namespace.Equals("Server.Items");
|
|
}
|
|
}
|
|
public override string ToString()
|
|
{
|
|
if (this.m_Type != null)
|
|
return this.m_Type.Name;
|
|
|
|
return "None";
|
|
}
|
|
|
|
public virtual void Serialize(GenericWriter writer)
|
|
{
|
|
writer.Write((int)0); // version
|
|
|
|
SaveFlag flags = SaveFlag.None;
|
|
|
|
SetSaveFlag(ref flags, SaveFlag.Type, this.m_Type != null);
|
|
SetSaveFlag(ref flags, SaveFlag.Name, this.m_Name != null);
|
|
SetSaveFlag(ref flags, SaveFlag.Amount, this.m_Amount != 0);
|
|
|
|
writer.WriteEncodedInt((int)flags);
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Type))
|
|
writer.Write(this.m_Type.FullName);
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Name))
|
|
TextDefinition.Serialize(writer, this.m_Name);
|
|
|
|
if (GetSaveFlag(flags, SaveFlag.Amount))
|
|
writer.WriteEncodedInt(this.m_Amount);
|
|
}
|
|
|
|
public int DamageBonus(Mobile to)
|
|
{
|
|
if (to != null && to.GetType() == this.m_Type)
|
|
return this.m_Amount;
|
|
|
|
return 0;
|
|
}
|
|
|
|
public int ScaleDamage(Mobile from, int damage)
|
|
{
|
|
if (from != null && (from.GetType() == m_Type || (m_Type != null && from.GetType().IsSubclassOf(m_Type))))
|
|
return (int)(damage * (1 - m_Amount / 100.0));
|
|
|
|
return damage;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
} |