Files
abysmal-isle/Scripts/Items/Equipment/Talismans/TalismanAttribute.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

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);
}
}
}