Files
abysmal-isle/Scripts/Items/Artifacts/Decorative/ImprisonedDog.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

232 lines
5.8 KiB
C#

using System;
using Server.Mobiles;
namespace Server.Items
{
public class ImprisonedDog : BaseImprisonedMobile
{
[Constructable]
public ImprisonedDog()
: base(0x1F1C)
{
this.Weight = 1.0;
this.Hue = 0x485;
}
public ImprisonedDog(Serial serial)
: base(serial)
{
}
public override int LabelNumber
{
get
{
return 1075091;
}
}// An Imprisoned Dog
public override BaseCreature Summon
{
get
{
return new TravestyDog();
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
namespace Server.Mobiles
{
public class TravestyDog : Dog
{
private string m_Name;
private DateTime m_NextAttempt;
[Constructable]
public TravestyDog()
: base()
{
this.Hue = 2301;
this.m_Name = null;
this.m_NextAttempt = DateTime.UtcNow;
}
public TravestyDog(Serial serial)
: base(serial)
{
}
public override bool DeleteOnRelease
{
get
{
return true;
}
}
public bool Morphed
{
get
{
return this.m_Name != null;
}
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
list.Add(1049646); // (summoned)
}
public void DeleteItems()
{
for (int i = this.Items.Count - 1; i >= 0; i --)
if (this.Items[i] is ClonedItem)
this.Items[i].Delete();
}
public void BeginMorph(Mobile to)
{
if (to == null || !this.Alive || this.Morphed)
return;
this.m_Name = this.Name;
this.Body = to.Body;
this.Hue = to.Hue;
this.Name = to.Name;
this.Female = to.Female;
this.Title = to.Title;
this.HairItemID = to.HairItemID;
this.HairHue = to.HairHue;
this.FacialHairItemID = to.FacialHairItemID;
this.FacialHairHue = to.FacialHairHue;
for (int i = to.Items.Count - 1; i >= 0; i --)
{
Item item = to.Items[i];
if (item.Layer != Layer.Backpack && item.Layer != Layer.Mount)
this.AddItem(new ClonedItem(item));
}
this.PlaySound(0x511);
this.FixedParticles(0x376A, 1, 14, 5045, EffectLayer.Waist);
Timer.DelayCall(TimeSpan.FromSeconds(60), new TimerCallback(EndMorph));
}
public void EndMorph()
{
this.DeleteItems();
this.Body = 0xD9;
this.Hue = 2301;
this.Name = this.m_Name;
this.Female = false;
this.Title = null;
this.HairItemID = 0;
this.HairHue = 0;
this.FacialHairItemID = 0;
this.FacialHairHue = 0;
this.m_Name = null;
this.PlaySound(0x511);
this.FixedParticles(0x376A, 1, 14, 5045, EffectLayer.Waist);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write((string)this.m_Name);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
this.m_Name = reader.ReadString();
this.m_NextAttempt = DateTime.UtcNow;
if (this.Morphed)
this.EndMorph();
}
protected override bool OnMove(Direction d)
{
if (!this.Morphed && this.m_NextAttempt <= DateTime.UtcNow)
{
IPooledEnumerable eable = GetMobilesInRange(6);
foreach (Mobile m in eable)
{
if (!m.Hidden && m.Alive && Utility.RandomDouble() < 0.25)
{
this.BeginMorph(m);
break;
}
}
eable.Free();
this.m_NextAttempt = DateTime.UtcNow + TimeSpan.FromSeconds(90);
}
return base.OnMove(d);
}
private class ClonedItem : Item
{
public ClonedItem(Item item)
: base(item.ItemID)
{
this.Name = item.Name;
this.Weight = item.Weight;
this.Hue = item.Hue;
this.Layer = item.Layer;
}
public ClonedItem(Serial serial)
: base(serial)
{
}
public override DeathMoveResult OnParentDeath(Mobile parent)
{
this.Delete();
return DeathMoveResult.RemainEquiped;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}
}